diff --git a/asset-manifest.json b/asset-manifest.json index 7dd8bc80e..1bf267c4a 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.71a8bdfe.chunk.js", - "main.js.map": "/aladdin/static/js/main.71a8bdfe.chunk.js.map", + "main.js": "/aladdin/static/js/main.eb054a75.chunk.js", + "main.js.map": "/aladdin/static/js/main.eb054a75.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.bba58f66.chunk.js", "static/css/main.c1ee157d.chunk.css", - "static/js/main.71a8bdfe.chunk.js" + "static/js/main.eb054a75.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index d147c01b6..13f116d1d 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.71a8bdfe.chunk.js b/static/js/main.eb054a75.chunk.js similarity index 73% rename from static/js/main.71a8bdfe.chunk.js rename to static/js/main.eb054a75.chunk.js index a173940b6..5b87ac886 100644 --- a/static/js/main.71a8bdfe.chunk.js +++ b/static/js/main.eb054a75.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":"iEcUsFGYBwg7FEsGAWwpDs","time":"08/15/2023 04:56 pm","timestamp":1692132972037,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"5/1/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Leominster State Forest, Leominster, MA 01420, 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":42.52092349999999,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.8384068},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152009,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":0.07401736805849783,"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":3.700868402924892,"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":3.700868402924892,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3.700868402924892,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":3.700868402924892,"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":3.700868402924892,"centerRoofHeight":[-0.022465454047944533,5.827600046994059],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","rightRoofHeight":3.7008684029248915,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"lx":7.5,"windows":[],"lz":3.700868402924892,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,5.827600046994059],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":3.7008684029248915,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3.700868402924892,"ly":0.3,"cx":-5.457020109151015,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"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":3.700868402924892,"leftRoofHeight":3.700868402924892,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3.700868402924892,"lx":12,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"type":"Foundation","ly":8.209748806830484,"lz":0.07401736805849783,"rotation":[0,0,0],"cz":0.05,"cx":0.3444310502028619,"lx":9.082946486026735,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.588798589487019,"id":"8fpWrU7qVyVgipB7LtABom","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"showLabel":false,"cz":3.903941909848086,"roofId":"bMyAZV3jeEtHec1SxNb6X8","lz":5.234219703671004,"ly":0.3,"leftRoofHeight":5.712225310760859,"relativeAngle":3.141592653589793,"rightRoofHeight":5.712225310760859,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":6.4566666666666634,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture Default","cx":-0.034941558187143285,"leftPoint":[3.193391775146188,1.612200631492839,0],"type":"Wall","rightPoint":[-3.263274891520475,1.612200631492839,0],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.612200631492839,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"white","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.805475873448939,"rightUnfilledHeight":4.805475873448939,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":5.234219703671004,"selected":false,"ly":0.3,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.22448562198120414,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[3.193391775146188,-1.1632293875304307,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","textureType":"Wall Texture Default","cx":3.193391775146189,"centerRoofHeight":[0.5,5.712225310760859],"showLabel":false,"leftRoofHeight":5.234219703671004,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.570796326794896,"windows":[],"rightRoofHeight":5.712225310760859,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[3.1933917751461904,1.612200631492839,0],"lx":2.7754300190232697,"color":"white","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.5697809504114297,"rightUnfilledHeight":5.234219703671004,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":5.712225310760859,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture Default","cx":-3.263274891520475,"rightPoint":[-3.263274891520475,-1.1632293875304307,0],"lz":5.234219703671004,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","centerRoofHeight":[-0.5,5.712225310760859],"cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-3.263274891520475,1.612200631492839,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":2.7754300190232697,"cy":0.22448562198120414,"windows":[],"ly":0.3,"rightRoofHeight":5.234219703671004,"color":"white","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.234219703671004,"rightUnfilledHeight":3.5697809504114297,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"ly":0,"cx":0,"type":"Roof","thickness":0.2,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture Default","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.126731644069167,"ceiling":false,"locked":true},{"rightPoint":[3.193391775146188,-1.1632293875304307,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.034941558187143285,"ly":0.3,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":5.234219703671004,"rightRoofHeight":5.234219703671004,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-3.263274891520475,-1.1632293875304307,0],"type":"Wall","cy":-1.1632293875304307,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":5.234219703671004,"windows":[],"showLabel":false,"textureType":"Wall Texture Default","lx":6.4566666666666634,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.5697809504114297,"rightUnfilledHeight":3.5697809504114297,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"ridgeLeftPoint":[-0.5,1],"roofType":"Gable","id":"bMyAZV3jeEtHec1SxNb6X8","ridgeRightPoint":[0.5,1],"selected":false,"wallsId":["7xigJB2WiCCrREDc2Ja3YN"],"rotation":[0,0,0],"cz":0,"cy":0,"foundationId":"8fpWrU7qVyVgipB7LtABom","lz":0,"lx":0,"showLabel":false,"parentId":"8fpWrU7qVyVgipB7LtABom","textureType":"Roof Texture Default","normal":[0,0,1],"type":"Roof","thickness":0.1,"cx":0,"ly":0,"color":"#666666","rise":0.4780056070898553,"ceiling":false,"locked":true},{"foundationId":"8fpWrU7qVyVgipB7LtABom","lx":0.15384615384615385,"id":"kT8BzEWny2ZAvkGr4E4KEf","type":"Window","ly":0.3,"showLabel":false,"rotation":[0,0,0],"selected":false,"color":"#ffffff","lz":0.14780124246219536,"cz":0.4037254895427074,"normal":[0,0,1],"cx":-0.23283427981414576,"cy":0.1,"parentId":"7xigJB2WiCCrREDc2Ja3YN","shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","cz":0.4037254895427074,"cx":0.23180175529168826,"ly":0.3,"lx":0.15384615384615385,"rotation":[0,0,0],"lz":0.14780124246219536,"normal":[0,0,1],"selected":false,"type":"Window","id":"7u1AuHohJXNKKJPafwNUFQ","cy":0.1,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"normal":[0,0,1],"rotation":[0,0,0],"lz":0.07401736805849783,"cz":0.05,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.813410596867628,"solarUpdraftTower":{},"cy":0.16141466329287235,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"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":6.661563125264805,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","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":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"locked":true},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360516,0],"rotation":[0,0,0],"cy":0.11982626583605155,"lz":6.661563125264805,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.5,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"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":1.5096768753682475,"rightUnfilledHeight":1.5096768753682475,"leftTopPartialHeight":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"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":6.661563125264805,"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","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"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.661563125264805,"rightTopPartialHeight":6.661563125264805,"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":6.661563125264805,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"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.661563125264805,"rightTopPartialHeight":6.661563125264805,"locked":true},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":0,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.005759415706553773,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"cx":0.19999999999999998,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.005759415706553773,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.37499999999999994,"cy":0,"cz":0,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"lz":0.3942112571821837,"cy":0,"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.3466666666666667,"cz":-0.05913168857732756,"ly":0.3,"showLabel":false,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"selected":false,"cz":-0.05913168857732756,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","type":"Window","normal":[0,0,1],"id":"rgPxjoaTPqdF2tQvSYYJxX","lx":0.13333333333333333,"ly":0.3,"color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","lz":0.3942112571821837,"cy":0,"cx":0,"rotation":[0,0,0],"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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.05913168857732756,"lx":0.13333333333333333,"color":"#ffffff","cy":0,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"type":"Human","name":"Judd","cx":-0.09889479147539992,"cy":-3.5804269948570657,"cz":0.03700868412852199,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.544,"locked":true},{"type":"Tree","name":"Magnolia","cx":11.305837530144139,"cy":-3.6653094140688935,"cz":0,"lx":7.849178627898182,"lz":8.26765132308192,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"type":"Door","cx":0.004166666666666666,"cy":0,"cz":-0.14191725928869298,"lx":0.10833333333333332,"ly":0,"lz":0.716165481422614,"textureType":"Door Texture Default","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,"opacity":1,"locked":true},{"type":"Human","name":"Jess","cx":10.043178984637636,"cy":-3.1477838439296697,"cz":0,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hDyRWYv3zznENZxyb7giJb","selected":false,"ly":0.43,"locked":true},{"type":"Flower","name":"Hosta","cx":-4.865498633056688,"cy":-5.35511145051621,"cz":4.440892098500626e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rQBZjpiN17FBa7zVGS29EM","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.913277609806336,"cy":-5.374330832155909,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gc42wB2NVDE3XxmJXbCjzF","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.365516144068206,"cy":-5.032667389054726,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vUf5PGrUMVgXbqYPHJhogg","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.451426749352761,"cy":-5.0400985854852,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nQJ3744KdWm46uETjWgCgh","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.305907483983008,"cy":-4.741244078804888,"cz":-4.440892098500626e-16,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"v55S46CRAfNBqtvC7SejWL","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.64587810641245,"cy":-5.149011385356842,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"cjq5zpMwEQ68Pvr3BHuvAN","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":11.069278217326396,"cy":-5.113715548843749,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"bq7T5SUabm6WYJRf7MELsr","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.087718880149556,"cy":-5.171937637087455,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kGacG4GbyL6sr53BA3szew","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":11.337264912334188,"cy":-4.906129973770318,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"3mzXsN58FdxQCLpv8kVCYw","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.431075288929677,"cy":-3.991597909938303,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"acUhTF9RVe5riGAE9cfhJn","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":9.86441386534317,"cy":-4.67810479084557,"cz":-8.881784197001252e-16,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ooTJkhwo3iWiDqyRe6jwef","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":9.406250442154278,"cy":-4.8162245440076354,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"p8SDFTinzKkCMVNKYGXSQU","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":9.924833666037356,"cy":-5.548260780564018,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"vXr6WeGdxpL14pfLB8tAGS","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":-0.8637473869150567,"cy":-5.021658074995834,"cz":0.03700868412863657,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8jaD71ndVi3Pxu67kBrHve","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":1.960367825542456,"cy":-5.044972777905908,"cz":0.03700868412852288,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"xu93thGDcf75KxzfVpckCK","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-2.974917470063473,"cy":-4.971526921550339,"cz":0.03700868412852377,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aPfi6ru8UEQvmRY7YmRfhQ","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":2.9943532379673203,"cy":-2.3800793411851497,"cz":0.03700868412852288,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"p12f94kQKCXpPNEEPe9ktz","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-8.658559512721883,"cy":0.2268652768492938,"cz":4.440892098500626e-16,"lx":5.410682322966088,"lz":5.9930306282885,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"8MCf8WzkvdtkVT9MPmDy4G","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-8.813697651847779,"cy":-3.717743510806919,"cz":-4.440892098500626e-16,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kwZdR8kant3eBoLCjjUQCJ","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-9.660182286895216,"cy":-0.10473626441648776,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"hM4s39UWZUWNoUSUMHrmbJ","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-9.04189556545002,"cy":-0.8584081924043119,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"nQgYQhsWvwPQorjAb4dSNv","selected":false,"locked":true},{"type":"Polygon","cx":-0.00213352886578518,"cy":-0.2942089556230589,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.04166666666666669,"y":-0.13775856472283443},{"x":-0.04166666666666669,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.13775856472283443}],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":1,"id":"eYBEchBwdGr5aCP6pHEkhr","text":"175","fontSize":0.3,"fontColor":"gold","fontStrokeWidth":0.01,"noOutline":true,"opacity":0,"locked":true},{"type":"Door","cx":-0.013333333333333334,"cy":0,"cz":-0.3986137684780472,"lx":0.10666666666666667,"ly":0,"lz":0.20277246304390567,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture #8","color":"#ffffff","uValue":10,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d48TNpLXWZQD5hZa4SumwF","locked":true,"interior":true},{"type":"Window","cx":0.546396492045166,"cy":-2.2182418146601295,"cz":4.9719401800066105,"lx":6.2858321442603895,"ly":0.2,"lz":2.946512926202779,"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.535854716076799,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qbq4krxSBYqvGnjWC2BaZ6","empty":true,"locked":true,"interior":true}],"sceneRadius":19,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.3385955283596493,-0.960681989394115,-9.84385140521351e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.3385955283596493,-0.9616823668411001,150],"theme":"Hill","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-4.575836374358772,-13.55189382123386,1.5270764549730371],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"directLightIntensity":2,"ambientLightIntensity":0.2,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":38.96037486782549,"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.6129423584899516,-0.1380765532376687,1.3729341918793292],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"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}')},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"]}')},582:function(e,t,l){},599:function(e,t,l){},789: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 Ha})),l.d(o,"cameraZoom",(function(){return ja})),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 Wa})),l.d(o,"mapType",(function(){return Ma})),l.d(o,"showSiteInfoPanel",(function(){return Ia})),l.d(o,"showDesignInfoPanel",(function(){return Ca})),l.d(o,"showInstructionPanel",(function(){return Fa})),l.d(o,"showHeliodonPanel",(function(){return ka})),l.d(o,"heliodonPanelX",(function(){return Oa})),l.d(o,"heliodonPanelY",(function(){return Ya})),l.d(o,"showMapPanel",(function(){return La})),l.d(o,"mapPanelX",(function(){return Na})),l.d(o,"mapPanelY",(function(){return Ua})),l.d(o,"showWeatherPanel",(function(){return Ea})),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 Ho})),l.d(o,"showDailyUpdraftTowerYieldPanel",(function(){return jo})),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 Wo})),l.d(o,"evolutionPanelRect",(function(){return Mo}));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 Fo})),l.d(i,"leafDayOfYear1",(function(){return ko})),l.d(i,"leafDayOfYear2",(function(){return Oo})),l.d(i,"ground",(function(){return Yo})),l.d(i,"address",(function(){return Lo})),l.d(i,"countryCode",(function(){return No})),l.d(i,"airAttenuationCoefficient",(function(){return Uo})),l.d(i,"airConvectiveCoefficient",(function(){return Eo})),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(582),l(23)),u=l(4),f=l(8),h=l(2),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(798),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",PrivacyInfo:"When you sign in, your Google ID is used to create and access your Aladdin account.\nOnly a random alphanumeric string is stored in our database as a reference.\nNo personally identifiable data such as your name or email is ever gathered.\nFor more information, see our Privacy Policy:\nhttps://intofuture.org/aladdin-privacy.html",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",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",AllCuboids:"All Cuboids",OnlyThisSide:"Only This Side",AllSidesOfThisCuboid:"All Sides of This Cuboid",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",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",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",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",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",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",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",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",AllWindows:"All Windows",Width:"Width",Height:"Height",Mullion:"Mullion",MullionWidth:"Mullion Width",MullionSpacing:"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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"My Cloud Files",GenerateLink:"Generate Link",LinkGeneratedInClipBoard:"A link has been 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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Click to access cloud tools"},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",PrivacyInfo:"\u767b\u5f55\u9700\u8981\u91c7\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u8fdb\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8d26\u6237\u3002\n\u6211\u4eec\u53ea\u50a8\u5b58\u4e00\u4e2a\u968f\u673a\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a\u60a8\u7684ID\u3002\n\u4efb\u4f55\u5173\u4e8e\u60a8\u7684\u53ef\u8fa8\u8bc6\u7684\u4e2a\u4eba\u4fe1\u606f\u90fd\u6ca1\u6709\u88ab\u6536\u96c6\u3002\n\u8be6\u60c5\u8bf7\u53c2\u8003\u6211\u4eec\u7684\u9690\u79c1\u58f0\u660e\uff1a\nhttps://intofuture.org/aladdin-privacy.html",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",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",AllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53",OnlyThisSide:"\u53ea\u8fd9\u4e2a\u8868\u9762",AllSidesOfThisCuboid:"\u8fd9\u4e2a\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",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",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",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",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",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",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",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",AllWindows:"\u6240\u6709\u7684\u7a97\u6237",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Mullion:"\u76f4\u68c2",MullionWidth:"\u76f4\u68c2\u5bbd\u5ea6",MullionSpacing:"\u76f4\u68c2\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",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",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",EnableNavigation:"\u9032\u5165\u5bfc\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5bfc\u822a\u6a21\u5f0f",Move:"\u79fb\u52a8",MoveInstruction:"\u6309\u4e0bW/A/S/D/Z/X\u952e",Turn:"\u62d0\u5f2f",TurnInstruction:"\u6309\u4e0b\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:{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\u5df2\u7ecf\u590d\u5236\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:{SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyProjects:"\u6211\u7684\u9879\u76ee",GenerateProjectLink:"\u751f\u6210\u9879\u76ee\u94fe\u63a5",ProjectLinkGeneratedInClipBoard:"\u9879\u76ee\u94fe\u63a5\u5df2\u7ecf\u590d\u5236\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",clickToAccessCloudTools:"\u70b9\u51fb\u6253\u5f00\u4e91\u83dc\u5355"},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",PrivacyInfo:"\u767b\u9304\u9700\u8981\u63a1\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u9032\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8cec\u6236\u3002\n\u6211\u5011\u53ea\u5132\u5b58\u4e00\u500b\u96a8\u6a5f\u7684\u5b57\u7b26\u4e32\u4f5c\u70ba\u60a8\u7684ID\u3002\n\u4efb\u4f55\u95dc\u65bc\u60a8\u7684\u53ef\u8fa8\u8b58\u7684\u500b\u4eba\u4fe1\u606f\u90fd\u6c92\u6709\u88ab\u6536\u96c6\u3002\n\u8a73\u60c5\u8acb\u53c3\u8003\u6211\u5011\u7684\u96b1\u79c1\u8072\u660e\uff1a\nhttps://intofuture.org/aladdin-privacy.html",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",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",AllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4",OnlyThisSide:"\u53ea\u9019\u500b\u8868\u9762",AllSidesOfThisCuboid:"\u9019\u500b\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",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",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",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",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",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",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",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",AllWindows:"\u6240\u6709\u7684\u7a97\u6236",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Mullion:"\u76f4\u6afa",MullionWidth:"\u76f4\u6afa\u5bec\u5ea6",MullionSpacing:"\u76f4\u6afa\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",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",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",EnableNavigation:"\u9032\u5165\u5c0e\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5c0e\u822a\u6a21\u5f0f",Move:"\u79fb\u52d5",MoveInstruction:"\u6309\u4e0bW/A/S/D/Z/X\u9375",Turn:"\u62d0\u5f4e",TurnInstruction:"\u6309\u4e0b\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:{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\u5df2\u7d93\u5fa9\u88fd\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:{SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyProjects:"\u6211\u7684\u9805\u76ee",GenerateProjectLink:"\u751f\u6210\u9805\u76ee\u93c8\u63a5",ProjectLinkGeneratedInClipBoard:"\u9805\u76ee\u93c8\u63a5\u5df2\u7d93\u5fa9\u88fd\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",clickToAccessCloudTools:"\u9ede\u64ca\u6253\u958b\u96f2\u83dc\u55ae"},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",PrivacyInfo:"When you sign in, your Google ID is used to create and access your Aladdin account.\nOnly a random alphanumeric string is stored in our database as a reference.\nNo personally identifiable data such as your name or email is ever gathered.\nFor more information, see our Privacy Policy:\nhttps://intofuture.org/aladdin-privacy.html",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",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",AllCuboids:"Todos los cuboides",OnlyThisSide:"Solamente este lado",AllSidesOfThisCuboid:"Todos los lados en este cuboide",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",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",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",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",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",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",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",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",AllWindows:"All Windows",Width:"Ancho",Height:"Altura",Mullion:"Mullion",MullionWidth:"Mullion Width",MullionSpacing:"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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Haz clic para acceder a las herramientas en la nube"},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",PrivacyInfo:"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.\nVeritaban\u0131m\u0131zda referans olarak yaln\u0131zca rastgele bir alfasay\u0131sal dize depolan\u0131r.\nAd\u0131n\u0131z veya e-posta adresiniz gibi ki\u015fisel olarak tan\u0131mlanabilir hi\xe7bir veri toplanmaz.\n Daha fazla bilgi i\xe7in Gizlilik Politikam\u0131za bak\u0131n:\nhttps://intofuture.org/aladdin-privacy.html",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",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",AllCuboids:"T\xfcm K\xfcbikler",OnlyThisSide:"Sadece Se\xe7ili Y\xfczey",AllSidesOfThisCuboid:"Se\xe7ili K\xfcbik T\xfcm Y\xfczeyler",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",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",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",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",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",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",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",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",AllWindows:"T\xfcm Pencereler",Width:"Geni\u015flik",Height:"Y\xfckseklik",Mullion:"Tiriz",MullionWidth:"Tiriz Geni\u015fli\u011fi",MullionSpacing:"Tiriz Aral\u0131\u011f\u0131",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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Bulut Ara\xe7lar\u0131na Eri\u015fmek \u0130\xe7in T\u0131klay\u0131n\u0131z"},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\u0443\u0442\u0438",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",PrivacyInfo:"\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.\n\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.\n\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.\n\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 \u041f\u043e\u043b\u0456\u0442\u0438\u043a\u043e\u044e \u041a\u043e\u043d\u0444\u0456\u0434\u0435\u043d\u0446\u0456\u0439\u043d\u043e\u0441\u0442\u0456:\nhttps://intofuture.org/aladdin-privacy.html",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",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",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",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",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",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",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",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",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",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",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",AllWindows:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Mullion:"\u0420\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u0439 \u0441\u0442\u043e\u0432\u043f\u0435\u0446\u044c",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",MullionSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u043c\u0438 \u0441\u0442\u043e\u0432\u043f\u0446\u044f\u043c\u0438",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",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",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:"Enter 2D mode",Exit2DMode:"Exit 2D mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",Turn:"Turn",TurnInstruction:"Press arrow keys",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:{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:{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 has been 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",clickToAccessCloudTools:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0441\u0442\u044c, \u0449\u043e\u0431 \u043e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0445\u043c\u0430\u0440\u043d\u0438\u0445 \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0456\u0432"},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:"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:"\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,H,j,z,R,D,W,M,I,C,F,k,O,Y,L,N,U,E,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.dfa085ac.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),He=l(412),je=l(11),ze=l(40),Re=l(15),De=l(16),We=l(3),Me={type:"change"},Ie={type:"start"},Ce={type:"end"},Fe=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a){var o;Object(je.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 We.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:We.MOUSE.ROTATE,MIDDLE:We.MOUSE.DOLLY,RIGHT:We.MOUSE.PAN},o.touches={ONE:We.TOUCH.ROTATE,TWO:We.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,H=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(Me),i.update(),n=r.NONE},o.update=function(){var t=new We.Vector3,l=(new We.Quaternion).setFromUnitVectors(e.up,new We.Vector3(0,1,0)),a=l.clone().invert(),o=new We.Vector3,p=new We.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(Me),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 We.Spherical,d=new We.Spherical,u=1,f=new We.Vector3,h=!1,p=new We.Vector2,y=new We.Vector2,g=new We.Vector2,m=new We.Vector2,w=new We.Vector2,x=new We.Vector2,v=new We.Vector2,b=new We.Vector2,A=new We.Vector2,T=[],P={},S=!1,H=0;function j(){return Math.pow(.95,i.zoomSpeed)}function z(e){d.theta-=e}function R(e){d.phi-=e}var D=function(){var e=new We.Vector3;return function(t,l){e.setFromMatrixColumn(l,0),e.multiplyScalar(-t),f.add(e)}}(),W=function(){var e=new We.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)}}(),M=function(){var e=new We.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),W(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),W(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 We.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(Me)}}(),C=function(){var e=new We.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(Me)}}(),F=function(){var e=new We.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(Me)}}(),k=function(){var e=new We.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),Math.abs(Math.abs(e.z-H)-Math.PI)<.01&&(S=!S),S?e.x-=.01*t:e.x+=.01*t,e.x=Math.max(.1,e.x),H=e.z,l.quaternion.setFromEuler(e),i.dispatchEvent(Me)}}(),O=function(){var e=new We.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(Me)}}();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 N(e){p.set(e.clientX,e.clientY)}function U(e){m.set(e.clientX,e.clientY)}function E(){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),M(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 We.TOUCH.ROTATE:if(!1===i.enableRotate)return;E(),n=r.TOUCH_ROTATE;break;case We.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 We.TOUCH.DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;i.enableZoom&&J(),i.enablePan&&V(),n=r.TOUCH_DOLLY_PAN;break;case We.TOUCH.DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;i.enableZoom&&J(),i.enableRotate&&E(),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 We.MOUSE.DOLLY:if(!1===i.enableZoom)return;!function(e){v.set(e.clientX,e.clientY)}(e),n=r.DOLLY;break;case We.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;N(e),n=r.ROTATE}break;case We.MOUSE.PAN:if(e.ctrlKey||e.metaKey){if(!1===i.enableRotate)return;N(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(j()):A.y<0&&L(j()),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),M(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(j()):e.deltaY>0&&Y(j()),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:F(i.moveSpeed);break;case i.keys.MOVE_LEFT:F(-i.moveSpeed);break;case i.keys.ROTATE_UP:k(i.turnSpeed);break;case i.keys.ROTATE_DOWN:k(-i.turnSpeed);break;case i.keys.ROTATE_LEFT:O(-i.turnSpeed);break;case i.keys.ROTATE_RIGHT:O(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(je.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 We.Vector3,t=new We.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(je.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 We.Vector3,f=new We.Vector3,h=new We.Vector3,p=new We.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,H=0;H<=i;H++){var j=H/i;n=Math.cos(j*x),c=Math.sin(j*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,h=0;switch(e.type){case V.Cuboid:s=e.id;break;case V.Wall:s=e.parentId,h=e.ly;break;case V.Roof:s=e.parentId,h=e.thickness}var p=Xw.getState().actionState,y={showLeft:p.windowShutterLeft,showRight:p.windowShutterRight,color:p.windowShutterColor,width:p.windowShutterWidth};return{type:V.Window,cx:t,cy:l,cz:a,lx:d,ly:h,lz:u,shutter:y,mullion:p.windowMullion,mullionWidth:p.windowMullionWidth,mullionSpacing:p.windowMullionSpacing,mullionColor:p.windowMullionColor,frame:p.windowFrame,frameWidth:p.windowFrameWidth,sillWidth:Zm.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(f.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=Xw.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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(837),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},Ha=function(e){return e.viewState.panCenter2D},ja=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},Wa=function(e){return e.viewState.mapTilt},Ma=function(e){return e.viewState.mapType},Ia=function(e){return e.viewState.showSiteInfoPanel},Ca=function(e){return e.viewState.showDesignInfoPanel},Fa=function(e){return e.viewState.showInstructionPanel},ka=function(e){return e.viewState.showHeliodonPanel},Oa=function(e){return e.viewState.heliodonPanelX},Ya=function(e){return e.viewState.heliodonPanelY},La=function(e){return e.viewState.showMapPanel},Na=function(e){return e.viewState.mapPanelX},Ua=function(e){return e.viewState.mapPanelY},Ea=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},Ho=function(e){return e.viewState.yearlyHeliostatYieldPanelRect},jo=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},Wo=function(e){return e.viewState.showEvolutionPanel},Mo=function(e){return e.viewState.evolutionPanelRect},Io=function(e){return e.world.latitude},Co=function(e){return e.world.longitude},Fo=function(e){return e.world.date},ko=function(e){return e.world.leafDayOfYear1},Oo=function(e){return e.world.leafDayOfYear2},Yo=function(e){return e.world.ground},Lo=function(e){return e.world.address},No=function(e){return e.world.countryCode},Uo=function(e){return e.world.airAttenuationCoefficient},Eo=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},Hi=function(e){return e.hourlySolarPanelOutputArrayMap},ji=function(e){return e.setHourlySolarPanelOutputArray},zi=function(e){return e.getRoofSegmentVertices},Ri=function(e){return e.getRoofSegmentVerticesWithoutOverhang},Di=function(e){return e.changed},Wi=function(e){return e.setChanged},Mi=function(e){return e.setSkipChange},Ii=function(e){return e.applyCount},Ci=function(e){return e.setApplyCount},Fi=function(e){return e.revertApply},ki=function(e){return e.elements},Oi=function(e){return e.notes},Yi=function(e){return e.pvModules},Li=function(e){return e.loadPvModules},Ni=function(e){return e.getPvModule},Ui=function(e){return e.floatingWindowOpacity},Ei=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},Hr=function(e){return e.importContent},jr=function(e){return e.exportContent},zr=function(e){return e.clearContent},Rr=function(e){return e.createEmptyFile},Dr=function(e){return e.aabb},Wr=function(e){return e.animateSun},Mr=function(e){return e.animate24Hours},Ir=function(e){return e.runDailyThermalSimulation},Cr=function(e){return e.pauseDailyThermalSimulation},Fr=function(e){return e.runYearlyThermalSimulation},kr=function(e){return e.pauseYearlyThermalSimulation},Or=function(e){return e.clearDailySimulationResultsFlag},Yr=function(e){return e.clearYearlySimulationResultsFlag},Lr=function(e){return e.runDynamicSimulation},Nr=function(e){return e.runStaticSimulation},Ur=function(e){return e.pauseSimulation},Er=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.getSelectedElement},on=function(e){return e.overlapWithSibling},rn=function(e){return e.selectedSideIndex},nn=function(e){return e.setElementPosition},cn=function(e){return e.setElementSize},sn=function(e){return e.setElementNormal},dn=function(e){return e.updateAllElementLocks},un=function(e){return e.updateElementLockByFoundationId},fn=function(e){return e.updateElementLockByParentId},hn=function(e){return e.updateElementLockById},pn=function(e){return e.updateElementReferenceById},yn=function(e){return e.updateElementLabelById},gn=function(e){return e.updateElementShowLabelById},mn=function(e){return e.updateElementCxById},wn=function(e){return e.updateElementCyById},xn=function(e){return e.updateElementCzById},vn=function(e){return e.updateElementCzForAll},bn=function(e){return e.updateElementLxById},An=function(e){return e.updateElementLxAboveFoundation},Tn=function(e){return e.updateElementLxForAll},Pn=function(e){return e.updateElementLyById},Sn=function(e){return e.updateElementLyAboveFoundation},Hn=function(e){return e.updateElementLyForAll},jn=function(e){return e.updateElementLzById},zn=function(e){return e.updateElementLzForAll},Rn=function(e){return e.updateElementColorById},Dn=function(e){return e.updateElementColorOnSurface},Wn=function(e){return e.updateElementColorAboveFoundation},Mn=function(e){return e.updateElementColorForAll},In=function(e){return e.updateElementLineColorById},Cn=function(e){return e.updateElementLineColorOnSurface},Fn=function(e){return e.updateElementLineColorAboveFoundation},kn=function(e){return e.updateElementLineColorForAll},On=function(e){return e.updateElementLineWidthById},Yn=function(e){return e.updateElementLineWidthOnSurface},Ln=function(e){return e.updateElementLineWidthAboveFoundation},Nn=function(e){return e.updateElementLineWidthForAll},Un=function(e){return e.updateElementRotationById},En=function(e){return e.updateElementRotationForAll},Vn=function(e){return e.foundationActionScope},Jn=function(e){return e.setFoundationActionScope},Gn=function(e){return e.polygonActionScope},Xn=function(e){return e.setPolygonActionScope},Bn=function(e){return e.updatePolygonVertexPositionById},Kn=function(e){return e.updatePolygonVerticesById},qn=function(e){return e.cuboidActionScope},Qn=function(e){return e.setCuboidActionScope},Zn=function(e){return e.solarPanelActionScope},_n=function(e){return e.setSolarPanelActionScope},$n=function(e){return e.updateSolarCollectorDailyYieldById},ec=function(e){return e.updateSolarCollectorYearlyYieldById},tc=function(e){return e.updateSolarPanelTiltAngleById},lc=function(e){return e.updateSolarCollectorDrawSunBeamById},ac=function(e){return e.updateSolarCollectorDrawSunBeamAboveFoundation},oc=function(e){return e.updateSolarCollectorDrawSunBeamForAll},ic=function(e){return e.updateSolarCollectorRelativeAzimuthById},rc=function(e){return e.updateSolarCollectorRelativeAzimuthOnSurface},nc=function(e){return e.updateSolarCollectorRelativeAzimuthAboveFoundation},cc=function(e){return e.updateSolarCollectorRelativeAzimuthForAll},sc=function(e){return e.updateSolarCollectorPoleHeightById},dc=function(e){return e.updateSolarCollectorPoleHeightOnSurface},uc=function(e){return e.updateSolarCollectorPoleHeightAboveFoundation},fc=function(e){return e.updateSolarCollectorPoleHeightForAll},hc=function(e){return e.updateSolarCollectorPoleRadiusById},pc=function(e){return e.updateSolarCollectorPoleRadiusAboveFoundation},yc=function(e){return e.updateSolarCollectorPoleRadiusForAll},gc=function(e){return e.updateCspReflectanceById},mc=function(e){return e.updateCspReflectanceAboveFoundation},wc=function(e){return e.updateCspReflectanceForAll},xc=function(e){return e.updateParabolicCollectorAbsorptanceById},vc=function(e){return e.updateParabolicCollectorAbsorptanceAboveFoundation},bc=function(e){return e.updateParabolicCollectorAbsorptanceForAll},Ac=function(e){return e.updateParabolicCollectorOpticalEfficiencyById},Tc=function(e){return e.updateParabolicCollectorOpticalEfficiencyAboveFoundation},Pc=function(e){return e.updateParabolicCollectorOpticalEfficiencyForAll},Sc=function(e){return e.updateParabolicCollectorThermalEfficiencyById},Hc=function(e){return e.updateParabolicCollectorThermalEfficiencyAboveFoundation},jc=function(e){return e.updateParabolicCollectorThermalEfficiencyForAll},zc=function(e){return e.parabolicTroughActionScope},Rc=function(e){return e.setParabolicTroughActionScope},Dc=function(e){return e.fresnelReflectorActionScope},Wc=function(e){return e.setFresnelReflectorActionScope},Mc=function(e){return e.heliostatActionScope},Ic=function(e){return e.setHeliostatActionScope},Cc=function(e){return e.updateSolarReceiverById},Fc=function(e){return e.updateSolarReceiverAboveFoundation},kc=function(e){return e.updateSolarReceiverForAll},Oc=function(e){return e.parabolicDishActionScope},Yc=function(e){return e.setParabolicDishActionScope},Lc=function(e){return e.updateParabolaLatusRectumById},Nc=function(e){return e.updateParabolaLatusRectumAboveFoundation},Uc=function(e){return e.updateParabolaLatusRectumForAll},Ec=function(e){return e.updateModuleLengthById},Vc=function(e){return e.updateModuleLengthAboveFoundation},Jc=function(e){return e.updateModuleLengthForAll},Gc=function(e){return e.updateInsideLightById},Xc=function(e){return e.updateInsideLightsByParentId},Bc=function(e){return e.copyElementById},Kc=function(e){return e.removeElementById},qc=function(e){return e.removeElementsByType},Qc=function(e){return e.clearDeletedElements},Zc=function(e){return e.countElementsByReferenceId},_c=function(e){return e.removeElementsByReferenceId},$c=function(e){return e.removeAllChildElementsByType},es=function(e){return e.removeAllElementsOnFoundationByType},ts=function(e){return e.pasteElementsToPoint},ls=function(e){return e.pasteElementsByKey},as=function(e){return e.elementsToPaste},os=function(e){return e.selectMe},is=function(e){return e.selectNone},rs=function(e){return e.addElement},ns=function(e){return e.objectTypeToAdd},cs=function(e){return e.actionModeLock},ss=function(e){return e.countElementsByType},ds=function(e){return e.countSolarStructuresByType},us=function(e){return e.countObservers},fs=function(e){return e.countAllOffspringsByTypeAtOnce},hs=function(e){return e.countSolarPanelsOnRack},ps=function(e){return e.selectedElementAngle},ys=function(e){return e.waiting},gs=function(e){return e.simulationInProgress},ms=function(e){return e.simulationPaused},ws=function(e){return e.evolutionInProgress},xs=function(e){return e.evolutionPaused},vs=function(e){return e.contextMenuObjectType},bs=function(e){return e.enableFineGrid},As=function(e){return e.setEnableFineGrid},Ts=function(e){return e.showCloudFilePanel},Ps=function(e){return e.projectInfo},Ss=function(e){return e.projectView},Hs=function(e){return e.showProjectListPanel},js=function(e){return e.showModelsGallery},zs=function(e){return e.showAccountSettingsPanel},Rs=function(e){return e.showLikesPanel},Ds=function(e){return e.showPublishedModelsPanel},Ws=function(e){return e.weatherData},Ms=function(e){return e.loadWeatherData},Is=function(e){return e.getWeather},Cs=function(e){return e.loadHorizontalSolarRadiationData},Fs=function(e){return e.getHorizontalSolarRadiation},ks=function(e){return e.loadVerticalSolarRadiationData},Os=function(e){return e.getVerticalSolarRadiation},Ys=function(e){return e.getClosestCity},Ls=function(e){return e.sunlightDirection},Ns=function(e){return e.setSunlightDirection},Us=function(e){return e.showSolarRadiationHeatmap},Es=function(e){return e.showHeatFluxes},Vs=function(e){return e.runSolarPanelVisibilityAnalysis},Js=function(e){return e.solarPanelVisibilityResults},Gs=function(e){return e.runDailySimulationForSolarPanels},Xs=function(e){return e.runDailySimulationForSolarPanelsLastStep},Bs=function(e){return e.runYearlySimulationForSolarPanels},Ks=function(e){return e.runYearlySimulationForSolarPanelsLastStep},qs=function(e){return e.pauseDailySimulationForSolarPanels},Qs=function(e){return e.pauseYearlySimulationForSolarPanels},Zs=function(e){return e.dailyPvYield},_s=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyPvIndividualOutputs},$s=function(e){return e.setDailyPvYield},ed=function(e){return e.yearlyPvYield},td=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyPvIndividualOutputs},ld=function(e){return e.setYearlyPvYield},ad=function(e){return e.solarPanelLabels},od=function(e){return e.setSolarPanelLabels},id=function(e){return e.setTotalBuildingHeater},rd=function(e){return e.setTotalBuildingAc},nd=function(e){return e.setTotalBuildingSolarPanel},cd=function(e){return e.runDailySimulationForParabolicTroughs},sd=function(e){return e.runYearlySimulationForParabolicTroughs},dd=function(e){return e.pauseDailySimulationForParabolicTroughs},ud=function(e){return e.pauseYearlySimulationForParabolicTroughs},fd=function(e){return e.dailyParabolicTroughYield},hd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicTroughIndividualOutputs},pd=function(e){return e.setDailyParabolicTroughYield},yd=function(e){return e.yearlyParabolicTroughYield},gd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicTroughIndividualOutputs},md=function(e){return e.setYearlyParabolicTroughYield},wd=function(e){return e.parabolicTroughLabels},xd=function(e){return e.setParabolicTroughLabels},vd=function(e){return e.runDailySimulationForFresnelReflectors},bd=function(e){return e.runYearlySimulationForFresnelReflectors},Ad=function(e){return e.pauseDailySimulationForFresnelReflectors},Td=function(e){return e.pauseYearlySimulationForFresnelReflectors},Pd=function(e){return e.dailyFresnelReflectorYield},Sd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyFresnelReflectorIndividualOutputs},Hd=function(e){return e.setDailyFresnelReflectorYield},jd=function(e){return e.yearlyFresnelReflectorYield},zd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyFresnelReflectorIndividualOutputs},Rd=function(e){return e.setYearlyFresnelReflectorYield},Dd=function(e){return e.fresnelReflectorLabels},Wd=function(e){return e.setFresnelReflectorLabels},Md=function(e){return e.runDailySimulationForHeliostats},Id=function(e){return e.runYearlySimulationForHeliostats},Cd=function(e){return e.pauseDailySimulationForHeliostats},Fd=function(e){return e.pauseYearlySimulationForHeliostats},kd=function(e){return e.dailyHeliostatYield},Od=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyHeliostatIndividualOutputs},Yd=function(e){return e.setDailyHeliostatYield},Ld=function(e){return e.yearlyHeliostatYield},Nd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyHeliostatIndividualOutputs},Ud=function(e){return e.setYearlyHeliostatYield},Ed=function(e){return e.heliostatLabels},Vd=function(e){return e.setHeliostatLabels},Jd=function(e){return e.runDailySimulationForUpdraftTower},Gd=function(e){return e.runYearlySimulationForUpdraftTower},Xd=function(e){return e.pauseDailySimulationForUpdraftTower},Bd=function(e){return e.pauseYearlySimulationForUpdraftTower},Kd=function(e){return e.dailyUpdraftTowerResults},qd=function(e){return e.dailyUpdraftTowerYield},Qd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyUpdraftTowerIndividualOutputs},Zd=function(e){return e.setDailyUpdraftTowerResults},_d=function(e){return e.setDailyUpdraftTowerYield},$d=function(e){return e.yearlyUpdraftTowerYield},eu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyUpdraftTowerIndividualOutputs},tu=function(e){return e.setYearlyUpdraftTowerYield},lu=function(e){return e.updraftTowerLabels},au=function(e){return e.setUpdraftTowerLabels},ou=function(e){return e.runDailySimulationForParabolicDishes},iu=function(e){return e.runYearlySimulationForParabolicDishes},ru=function(e){return e.pauseDailySimulationForParabolicDishes},nu=function(e){return e.pauseYearlySimulationForParabolicDishes},cu=function(e){return e.dailyParabolicDishYield},su=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicDishIndividualOutputs},du=function(e){return e.setDailyParabolicDishYield},uu=function(e){return e.yearlyParabolicDishYield},fu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicDishIndividualOutputs},hu=function(e){return e.setYearlyParabolicDishYield},pu=function(e){return e.parabolicDishLabels},yu=function(e){return e.setParabolicDishLabels},gu=function(e){return e.runDailyLightSensor},mu=function(e){return e.pauseDailyLightSensor},wu=function(e){return e.runYearlyLightSensor},xu=function(e){return e.pauseYearlyLightSensor},vu=function(e){return e.dailyLightSensorData},bu=function(e){return e.setDailyLightSensorData},Au=function(e){return e.yearlyLightSensorData},Tu=function(e){return e.setYearlyLightSensorData},Pu=function(e){return e.sensorLabels},Su=function(e){return e.setSensorLabels},Hu=function(e){return e.hoveredHandle},ju=function(e){return e.moveHandleType},zu=function(e){return e.resizeHandleType},Ru=function(e){return e.getResizeHandlePosition},Du=function(e){return e.rotateHandleType},Wu=function(e){return e.resizeAnchor},Mu=function(e){return e.isAddingElement},Iu=function(e){return e.addedFoundationId},Cu=function(e){return e.deletedFoundationId},Fu=function(e){return e.addedCuboidId},ku=function(e){return e.deletedCuboidId},Ou=function(e){return e.addedWallId},Yu=function(e){return e.deletedWallId},Lu=function(e){return e.deletedRoofId},Nu=function(e){return e.autoDeletedRoof},Uu=function(e){return e.autoDeletedChild},Eu=function(e){return e.groupActionMode},Vu=function(e){return e.groupMasterId},Ju=function(e){return e.groupActionUpdateFlag},Gu=function(e){return e.addedWindowId},Xu=function(e){return e.addedDoorId},Bu=function(e){return e.updateWallMapOnFoundationFlag},Ku=function(e){return e.wallActionScope},qu=function(e){return e.roofActionScope},Qu=function(e){return e.windowActionScope},Zu=function(e){return e.doorActionScope},_u=function(e){return e.setRoofActionScope},$u=function(e){return e.updateWallLeftJointsById},ef=function(e){return e.updateWallRightJointsById},tf=function(e){return e.updateWallLeftPointById},lf=function(e){return e.updateRoofStructureById},af=function(e){return e.economicsParams},of=function(e){return e.fittestIndividualResults},rf=function(e){return e.setFittestIndividualResults},nf=function(e){return e.variableLabels},cf=function(e){return e.setVariableLabels},sf=function(e){return e.evolutionaryAlgorithmState},df=function(e){return e.solarPanelArrayLayoutConstraints},uf=function(e){return e.geneticAlgorithmWizardSelectedTab},ff=function(e){return e.particleSwarmOptimizationWizardSelectedTab},hf=function(e){return e.setPrimitiveStore},pf=l(0),yf=n.a.memo((function(e){var t=e.hx,l=e.hy,a=e.hz,i=e.position,n=e.rotation,c=Xw(bs),s=Xw(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(pf.jsxs)("group",{position:null!==i&&void 0!==i?i:[0,0,a+.01],rotation:n,children:[b.map((function(e){return Object(pf.jsx)(Jl.a,{points:[[e,-l,0],[e,l,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)})),A.map((function(e){return Object(pf.jsx)(Jl.a,{points:[[-t,e,0],[t,e,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)}))]})})),gf=function(e){var t=e.x,l=e.z,a=e.handleType,o=e.scale,i=void 0===o?[1,1,1]:o,n=Xw(si),c=Xw(zu),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(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:h})})},mf=n.a.memo(gf),wf=function(e){var t=e.handleType,l=Xw(ju),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(pf.jsx)(Lt.h,{ref:a,name:t,args:[.1,6,6],onPointerEnter:function(){c("red")},onPointerLeave:function(){null===l&&c("white")},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},xf=n.a.memo(wf),vf=l(166),bf=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:W.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}})),Af=y()((function(e,t){return{roofSegmentVerticesMap:new Map,setRoofSegmentVertices:function(t,l){e((function(e){e.roofSegmentVerticesMap.set(t,Object(f.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(f.a)(t)}))},yearlyLightSensorData:[],setYearlyLightSensorData:function(t){e((function(e){e.yearlyLightSensorData=Object(f.a)(t)}))},sensorLabels:[],setSensorLabels:function(t){e((function(e){e.sensorLabels=Object(f.a)(t)}))},dailyPvYield:[],setDailyPvYield:function(t){e((function(e){e.dailyPvYield=Object(f.a)(t)})),bf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumDailyPvYield:function(){var e,t=0,l=Object(h.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=Ww.countAllSolarPanels();return e*Xw.getState().economicsParams.electricitySellingPrice-t*Xw.getState().economicsParams.operationalCostPerUnit},yearlyPvYield:[],setYearlyPvYield:function(t){e((function(e){e.yearlyPvYield=Object(f.a)(t)})),bf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumYearlyPvYield:function(){var e,t,l,a=0,o=Object(h.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=Xw.getState().world)||void 0===t?void 0:t.daysPerYear)&&void 0!==e?e:6))},getYearlyPvProfit:function(){var e=Ww.countAllSolarPanels();return this.sumYearlyPvYield()*Xw.getState().economicsParams.electricitySellingPrice-e*Xw.getState().economicsParams.operationalCostPerUnit*365},solarPanelLabels:[],setSolarPanelLabels:function(t){e((function(e){e.solarPanelLabels=Object(f.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(f.a)(t)}))},sumDailyParabolicDishYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyParabolicDishYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyParabolicTroughYield:[],setDailyParabolicTroughYield:function(t){e((function(e){e.dailyParabolicTroughYield=Object(f.a)(t)}))},sumDailyParabolicTroughYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyParabolicTroughYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyFresnelReflectorYield:[],setDailyFresnelReflectorYield:function(t){e((function(e){e.dailyFresnelReflectorYield=Object(f.a)(t)}))},sumDailyFresnelReflectorYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyFresnelReflectorYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyHeliostatYield:[],setDailyHeliostatYield:function(t){e((function(e){e.dailyHeliostatYield=Object(f.a)(t)}))},sumDailyHeliostatYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyHeliostatYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyUpdraftTowerResults:[],dailyUpdraftTowerYield:[],setDailyUpdraftTowerResults:function(t){e((function(e){e.dailyUpdraftTowerResults=Object(f.a)(t)}))},setDailyUpdraftTowerYield:function(t){e((function(e){e.dailyUpdraftTowerYield=Object(f.a)(t)}))},sumDailyUpdraftTowerYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyUpdraftTowerYield:function(){var e,t=0,l=Object(h.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(f.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()}))}}})),Tf="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC",Pf=l.p+"static/media/roof_01.1418beb1.png",Sf=l.p+"static/media/roof_02.055d6e06.png",Hf=l.p+"static/media/roof_03.1d45e089.png",jf=l.p+"static/media/roof_04.20dee2dd.png",zf=l.p+"static/media/roof_05.34757ec1.png",Rf=l.p+"static/media/roof_06.0fce42da.png",Df=l.p+"static/media/roof_07.d0b809f8.png",Wf=new We.MeshStandardMaterial({color:"white",side:We.FrontSide}),Mf=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.spacingX,h=l.spacingY,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(pf.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 We.EllipseCurve(0,l-a,a,a,o,r,!1,0).getPoints(24).map((function(e){return new We.Vector3(e.x,e.y)}));return new We.CatmullRomCurve3(n)},v=Object(r.useMemo)((function(){var e=[],t=Math.round(i/f)-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(pf.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(pf.jsxs)(pf.Fragment,{children:[T(s,0),T(m,g),T(m,-g)]})]})})),If=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),h=l.color,p=l.width,y=l.sillWidth,g=Object(r.useMemo)((function(){return Object(pf.jsx)("meshStandardMaterial",{color:h})}),[h]),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)),h=Math.PI-u,y=n-c,g=new We.EllipseCurve(0,r,a,a,o,i,!1,0).getPoints(36),m=new We.EllipseCurve(0,y,c,c,h,u,!0,0).getPoints(36);return new We.Shape([].concat(Object(f.a)(g),Object(f.a)(m)))}),[c,n,i,p]);return Object(pf.jsxs)("group",{name:"Window Frame Group",position:[0,-w/2,0],children:[d>.1?Object(pf.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(pf.jsx)(Lt.a,{position:[0,0,n/2],args:[i+2*p,w,p],castShadow:a,receiveShadow:a,children:g}),Object(pf.jsx)(Lt.a,{position:[-i/2-m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(pf.jsx)(Lt.a,{position:[i/2+m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(pf.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})]})})),Cf=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 We.EllipseCurve(0,e-l,l,l,a,o,!1,0).getPoints(24).map((function(e){return new We.Vector3(e.x,e.y)}));return new We.CatmullRomCurve3(i)},A=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:f})}),[f]),T=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:yt})}),[]),P=function(e,t){return Object(pf.jsxs)(pf.Fragment,{children:[v>.1?Object(pf.jsx)(Lt.e,{position:[0,0,c/2-v],rotation:[vt,0,0],args:[(l=e,(new We.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(pf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,x-e/2],material:t}),o&&Object(pf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,-x],material:t}),Object(pf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[w,0,-v/2],material:t}),Object(pf.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(pf.jsxs)("group",{name:"Window Wireframe Group",children:[y>0&&Object(pf.jsx)("group",{position:[0,t,0],children:P(g,A)}),p&&h&&P(m,T)]})})),Ff=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.shutter,f=e.glassMaterial,h=e.showHeatFluxes,p=e.area,y=e.empty,g=e.interior,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Xw(o.shadowEnabled),T=Af(Ai),P=Object(r.useRef)(0),S=Object(r.useRef)(),H=Object(u.a)(l,4),j=H[0],z=H[1],R=H[2],D=H[3],W=Object(u.a)(a,3),M=(W[0],W[1]),I=(W[2],function(e,t){if(D>0){var l=.5*j,a=.5*R,o=Math.min(D,R,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(R-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 We.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},Of=n.a.memo(Ff),Yf=new We.MeshStandardMaterial({color:"white",side:We.DoubleSide}),Lf=new We.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(pf.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 We.Vector3(m,-w),t=new We.Vector3(m,w),l=new We.Vector3(-m,w),a=new We.Vector3(-m,-w);return[e,t,new We.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(pf.jsxs)("group",{name:"Window Frame Group",position:[0,-x/2,0],children:[Object(pf.jsx)(Lt.e,{position:[0,x/2,0],rotation:[vt,0,0],args:[P,{steps:1,depth:x,bevelEnabled:!1}],children:g}),Object(pf.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})]})})),Uf=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.shutter,y=e.area,g=e.showHeatFluxes,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Af(Ai),T=Object(r.useRef)(0),P=Object(r.useRef)(),S=Object(u.a)(i,3),H=(S[0],S[1]),j=(S[2],Object(u.a)(l,3)),z=j[0],R=j[1],D=j[2],W=l.map((function(e){return e/2})),M=Object(u.a)(W,3),I=M[0],C=M[1],F=M[2],k=Object(u.a)(a,2),O=k[0],Y=k[1],L=f.lineWidth,N=f.lineColor,U=f.selected,E=f.locked,V=(f.opacity,O*z),J=Math.hypot(Y,I-V),G=Math.asin(Y/J),X=Math.hypot(Y,I+V),B=-Math.asin(Y/X),K=Xw(o.shadowEnabled),q=function(e,t){var l=.5*z,o=.5*(D+a[1]),i=a[1],r=[{x:-l,y:-o},{x:l,y:-o},{x:l,y:o-i},{x:z*a[0],y:o},{x:-l,y:o-i}];return Ww.isPointInside(e,t,r)},Q=Object(r.useMemo)((function(){var e;if(g&&!d&&(!m||!m.notBuilding)){var l=A.get(t);if(l){var o=l.reduce((function(e,t){return e+t}),0);if(0!==y){var i=4*(null!==(e=w.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),r=D+a[1],n=Math.max(2,Math.round(z/i)),c=Math.max(2,Math.round(r/i)),s=z/n,u=r/c,f=o/y*(null!==x&&void 0!==x?x:_e);T.current=f<0?1:0,P.current=Ww.getEuler(Rt,jt,"YXZ",Math.sign(f)*vt);var h=[],p=a[1]/2;if(f<0)for(var v=0;v1&&void 0!==arguments[1]?arguments[1]:0;return Object(pf.jsx)(Lt.d,{args:[te,te,e,3,1],position:[t,le,0],rotation:[0,0,vt],material:ee})},oe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object(pf.jsx)(Lt.f,{args:[e,R],position:[t,0,0],material:Yf,receiveShadow:K,castShadow:K})};return Object(pf.jsxs)(pf.Fragment,{children:[!s&&Object(pf.jsxs)("mesh",{name:"Triangle Glass Plane",position:[0,H,0],rotation:[vt,0,0],children:[Object(pf.jsx)("shapeBufferGeometry",{args:[$]}),c]}),h.showFrame&&Object(pf.jsx)(Nf,{dimension:l,polygonTop:a,frameData:h,shadowEnabled:K}),Object(pf.jsx)(qg,{cx:_,lx:Z,lz:D,color:p.color,showLeft:p.showLeft,showRight:p.showRight,spacing:h.showFrame?h.width/2:0}),Object(pf.jsxs)("group",{position:[0,C,.001-F],children:[oe(z),ae(z)]}),Object(pf.jsxs)("group",{position:[.001-I,C,0],rotation:[0,vt,0],children:[oe(D),ae(D)]}),Object(pf.jsxs)("group",{position:[I-.001,C,0],rotation:[0,-vt,0],children:[oe(D),ae(D)]}),Object(pf.jsxs)("group",{position:[.001-I,C,F-.01],rotation:[0,B,0],children:[oe(X,X/2),ae(X,X/2)]}),Object(pf.jsxs)("group",{position:[I-.001,C,F-.01],rotation:[0,G,0],children:[oe(J,-J/2),ae(J,-J/2)]}),Q&&Q.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==b&&void 0!==b?b:et,color:null!==v&&void 0!==v?v:$e}),";",Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[T.current].clone().add(new We.Vector3(0,0===T.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=P.current)&&void 0!==l?l:[0,0,0],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==v&&void 0!==v?v:$e})})]},t)}))]})},Ef=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 We.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},Vf=n.a.memo(Uf),Jf=function(e){var t=e.id,l=e.index,a=e.foundationModel,i=e.roofType,c=e.segment,s=e.centroid,d=e.thickness,f=e.color,p=e.sideColor,y=e.texture,g=e.heatmap,m=e.windows,w=Xw(tn),x=bf(Es),v=Xw(o.heatFluxScaleFactor),b=Xw(o.heatFluxColor),A=Xw(o.heatFluxWidth),T=Af(Ri),P=Lp(),S=P.transparent,H=P.opacity,j=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(r.useRef)(),D=Xw.getState().world,W=Af.getState().hourlyHeatExchangeArrayMap,M=c.points,I=Object(r.useMemo)((function(){if(x){var e=T(t);if(e){var l=[],a=new We.Vector3(0,0,d+.1);switch(i){case It.Hip:case It.Pyramid:var o,r=Object(h.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 f,p=Object(h.a)(e.entries());try{for(p.s();!(f=p.n()).done;){var y=Object(u.a)(f.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(h.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 H=[];H.push(S[0].clone().sub(s).add(a)),H.push(S[1].clone().sub(s).add(a)),l.push(H)}var j=[];j.push(S[0].clone().sub(s).add(a)),j.push(S[3].clone().sub(s).add(a)),l.push(j),(j=[]).push(S[1].clone().sub(s).add(a)),j.push(S[2].clone().sub(s).add(a)),l.push(j)}}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=W.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)(M,5),c=n[0],d=(n[1],n[2],n[3],n[4].z-c.z),f=r[l].map((function(e){return e.clone().sub(s).add(new We.Vector3(0,0,d))}));if(f){var p,y=[],g=Object(h.a)(f);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=f[0].clone(),P=f[1].clone(),S=f[2].clone(),H=(new We.Vector3).subVectors(P,A),I=(new We.Vector3).subVectors(S,A),C=(new We.Vector3).subVectors(S,P),F=H.length(),k=(new We.Vector3).crossVectors(I,C).length()/F,O=Math.max(2,Math.floor(F/b)),Y=Math.max(2,Math.floor(k/b));H.normalize(),I.normalize(),C.normalize();var L=(new We.Vector3).crossVectors(I,C).normalize(),N=H.multiplyScalar(.5*F/O),U=(new We.Vector3).crossVectors(L,H).normalize().multiplyScalar(.5*k/Y),E=A.clone().add(N).add(U);N.multiplyScalar(2),U.multiplyScalar(2),z.current=L.clone().multiplyScalar(.1);var J=[],G=new We.Vector3,X=4===f.length?Ww.getTriangleArea(f[0],f[1],f[2])+Ww.getTriangleArea(f[2],f[3],f[0]):Ww.getTriangleArea(f[0],f[1],f[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 Zm.onSegment(K[l],e.cx,a)}))),B&&B.length>0){var q,Q=Object(h.a)(B);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;X-=Ww.getWindowArea(Z)}}catch(ue){Q.e(ue)}finally{Q.f()}}var _,$=i/X*(null!==v&&void 0!==v?v:_e);j.current=$<0?1:0,R.current=Ww.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(h.a)(B);try{for(re.s();!(ae=re.n()).done;){var ne=ae.value,ce=Zm.getRelativeWindowVerticesOnRoof(ne),se=Ww.getPoints(ce);if(Ww.isPointInside(oe,ie,se)){_=!1;break}}}catch(ue){re.e(ue)}finally{re.f()}}if(_&&Ww.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Gf,{id:t,index:l,segment:c,color:f,sideColor:p,texture:y,heatmap:g,transparent:S,opacity:H,windows:m,centroid:s}),I&&I.map((function(e,t){return Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:z.current?e[j.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==b&&void 0!==b?b:$e})})]},t)}))]})},Gf=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=Xw(o.shadowEnabled),x=bf(Us),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 We.Vector3(e.lx,e.lz,2*e.ly),l=new We.Vector3(e.cx,e.cy,e.cz).sub(m),a=(new We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"]));if(e.windowType===Yt.Polygonal){var o,i=null!==(o=e.polygonTop)&&void 0!==o?o:Zg,r=Object(u.a)(i,2),n=r[0],c=r[1],s=t.x/2,d=t.y/2,h=n*t.x,p=Ef(s,d,h,c),y=new We.Mesh(new We.ExtrudeBufferGeometry([p],{steps:1,depth:t.z,bevelEnabled:!1})),g=new We.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=kf(t.x,t.y,e.archHeight),x=new We.Mesh(new We.ExtrudeBufferGeometry([w],{steps:1,depth:t.z,bevelEnabled:!1})),v=new We.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 We.Mesh(new We.BoxBufferGeometry(t.x,t.y,t.z));return b.position.copy(l),b.rotation.copy(a),b.updateMatrix(),b}))}),[g,m]),H=null!==(t=z())&&void 0!==t?t:6,j=Object(r.useMemo)((function(){return Array(H).fill(0)}),[H]);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 We.Vector3).subVectors(o,a),n=r.length(),c=(new We.Vector3).subVectors(i,a),s=new We.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],H=s[2].equals(A);if(x)X(H);else{var j=(new We.Vector3).subVectors(m,y),z=(new We.Vector3).subVectors(w,y),D=(new We.Vector3).subVectors(A,y),W=new We.Vector2(m.x-y.x,m.y-y.y).length(),M=W,I=j.dot(z)/W,C=j.clone().cross(z).length()/W,F=j.dot(D)/W,k=j.clone().cross(D).length()/W;H?(l.push(0,0,M,0,F,k),l.push(M,0,I,C,F,k)):(l.push(0,0,M,0,I,C),l.push(0,0,I,C,F,k))}B(6);var O=R(b.slice(0,b.length/2)),Y=Object(u.a)(O,2),L=Y[0],N=Y[1];G(L.reverse()),G(N.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 We.Float32BufferAttribute(t,3)),e.setAttribute("uv",new We.Float32BufferAttribute(l,2)),e.computeVertexNormals(),e.computeBoundingSphere(),g.length>0){for(var U=[],E=0;E0&&void 0!==arguments[0]&&arguments[0],t=(new We.Vector3).subVectors(b[1],b[0]),a=t.length();t.normalize();var o=(new We.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 We.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(h.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(f.a)(p)),t.push.apply(t,Object(f.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=Ww.distanceFromPointToLine2D(i,l,a),n=Ww.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(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:A,transparent:p,opacity:y})},W=function(){return Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:n,map:A,transparent:p,opacity:y})},M=function(){return Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:c,transparent:p,opacity:y})},I=w&&!x;return Object(pf.jsx)("mesh",{ref:v,name:"Buffer Roof Segment ".concat(a),uuid:l+"-"+a,userData:{simulation:!0},receiveShadow:I,castShadow:I,frustumCulled:!1,children:j.map((function(e,t){return 0!==t?Object(pf.jsx)(M,{},"side"+t):x?Object(pf.jsx)(D,{},"heatmap"+t):Object(pf.jsx)(W,{},"texture"+t)}))})})),Xf=n.a.memo(Jf),Bf=function(e){var t=e.cz,l=e.points,a=new We.Shape;a.moveTo(l[0].x,l[0].y);var o,i=Object(h.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(pf.jsx)(Lt.e,{scale:.99,position:[0,0,t],args:[a,{steps:1,depth:.1,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide,color:"white"})})},Kf=n.a.memo(Bf),qf=l(88);function Qf(e){return e.type===V.Foundation||e.type===V.Cuboid}var Zf=function(e,t){var l=e.id,a=e.cx,o=e.cy,i=e.lx,n=e.ly,c=e.lz,s=(e.selected,e.enableGroupMaster),d=Xw(Ju),p=Object(r.useRef)(new Set),y=Object(r.useRef)([]),g=Object(r.useRef)(new Set),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)([a,o,c/2]),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(0),H=Object(u.a)(S,2),j=H[0],z=H[1],R=e.type===V.Cuboid;Object(r.useEffect)((function(){t===l?(p.current.clear(),g.current.clear(),y.current=[],D(e),e.enableGroupMaster?(M(e),p.current.size>1?C():I()):I()):(P([a,o,0]),v(null),z(0))}),[t,d,s]);var D=function(e){var t,l=e.lx/2,a=e.ly/2,o=new We.Vector2,i=Ww.getWorldDataById(e.id),r=i.pos,n=i.rot,c=new We.Vector2(r.x,r.y),s=[new We.Vector2(l,a),new We.Vector2(-l,a),new We.Vector2(l,-a),new We.Vector2(-l,-a)].map((function(e){return e.rotateAround(o,n).add(c),{x:e.x,y:e.y}}));p.current.add(e.id),(t=y.current).push.apply(t,Object(f.a)(s))},W=function e(t){p.current.add(t.id),g.current.add(t.id);var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Cuboid||o.locked||o.parentId!==t.id||e(o)}}catch(i){a.e(i)}finally{a.f()}},M=function e(t){var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Qf(o)&&o.parentId===xt&&!o.locked&&!p.current.has(o.id))Ww.isChild(t.id,o.id,!0)?W(o):Ww.areTwoBasesOverlapped(o,t)&&(D(o),e(o))}}catch(i){a.e(i)}finally{a.f()}},I=function(){var t,l=R?0:3,r=l,s=new Map,d=Object(h.a)(Xw.getState().elements);try{for(d.s();!(t=d.n()).done;){var u=t.value;if(u.foundationId===(null===e||void 0===e?void 0:e.id)){if(u.type===V.Wall){var f,m=u;if(l=Math.max(l,m.lz),m.roofId)(null!==(f=s.get(m.roofId))&&void 0!==f?f:0)1){var b=Ww.calculatePolygonBounds(y.current),A=Ww.getWorldDataById(e.parentId),T=A.pos,S=A.topZ,H=new We.Vector3(b.x+b.width/2,b.y+b.height/2),j=(new We.Vector3).subVectors(H,T).setZ(0);v([b.width,b.height,r-S]),P(j.toArray()),z(0)}else P([a,o,0]),z(null===e||void 0===e?void 0:e.rotation[2]),v([i,n,l+c])},C=function(){var t,l=Ww.calculatePolygonBounds(y.current),a=R?0:1,o=c,i=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var n=t.value;if(n.foundationId&&p.current.has(n.foundationId)){if(n.type===V.Wall){var s,d=n;if(a=Math.max(a,d.lz),d.roofId)(null!==(s=i.get(d.roofId))&&void 0!==s?s:0)0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Zm.getWallHeight($,l),r=i.lh,n=i.rh;ee.current||(0===l&&(r=$[0].lz),l===$.length-1&&(n=$[$.length-1].lz));var c=Zm.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=Zm.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 We.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=Zm.getIntersectionPoint(ne[u-1].leftPoint,ne[u-1].rightPoint,ne[u].leftPoint,ne[u].rightPoint).setZ($[$.length-1].lz-t).sub(ie),h=Zm.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 We.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 We.Vector3).fromArray($[0].leftPoint));var t,l=Object(h.a)($);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new We.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(O.position.x-a,O.position.y-i)-ue;eh.set(oe.x,oe.y,ae),th.set(-vt,0,fe,"ZXY")}var pe=Bp();Object(r.useEffect)((function(){if(!pe){var e=Xw.getState().addedRoofId;if(e&&e===c&&$.length>=2&&function(e,t){if(e.length!==t.size)return!0;var l,a=Object(h.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 t=$.map((function(e){return e.id})),l=new Set(t);C((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof)i.id===c&&(i.wallsId=t);else if(i.type===V.Wall&&Z.has(i.id)&&!l.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()}}))}}}),[Z]),Object(r.useEffect)((function(){if($.length>1){var e=Xw.getState().addedRoofId;if(e&&e===c){for(var t=function(e){C((function(t){var l,a=Object(h.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()}}))},l=0;l<$.length;l++)t(l);Xw.getState().setAddedRoofId(null)}}else F(c,!1,!1,!0)}),[$]),qp(l,c,se,ie,ae,w);var ye=function(){if($.length<2)return!1;var e,t=$[0].lz,l=Object(h.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(h.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=bf(Us),Ae=Xw(o.solarRadiationHeatmapMaxValue),Te=Af(wi),Pe=Object(r.useState)([]),He=Object(u.a)(Pe,2),je=He[0],ze=He[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),Me=De[0],Ie=De[1],Ce=Xw(os),Fe=Jp(c,ie,se,xe,It.Pyramid);Object(r.useEffect)((function(){if(be)if(xe){var e=Te(c);if(e){var t=Ww.fetchHeatmapTexture(e,null!==Ae&&void 0!==Ae?Ae:5);if(t){var a=Fe();if(a&&a.length>0&&l){var o,i=new We.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(h.a)(a);try{for(u.s();!(o=u.n()).done;){var f,p=o.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.value.clone().applyEuler(i);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){var A=[];if(Fe()){for(var T=0;T0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var a=Zm.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 We.Vector3(l.leftPoint[0],l.leftPoint[1],o),n=new We.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 We.Vector3(d.rightPoint[0],d.rightPoint[1],d.lz),f=new We.Vector3(s.leftPoint[0],s.leftPoint[1],s.lz);e.push([u,f,ie.clone()])}if(xe){var p,y=[],g=Object(h.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()}Af.getState().setRoofSegmentVerticesWithoutOverhang(c,[y])}else Af.getState().setRoofSegmentVerticesWithoutOverhang(c,e)}));var ke=Xw((function(e){return e.elements.filter((function(e){return e.parentId===c&&e.type===V.Window}))}),qf.a),Oe=Qp(c,l,ie,se),Ye=d===he.Default||d===he.NoTexture?p:"white";return Object(pf.jsxs)("group",{name:"Pyramid Roof Group ".concat(c),children:[Object(pf.jsx)("group",{name:"Pyramid Roof Segments Group ".concat(c),userData:Oe,position:[oe.x,oe.y,ae],onPointerDown:function(e){Rp(e,l.id,c,se,ie)},onPointerMove:function(e){Wp(e,c)},onPointerUp:function(e){Dp(e,t)},onContextMenu:function(e){Mp(e,c)},children:xe?Object(pf.jsx)(ey,{id:c,foundationModel:l,roofType:P,roofSegments:se,center:ie,thickness:w,lineWidth:b,lineColor:T,sideColor:g,color:Ye,textureType:d,heatmap:Me}):Object(pf.jsxs)(pf.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(pf.jsx)("group",{name:"Roof segment ".concat(t),children:Object(pf.jsx)(Xf,{id:c,index:t,foundationModel:l,roofType:P,segment:e,centroid:ie,thickness:w,color:Ye,sideColor:g,texture:D,heatmap:je&&t0&&Object(pf.jsx)(Kf,{points:de,cz:$[0].lz}),W&&!x&&Object(pf.jsx)(Ip,{position:[oe.x,oe.y,ae+w+.15],onPointerDown:function(e){Ce(t.id,e,X.Select),G(!0),Nt.getState().setEnableOrbitController(!1),q.current=!0,Q.current=j,C((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ae+t.thickness}))},onPointerUp:function(){G(!1),Nt.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(pf.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){N.x=e.offsetX/Y.domElement.clientWidth*2-1,N.y=-e.offsetY/Y.domElement.clientHeight*2+1,L.setFromCamera(N,O)}(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);Xw.getState().updateRoofRiseById(c,i,ae+t.thickness)}}},onPointerUp:function(e){Sp(c,Q.current,j),G(!1),Nt.getState().setEnableOrbitController(!0),q.current=!1}})]})},rh=n.a.memo(ih,Fp),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(h.a)(Xw.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(h.a)(Xw.getState().elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===n.id){var f=d.cx,p=d.cz,y=d.lx,g=d.ly,m=d.lz;if(f*=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:Zg,v=Object(u.a)(x,2),b=v[0],A=v[1],T=f+b*y,P=p+m/2+A;if(!Ww.isPointInside(T,P,c))return!1}if(!Ww.isElementInsideWall(new We.Vector3(f,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 We.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(pf.jsx)(Jl.a,{points:i,lineWidth:a,color:o}),h=Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[c[0],c[1]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[c[2],c[3]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[s[2],s[3]],lineWidth:a,color:o})]});return Object(pf.jsxs)(pf.Fragment,{children:[f,!u&&h,Object(pf.jsxs)("group",{position:[0,0,l],children:[f,!u&&h]}),Object(pf.jsx)(Jl.a,{points:[n[0],n[0].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[n[1],n[1].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[d[0],d[0].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[d[1],d[1].clone().add(r)],lineWidth:a,color:o})]})})),dh=new We.Vector3,uh=new We.Euler,fh=new We.Vector2,hh=new We.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,H=void 0===S?.2:S,j=t.locked,z=t.lineColor,R=void 0===z?"black":z,D=t.lineWidth,W=void 0===D?.2:D,M=t.roofType,I=t.rise,C=void 0===I?c:I,F=t.ceiling,k=void 0!==F&&F;void 0===m&&(m=p?Object(f.a)(p):[0,1]),void 0===w&&(w=y?Object(f.a)(y):[.35,.5]),void 0===x&&(x=g?Object(f.a)(g):[.35,.5]);var O=_f(a),Y=Zm.getWireframetStyle(R,W,O,j),L=Object(u.a)(Y,2);R=L[0],W=L[1];var N=Xw(si),U=Xw(Kc),E=Yp(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 We.Raycaster}),[]),ie=Object(r.useMemo)((function(){return new We.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){N((function(a){var o,i=Object(h.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(f.a)(l);break;case ge.TopLeft:case ge.TopRight:n.topRidgePoint=Object(f.a)(l);break;case ge.BackLeft:case ge.BackRight:n.backRidgePoint=Object(f.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(f.a)(l),newVal:Object(f.a)(a),type:t,undo:function(){de(o.resizedElementId,o.type,o.oldVal)},redo:function(){de(o.resizedElementId,o.type,o.newVal)}};Xw.getState().addUndoable(o)},fe=function(e,t){$(!0),Nt.getState().setEnableOrbitController(!1),dh.set(e.x,e.y,e.z).add(je),l&&t&&uh.set(vt,0,t.relativeAngle,"ZXY")},pe=function(e,t,l){var a=new We.Vector2(e.cx,e.cy),o=Zm.getComposedWallCenter(t),i=Zm.getComposedWallLength(t),r=new We.Vector2(o.x,o.y).rotateAround(fh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new We.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 We.Vector3;var o=Zm.getComposedWallLength(e),i=new We.Euler(0,0,e.relativeAngle),r=new We.Vector3(t*o,0,0),n=He;a&&(n=l*(He-a.lz)+a.lz);var c=Zm.getComposedWallCenter(e);return new We.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(h.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 We.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 We.Vector2(p(-i[0]),y(i[1],a)),new We.Vector2(p(r[0]),l),new We.Vector2(p(n[0]),y(n[1],o)),new We.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 We.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})),h=t[l],p=h.wallsId.reduce((function(e,t){var l=Xw.getState().elements.find((function(e){return e.id===t}));return l?[].concat(Object(f.a)(e),[l.lx+e[e.length-1]]):e}),[0]),y=0;y=w&&H<=x){var j=(H-T)/A,z=xe(d,H);null!==z&&(0===S?P.centerLeft=[j,z]:1===S?P.center=[j,z]:2===S&&(P.centerRight=[j,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=Up(s[0],d),Te=Ep(Ae,C,!0),Pe=Te.highestWallHeight,He=Te.topZ;Xp(t,Pe);var je=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.Vector3;var e=Ae.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Ww.calculatePolygonCentroid(e);return new We.Vector3(t.x,t.y,He)}),[Ae,He]),ze=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,m]),Re=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,m]),De=Object(r.useMemo)((function(){return(new We.Vector3).addVectors(ze,Re).divideScalar(2)}),[ze,Re]),Me=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,w]),Ie=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,w]),Ce=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,x]),Fe=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,x]),ke=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):[]}),[Ae]),Oe=Object(r.useMemo)((function(){return hh.clone().multiplyScalar(H)}),[H]),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)(ke,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),H=[],j=me(Ae,0),z=j.lh,R=j.rh,D=Zm.getDistance(p,y,Me.clone().add(je)),W=Math.min((null!==(e=r.eavesLength)&&void 0!==e?e:0)/D*(Me.clone().add(je).z-z),z),M=Zm.getDistance(p,y,Ie.clone().add(je)),I=Math.min((null!==(t=r.eavesLength)&&void 0!==t?t:0)/M*(Ie.clone().add(je).z-R),R),C=Zm.getIntersectionPoint(v,b,w,x).setZ(z-W).sub(je),F=Zm.getIntersectionPoint(w,x,A,T).setZ(R-I).sub(je),k=Zm.getIntersectionPoint(Me,Ie,v.clone().sub(je),b.clone().sub(je)).setZ(Me.z),O=Zm.getIntersectionPoint(Ie,Me,A.clone().sub(je),T.clone().sub(je)).setZ(Ie.z);H.push(C,F,O,k),H.push(C.clone().add(Oe),F.clone().add(Oe),O.clone().add(Oe),k.clone().add(Oe));var Y=Zm.getComposedWallCenter(r),L=-r.relativeAngle,N=new We.Vector3(Y.x,Y.y).sub(De.clone().setZ(0)).length();o.push({points:H,angle:L,length:N});var U=[],E=Zm.getIntersectionPoint(ze,Re,v.clone().sub(je),b.clone().sub(je)).setZ(ze.z),V=Zm.getIntersectionPoint(ze,Re,A.clone().sub(je),T.clone().sub(je)).setZ(Re.z);U.push(k,O,V,E),U.push(k.clone().add(Oe),O.clone().add(Oe),V.clone().add(Oe),E.clone().add(Oe)),o.push({points:U,angle:L,length:N});var J=-n.relativeAngle,G=me(Ae,2),X=G.lh,B=G.rh,K=Zm.getDistance(g,m,Ce.clone().add(je)),q=Math.min((null!==(l=n.eavesLength)&&void 0!==l?l:0)/K*(Ce.clone().add(je).z-X),X),Q=Zm.getDistance(g,m,Fe.clone().add(je)),Z=Math.min((null!==(a=n.eavesLength)&&void 0!==a?a:0)/Q*(Fe.clone().add(je).z-B),B),_=Zm.getIntersectionPoint(A,T,P,S).setZ(X-q).sub(je),$=Zm.getIntersectionPoint(P,S,v,b).setZ(B-Z).sub(je),ee=Zm.getIntersectionPoint(Ce,Fe,A.clone().sub(je),T.clone().sub(je)).setZ(Fe.z),te=Zm.getIntersectionPoint(Fe,Ce,v.clone().sub(je),b.clone().sub(je)).setZ(Fe.z),le=Zm.getComposedWallCenter(n),ae=new We.Vector3(le.x,le.y).sub(De.clone().setZ(0)).length(),oe=[];oe.push(ee,te,E,V),oe.push(ee.clone().add(Oe),te.clone().add(Oe),E.clone().add(Oe),V.clone().add(Oe)),o.push({points:oe,angle:J,length:ae});var ie=[];return ie.push(_,$,te,ee),ie.push(_.clone().add(Oe),$.clone().add(Oe),te.clone().add(Oe),ee.clone().add(Oe)),o.push({points:ie,angle:J,length:ae}),o}),[Ae,He,H,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 Ne=Bp();Object(r.useEffect)((function(){if(4===(null===Ae||void 0===Ae?void 0:Ae.length)){var e=Xw.getState().addedRoofId;(e&&e===a||!Ne)&&(se?function(e){var t,l=new Set,a=Object(h.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()}N((function(e){var t,a=Object(h.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=He,r.rightRoofHeight=He,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);N((function(t){var l,o=Object(h.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,f=me(e,0),p=f.lh,y=f.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,H=v.centerRight;if(b.roofId=a,b.leftRoofHeight=A,b.rightRoofHeight=T,S){var j=Object(u.a)(S,2),z=j[0],R=j[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),W=D[0],M=D[1];b.centerRoofHeight?(b.centerRoofHeight[0]=W,b.centerRoofHeight[1]=M):b.centerRoofHeight=[W,M]}else b.centerRoofHeight=void 0;if(H){var I=Object(u.a)(H,2),C=I[0],F=I[1];b.centerRightRoofHeight?(b.centerRightRoofHeight[0]=C,b.centerRightRoofHeight[1]=F):b.centerRightRoofHeight=[C,F]}else b.centerRightRoofHeight=void 0}}}}catch(k){o.e(k)}finally{o.f()}}))}(Ae,He,w,m,x),zp(l,a,Ye,je,He,H,se),Xw.getState().setAddedRoofId(null))}}),[Ye]),Kp(l,a,Ye,je,He,H,se);var Ue=Jp(a,je,Ye,se,It.Gambrel);Gp((function(){var e=[];if(!Ae||4!==Ae.length)return e;var t=Ae.map((function(e,t,l){return new We.Vector3(e.leftPoint.x,e.leftPoint.y,me(l,t).lh)})),l=Me.clone().add(je),o=Ie.clone().add(je),i=Ce.clone().add(je),r=Fe.clone().add(je),n=ze.clone().add(je),c=Re.clone().add(je);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?Af.getState().setRoofSegmentVerticesWithoutOverhang(a,[t]):Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ee=Xw((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),qf.a),Ve=Xw(os),Je=bf(Us),Ge=Xw(o.solarRadiationHeatmapMaxValue),Xe=Af(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=Ww.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new We.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(h.a)(o);try{for(u.s();!(i=u.n()).done;){var f,p=i.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.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(pf.jsx)(Kf,{cz:Ae[0].lz,points:Le}),O&&!j&&Object(pf.jsxs)("group",{position:[je.x,je.y,je.z+H],children:[Object(pf.jsx)(Ip,{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,He).add(je),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),Nt.getState().setEnableOrbitController(!1),N((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=He+t.thickness}))},onPointerOver:function(){N((function(e){e.hoveredHandle=ge.TopMid,e.selectedElementHeight=He+t.thickness,e.selectedElementX=De.x,e.selectedElementY=De.y}))}}),!se&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Ip,{position:[ze.x,ze.y,ze.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(m),fe(ze,Ae[3]),q(ge.TopLeft)}}),Object(pf.jsx)(Ip,{position:[Re.x,Re.y,Re.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(m),fe(Re,Ae[1]),q(ge.TopRight)}}),Object(pf.jsx)(Ip,{position:[Me.x,Me.y,Me.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(w),fe(Me,Ae[3]),q(ge.FrontLeft)}}),Object(pf.jsx)(Ip,{position:[Ie.x,Ie.y,Ie.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(w),fe(Ie,Ae[1]),q(ge.FrontRight)}}),Object(pf.jsx)(Ip,{position:[Ce.x,Ce.y,Ce.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(x),fe(Ce,Ae[1]),q(ge.BackLeft)}}),Object(pf.jsx)(Ip,{position:[Fe.x,Fe.y,Fe.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(x),fe(Fe,Ae[3]),q(ge.BackRight)}})]})]}),_&&Object(pf.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)&&Xw.getState().updateRoofRiseById(a,r,n+t.thickness);break;case ge.FrontLeft:if(l&&Ae&&4===Ae.length){var s=Ww.clamp(pe(l,Ae[3],i),m[0]+.05,.45),u=He-Ae[0].lz,f=[s,Ww.clamp((i.z-l.lz-Ae[0].lz)/u,0,1)],h=be(Ae,He,f,m,x);ch(h,d)&&N((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=Ww.clamp(pe(l,Ae[1],i),-.45,-m[0]-.05),y=He-Ae[0].lz,g=[-p,Ww.clamp((i.z-l.lz-Ae[0].lz)/y,0,1)],v=be(Ae,He,g,m,x);ch(v,d)&&N((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=[Ww.clamp(pe(l,Ae[3],i),.05-x[0],w[0]-.05),m[1]],A=be(Ae,He,w,b,x);ch(A,d)&&N((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=[-Ww.clamp(pe(l,Ae[1],i),.05-w[0],x[0]-.05),m[1]],P=be(Ae,He,w,T,x);ch(P,d)&&N((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=Ww.clamp(pe(l,Ae[1],i),.05-m[0],.45),H=He-Ae[2].lz,j=[S,Ww.clamp((i.z-l.lz-Ae[2].lz)/H,0,1)],z=be(Ae,He,w,m,j);ch(z,d)&&N((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(j))}))}break;case ge.BackRight:if(l&&Ae&&4===Ae.length){var R=Ww.clamp(pe(l,Ae[3],i),-.45,m[0]-.05),D=He-Ae[2].lz,W=[-R,Ww.clamp((i.z-l.lz-Ae[2].lz)/D,0,1)],M=be(Ae,He,w,m,W);ch(M,d)&&N((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(W))}))}}}}},onPointerUp:function(){switch(B){case ge.TopMid:Sp(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),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:.5})})]}):null},yh=n.a.memo(ph,Fp),gh=new We.Vector3,mh=new We.Euler,wh=new We.Vector2,xh=new We.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 We.Vector2(t.x,t.y)}),[t]),s=Object(r.useMemo)((function(){return new We.Vector2(l.x,l.y)}),[l]),d=Object(r.useMemo)((function(){return(new We.Vector2).subVectors(s,c).angle()}),[c,s]),u=Object(r.useMemo)((function(){var e=new We.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(pf.jsx)("group",{position:i,children:Object(pf.jsx)(Lt.e,{args:[u,{steps:1,depth:a,bevelEnabled:!1}],position:t,rotation:[vt,0,d,"ZXY"],castShadow:!0,receiveShadow:!0,children:Object(pf.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 We.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 We.Vector3).subVectors(new We.Vector3(h.rightPoint.x,h.rightPoint.y,h.lz),v).normalize(),o=(new We.Vector3).subVectors(new We.Vector3(y.leftPoint.x,y.leftPoint.y,y.lz),b).normalize(),i=t.distanceTo(l),r=(new We.Vector3).subVectors(h.leftPoint,h.rightPoint).length(),n=(new We.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 We.Vector3).subVectors(p,f).normalize().multiplyScalar(null!==(r=h.eavesLength)&&void 0!==r?r:0),x=(new We.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 We.Vector3(-c,0,0),S=new We.Vector3(0,c/2,0);return Object(pf.jsxs)(pf.Fragment,{children:[A.map((function(e,t){return Object(pf.jsx)(n.a.Fragment,{children:i?T?Object(pf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}):Object(pf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d}):Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}),Object(pf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d,offset:P})]})},t)})),Object(pf.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 We.Vector3(0,0,l),c=1===t.length,s=Object(h.a)(t);try{for(s.s();!(i=s.n()).done;){var d=i.value,f=Object(u.a)(d.points,4),p=f[0],y=f[1],g=f[2],m=f[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(pf.jsx)(Jl.a,{points:r,lineWidth:a,color:o}),A=Object(pf.jsx)(Jl.a,{points:[x,v],lineWidth:a,color:o});return Object(pf.jsxs)(pf.Fragment,{children:[b,!w&&!c&&A,Object(pf.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(pf.jsxs)("group",{children:[Object(pf.jsx)(Jl.a,{points:[i,i.clone().add(n)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[r,r.clone().add(n)],lineWidth:a,color:o}),c&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[s,s.clone().add(n)],lineWidth:a,color:o}),Object(pf.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,H=t.lineWidth,j=void 0===H?.2:H,z=t.roofStructure,R=t.rafterSpacing,D=void 0===R?2:R,W=t.rafterWidth,M=void 0===W?.1:W,I=t.rafterColor,C=void 0===I?"white":I,F=t.glassTint,k=void 0===F?"#73D8FF":F,O=t.opacity,Y=void 0===O?.5:O,L=t.ceiling,N=void 0!==L&&L,U=Xw(si),E=Xw(Kc),J=_f(a),G=Zm.getWireframetStyle(S,j,J,T),B=Object(u.a)(G,2);S=B[0],j=B[1];var q=Object(Se.f)(),Q=q.gl,Z=q.camera,_=Object(r.useMemo)((function(){return new We.Raycaster}),[]),$=Object(r.useMemo)((function(){return new We.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(h.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 We.Vector2(e.cx,e.cy),o=(new We.Vector3).addVectors(t.leftPoint,t.rightPoint).divideScalar(2),i=(new We.Vector3).subVectors(t.leftPoint,t.rightPoint).length(),r=new We.Vector2(o.x,o.y).rotateAround(wh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new We.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 We.Vector3;var a=(new We.Vector3).subVectors(e.leftPoint,e.rightPoint).length(),o=(new We.Vector3).addVectors(e.leftPoint,e.rightPoint).divideScalar(2),i=new We.Euler(0,0,e.relativeAngle),r=new We.Vector3(t*a,0,0),n=l*d+je;return new We.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=Up(n[0],i),He=Ep(Pe,d,!0),je=He.highestWallHeight,ze=He.topZ;Xp(t,je);var Re=Object(r.useMemo)((function(){if(null===Pe||4!==Pe.length)return new We.Vector3;var e=Pe.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Ww.calculatePolygonCentroid(e);return new We.Vector3(t.x,t.y,ze)}),[Pe,ze]),De=Object(r.useMemo)((function(){if(null===Pe)return new We.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]),Me=Object(r.useMemo)((function(){if(null===Pe)return new We.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 We.Vector3((De.x+Me.x)/2,(De.y+Me.y)/2,ze)}),[De,Me]),Ce=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):null}),[Pe]),Fe=Object(r.useMemo)((function(){return xh.clone().multiplyScalar(y)}),[y]),ke=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),H=x.clone().add(w),j=v.clone().add(y),z=b.clone().add(y),R=b.clone().add(m),D=A.clone().add(m),W=we(n,0),M=W.lh,I=W.rh,C=we(n,2),F=C.lh,k=C.rh,O=Zm.getDistance(x,v,A),Y=Math.min((null!==(t=d.eavesLength)&&void 0!==t?t:0)/O*(ze-M),M),L=Zm.getDistance(x,v,b),N=Math.min((null!==(l=d.eavesLength)&&void 0!==l?l:0)/L*(ze-I),I),U=Zm.getDistance(b,A,v),E=Math.min((null!==(a=f.eavesLength)&&void 0!==a?a:0)/U*(ze-I),F),V=Zm.getDistance(b,A,x),J=Math.min((null!==(o=f.eavesLength)&&void 0!==o?o:0)/V*(ze-M),k),G=Zm.getIntersectionPoint(S,H,T,P).setZ(M-Y).sub(Re),X=Zm.getIntersectionPoint(T,P,j,z).setZ(I-N).sub(Re),B=Zm.getIntersectionPoint(j,z,R,D).setZ(ze+E).sub(Re),K=Zm.getIntersectionPoint(R,D,S,H).setZ(ze+J).sub(Re);i.push(G,X,B,K),i.push(G.clone().add(Fe),X.clone().add(Fe),B.clone().add(Fe),K.clone().add(Fe));var q=(new We.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=Zm.getIntersectionPoint(De,Me,ue.clone(),fe.clone()).setZ(De.z).sub(Re),ve=Zm.getIntersectionPoint(De,Me,he.clone(),pe.clone()).setZ(Me.z).sub(Re),be=[],Ae=we(Pe,0),Te=Ae.lh,Se=Ae.rh,He=Zm.getDistance(te.leftPoint,te.rightPoint,De),je=Math.min((null!==(Q=te.eavesLength)&&void 0!==Q?Q:0)/He*(De.z-Te),Te),ke=Zm.getDistance(te.leftPoint,te.rightPoint,Me),Oe=Math.min((null!==(Z=te.eavesLength)&&void 0!==Z?Z:0)/ke*(Me.z-Se),Se),Ye=Zm.getIntersectionPoint(ue,fe,se,de).setZ(Te-je).sub(Re),Le=Zm.getIntersectionPoint(se,de,he,pe).setZ(Se-Oe).sub(Re);be.push(Ye,Le,ve,me),be.push(Ye.clone().add(Fe),Le.clone().add(Fe),ve.clone().add(Fe),me.clone().add(Fe));var Ne=(new We.Vector3).addVectors(te.leftPoint,te.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:be,angle:-te.relativeAngle,length:Ne});var Ue=[],Ee=we(Pe,2),Ve=Ee.lh,Je=Ee.rh,Ge=Zm.getDistance(le.leftPoint,le.rightPoint,Me),Xe=Math.min((null!==(_=le.eavesLength)&&void 0!==_?_:0)/Ge*(Me.z-Ve),Ve),Be=Zm.getDistance(le.leftPoint,le.rightPoint,De),Ke=Math.min((null!==($=le.eavesLength)&&void 0!==$?$:0)/Be*(De.z-Je),Je),qe=Zm.getIntersectionPoint(he,pe,ye,ge).setZ(Ve-Xe).sub(Re),Qe=Zm.getIntersectionPoint(ye,ge,ue,fe).setZ(Je-Ke).sub(Re);Ue.push(qe,Qe,me,ve),Ue.push(qe.clone().add(Fe),Qe.clone().add(Fe),me.clone().add(Fe),ve.clone().add(Fe));var Ze=(new We.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,Me,ze,y]),Oe=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||E(a,!1,!1,!0)}),[Pe]);var Ye=Bp();Object(r.useEffect)((function(){if(4===(null===Pe||void 0===Pe?void 0:Pe.length)){var e=Xw.getState().addedRoofId;(e&&e===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),f=Te(e,t,l,o);U((function(o){var r,n=Object(h.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(f.has(c.id)){var A=f.get(c.id);if(A){var T=c,P=A.left,S=A.right,H=A.center;if(T.roofId=a,T.leftRoofHeight=P,T.rightRoofHeight=S,H){var j=Object(u.a)(H,2),z=j[0],R=j[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),zp(l,a,ke,Re,ze,y),Xw.getState().setAddedRoofId(null))}}),[ke]),Kp(l,a,ke,Re,ze,y);Jp(a,Re,ke,!1,It.Gable),Gp((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 We.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 We.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push([o[0],o[1],Me.clone(),De.clone()]),e.push([o[2],o[3],De.clone(),Me.clone()])}Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}}));var Le=Xw((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),qf.a),Ne=Xw(os),Ue=bf(Us),Ee=Xw(o.solarRadiationHeatmapMaxValue),Ve=Af(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=ke.length;if(e>0){for(var t=[],l=0;l0&&Object(pf.jsx)(Ah,{roofSegments:ke,thickness:y,lineColor:S,lineWidth:z===Ct.Rafter?.1:j})]}),N&&d>0&&Pe[0].lz===Pe[2].lz&&Oe&&Object(pf.jsx)(Kf,{cz:Pe[0].lz,points:Oe}),z===Ct.Rafter&&Pe&&4===Pe.length&&Object(pf.jsx)("group",{onContextMenu:function(e){Mp(e,a)},onPointerDown:function(e){Pp(e,a,i)},children:Object(pf.jsx)(bh,{ridgeLeftPoint:De,ridgeRightPoint:Me,wallArray:Pe,overhang:0,isShed:ce,height:y,spacing:D,color:C,width:M})}),J&&!T&&Object(pf.jsxs)("group",{position:[0,0,y],children:[Object(pf.jsx)(Ip,{position:[Ie.x,Ie.y,Ie.z+.15],onPointerDown:function(e){if(Ne(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),Nt.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(pf.jsx)(Ip,{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 We.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),Nt.getState().setEnableOrbitController(!1)}}),Object(pf.jsx)(Ip,{position:[Me.x,Me.y,Me.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(Me.x,Me.y,ze),l&&Pe&&Pe[1]){var e=(new We.Vector3).subVectors(Me,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),Nt.getState().setEnableOrbitController(!1)}})]}),le&&Object(pf.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-je):r.z-l.lz-.3-je;var v=Te(Pe,je+x,g,m);ch(v,i)&&Xw.getState().updateRoofRiseById(a,x,ze+t.thickness)}}}},onPointerUp:function(){switch(re){case ge.Mid:Sp(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)}};Xw.getState().addUndoable(i)}(a,de.current,ue.current,g[0],m[0])}he.current=!1,ae(!1),ne(ge.Null),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.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,f=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=Xw.getState().world,P=(Xw(Zr),Xw(tn)),S=bf(Us),H=bf(Es),j=Xw(o.heatFluxScaleFactor),z=Xw(o.heatFluxColor),R=Xw(o.heatFluxWidth),D=Af(Ri),W=Af.getState().hourlyHeatExchangeArrayMap,M=Yp(x===Ct.Rafter?he.NoTexture:d),I=Lp(x===Ct.Rafter,b),C=I.transparent,F=I.opacity,k=Object(Se.f)().invalidate,O=Object(r.useRef)(null),Y=Object(r.useRef)(null),L=Object(r.useRef)(null),N=Object(r.useRef)(null),U=Object(r.useRef)(0),E=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(H){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 We.Vector3(0,0,c+.1),d=Object(h.a)(e.values());try{for(d.s();!(t=d.n()).done;){var f=t.value,p=[];p.push(f[0].clone().sub(i).add(s)),p.push(f[1].clone().sub(i).add(s)),o.push(p),(p=[]).push(f[0].clone().sub(i).add(s)),p.push(f[3].clone().sub(i).add(s)),o.push(p),(p=[]).push(f[1].clone().sub(i).add(s)),p.push(f[2].clone().sub(i).add(s)),o.push(p)}}catch(y){d.e(y)}finally{d.f()}return o}}}),[H]),ae=Object(r.useMemo)((function(){var e;if(H&&(!w||!w.notBuilding)){var o=W.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),f=n[t].map((function(e){return e.clone().sub(i).add(new We.Vector3(0,0,d))}));if(f){var p=Ww.getTriangleArea(f[0],f[1],f[2])+Ww.getTriangleArea(f[2],f[3],f[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 Zm.onSegment(g[t],e.cx,a)}))),y&&y.length>0){var m,x=Object(h.a)(y);try{for(x.s();!(m=x.n()).done;){var v=m.value;p-=Ww.getWindowArea(v)}}catch(ne){x.e(ne)}finally{x.f()}}var b=4*(null!==(e=T.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=f[0].clone(),S=f[1].clone(),z=f[2].clone(),R=(new We.Vector3).subVectors(S,A),M=(new We.Vector3).subVectors(z,A),I=(new We.Vector3).subVectors(z,S),C=R.length(),F=(new We.Vector3).crossVectors(M,I).length()/C,k=Math.max(2,Math.round(C/b)),O=Math.max(2,Math.round(F/b));R.normalize(),M.normalize(),I.normalize();var Y=(new We.Vector3).crossVectors(M,I).normalize(),L=R.multiplyScalar(.5*C/k),N=(new We.Vector3).crossVectors(Y,R).normalize().multiplyScalar(.5*F/O),G=A.clone().add(L).add(N);L.multiplyScalar(2),N.multiplyScalar(2);var X=r/p*(null!==j&&void 0!==j?j:_e);U.current=X<0?1:0,E.current=Y.clone().multiplyScalar(.1),J.current=Ww.getEuler(Rt,Y,"YXZ",-Math.sign(X)*vt);for(var B,K=[],q=new We.Vector3,Q=0;Q0){var $,ee=q.x+i.x,te=q.y+i.y,le=Object(h.a)(y);try{for(le.s();!($=le.n()).done;){var ae=$.value,oe=Zm.getRelativeWindowVerticesOnRoof(ae),ie=Ww.getPoints(oe);if(Ww.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}}}}}}),[H,j,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(O.current){var n=O.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 We.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 We.Float32BufferAttribute(h,2))}}if(Y.current){Y.current.geometry=new Ne(a,c,s);var p=te(t,i)&&te(l,o);if(ee(p),x===Ct.Glass&&p){var y=Ww.calculatePolygonCentroid(a.map(Ww.mapVector3ToPoint2)),g=new We.Vector3(y.x,y.y,0),w=.25,v=(new We.Vector3).addVectors(t,g.clone().sub(t).setZ(0).normalize().multiplyScalar(w)),b=(new We.Vector3).addVectors(l,g.clone().sub(l).setZ(0).normalize().multiplyScalar(w)),A=(new We.Vector3).addVectors(o,g.clone().sub(o).normalize().multiplyScalar(w)),T=(new We.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 We.Mesh(new Ne(P)),H=vf.a.subtract(Y.current,S);if(Y.current.geometry=H.geometry,function(e){return Math.abs(e)0&&x===Ct.Rafter||x!==Ct.Rafter)&&Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(Gf,{id:l,index:t,segment:oe,color:ie,sideColor:null!==g&&void 0!==g?g:"white",texture:M,heatmap:f[t],transparent:C,opacity:F,windows:A,centroid:i})}),le&&le.map((function(e,t){return Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:E.current?e[U.current].clone().add(E.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==z&&void 0!==z?z:$e})})]},t)}))]})},Sh=n.a.memo(Th,Fp),Hh=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 We.Vector3(0,0,l),n=0;n3&&void 0!==arguments[3]&&arguments[3];I((function(o){var i,r=Object(h.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(je),l.clone().add(je),a.clone().add(je)),o&&e.push(o.clone().add(je))},be=Object(r.useMemo)((function(){if(null===F||4!==F.length)return new We.Vector2;var e=function(e){var t,l=[],a=Object(h.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}(F),t=Ww.calculatePolygonCentroid(e);return new We.Vector2(t.x,t.y)}),[F]),Ae=Object(r.useMemo)((function(){var e=new We.Vector3,t=new We.Vector3(be.x,be.y,ie),l=M(d[0]);return l&&e.setX(-Z).applyEuler(new We.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,Z]),Te=Object(r.useMemo)((function(){var e=new We.Vector3,t=new We.Vector3(be.x,be.y,ie),l=M(d[0]);return l&&e.setX(te).applyEuler(new We.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,te]),Pe=Object(r.useMemo)((function(){return new We.Vector3(be.x,be.y,ie)}),[be,ie]),He=Object(r.useMemo)((function(){return null===F||4!==F.length?[]:F.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)}))}),[F]),je=Object(r.useMemo)((function(){return Rh.clone().multiplyScalar(b)}),[b]),ze=Object(r.useMemo)((function(){return null===F||4!==F.length?null:F.map((function(e,t){return{leftPoint:e.leftPoint.clone().add(He[t]),rightPoint:e.rightPoint.clone().add(He[t])}}))}),[F,He]),Re=Object(r.useMemo)((function(){var e=[];if(null===F||4!==F.length||null===ze)return e;for(var t=function(){if(null===F||4!==F.length)return 0;for(var e=F.map((function(e){return e.leftPoint})),t=[Ae,Te,Te,Ae],l=1/0,a=0;a<4;a++){var o,i,r=F[a],n=Zm.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=Zm.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=F[l],i=Zm.getComposedWallHeight(F,l),r=i.lh,n=i.rh,c=Zm.getIntersectionPoint(ze[(l+3)%4].leftPoint,ze[(l+3)%4].rightPoint,ze[l].leftPoint,ze[l].rightPoint).setZ(r-t).sub(Pe),s=Zm.getIntersectionPoint(ze[l].leftPoint,ze[l].rightPoint,ze[(l+1)%4].leftPoint,ze[(l+1)%4].rightPoint).setZ(n-t).sub(Pe),d=(new We.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}),[F,Ae,Te,ie,b]),De=Object(r.useMemo)((function(){return F&&4===F.length?F.map((function(e){return e.leftPoint})):null}),[F]);Object(r.useEffect)((function(){if(null===F||4!==F.length)C(a,!1,!1,!0);else{var e=Xw.getState().addedRoofId;if(e&&e===a){for(var t=function(e){var t=new Set(F[e].wallsId);I((function(e){var l,o=Object(h.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()}}))},l=0;l0){var e=Re.length;if(e>0){for(var t=[],o=0;o0&&l){var d,u=new We.Euler(0,0,l.rotation[2],"ZYX"),f=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(h.a)(s);try{for(m.s();!(d=m.n()).done;){var w,x=d.value,v=Object(h.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(pf.jsx)(Kf,{cz:F[0].lz,points:De}),O&&!A&&Object(pf.jsxs)("group",{position:[0,0,b+.15],children:[Object(pf.jsx)(Ip,{position:[Ae.x,Ae.y,Ae.z],onPointerDown:function(){if(fe.current=!0,U(!0),jh.set(Ae.x,Ae.y,ie),l&&F[0]){var e=Xw.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=F[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Left),Nt.getState().setEnableOrbitController(!1)}}),Object(pf.jsx)(Ip,{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),jh.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),Nt.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(pf.jsx)(Ip,{position:[Te.x,Te.y,Te.z],onPointerDown:function(){if(fe.current=!0,U(!0),jh.set(Te.x,Te.y,ie),l&&F[0]){var e=Xw.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=F[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Right),Nt.getState().setEnableOrbitController(!1)}})]}),N&&Object(pf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:re,args:[1e3,100],visible:!1,position:jh,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=F[0],n=(new We.Vector3).subVectors(r.rightPoint,r.leftPoint).length();switch(G){case ge.Left:var c=Pe.clone().sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),s=i.clone().sub(new We.Vector3(l.cx,l.cy,l.cz)).applyEuler(new We.Euler(0,0,-l.rotation[2])).sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),d=(new We.Vector3).subVectors(s,c).x;_(Ww.clamp(-d,.1-te,n/2-.01));break;case ge.Right:var u=Pe.clone().sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),f=i.clone().sub(new We.Vector3(l.cx,l.cy,l.cz)).applyEuler(new We.Euler(0,0,-l.rotation[2])).sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),h=(new We.Vector3).subVectors(f,u).x;le(Ww.clamp(h,.1-Z,n/2-.01));break;case ge.Mid:var p=Math.max(0,i.z-l.lz-.3-oe);Xw.getState().updateRoofRiseById(a,p,ie+t.thickness)}}}},onPointerUp:function(){switch(G){case ge.Mid:Sp(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)}};Xw.getState().addUndoable(i)}(a,f,p,Z,te)}fe.current=!1,U(!1),B(ge.Null),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:.5})})]})},Wh=n.a.memo(Dh,Fp),Mh=new We.Vector3,Ih=new We.Euler,Ch=new We.Vector3(0,0,1),Fh=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(pf.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(pf.jsxs)(pf.Fragment,{children:[!d&&Object(pf.jsx)(Jl.a,{points:c,lineWidth:a,color:o}),s,Object(pf.jsx)("group",{position:[0,0,l],children:s}),t.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[!d&&Object(pf.jsx)(Jl.a,{points:[e.points[7],e.points[4]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[e.points[4],e.points[0]],lineWidth:a,color:o})]},t)}))]})})),kh=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,H=t.roofType,j=t.foundationId,z=t.ridgeWidth,R=void 0===z?1:z,D=t.rise,W=void 0===D?d:D,M=t.ceiling,I=void 0!==M&&M,C=t.frontRidge,F=t.backRidge,k=Yp(p),O=_f(a),Y=Zm.getWireframetStyle(T,S,O,b),L=Object(u.a)(Y,2);T=L[0],S=L[1];var N=Xw(si),U=Xw(Kc),E=Xw(o.shadowEnabled),J=Xw((function(e){return e.ray})),G=Xw((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)(W),we=Object(r.useRef)(null),xe=Object(r.useRef)(!1),ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=W<.01,Pe=function(e,t){N((function(l){var a,o=Object(h.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()}}))},He=Np(j,a,i),je=He.currentWallArray,ze=He.isLoopRef,Re=Vp(je,W),De=Re.highestWallHeight,Me=Re.topZ;Xp(t,De);var Ie=Object(r.useMemo)((function(){if(je.length<2)return new We.Vector3;var e=function(e){var t,l=[],a=e.length,o=Object(h.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}(je),t=Ww.calculatePolygonCentroid(e);return Number.isNaN(t.x)||Number.isNaN(t.y)?new We.Vector3:new We.Vector3(t.x,t.y,Me)}),[je,Me]),Ce=Object(r.useMemo)((function(){var e=je.map((function(e){var t;return Zm.getWallNormal(e).multiplyScalar(null!==(t=e.eavesLength)&&void 0!==t?t:0)}));if(!ze.current&&0!==e.length){var t=(new We.Vector3).subVectors(new We.Vector3(je[je.length-1].rightPoint[0],je[je.length-1].rightPoint[1]),new We.Vector3(je[0].leftPoint[0],je[0].leftPoint[1])).applyEuler(Wt).normalize().multiplyScalar(.3);e.push(t)}return e}),[je]),Fe=Object(r.useMemo)((function(){var e=je.map((function(e,t){return{leftPoint:new We.Vector3(e.leftPoint[0],e.leftPoint[1]).add(Ce[t]),rightPoint:new We.Vector3(e.rightPoint[0],e.rightPoint[1]).add(Ce[t])}}));return ze.current||0===e.length||e.push({leftPoint:new We.Vector3(je[je.length-1].rightPoint[0],je[je.length-1].rightPoint[1]).add(Ce[Ce.length-1]),rightPoint:new We.Vector3(je[0].leftPoint[0],je[0].leftPoint[1]).add(Ce[Ce.length-1])}),e}),[je,Ce]),ke=Object(r.useMemo)((function(){var e=je.map((function(e,t){var l=new We.Vector3(e.leftPoint[0],e.leftPoint[1]),a=new We.Vector3(e.rightPoint[0],e.rightPoint[1]),o=(new We.Vector3).subVectors(Ie,l).setZ(0).normalize().multiplyScalar(Q),i=(new We.Vector3).subVectors(Ie,a).setZ(0).normalize().multiplyScalar(Q);return l.add(o).setZ(Me),a.add(i).setZ(Me),{leftPoint:l,rightPoint:a}}));return ze.current||0===e.length||e.push({leftPoint:e[e.length-1].rightPoint,rightPoint:e[0].leftPoint}),e}),[je,Ie,Q]),Oe=Object(r.useMemo)((function(){return Ch.clone().multiplyScalar(v)}),[v]),Ye=Object(r.useMemo)((function(){var e=[];if(je.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=Zm.getWallHeight(je,l),r=i.lh,n=i.rh;ze.current||(0===l&&(r=je[0].lz),l===je.length-1&&(n=je[je.length-1].lz));var c=Zm.getIntersectionPoint(Fe[(l+Fe.length-1)%Fe.length].leftPoint,Fe[(l+Fe.length-1)%Fe.length].rightPoint,Fe[l].leftPoint,Fe[l].rightPoint).setZ(r-t).sub(Ie),s=Zm.getIntersectionPoint(Fe[l].leftPoint,Fe[l].rightPoint,Fe[(l+1)%Fe.length].leftPoint,Fe[(l+1)%Fe.length].rightPoint).setZ(n-t).sub(Ie),d=ke[l].leftPoint.clone().sub(Ie),u=ke[l].rightPoint.clone().sub(Ie),f=new We.Vector3(a.cx,a.cy).sub(Ie.clone().setZ(0)).length();o.push(c,s,u,d),o.push(c.clone().add(Oe),s.clone().add(Oe),u.clone().add(Oe),d.clone().add(Oe)),e.push({points:o,angle:-a.relativeAngle,length:f})}}if(!ze.current){var h=Fe.length-1,p=Zm.getIntersectionPoint(Fe[h-1].leftPoint,Fe[h-1].rightPoint,Fe[h].leftPoint,Fe[h].rightPoint).setZ(je[je.length-1].lz-t).sub(Ie),y=Zm.getIntersectionPoint(Fe[h].leftPoint,Fe[h].rightPoint,Fe[0].leftPoint,Fe[0].rightPoint).setZ(je[0].lz-t).sub(Ie),g=ke[h].leftPoint.clone().sub(Ie),m=ke[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 We.Vector3).addVectors(p,y).setZ(0).divideScalar(2).length(),v=[];v.push(p,y,m,g),v.push(p.clone().add(Oe),y.clone().add(Oe),m.clone().add(Oe),g.clone().add(Oe)),e.push({points:v,angle:-w,length:x})}return e}),[je,Me,Q,v]),Le=Object(r.useMemo)((function(){var e=new We.Shape;if(ke.length>0){var t=ke[0].leftPoint.clone().sub(Ie);e.moveTo(t.x,t.y);var l,a=Object(h.a)(ke);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}),[je,ke]),Ne=Object(r.useMemo)((function(){var e=[];if(0===je.length)return e;e.push((new We.Vector3).fromArray(je[0].leftPoint));var t,l=Object(h.a)(je);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new We.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[je]);Object(r.useEffect)((function(){R!==Q&&Z(R)}),[R]),Object(r.useEffect)((function(){if(je.length>1){if(Xw.getState().addedRoofId===a){for(var e=function(e){N((function(t){var l,o=Object(h.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===je[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=Zm.getWallHeight(je,t),i=o.lh,r=o.rh;ze.current||(0===t&&(i=je[0].lz),t===je.length-1&&(r=je[je.length-1].lz));var n=new We.Vector3(l.leftPoint[0],l.leftPoint[1],i),c=new We.Vector3(l.rightPoint[0],l.rightPoint[1],r),s=ke[t].leftPoint.clone(),d=ke[t].rightPoint.clone();e.push([n,c,d,s])}}if(!ze.current){var u=je.length-1,f=je[0],p=je[u],y=new We.Vector3(p.rightPoint[0],p.rightPoint[1],p.lz),g=new We.Vector3(f.leftPoint[0],f.leftPoint[1],f.lz),m=ke[u].leftPoint.clone(),w=ke[u].rightPoint.clone();e.push([y,g,w,m])}var x=ke.map((function(e){return e.leftPoint.clone()}));if(e.push(x),Te){var v,b=[],A=Object(h.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()}Af.getState().setRoofSegmentVerticesWithoutOverhang(a,[b])}else Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ee=Xw.getState().world,Ve=Xw(os),Je=bf(Us),Ge=Xw(o.solarRadiationHeatmapMaxValue),Xe=Af(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=bf(Es),st=Xw(o.heatFluxScaleFactor),dt=Xw(o.heatFluxColor),ut=Xw(o.heatFluxWidth),ft=Af(Ri),ht=Af.getState().hourlyHeatExchangeArrayMap,pt=Object(r.useRef)(null),yt=Object(r.useRef)(0),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Lp(),xt=wt.transparent,At=wt.opacity;Object(r.useEffect)((function(){if(Je)if(Te){var e=Xe(a);if(e){var t=Ww.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new We.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(h.a)(o);try{for(u.s();!(i=u.n()).done;){var f,p=i.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.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(pf.jsx)(Fh,{roofSegments:Ye,thickness:v,lineColor:T,lineWidth:S})]})}),I&&W>0&&Object(pf.jsx)(Kf,{points:Ne,cz:je[0].lz}),O&&!b&&Object(pf.jsxs)("group",{position:[Ie.x,Ie.y,Ie.z+v],children:[Object(pf.jsx)(Ip,{position:[0,0,.3],onPointerDown:function(e){if(Ve(t.id,e,X.Select),xe.current=!0,me.current=W,ie(!0),Mh.set(Ie.x,Ie.y,Me),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),Nt.getState().setEnableOrbitController(!1),N((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=Me+t.thickness}))},onPointerOver:function(){N((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=Me+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),ke.map((function(e,t){var l=e.leftPoint.clone().sub(Ie);return Object(pf.jsx)(Ip,{position:[l.x,l.y,0],onPointerDown:function(){xe.current=!0,ie(!0),Mh.set(l.x,l.y,Me+.15),Ih.set(0,0,0),se(ge.Ridge),pe(t),te(je.reduce((function(e,t){return Math.min(e,new We.Vector3(t.leftPoint[0],t.leftPoint[1],Me).distanceTo(Ie)-1)}),1/0)),Nt.getState().setEnableOrbitController(!1),ye.current=Q}},t)}))]}),oe&&Object(pf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:we,args:[1e3,100],visible:!1,position:Mh,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);Xw.getState().updateRoofRiseById(a,r,Me+t.thickness);break;case ge.Ridge:if(l&&null!==fe){var n=i.clone().applyEuler(new We.Euler(0,0,l.rotation[2])).sub(new We.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(Nh.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&&e.intersections[0].eventObject===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(Xw.getState().groupActionMode?(Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===m}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=m,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(m)})),e.stopPropagation()):Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().isAddingElement()||Xw.getState().selectMe(g,e,X.Select,!0))},children:[Object(pf.jsx)(Lt.e,{name:"Body Extrude Mesh",args:[H,{steps:1,depth:T,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{color:s,map:P})}),Object(pf.jsx)(Jl.a,{position:[v,0,0],points:D,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[-v,0,0],points:D,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[0,0,T],points:R,color:"black",lineWidth:.2}),Object(pf.jsx)(Lt.e,{name:"Copings Extrude Mesh",position:[0,0,T],args:[j,{steps:1,depth:y,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{color:s})}),Object(pf.jsx)(Jl.a,{position:[0,0,T+y],points:z,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[0,0,T],points:z,color:"black",lineWidth:.2})]}):null};function hp(e){var t=(e.ly+e.copingsWidth)/2,l=(e.ly-e.copingsWidth)/2;return{innerPoints:pp(e,t),outerPoints:pp(e,l)}}function pp(e,t){var l=e.leftPoint,a=e.rightPoint,o=(new We.Vector3).fromArray(l),i=(new We.Vector3).fromArray(a),r=(new We.Vector3).subVectors(i,o).applyEuler(new We.Euler(0,0,vt)).normalize().clone().multiplyScalar(t);return{leftPoint:o.clone().add(r),rightPoint:i.clone().add(r)}}function yp(e,t){return Math.abs(e[0]-t[0])0&&void 0!==arguments[0]?arguments[0]:.3,l=Xw((function(e){return e.viewState.orthographic})),a=Xw((function(e){return e.viewState.cameraPosition})),o=Xw((function(e){return e.viewState.cameraZoom}));if(l)e=Math.max(t,15/o);else{var i=Xw.getState().viewState.panCenter,r=Object(ep.a)(We.Vector3,Object(f.a)(i)),n=Object(ep.a)(We.Vector3,Object(f.a)(a)),c=n.distanceTo(r);e=Math.max(t,c/100)}return e},xp=function(e,t){var l=Object(r.useMemo)((function(){return new We.TextureLoader}),[]);return Object(r.useMemo)((function(){var a;switch(e){case ue.Default:a=tp;break;case ue.NoTexture:a=Tf;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=Tf}return t===Ee.Stud&&(a=Tf),l.load(a,(function(t){t.wrapS=t.wrapT=We.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])},vp=function(e){var t=Object(r.useRef)(!0);bf((function(e){return e.foundationMovedFlag}));var l=e;if(!t.current){var a=Xw.getState().elements.find((function(t){return t.id===e.id&&t.type===V.Foundation}));a&&(l=a)}return t.current=!1,l},bp=function(){function e(){Object(je.a)(this,e)}return Object(ke.a)(e,null,[{key:"addUndoableMove",value:function(){var e=Xw.getState().selectedElement;if(e){var t=Xw.getState().getElementById(e.id),l=bf.getState().oldParentId,a=bf.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 We.Vector3).fromArray(e.normal),newNormal:(new We.Vector3).fromArray(t.normal),oldRotation:Object(f.a)(e.rotation),newRotation:Object(f.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)}};Xw.getState().addUndoable(r);var n=function(e,t,l,a,o,i,r,n,c){Xw.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(f.a)(c)}else{var u=Object(f.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(f.a)(r)),n&&(d.normal=[n.x,n.y,n.z]),d.type===V.Window)){var h=s.elements.find((function(e){return e.id===l})),p=s.elements.find((function(e){return e.id===a}));if(!h||!p)return;var y=d.lx*p.lx,g=d.lz*p.lz;d.lx=y/h.lx,d.lz=g/h.lz}}}))}}}}},{key:"undoInvalidOperation",value:function(){Xw.getState().set((function(e){if(e.selectedElement)for(var t=0;t0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Xw.getState().set((function(e){if(e.groupActionMode){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===l?i.selected=!0:i.selected=!1}}catch(s){o.e(s)}finally{o.f()}e.groupMasterId=l,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(l)}else{var r,n=Object(h.a)(e.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===t?(c.selected=!0,e.selectedElement=c,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):c.selected=!1}}catch(s){n.e(s)}finally{n.f()}}})))},Sp=function(e,t,l){var a={name:"Resize Roof Rise",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldRise:t,newRise:l,undo:function(){Xw.getState().updateRoofRiseById(a.resizedElementId,a.oldRise,0)},redo:function(){Xw.getState().updateRoofRiseById(a.resizedElementId,a.newRise,0)}};Xw.getState().addUndoable(a)},Hp=function(e,t){var l={lng:Xw.getState().language};return!!Zm.rooftopElementBoundaryCheck(e,t)||(Xw.getState().moveHandleType||Xw.getState().viewState.orthographic?Qh(me.t("message.MoveOutsideBoundaryCancelled",l)):Xw.getState().resizeHandleType?Qh(me.t("message.ResizingOutsideBoundaryCancelled",l)):Xw.getState().rotateHandleType&&Qh(me.t("message.RotationOutsideBoundaryCancelled",l)),!1)},jp=function(e,t,l){var a={lng:Xw.getState().language};return!!Zm.rooftopSPCollisionCheck(e,t,l)||(Xw.getState().moveHandleType||Xw.getState().viewState.orthographic?Qh(me.t("message.MoveCancelledBecauseOfOverlap",a)):Xw.getState().resizeHandleType?Qh(me.t("message.ResizingCancelledBecauseOfOverlap",a)):Xw.getState().rotateHandleType&&Qh(me.t("message.RotationCancelledBecauseOfOverlap",a)),!1)},zp=function(e,t,l,a,o,i,r){null!==e&&Xw.getState().set((function(n){if(null!==e){var c,s=Object(h.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 We.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),p=Zm.computeState(l,u,r),y=p.segmentVertices,g=p.normal,m=p.rotation,w=void 0;w=y?Zm.getRooftopElementZ(y,u,o+i):o+i,g&&m&&void 0!==w&&(d.normal=g.toArray(),d.rotation=Object(f.a)(m),d.cz=w)}else if(d.type===V.Window){var x=new We.Vector3(d.cx,d.cy,d.cz+e.lz).clone().sub(a),v=Zm.computeState(l,x,r),b=v.segmentVertices,A=v.normal,T=v.rotation,P=void 0;P=b?Zm.getRooftopElementZ(b,x,o+i):o+i,A&&T&&void 0!==P&&(d.rotation=Object(f.a)(T),d.cz=P)}else if(d.type===V.Sensor||d.type===V.Light){var S=new We.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),H=Zm.computeState(l,S,r),j=H.segmentVertices,z=H.normal,R=H.rotation,D=void 0;D=j?Zm.getRooftopElementZ(j,S,o+i):o+i,z&&R&&void 0!==D&&(d.normal=z.toArray(),d.rotation=Object(f.a)(R),d.cz=D)}}}catch(W){s.e(W)}finally{s.f()}}}))},Rp=function(e,t,l,a,o){e.intersections[0].eventObject.name!==e.eventObject.name||(Pp(e,l,t),Tp(e,t,l,a,o))},Dp=function(e,t){var l=Xw.getState().selectedElement;if(l&&Zm.isValidOnRoof(l)){var a=Xw.getState().getElementById(l.id);if(a&&Xw.getState().moveHandleType)if(e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")}))[0].eventObject.userData.roofId===t.id&&a.foundationId){var o=Xw.getState().getElementById(a.foundationId);if(o)switch(a.type){case V.SolarPanel:var i=a,r=Zm.getRoofBoundaryVertices(t),n=Zm.getSolarPanelVerticesOnRoof(i,o);Hp(n,r)&&jp(i,o,n)?bp.addUndoableMove():bp.undoInvalidOperation();break;case V.Sensor:case V.Light:bp.addUndoableMove()}}Xw.getState().set((function(e){e.moveHandleType=null}))}},Wp=function(e,t){var l=Xw.getState().getSelectedElement();if(l&&Zm.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(Xw.getState().moveHandleType){var a=e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")||e.eventObject.name.includes(bp.WALL_OUTSIDE_SURFACE_MESH_NAME)}));a[0].eventObject.userData.roofId===t&&Xw.getState().set((function(e){var t,o=Object(h.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 We.Vector3).subVectors(u,new We.Vector3(c.cx,c.cy)).applyEuler(new We.Euler(0,0,-c.rotation[2])),y=p.clone().sub(s),g=Zm.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(f.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),bf.getState().setPrimitiveStore("showWallIntersectionPlaneId",null)}break}}}catch(x){o.e(x)}finally{o.f()}}))}}},Mp=function(e,t){e.intersections.length>0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Xw.getState().set((function(l){l.contextMenuObjectType=V.Roof,l.pastePoint.copy(e.intersections[0].point);var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===t?(i.selected=!0,l.selectedElement=i,l.multiSelectionsMode?l.selectedElementIdSet.has(t)?l.selectedElementIdSet.delete(t):l.selectedElementIdSet.add(t):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t))):i.selected=!1}}catch(r){o.e(r)}finally{o.f()}})))},Ip=function(e){var t=e.position,l=e.onPointerDown,a=e.onPointerUp,o=e.onPointerOver,i=Xw(si),n=wp(),c=Object(Se.f)().gl,s=Object(r.useRef)(!1),d=Object(r.useRef)(!1),f=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&&(f.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(h.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(pf.jsx)(Lt.h,{name:"Roof Handle",ref:p,args:[n],position:t,onPointerMove:function(e){v(e)?(f.current=!1,d.current||(d.current=!0,x(!0))):w("white")},onPointerOut:function(e){f.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:m})})},Cp=function(e){var t=e.roofModel,l=e.foundationModel,a=Xw(Kc),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(pf.jsx)(rh,{roofModel:t,foundationModel:l});case It.Gable:return Object(pf.jsx)(Sh,{roofModel:t,foundationModel:l});case It.Hip:return Object(pf.jsx)(Wh,{roofModel:t,foundationModel:l});case It.Gambrel:return Object(pf.jsx)(yh,{roofModel:t,foundationModel:l});case It.Mansard:return Object(pf.jsx)(Oh,{roofModel:t,foundationModel:l});default:return null}}()};function Fp(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 kp,Op=n.a.memo(Cp,Fp),Yp=function(e){var t=Object(r.useMemo)((function(){var t;switch(e){case he.NoTexture:t=Tf;break;case he.Texture01:t=Pf;break;case he.Texture02:t=Sf;break;case he.Texture03:t=Hf;break;case he.Texture04:t=jf;break;case he.Texture05:t=zf;break;case he.Texture06:t=Rf;break;case he.Texture07:t=Df;break;default:t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC"}return(new We.TextureLoader).load(t,(function(t){switch(t.wrapS=t.wrapT=We.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},Lp=function(e,t){var l=Xw(o.groundImage),a=Xw(o.orthographic),i=l&&a,r=i?.25:1;return{transparent:e||i,opacity:Math.min(void 0!==t?t:1,r)}},Np=function(e,t,l){var a=Xw((function(t){return t.elements.filter((function(t){return t.foundationId===e&&t.type===V.Wall}))}),qf.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(h.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;n&&(!n.roofId||n.roofId===t)&&(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]);n&&(!n.roofId||n.roofId===t)&&(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(d){a.e(d)}finally{a.f()}return[]}),[l,a]),isLoopRef:i}},Up=function(e,t){var l=Xw((function(e){return e.elements.filter((function(e){return e.foundationId===t&&e.type===V.Wall}))}),qf.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 f,p=[],y=Object(h.a)(o);try{for(y.s();!(f=y.n()).done;){var g,m=Object(u.a)(f.value,2),w=m[0],x=m[1],v=0,b=Object(h.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,H=null,j=null,z=0,R=-1,D=Object(h.a)(x);try{for(D.s();!(S=D.n()).done;){var W=S.value,M=a.get(W.leftJoints[0]),I=a.get(W.rightJoints[0]);z=Math.max(z,W.lz),R=Math.max(R,W.eavesLength),M&&M.relativeAngle.toFixed(1)!==w&&(H=W),I&&I.relativeAngle.toFixed(1)!==w&&(j=W)}}catch(C){D.e(C)}finally{D.f()}H&&j&&z>0&&-1!==R&&p.push({leftPoint:(new We.Vector3).fromArray(H.leftPoint),rightPoint:(new We.Vector3).fromArray(j.rightPoint),relativeAngle:H.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])},Ep=function(e,t,l){var a=Object(r.useMemo)((function(){return Zm.getHighestComposedWallHeight(e,l)}),[e]),o=Object(r.useMemo)((function(){return a+t}),[a,t]);return{highestWallHeight:a,topZ:o}},Vp=function(e,t,l){var a=Object(r.useMemo)((function(){return Zm.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}},Jp=function(e,t,l,a,o,i){var n=bf(Lr),c=bf(Nr),s=bf(Ir),d=function(){var r=function(e){return e.clone().add(t)},n=[];if(a)if(o===It.Gambrel)n.push(_p(l).map(r));else{var c,s=[],d=Object(h.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 f,p=Object(h.a)(l);try{for(p.s();!(f=p.n()).done;){var y=f.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 Af.getState().setRoofSegmentVertices(e,n),n};return(n||c||s)&&d(),Object(r.useEffect)((function(){d()}),[l]),d},Gp=function(e){var t=bf(Ir),l=bf(Fr);(t||l)&&e()},Xp=function(e,t){var l=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.ceiling&&void 0!==e.rise&&(e.roofType!==It.Gambrel||void 0!==e.frontRidgePoint&&void 0!==e.backRidgePoint&&void 0!==e.topRidgePoint)||Xw.getState().set((function(l){var a,o=Object(h.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;if(void 0===r.ceiling&&(r.ceiling=!1),void 0===r.rise&&(r.rise=r.lz-t,r.lz=0),r.roofType===It.Gambrel){var n=r;void 0===n.frontRidgePoint&&(n.frontRidgePoint=n.frontRidgeLeftPoint?Object(f.a)(n.frontRidgeLeftPoint):[.35,.5],n.frontRidgeLeftPoint=void 0,n.frontRidgeRightPoint=void 0),void 0===n.backRidgePoint&&(n.backRidgePoint=n.backRidgeLeftPoint?Object(f.a)(n.backRidgeLeftPoint):[-.35,.5],n.backRidgeLeftPoint=void 0,n.backRidgeRightPoint=void 0),void 0===n.topRidgePoint&&(n.topRidgePoint=n.topRidgeLeftPoint?Object(f.a)(n.topRidgeLeftPoint):[0,1],n.topRidgeLeftPoint=void 0,n.topRidgeRightPoint=void 0)}break}}}catch(c){o.e(c)}finally{o.f()}}))}),[l])},Bp=function(){var e=Object(r.useRef)(!0);return!!e.current&&(e.current=!1,!0)},Kp=function(e,t,l,a,o,i,n){var c=Xw((function(e){return e.updateElementOnRoofFlag}));Object(r.useEffect)((function(){c&&(zp(e,t,l,a,o,i,n),Xw.getState().setUpdateElementOnRoofFlag(!1))}),[o,i,c])},qp=function(e,t,l,a,o,i,n){!function(e,t,l,a,o,i,n){var c=Bp();Object(r.useEffect)((function(){c||zp(e,t,l,a,o,i,n)}),[l])}(e,t,l,a,o,i,n),Kp(e,t,l,a,o,i,n)},Qp=function(e,t,l,a){var o=vp(t);return Object(r.useMemo)((function(){return{roofId:e,foundation:o,centroid:l,roofSegments:a}}),[e,l,a,o])},Zp=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()},_p=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},$p=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 We.ExtrudeBufferGeometry(l,{steps:1,depth:a,bevelEnabled:!1}),d.current.updateMatrix(),o.length>0)){for(var f=[],h=0;h0){var n,s=Object(h.a)(C);try{for(s.s();!(n=s.n()).done;){var d=n.value,f=new We.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:Zg,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=Ef(x,v,b,w,f.x,f.y);e.holes.push(A);break;case Yt.Arched:var T=kf(d.lx,d.lz,d.archHeight,f.x,f.y);e.holes.push(T);break;default:var P=new We.Shape,S=d.lx/2,H=d.lz/2;P.moveTo(f.x-S,f.y-H),P.lineTo(f.x+S,f.y-H),P.lineTo(f.x+S,f.y+H),P.lineTo(f.x-S,f.y+H),P.closePath(),e.holes.push(P)}}}catch(j){s.e(j)}finally{s.f()}}return e}),[i,c,C,a]),E=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 We.Vector3(e.cx,e.cy,e.cz).sub(c),r=(new We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"]));switch(e.windowType){case Yt.Polygonal:var n,s=null!==(n=e.polygonTop)&&void 0!==n?n:Zg,d=Object(u.a)(s,2),h=d[0],p=d[1],y=e.lx/2,g=e.lz/2,m=h*e.lx,w=Ef(y,g,m,p),x=new We.Mesh(new We.ExtrudeBufferGeometry([w],{steps:1,depth:e.ly,bevelEnabled:!1})),v=new We.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=kf(e.lx,e.lz,e.archHeight),A=new We.Mesh(new We.ExtrudeBufferGeometry([b],{steps:1,depth:e.ly,bevelEnabled:!1})),T=new We.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 We.Mesh(new We.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&&!M,X=b&&w;return Object(pf.jsxs)(pf.Fragment,{children:[J&&!X?Object(pf.jsx)($p,{uuid:t,simulation:!0,shape:N,holeMeshes:E,thickness:s,castShadow:G,receiveShadow:v,children:Object(pf.jsx)("meshStandardMaterial",{color:g,transparent:M,opacity:I})}):Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{uuid:t,userData:{simulation:!0},name:"Flat roof top shape",position:[0,0,s+.001],receiveShadow:v,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[U]}),X?Object(pf.jsx)("meshBasicMaterial",{map:w,side:We.FrontSide}):Object(pf.jsx)("meshStandardMaterial",{map:L,color:g,transparent:M,opacity:I,side:We.FrontSide})]}),Object(pf.jsx)($p,{shape:N,holeMeshes:E,thickness:s,castShadow:G,receiveShadow:v,children:Object(pf.jsx)("meshStandardMaterial",{color:null!==y&&void 0!==y?y:"white",transparent:M,opacity:I})})]}),Y,Object(pf.jsxs)("group",{position:[0,0,s],children:[Y,k.map((function(e,t){var l=[e.clone().sub(O),e];return Object(pf.jsx)(Jl.a,{points:l,lineWidth:p,color:d},t)}))]}),F&&F.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==P&&void 0!==P?P:$e})})]},t)}))]})},ty=l.p+"static/media/foundation_01.bda6fc00.png",ly=l.p+"static/media/foundation_02.a1240091.png",ay=l.p+"static/media/foundation_03.6be5f733.png",oy=l.p+"static/media/foundation_04.8100e8d2.png",iy=l.p+"static/media/foundation_05.8164fdc8.png",ry=l.p+"static/media/foundation_06.fc1babc0.png",ny=l.p+"static/media/foundation_07.e759a1c6.png",cy=l.p+"static/media/helvetiker_regular.typeface.9a3651b4.fnt",sy=function(e){var t=e.element,l=e.height,a=Xw(Du),i=Xw(Hu),n=Xw(ps),c=Xw($r),s=Xw(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 We.Vector3(u,f,null!==l&&void 0!==l?l:d.lz))}break;case V.Foundation:p(new We.Vector3(e,o,s?.1:0));break;case V.Cuboid:var h=Ww.getWorldDataById(t.id).pos,y=Ww.getWorldDataById(t.parentId).rot;p(new We.Vector3(h.x,h.y,h.z-t.lz/2+.2)),A(y);break;default:p(new We.Vector3(e,o,s?.2:0))}w(Math.max(5,.75*Math.hypot(r,n)))}}),[a,i]);var T=Object(Se.e)(We.FontLoader,cy),P=.05*m,S={font:T,height:0,size:P},H=new Array(25).fill(0),j=s?"#222":"#ccc";return Object(pf.jsx)(pf.Fragment,{children:h&&Object(pf.jsxs)("group",{position:h,rotation:[vt,b,0],name:"Polar Auxiliary",children:[Object(pf.jsx)("polarGridHelper",{args:[m,24,6,120,j,j],userData:{unintersectable:!0}}),Object(pf.jsx)(Lt.g,{args:[.98*m,m,24,1,vt,n],userData:{unintersectable:!0},rotation:[-vt,0,0],children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,color:"yellow"})}),Object(pf.jsx)("group",{rotation:[0,n,0],children:Object(pf.jsx)("mesh",{position:[-.5,0,.9*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:Object(pf.jsx)("textGeometry",{args:["".concat(-Ww.toDegrees(n).toFixed(1),"\xb0"),S]})})}),H.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(pf.jsx)("group",{rotation:[0,l*Math.PI/12,0],children:Object(pf.jsxs)("mesh",{position:[a,0,1.05*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:[Object(pf.jsx)("textGeometry",{args:["".concat(-15*l,"\xb0"),S]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)}))]})})},dy=function(e){var t=e.id,l=e.position,a=e.ratio,o=e.handleType,i=e.hoverHandle,r=e.noHoverHandle,n=Xw(os),c=Xw(Du),s=Xw(Hu)===o||c===o?pt:ht,d=Object(pf.jsx)("meshBasicMaterial",{color:s});return Object(pf.jsxs)("group",{position:l,rotation:[vt,0,0],scale:a,name:o,children:[Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:d}),Object(pf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:d}),Object(pf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:d})]}),Object(pf.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})]})},uy=n.a.memo(dy),fy=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(pf.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})},hy=n.a.memo(fy);!function(e){e.left="Left",e.right="Right",e.loop="Loop",e.null="Null"}(kp||(kp={}));var py,yy=function(e){var t,l=e.element,a=e.verticalLift,i=Xw(Vi),n=Xw(o.orthographic),c=Xw(zu),s=Xw(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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w,-u,x],[-d-w,u,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d-2*w,-u,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w,-u,x],[d+w,u,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d+2*w,-u,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u-w,x],[d,-u-w,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d,-u-2*w,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u+w,x],[d,u+w,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d,u+2*w,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[v,A]});case K.LowerRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(pf.jsxs)(pf.Fragment,{children:[v,T]});case K.UpperRight:return Object(pf.jsxs)(pf.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(pf.jsxs)(pf.Fragment,{children:[v,A]});case K.LowerRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(pf.jsxs)(pf.Fragment,{children:[v,T]});case K.UpperRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,T]})}return Object(pf.jsx)(pf.Fragment,{})},gy=1.225,my=273.15,wy=5.67e-8,xy=[.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"}(py||(py={}));var vy,by=1440,Ay=Math.PI/720,Ty=Math.PI/182.5,Py=function(){function e(t,l){Object(je.a)(this,e),this.sunrise=void 0,this.sunset=void 0,this.sunrise=t,this.sunset=l}return Object(ke.a)(e,[{key:"daylight",value:function(){return this.sunset-this.sunrise}}]),e}(),Sy=.5,Hy=.1,jy=23.45/180*Math.PI,zy=720,Ry=function(e){var t=Math.floor((e.getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5);return jy*Math.sin(bt*(284+t)/365.25)},Dy=function(e,t){var l=Math.tan(Ww.toRadians(t))*Math.tan(Ry(e));if(Math.abs(l)>1)return new Py(0,l>0?1440:0);var a=60*Math.acos(-l)/Ww.toRadians(15);return new Py(zy-a,zy+a)},Wy=function(e){return(60*e.getHours()+e.getMinutes()-zy)/zy*Math.PI},My=function(e){return(e/zy-1)*Math.PI},Iy=function(e,t){return Cy(1,Wy(e),Ry(e),Ww.toRadians(t)).normalize()},Cy=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 We.Vector3(e,h,d);return Ww.sphericalToCartesianZ(p),p.x=-p.x,p},Fy=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 py.NONE:return 1;case py.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))},ky=function(e,t,l,a){var o=0,i=l.dot(Rt),r=.5*(1+i);r>0&&(o+=xy[t]*r*a);var n=.5*Math.abs(1-i);return Ww.isZero(n)||(o+=e.albedo*n*a),o},Oy=function(e){var t,l,a,c,s,d,f,h,p,y,g,m,w,x,v,b,A=e.foundation,T=Xw(i.date),P=Xw(i.latitude),S=bf(Wr),H=bf(gs),j=bf(ms),z=bf(Us),R=Xw(o.solarRadiationHeatmapMaxValue),D=Af(wi),W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(),k=A.lx,O=A.ly,Y=A.lz,L=A.solarUpdraftTower,N=.016*(null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:100),U=Object(r.useMemo)((function(){return Iy(new Date(T),P)}),[T,P]),E=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(k,O),n=null!==(l=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==l?l:Math.min(k,O)/2,c=null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(k,O)),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 We.Vector3(s*g,s*m,i)),w.push(new We.Vector3(d*g,d*m,i)),w.push(new We.Vector3(d*g,d*m,r)),w.push(new We.Vector3(u*g,u*m,1.02*r)),w.push(new We.Vector3(f*g,f*m,1.04*r)),w.push(new We.Vector3(h*g,h*m,1.06*r)),o.push({points:w})}return o}),[k,O,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(k,O)/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 We.Vector3(-s,c,a)),n.push(new We.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 We.Vector3(f,-h,a)),u.push(new We.Vector3(f,h,a)),l.push({points:u})}return l}),[k,O,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(Ww.fetchHeatmapTexture(e,null!==R&&void 0!==R?R:5))}}),[z,R]),Object(Se.d)((function(e,t){(S||H&&!j)&&U.z>0&&F.current&&F.current.children.forEach((function(e){"Streamlines"===e.name&&(e.material.uniforms.dashOffset.value-=t*N*10)}))})),Object(pf.jsxs)("group",{children:[Object(pf.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(k,O)),null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(k,O)),null!==(c=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==c?c:Math.max(k,O),16,2,!0],position:[0,0,(null!==(s=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==s?s:Math.max(k,O))/2+Y],rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)),1.6*(null!==(f=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==f?f:Math.max(1,.025*Math.min(k,O))),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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)/2,null!==(g=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==g?g:Math.min(k,O)/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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)/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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:I}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:50,side:We.FrontSide,color:"lightskyblue",transparent:!0,opacity:.75})}),Object(pf.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(k,O)/2,50,0,bt],position:[0,0,.1],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"dimgray"})}),V&&V.map((function(e,t){return Object(pf.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&&E&&Object(pf.jsx)("group",{ref:F,children:E.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 We.Euler(0,0,bt*t/E.length+vt),i=N,r=N;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[N,4*N,4,2],name:"Streamline Inlet Arrow Head",position:[.1*l,.1*a,e.points[0].z],rotation:o,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[N,4*N,4,2],name:"Streamline Inlet Arrow Head",position:[.9*l,.9*a,e.points[0].z],rotation:o,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})})]},t)}))})]})},Yy=n.a.memo(Oy),Ly=l(800),Ny=l.p+"static/media/glow.def60647.png",Uy=function(e){var t,l,a=e.foundation,o=Xw(i.date),n=Xw(i.latitude),c=Object(Ly.a)(Ny),s=Object(r.useMemo)((function(){return Iy(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(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),s.z>0&&Object(pf.jsx)("mesh",{position:[0,0,h+d/2],children:Object(pf.jsx)("sprite",{scale:[g,g,g],children:Object(pf.jsx)("spriteMaterial",{map:c,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})})]})},Ey=n.a.memo(Uy),Vy=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 We.Vector3(0,l*t-f*n/2,d/2+c/2));return e}),[n,c,h,d,f]);return Object(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),p&&p.map((function(e,t){return Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})},t)}))]})},Jy=n.a.memo(Vy);!function(e){e.Move="Move",e.ResizeXY="Resize XY",e.ResizeZ="Resize Z",e.RotateUpper="Rotate Upper",e.RotateLower="Rotate Lower",e.Null="Null"}(vy||(vy={}));var Gy,Xy=new We.Vector2,By=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(pf.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(pf.jsx)("meshStandardMaterial",{color:f})})},Ky=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(pf.jsx)(Lt.h,{name:l,args:[c],position:[o,i,n],onPointerOver:function(){return h(pt)},onPointerOut:function(){return h(ht)},children:Object(pf.jsx)("meshStandardMaterial",{color:f})})},qy=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(pf.jsx)("meshStandardMaterial",{color:f})}),[f]);return Object(pf.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(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:p}),Object(pf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:p}),Object(pf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:p})]}),Object(pf.jsx)(Lt.f,{name:l,args:[.35,.35],position:[0,.05,0],rotation:[-vt,0,0],visible:!1})]})},Qy=function(e){var t=e.baseGroupSet,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,b=Object(r.useRef)(null),A=Object(r.useRef)(new We.Vector3),T=Object(r.useRef)(new We.Euler),P=Object(r.useRef)(new We.Vector2),S=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new We.Vector3),C=Object(r.useRef)(!1),F=Object(r.useRef)(new Map),k=Object(r.useRef)(new Map),O=Object(r.useRef)(new Map),Y=Object(r.useRef)(new Map),L=Object(r.useRef)(new Map),N=Object(r.useState)(new We.Vector3(s,d,p)),U=Object(u.a)(N,2),E=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)(vy.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 We.Raycaster}),[]),ve=Object(r.useMemo)((function(){return new We.Vector2}),[]),be=Xw(o.orthographic),Ae=Xw(Zr),Te=Xw(Qr),Pe=Xw(si),He=Xw(Sr);Object(r.useEffect)((function(){se(w)}),[w]),Object(r.useEffect)((function(){J(new We.Vector3(s,d,p)),je(g,m),Z(n)}),[a,i,n]);var je=function(e,t){te(e/2),ie(t/2)},ze=function(e){he(!0),Nt.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(Qf(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(f.a)(p),d.rightPoint=Object(f.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(h.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}))},Me=function(e){Pe((function(t){var l,a=Object(h.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,l){var a=new We.Vector2(E.x,E.y);P.current.set(e,l).rotateAround(Xy,Q).add(a),me(vy.ResizeXY),W.current.clear(),M.current.clear(),H.current.clear(),F.current.clear(),k.current.clear(),z.current.clear(),L.current.clear();var o,i=2*ee,r=2*oe,n=Object(h.a)(Xw.getState().elements);try{for(n.s();!(o=n.n()).done;){var c=o.value;if(Qf(c)&&t.has(c.id)){var s=Ww.getWorldDataById(c.id).pos;W.current.set(c.id,[(s.x-E.x)/i,(s.y-E.y)/r]),M.current.set(c.id,[c.lx/i,c.ly/r]),F.current.set(c.id,[c.cx,c.cy,c.lx,c.ly])}else if(c.foundationId&&t.has(c.foundationId)){var d=Ae(c.foundationId);if(!d)continue;switch(c.type){case V.Wall:var u=c,p=new We.Vector2(u.leftPoint[0]/d.lx,u.leftPoint[1]/d.ly),y=new We.Vector2(u.rightPoint[0]/d.lx,u.rightPoint[1]/d.ly);H.current.set(u.id,[p,y]),k.current.set(u.id,[].concat(Object(f.a)(u.leftPoint),Object(f.a)(u.rightPoint)));break;case V.Window:var g=c;if(g.parentType!==V.Roof)continue;z.current.set(g.id,[g.cx/d.lx,g.cy/d.ly]),L.current.set(g.id,[g.cx,g.cy])}}}}catch(m){n.e(m)}finally{n.f()}},Fe=function(e,l,a){var o=Te(),i=o.x,r=o.y;A.current.set(e,l,a),T.current.set(-vt,0,-Math.atan2(i,r)-Q,"ZXY"),me(vy.ResizeZ),S.current.clear(),O.current.clear(),j.current.clear(),Y.current.clear();var n,c=Object(h.a)(Xw.getState().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.foundationId&&t.has(s.foundationId))if(s.type===V.Wall){S.current.set(s.id,s.lz/ce),O.current.set(s.id,s.lz);var d=s;d.fill===Ue.Partial&&(Y.current.set(d.id,{upperLeft:d.leftTopPartialHeight,upperRight:d.rightTopPartialHeight,lowerLeft:d.leftUnfilledHeight,lowerRight:d.rightUnfilledHeight}),j.current.set(d.id,{upperLeft:d.leftTopPartialHeight/ce,upperRight:d.rightTopPartialHeight/ce,lowerLeft:d.leftUnfilledHeight/ce,lowerRight:d.rightUnfilledHeight/ce}))}else s.type===V.Roof&&(S.current.set(s.id,s.rise/ce),O.current.set(s.id,s.rise));else t.has(s.id)&&(S.current.set(s.id,s.lz/ce),O.current.set(s.id,s.lz))}}catch(u){c.e(u)}finally{c.f()}},ke=wp(),Oe=ke/2,Ye=ce+Oe-ke/2,Le=ee+ke,Ne=oe+ke,Ee=oe+4*ke;return Object(pf.jsxs)("group",{name:"Group Master",position:E,rotation:[0,0,Q],children:[Object(pf.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:Fe(-ee,oe,ce);break;case K.UpperRightTop:Fe(ee,oe,ce);break;case K.LowerLeftTop:Fe(-ee,-oe,ce);break;case K.LowerRightTop:Fe(ee,-oe,ce)}},children:[Object(pf.jsx)(By,{args:[ee,oe,Oe,ke],handleType:K.UpperRight}),Object(pf.jsx)(By,{args:[-ee,oe,Oe,ke],handleType:K.UpperLeft}),Object(pf.jsx)(By,{args:[ee,-oe,Oe,ke],handleType:K.LowerRight}),Object(pf.jsx)(By,{args:[-ee,-oe,Oe,ke],handleType:K.LowerLeft}),!be&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(By,{args:[ee,oe,Ye,ke],handleType:K.UpperRightTop}),Object(pf.jsx)(By,{args:[-ee,oe,Ye,ke],handleType:K.UpperLeftTop}),Object(pf.jsx)(By,{args:[ee,-oe,Ye,ke],handleType:K.LowerRightTop}),Object(pf.jsx)(By,{args:[-ee,-oe,Ye,ke],handleType:K.LowerLeftTop})]})]}),Object(pf.jsxs)("group",{name:"Move Handle Group",onPointerDown:function(e){if(ze(e),me(vy.Move),e.intersections.length>0){var l=e.intersections[0].point.clone().setZ(0);I.current.subVectors(E,l);var a,o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Qf(i)&&t.has(i.id)){var r=new We.Vector3(i.cx,i.cy),n=(new We.Vector3).subVectors(r,l);R.current.set(i.id,n),F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(pf.jsx)(Ky,{args:[0,Ne,Oe,ke],handleType:B.Upper}),Object(pf.jsx)(Ky,{args:[0,-Ne,Oe,ke],handleType:B.Lower}),Object(pf.jsx)(Ky,{args:[Le,0,Oe,ke],handleType:B.Right}),Object(pf.jsx)(Ky,{args:[-Le,0,Oe,ke],handleType:B.Left})]}),Object(pf.jsxs)("group",{name:"Rotate Handle Group",onPointerDown:function(e){if(ze(e),e.object.name===q.Lower?me(vy.RotateLower):e.object.name===q.Upper&&me(vy.RotateUpper),e.intersections.length>0){var l,a=new We.Vector3(E.x,E.y),o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Qf(i)&&t.has(i.id)){var r=new We.Vector3(i.cx,i.cy),n=(new We.Vector3).subVectors(r,a);R.current.set(i.id,n),D.current.set(i.id,i.rotation[2]),F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}t.has(i.parentId)&&F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(pf.jsx)(qy,{args:[0,Ee,Oe,ke],handleType:q.Upper}),Object(pf.jsx)(qy,{args:[0,-Ee,Oe,ke],handleType:q.Lower})]}),fe&&Object(pf.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 vy.ResizeXY:!function(e){var l=new We.Vector2(e.x,e.y),a=P.current.clone();if(v){var o=(new We.Vector2).subVectors(l,a),i=Math.max(1,o.length()),r=Math.sqrt(Math.pow(i,2)/(Math.pow(x,2)+1)),n=r*x,c=new We.Vector2(r*Math.sign(o.x),n*Math.sign(o.y)).normalize().multiplyScalar(i/2).add(a);J(new We.Vector3(c.x,c.y)),je(r,n),Pe((function(e){var l,a=new Map,o=Object(h.a)(e.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Qf(i)&&t.has(i.id)){var s=W.current.get(i.id),d=M.current.get(i.id);if(s&&d){var f=d[0]*r,p=d[1]*n;if(i.lx=f,i.ly=p,i.parentId!==xt){var y=a.get(i.parentId);if(y){var g=y.pos,m=y.rot,w=new We.Vector3(s[0]*r+c.x,s[1]*n+c.y),x=w.clone().sub(g).applyEuler(new We.Euler(0,0,-m));i.cx=x.x,i.cy=x.y,a.set(i.id,{pos:w.clone(),rot:i.rotation[2]+m})}}else{var v=s[0]*r+c.x,b=s[1]*n+c.y;i.cx=v,i.cy=b,a.set(i.id,{pos:new We.Vector3(v,b),rot:i.rotation[2]})}var A,T=Object(h.a)(e.elements);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(P.foundationId===i.id)switch(P.type){case V.Wall:var S=P,j=H.current.get(S.id);if(!j)continue;var R=Object(u.a)(j,2),D=R[0],I=R[1],C=[D.x*f,D.y*p,i.lz],F=[I.x*f,I.y*p,i.lz];S.cx=(C[0]+F[0])/2,S.cy=(C[1]+F[1])/2,S.lx=Math.hypot(C[0]-F[0]+(C[1]-F[1])),S.relativeAngle=Math.atan2(F[1]-C[1],F[0]-C[0]),S.leftPoint=[].concat(C),S.rightPoint=[].concat(F);break;case V.Window:var k=P;if(k.parentType!==V.Roof)continue;var O=z.current.get(k.id);if(!O)continue;k.cx=O[0]*f,k.cy=O[1]*p}}}catch(Y){T.e(Y)}finally{T.f()}}}}}catch(Y){o.e(Y)}finally{o.f()}}))}else{var s=a.distanceTo(l),d=Math.atan2(l.x-a.x,l.y-a.y)+Q,f=Math.abs(s*Math.sin(d)),p=Math.abs(s*Math.cos(d)),y=(new We.Vector2).addVectors(l,a).multiplyScalar(.5);J(new We.Vector3(y.x,y.y)),je(f,p),Pe((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id))o.lx=f,o.ly=p,o.cx=y.x,o.cy=y.y;else if(o.foundationId&&t.has(o.foundationId))switch(o.type){case V.Wall:var i=o,r=H.current.get(i.id);if(!r)continue;var n=Object(u.a)(r,2),c=n[0],s=n[1],d=[c.x*f,c.y*p,0],g=[s.x*f,s.y*p,0];i.cx=(d[0]+g[0])/2,i.cy=(d[1]+g[1])/2,i.lx=Math.hypot(d[0]-g[0],d[1]-g[1]),i.relativeAngle=Math.atan2(g[1]-d[1],g[0]-d[0]),i.leftPoint=[].concat(d),i.rightPoint=[].concat(g);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]*f,m.cy=w[1]*p}}}catch(x){a.e(x)}finally{a.f()}}))}Xw.getState().updateElementOnRoofFn()}(i);break;case vy.ResizeZ:!function(e){if(!(e.z<.1)){var t=e.z;se(t),Pe((function(e){var l,a=Object(h.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=j.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 vy.RotateLower:case vy.RotateUpper:!function(e){var a=new We.Vector3(E.x,E.y),o=Math.atan2(a.x-e.x,e.y-a.y)+(ge===vy.RotateUpper?0:Math.PI),i=o+(Math.abs(o)>Math.PI?-bt:0),r=new We.Euler(0,0,i),n=D.current.size;Pe((function(e){var o,c=Object(h.a)(e.elements);try{for(c.s();!(o=c.n()).done;){var s=o.value;if(Qf(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 f=d.clone().applyEuler(r);s.cx=a.x+f.x,s.cy=a.y+f.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 vy.Move:J((new We.Vector3).addVectors(i.clone().setZ(0),I.current)),Pe((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(Qf(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 vy.Move:case vy.RotateLower:case vy.RotateUpper:!function(){var e,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;(Qf(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===vy.Move?"Move":"Rotate",r={name:"".concat(i," Foundation Group"),timestamp:Date.now(),oldPositionMap:new Map(F.current),newPositionMap:new Map(l),undo:function(){Me(r.oldPositionMap)},redo:function(){Me(r.newPositionMap)}};He(r)}();break;case vy.ResizeXY:!function(){var e,t=new Map,l=new Map,a=new Map,o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(Qf(i)&&F.current.has(i.id))t.set(i.id,[i.cx,i.cy,i.lx,i.ly]);else if(k.current.has(i.id)){var r=i;l.set(i.id,[].concat(Object(f.a)(r.leftPoint),Object(f.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(F.current),newFoundationDataMap:new Map(t),oldWallPointsMap:new Map(k.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)}};He(c)}();break;case vy.ResizeZ:!function(){var e,t=new Map,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;if(O.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(O.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)}};He(r)}()}he(!1),Nt.getState().setEnableOrbitController(!0),C.current=!1,me(vy.Null),Ie(null),Pe((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag,e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.updateElementOnRoofFlag=!0}))}}),Object(pf.jsx)("group",{name:"Wireframe Group",position:[0,0,ce/2],children:Object(pf.jsx)(hy,{hx:ee,hy:oe,hz:ce/2,lineColor:"white"})})]})},Zy=n.a.memo(Qy),_y=function(){function e(){Object(je.a)(this,e)}return Object(ke.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(h.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(u){s.e(u)}finally{s.f()}if(e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t)),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(h.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}(),$y=l(124),eg=function(e){var t=bf(Us),l=Xw(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=Af.getState().getHeatmap(e);a&&c(Ww.fetchHeatmapTexture(a,null!==l&&void 0!==l?l:5))}}),[t,l]),n},tg=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?lg(e,o,t,r,i,s,n,c):lg(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=We.RepeatWrapping,p(s.clone())}}),[s,e,t]),h},lg=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(pf.jsxs)("group",{rotation:[-c.x,0,-c.z-n],children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[y.clone().multiplyScalar(.5),s.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:s.clone().multiplyScalar(.75),rotation:[vt+c.x+o.x,0,c.z+o.z+n,"ZXY"],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",rotation:[0,0,-o.y],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),cg=function(e){var t,l,a,o,i,n=e.id;Xw(ki);var c=Xw(Zr),s=Xw(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 We.Vector3(f.cx,f.cy,f.cz),p=new We.Vector3(u.cx*f.lx,u.cy*f.ly,f.lz/2+u.cz+u.lz/2+u.poleHeight).applyEuler(new We.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(pf.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)]})},sg=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,H=void 0===S?[0,0,1]:S,j=e.color,z=void 0===j?"white":j,R=e.frameColor,D=e.backsheetColor,W=e.showLabel,M=void 0!==W&&W,I=e.locked,C=void 0!==I&&I,F=e.parentId,k=e.foundationId,O=e.foundationModel,Y=e.orientation,L=void 0===Y?$.portrait:Y,N=Xw(si),U=Xw(os),E=Xw(Zr),J=bf(Us),G=Xw(o.shadowEnabled),B=Xw(o.solarPanelShininess),Q=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,Z=Xw(Yi),_=Xw(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=Xw.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)(),He=Object(r.useRef)(null),je=Object(r.useRef)(!1),ze=Object(r.useRef)(null),Re=Object(r.useRef)(null),De=Object(r.useRef)(null),Me=Object(r.useRef)(null),Ie=Object(r.useRef)(null),Ce=Object(r.useRef)(null),Fe=Object(r.useMemo)((function(){return new We.Raycaster}),[]),ke=Object(r.useMemo)((function(){return new We.Vector2}),[]),Oe=Object(r.useMemo)((function(){return de?new We.Vector3(c,s,d+ie+x):new We.Vector3(c,s,d+g/2+.02)}),[c,s,d,ie,de,x,_]),Ye=Object(r.useMemo)((function(){return(new We.Euler).fromArray([].concat(Object(f.a)(P),["ZXY"]))}),[P]),Le=Object(r.useMemo)((function(){return de?new We.Euler(m,0,w,"ZXY"):new We.Euler}),[m,w,de]),Ne=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 We.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 We.Vector3(o*l-ae,-oe,g),new We.Vector3(o*l-ae,oe,g)]});for(var i=0;i<=t;i++)Pe.current.push({points:[new We.Vector3(-ae,i*a-oe,g),new We.Vector3(ae,i*a-oe,g)]})}}),[L,n,p,y,g]);var Ue=Math.max(1,(p+y)/16),Ee=st*Ue*2,Ve=dt*Ue*1.5,Je=2*Ue/3,Ge=function(){var e=Xw.getState().elements.find((function(e){return e.id===k&&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,Me.current=m,Ce.current=Object(f.a)(H),Ie.current=Object(f.a)(P),te.current=e),ye(!0),je.current=!0,Nt.getState().setEnableOrbitController(!1)},Xe=function(e){ke.x=e.offsetX/be.domElement.clientWidth*2-1,ke.y=-e.offsetY/be.domElement.clientHeight*2+1,Fe.setFromCamera(ke,Ae)},Be=function(e){if(Xw.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(f.a)(Re.current),oldNor:Object(f.a)(Ce.current),oldPos:Object(f.a)(ze.current),oldRot:Object(f.a)(Ie.current),newDms:[e.lx,e.ly,e.lz],newPos:[e.cx,e.cy,e.cz],newNor:Object(f.a)(e.normal),newRot:Object(f.a)(e.rotation),undo:function(){N((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(f.a)(t.oldPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(t.oldDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(f.a)(t.oldNor),o.rotation=Object(f.a)(t.oldRot);break}}}catch(n){a.e(n)}finally{a.f()}}))},redo:function(){N((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(f.a)(t.newPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(t.newDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(f.a)(t.newNor),o.rotation=Object(f.a)(t.newRot);break}}}catch(n){a.e(n)}finally{a.f()}}))}};Xw.getState().addUndoable(t)}}else if(Xw.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(){Xw.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.oldValue)},redo:function(){Xw.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.newValue)}};Xw.getState().addUndoable(l)}},Ke=Xw((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===F)return a}}catch(o){l.e(o)}finally{l.f()}})),qe=tg(p,y,le,L,R,D),Qe=eg(a);return Ke&&Ke.type===V.Roof&&0===Ke.opacity?null:Object(pf.jsxs)("group",{name:"Solar Panel Group Grandpa "+a,rotation:Ye,position:Oe,children:[Object(pf.jsxs)("group",{name:"Solar Panel Group Dad "+a,rotation:Le,children:[Object(pf.jsxs)(Lt.a,{receiveShadow:G,castShadow:G,uuid:a,ref:Te,args:[p,y,g],name:"Solar Panel",onPointerDown:function(e){2!==e.button&&Xw.getState().objectTypeToAdd===V.None&&U(a,e,X.Select)},onContextMenu:function(e){U(a,e,X.Select),N((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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),J&&Qe?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Qe}):qe?Q||0===B?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:qe,color:z}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:We.FrontSide,map:qe,color:z}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),0===(null===le||void 0===le?void 0:le.bifacialityFactor)||Q||0===x&&0===m?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}):qe?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:We.FrontSide,map:qe,color:z}):null]}),ee&&!C&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(ag,{id:a,handleSize:Ee,parentId:F,foundationId:k}),Object(pf.jsxs)("group",{name:"Resize Handle Group",children:[Object(pf.jsx)(og,{pos:[-ae,0,ie],dms:[g,Ve],handleType:K.Left,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[ae,0,ie],dms:[g,Ve],handleType:K.Right,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[0,-oe,ie],dms:[g,Ve],handleType:K.Lower,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[0,oe,ie],dms:[g,Ve],handleType:K.Upper,initPointerDown:Ge})]})]}),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:a,position:[0,0,Hy],args:[p,y],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),J&&Qe&&Pe.current&&Pe.current.map((function(e,t){return Object(pf.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(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Rotate Handle Group",rotation:[0,0,Le.z],children:[Object(pf.jsx)(ig,{position:[0,-oe-1,0],ratio:1,handleType:q.Lower,initPointerDown:Ge}),Object(pf.jsx)(ig,{position:[0,oe+1,0],ratio:1,handleType:q.Upper,initPointerDown:Ge})]}),Object(pf.jsx)(rg,{rotationZ:w,tiltAngle:m,handleSize:Je,initPointerDown:Ge,handlePointerMove:function(e,t){if(je.current&&(Xe(e),t.current&&Xw.getState().rotateHandleType===q.Tilt)){var l=Fe.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 We.Vector3);if(r){var n=(new We.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)),Xw.getState().updateSolarPanelTiltAngleById(a,c)}}}}},handlePointerUp:function(){var e=E(a);if(e&&Me.current&&Math.abs(e.tiltAngle-Me.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Me.current,newValue:e.tiltAngle,changedElementId:a,changedElementType:V.SolarPanel,undo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Xw.getState().addUndoable(t)}}})]}),pe&&Object(pf.jsx)(Lt.f,{ref:He,args:[1e3,1e3],visible:!1,onPointerMove:function(e){if(He.current&&je.current&&te.current&&le){Xe(e);var t=Fe.intersectObjects([He.current]);if(t.length>0){var l=t[0].point;if(l.z<.001)return;var o=Xw.getState().rotateHandleType;if(Xw.getState().resizeHandleType){var i=de?w:0,r=Xw.getState().resizeAnchor,n=new We.Vector3(te.current.cx,te.current.cy,te.current.lz),d=(new We.Vector3).subVectors(l,r).applyEuler(new We.Euler(0,0,-P[2]-te.current.rotation[2]-i));N((function(e){var t,l,o,c=Object(h.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,f=Math.abs(d.x),p=Math.max(1,Math.ceil((f-u/2)/u))*u,y=new We.Vector3(Math.sign(d.x)*p/2,0,0).applyEuler(new We.Euler(0,0,P[2]+te.current.rotation[2]+i)),g=(new We.Vector3).addVectors(r,y).sub(n).applyEuler(new We.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 We.Vector3(0,T*Math.sign(d.y)/2,0).applyEuler(new We.Euler(P[0],P[1],P[2]+te.current.rotation[2]+i,"ZXY")),H=(new We.Vector3).addVectors(r,S).sub(n).applyEuler(new We.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=H.x/te.current.lx,s.cy=H.y/te.current.ly,de||(s.cz=H.z-ie))}break}}}catch(j){c.e(j)}finally{c.f()}}))}else if(o===q.Lower||o===q.Upper){var u=te.current.rotation[2],f=new We.Vector2(te.current.cx,te.current.cy),p=new We.Vector2(c,s).rotateAround(Dt,u),y=(new We.Vector2).addVectors(p,f),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);Xw.getState().updateSolarCollectorRelativeAzimuthById(a,v)}}}},onPointerUp:function(){if(je.current){var e=E(F);if(e&&k){var t=E(a),l=te.current;if(t&&l){var o=Zm.getRoofBoundaryVertices(e),i=Zm.getSolarPanelVerticesOnRoof(t,l);Hp(i,o)&&jp(t,l,i)?Be(t):N((function(e){if(ze.current&&null!==De.current&&Ce.current&&Re.current&&Ie.current){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a){var i=Object(f.a)(ze.current);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(Re.current);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.relativeAzimuth=De.current,o.normal=Object(f.a)(Ce.current),o.rotation=Object(f.a)(Ie.current);break}}}catch(n){l.e(n)}finally{l.f()}}}))}}Nt.getState().setEnableOrbitController(!0),je.current=!1,ye(!1),N((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,e.updateElementOnRoofFlag=!0})),te.current=null}}}),de&&x>0&&Ne.map((function(e,t){return Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:z})},t)})),Object(pf.jsx)(ng,{drawSunbeam:A,rotation:P,normal:H,relativeEuler:Le,fRotation:null!==(l=null===O||void 0===O?void 0:O.rotation[2])&&void 0!==l?l:0}),(we||M)&&!ee&&Object(pf.jsx)(cg,{id:a})]})},dg=function(e){var t=e.lx,l=e.lz,a=e.parentId,o=e.id,i=e.roofId,n=Xw(Lu);Object(r.useEffect)((function(){n===i&&Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o&&a.type===V.Wall){var i=a;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()}}))}),[n]);return Object(pf.jsx)(Lt.f,{args:[t,l],rotation:[vt,0,0],visible:!1,onPointerDown:function(e){Xw.getState().groupActionMode?(Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.selected=o.id===a}}catch(i){l.e(i)}finally{l.f()}e.groupMasterId=a,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(a)})),e.stopPropagation()):function(e){return!(2===e.button||Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().objectTypeToAdd!==V.None||Xw.getState().isAddingElement())}(e)&&(Xw.getState().set((function(e){e.contextMenuObjectType=null})),Xw.getState().selectMe(o,e,X.Select))},onContextMenu:function(e){Xw.getState().selectMe(o,e,X.Select),Xw.getState().set((function(t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})})},ug=n.a.memo(dg),fg=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(pf.jsx)(Lt.h,{name:a,args:[l],position:[0,t,0],onPointerEnter:function(){c(pt)},onPointerOut:function(){c(ft)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},hg=function(e){var t=e.ply,l=e.phz,a=wp();return Object(pf.jsxs)("group",{name:"Move Handle Group",position:[0,0,-l],onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject.parent===e.eventObject&&(Xw.getState().set((function(t){t.moveHandleType=e.object.name})),Nt.getState().setEnableOrbitController(!1))},children:[Object(pf.jsx)(fg,{cy:-a,size:a,type:B.Lower}),Object(pf.jsx)(fg,{cy:t+a,size:a,type:B.Upper})]})},pg=n.a.memo(hg),yg=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=Xw(si),s=Xw(zu),d=Xw(Ou),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(pf.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(pf.jsx)("meshBasicMaterial",{color:g})})})),gg=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=Xw(si),T=Xw(o.orthographic),P=wp(),S=Object(r.useState)(!1),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(new We.Vector3),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(new We.Euler),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(null),Y=Object(r.useRef)(!1),L=Object(r.useRef)([2*n,s,d]),N=Object(r.useRef)(new Map),U=Object(r.useRef)(null),E=Object(r.useRef)(null),J=Object(r.useRef)([]),G=Object(r.useMemo)((function(){if(!a)return null;var e=Xw.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=Xw.getState().cameraDirection,l=Math.atan2(t.x,t.y);M(new We.Vector3(e,0,0)),k(new We.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(h.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 f=l.get(d.id);void 0!==f&&(d.lz=f,d.cz=f/2)}}}catch(p){s.e(p)}finally{s.f()}}))},q=function(){a&&(v.length>0||b.length>0)&&(G===It.Gable||G===It.Gambrel?Xw.getState().elements.forEach((function(e){e.id===v[0]&&(U.current=e.lz),e.id===b[0]&&(E.current=e.lz)})):(N.current.clear(),Xw.getState().elements.forEach((function(e){e.type===V.Wall&&e.roofId===a&&N.current.set(e.id,e.lz)}))))},Q=function(){J.current=Xw.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&&(!Ww.isZero(m-p)||!Ww.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(h.a)(J.current);try{for(n.s();!(r=n.n()).done;){var c=r.value,s=c.cx,d=c.cz,f=c.lx,p=c.ly,y=c.lz;if(s*=e.lx,d*=e.lz,c.type!==V.SolarPanel?(f*=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:Zg,b=Object(u.a)(v,2),A=b[0],T=b[1],P=s+A*f,S=d+y/2+T;if(!Ww.isPointInside(P,S,i))return!1}if(!Ww.isElementInsideWall(new We.Vector3(s,0,d),f,y,i,c.type===V.Door))return!1}}catch(H){n.e(H)}finally{n.f()}}return!0};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Wall Resize Handle Group",onPointerDown:function(e){var t;if(!Xw.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 We.Vector3(2*i,0,0)))}));break;case K.LowerRight:A((function(e){e.resizeAnchor.copy(l.localToWorld(new We.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})),Nt.getState().setEnableOrbitController(!1),Y.current=!0,L.current=[2*n,s,d,p,y]}},children:[Object(pf.jsx)(yg,{x:-i,z:-n,handleType:K.LowerLeft,highLight:x,handleSize:P}),Object(pf.jsx)(yg,{x:i,z:-n,handleType:K.LowerRight,highLight:x,handleSize:P}),!T&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(yg,{x:-i,z:n,handleType:K.UpperLeft,highLight:x,handleSize:P}),Object(pf.jsx)(yg,{x:i,z:n,handleType:K.UpperRight,highLight:x,handleSize:P}),g===Ue.Partial&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(yg,{x:-i,z:-n+s,handleType:K.WallPartialResizeLeft,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:i,z:-n+d,handleType:K.WallPartialResizeRight,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:-i,z:-n+p,handleType:K.WallPartialResizeLeftTop,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:i,z:-n+y,handleType:K.WallPartialResizeRightTop,highLight:x,handleSize:P,partial:!0})]})]})]}),j&&Object(pf.jsx)(Lt.f,{ref:O,position:W,rotation:F,args:[1e4,1e4],visible:!1,onPointerMove:function(e){if(0!==e.intersections.length&&Y.current){var o=e.intersections[0].point;switch(Xw.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||E.current){var n,c,u=Math.abs(r-(null!==(n=U.current)&&void 0!==n?n:1/0)),f=Math.abs(r-(null!==(c=E.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(h.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=Ww.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=Ww.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=Ww.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(){Nt.getState().setEnableOrbitController(!0),z(!1),U.current=null,E.current=null,Y.current=!1;var e=new Map;a&&G!==It.Gable&&G!==It.Gambrel&&Xw.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(f.a)(L.current),newHeights:[2*n,s,d,p,y],oldSameBuildingWallsHeightMap:new Map(N.current),newSameBuildingWallsHeightMap:e,undo:function(){B(this.resizedElementId,this.oldHeights,this.oldSameBuildingWallsHeightMap)},redo:function(){B(this.resizedElementId,this.newHeights,this.newSameBuildingWallsHeightMap)}};Xw.getState().addUndoable(l),A((function(e){e.actionState.wallHeight=2*n,e.resizeHandleType=null}))},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})})]})})),mg=function(e){var t=e.wallModel,l=e.foundationModel;!function(e){var t=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.wallStructure&&void 0!==e.structureSpacing&&void 0!==e.structureWidth&&void 0!==e.structureColor&&void 0!==e.opacity&&void 0!==e.fill&&void 0!==e.leftUnfilledHeight&&void 0!==e.rightUnfilledHeight&&void 0!==e.leftTopPartialHeight&&void 0!==e.rightTopPartialHeight&&void 0!==e.eavesLength&&void 0!==e.parapet||Xw.getState().set((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&"break"===function(){var e=o;if(void 0===e.wallStructure&&(e.wallStructure=Ee.Default),void 0===e.structureSpacing&&(e.structureSpacing=2),void 0===e.structureWidth&&(e.structureWidth=.1),void 0===e.structureColor&&(e.structureColor="white"),void 0===e.opacity&&(e.opacity=.5),void 0===e.fill&&(e.fill=Ue.Full),void 0===e.unfilledHeight&&(e.unfilledHeight=.5),void 0===e.leftUnfilledHeight||void 0===e.rightUnfilledHeight){var l,a=null!==(l=e.unfilledHeight)&&void 0!==l?l:.5;e.leftUnfilledHeight=a,e.rightUnfilledHeight=a}if(void 0!==e.leftTopPartialHeight&&void 0!==e.rightTopPartialHeight||(e.leftTopPartialHeight=e.lz,e.rightTopPartialHeight=e.lz),void 0===e.eavesLength){var i=t.elements.find((function(t){return t.id===e.roofId&&t.type===V.Roof}));e.eavesLength=i&&void 0!==i.overhang?i.overhang:.3}return void 0===e.parapet&&(e.parapet=Object(d.a)({},up)),"break"}())break}}catch(i){a.e(i)}finally{a.f()}}))}),[t])}(t);var a=t.id,o=t.roofId,i=t.cx,n=t.cy,c=t.lx,s=t.ly,u=t.lz,f=t.relativeAngle,p=t.fill,y=t.locked,g=t.leftUnfilledHeight,m=t.rightUnfilledHeight,w=t.leftTopPartialHeight,x=t.rightTopPartialHeight,v=t.leftJoints,b=t.rightJoints,A=_f(a),T=c/2,P=u/2,S=p===Ue.Partial,H=v.length>0?t.leftRoofHeight:u,j=b.length>0?t.rightRoofHeight:u,z=null!==H&&void 0!==H?H:u,R=null!==j&&void 0!==j?j:u,D=S?Math.min(z,w):z,W=S?Math.min(R,x):R,M=0===c;return Object(pf.jsxs)("group",{name:"Wall Group ".concat(a),position:[i,n,P],rotation:[0,0,f],userData:{aabb:!0},children:[p===Ue.Empty?Object(pf.jsx)(ug,Object(d.a)({},t)):Object(pf.jsx)(Qm,{wallModel:t,foundationModel:l}),A&&!y&&Object(pf.jsxs)(pf.Fragment,{children:[c>.5&&Object(pf.jsx)(pg,{ply:s,phz:P}),Object(pf.jsx)(gg,{id:a,parentLz:l.lz,roofId:o,absAngle:f+l.rotation[2],x:T,z:P,leftUnfilledHeight:g,rightUnfilledHeight:m,leftTopPartialResizeHandleHeight:D,rightTopPartialResizeHandleHeight:W,fill:p,wallLeftHeight:z,wallRightHeight:R,highLight:M,leftJoints:v,rightJoints:b})]})]})},wg=function(e,t){return e.wallModel===t.wallModel},xg=n.a.memo(mg,wg),vg="Building Group",bg=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=Xw((function(e){return e.elements.filter(i)}),qf.a);return 0===r.length?null:Object(pf.jsx)("group",{name:vg,position:[0,0,o/2],children:r.map((function(t){switch(t.type){case V.Wall:return Object(pf.jsx)(xg,{wallModel:t,foundationModel:e},t.id);case V.Roof:return Object(pf.jsx)(Op,{roofModel:t,foundationModel:e},t.id);case V.SolarPanel:return Object(pf.jsx)(sg,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(pf.jsx)($g,Object(d.a)(Object(d.a)({},t),{},{cz:t.cz}),t.id);default:return null}}))})},Ag=function(e,t){return e.lx===t.lx&&e.ly===t.ly&&e.lz===t.lz&&e.rotation===t.rotation},Tg=n.a.memo(bg,Ag),Pg="Foundation Group",Sg=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,H=e.lineWidth,j=void 0===H?.2:H,z=e.locked,R=void 0!==z&&z,D=e.showLabel,W=void 0!==D&&D,M=e.textureType,I=void 0===M?se.NoTexture:M,C=e.solarStructure,F=_f(n),k=Xw(Vi),O=Xw(o.orthographic),Y=Xw(Zr),L=Xw(an),N=Xw(si),U=Xw(nn),E=Xw(cn),J=Xw(bn),Q=Xw(Pn),Z=Xw($u),_=Xw(ef),ee=Xw(tf),te=Xw(ic),le=Xw(Bn),ae=Xw(Kn),oe=Xw(ts),ie=Xw(as),re=Xw(Kc),ne=Xw(os),ce=Xw(rs),de=Xw(Ni),ue=Xw(Yu),fe=Xw(Bu),he=Xw(o.shadowEnabled),ye=Xw(o.groundImage),ge=Xw(Iu),we=Xw(Sr),xe=Xw(Mu),ve=Xw(on),be=Xw(Hu),Ae=bf(Us),Te=Xw(o.solarRadiationHeatmapMaxValue),He=Xw(o.solarRadiationHeatmapReflectionOnly),je=Af(wi),ze=Xw(Vu),Re=Zf(e,ze),De=Re.baseGroupSet,Me=Re.childCuboidSet,Ie=Re.groupMasterDimension,Ce=Re.groupMasterPosition,Fe=Re.groupMasterRotation,ke=Object(Se.f)(),Oe=ke.camera,Ye=ke.gl.domElement,Le=Object(r.useState)(!1),Ne=Object(u.a)(Le,2),Ue=Ne[0],Ee=Ne[1],Ve=Object(r.useState)(null),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(!1),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)({show:!1,direction:null,position:null}),_e=Object(u.a)(Ze,2),$e=_e[0],et=_e[1],tt=Object(r.useState)([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]),lt=Object(u.a)(tt,2),at=lt[0],ot=lt[1],it=Object(r.useRef)(null),rt=Object(r.useRef)(!1),nt=Object(r.useRef)(!1),ct=Object(r.useRef)(null),st=Object(r.useRef)(kp.null),dt=Object(r.useRef)(new Map),gt=Object(r.useRef)(null),mt=Object(r.useRef)(),wt=Object(r.useRef)(null),xt=Object(r.useRef)(),Tt=Object(r.useRef)(),Pt=Object(r.useRef)(),St=Object(r.useRef)(),Ht=Object(r.useRef)(),jt=Object(r.useRef)(),zt=Object(r.useRef)(),Wt=Object(r.useRef)(),Mt=Object(r.useRef)(),It=Object(r.useRef)(new We.Vector3),Ct=Object(r.useRef)(new We.Vector3),Ft=Object(r.useRef)(new We.Vector3(1,1,1)),kt=Object(r.useRef)(new We.Vector3(1,1,1)),Ot=Object(r.useRef)(0),Yt=Object(r.useRef)(0),Ut=Object(r.useRef)([]),Et=Object(r.useRef)([]),Vt=Object(r.useRef)([]),Jt=Object(r.useRef)([]),Gt=Object(r.useRef)([]),Xt=Object(r.useRef)([]),Bt=Object(r.useMemo)((function(){return{lng:k}}),[k]),Kt=Object(r.useMemo)((function(){return new We.Vector2}),[]),qt=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Qt=y/2,Zt=m/2,_t=x/2,$t=Object(r.useMemo)((function(){return new We.Vector3(-Qt,-Zt,_t)}),[Qt,Zt,_t]),el=Object(r.useMemo)((function(){return new We.Vector3(-Qt,Zt,_t)}),[Qt,Zt,_t]),tl=Object(r.useMemo)((function(){return new We.Vector3(Qt,-Zt,_t)}),[Qt,Zt,_t]),ll=Object(r.useMemo)((function(){return new We.Vector3(Qt,Zt,_t)}),[Qt,Zt,_t]),al=wp(),ol=al,il=al,rl=4*al,nl=Zt+rl,cl=Object(r.useRef)(!1),sl=Object(r.useRef)(null),dl=Xw(Nu),ul=Xw(Uu),fl=Object(r.useMemo)((function(){return new We.Vector3}),[]);if(wt.current){var hl=-1;switch(wt.current.type){case V.SolarPanel:hl=wt.current.poleHeight;break;case V.ParabolicTrough:var pl=wt.current;hl=pl.poleHeight+pl.lx/2;break;case V.ParabolicDish:var yl=wt.current;hl=yl.poleHeight+yl.lx/2+yl.lx*yl.lx/(4*yl.latusRectum);break;case V.FresnelReflector:var gl=wt.current;hl=gl.poleHeight+gl.lx/2}hl>=0&&fl.set(0,0,(null===e||void 0===e?void 0:e.lz)/2+hl)}Object(r.useEffect)((function(){dt.current.clear();var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Wall&&l.parentId===n&&dt.current.set(l.id,l)}}catch(a){t.e(a)}finally{t.f()}}),[fe]),Object(r.useEffect)((function(){ue&&ue===it.current&&(dt.current.delete(ue),rt.current=!1,nt.current=!1,it.current=null,N((function(e){e.addedWallId===e.deletedWallId&&(e.addedWallId=null),e.deletedWallId=null})),Nt.getState().setEnableOrbitController(!0),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]))}),[ue]),Object(r.useEffect)((function(){if(e&&Ae){var t=je(e.id);Xe(t?Ww.fetchHeatmapTexture(t,null!==Te&&void 0!==Te?Te:5):null)}}),[Ae,Te,He]),Object(r.useEffect)((function(){cl.current&&Xw.getState().getAutoDeletedElements()&&ml()}),[dl,ul]);var ml=Object($y.debounce)((function(){if(sl.current){var e=Xw.getState().getAutoDeletedElements();if(e){var t=sl.current,l=t.wall,a=t.newAngle,o=t.newJoints,i={name:"Move Wall",timestamp:Date.now(),id:l.id,oldPoints:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoints:[Object(f.a)(l.leftPoint),Object(f.a)(l.rightPoint)],oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(o[0]),Object(f.a)(o[1])],oldAngle:Ot.current,newAngle:a,flippedWallSide:st.current,autoDeletedElements:Object(f.a)(e),undo:function(){var e=this;switch(this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var t=Y(this.newJoints[0][0]);t&&Rl(t);break;case kp.right:var l=Y(this.newJoints[1][0]);l&&Dl(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];N((function(t){var l,a,r=Object(h.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(f.a)(s),p.rightPoint=Object(f.a)(d),p.leftJoints=Object(f.a)(o),p.rightJoints=Object(f.a)(i);break}}}catch(y){r.e(y)}finally{r.f()}t.resizeHandleType=null,(l=t.elements).push.apply(l,Object(f.a)(e.autoDeletedElements)),t.deletedRoofId=null,t.autoDeletedChild=null,t.autoDeletedRoof=null})),o[0]!==n[0]&&N((function(t){var l,a=Object(h.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!==kp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&N((function(t){var l,a=Object(h.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!==kp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),st.current=kp.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(N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(i),d.rightJoints=Object(f.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&N((function(t){var a,o=Object(h.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===kp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&N((function(t){var l,o=Object(h.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===kp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var n=Y(this.newJoints[0][0]);n&&Dl(n);break;case kp.right:var c=Y(this.newJoints[1][0]);c&&Rl(c)}var s=new Set(this.autoDeletedElements.map((function(e){return e.id})));N((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)})),st.current=kp.null}};we(i),cl.current=!1,N((function(e){e.autoDeletedRoof=null,e.autoDeletedChild=null}))}}}),100),wl=function(e){Kt.x=e.offsetX/Ye.clientWidth*2-1,Kt.y=-e.offsetY/Ye.clientHeight*2+1,qt.setFromCamera(Kt,Oe)},xl=Object(r.useMemo)((function(){var e;switch(I){case se.Texture01:e=ty;break;case se.Texture02:e=ly;break;case se.Texture03:e=ay;break;case se.Texture04:e=oy;break;case se.Texture05:e=iy;break;case se.Texture06:e=ry;break;case se.Texture07:e=ny;break;default:e=Tf}return(new We.TextureLoader).load(e,(function(e){e.wrapS=e.wrapT=We.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),Tl(e)}))}),[I,y,m]),vl=Object(r.useState)(xl),bl=Object(u.a)(vl,2),Al=bl[0],Tl=bl[1],Pl=Object(r.useCallback)((function(e,t){bf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(N((function(e){e.hoveredHandle=t})),Ww.isMoveHandle(t)?Ye.style.cursor="move":t===q.Lower||t===q.Upper?Ye.style.cursor="grab":Ye.style.cursor=Xw.getState().addedFoundationId?"crosshair":"pointer")}),[]),Sl=Object(r.useCallback)((function(){N((function(e){e.hoveredHandle=null})),Ye.style.cursor=Xw.getState().addedFoundationId?"crosshair":"default"}),[]),Hl=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}},jl=function(e,t){var l=t,a=null,o=null,i=null,r=void 0;if(!Xw.getState().enableFineGrid){var n,c=Object(h.a)(dt.current);try{for(c.s();!(n=c.n()).done;){var s,d,f=Object(u.a)(n.value,2),p=f[0],y=f[1];if(!(p===it.current||wt.current&&p===wt.current.id)){var g=new We.Vector3(y.leftPoint[0],y.leftPoint[1],0),m=new We.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}},zl=function(e){dt.current.clear();var t,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&a.parentId===n&&dt.current.set(a.id,a)}}catch(r){l.e(r)}finally{l.f()}for(var o=dt.current.get(e),i=function(){var t=dt.current.get(o.id);return t?(N((function(e){var l,a=Object(h.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(f.a)(t.rightPoint),i.rightPoint=Object(f.a)(t.leftPoint),i.leftJoints=[t.rightJoints[0]],i.rightJoints=[t.leftJoints[0]];break}}}catch(r){a.e(r)}finally{a.f()}})),(o=dt.current.get(o.leftJoints[0]))&&o.id===e?"break":void 0):"break"};o&&o.leftJoints.length>0;){if("break"===i())break}N((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,Xw.getState().resizeHandleType&&(e.resizeHandleType=Xw.getState().resizeHandleType===K.LowerLeft?K.LowerRight:K.LowerLeft)})),st.current=st.current===kp.null?kp.loop:kp.null},Rl=function(e,t){dt.current.clear();var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&dt.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=dt.current.get(r.id);if(!e)return"break";N((function(t){var l,a=Object(h.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(f.a)(e.rightPoint),i.rightPoint=Object(f.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=dt.current.get(e.leftJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}N((function(e){if(t){var l,a=Object(h.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})),st.current=st.current===kp.null?kp.right:kp.null},Dl=function(e,t){dt.current.clear();var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&dt.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=dt.current.get(r.id);if(!e)return"break";N((function(t){var l,a=Object(h.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(f.a)(e.rightPoint),i.rightPoint=Object(f.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=dt.current.get(e.rightJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}N((function(e){if(t){var l,a=Object(h.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})),st.current=st.current===kp.null?kp.left:kp.null},Wl=function(e){var t=void 0;dt.current.clear();var l,a=Object(h.a)(Xw.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&&dt.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=dt.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=dt.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?zl(e):st.current!==kp.null&&(st.current=kp.loop)}return i},Ml=Object(r.useRef)(null),Il=Object(r.useRef)(null),Cl=Object(r.useRef)(!1),Fl=Object(r.useRef)(!1),kl=Object(r.useRef)(!1),Ol=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},Yl=function(e,t){var l,a=null,o=null,i=1/0,r=1/0,n=Object(h.a)(dt.current);try{for(n.s();!(l=n.n()).done;){var c=Object(u.a)(l.value,2),s=(c[0],c[1]);if(null!==wt.current&&s.id!==wt.current.id&&s.id!==t){var d=Math.abs(e.x-s.leftPoint[0]),f=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(h.a)(dt.current);try{for(c.s();!(t=c.n()).done;){var s=Object(u.a)(t.value,2),d=(s[0],s[1]);if(null!==wt.current&&d.id!==wt.current.id&&d.id!==a){var f=Math.abs(e.x-d.leftPoint[0]),p=Math.abs(e.x-d.rightPoint[0]);f<.01&&ft.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,Ww.isSolarCollectorWithinHorizontalSurface(r,e)},Bl=ye?O?.25:.75:1;return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{ref:gt,name:"".concat(Pg," ").concat(n),userData:{aabb:!0},position:[c,s,_t],rotation:[0,0,b[2]],children:[Object(pf.jsxs)(Lt.a,{castShadow:he,receiveShadow:he,uuid:n,userData:{simulation:!0,stand:!0},ref:mt,name:"Foundation",args:[y,m,x],onContextMenu:function(e){N((function(t){(_y.selectMe(t,n,e,X.Select),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===mt.current&&(t.contextMenuObjectType=V.Foundation);t.pasteNormal=Rt}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===mt.current&&Ee(!0))},onPointerDown:function(t){if(2!==t.button){N((function(e){e.contextMenuObjectType=null})),Xw.getState().objectTypeToAdd===V.Window||xe()||ne(n,t,X.Select);var l=L(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Xw.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===n||a)if(Xw.getState().groupActionMode&&Xw.getState().setGroupMasterId(n),Hl(Xw.getState().objectTypeToAdd)){if(e){Qe(!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(){N((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};we(t)}(i),N((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None)}))}}else Nt.getState().selectNone(),Nt.setState((function(e){e.foundationRef=gt}));else if(l&&l.parentId===n&&Hl(l.type))switch(wt.current=l,l.type!==V.Wall||rt.current||(ct.current=Object(f.a)(Xw.getState().elements)),Qe(!0),It.current.set(l.cx,l.cy,l.cz),Ft.current.set(l.lx,l.ly,l.lz),l.type){case V.SolarPanel:case V.ParabolicTrough:case V.FresnelReflector:Ot.current=l.relativeAzimuth;break;case V.Polygon:Ut.current=l.vertices.map((function(e){return Object(d.a)({},e)}));break;case V.Wall:var r=l;Ot.current=r.relativeAngle,Vt.current=[Object(f.a)(r.leftJoints),Object(f.a)(r.rightJoints)],Gt.current=[Object(f.a)(r.leftPoint),Object(f.a)(r.rightPoint)],Ml.current=r.leftJoints[0],Il.current=r.rightJoints[0],dt.current.clear();var c,s=Object(h.a)(Xw.getState().elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;u.type===V.Wall&&u.parentId===n&&dt.current.set(u.id,u)}}catch(T){s.e(T)}finally{s.f()}}if(rt.current&&it.current&&mt.current){var p=qt.intersectObjects([mt.current]);if(0===p.length)return;var y=Ww.wallRelativePosition(p[0].point,e);at[0].position&&(y.setX(at[0].position[0]),y.setY(at[0].position[1]));var g=jl(y,1.5),m=g.id,w=g.point,x=g.side,v=g.jointId;y=function(e,t){return Xw.getState().enableFineGrid?(e=Ww.snapToFineGrid(e),t=null):e=t||Ww.snapToNormalGrid(e),e}(y,w);var b=K.LowerRight;if(m){var A=Y(m);x===pe.Right?N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===it.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=it.current?[it.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})):x!==pe.Left||v||(N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===it.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=it.current?[it.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})),b=K.LowerLeft)}else U(it.current,y.x,y.y);rt.current=!1,nt.current=!0,ee(it.current,[y.x,y.y,y.z]),N((function(t){t.resizeHandleType=b,t.resizeAnchor=Ww.wallAbsolutePosition(y,e)})),Nt.getState().setEnableOrbitController(!1),wt.current=l}}else t.altKey&&ne(n,t,X.Select)},onPointerUp:function(e){if(e.altKey&&2===e.button&&ie&&ie.length>0){N((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(h.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(){N((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(l.pastedElements)),e.selectedElement=l.pastedElements[0]}))}};we(l)}}if(wt.current&&wt.current.parentId===n&&wt.current.type!==V.Tree&&wt.current.type!==V.Flower&&wt.current.type!==V.Human){var a=Y(wt.current.id);if(a){switch(a.type){case V.Wall:var o=a;if(rt.current)N((function(e){e.elements.pop(),e.addedWallId=null,e.actionModeLock&&(e.objectTypeToAdd=V.Wall,_y.selectNone(e))})),it.current&&dt.current.delete(it.current),it.current=null,rt.current=!1,nt.current=!1;else if(nt.current&&it.current&&mt.current)Nt.getState().setEnableOrbitController(!0),N((function(e){e.actionModeLock&&(e.objectTypeToAdd=V.Wall,_y.selectNone(e)),e.addedWallId=null,0===o.lx&&ct.current?(e.elements=Object(f.a)(ct.current),it.current&&dt.current.delete(it.current)):(!function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,flippedWallSide:st.current,undo:function(){var e=t.addedElement;if(re(e.id,!1),(t.flippedWallSide===kp.right||t.flippedWallSide===kp.loop)&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Dl(l)}else if(t.flippedWallSide===kp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Rl(a)}},redo:function(){var e=t.addedElement;if(t.flippedWallSide===kp.right||t.flippedWallSide===kp.loop&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Rl(l)}else if(t.flippedWallSide===kp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Dl(a)}e.rightJoints.length>0&&Z(e.rightJoints[0],[e.id]),e.leftJoints.length>0&&_(e.leftJoints[0],[e.id]),N((function(t){t.elements.push(e),t.selectedElement=e,t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}))}};we(t)}(o),dt.current.set(o.id,o))})),it.current=null,nt.current=!1;else if(Xw.getState().resizeHandleType)o.lx>.45?(dt.current.set(o.id,o),Ct.current.set(o.cx,o.cy,o.cz),kt.current.set(o.lx,o.ly,o.lz),Yt.current=o.relativeAngle,Jt.current=[Object(f.a)(o.leftJoints),Object(f.a)(o.rightJoints)],Xt.current=[Object(f.a)(o.leftPoint),Object(f.a)(o.rightPoint)],function(e){var t=Xw.getState().getAutoDeletedElements(),l={name:"Resize Wall",timestamp:Date.now(),resizedElementId:e.id,resizedElementType:e.type,oldPosition:It.current.clone(),newPosition:Ct.current.clone(),oldDimension:Ft.current.clone(),newDimension:kt.current.clone(),oldAngle:Ot.current,newAngle:Yt.current,oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(Jt.current[0]),Object(f.a)(Jt.current[1])],oldPoint:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoint:[Object(f.a)(Xt.current[0]),Object(f.a)(Xt.current[1])],flippedWallSide:st.current,autoDeletedElement:t?Object(f.a)(t):[],undo:function(){switch(l.flippedWallSide){case kp.right:if(l.newJoints[1]){var e=Y(l.newJoints[1][0]);e&&Dl(e)}break;case kp.left:if(l.newJoints[0]){var t=Y(l.newJoints[0][0]);t&&Rl(t)}break;case kp.loop:if(l.newJoints[0]&&l.newJoints[1])zl(l.resizedElementId);else if(l.newJoints[1]){var a=Y(l.newJoints[1][0]);a&&Dl(a)}else if(l.newJoints[0]){var o=Y(l.newJoints[0][0]);o&&Rl(o)}}N((function(e){var t,a,o=Object(h.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(f.a)(l.oldJoints[0]),r.rightJoints=Object(f.a)(l.oldJoints[1]),r.leftPoint=Object(f.a)(l.oldPoint[0]),r.rightPoint=Object(f.a)(l.oldPoint[1]),l.flippedWallSide){case kp.loop:if(l.oldJoints[0]!==l.newJoints[1]){var n,c=Object(h.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(h.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 kp.left:case kp.right:if(!l.oldJoints[0]&&l.newJoints[1]){var y,g=Object(h.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(h.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===kp.left&&l.oldJoints[0]){var b,A=Object(h.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===kp.right&&l.oldJoints[1]){var P,S=Object(h.a)(e.elements);try{for(S.s();!(P=S.n()).done;){var H=P.value;H.type===V.Wall&&(H.id===l.newJoints[0][0]&&(H.rightJoints=[]),H.id===l.oldJoints[1][0]&&(H.leftJoints=[r.id]))}}catch(I){S.e(I)}finally{S.f()}}break;case kp.null:if(l.oldJoints[0]!==l.newJoints[0]){var j,z=Object(h.a)(e.elements);try{for(z.s();!(j=z.n()).done;){var R=j.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,W=Object(h.a)(e.elements);try{for(W.s();!(D=W.n()).done;){var M=D.value;M.type===V.Wall&&(M.id===l.newJoints[1][0]&&(M.leftJoints=[]),M.id===l.oldJoints[1][0]&&(M.leftJoints=[r.id]))}}catch(I){W.e(I)}finally{W.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}break}}}catch(I){o.e(I)}finally{o.f()}(t=e.elements).push.apply(t,Object(f.a)(l.autoDeletedElement)),e.resizeHandleType=null,e.deletedRoofId=null,e.autoDeletedRoof=null,e.autoDeletedChild=null})),st.current=kp.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(N((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var a,o=Object(h.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 kp.left:r.relativeAngle=(l.newAngle+Math.PI)%bt;var n,c=Object(h.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 kp.right:r.relativeAngle=(l.newAngle+Math.PI)%bt;var d,u=Object(h.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 kp.loop:r.relativeAngle=(l.newAngle+Math.PI)%bt,r.leftJoints=Object(f.a)(l.newJoints[1]),r.rightJoints=Object(f.a)(l.newJoints[0]),r.leftPoint=Object(f.a)(l.newPoint[1]),r.rightPoint=Object(f.a)(l.newPoint[0]);var y,g=Object(h.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 kp.null:if(r.relativeAngle=l.newAngle,r.leftJoints=Object(f.a)(l.newJoints[0]),r.rightJoints=Object(f.a)(l.newJoints[1]),r.leftPoint=Object(f.a)(l.newPoint[0]),r.rightPoint=Object(f.a)(l.newPoint[1]),l.oldJoints[0][0]!==l.newJoints[0][0]){var w,x=Object(h.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(h.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(){N((function(e){e.deletedRoofId=null,e.autoDeletedRoof=null}))})),l.flippedWallSide){case kp.left:var t=Y(l.resizedElementId),a=Y(l.newJoints[1][0]);Dl(t,a);break;case kp.right:var o=Y(l.resizedElementId),i=Y(l.newJoints[0][0]);Rl(o,i);break;case kp.loop:dt.current.clear();var r,c=Object(h.a)(Xw.getState().elements);try{for(c.s();!(r=c.n()).done;){var s=r.value;s.type===V.Wall&&s.parentId===n&&dt.current.set(s.id,s)}}catch(d){c.e(d)}finally{c.f()}zl(l.resizedElementId)}st.current=kp.null}};we(l),N((function(t){t.actionState.wallHeight=e.lz,t.deletedRoofId=null,t.autoDeletedRoof=null,t.autoDeletedChild=[]}))}(o)):N((function(e){ct.current&&(e.elements=Object(f.a)(ct.current),ct.current=null)}));else if(Xw.getState().moveHandleType){var i=o.relativeAngle,r=[],c=[];if(Ml.current)if(o.leftJoints.length>0&&(Ml.current!==o.leftJoints[0]||Ml.current===o.leftJoints[0]&&Cl.current)&&_(o.leftJoints[0],[]),Cl.current)Z(Ml.current,[o.id]),c=[Ml.current];else if(r=[Ml.current],kl.current){Z(Ml.current,[o.id]);var s=Y(Ml.current);s&&Dl(s)}else _(Ml.current,[o.id]);else o.leftJoints.length>0&&o.leftJoints[0]!==Il.current&&(r=[],_(o.leftJoints[0],[]));if(Il.current)if(o.rightJoints.length>0&&(Il.current!==o.rightJoints[0]||Il.current===o.rightJoints[0]&&Cl.current)&&o.rightJoints[0]!==Ml.current&&Z(o.rightJoints[0],[]),Cl.current)_(Il.current,[o.id]),r=[Il.current];else if(c=[Il.current],Fl.current){_(Il.current,[o.id]);var p=Y(Il.current);p&&Rl(p)}else Z(Il.current,[o.id]);else o.rightJoints.length>0&&o.rightJoints[0]!==Ml.current&&(c=[],Z(o.rightJoints[0],[]));N((function(e){var t,l=Object(h.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(Cl.current){i=(n.relativeAngle+Math.PI)%bt,n.relativeAngle=i;var s=[Object(f.a)(n.rightPoint),Object(f.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(f.a)(r),n.rightJoints=Object(f.a)(c);break}}}catch(p){l.e(p)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Wl(o.id),function(e,t,l){if(e.roofId)cl.current=!0,sl.current={wall:e,newAngle:t,newJoints:[Object(f.a)(l[0]),Object(f.a)(l[1])]};else{var a={name:"Move Wall",timestamp:Date.now(),id:e.id,oldPoints:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoints:[Object(f.a)(e.leftPoint),Object(f.a)(e.rightPoint)],oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(l[0]),Object(f.a)(l[1])],oldAngle:Ot.current,newAngle:t,flippedWallSide:st.current,undo:function(){var e=this;switch(this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var t=Y(this.newJoints[0][0]);t&&Rl(t);break;case kp.right:var l=Y(this.newJoints[1][0]);l&&Dl(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];N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(o),d.rightJoints=Object(f.a)(i);break}}}catch(p){a.e(p)}finally{a.f()}t.resizeHandleType=null})),o[0]!==n[0]&&N((function(t){var l,a=Object(h.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!==kp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&N((function(t){var l,a=Object(h.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!==kp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),st.current=kp.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(N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(i),d.rightJoints=Object(f.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&N((function(t){var a,o=Object(h.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===kp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&N((function(t){var l,o=Object(h.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===kp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var n=Y(this.newJoints[0][0]);n&&Dl(n);break;case kp.right:var c=Y(this.newJoints[1][0]);c&&Rl(c)}N((function(e){e.resizeHandleType=null})),st.current=kp.null}};we(a)}}(o,i,[Object(f.a)(r),Object(f.a)(c)]),Cl.current=!1,kl.current=!1,Fl.current=!1,Ml.current=null,Il.current=null}st.current=kp.null,N((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]);break;case V.Polygon:if(Xw.getState().moveHandleType||Xw.getState().resizeHandleType){Et.current=a.vertices.map((function(e){return Object(d.a)({},e)}));var y={name:Xw.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:Ut.current,newValue:Et.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(Xw.getState().resizeHandleType){if(Ct.current.set(a.cx,a.cy,a.cz),kt.current.set(a.lx,a.ly,a.lz),Ct.current.distanceToSquared(It.current)>At||kt.current.distanceToSquared(Ft.current)>At){var g={name:"Resize",timestamp:Date.now(),resizedElementId:wt.current.id,resizedElementType:wt.current.type,oldCx:It.current.x,oldCy:It.current.y,oldCz:It.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:kt.current.x,newLy:kt.current.y,newLz:kt.current.z,undo:function(){U(g.resizedElementId,g.oldCx,g.oldCy,g.oldCz),E(g.resizedElementId,g.oldLx,g.oldLy,g.oldLz)},redo:function(){U(g.resizedElementId,g.newCx,g.newCy,g.newCz),E(g.resizedElementId,g.newLx,g.newLy,g.newLz)}};we(g)}}else if(Xw.getState().rotateHandleType){if(Ww.isSolarCollector(wt.current)){var m=wt.current;if(Math.abs(Yt.current-Ot.current)>At)if(Gl(m,Yt.current)){N((function(e){e.selectedElementAngle=Yt.current}));var w={name:"Rotate",timestamp:Date.now(),oldValue:Ot.current,newValue:Yt.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,Ot.current)}}else if(Ct.current.set(a.cx,a.cy,a.cz),Ct.current.distanceToSquared(It.current)>At){var x=!0;if(Ww.isSolarCollector(a)&&(x=Jl(a,a.cx,a.cy)),x){var v={name:"Move",timestamp:Date.now(),movedElementId:a.id,movedElementType:a.type,oldCx:It.current.x,oldCy:It.current.y,oldCz:It.current.z,newCx:Ct.current.x,newCy:Ct.current.y,newCz:Ct.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,It.current.x,It.current.y,It.current.z)}}Qe(!1),wt.current=null,N((function(e){e.resizeHandleType=null,e.moveHandleType=null}))}}},onPointerMove:function(t){var l,a;if(e&&(!wt.current||!Ww.isSolarCollector(wt.current))){var o=Xw.getState().objectTypeToAdd;if((wt.current||it.current||o===V.Wall)&&((null===(l=wt.current)||void 0===l?void 0:l.parentId)===n||o!==V.None)){var i=Xw.getState().moveHandleType,r=Xw.getState().resizeHandleType,c=Xw.getState().resizeAnchor;if(wl(t),mt.current){var s=qt.intersectObjects([mt.current]);if(0===s.length)return;var p=s[0].point;if(wt.current&&wt.current.type&&!wt.current.locked&&s.length>0)switch(wt.current.type){case V.Sensor:case V.Light:p=Ww.relativeCoordinates(p.x,p.y,p.z,e),U(wt.current.id,p.x,p.y);break;case V.Polygon:var y=wt.current;if(i===B.Default){p=Ww.relativeCoordinates(p.x,p.y,p.z,e);var g=Ww.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 We.Euler).fromArray(e.rotation.map((function(e){return-e})))),(p=Xw.getState().enableFineGrid?Ww.snapToFineGrid(p):Ww.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=Xw.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(wt.current.id);if(v){p=Ww.wallRelativePosition(p,e);var b=new We.Vector3,A=new We.Euler(0,0,v.relativeAngle);i===B.Lower?b.setY(al):i===B.Upper&&b.setY(-al-v.ly),p.add(b.applyEuler(A));var T=(new We.Vector3).addVectors(p,new We.Vector3(-v.lx/2,0,0).applyEuler(A)),P=(new We.Vector3).addVectors(p,new We.Vector3(v.lx/2,0,0).applyEuler(A)),S=null,H=null,j=!1;Cl.current=!1,kl.current=!1,Fl.current=!1,Ml.current=null,Il.current=null;var z=function(e,t){var l="left"===t?T:P,a=(new We.Vector3).subVectors(e,l);p.add(a),T.add(a),P.add(a)};if(!Xw.getState().enableFineGrid){var R=jl(T,1);R.point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Ml.current=R.id,S=R.side===pe.Left)):Ml.current=null;var D=jl(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||(Il.current=D.id,H=D.side===pe.Right)):Il.current=null,!R.point&&!D.point){var W=Yl(T),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Yl(P),k=Object(u.a)(F,2),O=k[0],L=k[1];if(null!==I||null!==O){var E=(null!==I&&void 0!==I?I:1/0)-T.x,J=(null!==O&&void 0!==O?O:1/0)-P.x,G=Math.min(E,J);T.setX(T.x+G),P.setX(P.x+G),p.setX(p.x+G),(R=jl(T,1)).point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Ml.current=R.id,S=R.side===pe.Left)):Ml.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=jl(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||(Il.current=D.id,H=D.side===pe.Right)):Il.current=null}}var Z=Ul(T,0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Ul(P,1),oe=Object(u.a)(te,2),ie=oe[0],re=oe[1];ot(Object(Pe.a)((function(e){e[0].show=$||ee,e[1].show=ie||re}))),S&&null===H||H&&null===S||S&&H?Cl.current=!0:(S&&!1===H||H&&!1===S)&&(kl.current=S,Fl.current=H),R.point&&D.point&&(R.id===D.id&&R.side===D.side||(T.copy(R.point),P.copy(D.point),j=!0))}N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,o=t.value;if(o.id===(null===(a=wt.current)||void 0===a?void 0:a.id)&&o.type===V.Wall){var i=o;if(j){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=Ww.wallRelativePosition(c,e);p=Ww.wallRelativePosition(p,e);var se,de,ue=null;if(Xw.getState().enableFineGrid)p=Ww.snapToFineGrid(p);else if(null===(se=ue=jl(p,1.5))||void 0===se?void 0:se.point)p=ue.point;else p=Ww.snapToNormalGrid(p),p=Ll(ne,p,r),(null===(de=ue=jl(p,1.5))||void 0===de?void 0:de.point)&&(p=ue.point);var fe=Ol(ne,p,r);Vl(p,fe);var he=p.distanceTo(ne),ye=(new We.Vector3).addVectors(p,ne).divideScalar(2),ge=r===K.LowerLeft?p:ne,me=r===K.LowerLeft?ne:p;N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===wt.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(wt.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];N((function(e){var t,l=Object(h.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()}}))}Dl(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];N((function(e){var t,l=Object(h.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()}}))}Rl(we,xe)}else r===K.LowerRight&&ue.side===pe.Left&&0===xe.leftJoints.length&&xe.rightJoints[0]!==we.id?N((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(h.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&&N((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(h.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()}}));Wl(we.id)}}}else if(r===K.LowerRight&&we.rightJoints.length>0){var Ae=we.rightJoints[0];N((function(e){var t,l=Object(h.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];N((function(e){var t,l=Object(h.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&&!rt.current){ct.current=Object(f.a)(Xw.getState().elements);var Se=ce(e,p);wt.current=Se,it.current=Se.id,rt.current=!0,Qe(!0),Nt.getState().setEnableOrbitController(!1),N((function(e){e.addedWallId=Se.id,e.objectTypeToAdd=V.None}))}if(it.current&&rt.current){p=Ww.wallRelativePosition(s[0].point,e);var He,je=null;if(Xw.getState().enableFineGrid)p=Ww.snapToFineGrid(p);else if(null===(He=je=jl(p,1.5))||void 0===He?void 0:He.point)p=je.point;else{var ze;p=Ww.snapToNormalGrid(p);var Re=Yl(p),De=Object(u.a)(Re,2),Me=De[0],Ie=De[1];null!==Me&&p.setX(Me),null!==Ie&&p.setY(Ie),(null===(ze=je=jl(p,1.5))||void 0===ze?void 0:ze.point)&&(p=je.point)}var Ce=Ul(p),Fe=Object(u.a)(Ce,2),ke=Fe[0],Oe=Fe[1];ot(Object(Pe.a)((function(e){e[0].show=ke||Oe}))),U(it.current,p.x,p.y)}}}}},onPointerOut:function(){Ee(!1),Qe(!1),wt.current&&rt.current&&(re(wt.current.id,!1),rt.current=!1,N((function(e){e.addedWallId=null,e.objectTypeToAdd=V.Wall})),wt.current=null),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}])},onPointerEnter:function(e){wt.current&&Ww.isPlantOrHuman(wt.current)&&(e.intersections[0].object===mt.current&&Qe(!0))},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Ae&&Ge?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",color:"white",map:Ge,transparent:ye,opacity:Bl}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:I===se.NoTexture?T:"white",map:Al,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl})]}),wt.current&&Ww.isSolarCollector(wt.current)&&!wt.current.locked&&Object(pf.jsx)(Lt.f,{ref:xt,name:"Foundation Intersection Plane",position:fl,args:[y,m],visible:!1,onPointerMove:function(t){if(xt.current&&e&&wt.current&&e){if(!Ww.isSolarCollector(wt.current))return;var l=wt.current;wl(t);var a=qt.intersectObjects([xt.current]);if(a.length>0){var o=a[0].point,i=Xw.getState().moveHandleType,r=Xw.getState().rotateHandleType,n=Xw.getState().resizeHandleType;if(i&&e)o=Ww.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 We.Vector2(e.cx,e.cy),f=new We.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,d),h=(new We.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),Yt.current=g}}else if(n){var w=Xw.getState().resizeAnchor,x=new We.Vector2(o.x,o.y),v=new We.Vector2(w.x,w.y),A=x.distanceTo(v),T=l.relativeAzimuth+b[2],P=(new We.Vector2).subVectors(x,v),S=new We.Vector2(c,s);if(l.type===V.SolarPanel){var H=l,j=de(H.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(H.orientation===$.portrait)D=Math.max(1,Math.ceil((D-j.length/2)/j.length))*j.length;else D=Math.max(1,Math.ceil((D-j.width/2)/j.width))*j.width;var W=w.x+z*(D*Math.sin(T))/2,M=w.y-z*(D*Math.cos(T))/2,I=new We.Vector2(W,M),C=(new We.Vector2).subVectors(I,S).rotateAround(Dt,-b[2]),F=C.x/y,k=C.y/m;Xl(l,F,k,l.lx,D)&&(Q(l.id,D),U(l.id,F,k));break;case K.Left:case K.Right:var O=n===K.Left?-1:1,Y=P.angle()-T+(n===K.Left?Math.PI:0),L=A*Math.cos(Y);if(H.orientation===$.portrait)L=Math.max(1,Math.ceil((L-j.width/2)/j.width))*j.width;else L=Math.max(1,Math.ceil((L-j.length/2)/j.length))*j.length;var E=w.x+O*(L*Math.cos(T))/2,G=w.y+O*(L*Math.sin(T))/2,X=new We.Vector2(E,G),B=(new We.Vector2).subVectors(X,S).rotateAround(Dt,-b[2]),Z=B.x/y,_=B.y/m;Xl(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 We.Vector2(ie,re),ce=(new We.Vector2).subVectors(ne,S).rotateAround(Dt,-b[2]),se=ce.x/y,ue=ce.y/m;Xl(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 We.Vector2(ye,ge),we=(new We.Vector2).subVectors(me,S).rotateAround(Dt,-b[2]),xe=we.x/y,ve=we.y/m;Xl(l,xe,ve,pe,l.ly)&&(J(l.id,pe),U(l.id,xe,ve),N((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,He=w.y-Ae*(Pe*Math.cos(T))/2,je=new We.Vector2(Se,He),ze=(new We.Vector2).subVectors(je,S).rotateAround(Dt,-b[2]),Re=ze.x/y,De=ze.y/m;Xl(l,Re,De,l.lx,Pe)&&(Q(l.id,Pe),U(l.id,Re,De));break;case K.Left:case K.Right:var Me=n===K.Left?-1:1,Ie=P.angle()-T+(n===K.Left?Math.PI:0),Ce=A*Math.cos(Ie),Fe=w.x+Me*(Ce*Math.cos(T))/2,ke=w.y+Me*(Ce*Math.sin(T))/2,Oe=new We.Vector2(Fe,ke),Ye=(new We.Vector2).subVectors(Oe,S).rotateAround(Dt,-b[2]),Le=Ye.x/y,Ne=Ye.y/m;Xl(l,Le,Ne,Ce,l.ly)&&(J(l.id,Ce),U(l.id,Le,Ne),N((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 Ee=Math.min(10,A);Xl(l,Ue.cx,Ue.cy,l.lx,Ee)&&(J(l.id,Ee),Q(l.id,Ee),N((function(e){e.actionState.parabolicDishRimDiameter=Ee})))}}}}}},onPointerOut:function(){if(wt.current&&Ww.isSolarCollector(wt.current)){var e=Xw.getState().getElementById(wt.current.id);Xw.getState().moveHandleType&&!Jl(e,e.cx,e.cy)&&U(e.id,It.current.x,It.current.y,It.current.z)}}}),qe&&Object(pf.jsxs)(pf.Fragment,{children:[Xw.getState().rotateHandleType&&wt.current&&Ww.isSolarCollector(wt.current)&&Object(pf.jsx)(sy,{element:wt.current,height:wt.current.poleHeight+_t}),(Xw.getState().moveHandleType||Xw.getState().resizeHandleType||it.current)&&Object(pf.jsx)(yf,{hx:Qt,hy:Zt,hz:_t})]}),F&&Object(pf.jsx)(yy,{element:e,verticalLift:ol}),(!F||ye)&&Object(pf.jsx)(hy,{hx:Qt,hy:Zt,hz:_t,lineColor:ye&&O?"white":S,lineWidth:ye&&O?3*j:j}),F&&R&&Object(pf.jsx)(hy,{hx:Qt,hy:Zt,hz:_t,lineColor:yt,lineWidth:5*j}),$e.show&&Object(pf.jsx)("group",{position:[0,0,_t+.01],children:Object(pf.jsx)(Hg,{hx:Qt,hy:Zt,position:$e.position,direction:$e.direction,color:"black"})}),Object(pf.jsx)("group",{position:[0,0,_t+.01],children:at.map((function(e,t){return e.show?Object(pf.jsx)(Hg,{hx:Qt,hy:Zt,position:e.position,direction:e.direction,color:"yellow"},t):null}))}),F&&!R&&!ze&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.a,{ref:Tt,position:[$t.x,$t.y,0],args:[il,il,1.2*x],name:K.LowerLeft,onPointerDown:function(e){ne(n,e,X.Resize),Tt.current&&N((function(e){var t=Tt.current.localToWorld(new We.Vector3(y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.LowerLeft)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerLeft||Xw.getState().resizeHandleType===K.LowerLeft?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Pt,position:[el.x,el.y,0],args:[il,il,1.2*x],name:K.UpperLeft,onPointerDown:function(e){ne(n,e,X.Resize),Pt.current&&N((function(e){var t=Pt.current.localToWorld(new We.Vector3(y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.UpperLeft)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperLeft||Xw.getState().resizeHandleType===K.UpperLeft?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:St,position:[tl.x,tl.y,0],args:[il,il,1.2*x],name:K.LowerRight,onPointerDown:function(e){ne(n,e,X.Resize),St.current&&N((function(e){var t=St.current.localToWorld(new We.Vector3(-y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.LowerRight)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerRight||Xw.getState().resizeHandleType===K.LowerRight?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Ht,position:[ll.x,ll.y,0],args:[il,il,1.2*x],name:K.UpperRight,onPointerDown:function(e){ne(n,e,X.Resize),Ht.current&&N((function(e){var t=Ht.current.localToWorld(new We.Vector3(-y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.UpperRight)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperRight||Xw.getState().resizeHandleType===K.UpperRight?pt:ht})}),!ge&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:jt,args:[ol,6,6,0,Math.PI],position:[0,-Zt-ol,0],name:B.Lower,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Lower)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Lower||Xw.getState().moveHandleType===B.Lower?pt:ft})}),Object(pf.jsx)(Lt.h,{ref:zt,args:[ol,6,6,0,Math.PI],position:[0,Zt+ol,0],name:B.Upper,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Upper)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Upper||Xw.getState().moveHandleType===B.Upper?pt:ft})}),Object(pf.jsx)(Lt.h,{ref:Wt,args:[ol,6,6,0,Math.PI],position:[-Qt-ol,0,0],name:B.Left,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Left)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Left||Xw.getState().moveHandleType===B.Left?pt:ut})}),Object(pf.jsx)(Lt.h,{ref:Mt,args:[ol,6,6,0,Math.PI],position:[Qt+ol,0,0],name:B.Right,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Right)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Right||Xw.getState().moveHandleType===B.Right?pt:ut})}),Object(pf.jsx)(uy,{id:n,position:[0,-nl,0],color:be===q.Lower||Xw.getState().rotateHandleType===q.Lower?pt:ht,ratio:rl,handleType:q.Lower,hoverHandle:Pl,noHoverHandle:Sl}),Object(pf.jsx)(uy,{id:n,position:[0,nl,0],color:be===q.Upper||Xw.getState().rotateHandleType===q.Upper?pt:ht,ratio:rl,handleType:q.Upper,hoverHandle:Pl,noHoverHandle:Sl})]})]}),!ge&&Object(pf.jsxs)(pf.Fragment,{children:[(Ue||W)&&!F&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.FoundationElement",Bt))+(R?" ("+me.t("shared.ElementLocked",Bt)+")":""),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:_t+.2]}),!R&&be===K.LowerLeft&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LL",text:"LL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Qt,-Zt,_t+.2]}),!R&&be===K.UpperLeft&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UL",text:"UL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Qt,Zt,_t+.2]}),!R&&be===K.LowerRight&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LR",text:"LR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Qt,-Zt,_t+.2]}),!R&&be===K.UpperRight&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UR",text:"UR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Qt,Zt,_t+.2]})]}),C===G.FocusPipe&&Object(pf.jsx)(Jy,{foundation:e}),C===G.FocusTower&&Object(pf.jsx)(Ey,{foundation:e}),C===G.UpdraftTower&&Object(pf.jsx)(Yy,{foundation:e}),Object(pf.jsx)(Tg,Object(d.a)({},e))]}),F&&!R&&ze===n&&e&&Ie&&Object(pf.jsx)(Zy,{baseGroupSet:De,childCuboidSet:Me,initalPosition:Ce,initalDimension:Ie,initalRotation:Fe})]})},Hg=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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[[-t,c,0],[t,c,0]],color:i}),Object(pf.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(pf.jsx)(Jl.a,{points:s,color:i})},jg=n.a.memo(Sg),zg="Handles Intersection Plane",Rg=function(e){if(e.intersections.length>0){var t,l=Object(h.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.eventObject.name===zg)return a.point.z<0?null:a.point}}catch(o){l.e(o)}finally{l.f()}}return null},Dg=function(e,t){return(new We.Vector3).subVectors(e,new We.Vector3(t.cx,t.cy,t.lz)).applyEuler(new We.Euler(0,0,-t.rotation[2]))},Wg=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 We.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 We.Vector3(i*p,0,r*y).applyEuler(f),m=(new We.Vector3).addVectors(e,g);if(!Ww.isPointInside(m.x,m.y,h))return!1}return!0},Mg=function(e){switch(e){case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:return!0}return!1},Ig=function(e,t,l){Xw.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(f.a)(l)}}))},Cg=function(e,t,l,a){Xw.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)}}))},Fg=function(e,t){Xw.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Window}));a&&(a.polygonTop=Object(f.a)(t))}))},kg=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 We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"])),o=new We.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 We.Vector3(c*i,c*s*r).applyEuler(a).add(o);n.push(d)}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var h,p=null!==(h=e.polygonTop)&&void 0!==h?h:Zg,y=Object(u.a)(p,2),g=y[0],m=y[1],w=new We.Vector3(g*i,m+r).applyEuler(a).add(o);n.push(w)}return n},Og=function(e){var t;if(e.windowType===Yt.Polygonal)return null!==(t=e.polygonTop)&&void 0!==t?t:Zg},Yg=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(pf.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(pf.jsx)("meshBasicMaterial",{color:i})})},Lg=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=Xw((function(e){return e.addedWindowId})),y=Xw(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),H=Object(r.useRef)([]),j=Object(r.useRef)(null),z=Object(r.useRef)(null),R=Object(r.useRef)(null),D=Object(r.useRef)(null),W=Object(r.useRef)(null),M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=o/2,O=i/2,Y=Object(u.a)(n,2),L=Y[0],N=Y[1],U=Object(r.useMemo)((function(){return o*L}),[o,L]),E=Xw(si),J=function(e,t,l){if(!a)return null;var o=Xw.getState().elements.find((function(e){return e.id===a&&e.type===V.Foundation}));if(!o)return null;var i=e.object.localToWorld(new We.Vector3),r=Object(u.a)(c,3),n=r[0],s=r[1],d=r[2],f=(new We.Euler).fromArray([n-vt,s,d+o.rotation[2],"ZXY"]),h=new We.Vector3(t,0,l).applyEuler(f);return(new We.Vector3).addVectors(i,h)},G=function(e){var o,i,r,n,c,s=Object(h.a)(Xw.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(N){s.e(N)}finally{s.f()}var u=Nt.getState().contentRef;if(i&&r&&n&&u&&u.current){var p=r.id,y=u.current.children.find((function(e){return e.name==="".concat(Pg," ").concat(p)}));if(y){var g=y.children.find((function(e){return e.name===vg}));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 M,I=Object(h.a)(Xw.getState().elements);try{for(I.s();!(M=I.n()).done;){var C=M.value;if(C.parentId===l&&C.id!==t){var F=kg(C,r);F&&H.current.push(F)}}}catch(N){I.e(N)}finally{I.f()}var k=P.userData,O=k.centroid,Y=k.roofSegments,L=new We.Vector3(i.cx,i.cy,i.cz+r.lz).clone().sub(O);w.current=e,x.current=r,v.current=n,T.current=Zm.getSegmentIdx(Y,L),A.current=O,b.current=Y,S.current=function(e,t,l){return l===It.Gambrel?_p(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),j.current=[i.cx,i.cy,i.cz],R.current=[i.lx,i.ly,i.lz],z.current=Object(f.a)(i.rotation),D.current=i.archHeight,W.current=null!==(o=i.polygonTop)&&void 0!==o?o:null}}}}}},X=function(){if(R.current&&j.current){var e=Xw.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(f.a)(j.current),newPosition:[e.cx,e.cy,e.cz],oldDimension:Object(f.a)(R.current),newDimension:[e.lx,e.ly,e.lz],oldArchHeight:D.current,newArchHeight:e.archHeight,undo:function(){Cg(this.id,this.oldPosition,this.oldDimension,this.oldArchHeight)},redo:function(){Cg(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=Af.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 We.Euler).fromArray([].concat(Object(f.a)(a),["ZXY"])),c=[],s=-1;s<=1;s+=2)for(var d=-1;d<=1;d+=2){var p=new We.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 We.Vector3(g*i*2,m+r).applyEuler(n).add(e);c.push(w)}var x,v=Object(h.a)(H.current);try{for(v.s();!(x=v.n()).done;){var b,A=x.value,T=Object(h.a)(c);try{for(T.s();!(b=T.n()).done;){var P=b.value;if(Ww.isPointInside(P.x,P.y,A))return!1}}catch(R){T.e(R)}finally{T.f()}var S,j=Object(h.a)(A);try{for(j.s();!(S=j.n()).done;){var z=S.value;if(Ww.isPointInside(z.x,z.y,c))return!1}}catch(R){j.e(R)}finally{j.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 We.Euler).fromArray([s-vt,d,f,"ZXY"]),p=r.map((function(e){return{x:e.x,y:e.y}})),y=(new We.Vector3).addVectors(e,new We.Vector3(a*t,0,n+o).applyEuler(h));return!!Ww.isPointInside(y.x,y.y,p)&&!!Wg(e,t,l,i,r)}(t,l,a,r[0],r[1],o,e)}return Wg(t,l,a,o,e)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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),F(!0),Nt.getState().setEnableOrbitController(!1)}},children:[!g&&Object(pf.jsxs)(pf.Fragment,{children:[s===Yt.Polygonal&&Object(pf.jsx)(mf,{x:U,z:O+N,handleType:K.Upper,scale:[.5,1,1.5]}),Object(pf.jsx)(mf,{x:-k,z:O,handleType:K.UpperLeft}),Object(pf.jsx)(mf,{x:k,z:O,handleType:K.UpperRight}),Object(pf.jsx)(mf,{x:-k,z:-O,handleType:K.LowerLeft}),Object(pf.jsx)(mf,{x:k,z:-O,handleType:K.LowerRight}),s===Yt.Arched&&Object(pf.jsx)(Yg,{z:O})]}),Object(pf.jsx)(xf,{handleType:B.Mid})]}),m&&C&&Object(pf.jsx)(Lt.f,{name:zg,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(h.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!==zg)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 We.Vector3;if(q(o)){var n=Rg(e);if(!n)return;r.copy(n);var s=Dg(r,a);E((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=Og(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=Rg(e);if(!u)return;r.copy(u)}var p=Dg(r,a),y=p.clone().sub(A.current),g=Zm.computeState(b.current,y),m=g.rotation,H=g.segmentVertices,j=g.segmentIdx;H?p.setZ(Zm.getRooftopElementZ(H,y,A.current.z+o.thickness)):p.setZ(A.current.z+o.thickness),E((function(e){var a=Af.getState().getRoofSegmentVertices(l);if(a){var o=a[-1===j?a.length-1:j];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=Og(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(f.a)(m),i&&i.segmentIdx!==T.current&&(T.current=i.segmentIdx))}}}}))}}else if(Mg(w.current)){var z=Q(T.current),R=Rg(e),D=P.current;if(!R||!D||!z)return;var W=Dg(R,a),M=function(e,t,l){var a=(new We.Vector3).subVectors(t,e).applyEuler(new We.Euler(0,0,-l));return{newLx:Math.abs(a.x),newLz:Math.hypot(a.y,a.z),newCenter:(new We.Vector3).addVectors(e,t).divideScalar(2)}}(Dg(D,a),W,c[2]),I=M.newLx,C=M.newLz,F=M.newCenter;Xw.getState().set((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=Og(l),o=_(z,F,I,C,c,a),i=Z(F,I,C,c,a);o&&i&&(l.cx=F.x,l.cy=F.y,l.cz=F.z,l.lx=I,l.lz=Math.max(.001,C))}}))}else if(w.current===K.Upper){var k=Q(T.current),O=Rg(e);if(!O||!k)return;var Y=Dg(O,a);E((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 We.Vector3(l.cx,l.cy,l.cz),r=(new We.Euler).fromArray([].concat(Object(f.a)(l.rotation),["ZXY"])),n=new We.Vector3(-a,-o,0).applyEuler(r).add(i),s=new We.Vector3(a,-o,0).applyEuler(r).add(i),d=(new We.Vector3).subVectors(Y,n),u=(new We.Vector3).subVectors(s,n).normalize(),h=d.clone().projectOnVector(u).applyEuler(new We.Euler(0,0,-l.rotation[2])),p=Ww.clamp((h.x-a)/l.lx,-.5,.5),y=Zm.getDistance(n,s,Y),g=Math.hypot(y,Y.z-n.z),m=[p,Math.max(0,g-l.lz)],w=new We.Vector3(l.cx,l.cy,l.cz),x=l.lx,v=l.lz,b=_(k,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=Rg(e),N=P.current,U=Q(T.current);if(!L||!N||!U)return;var J=Dg(L,a),G=Dg(N,a);E((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 We.Vector3(l.cx,l.cy,l.cz),r=(new We.Euler).fromArray([].concat(Object(f.a)(l.rotation),["ZXY"])),n=new We.Vector3(-a,-o,0).applyEuler(r).add(i),s=new We.Vector3(a,-o,0).applyEuler(r).add(i),d=Zm.getDistance(n,s,J),u=Math.hypot(d,J.z-n.z),h=Math.min(l.archHeight,l.lz,l.lx/2),p=l.lz-h;if(u>p&&u0&&Object(pf.jsx)("group",{position:[0,t,0],children:w(c/20,g)}),f&&d&&w(c/5,m)]})})),Gg=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.shutter,f=e.glassMaterial,h=e.showHeatFluxes,p=e.area,y=e.empty,g=e.interior,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Xw(o.shadowEnabled),T=Af(Ai),P=Object(r.useRef)(0),S=Object(r.useRef)(),H=Object(u.a)(l,3),j=H[0],z=H[1],R=H[2],D=Object(u.a)(a,3),W=(D[0],D[1]),M=(D[2],Object(r.useMemo)((function(){var e;if(h&&!g&&(!m||!m.notBuilding)){var l=T.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==p){var o=4*(null!==(e=w.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(j/o)),r=Math.max(2,Math.round(R/o)),n=j/i,c=R/r,s=a/p*(null!==x&&void 0!==x?x:_e);P.current=s<0?1:0,S.current=Ww.getEuler(Rt,jt,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0&&e.intersections[0].eventObject.name===_&&!Xw.getState().moveHandleType&&!Xw.getState().resizeHandleType&&!Xw.getState().isAddingElement()&&Xw.getState().objectTypeToAdd===V.None},re=function(e,t){Nt.getState().setEnableOrbitController(!1),te("showWallIntersectionPlaneId",l),$((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new We.Vector3(i,0,c).add(t))}))},ne=Object(r.useMemo)((function(){if(q===V.Roof){var e=Object(u.a)(p,3),t=e[0],l=e[1],a=e[2];return(new We.Euler).fromArray([t-vt,l,a,"ZXY"])}return new We.Euler}),[q,p]),ce=Object(r.useMemo)((function(){return Object(pf.jsx)("meshPhongMaterial",{specular:new We.Color("white"),shininess:null!==le&&void 0!==le?le:lt,color:j,side:We.DoubleSide,opacity:R,transparent:!0})}),[le,j,R]),se=Object(r.useMemo)((function(){return void 0!==G?[s,d,f,G]:[s,d,f]}),[s,d,f,G]),de=Object(r.useMemo)((function(){return q===V.Roof?[i,.05,c]:[i,n,c]}),[i,n,c,q]),ue=Object(r.useMemo)((function(){return{showMullion:b,width:T,spacingX:S,spacingY:S,color:I}}),[b,T,S,I]),fe=Object(r.useMemo)((function(){return{showFrame:F,width:L,color:O,sillWidth:U}}),[F,L,O,U]),he=Object(r.useMemo)((function(){return{lineColor:x,lineWidth:m,selected:ae,locked:y,opacity:R}}),[x,m,ae,y,R]),pe=bf(Es),ye=q===V.Roof?n:0;return Object(pf.jsxs)("group",{name:_,position:[i,ye,c],rotation:ne,onPointerDown:function(e){if(2!==e.button&&!Xw.getState().addedWallId&&(ie(e)&&oe(),function(e){if(e.eventObject.name===_&&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:Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=l,e.oldParentId=l,e.oldFoundationId=a})),$((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:re(t,new We.Vector3(s/2,0,-f/2));break;case K.UpperRight:re(t,new We.Vector3(-s/2,0,-f/2));break;case K.LowerLeft:re(t,new We.Vector3(s/2,0,f/2));break;case K.LowerRight:re(t,new We.Vector3(-s/2,0,f/2));break;case K.Arch:re(t,new We.Vector3(0,0,0));break;case K.Upper:re(t,new We.Vector3(0,0,f/2))}}},onContextMenu:function(e){Xw.getState().addedWallId||ie(e)&&(oe(),$((function(e){e.contextMenuObjectType=V.Window})))},onPointerMove:function(){},children:[function(){switch(J){case Yt.Default:return Object(pf.jsx)(Xg,{id:e.id,dimension:se,position:de,mullionData:ue,frameData:fe,wireframeData:he,shutter:W,glassMaterial:ce,showHeatFluxes:pe,area:Ww.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:ee(e)});case Yt.Arched:return Object(pf.jsx)(Of,{id:e.id,dimension:se,position:de,mullionData:ue,frameData:fe,wireframeData:he,shutter:W,glassMaterial:ce,showHeatFluxes:pe,area:Ww.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:ee(e)});case Yt.Polygonal:return Object(pf.jsx)(Vf,{id:e.id,dimension:se,polygonTop:Z,position:de,glassMaterial:ce,empty:!!e.empty,interior:!!e.interior,wireframeData:he,frameData:fe,shutter:W,showHeatFluxes:pe,area:Ww.getWindowArea(e),foundation:ee(e)})}}(),ae&&Object(pf.jsx)(Bg,{element:e}),ae&&!y&&Object(pf.jsx)(Ng,{id:t,parentId:l,foundationId:a,lx:s,lz:f,polygonTop:Z,rotation:p,windowType:J,parentType:q})]},t)},$g=n.a.memo(_g),em=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=Xw((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],H=2*i,j=[];if(b)o=2,j.push(P,S);else if(h)j.push(P,A,T,S);else if(s)j.push(A,P,S,T,A);else{if(j.push(A,P),x){var z=[x[0]*H,x[1]-r,.001];j.push(z)}if(w){var R=[w[0]*H,w[1]-r,.001];j.push(R)}if(v){var D=[v[0]*H,v[1]-r,.001];j.push(D)}j.push(S,T)}return Object(pf.jsx)(n.a.Fragment,{children:Object(pf.jsx)(Jl.a,{rotation:[vt,0,0],points:j,color:l,lineWidth:o})})}));!function(e){e.Default="Default",e.Arched="Arched"}(Gy||(Gy={}));var tm,lm=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(pf.jsx)(Jl.a,{points:[d,c,s,f],lineWidth:a,color:l})})),am=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=Xw(o.shadowEnabled),s=Object(r.useMemo)((function(){return Object(pf.jsx)("meshStandardMaterial",{color:l})}),[l]),d=.1;return Object(pf.jsxs)("group",{name:"Door frame group",children:[Object(pf.jsx)(Lt.a,{position:[0,0,n/2],args:[i,d,d],castShadow:c,receiveShadow:c,children:s}),Object(pf.jsx)(Lt.a,{position:[-i/2+.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s}),Object(pf.jsx)(Lt.a,{position:[i/2-.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s})]})})),om=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=Xw.getState().world,g=Xw(o.heatFluxScaleFactor),m=Xw(o.heatFluxColor),w=Xw(o.heatFluxWidth),x=Xw(o.shadowEnabled),v=Af(Ai),b=Object(r.useRef)(0),A=Object(r.useRef)(),T=Object(u.a)(l,3),P=T[0],S=(T[1],T[2]),H=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=Ww.getEuler(Rt,jt,"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(H,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*H,.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,H,s]),D=Object(r.useMemo)((function(){return{lineColor:"black",lineWidth:i&&a?.2:.1,opacity:1,selected:a,locked:i}}),[a,i]);return Object(pf.jsxs)("group",{name:"Arched door group",children:[Object(pf.jsx)("mesh",{name:"Arched Door Mesh",rotation:[vt,0,0],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(pf.jsx)("shapeBufferGeometry",{args:[R]})}),s&&Object(pf.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(pf.jsx)("shapeBufferGeometry",{args:[R]}),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})]}),s&&Object(pf.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(pf.jsx)("shapeBufferGeometry",{args:[R]})}),Object(pf.jsx)(Cf,{cy:0,dimension:l,wireframeData:D}),Object(pf.jsx)(Cf,{cy:P,dimension:l,wireframeData:D}),z&&z.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[v.current].clone().add(new We.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==m&&void 0!==m?m:$e})})]},t)}))]})})),rm="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",nm=l.p+"static/media/door_01.370d5c48.png",cm=l.p+"static/media/door_02.589dadc7.png",sm=l.p+"static/media/door_03.25d0bf9d.png",dm=l.p+"static/media/door_04.06a40fe3.png",um=l.p+"static/media/door_05.4515bf2c.png",fm=l.p+"static/media/door_06.5a0271c1.png",hm=l.p+"static/media/door_07.b3fa7c12.png",pm=l.p+"static/media/door_08.44d7e7a4.png",ym=l.p+"static/media/door_09.cc418cf3.png",gm=l.p+"static/media/door_10.69a33f87.png",mm=l.p+"static/media/door_11.885157c0.png",wm=l.p+"static/media/door_12.1978a1a1.png",xm=l.p+"static/media/door_13.0e06b1ac.png",vm=l.p+"static/media/door_14.97d8561e.png",bm=l.p+"static/media/door_15.059947bb.png",Am=l.p+"static/media/door_16.c2cd4b21.png",Tm=l.p+"static/media/door_17.6410d727.png",Pm=new We.MeshStandardMaterial({color:"white",side:We.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(pf.jsxs)("group",{name:"Door handle wrapper",children:[Object(pf.jsx)(mf,{x:-i,z:r,handleType:K.UpperLeft}),Object(pf.jsx)(mf,{x:i,z:r,handleType:K.UpperRight}),l===Gy.Arched&&Object(pf.jsx)(Yg,{z:r})]})})),Hm=n.a.memo((function(e){var t=e.dimension,l=Xw(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(pf.jsx)(Lt.f,{name:"Door seal plane",args:e,position:t,rotation:a,material:Pm,receiveShadow:l})};return Object(pf.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])]})})),jm=function(e){!function(e){var t=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.doorType&&void 0!==e.archHeight&&void 0!==e.filled||Xw.getState().set((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Door){var i=o;void 0===i.doorType&&(i.doorType=Gy.Default),void 0===i.archHeight&&(i.archHeight=1),void 0===i.filled&&(i.filled=!0);break}}}catch(r){a.e(r)}finally{a.f()}}))}),[t])}(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,f=e.locked,p=void 0!==f&&f,y=e.color,g=void 0===y?"white":y,m=e.doorType,w=void 0===m?Gy.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,H=void 0===S?"white":S,j="Door Group ".concat(t),z=Xw(si),R=bf(hf),D=Xw(o.windowShininess),W=_f(t),M=function(){z((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.id===t?(o.selected=!0,e.selectedElement=o,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):o.selected=!1}}catch(i){a.e(i)}finally{a.f()}}))},I=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===j&&!Xw.getState().moveHandleType&&!Xw.getState().resizeHandleType&&!Xw.getState().isAddingElement()&&Xw.getState().objectTypeToAdd===V.None},C=function(e,t){Nt.getState().setEnableOrbitController(!1),R("showWallIntersectionPlaneId",l),z((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new We.Vector3(a,0,i).add(t)),l.selectedElement=l.elements.find((function(e){return e.selected}))}))},F=Xw(_r),k=bf(Us),O=bf(Es),Y=Xw(o.solarRadiationHeatmapMaxValue),L=Af(wi),N=Object(r.useState)(null),U=Object(u.a)(N,2),E=U[0],J=U[1];Object(r.useEffect)((function(){if(e&&k){var t=L(e.id);if(t){var l=Ww.fetchHeatmapTexture(t,null!==Y&&void 0!==Y?Y:5);l&&(l.wrapS=We.RepeatWrapping,l.wrapT=We.RepeatWrapping,l.offset.set(-n/2,-s/2),l.center.set(n/2,s/2),l.repeat.set(1/n,1/s),J(l))}}}),[k,Y]);var G=function(e,t,l,a){var o=Object(r.useMemo)((function(){var t;switch(e){case fe.Default:t=rm;break;case fe.NoTexture:t=Tf;break;case fe.Texture01:t=nm;break;case fe.Texture02:t=cm;break;case fe.Texture03:t=sm;break;case fe.Texture04:t=dm;break;case fe.Texture05:t=um;break;case fe.Texture06:t=fm;break;case fe.Texture07:t=hm;break;case fe.Texture08:t=pm;break;case fe.Texture09:t=ym;break;case fe.Texture10:t=gm;break;case fe.Texture11:t=mm;break;case fe.Texture12:t=wm;break;case fe.Texture13:t=xm;break;case fe.Texture14:t=vm;break;case fe.Texture15:t=bm;break;case fe.Texture16:t=Am;break;case fe.Texture17:t=Tm;break;default:t=cm}return(new We.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),X=Object(r.useMemo)((function(){return[n,c,s,v]}),[n,c,s,v]),B=Object(r.useMemo)((function(){return k&&E&&e.filled?new We.MeshBasicMaterial({color:g,map:E,side:We.FrontSide}):A?d===fe.Default||d===fe.NoTexture?P<1?new We.MeshPhongMaterial({specular:"white",shininess:null!==D&&void 0!==D?D:lt,color:g,side:We.FrontSide,opacity:P,transparent:!0}):new We.MeshStandardMaterial({map:G,color:g,side:We.FrontSide}):new We.MeshStandardMaterial({map:G,side:We.FrontSide}):new We.MeshStandardMaterial({opacity:g===wt?.5:0,color:g,transparent:!0,side:We.DoubleSide})}),[k,E,g,d,G,A,P]);return Object(pf.jsxs)("group",{name:j,position:[a,0,i],onPointerDown:function(e){if(2!==e.button&&!Xw.getState().addedWallId&&(I(e)&&M(),function(e){if(e.eventObject.name===j&&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:C(t,new We.Vector3(n/2,0,-s/2));break;case K.UpperRight:C(t,new We.Vector3(-n/2,0,-s/2));break;case K.Arch:C(t,new We.Vector3(0,0,0))}}},onContextMenu:function(e){Xw.getState().addedWallId||I(e)&&(M(),z((function(e){e.contextMenuObjectType=V.Door})))},children:[function(){switch(w){case Gy.Default:return Object(pf.jsx)(om,{id:t,dimension:X,color:g,frameColor:H,selected:W,locked:p,material:B,filled:A,showHeatFluxes:O,area:Ww.getDoorArea(e),foundation:F(e)});case Gy.Arched:return Object(pf.jsx)(im,{id:t,dimension:X,color:g,frameColor:H,selected:W,locked:p,material:B,filled:A,showHeatFluxes:O,area:Ww.getDoorArea(e),foundation:F(e)})}}(),W&&Object(pf.jsx)(Bg,{element:e}),W&&!p&&Object(pf.jsx)(Sm,{dimension:X,doorType:w}),Object(pf.jsx)(Hm,{dimension:X})]})},zm=n.a.memo(jm),Rm=n.a.memo((function(e){var t=e.drawSunbeam,l=e.absRotation,a=e.tiltAngle,o=new We.Vector3(0,0,1),n=Xw(i.date),c=Xw(i.latitude),s=Xw(Kr),d=Math.max(100,10*s),u=Object(r.useMemo)((function(){return Iy(new Date(n),c).applyEuler(new We.Euler(-vt-a,0,-l))}),[n,c,l,a]);return Object(pf.jsx)(pf.Fragment,{children:t&&u.z>0&&Object(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[u.clone().multiplyScalar(.5),o.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:o.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),Dm=function(e){var t,l,a,o,i,n=e.sp;Xw(ki);var c=Xw(Zr),s=Xw(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 We.Vector3(f.cx,f.cy,f.cz),p=new We.Vector3(u.cx,u.cy,u.cz),y=new We.Vector3(n.cx*u.lx,0,n.cz*u.lz).applyEuler(new We.Euler(0,0,u.relativeAngle)).add(p).applyEuler(new We.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(pf.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)]})},Wm=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=Xw(si);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:d})}),y&&Object(pf.jsxs)(pf.Fragment,{children:[x&&Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide})}),Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,l],[0,0,1.75*l]],rotation:new We.Euler(t,0,0,"ZXY"),lineWidth:1}),T.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,0,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*l],[0,0,2*l]],color:"white",transparent:!0,opacity:.5}),Object(pf.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(pf.jsx)("group",{rotation:new We.Euler(t,0,0,"ZXY"),children:Object(pf.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]})})]})]})},Mm=n.a.memo((function(e){var t=e.tiltAngle,l=e.spCy,a=e.spLy,i=e.lx,n=e.nx,c=Xw(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(pf.jsx)("group",{position:[0,-o,l],rotation:[-s,0,0],children:Object(pf.jsx)(Lt.a,{args:[.05,.05,n],position:[0,0,n/2],castShadow:c,receiveShadow:c,children:Object(pf.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",E(!0)))},onPointerOut:function(e){Y.domElement.style.cursor="default",E(!1)},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),z&&je?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:je}):He?C||0===D?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:He,color:y}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:We.FrontSide,map:He,color:y}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),0===(null===se||void 0===se?void 0:se.bifacialityFactor)||0===S?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}):He?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:We.FrontSide,map:He,color:y}):null]}),z&&je&&oe.current&&oe.current.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),H&&m&&Object(pf.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}),H&&!m&&Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)("group",{name:Im,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===Im){var t=e.object.name;switch(t){case B.Default:Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=w,e.oldParentId=w,e.oldFoundationId=x})),j((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 We.Vector3(d/2,0,0));break;case K.Right:Pe(t,new We.Vector3(-d/2,0,0));break;case K.Lower:Pe(t,new We.Vector3(0,0,f/2));break;case K.Upper:Pe(t,new We.Vector3(0,0,-f/2))}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(Im)){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(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,0),args:[Ae,6,6],name:B.Default,children:Object(pf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(pf.jsx)(Lt.a,{position:[(he.x+ye.x)/2,he.y,he.z],args:[be,be,1.2*h],name:K.Lower,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Lower||I===K.Lower?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[(pe.x+ge.x)/2,pe.y,pe.z],args:[be,be,1.2*h],name:K.Upper,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Upper||I===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[he.x,(he.y+pe.y)/2,he.z],args:[be,be,1.2*h],name:K.Left,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Left||I===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[ye.x,(ye.y+ge.y)/2,ye.z],args:[be,be,1.2*h],name:K.Right,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Right||I===K.Right?pt:ht})})]})}),Object(pf.jsx)(Rm,{drawSunbeam:T,absRotation:P,tiltAngle:S}),(U||A)&&!H&&Object(pf.jsx)(Dm,{sp:me})]}),0!==S&&se&&Object(pf.jsx)(Mm,{tiltAngle:-S,spCy:c-fe,spLy:f,lx:b===$.portrait?se.width:se.length,nx:te})]}),H&&!m&&Object(pf.jsx)("group",{name:Im,position:[n,0,s+fe],rotation:we,children:Object(pf.jsx)(Wm,{tiltAngle:S,handleSize:Te,initPointerDown:function(){re.current=S,ie.current=!0,Nt.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,O)}(e),t.current&&Xw.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 We.Vector3);if(r){var n=(new We.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=Ww.clamp(c,-vt,0),Xw.getState().updateSolarPanelTiltAngleById(l,c)}}}},handlePointerUp:function(){var e=W(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(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Xw.getState().addUndoable(t)}Nt.getState().setEnableOrbitController(!0),ie.current=!1}})})]})},Fm=n.a.memo(Cm),km=l.p+"static/media/polygon_08.acf0bf8f.png",Om=l.p+"static/media/polygon_09.26eed538.png",Ym=l.p+"static/media/polygon_10.749fa717.png",Lm=l(840),Nm=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,f=e.normal,p=void 0===f?[0,0,1]:f,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,H=void 0===S?"white":S,j=e.fontStrokeWidth,z=void 0===j?0:j,R=e.fontStrokeColor,D=void 0===R?"black":R,W=e.lineStyle,M=void 0===W?k.Solid:W,I=e.lineColor,C=void 0===I?"black":I,F=e.lineWidth,O=void 0===F?1:F,Y=e.locked,L=void 0!==Y&&Y,N=e.showLabel,U=void 0!==N&&N,E=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=Xw(si),re=Xw(Vi),ne=Xw(os),se=Xw(ns),de=Xw(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],He=Te[1],je=Object(r.useState)(null),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Xw((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E)return a}}catch(o){l.e(o)}finally{l.f()}})),Fe=new We.Vector3,ke=new We.Euler;if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var Oe=Ww.getWorldDataById(Ce.id),Ye=Oe.pos,Le=Oe.rot;Fe.copy(Ye),ke.set(0,0,Le)}var Ne=Ce?Math.max(1,Math.max(Ce.lx,Ce.ly)/24):1,Ue=dt*Ne,Ee=st*Ne,Ve=Object(r.useMemo)((function(){return{lng:re}}),[re]),Je=function(e,t){ie((function(l){var a,o=Object(h.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(h.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(h.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 We.Vector3).fromArray(p);Ww.isUnitVectorX(s)?(n=Ce.lz,c=Ce.ly):Ww.isUnitVectorY(s)?(n=Ce.lx,c=Ce.lz):(n=Ce.lx,c=Ce.ly);var d,u=Object(h.a)(G);try{for(u.s();!(d=u.n()).done;){var f=d.value;e.push({x:f.x*n,y:f.y*c})}}catch(g){u.e(g)}finally{u.f()}}var y=Ww.calculatePolygonCentroid(e);be(y.x),He(y.y)}return e}),[G,Ce,p]),Xe=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var e=Ww.isIdentical(p,Tt);return Fe.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 We.Euler(-vt,0,Math.PI,"ZXY");var e=(new We.Vector3).fromArray(p),t=d[2];return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid&&(t=ke.z),Ww.isSame(e,St)?new We.Euler(0,vt,t,"ZXY"):Ww.isSame(e,Ht)?new We.Euler(0,-vt,t,"ZXY"):Ww.isSame(e,jt)?new We.Euler(-vt,0,t,"ZXY"):Ww.isSame(e,zt)?new We.Euler(vt,0,t,"ZXY"):new We.Euler(0,0,t,"ZXY")}(),Ke=function(){var e,t;if(Ce){if(Ce.type===V.Cuboid){var l=new We.Vector3(Fe.x,Fe.y,Xe),a=(new We.Vector3).fromArray(p),o=!1,i=new We.Vector3;return Ww.isSame(a,St)?(o=!0,i.x=Ce.lx/2+.01):Ww.isSame(a,Ht)?(o=!0,i.x=-Ce.lx/2-.01):Ww.isSame(a,jt)?(o=!0,i.y=Ce.ly/2+.01):Ww.isSame(a,zt)&&(o=!0,i.y=-Ce.ly/2-.01),o&&(i.applyEuler(ke),l.x=Fe.x+i.x,l.y=Fe.y+i.y,l.z=Fe.z+i.z),l}if(Ce.type===V.Wall)return new We.Vector3(0,-.01,0)}return new We.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(h.a)(Ge);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.push(new We.Vector3(a.x,a.y,0))}}catch(o){l.e(o)}finally{l.f()}return t.push(new We.Vector3(Ge[0].x,Ge[0].y,0)),t}),[Ge]),Qe=Object(r.useMemo)((function(){var e=new We.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=ty;break;case ce.Texture02:e=ly;break;case ce.Texture03:e=ay;break;case ce.Texture04:e=oy;break;case ce.Texture05:e=iy;break;case ce.Texture06:e=ry;break;case ce.Texture07:e=ny;break;case ce.Texture08:e=km;break;case ce.Texture09:e=Om;break;case ce.Texture10:e=Ym;break;default:e=Tf}return(new We.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=We.RepeatWrapping,e.repeat.set(1/t.x,1/t.y);var l=(new We.Vector3).fromArray(p);Ww.isSame(l,St)?e.rotation=vt:Ww.isSame(l,Ht)?e.rotation=-vt:Ww.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(pf.jsxs)("group",{name:"Polygon Group "+t,rotation:Be,position:Ke,children:[c&&Object(pf.jsxs)("mesh",{uuid:t,ref:Me,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),ie((function(t){e.intersections.length>0&&(e.intersections[0].object===Me.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===Me.current&&ge(!0))},onPointerOut:function(){ge(!1),fe.style.cursor="default"},children:[Object(pf.jsx)("shapeBufferGeometry",{attach:"geometry",args:[Qe]}),void 0===ee||0===ee?Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:We.DoubleSide,transparent:Q<1,opacity:Q}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:We.FrontSide,specular:new We.Color("white"),shininess:ee,transparent:Q<1,opacity:Q})]}),w&&Object(pf.jsx)(Lm.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:H,strokeWidth:z,strokeColor:D,children:w}),(!_||L&&ue)&&Object(pf.jsx)(Jl.a,{points:qe,color:L&&ue?yt:C,lineWidth:O,dashed:M&&M!==k.Solid,dashSize:M===k.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),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(pf.jsx)(Jl.a,{position:[0,0,.1],points:qe,visible:!1,lineWidth:Math.min(10*O,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),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(pf.jsx)(Lt.h,{ref:Ie,position:[ve,Pe,0],args:[Ee,6,6],name:B.Default,onPointerDown:function(e){ne(t,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=E,e.oldParentId=E,e.oldFoundationId=J})),ie((function(e){e.moveHandleType=B.Default}))},onPointerOver:function(e){Ze(e,B.Default)},onPointerOut:_e,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),ue&&!L&&Ge.map((function(e,l){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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){ne(t,e,X.Resize),Je(t,l),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=E,e.oldParentId=E,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(pf.jsx)("meshBasicMaterial",{attach:"material",color:Re!==K.Default&&Xw.getState().resizeHandleType!==K.Default||le!==l?ht:pt})}),Object(pf.jsx)("textSprite",{name:"Label "+l,text:""+l,fontSize:20*Ne,fontFace:"Times Roman",textHeight:.2*Ne,position:[e.x,e.y,.2*Ne]})]},"resize-handle-"+l)})),(ye||U)&&!ue&&Object(pf.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*Ne,fontFace:"Times Roman",textHeight:.2*Ne,position:[0,0,a+.2]})]})},Um=function(e){var t=e.wallModel,l=e.notBuilding,a=t.id,i=t.lx,c=t.lz,s=Xw(tn),d=Xw(o.heatFluxScaleFactor),u=Xw(o.heatFluxColor),f=Xw(o.heatFluxWidth),p=Af(Ai),y=bf(Es),g=Object(r.useRef)(0),m=Object(r.useRef)(),w=Object(r.useMemo)((function(){var e;if(y&&!l){var o=p.get(a);if(o){var r=o.reduce((function(e,t){return e+t}),0),n=t.fill===Ue.Partial&&!Ww.isPartialWallFull(t),c=Ww.getWallVertices(t,0),u=n?Ww.getPartialWallVertices(t,0):c,f=Ww.getPolygonArea(c),w=n?Ww.getPolygonArea(u):f;if(0!==w){var x=s(V.Window,a),v=s(V.Door,a);if(x&&x.length>0){var b,A=Object(h.a)(x);try{for(A.s();!(b=A.n()).done;){var T=b.value;w-=Ww.getWindowArea(T,t)}}catch(oe){A.e(oe)}finally{A.f()}}if(v&&v.length>0){var P,S=Object(h.a)(v);try{for(S.s();!(P=S.n()).done;){var H=P.value;w-=H.lx*H.lz*t.lx*t.lz}}catch(oe){S.e(oe)}finally{S.f()}}var j=4*(null!==(e=Xw.getState().world.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),z=Ww.getHighestPointOfWall(t),R=Math.max(2,Math.round(i/j)),D=Math.max(2,Math.round(z/j)),W=i/R,M=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=Ww.getEuler(Rt,jt,"YXZ",Math.sign(C)*vt);for(var F,k=[],O=n?Ww.getPartialWallVertices(t,0):Ww.getWallVertices(t,0),Y=0;Y0){var J,G=Object(h.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&&E=B-q&&U=K-Q&&E0){var Z,_=Object(h.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&&E0?N:S,U=z.length>0?U:S;var Ae=xp(R),Te=_f(m),Pe=Xw(si),He=Xw(an),je=Xw(os),ze=Xw(Sr),Re=Xw(Mu),De=Af(wi),Me=Xw(Kn),Ie=Xw(o.shadowEnabled),Ce=Xw(Lu),Fe=Xw(Nu),ke=Xw(o.solarRadiationHeatmapMaxValue),Oe=bf(hf),Ye=bf(Us),Le=bf((function(e){return e.elementBeingCanceledId})),Ne=bf((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=Xw((function(e){if(t){var l,a=Object(h.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=Xw((function(e){if(l){var t,a=Object(h.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=Xw((function(e){return JSON.stringify(e.elements.filter(o))}));return{elementsOnWall:Object(r.useMemo)((function(){return Xw.getState().elements.filter((function(e){return o(e)&&Ww.isLegalOnWall(e.type)}))}),[c]),leftWall:i,rightWall:n}}(m,j[0],z[0])),tt=et.elementsOnWall,lt=et.leftWall,at=et.rightWall,ot=vp(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]+H:H,At=Ww.getInnerWallOffset(lt,b,T,H,"left"),Tt=Ww.getInnerWallOffset(at,b,T,H,"right"),Pt=Q===Ee.Stud||Q===Ee.Pillar,St=null!==(t=N)&&void 0!==t?t:S,Ht=null!==(l=U)&&void 0!==l?l:S,jt=ne===Ue.Partial,zt=jt?se:0,Rt=jt?fe:0,Dt=jt?Math.min(St,pe):St,Wt=jt?Math.min(Ht,ge):Ht,Mt=jt&&(!Ww.isZero(St-Dt)||!Ww.isZero(Ht-Wt)),It=Ie&&!Pt,Ct=xe.display,Ft=Math.max(Dt,Wt)-xt,kt=Object(r.useMemo)((function(){return new We.Vector2}),[]),Ot=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Ut=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:"white",side:We.DoubleSide,transparent:Pt,opacity:ie})}),[Pt,ie]),Et=Object(r.useMemo)((function(){return Ww.getHighestPointOfWall(y)}),[y.lz,y.leftRoofHeight,y.rightRoofHeight,y.centerRoofHeight,y.centerLeftRoofHeight,y.centerRightRoofHeight]),Vt=Object(r.useMemo)((function(){var e=new We.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;jt?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})),f=Object(h.a)(u);try{for(f.s();!(d=f.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===Gy.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(H){f.e(H)}finally{f.f()}}jt?e.lineTo(a+c-r,o-s+fe):e.lineTo(a+c-r,o-s);Mt?(e.lineTo(a+c-r,o-s+Wt),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),E&&e.lineTo(E[0]*t,E[1]-s),J&&e.lineTo(J[0]*t,J[1]-s),N?e.lineTo(a-c+i,N-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 We.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:Zg,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,Wt,tt,N,U,E,J,G]),Jt=Object(r.useMemo)((function(){var e=new We.Shape,t=S,l=S/2;if(jt)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(h.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===Gy.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 f=Math.min(r.archHeight,d,s/2);if(e.lineTo(n-s/2,-l),f>.1){e.lineTo(n-s/2,d/2-l-f);var p=f/2+Math.pow(s,2)/(8*f),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(Mt){var x=Wt-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),E&&e.lineTo(E[0]*b,E[1]-l),J&&e.lineTo(J[0]*b,J[1]-l),N?e.lineTo(-ht+At,N-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 We.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:Zg,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,Wt,At,Tt,tt,L,N,U,E,J,G]),Gt=Object(r.useMemo)((function(){return jt?(Dt+Wt)/2-xt:xt}),[xt,jt,Dt,Wt]),Xt=Object(r.useMemo)((function(){var e=Wt-Dt;return!jt||Math.abs(e)<.01?0:Math.atan2(e,b)}),[b,jt,Dt,Wt]),Bt=Object(r.useMemo)((function(){var e=new We.Shape;if(!jt||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,jt,Xt]),Kt=Object(r.useMemo)((function(){var e=[],t=b/2,l=S/2;return jt?(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})),Mt?(e.push({x:t-Tt,y:-l+Wt}),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}),E&&e.push({x:E[0]*b,y:E[1]-l}),J&&e.push({x:J[0]*b,y:J[1]-l}),N?e.push({x:-t,y:N-l}):e.push({x:-t,y:l})),e}),[b,S,ne,zt,Rt,Dt,Wt,N,U,E,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===Ee.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===Ee.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:k,cx:w,cy:x,hx:ht,hy:pt,angle:H,selected:Te}}),[m,k,w,x,ht,pt,H,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=Ww.wallAbsolutePosition(new We.Vector3(l,a,o),ot).setZ(S/2+ot.lz);return(new We.Vector3).subVectors(e,i).applyEuler(new We.Euler(0,0,-bt))}return new We.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(h.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 f=-1;f<=1;f+=2){var p=t.x+d*l/2,y=t.z+d*f*a/2;if(s.push({x:p,y:y}),Ww.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}),Ww.isPointInside(x,v,c))return ut.current=e,!1}var A,T=Object(h.a)(c);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(Ww.isPointInside(P.x,P.y,s))return ut.current=e,!1}}catch(H){T.e(H)}finally{T.f()}}}}catch(H){r.e(H)}finally{r.f()}return ut.current=null,!0}function al(e,t,l,a,o){return!!Ww.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!!Ww.isPointInside(n,c,function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!jt)return Ww.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),Mt||(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=Xw.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 We.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 We.Vector3(t,e.y,l)}(e)}function sl(e,t){var l=(new We.Vector3).subVectors((new We.Vector3).fromArray(e.leftPoint).setZ(0),(new We.Vector3).fromArray(e.rightPoint).setZ(0)),a=(new We.Vector3).subVectors((new We.Vector3).fromArray(t.rightPoint).setZ(0),(new We.Vector3).fromArray(t.leftPoint).setZ(0)).angleTo(l);return Math.abs(a-Math.PI/2)<.087}function dl(e,t,l,a,o){Xw.getState().set((function(i){var r,n=Object(h.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(f.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(){Xw.getState().removeElementById(e.id,!1)},redo:function(){Xw.getState().set((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement,e.deletedRoofId=null}))}};ze(t)}function hl(){Xw.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(Xw.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(bp.WALL_OUTSIDE_SURFACE_MESH_NAME)||e.eventObject.name.includes(Qg)||e.eventObject.name===Vm}));if(!(a.length>0&&(a[0].eventObject.name===Vm||a[0].eventObject.name.includes(Qg))))return!0}return!1}function gl(e){if(Xw.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===Gy.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 We.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===tm.SettingStartPoint&&Xw.getState().moveHandleType===B.Mid}function bl(){return!(Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Re())}function Al(e,t,l){var a,o;!function(e){kt.x=e.offsetX/$e.domElement.clientWidth*2-1,kt.y=-e.offsetY/$e.domElement.clientHeight*2+1,Ot.setFromCamera(kt,_e)}(e);var i=el(null!==(a=null===(o=(t?Ot.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=bf.getState().oldParentId;if(e.parentId!==t){var l=Xw.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[Gm,Gm]}function Sl(){var e=[];if(E){var t=E[0];if(.5===t&&void 0!==N)return e.push(new We.Vector3(ht,E[1]-xt),new We.Vector3(-ht,N-xt)),e;if(-.5===t&&void 0!==U)return e.push(new We.Vector3(ht,U-xt),new We.Vector3(-ht,E[1]-xt)),e}return void 0!==U?e.push(new We.Vector3(ht,U-xt)):e.push(new We.Vector3(ht,xt)),void 0!==G&&e.push(new We.Vector3(G[0]*b,G[1]-xt)),void 0!==E&&e.push(new We.Vector3(E[0]*b,E[1]-xt)),void 0!==J&&e.push(new We.Vector3(J[0]*b,J[1]-xt)),void 0!==N?e.push(new We.Vector3(-ht,N-xt)):e.push(new We.Vector3(-ht,xt)),e}function Hl(e,t){var l=null===t||void 0===t?void 0:t.ignorePadding,a=(null===t||void 0===t?void 0:t.elementHalfSize)?Object(f.a)(t.elementHalfSize):[0,0],o=l?0:Gm,i=l?0:Gm+At,r=l?0:Gm+Tt,n=Object(u.a)(a,2),c=n[0],s=n[1],d=-ht+c+i,h=ht-c-r,p=-xt+s+o,y=xt-s-o,g=e.clone();if(!Mt&&se===fe&&pe===ge&&(!L||N===U&&void 0===E&&void 0===J&&void 0===G)){var m=jt?se:0,w=S-(jt?Dt:S);return g.setX(Ww.clamp(e.x,d,h)),g.setZ(Ww.clamp(e.z,p+m,y-w)),g}var x=function(e,t,l,a,o){var i=[],r=new We.Vector3(-ht,-xt+zt),n=new We.Vector3(ht,-xt+Rt);if(ml(r,n,e,t,o,!0),i.push({start:new We.Vector3(l,xt),end:new We.Vector3(l,r.y)}),i.push({start:r.clone(),end:n.clone()}),i.push({start:new We.Vector3(a,n.y),end:new We.Vector3(a,xt)}),Mt){var c=new We.Vector3(ht,-xt+Wt),s=new We.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 W=new We.Vector3(-ht,-xt+zt),M=new We.Vector3(ht,-xt+Rt),I=(M.y-W.y)/(M.x-W.x);A=I*T+(-I*W.x+W.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!Ww.isPointInside(t.x,t.y,l)}(x,v)){var F=function(e,t){for(var l=e.getPoints(),a=t,o=1/0,i=0;i0){var r=Ww.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 We.Vector3(e.cx*b,e.cy,e.cz*S+(n-o)/2).z,newArchHeight:r}}function Rl(e){if(vl()){Nt.getState().setEnableOrbitController(!1),Xe(!0);var t=Hl(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=tm.SettingEndPoint}else if(pl(e)){if(Xw.getState().objectTypeToAdd!==V.None)Dl(e.point,!0);else Xw.getState().groupActionMode?(Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===k}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(k)})),e.stopPropagation()):bl()&&Xw.getState().selectMe(m,e,X.Select)}}function Dl(e,t){if(ot&&Xw.getState().objectTypeToAdd){var l=null;switch(Xw.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=Xw.getState().actionState;l=Vl.makeSolarPanel(y,Xw.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 We.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 We.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=Xw.getState().actionState;l=Vl.makeLight(y,2,p.lightDistance,p.lightIntensity,p.lightColor,(f.x-.05)/b,0,(f.z-.05)/S,new We.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.addedRoofId=l.id),e.actionModeLock||(e.objectTypeToAdd=V.None)})))}}function Wl(e,t,l){st.current||(je(m,e,X.Select),Pe((function(a){e.intersections.length>0&&e.intersections[0].object===t&&(a.contextMenuObjectType=V.Wall,l&&a.pastePoint.copy(e.intersections[0].point))})))}function Ml(e){var t=Xw.getState().objectTypeToAdd;vl()||Re()||!pl(e)||t!==V.None?Zm.isTypeRoof(t)&&Rl(e):Xw.getState().groupActionMode?(Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.id===k?a.selected=!0:a.selected=!1}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k})),e.stopPropagation()):bl()&&Xw.getState().selectMe(m,e,X.Select)}function Il(e){0!==e.intersections.length&&e.intersections[0].object===e.eventObject&&(Xw.getState().groupActionMode?Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===k}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(k)})):(function(e){return!(2===e.button||Xw.getState().addedWallId||dt.current||Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().objectTypeToAdd!==V.None||Te||Re())}(e)&&(Pe((function(e){e.contextMenuObjectType=null})),je(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})),je(m,e,X.Select),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=Ww.fetchHeatmapTexture(e,null!==ke&&void 0!==ke?ke:5);if(t){t.wrapS=We.RepeatWrapping,t.wrapT=We.RepeatWrapping;var l=S===Et?0:(1-S/Et)/2;t.offset.set(-b/2,-Et/2-l),t.center.set(b/2,Et/2),t.repeat.set(1/b,1/Et),Qe(t)}}}}),[Ye,ke]),Object(r.useEffect)((function(){L&&(Ce!==L&&(null===Fe||void 0===Fe?void 0:Fe.id)!==L||Xw.getState().set((function(e){var t,l=new Set,a=Object(h.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=Zm.getWallPoints2D(i);tt.forEach((function(a){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 We.Vector3(a.cx*b,0,a.cz*S);Ww.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,Fe]),Object(pf.jsxs)(pf.Fragment,{children:[(ie>0||Q===Ee.Default)&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{name:"Wall Simulation Mesh",uuid:m,userData:{simulation:!0},rotation:[vt,0,0],castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Vt]}),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})]}),Object(pf.jsxs)("mesh",{name:"".concat(bp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(m),ref:it,rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onContextMenu:function(e){Wl(e,it.current,!0)},onPointerMove:function(e){if(function(e,t){var l=e.intersections.filter((function(e){return e.object.name!==Jm}));return l.length>0&&l[0].object.name==="".concat(bp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(t)}(e,m)){var t=Xw.getState().objectTypeToAdd;if((o=t)===V.Window||o===V.Door)!function(e){e&&(ft.current={id:e.id,type:e.type,status:tm.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=Hl(Al(e,it.current).pointerOnGrid);jl(ft.current.id,l)}var a=Xw.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=Hl(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=k,t.selectedElement&&(t.selectedElement.parentId=m,t.selectedElement.foundationId=k),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)}})),Oe("showWallIntersectionPlaneId",m))}else vl()&&Tl(ft.current);var o},onPointerDown:Rl,onPointerUp:function(){ft.current&&ft.current.status===tm.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(pf.jsx)("shapeBufferGeometry",{args:[Vt]}),Ye&&qe?Object(pf.jsx)("meshBasicMaterial",{attach:"material",map:qe,color:"white",opacity:ie,transparent:Pt}):Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:R===ue.Default||R===ue.NoTexture?W:"white",map:Ae,transparent:Pt,opacity:ie})]}),Object(pf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,.05,0],castShadow:It,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)("meshStandardMaterial",{color:"white",side:We.BackSide,transparent:Pt,opacity:ie})]}),Object(pf.jsxs)("mesh",{name:"Inside Wall",ref:rt,position:[0,T,0],rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml,onContextMenu:function(e){Wl(e,rt.current)},children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)(Xm,{transparent:Pt,color:W,opacity:ie})]}),Object(pf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,T-.01,0],receiveShadow:!0,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)("meshStandardMaterial",{color:"white",side:We.FrontSide,transparent:Pt,opacity:ie})]}),(!L||Mt)&&!Ct&&Object(pf.jsx)("mesh",{name:"Top Wall",ref:nt,material:Ut,position:[0,pt,Gt],rotation:[0,-Xt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml,onContextMenu:function(e){Wl(e,nt.current)},children:Object(pf.jsx)("shapeBufferGeometry",{args:[Bt]})}),0===At&&Object(pf.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:Ml}),0===Tt&&Object(pf.jsx)(Lt.f,{args:[Wt-Rt,T],material:Ut,position:[ht-.01,pt,-xt+Rt+(Wt-Rt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml}),(Ge||Ne===m)&&(null===(s=Xw.getState().selectedElement)||void 0===s?void 0:s.parentId)===m&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.f,{ref:ct,name:Jm,args:[1e4,1e4],position:[0,T/3,0],rotation:[vt,0,0],onPointerMove:function(e){var t,l=null!==(t=Xw.getState().selectedElement)&&void 0!==t?t:He();if((null===l||void 0===l?void 0:l.parentId)===y.id)if(Xw.getState().moveHandleType){var a=new We.Vector3(-l.lx/2*b,0,l.lz/2*S),o=Al(e,ct.current,a),i=(o.relativePointer,o.pointerOnGrid),r=Pl(l),n=Hl(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:Zg);var p=ll(l.id,n,c,s,h);ut.current=f&&p?null:l.id}jl(l.id,n)}else if(Xw.getState().resizeHandleType){var g=Al(e,ct.current),m=g.relativePointer,w=g.pointerOnGrid,x=Xw.getState().resizeHandleType,v=Xw.getState().resizeAnchor;switch(l.type){case V.Window:var A=l,T=Hl(w,{resizeAnchor:v});if(gl(A)){var P=zl(A,T,v),H=P.newLz,j=P.newCz,z=P.newArchHeight,R=new We.Vector3(A.cx*b,0,j);ll(A.id,R,A.lx*b,H),al(A.id,R,A.lx*b,H),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lz=H/S,t.cz=j/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 We.Vector3(A.cx*b,0,A.cz*S),W=A.lx*b,M=A.lz*S,I=[Ww.clamp((w.x-v.x)/W,-.5,.5),Math.max(0,w.z-v.z)];ll(A.id,D,W,M,I)&&ol(D,W,M,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,F=wl(0,T,v),k=F.dimensionXZ,O=F.positionXZ,Y=new We.Vector3(O.x,0,O.z),L=!0,N=void 0;if(A.windowType===Yt.Polygonal)N=null!==(C=A.polygonTop)&&void 0!==C?C:Zg,L=ol(Y,k.x,k.z,N);ll(A.id,Y,k.x,k.z,N)&&L&&al(A.id,Y,k.x,k.z)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lx=k.x/b,t.lz=k.z/S,t.cx=O.x/b,t.cz=O.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,E=Hl(w,{resizeAnchor:v});if(gl(U)){var J=zl(U,E,v),G=J.newLz,X=J.newCz,B=J.newArchHeight,q=new We.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,E,v),Z=Q.dimensionXZ,_=Q.positionXZ,$=new We.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=(E.z-S/2)/2/S,t.lz=(E.z+S/2)/S,t.color=t.id===ut.current?wt:l.color)}))}break;case V.SolarPanel:var ee=l,te=Km(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 We.Vector3(0,0,m.z-v.z).normalize().multiplyScalar(ie),ne=(new We.Vector3).addVectors(v,re.clone().divideScalar(2));if(!Ww.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 We.Vector3(m.x-v.x,0,0).normalize().multiplyScalar(ce),de=(new We.Vector3).addVectors(v,se.clone().divideScalar(2));if(!Ww.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===tm.SettingEndPoint?(Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null):(Xw.getState().moveHandleType||Xw.getState().resizeHandleType)&&bp.undoInvalidOperation();else if(ft.current){if(ft.current.status===tm.SettingStartPoint)Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null;else if(ft.current.status===tm.SettingEndPoint){var e=Xw.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,_y.selectNone(e))})),fl(t)),ft.current=null}}else Xw.getState().moveHandleType?bp.addUndoableMove():Xw.getState().resizeHandleType&&function(){var e=Xw.getState().selectedElement;if(e){var t=Xw.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(f.a)(e.polygonTop):void 0,newPolygonTop:ul(t)?Object(f.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(f.a)(a.vertices),newValue:Object(f.a)(o.vertices),changedElementId:o.id,changedElementType:o.type,undo:function(){Me(this.changedElementId,this.oldValue)},redo:function(){Me(this.changedElementId,this.newValue)}};ze(i)}}}();Nt.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)}))})),Oe("showWallIntersectionPlaneId",null),ut.current=null,hl()},visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{color:"blue",side:We.DoubleSide})}),Object(pf.jsx)(Lt.f,{name:Vm,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(pf.jsx)($g,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(pf.jsx)(zm,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(pf.jsx)("group",{position:[0,-e.lz/2,0],children:Object(pf.jsx)(Fm,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(pf.jsx)(Nm,Object(d.a)({},e),e.id):null})),Q===Ee.Stud&&function(){var e=null!==E&&void 0!==E?E:[0,(Dt+Wt)/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,Wt-a),s=-Math.atan2(Wt-a,n);return Object(pf.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(h.a)(Xw.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 f=void 0,p=void 0,y=void 0;o&&(f=[-o[0],o[1]]),r&&(p=[-r[0],r[1]]),i&&(y=[-i[0],i[1]]),u=e.getWallPoints2D(d,f,p,y)}if(d.id===l||d.id===a){var g,m=Object(h.a)(Xw.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=Gm;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 Ww.isPointInside(l.x,l.y,d.map(Ww.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}var f=[n,r,i];return Ww.isPointInside(l.x,l.y,f.map(Ww.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}if(c<=s){var h=[n,r,i];return Ww.isPointInside(l.x,l.y,h.map(Ww.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}var p=[n,r,o];return Ww.isPointInside(l.x,l.y,p.map(Ww.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 We.Vector3).crossVectors((new We.Vector3).subVectors(l,a),(new We.Vector3).subVectors(l,o)).normalize()}},{key:"getRotationFromNormal",value:function(e){return Ww.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 We.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 We.Vector3(0,0,1),rotation:[0,0,0]}}},{key:"getOrderedWallArrayOfRoof",value:function(e){var t,l=new Map,a=Object(h.a)(Xw.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=Af.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 We.Vector3(e.cx,e.cy,e.cz),o=new We.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 We.Vector3(e.lx/2*r,(e.lz/2-i)*n*r,0):new We.Vector3(e.lx/2*r,e.lz/2*n*r,0);c.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),c.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(c)}var s=new We.Vector3(0,e.lz/2,0);s.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),s.applyEuler(new We.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 We.Vector3(e.lx/2*d,e.lz/2*u*d,0);f.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),f.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(f)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=new We.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);h.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),h.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(h)}}return l}},{key:"getRelativeWindowVerticesOnRoof",value:function(e){var t=[],l=new We.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 We.Vector3(e.lx/2*o,(e.lz/2-a)*i*o,0):new We.Vector3(e.lx/2*o,e.lz/2*i*o,0);r.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(r)}var n=new We.Vector3(0,e.lz/2,0);n.applyEuler(new We.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 We.Vector3(e.lx/2*c,e.lz/2*s*c,0);d.applyEuler(new We.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 We.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);u.applyEuler(new We.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 We.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz),o=new We.Vector3(t.cx,t.cy,t.lz),i=-1;i<=1;i+=2)for(var r=-1;r<=1;r+=2){var n=new We.Vector3(e.lx/2*i,e.ly/2*r*i,0);0===e.rotation[0]?n.applyEuler(new We.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):n.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),n.applyEuler(new We.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 We.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 We.Vector3(e.lx/2*o,e.ly/2*i*o,0);0===e.rotation[0]?r.applyEuler(new We.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):r.applyEuler(new We.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 We.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 We.Vector3(r*o,r*n*i);c.applyEuler((new We.Euler).fromArray([].concat(Object(f.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:Zg,h=Object(u.a)(d,2),p=h[0],y=h[1],g=new We.Vector3(p*e.lx,e.lz+y).add(a);l.push(g)}return l}},{key:"rooftopElementBoundaryCheck",value:function(e,t){var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!Ww.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(h.a)(Xw.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].eventObject.name===t&&(Xw.getState().set((function(e){e.moveHandleType=t})),Nt.getState().setEnableOrbitController(!1))},onPointerOver:function(e){o(e,t)},onPointerOut:i,children:Object(pf.jsx)("meshBasicMaterial",{color:g})})},uw=function(e){var t=e.handleType,l=e.position,a=e.size,o=e.onPointerOver,i=e.onPointerOut,n=Xw(zu),c=Xw(Hu),s=Object(r.useRef)(),d=Object(u.a)(l,3),f=d[0],h=d[1],p=d[2],y=c===t||n===t?pt:ht;return Object(pf.jsx)(Lt.a,{ref:s,name:t,args:[a,a,a],position:[f,h,p],onPointerDown:function(){if(s.current){var e=s.current.localToWorld(new We.Vector3(2*-f,2*-h,0));Xw.getState().set((function(l){l.resizeAnchor.copy(e),l.resizeHandleType=t})),Nt.getState().setEnableOrbitController(!1)}},onPointerOver:function(e){o(e,t)},onPointerOut:i,children:Object(pf.jsx)("meshBasicMaterial",{color:y})})};!function(e){e.Top="Top",e.NS="NS",e.EW="EW"}($m||($m={}));var fw=function(e){var t=e.id,l=e.args,a=Object(u.a)(l,3),i=a[0],n=a[1],c=a[2],s=Xw(si),d=Xw(Zr),f=Xw(o.orthographic),p=Xw(Fu),y=Object(r.useState)(null),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(Se.f)(),v=x.gl,b=x.raycaster,A=wp(),T=Object(r.useRef)(null),P=Object(r.useRef)(null),S=Object(r.useRef)(null),H=Object(r.useRef)(null),j=Object(r.useRef)(null),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(null),W=Object(r.useMemo)((function(){return[0,Math.min(-1.2*n,-n-.75)-2*A,.08-c]}),[n,c,A]),M=Object(r.useMemo)((function(){return[0,Math.max(1.2*n,n+.75)+2*A,.08-c]}),[n,c,A]),I=null!==m,C=!f,F=!p,k=Object(r.useCallback)((function(e,l){bf.getState().duringCameraInteraction||e.intersections.length>0&&(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)})),Ww.isMoveHandle(l)?v.domElement.style.cursor="move":l===q.Upper||l===q.Lower?v.domElement.style.cursor="grab":v.domElement.style.cursor=Xw.getState().addedCuboidId?"crosshair":"pointer")}),[]),O=Object(r.useCallback)((function(){s((function(e){e.hoveredHandle=null})),v.domElement.style.cursor=Xw.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(pf.jsxs)(pf.Fragment,{children:[I&&Object(pf.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=Xw.getState().resizeHandleType;o?Ww.isTopResizeHandle(o)?function(e){if(null!==T.current){var l=Math.max(1,e.z-T.current);s((function(e){var a,o=Object(h.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]===$m.Top&&(i.cz=l/2)}}}catch(n){o.e(n)}finally{o.f()}}))}}(a):Ww.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));o.cx=p.x;var y=Math.abs(n.x);o.lx=y;var g=new We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),m=o.rotation[2]+f;if(z.current.size>0){var w,x=Object(h.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 We.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),H=P[0],j=P[1];H===$m.Top||H===$m.NS?v.cx=A.x:H===$m.EW&&(v.cx=Math.sign(j)*(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):Ww.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));o.cy=p.y;var y=Math.abs(n.y);o.ly=y;var g=new We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),m=o.rotation[2]+f;if(z.current.size>0){var w,x=Object(h.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 We.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),H=P[0],j=P[1];H===$m.Top?v.cy=A.y:H===$m.NS?v.cy=Math.sign(j)*(y/2):H===$m.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));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 We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),w=o.rotation[2]+f;if(z.current.size>0){var x,v=Object(h.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 We.Euler(0,0,-w));if(L(b.type)){var P=R.current.get(b.id);if(P){var H=Object(u.a)(P,2),j=H[0],D=H[1];j===$m.Top?(b.cx=T.x,b.cy=T.y):j===$m.NS?(b.cx=T.x,b.cy=Math.sign(D)*(g/2)):j===$m.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(W){v.e(W)}finally{v.f()}}}}))}(a):Xw.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)+(Xw.getState().rotateHandleType===q.Upper?0:Math.PI),r=Math.abs(i)>Math.PI?-Math.sign(i)*bt:0;H.current&&(i-=H.current),Xw.getState().updateElementRotationById(t,0,0,i+r)}}(a)}}},onPointerUp:function(){w(null),T.current=null,P.current=null,S.current=null,H.current=null,j.current=null}}),Object(pf.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||Xw.getState().addedCuboidId){var l=d(t);if(l&&l.parentId!==xt){w({position:new We.Vector3(0,0,-c),rotation:new We.Euler});var a=Ww.getWorldDataById(l.parentId),o=a.pos,r=a.rot;j.current=o,H.current=r,S.current=r+l.rotation[2];var n=new We.Vector3(l.cx,l.cy,l.cz).applyEuler(new We.Euler(0,0,r)).add(o),s=Xw.getState().elements.filter((function(e){return e.parentId===l.id&&(t=e.type,L(t)||t===V.Cuboid||Ww.isIdentical(e.normal,[0,0,1]));var t}));z.current.clear(),R.current.clear();var u,f=Object(h.a)(s);try{for(f.s();!(u=f.n()).done;){var p=u.value,y=new We.Vector3;L(p.type)?(y.set(p.cx,p.cy,p.cz),Math.abs(p.cz-c)<.01?R.current.set(p.id,[$m.Top,1]):Math.abs(Math.abs(p.cx)-i)<.01?R.current.set(p.id,[$m.EW,Math.sign(p.cx)]):R.current.set(p.id,[$m.NS,Math.sign(p.cy)])):p.type===V.Cuboid?y.set(p.cx,p.cy,p.cz):y.set(p.cx*l.lx,p.cy*l.ly,0),y.applyEuler(new We.Euler(0,0,S.current)).add(n),z.current.set(p.id,y)}}catch(g){f.e(g)}finally{f.f()}}}},children:[Object(pf.jsx)(uw,{handleType:K.UpperLeft,position:[-i,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperRight,position:[i,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerLeft,position:[-i,-n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerRight,position:[i,-n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Left,position:[-i,0,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Right,position:[i,0,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Upper,position:[0,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Lower,position:[0,-n,0],size:A,onPointerOver:k,onPointerOut:O})]}),C&&Object(pf.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=Xw.getState().cameraDirection,o=Math.atan2(a.x,a.y)+Y(t);w({position:l.position.clone(),rotation:new We.Euler(-vt,o,0)});var i=l.localToWorld(new We.Vector3);T.current=i.z-2*c;var r=Xw.getState().elements.filter((function(e){return e.parentId===t&&L(e.type)}));R.current.clear();var n,s=Object(h.a)(r);try{for(s.s();!(n=s.n()).done;){var d=n.value;(new We.Vector3).set(d.cx,d.cy,d.cz),Math.abs(d.cz-c)<.01&&R.current.set(d.id,[$m.Top,1])}}catch(u){s.e(u)}finally{s.f()}}},children:[Object(pf.jsx)(uw,{handleType:K.LowerLeftTop,position:[-i,-n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperLeftTop,position:[-i,n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerRightTop,position:[i,-n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperRightTop,position:[i,n,c],size:A,onPointerOver:k,onPointerOut:O})]}),F&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(dw,{handleType:B.Lower,position:[0,-n-1.2*A,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Upper,position:[0,n+1.2*A,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Left,position:[-i-1.2*A,0,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Right,position:[i+1.2*A,0,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Top,position:[0,0,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.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 We.Vector3(0,0,-c),rotation:new We.Euler(0,0,0)});var l=e.eventObject;P.current=l.localToWorld(new We.Vector3).toArray();var a=d(t);a&&(H.current=Y(a.parentId))}},children:[Object(pf.jsx)(uy,{id:t,handleType:q.Lower,position:W,ratio:4*A,hoverHandle:k,noHoverHandle:O}),Object(pf.jsx)(uy,{id:t,position:M,handleType:q.Upper,ratio:4*A,hoverHandle:k,noHoverHandle:O})]})]})]})},hw=n.a.memo(fw),pw="Handle Group Move & Resize",yw=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=xw(f),P=s/2,S=T?m:0,H=Math.max(1,(c+s)/16),j=2*H/3,z=2*H/3,R=-m/2-d/2,D=Xw(si),W=Xw(tc),M=Xw(Sr),I=Xw(i.date),C=Xw(i.latitude),F=Object(Se.f)(),k=F.gl.domElement,O=F.camera,Y=F.raycaster,L=F.mouse,N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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 We.Vector3(d,u,R+a*x*n))}return e}),[g,y,x,c,s,R]),re=Object(r.useMemo)((function(){return ww(f)}),[f]),ne=Object(r.useMemo)((function(){if(T){if(p===te.NO_TRACKER)return new We.Euler(y,0,g,"ZXY");var e=Iy(oe,C),t=vw(l,re.z)-re.z;switch(p){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var a=Math.hypot(e.x,e.y);return new We.Euler(Math.atan2(a,e.z),0,Math.atan2(e.y,e.x)+vt-t,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new We.Euler(0,Math.atan2(e.x,e.z),-t+(c.1,de=S>0&&T;Object(r.useEffect)((function(){var e=function(){Nt.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?k.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?k.style.cursor="grab":k.style.cursor="pointer"))},fe=function(){J(null),k.style.cursor="default"},he=function(e){return E===e||Xw.getState().rotateHandleType===e?pt:ht};return Object(pf.jsxs)("group",{name:"Solar Panel Group",position:[a,o,S+n],rotation:re,children:[Object(pf.jsx)(gw,{solarPanelModel:e,groupRotation:re,panelRotation:ne}),ce&&Object(pf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,ne.z],children:[Object(pf.jsx)(uy,{id:t,position:[0,-P-j/2,S],color:he(q.Upper),ratio:j,handleType:q.Upper,hoverHandle:ue,noHoverHandle:fe}),Object(pf.jsx)(uy,{id:t,position:[0,P+j/2,S],color:he(q.Lower),ratio:j,handleType:q.Lower,hoverHandle:ue,noHoverHandle:fe})]}),se&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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),E){Nt.getState().setEnableOrbitController(!1),Z.current=!0,_.current=y;var t=Ww.getWorldDataById(l).rot;ee.current=t}D((function(e){e.rotateHandleType=q.Tilt}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:E===q.Tilt||K?pt:ht})}),K&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(){W(l.changedElementId,l.oldValue)},redo:function(){W(l.changedElementId,l.newValue)}};M(l)}},onPointerMove:function(e){if(Z.current&&(Y.setFromCamera(L,O),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 We.Vector3),r=(new We.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));W(t,n*=u),$.current=n}}}}},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,z],[0,0,1.75*z]],rotation:new We.Euler(y,0,ne.z,"ZXY"),lineWidth:1}),ae.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,ne.z,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*z],[0,0,2*z]],color:"white",transparent:!0,opacity:.5}),Object(pf.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(pf.jsx)("group",{rotation:new We.Euler(y,0,ne.z,"ZXY"),children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:b})},t)}))]})},gw=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,H=s.selected,j=s.locked,z=s.showLabel,R=s.label,D=s.pvModelName,W=s.orientation,M=s.frameColor,I=s.backsheetColor,C=s.color,F=s.poleHeight,k=Xw(si),O=Xw(os),Y=Xw(i.date),L=Xw(i.latitude),N=Xw(zu),U=Xw(Vi),E=bf(Us),J=Xw(Yi),G=Xw(o.solarPanelShininess),Q=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,Z=Object(r.useMemo)((function(){return{lng:U}}),[U]),_=xw(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[D];fe&&(m=Math.max(fe.thickness,.02));var he=Object(r.useMemo)((function(){return new Date(Y)}),[Y]),pe=Object(r.useMemo)((function(){return(R||me.t("shared.SolarPanelElement",Z))+(j?" ("+me.t("shared.ElementLocked",Z)+")":"")+(R?"":"\n"+me.t("word.Coordinates",Z)+": ("+w.toFixed(1)+", "+x.toFixed(1)+", "+v.toFixed(1)+") "+me.t("word.MeterAbbreviation",Z))}),[R,j,U,w,x,v]),ye=Object(r.useMemo)((function(){var e=[];if(fe){var t,l;W===$.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 We.Vector3(i*a-ce,-se,m),new We.Vector3(i*a-ce,se,m)]});for(var r=0;r<=l;r++)e.push({points:[new We.Vector3(-ce,r*o-se,m),new We.Vector3(ce,r*o-se,m)]})}return e}),[fe,W,D,y,g,m]),ge=Object(r.useState)(Fe()),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],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(null),Me=Object(Se.f)().gl,Ie=tg(y,g,fe,W,M,I),Ce=eg(h);function Fe(){var e=new We.Euler,t=vw(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),Iy(he,L).applyEuler(e)}function ke(e){return ze===e||N===e?pt:ht}function Oe(e,t){Nt.getState().setEnableOrbitController(!1),k((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(t)}))}return Object(Se.d)((function(){var e=Fe();e.equals(xe)||ve(e)})),Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Solar Panel Box Group",rotation:f,children:[Object(pf.jsxs)(Lt.a,{uuid:h,ref:De,args:[y,g,m],position:[0,0,de],onPointerDown:function(e){2!==e.button&&O(h,e,X.Select)},onContextMenu:function(e){O(h,e,X.Select),k((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),Me.domElement.style.cursor="move"))},onPointerOut:function(e){Pe(!1),Me.domElement.style.cursor="default"},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),E&&Ce?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Ce}):Ie?Q||0===G?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:Ie,color:C}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:We.FrontSide,map:Ie,color:C}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),0===(null===fe||void 0===fe?void 0:fe.bifacialityFactor)||Q||0===F&&0===A?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Ie?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:We.FrontSide,map:Ie,color:C}):null]}),H&&!j&&Object(pf.jsxs)("group",{name:pw,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===pw){var t=e.object.name;switch(t){case B.Default:Nt.getState().setEnableOrbitController(!1),k((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 We.Vector3(y,0,0));Oe(t,l);break;case K.Right:var a=e.object.localToWorld(new We.Vector3(-y,0,0));Oe(t,a);break;case K.Lower:var o=e.object.localToWorld(new We.Vector3(0,g,0));Oe(t,o);break;case K.Upper:var i=e.object.localToWorld(new We.Vector3(0,-g,0));Oe(t,i)}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(pw)){var t=e.object.name;Re(t),t===B.Top?Me.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?Me.domElement.style.cursor="grab":Me.domElement.style.cursor="pointer"}},onPointerOut:function(){Re(null),Me.domElement.style.cursor="default"},children:[Object(pf.jsx)(Lt.h,{args:[ie,6,6],name:B.Default,children:Object(pf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(pf.jsx)(Lt.a,{position:[0,-se,de],args:ue,name:K.Lower,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Lower)})}),Object(pf.jsx)(Lt.a,{position:[0,se,de],args:ue,name:K.Upper,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Upper)})}),Object(pf.jsx)(Lt.a,{position:[-ce,0,de],args:ue,name:K.Left,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Left)})}),Object(pf.jsx)(Lt.a,{position:[ce,0,de],args:ue,name:K.Right,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Right)})})]}),S&&xe.z>0&&Object(pf.jsx)(mw,{sunDirection:xe}),E&&Ce&&ye.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:h,args:[y,g],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),H&&j&&Object(pf.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||z)&&!H&&Object(pf.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)]})]})},mw=n.a.memo((function(e){var t=e.sunDirection,l=Xw(Kr),a=Object(r.useMemo)((function(){return Math.max(100,10*l)}),[l]);return Object(pf.jsxs)("group",{name:"Sun Beam Group",children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[t.clone().multiplyScalar(.5),Rt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:Rt.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})}));function ww(e){var t=Object(u.a)(e,3),l=t[0],a=t[1];return 1===t[2]?new We.Euler(0,0,0):0!==l?new We.Euler(vt,0,l*vt,"ZXY"):0!==a?new We.Euler(-a*vt,0,0):new We.Euler}function xw(e){return Math.abs(e[2]-1)<.01}function vw(e,t){return Ww.getWorldDataById(e).rot+t}var bw=n.a.memo(yw),Aw=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,H=e.lineWidth,j=void 0===H?.1:H,z=e.locked,R=void 0!==z&&z,D=e.showLabel,W=void 0!==D&&D,M=e.textureTypes,I=void 0===M?[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]:M,C=e.stackable,F=_f(s),k=Xw(si),O=Xw(Vi),Y=Xw(o.orthographic),L=Xw(Zr),N=Xw(an),U=Xw(rs),E=Xw(Kc),J=Xw(bn),G=Xw(Pn),Q=Xw(nn),Z=Xw(cn),_=Xw(sn),ee=Xw(os),te=Xw(ic),le=Xw(Ni),ae=Xw(o.shadowEnabled),oe=Xw(Sr),ie=Xw(Mu),re=Xw(Kn),ne=Xw(Bn),ce=Xw(on),se=bf(Us),ue=Xw(o.solarRadiationHeatmapMaxValue),fe=Af(wi),he=Xw(o.groundImage),pe=Xw(Vu),ye=Object(Se.f)(),ge=ye.camera,we=ye.gl.domElement,xe=ye.raycaster,ve=ye.mouse,be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useState)(null),Me=Object(u.a)(De,2),Ie=Me[0],Ce=Me[1],Fe=Object(r.useState)(null),ke=Object(u.a)(Fe,2),Oe=ke[0],Ye=ke[1],Le=Object(r.useState)(null),Ne=Object(u.a)(Le,2),Ue=Ne[0],Ee=Ne[1],Ve=Object(r.useState)(!1),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(!1),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],tt=Object(r.useRef)(null),lt=Object(r.useRef)(),at=Object(r.useRef)(null),ot=Object(r.useRef)(Rt),it=Object(r.useRef)(new We.Vector3(0,0,0)),rt=Object(r.useRef)(new We.Euler(0,0,0)),nt=Object(r.useRef)(new We.Vector3(1,1,1)),ct=Object(r.useRef)(new We.Vector3),dt=Object(r.useRef)(new We.Vector3),ut=Object(r.useRef)(new We.Vector3),ft=Object(r.useRef)(new We.Vector3),ht=Object(r.useRef)(new We.Vector3(1,1,1)),pt=Object(r.useRef)(new We.Vector3(1,1,1)),gt=Object(r.useRef)(0),mt=Object(r.useRef)(0),wt=Object(r.useRef)([]),xt=Object(r.useRef)([]),Pt=Object(r.useRef)(),Wt=Object(r.useRef)(new We.Vector3),Mt=Object(r.useRef)(0),It=Object(r.useMemo)((function(){return{lng:O}}),[O]),Ct=m/2,Ft=x/2,kt=b/2,Ot=Object(r.useMemo)((function(){return new We.Vector3}),[]);if(at.current&&at.current.type===V.SolarPanel){var Yt=xw(at.current.normal)?at.current.poleHeight:0;Ot.set(0,0,e.lz/2+Yt)}var Ut=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.CuboidElement",It))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",It)+")":"")+((null===e||void 0===e?void 0:e.label)?"":"\n"+me.t("word.Coordinates",It)+": ("+p.toFixed(1)+", "+y.toFixed(1)+", "+(b/2).toFixed(1)+") "+me.t("word.MeterAbbreviation",It))}),[null===e||void 0===e?void 0:e.label,R,O,p,y,b]);Object(r.useEffect)((function(){var e=function(){at.current=null,Qe(!1),Nt.getState().setEnableOrbitController(!0)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Xw.getState().tempHumanPlant.length>0&&k((function(e){var t;(t=e.elements).push.apply(t,Object(f.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&&Pe(Ww.fetchHeatmapTexture(l,t));var a=fe(e.id+"-south");a&&Re(Ww.fetchHeatmapTexture(a,t));var o=fe(e.id+"-north");o&&Ce(Ww.fetchHeatmapTexture(o,t));var i=fe(e.id+"-west");i&&Ye(Ww.fetchHeatmapTexture(i,t));var r=fe(e.id+"-east");r&&Ee(Ww.fetchHeatmapTexture(r,t,!0))}}),[se,ue]);var Et=function(e){switch(e){case de.Facade01:return ew;case de.Facade02:return tw;case de.Facade03:return lw;case de.Facade04:return aw;case de.Facade05:return ow;case de.Facade06:return iw;case de.Facade07:return rw;case de.Facade08:return nw;case de.Facade09:return cw;case de.Facade10:return sw;default:return Tf}},Vt=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}}},Jt=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[0]):Tf,(function(e){var t=Vt(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=We.RepeatWrapping,Kt(e)}))}),[I[0],x,b]),Gt=Object(r.useState)(Jt),Xt=Object(u.a)(Gt,2),Bt=Xt[0],Kt=Xt[1],qt=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[1]):Tf,(function(e){var t=Vt(I[1]);e.repeat.set(x/t.x,b/t.y),e.rotation=-vt,e.wrapS=e.wrapT=We.RepeatWrapping,$t(e)}))}),[I[1],x,b]),Qt=Object(r.useState)(qt),Zt=Object(u.a)(Qt,2),_t=Zt[0],$t=Zt[1],el=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[2]):Tf,(function(e){var t=Vt(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=We.RepeatWrapping,ol(e)}))}),[I[2],m,b]),tl=Object(r.useState)(el),ll=Object(u.a)(tl,2),al=ll[0],ol=ll[1],il=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[3]):Tf,(function(e){var t=Vt(I[3]);e.repeat.set(m/t.x,b/t.y),e.wrapS=e.wrapT=We.RepeatWrapping,sl(e)}))}),[I[3],m,b]),rl=Object(r.useState)(il),nl=Object(u.a)(rl,2),cl=nl[0],sl=nl[1],dl=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[4]):Tf,(function(e){var t=Vt(I[4]);e.repeat.set(m/t.x,x/t.y),e.wrapS=e.wrapT=We.RepeatWrapping,pl(e)}))}),[I[4],m,x]),ul=Object(r.useState)(dl),fl=Object(u.a)(ul,2),hl=fl[0],pl=fl[1];Object(r.useEffect)((function(){Object(Se.c)()}),Object(f.a)(I));var yl=function(e){ot.current=e;var t=.01;Ww.isSame(ot.current,Rt)?(it.current=new We.Vector3(0,0,kt+t),rt.current=new We.Euler(0,0,0),nt.current.set(Ct,Ft,kt)):Ww.isSame(ot.current,St)?(it.current=new We.Vector3(Ct+t,0,0),rt.current=new We.Euler(0,vt,0),nt.current.set(kt,Ft,Ct)):Ww.isSame(ot.current,Ht)?(it.current=new We.Vector3(-Ct-t,0,0),rt.current=new We.Euler(0,-vt,0),nt.current.set(kt,Ft,Ct)):Ww.isSame(ot.current,zt)?(it.current=new We.Vector3(0,-Ft-t,0),rt.current=new We.Euler(vt,0,0),nt.current.set(Ct,kt,Ft)):Ww.isSame(ot.current,jt)&&(it.current=new We.Vector3(0,Ft+t,0),rt.current=new We.Euler(-vt,0,0),nt.current.set(Ct,kt,Ft))},gl=Math.max(1,Math.max(m,x)/8),ml=st*gl,wl=Ww.isIdentical(null===(t=at.current)||void 0===t?void 0:t.normal,Tt),xl=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",It)),!1):!(Ww.isIdentical(t.normal,Tt)&&!Ww.isSolarCollectorWithinHorizontalSurface(o,e))||(Qh(me.t("message.MoveOutsideBoundaryCancelled",It)),!1)},vl=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,!!Ww.isSolarCollectorWithinHorizontalSurface(r,e)},bl=he?Y?.25:.75:1,Al=[se&&Ue?Ue:Bt,se&&Oe?Oe:_t,se&&Ie?Ie:al,se&&ze?ze:cl,se&&Te?Te:hl,null],Tl=e&&e.faceColors?[0,1,2,3,4,5].map((function(t){return I&&I[t]!==de.NoTexture?se?Object(pf.jsx)("meshBasicMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):se?Object(pf.jsx)("meshBasicMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attachArray:"material",color:e.faceColors?e.faceColors[t]:T,map:Al[t],transparent:Y&&he,opacity:bl},t)})):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attach:"material",color:T,transparent:Y&&he,opacity:bl}),Pl=Object(r.useMemo)((function(){return[Ct,Ft,kt]}),[Ct,Ft,kt]),Sl=F&&!R&&!pe;return Object(pf.jsxs)("group",{ref:tt,name:"Cuboid Group "+s,userData:{aabb:!0},children:[Object(pf.jsx)(Lt.a,{castShadow:ae,receiveShadow:ae,userData:{simulation:!0,stand:!0,stackable:C},uuid:s,ref:lt,args:[m,x,b],name:"Cuboid "+s,onContextMenu:function(e){ee(s,e,X.Select),k((function(t){t.pastePoint.copy(e.intersections[0].point);var l=e.intersections[0].face;(l&&(t.pasteNormal=l.normal.clone(),Ww.isSame(l.normal,St)?t.selectedSideIndex=0:Ww.isSame(l.normal,Ht)?t.selectedSideIndex=1:Ww.isSame(l.normal,jt)?t.selectedSideIndex=2:Ww.isSame(l.normal,zt)?t.selectedSideIndex=3:Ww.isSame(l.normal,Rt)&&(t.selectedSideIndex=4)),t.clickObjectType=V.Cuboid,e.intersections.length>0)&&(e.intersections[0].object===lt.current&&(t.contextMenuObjectType=V.Cuboid))}))},onPointerDown:function(t){if(2!==t.button){ie()||ee(s,t,X.Select);var l=N(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Xw.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===s||a){if(Xw.getState().groupActionMode){var o=Ww.getBaseId(s);Xw.getState().setGroupMasterId(o)}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}(Xw.getState().objectTypeToAdd)&&e){Qe(!0);var i=function(t){var l,a=t.intersections[0];if(Xw.getState().objectTypeToAdd===V.SolarPanel){var o,i,r,n,c,d,u,f,h=a.point,p=Ww.getWorldDataById(s),y=p.pos,g=p.rot,w=(new We.Vector3).subVectors(h,y).applyEuler(new We.Euler(0,0,-g)),v=Vl.makeSolarPanel(e,Xw.getState().getPvModule(null!==(o=Xw.getState().actionState.solarPanelModelName)&&void 0!==o?o:"SPR-X21-335-BLK"),w.x/m,w.y/x,w.z/b,null!==(i=Xw.getState().actionState.solarPanelOrientation)&&void 0!==i?i:$.landscape,null!==(r=Xw.getState().actionState.solarPanelPoleHeight)&&void 0!==r?r:1,null!==(n=Xw.getState().actionState.solarPanelPoleSpacing)&&void 0!==n?n:3,null!==(c=Xw.getState().actionState.solarPanelTiltAngle)&&void 0!==c?c:0,null!==(d=Xw.getState().actionState.solarPanelRelativeAzimuth)&&void 0!==d?d:0,null===(u=a.face)||void 0===u?void 0:u.normal,[0,0,0],null!==(f=Xw.getState().actionState.solarPanelFrameColor)&&void 0!==f?f:"white");return k((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(i){var r={name:"Add",timestamp:Date.now(),addedElement:i,undo:function(){E(r.addedElement.id,!1)},redo:function(){k((function(e){e.elements.push(r.addedElement),e.selectedElement=r.addedElement}))}};oe(r),k((function(e){e.objectTypeToAdd=V.None}))}}else Nt.getState().selectNone(),Nt.setState((function(e){e.cuboidRef=tt}))}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 n,c=Ww.getWorldDataById(s),u=c.rot,f=c.pos;Wt.current.copy(f),Mt.current=u,at.current=l;var p,y=Object(h.a)(t.intersections);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.object===lt.current){n=g.face;break}}}catch(w){y.e(w)}finally{y.f()}switch(n&&(yl(n.normal),$e&&$e.equals(n.normal)||et(n.normal)),Nt.getState().setEnableOrbitController(!1),ct.current.x=l.cx,ct.current.y=l.cy,ct.current.z=l.cz,ut.current.fromArray(l.normal),ht.current.x=l.lx,ht.current.y=l.ly,ht.current.z=l.lz,l.type){case V.SolarPanel:gt.current=l.relativeAzimuth;break;case V.Polygon:wt.current=l.vertices.map((function(e){return Object(d.a)({},e)}))}}}},onPointerMove:function(t){if(at.current&&e){if(at.current.type===V.SolarPanel&&wl)return;if(at.current.parentId===s&&at.current.type&&!at.current.locked){var l=new We.Vector2(t.offsetX/we.clientWidth*2-1,1-t.offsetY/we.clientHeight*2);if(xe.setFromCamera(l,ge),lt.current){var a=xe.intersectObjects([lt.current]);if(a.length>0){var o=a[0].point,i=a[0].face;if(Xw.getState().moveHandleType){if(i){var r=i.normal;$e&&!$e.equals(r)&&et(r),yl(r),_(at.current.id,r.x,r.y,r.z)}if(o=Ww.relativeCoordinates(o.x,o.y,o.z,e),at.current.type===V.Polygon){var n=at.current;if(Xw.getState().moveHandleType===B.Default){var c,f,h=Ww.calculatePolygonCentroid(wt.current),p=(new We.Vector3).fromArray(n.normal);Ww.isSame(p,St)?(c=-(h.x+o.z),f=o.y-h.y):Ww.isSame(p,Ht)?(c=o.z-h.x,f=o.y-h.y):Ww.isSame(p,jt)?(c=o.x-h.x,f=-(h.y+o.z)):Ww.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=wt.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(at.current.id,o.x,o.y,o.z)}else if(Xw.getState().resizeHandleType)switch(at.current.type){case V.SolarPanel:var g=at.current,w=Km(g),v=Object(u.a)(w,2),A=v[0],T=v[1],P=Xw.getState().resizeAnchor,S=Xw.getState().resizeHandleType;if(S===K.Lower||S===K.Upper){var H=Math.max(1,Math.round(Math.abs(o.z-P.z)/T))*T,j=new We.Vector3(0,0,o.z-P.z).normalize().multiplyScalar(H),z=(new We.Vector3).addVectors(P,j.clone().divideScalar(2));k((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(t.cz=(z.z-Wt.current.z)/b,t.ly=Math.abs(j.z))}))}else if(S===K.Left||S===K.Right){var R=(new We.Vector3).subVectors(o,P).setZ(0),D=Math.max(1,Math.round(R.length()/A))*A,W=R.clone().normalize().multiplyScalar(D),M=(new We.Vector3).addVectors(P,W.clone().divideScalar(2)),I=(new We.Vector3).subVectors(M,Wt.current).applyEuler(new We.Euler(0,0,-Mt.current));k((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=W.length())}))}break;case V.Polygon:if(Xw.getState().resizeHandleType===K.Default){var C,F,O=new We.Vector3(o.x-Wt.current.x,o.y-Wt.current.y,0).applyEuler(new We.Euler(0,0,-Mt.current,"ZXY")),Y=at.current,L=(new We.Vector3).fromArray(Y.normal);Ww.isSame(L,St)?(C=e.lz,F=e.ly,O.x=-o.z+Wt.current.z):Ww.isSame(L,Ht)?(C=e.lz,F=e.ly,O.x=o.z-Wt.current.z):Ww.isSame(L,jt)?(C=e.lx,F=e.lz,O.y=-o.z+Wt.current.z):Ww.isSame(L,zt)?(C=e.lx,F=e.lz,O.y=o.z-Wt.current.z):(C=e.lx,F=e.ly),(O=Xw.getState().enableFineGrid?Ww.snapToFineGrid(O):Ww.snapToNormalGrid(O)).x/=C,O.y/=F,ne(Y.id,Y.selectedIndex,O.x,O.y)}}}}}}},onPointerUp:function(){if(at.current){var t=L(at.current.id);if(t&&t.parentId===s){if(t.type===V.Polygon){if(Xw.getState().moveHandleType||Xw.getState().resizeHandleType){xt.current=t.vertices.map((function(e){return Object(d.a)({},e)}));var l={name:Xw.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:wt.current,newValue:xt.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(Xw.getState().resizeHandleType){if(dt.current.x=t.cx,dt.current.y=t.cy,dt.current.z=t.cz,pt.current.x=t.lx,pt.current.y=t.ly,pt.current.z=t.lz,dt.current.distanceToSquared(ct.current)>At&&pt.current.distanceToSquared(ht.current)>At){var a={name:"Resize",timestamp:Date.now(),resizedElementId:at.current.id,resizedElementType:at.current.type,oldCx:ct.current.x,oldCy:ct.current.y,oldCz:ct.current.z,newCx:dt.current.x,newCy:dt.current.y,newCz:dt.current.z,oldLx:ht.current.x,oldLy:ht.current.y,oldLz:ht.current.z,newLx:pt.current.x,newLy:pt.current.y,newLz:pt.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(Xw.getState().rotateHandleType){if(at.current.type===V.SolarPanel){var o=at.current;if(Math.abs(mt.current-gt.current)>At)if(function(t,l){var a=JSON.parse(JSON.stringify(t));return a.relativeAzimuth=l,ce(a)?(Qh(me.t("message.RotationCancelledBecauseOfOverlap",It)),!1):!!Ww.isSolarCollectorWithinHorizontalSurface(a,e)||(Qh(me.t("message.RotationOutsideBoundaryCancelled",It)),!1)}(o,mt.current)){k((function(e){e.selectedElementAngle=mt.current}));var i={name:"Rotate",timestamp:Date.now(),oldValue:gt.current,newValue:mt.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,gt.current)}}else if(dt.current.x=t.cx,dt.current.y=t.cy,dt.current.z=t.cz,ft.current.fromArray(t.normal),dt.current.distanceToSquared(ct.current)>At){var r=!0;if(t.type===V.SolarPanel&&(r=xl(t,t.cx,t.cy)),r){var n,c={name:"Move",timestamp:Date.now(),movedElementId:at.current.id,movedElementType:null===(n=at.current)||void 0===n?void 0:n.type,oldCx:ct.current.x,oldCy:ct.current.y,oldCz:ct.current.z,oldNormal:ut.current.clone(),newCx:dt.current.x,newCy:dt.current.y,newCz:dt.current.z,newNormal:ft.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,ct.current.x,ct.current.y,ct.current.z)}at.current=null}}},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===lt.current&&Xe(!0))},onPointerOut:function(){if(Xe(!1),at.current)switch(at.current.type){case V.Human:case V.Tree:case V.Flower:Qe(!1);break;case V.SolarPanel:var e=Xw.getState().getElementById(at.current.id);Xw.getState().moveHandleType&&!xl(e,e.cx,e.cy)&&Q(e.id,ct.current.x,ct.current.y,ct.current.z)}},onPointerEnter:function(e){at.current&&Ww.isPlantOrHuman(at.current)&&(e.intersections[0].object===lt.current&&Qe(!0))},children:Tl}),(null===(l=at.current)||void 0===l?void 0:l.type)===V.SolarPanel&&wl&&!at.current.locked&&Object(pf.jsx)(Lt.f,{ref:Pt,name:"Cuboid Intersection Plane",position:Ot,args:[m,x],visible:!1,onPointerMove:function(t){if(Pt.current&&at.current&&e){if(at.current.type!==V.SolarPanel||!wl)return;var l=at.current;if(l.parentId!==s||l.locked)return;xe.setFromCamera(ve,ge);var a=xe.intersectObjects([Pt.current]);if(a.length>0){var o=a[0].point.clone();if(Xw.getState().moveHandleType)o=Ww.relativeCoordinates(o.x,o.y,o.z-l.poleHeight,e),Q(l.id,o.x,o.y,o.z);else if(Xw.getState().rotateHandleType&&Xw.getState().rotateHandleType!==q.Tilt){var i=Mt.current,r=new We.Vector2(Wt.current.x,Wt.current.y),n=new We.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,i),c=(new We.Vector2).addVectors(n,r),d=-i+Math.atan2(-o.x+c.x,o.y-c.y)+(Xw.getState().rotateHandleType===q.Lower?0:Math.PI),u=d+(Math.abs(d)>Math.PI?-Math.sign(d)*bt:0);te(l.id,u),mt.current=u}else if(Xw.getState().resizeHandleType){var f=Xw.getState().resizeAnchor,h=le(l.pvModelName),p=new We.Vector2(o.x,o.y),y=new We.Vector2(f.x,f.y),g=p.distanceTo(y),w=l.relativeAzimuth+Mt.current,v=(new We.Vector2).subVectors(p,y);switch(Xw.getState().resizeHandleType){case K.Lower:case K.Upper:var b=Xw.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,H=new We.Vector2(P,S),j=new We.Vector2(Wt.current.x,Wt.current.y),z=(new We.Vector2).subVectors(H,j).rotateAround(Dt,-Mt.current),R=z.x/m,D=z.y/x;vl(l,R,D,l.lx,T)&&(G(l.id,T),Q(l.id,R,D));break;case K.Left:case K.Right:var W=Xw.getState().resizeHandleType===K.Left?-1:1,M=v.angle()-w+(Xw.getState().resizeHandleType===K.Left?Math.PI:0),I=g*Math.cos(M);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+W*(I*Math.cos(w))/2,F=f.y+W*(I*Math.sin(w))/2,k=new We.Vector2(C,F),O=new We.Vector2(Wt.current.x,Wt.current.y),Y=(new We.Vector2).subVectors(k,O).rotateAround(Dt,-Mt.current),L=Y.x/m,N=Y.y/x;vl(l,L,N,I,l.ly)&&(J(l.id,I),Q(l.id,L,N))}}}}}}),qe&&Object(pf.jsxs)(pf.Fragment,{children:[(Xw.getState().moveHandleType||Xw.getState().resizeHandleType)&&Object(pf.jsx)(yf,{hx:nt.current.x,hy:nt.current.y,hz:nt.current.z,position:it.current,rotation:rt.current}),Xw.getState().rotateHandleType&&at.current&&at.current.type===V.SolarPanel&&Object(pf.jsx)(sy,{element:at.current,height:at.current.poleHeight+kt})]}),F&&Object(pf.jsx)(yy,{element:e,verticalLift:ml}),(!F||he)&&Object(pf.jsx)(hy,{hx:Ct,hy:Ft,hz:kt,lineColor:he&&Y?"white":S,lineWidth:he&&Y?5*j:j}),F&&R&&Object(pf.jsx)(hy,{hx:Ct,hy:Ft,hz:kt,lineColor:yt,lineWidth:5*j}),Sl&&Object(pf.jsx)(hw,{id:s,args:Pl}),(Ge||W)&&!F&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:Ut,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,kt+(null!==(c=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==c?c:.2)]})]})},Tw=n.a.memo(Aw),Pw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,f=e.lx,p=void 0===f?1:f,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,H=void 0===S?"black":S,j=e.lineWidth,z=void 0===j?.1:j,R=e.locked,D=void 0!==R&&R,W=e.showLabel,M=void 0!==W&&W,I=e.parentId,C=e.foundationId,F=(e.light,e.heatFlux,Xw(si)),k=Xw(Vi),O=Xw(o.shadowEnabled),Y=Xw(os),L=_f(n),N=Object(Se.f)().gl.domElement,U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],G=E[1],K=Object(r.useRef)(),q=Object(r.useRef)(),Q=Object(r.useMemo)((function(){return{lng:k}}),[k]),Z=Xw((function(e){var t,l=Object(h.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()}})),_=Xw((function(e){var t,l=Object(h.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,Ww.isZero(v[2]))c=Z.cx+c*Z.lx,s=Z.cy+s*Z.ly;else{var $=new We.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=Ww.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=Ww.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 We.Euler(vt,0,t,"ZXY")}if((null===Z||void 0===Z?void 0:Z.type)===V.Roof)return new We.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 ww(A);var l=(new We.Vector3).fromArray(A);return Ww.isSame(l,St)?new We.Euler(0,vt,v[2],"ZXY"):Ww.isSame(l,Ht)?new We.Euler(0,-vt,v[2],"ZXY"):Ww.isSame(l,jt)?new We.Euler(-vt,0,v[2],"ZXY"):Ww.isSame(l,zt)?new We.Euler(vt,0,v[2],"ZXY"):new We.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,k,c,s,d]);return Object(pf.jsxs)("group",{name:"Sensor Group "+n,rotation:ae,position:[c,s,d+le],children:[Object(pf.jsx)(Lt.a,{receiveShadow:O,uuid:n,ref:K,args:[p,g,w],name:"Sensor",onPointerDown:function(e){2!==e.button&&(Y(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),F((function(e){e.moveHandleType=B.Default})))},onContextMenu:function(e){Y(n,e),F((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),N.style.cursor="move"))},onPointerOut:function(){G(!1),N.style.cursor="default"},children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:(null===e||void 0===e?void 0:e.lit)?pt:P})}),Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Meter",castShadow:!1,receiveShadow:!1,args:[.3*p,.3*g,le,8,1],position:new We.Vector3(0,0,le),rotation:[vt,0,0],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"black"})}),!L&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:H,lineWidth:z}),L&&D&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*z}),L&&!D&&Object(pf.jsx)(Lt.h,{ref:q,position:new We.Vector3(0,0,0),args:[st,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){Y(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),F((function(e){e.moveHandleType=B.Default}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),(J||M)&&!L&&Object(pf.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)]})]})},Sw=n.a.memo(Pw),Hw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,f=e.lx,p=void 0===f?1:f,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),H=void 0===S?.1:S,j=e.locked,z=void 0!==j&&j,R=e.showLabel,D=void 0!==R&&R,W=e.parentId,M=e.foundationId,I=e.decay,C=void 0===I?2:I,F=e.distance,k=void 0===F?5:F,O=e.intensity,Y=void 0===O?3:O,L=e.inside,N=void 0!==L&&L,U=Xw(si),E=Xw(Vi),J=Xw(o.shadowEnabled),G=Xw(os),K=Xw(Ls).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:E}}),[E]),oe=Xw((function(e){var t,l=Object(h.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()}})),ie=Xw((function(e){var t,l=Object(h.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()}})),re=.1;if(W&&oe)switch(oe.type){case V.Foundation:if(d=oe.cz+oe.lz/2,Ww.isZero(v[2]))c=oe.cx+c*oe.lx,s=oe.cy+s*oe.ly;else{var ne=new We.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=Ww.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=Ww.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 We.Euler(vt,0,t,"ZXY")}if((null===oe||void 0===oe?void 0:oe.type)===V.Roof)return new We.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 ww(A);var l=(new We.Vector3).fromArray(A);return Ww.isSame(l,St)?new We.Euler(0,vt,v[2],"ZXY"):Ww.isSame(l,Ht)?new We.Euler(0,-vt,v[2],"ZXY"):Ww.isSame(l,jt)?new We.Euler(-vt,0,v[2],"ZXY"):Ww.isSame(l,zt)?new We.Euler(vt,0,v[2],"ZXY"):new We.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,E,c,s,d]);return Object(pf.jsxs)("group",{name:"Light Group "+n,rotation:ue,position:[c,s,d],children:[K&&Object(pf.jsx)("pointLight",{color:P,name:"Point Light "+n,position:[0,0,N?-re-de:de],decay:C,distance:k,intensity:Y,castShadow:!0}),Object(pf.jsx)(Lt.d,{receiveShadow:J,userData:{unintersectable:!0},uuid:n,ref:te,position:[0,0,N?-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),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=W,e.oldParentId=W,e.oldFoundationId=M})))},onContextMenu:function(e){G(n,e),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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightgray"})}),Object(pf.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 We.Vector3(0,0,N?-re-de:de),rotation:[vt,0,0],children:K?Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"}):Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),q&&z&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*H}),q&&!z&&Object(pf.jsx)(Lt.h,{ref:le,position:new We.Vector3(0,0,N?-re-de:de),args:[st,6,6,N?Math.PI:0,Math.PI],name:B.Default,onPointerDown:function(e){G(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=W,e.oldParentId=W,e.oldFoundationId=M}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),($||D)&&!q&&Object(pf.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,(N?-re:0)+w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},jw=n.a.memo(Hw),zw="Cuboid Wrapper",Rw="Cuboid Stackable Child",Dw=function e(t){var l=t.elements,a=t.cuboidModel,o=a.id,i=a.parentId,r=a.cx,n=a.cy,c=a.lz,s=a.rotation,u=a.locked,f=Xw(Vu),h=Zf(a,f),p=h.baseGroupSet,y=h.childCuboidSet,g=h.groupMasterDimension,m=h.groupMasterPosition,w=h.groupMasterRotation,x=c/2,v=!(i!==xt||u||f!==o||!a||!g);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:zw,position:[r,n,x],rotation:[0,0,s[2]],children:[Object(pf.jsx)(Tw,Object(d.a)({},a)),l.map((function(t){if(function(e){return _m(e)&&e.parentId===a.id}(t))return Object(pf.jsx)("group",{name:Rw,position:[0,0,x],children:Object(pf.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(pf.jsx)(bw,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(pf.jsx)(Sw,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(pf.jsx)(jw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);default:return null}}}))]}),v&&Object(pf.jsx)(Zy,{baseGroupSet:p,childCuboidSet:y,initalPosition:m,initalDimension:g,initalRotation:w})]})},Ww=function(){function e(){Object(je.a)(this,e)}return Object(ke.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 We.Quaternion;r.setFromUnitVectors(e,t);var n=new We.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(h.a)(n);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(!f.leftJoints||0===f.leftJoints.length)return D.WALL_DISJOINED;if(!f.rightJoints||0===f.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 We.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 We.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(h.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(h.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(h.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===Gy.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===Gy.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(h.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 We.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(f.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(h.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,Ht)}},{key:"isUnitVectorY",value:function(t){return e.isSame(t,jt)||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(h.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(h.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 We.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 We.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=Xw.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 f,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(h.a)(o);try{for(y.s();!(f=y.n()).done;){var g=f.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 We.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(h.a)(Xw.getState().elements);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(e.isLegalOnWall(f.type)&&f.type!==V.Polygon&&f.parentId===t.parentId&&f.id!==t.id){var p=f.lx/2,y=f.lz/2;l&&f.type===V.SolarPanel&&(p/=l.lx,y=f.ly/2/l.lz);var g=f.cx-p,m=f.cx+p,w=f.cz-y,x=f.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=Xw.getState().getElementById(e.foundationId);if(l){var a=Zm.getSolarPanelVerticesOnRoof(e,l),o=Zm.getRoofBoundaryVertices(t);return Zm.rooftopElementBoundaryCheck(a,o)?Zm.rooftopSPCollisionCheck(e,l,a)?ye.Valid:ye.OverLap:ye.OutsideBoundary}}return ye.Invalid}},{key:"relativeCoordinates",value:function(t,l,a,o){var i=new We.Vector3(t,l,a);if(o.type===V.Wall){var r=new We.Vector3(o.cx,o.cy),n=Xw.getState().getParent(o);if(n){var c=new We.Vector3(n.cx,n.cy);r.applyEuler(new We.Euler(0,0,n.rotation[2])).add(c).setZ(n.lz+o.lz/2),i.sub(r).applyEuler(new We.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 We.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 We.Vector3(n.cx,n.cy,n.cz),i).setZ(n.lz/2+i.lz),d=new We.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 We.Vector3(s.x+d.x+u,s.y+d.y+f,s.z+d.z)}return new We.Vector3(s.x+d.x,s.y+d.y,s.z+d.z)}}if(o.type===V.Roof&&i){var h=new We.Vector3(t*i.lx,l*i.ly,a+i.lz);return h.applyEuler((new We.Euler).fromArray(i.rotation)),h.x+=i.cx,h.y+=i.cy,h}var p=new We.Vector3(t*o.lx,l*o.ly,a*o.lz);return p.applyEuler((new We.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 We.Vector3(e,t,l);return o.applyEuler((new We.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 We.Vector3(e.x-t.cx,e.y-t.cy,e.z-t.cz);return l.applyEuler((new We.Euler).fromArray(t.rotation.map((function(e){return-e})))),l}},{key:"wallAbsolutePosition",value:function(e,t){var l=new We.Vector3(t.cx,t.cy);return(new We.Vector3).addVectors(l,new We.Vector3(e.x,e.y).applyAxisAngle(Rt,t.rotation[2]))}},{key:"wallRelativePosition",value:function(e,t){var l=new We.Vector3(t.cx,t.cy);return(new We.Vector3).subVectors(new We.Vector3(e.x,e.y),l).applyAxisAngle(Rt,-t.rotation[2])}},{key:"getObjectChildById",value:function(t,l){if(t){var a,o=Object(h.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name===zw){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(h.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===Rw){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=Ot.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:Xw.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=Xw.getState().getElementById(l.leftJoints[0])}for(o.reverse(),l=Xw.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=Xw.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?Xw.getState().getElementById(p[0]):null,m=y.length>0?Xw.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}}]),e}();Ww.WATER_TEXTURE=Ww.fetchWaterTexture(100,100),Ww.WHITE_TEXTURE=Ww.fetchWhiteTexture(2,2),Ww.getAllConnectedWalls=function(e){for(var t=Xw.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},Ww.getWorldDataById=function(e){var t=Xw.getState().getElementById(e);if(!t)return{pos:new We.Vector3,rot:0,topZ:0};var l=new We.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=Ww.getWorldDataById(t.parentId),r=i.pos,n=i.rot,c=i.topZ,s=new We.Euler(0,0,n);return{pos:(new We.Vector3).addVectors(l.applyEuler(s),r.clone().setZ(c)),rot:a+n,topZ:o+c}},Ww.isChild=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=Xw.getState().getElementById(t);return!!a&&((!l||!a.locked)&&(a.parentId===e||Ww.isChild(e,a.parentId,l)))},Ww.getBaseId=function(e){var t=Xw.getState().getElementById(e);return t?t.parentId===xt?t.id:Ww.getBaseId(t.parentId):null},Ww.ifNeedListenToAutoDeletion=function(e){if(e.type!==V.Wall)return!1;var t=e;if(!t.roofId)return!1;var l=Xw.getState().getElementById(t.roofId);if(!l)return!1;switch(l.roofType){case It.Hip:case It.Gable:case It.Gambrel:return!0;case It.Pyramid:case It.Mansard:return 0!==l.wallsId.length&&l.wallsId[0]===t.id;default:return!1}};var Mw=function(){function e(){Object(je.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(ke.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}(),Iw=function(){function e(){Object(je.a)(this,e)}return Object(ke.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(f.a)(e.normal),rotation:Object(f.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(f.a)(e.normal),rotation:Object(f.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(f.a)(e.normal),rotation:Object(f.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(f.a)(t.normal),rotation:t.parentId?Object(f.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){Ww.isSame(r,Ht)?u=null!==o&&void 0!==o?o:0:Ww.isSame(r,St)?u=-(null!==o&&void 0!==o?o:0):Ww.isSame(r,zt)?p=null!==o&&void 0!==o?o:0:Ww.isSame(r,jt)&&(p=-(null!==o&&void 0!==o?o:0));var y=r.dot((new We.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}(),Yw=function e(t){Object(je.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=M.DAILY_TOTAL_OUTPUT,this.selectionMethod=C.ROULETTE_WHEEL,this.searchMethod=F.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},Lw=function e(t){Object(je.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=M.DAILY_TOTAL_OUTPUT,this.searchMethod=F.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},Nw=function e(){Object(je.a)(this,e),this[Pe.c]=!0,this.geneticAlgorithmParams=void 0,this.particleSwarmOptimizationParams=void 0,this.geneticAlgorithmParams=new Yw(W.SOLAR_PANEL_TILT_ANGLE),this.particleSwarmOptimizationParams=new Lw(W.SOLAR_PANEL_TILT_ANGLE)},Uw=function e(){Object(je.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},Ew=function e(){Object(je.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},Vw=function e(){Object(je.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.windowMullion=void 0,this.windowMullionWidth=void 0,this.windowMullionSpacing=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=Ee.Default,this.wallStructureSpacing=2,this.wallStructureWidth=.1,this.wallStructureColor="#ffffff",this.wallOpacity=.5,this.wallRValue=2,this.wallVolumetricHeatCapacity=.5,this.wallEavesLength=.3,this.wallParapet=up,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=Gy.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.windowMullion=!0,this.windowMullionWidth=.06,this.windowMullionSpacing=.5,this.windowMullionColor="#ffffff",this.windowFrame=!1,this.windowFrameWidth=.1,this.windowSillWidth=.1,this.windowType=Yt.Default,this.windowArchHeight=1,this.windowShutterLeft=Kg.showLeft,this.windowShutterRight=Kg.showRight,this.windowShutterColor=Kg.color,this.windowShutterWidth=Kg.width,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},Jw=function e(){Object(je.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},Gw=function(){function e(){Object(je.a)(this,e)}return Object(ke.a)(e,null,[{key:"getDefaultHiddenParameters",value:function(e){return e===W.SOLAR_PANEL_ARRAY?["latitude","orientation","poleHeight"]:[]}},{key:"getVariables",value:function(e,t){if(e===W.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===W.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===W.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===W.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===W.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===W.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]=Ww.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]=Ww.calculateCost(a);break;case"totalYearlyYield":l[t]=.001*a.yearlyYield;break;case"meanYearlyYield":l[t]=a.yearlyYield/a.panelCount;break;case"yearlyProfit":l[t]=Ww.calculateProfit(a)}}}]),e}();Object(Pe.b)();var Xw=y()(Object(Ve.a)(Object(Ve.b)((function(e,t){var l=function(t){return e(Object(Pe.a)(t))},a=new Mw,o=a.getElements();return{set:function(e){try{l(e)}catch(t){console.log(t)}},world:a,elements:o,user:{},viewState:new Cw,actionState:new Vw,graphState:new Jw,solarPanelArrayLayoutParams:new kw,solarPanelArrayLayoutConstraints:new Uw,evolutionaryAlgorithmState:new Nw,economicsParams:new Ew,geneticAlgorithmWizardSelectedTab:"1",particleSwarmOptimizationWizardSelectedTab:"1",modelType:R.UNKNOWN,modelAuthor:null,modelLabel:null,modelDescription:null,projectView:!1,projectInfo:{owner:null,title:null,description:null,type:W.SOLAR_PANEL_ARRAY,designs:new Array,ranges:new Array,hiddenParameters:Gw.getDefaultHiddenParameters(W.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 We.Raycaster,mouse:new We.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(f){r.e(f)}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(h.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(Ww.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(h.a)(t().elements);try{for(u.s();!(c=u.n()).done;){var f=c.value;if(f.type===e.type&&f.parentId===e.parentId&&f.id!==e.id){var p=(e.cx-f.cx)*(d?d.lx:1),y=(e.cy-f.cy)*(d?d.ly:1),g=(e.cz-f.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;l.multiSelectionsMode?l.selectedElementIdSet.has(e)?l.selectedElementIdSet.delete(e):l.selectedElementIdSet.add(e):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e));var s,d=Object(h.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===e?(u.selected=!0,l.selectedElement=u,l.selectedElementHeight=u.lz):u.selected=!1}}catch(f){d.e(f)}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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;(n.id!==e||n.locked)&&(n.parentId!==e||_m(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(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.drawSunBeam=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorDrawSunBeamAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.relativeAzimuth=t,l.selectedElementAngle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.relativeAzimuth=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorRelativeAzimuthForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.poleHeight=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.poleHeight=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleHeightForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.poleRadius=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.poleRadius=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleRadiusForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isCspCollector(i)){i.reflectance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceAboveFoundation:function(e,t,a){Ww.isCspCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isCspCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.absorptance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.opticalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.thermalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.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&&t2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0,r=t().elements.filter((function(t){return t.id===e||Ww.isChild(e,t.id)}));return l((function(t){var l,r=Object(h.a)(t.elements);try{var n=function(){var o=l.value;if(o.id===e){if(a)if(o.type===V.Polygon){var r=Ww.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:t.deletedRoofId=o.id,Af.getState().deleteRoofSegmentVertices(e),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(e),i&&(t.autoDeletedRoof=o);break;case V.Wall:var s,u,f,p,y=o,g="",m="";if(y.leftJoints.length>0)g=null!==(s=null===(u=t.getElementById(y.leftJoints[0]))||void 0===u?void 0:u.id)&&void 0!==s?s:"";if(y.rightJoints.length>0)m=null!==(f=null===(p=t.getElementById(y.rightJoints[0]))||void 0===p?void 0:p.id)&&void 0!==f?f:"";var w,x=Object(h.a)(t.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;v.id===g?v.rightJoints=[]:v.id===m&&(v.leftJoints=[])}}catch(b){x.e(b)}finally{x.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(h.a)(t.elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;Ww.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 f,p=Object(h.a)(t.elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;Ww.isChild(e,y.id)&&t.elementsToPaste.push(y)}}catch(x){p.e(x)}finally{p.f()}}else{var g,m=Object(h.a)(t.elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;Ww.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&&!Ww.isChild(e,t.id)||(t.type===V.Roof&&(Af.getState().deleteRoofSegmentVertices(e),Af.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&&(Af.getState().deleteRoofSegmentVertices(e.id),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id)),!1)})):t.elements=t.elements.filter((function(t){return!(!t.locked&&t.type===e)||(t.type===V.Roof&&(Af.getState().deleteRoofSegmentVertices(t.id),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)),!1)}))}))},countElementsByType:function(e,l){var a=0;if(l){var o,i=Object(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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 Ow,o=Object(h.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+=Ww.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 Ow,i=Object(h.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+=Ww.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(h.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=Ww.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)?Iw.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=l.get(d.id);u&&(n=t().getElementById(r.id)?Iw.clone(u,r,r.cx,r.cy,r.cz,r.type===V.Polygon):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=Ww.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=Ww.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(f.a)(B)),e.push.apply(e,Object(f.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=Iw.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(Ww.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=n}else if(o.type===V.Roof){var c=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));c&&(i.rotation=Object(f.a)(c));for(var s=Zm.getWindowVerticesOnRoof(i),d=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy)),u=Zm.getRoofBoundaryVertices(o);Zm.rooftopElementBoundaryCheck(s,u);){if(d&&Zm.rooftopElementBoundaryCheck(s,d)&&Zm.rooftopWindowCollisionCheck(i.id,s,o.id)){l.elements.push(i),r=!0;break}i.cx+=n/2;var p=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));p&&(i.rotation=Object(f.a)(p)),s=Zm.getWindowVerticesOnRoof(i),d=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy))}}if(!r){i.cx=a.cx-3*n;var y=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));if(y&&(i.rotation=Object(f.a)(y)),o.type===V.Wall){for(;i.cx-n>-.5;)if(o.type===V.Wall){if(Ww.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx-=n}}else if(o.type===V.Roof)for(var g=Zm.getWindowVerticesOnRoof(i),m=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy)),w=Zm.getRoofBoundaryVertices(o);Zm.rooftopElementBoundaryCheck(g,w);){if(m&&Zm.rooftopElementBoundaryCheck(g,m)&&Zm.rooftopWindowCollisionCheck(i.id,g,o.id)){l.elements.push(i),r=!0;break}i.cx-=n;var x=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));x&&(i.rotation=Object(f.a)(x)),g=Zm.getWindowVerticesOnRoof(i),m=Zm.getRoofSegmentBoundary(o.id,new We.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(Ww.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(Ww.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=Zm.getRoofBoundaryVertices(b),H=i.lx/P.lx/2;for(i.cx+=1.25*H;i.cx+H<.5;){var j=Zm.getSolarPanelVerticesOnRoof(i,P);if(Zm.rooftopElementBoundaryCheck(j,S)&&Zm.rooftopSPCollisionCheck(i,P,j)){l.elements.push(i),r=!0;break}i.cx+=1.25*H}if(!r)for(i.cx=a.cx-1.25*H;i.cx-H>-.5;){var z=Zm.getSolarPanelVerticesOnRoof(i,P);if(Zm.rooftopElementBoundaryCheck(z,S)&&Zm.rooftopSPCollisionCheck(i,P,z)){l.elements.push(i),r=!0;break}i.cx-=1.25*H}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 W=l.getElementById(D);if(W){var M=i.cx,I=i.cy,C=i.cz,F=W.cx-a.cx,k=W.cy-a.cy,O=W.cz-a.cz;i.cx=W.cx+F,i.cy=W.cy+k,i.cz=W.cz+O,l.overlapWithSibling(i)&&(i.cx=a.cx-F,i.cy=a.cy-k,i.cz=a.cz-O,l.overlapWithSibling(i)&&(i.cx=a.cx-2*F,i.cy=a.cy-2*k,i.cz=a.cz-2*O,l.overlapWithSibling(i)&&(i.cx=M-F,i.cy=I-k,i.cz=C-O)))}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&&Ww.isIdentical(i.normal,Tt)?Ww.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 N,U=i,E=Object(h.a)(U.vertices);try{for(E.s();!(N=E.n()).done;){N.value.x+=.1}}catch(ge){E.e(ge)}finally{E.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(h.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(f.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(h.a)(G);try{for(K.s();!(B=K.n()).done;){var q=B.value,Q=X.get(q.parentId);if(Q){var Z=Iw.clone(Q,q,q.cx,q.cy,q.cz,q.type===V.Polygon);Z&&(i.normal&&(Z.normal=Object(f.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(f.a)($)),l.elementsToPaste=Object(f.a)($),e.push.apply(e,Object(f.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(h.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=Iw.clone(i,d,d.cx,d.cy,d.cz,d.type===V.Polygon);if(u&&(i.normal&&(u.normal=Object(f.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(h.a)(l.elements);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.parentId===d.id){var m=Iw.clone(u,g,g.cx,g.cy,g.cz);m&&(d.normal&&(m.normal=Object(f.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(h.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(h.a)(l.elements);try{for(S.s();!(P=S.n()).done;){var H=P.value;if(H.id===T&&H.type===V.Wall){var j=H,z=c.get(j.leftJoints[0]);z&&(v.leftJoints=[z]);var R=c.get(j.rightJoints[0]);if(R&&(v.rightJoints=[R]),j.roofId){var D=c.get(j.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(f.a)(te)),e.push.apply(e,Object(f.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 We.Vector3(1,-1,0).applyEuler(new We.Euler(0,0,le.relativeAngle));if(i.cx+=ae.x,i.cy+=ae.y,1===l.elementsToPaste.length){var oe,ie=new We.Vector3(i.cx,i.cy,0),re=new We.Vector3(i.lx/2,0,0),ne=new We.Vector3(-i.lx/2,0,0),ce=new We.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(h.a)(l.elements);try{for(de.s();!(se=de.n()).done;){var ue=se.value;if(ue.parentId===a.id){var fe=Iw.clone(i,ue,ue.cx,ue.cy,ue.cz,ue.type===V.Polygon);fe&&(i.normal&&(fe.normal=Object(f.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(f.a)(pe)),e.push.apply(e,Object(f.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(h.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(h.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(h.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(f){o.e(f)}finally{o.f()}l((function(t){var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.weatherData[o.city+", "+o.country]=o}}catch(f){a.e(f)}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(h.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(h.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(h.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(h.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=Ww.getDistance(l,e,r[n].longitude,r[n].latitude))0?B>=12||B<=3?ox:B>3&&B<=5?tx:B>5&&B<=9?lx:ax:B>=12||B<=3?lx:B>3&&B<=5?ax:B>5&&B<=9?ox:tx;case N.Lake:return ix;case N.Mountain:return rx;case N.Rural:return nx;default:return Qw}}),[l,w,m]),ne=Object(Ly.a)(re),ce=function(e){var t;if(e.intersections.length>0)if(e.intersections[0].object===j.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,Ww.isPlantOrHuman(z.current)&&($(Z.Vertical),te.set(-vt,0,0,"ZXY")),l.type!==V.Foundation&&l.type!==V.Cuboid&&Nt.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=Nt.getState().contentRef,a=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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 We.Vector3(t.cx,t.cy,t.cz).applyEuler(new We.Euler(0,0,e.rotation[2])).add(M.current);t.cx=s.x,t.cy=s.y,t.cz=0,L.current.set(t.id,new We.Vector3(s.x,s.y,0)),U.current.set(t.id,xt)},ue=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Ww.getObjectChildById(a.current,t),i=Ww.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&!Ww.isFoundationOrCuboid(i)){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},he=function(e){var t,l=Object(h.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=Nt.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 We.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){Ww.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{ref:j,name:"Sky",rotation:[vt,0,0],scale:[1,ie,1],onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===j.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(k.current=t.lz,M.current.set(t.cx,t.cy,t.cz),t.type){case V.Human:E.current=t.parentId;break;case V.Tree:E.current=t.parentId,F.current=t.lx;break;case V.Cuboid:M.current.set(t.cx,t.cy,t.cz),C.current.set(t.lx,t.ly,t.lz),D.current.clear();var l=new We.Vector3(t.cx,t.cy,t.cz),o=d(t.id);if(o.length>0){O.current.clear();var i,r=t.rotation[2],n=Object(h.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 We.Vector3(c.cx,c.cy,c.cz).applyEuler(new We.Euler(0,0,r));s.add(l),D.current.set(c.id,s),O.current.set(c.id,new We.Vector3(c.cx,c.cy,c.cz));break;case V.SolarPanel:case V.Sensor:if(Ww.isIdentical(c.normal,Tt)){var u=new We.Vector3(c.cx*t.lx,c.cy*t.ly,c.cz*t.lz).applyEuler(new We.Euler(0,0,r));u.add(l),D.current.set(c.id,u)}break;case V.Polygon:if(Ww.isIdentical(c.normal,Tt)){var f,p=c,y=[],g=Object(h.a)(p.vertices);try{for(g.s();!(f=g.n()).done;){var m=f.value,w=new We.Vector2(m.x*t.lx,m.y*t.ly).rotateAround(Dt,r);w.add(new We.Vector2(l.x,l.y)),y.push(w)}}catch(x){g.e(x)}finally{g.f()}W.current.set(p.id,y)}}}}catch(x){n.e(x)}finally{n.f()}}}}},children:[Object(pf.jsx)("sphereBufferGeometry",{args:[5e3,16,8,0,bt,0,vt]}),Object(pf.jsx)("meshToonMaterial",{map:ne,side:We.BackSide,opacity:1,color:"skyblue"})]}),z.current&&_!==Z.Sky&&Object(pf.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 We.Vector2;if(l.x=e.offsetX/H.clientWidth*2-1,l.y=-e.offsetY/H.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(Nt.getState().treeRef,e);break;case V.Human:pe(Nt.getState().humanRef,e);break;case V.Cuboid:if(Ww.isTopResizeHandle(g)){a((function(e){var t,l=Object(h.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=Nt.getState().cuboidRef;if(null===r||void 0===r?void 0:r.current){var n,c=Object(h.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(k.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=f(z.current.id);if(l&&!l.locked){var o=null,i=E.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(h.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(Ww.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+M.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(h.a)(r);try{for(c.s();!(n=c.n()).done;){var s=n.value;L.current.set(s.id,new We.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:k.current,newValue:l.lz,oldChildrenPositionsMap:new Map(O.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(h.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(h.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=f(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(h.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(h.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:k.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:F.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=Nt.getState().treeRef)||void 0===e?void 0:e.current;break;case V.Human:o=null===(t=Nt.getState().humanRef)||void 0===t?void 0:t.current}if(o){var T=G.intersectObjects(Ww.fetchIntersectables(P),!1),H=he(T);if(H){var R=H.point;if("Ground"===H.object.name)ye(l.id,xt,R),I.current.set(R.x,R.y,R.z),i=xt;else if(H.object.userData.stand){var D=se(H.object),W=H.object.parent;if(W){var N=(new We.Vector3).subVectors(R,W.position).applyEuler(X);ye(l.id,D,N),I.current.set(N.x,N.y,N.z),i=D}}}}if(Xw.getState().moveHandleType&&Ww.isPlantOrHuman(l)&&(I.current.distanceToSquared(M.current)>At||G.intersectObjects([j.current]).length>0)){var B=!0;if(!Xw.getState().viewState.orthographic&&!(B=I.current.length().02}if(!B||function(){if(Xw.getState().viewState.orthographic)return!1;if(j.current){var e=G.intersectObjects(Ww.fetchIntersectables(P),!1);if(e.length>0){var t,l=Object(h.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([j.current]).length>0}()){v(l.id,M.current.x,M.current.y,M.current.z),o&&Ww.isPlantOrHuman(l)&&o.position.copy(M.current),Ww.isPlantOrHuman(l)&&fe(E.current,l.id);var le=Nt.getState().contentRef;if((null===le||void 0===le?void 0:le.current)&&E.current&&o){if(E.current===xt)le.current.add(o);else{var ae=Ww.getObjectChildById(le.current,E.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:M.current.x,oldCy:M.current.y,oldCz:M.current.z,newCx:I.current.x,newCy:I.current.y,newCz:I.current.z,oldParentId:E.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})),Nt.setState((function(e){e.humanRef=null,e.treeRef=null,e.setEnableOrbitController(!0)}))}},children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide})})]})},sx=n.a.memo(cx),dx=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=Xw(Dr),p=Xw(Kr),y=Xw(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,H=Object(Se.e)(We.FontLoader,cy),j=Math.min(1,Math.max(.5,.01*p)),z={font:H,height:0,size:j},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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[l,-a,R],[l,a,R]],color:P,lineWidth:S}),Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-j,-.6-j,R],children:[Object(pf.jsx)("textGeometry",{args:[(l<10?" ":"")+l,z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-j,-.6-j,R],children:[Object(pf.jsx)("textGeometry",{args:[(l>-10?" ":"")+l,z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.jsx)(n.a.Fragment,{},l)})),Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,l,R],[a,l,R]],color:P,lineWidth:1.5*S}),Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*j,l-j/2,R],children:[Object(pf.jsx)("textGeometry",{args:[l+"",z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*j,l-j/2,R],children:[Object(pf.jsx)("textGeometry",{args:[l+"",z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.jsx)(n.a.Fragment,{},l)})),!y&&Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"z axis line",points:[[0,0,0],[0,0,i]],color:"green",lineWidth:l})]})},ux=n.a.memo(dx),fx=l(801),hx=function(e){var t,l,a,i,n,c,s=e.id,d=e.cx,f=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;Xw((function(e){if(T===xt)P=!0;else{var t,l=Object(h.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=Xw(Kc);Object(r.useEffect)((function(){P||S(s,!1)}),[P,s]);var H=Xw(si),j=Xw(Vi),z=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,R=Xw(os),D=Xw(Zr),W=Xw(ju),M=Xw(Hu),I=_f(s),C=Object(Se.f)().gl,F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Nt((function(e){return e.contentRef})),G=Object(r.useRef)(null),K=Object(r.useRef)(null),q=Object(r.useMemo)((function(){return{lng:j}}),[j]),Q=Object(r.useMemo)((function(){return D(s)}),[s]),Z=Object(r.useRef)(!1),_=Xw(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 We.TextureLoader).load(Tl.fetchTextureImage(g),(function(e){v&&(e.wrapS=We.RepeatWrapping,e.repeat.x=-1),ae(e),E(!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)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",q)}),[g,w,j,d,f]);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)?Ww.getObjectChildById(J.current,T):null};Object(Se.d)((function(e){var t=e.camera;if(G.current){var l=Ww.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 We.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){bf.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=Q.lz})),Ww.isMoveHandle(t)?C.domElement.style.cursor="move":C.domElement.style.cursor="pointer")}),[]),ue=Object(r.useCallback)((function(){H((function(e){e.hoveredHandle=null})),C.domElement.style.cursor=Xw.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(pf.jsx)("group",{ref:G,name:"Human Group "+s,userData:{aabb:!0},position:[d,f,null!==p&&void 0!==p?p:0],children:Object(pf.jsxs)("group",{position:[0,.1,ie/2],children:[Object(pf.jsx)(fx.a,{rotation:[vt,0,0],uuid:s,name:g,follow:!1,children:Object(pf.jsx)(Lt.f,{ref:K,renderOrder:3,receiveShadow:!0,name:"Human ".concat(g," plane"),args:[oe,ie],onContextMenu:function(e){R(s,e),H((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),Nt.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(pf.jsx)("meshToonMaterial",{map:le,alphaTest:.5,side:We.DoubleSide})})}),I&&w&&Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})})]}),I&&!w&&Object(pf.jsx)(Lt.h,{position:[0,0,-ie/2],args:[.4,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Nt.setState((function(e){e.humanRef=G})))},onPointerEnter:function(e){de(e,B.Default)},onPointerLeave:ue,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:M===B.Default||W===B.Default?pt:ut})}),O&&!I&&Object(pf.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},px=n.a.memo(hx),yx=l.p+"static/media/apple_spring.0cad3025.png",gx=l.p+"static/media/apple_summer.46de7d87.png",mx=l.p+"static/media/apple_fall.27ba1ce5.png",wx=l.p+"static/media/apple_winter.d23599a6.png",xx=l.p+"static/media/birch_spring.6960e824.png",vx=l.p+"static/media/birch_summer.59ae1138.png",bx=l.p+"static/media/birch_fall.210e663d.png",Ax=l.p+"static/media/birch_winter.c4988403.png",Tx=l.p+"static/media/coconut.d38cdccd.png",Px=l.p+"static/media/dogwood_spring.c53ecf05.png",Sx=l.p+"static/media/dogwood_summer.8f3157af.png",Hx=l.p+"static/media/dogwood_fall.cb8fd9b6.png",jx=l.p+"static/media/dogwood_winter.745583bb.png",zx=l.p+"static/media/elm_spring.a67f6f9c.png",Rx=l.p+"static/media/elm_summer.0e729b1c.png",Dx=l.p+"static/media/elm_fall.720b87ef.png",Wx=l.p+"static/media/elm_winter.49563d13.png",Mx=l.p+"static/media/fan_palm.dd78413a.png",Ix=l.p+"static/media/linden_spring.073d4e74.png",Cx=l.p+"static/media/linden_summer.7a1479da.png",Fx=l.p+"static/media/linden_fall.3e8bb305.png",kx=l.p+"static/media/linden_winter.9af7eb0e.png",Ox=l.p+"static/media/magnolia_spring.8dc3ef2d.png",Yx=l.p+"static/media/magnolia_summer.00567305.png",Lx=l.p+"static/media/magnolia_fall.475b9098.png",Nx=l.p+"static/media/magnolia_winter.8a371c67.png",Ux=l.p+"static/media/maple_spring.e1e24394.png",Ex=l.p+"static/media/maple_summer.7b3e9753.png",Vx=l.p+"static/media/maple_fall.5e8e43bb.png",Jx=l.p+"static/media/maple_winter.37fba60e.png",Gx=l.p+"static/media/oak_spring.3b768daa.png",Xx=l.p+"static/media/oak_summer.54230708.png",Bx=l.p+"static/media/oak_fall.ba997613.png",Kx=l.p+"static/media/oak_winter.02087599.png",qx=l.p+"static/media/pine.80a6a140.png",Qx=l.p+"static/media/spruce.dea2071b.png",Zx=function(){function e(){Object(je.a)(this,e)}return Object(ke.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?wx:gx:t>a&&t<=r?c?yx:mx:t>r&&t<=n?c?gx:wx:c?mx:yx;break;case oe.Birch:i=t>=o||t<=a?c?Ax:vx:t>a&&t<=r?c?xx:bx:t>r&&t<=n?c?vx:Ax:c?bx:xx;break;case oe.Coconut:i=Tx;break;case oe.Dogwood:i=t>=o||t<=a?c?jx:Sx:t>a&&t<=r?c?Px:Hx:t>r&&t<=n?c?Sx:jx:c?Hx:Px;break;case oe.Elm:i=t>=o||t<=a?c?Wx:Rx:t>a&&t<=r?c?zx:Dx:t>r&&t<=n?c?Rx:Wx:c?Dx:zx;break;case oe.FanPalm:i=Mx;break;case oe.Linden:i=t>=o||t<=a?c?kx:Cx:t>a&&t<=r?c?Ix:Fx:t>r&&t<=n?c?Cx:kx:c?Fx:Ix;break;case oe.Magnolia:i=t>=o||t<=a?c?Nx:Yx:t>a&&t<=r?c?Ox:Lx:t>r&&t<=n?c?Yx:Nx:c?Lx:Ox;break;case oe.Maple:i=t>=o||t<=a?c?Jx:Ex:t>a&&t<=r?c?Ux:Vx:t>r&&t<=n?c?Ex:Jx:c?Vx:Ux;break;case oe.Oak:i=t>=o||t<=a?c?Kx:Xx:t>a&&t<=r?c?Gx:Bx:t>r&&t<=n?c?Xx:Kx:c?Bx:Gx;break;case oe.Spruce:i=Qx;break;default:i=qx}return i}}]),e}(),_x=function(e){var t,l,a,n,c,s,d,f,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,H=void 0!==S&&S,j=e.showModel,z=void 0!==j&&j,R=e.showLabel,D=void 0!==R&&R,W=!1;Xw((function(e){if(p===xt)W=!0;else{var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===p){W=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var M=Xw(Kc);Object(r.useEffect)((function(){W||M(y,!1)}),[W]);var I=Xw(si),C=Xw(Vi),F=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,k=Xw(i.date),O=Xw(i.latitude),Y=null!==(l=Xw(i.leafDayOfYear1))&&void 0!==l?l:rt,L=null!==(a=Xw(i.leafDayOfYear2))&&void 0!==a?a:nt,N=Xw(o.shadowEnabled),U=Xw(os),E=Xw(Zr),J=Xw(ju),G=Xw(zu),q=Xw(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=Nt((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 E(y)}),[y]),be=Object(r.useMemo)((function(){return Ww.dayOfYear(new Date(k))}),[k]),Ae=Object(r.useMemo)((function(){return!Zx.isEvergreen(ve?ve.name:oe.Dogwood)&&(O>0?beL:be>=Y&&be<=L)}),[be,Y,L,O,null===ve||void 0===ve?void 0:ve.name]),Te=Object(r.useRef)(!1),Pe=Xw(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 He=Object(r.useMemo)((function(){return(new We.TextureLoader).load(Zx.fetchTextureImage(A,be,O,Y,L),(function(e){P&&(e.wrapS=We.RepeatWrapping,e.repeat.x=-1),De(e),ie(!ae)}))}),[A,be,O,P,Y,L]),je=Object(r.useState)(He),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:Zx.fetchLabel(A,xe))+(H?" ("+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,H,C]),Ie=Object(r.useMemo)((function(){return Zx.fetchTheta(A)}),[A]),Ce=new We.MeshDepthMaterial({depthPacking:We.RGBADepthPacking,map:Re,alphaTest:.1}),Fe=x/2,ke=v/2,Oe=Object(r.useMemo)((function(){return new We.Vector3(0,0,ke)}),[ke]),Ye=Object(r.useMemo)((function(){return new We.Vector3(-Fe,0,0)}),[Fe]),Le=Object(r.useMemo)((function(){return new We.Vector3(Fe,0,0)}),[Fe]),Ne=Object(r.useMemo)((function(){return new We.Vector3(0,-Fe,0)}),[Fe]),Ue=Object(r.useMemo)((function(){return new We.Vector3(0,Fe,0)}),[Fe]),Ee=Object(r.useCallback)((function(e,t){bf.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})),Ww.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=Xw.getState().addedCuboidId?"crosshair":"default"}),[]),Je=function(){return p!==xt&&(null===ne||void 0===ne?void 0:ne.current)?Ww.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=Ww.getWorldDataById(p).rot,a=t.position,o=a.x,i=a.y,r=ce.current.position,n=r.x,c=r.y,s=Xw.getState().sunlightDirection,d=s.x,u=s.y;if(Je()){var f=ce.current.localToWorld(new We.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(pf.jsx)(pf.Fragment,{children:W?Object(pf.jsx)("group",{ref:ce,name:"Tree Group "+y,userData:{aabb:!0},position:[g,m,null!==w&&void 0!==w?w:0],children:Object(pf.jsxs)("group",{position:[0,0,v/2],children:[Object(pf.jsx)(fx.a,{ref:se,uuid:y,name:A,follow:!1,children:Object(pf.jsx)(Lt.f,{args:[x,v],children:Object(pf.jsx)("meshToonMaterial",{map:Re,side:We.DoubleSide,alphaTest:.5})})}),Object(pf.jsx)(fx.a,{ref:de,name:A+" Shadow Billboard",follow:!1,children:Object(pf.jsx)(Lt.f,{castShadow:N,args:[x,v],customDepthMaterial:Ce,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:0,depthTest:!1})})}),Zx.isConic(A)?Object(pf.jsx)(Lt.c,{visible:z||F,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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.DoubleSide,transparent:!0,opacity:.75})}):Object(pf.jsx)(Lt.h,{visible:z||F,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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.DoubleSide,transparent:!0,opacity:.75})}),Object(pf.jsx)(fx.a,{ref:fe,name:"Interaction Billboard",visible:!1,position:[0,0,-v/2+.5],children:Object(pf.jsx)(Lt.f,{ref:ue,renderOrder:3,name:A+" plane",args:[x/2,v/3],rotation:[F?vt:0,0,0],onContextMenu:function(e){U(y,e),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),Nt.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&&H&&Object(pf.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&&!H&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,-v/2),args:[Ge,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Nt.setState((function(e){e.treeRef=ce})))},onPointerEnter:function(e){Ee(e,B.Default)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===B.Default||J===B.Default?pt:ut})}),!F&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.a,{ref:he,name:K.Top,args:[Ge,Ge,Ge],position:Oe,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ee(e,K.Top)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Top||G===K.Top?pt:ht})}),Object(pf.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){Ee(e,K.Left)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Left||G===K.Left?pt:ht})}),Object(pf.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){Ee(e,K.Right)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Right||G===K.Right?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ge,name:K.Lower,args:[Ge,Ge,Ge],position:Ne,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ee(e,K.Lower)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Lower||G===K.Lower?pt:ht})}),Object(pf.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){Ee(e,K.Upper)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Upper||G===K.Upper?pt:ht})})]})]}),($||D)&&!Q&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:Me,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!==(f=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==f?f:.4)]})]})}):null})},$x=n.a.memo(_x),ev=l(58),tv=["args","children"];function lv(e){var t=e+"Geometry";return r.forwardRef((function(e,l){var a=e.args,o=e.children,i=Object(ev.a)(e,tv);return Object(pf.jsxs)("mesh",Object(d.a)(Object(d.a)({ref:l},i),{},{children:[Object(pf.jsx)(t,{attach:"geometry",args:a}),o]}))}))}var av,ov,iv,rv,nv,cv=lv("ParabolicCylinder"),sv=lv("Paraboloid"),dv=function(e){var t,l,a,c,s=e.id,d=e.cx,f=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,H=e.relativeAzimuth,j=e.moduleLength,z=e.poleHeight,R=e.poleRadius,D=e.drawSunBeam,W=e.rotation,M=void 0===W?[0,0,0]:W,I=e.color,C=void 0===I?"white":I,F=e.lineColor,k=void 0===F?"black":F,O=e.lineWidth,Y=void 0===O?.5:O,L=e.showLabel,N=void 0!==L&&L,U=e.locked,E=void 0!==U&&U,J=e.parentId,G=Xw(si),Q=Xw(Vi),Z=Xw(i.date),_=Xw(i.latitude),$=Xw(ki),ee=bf(Us),te=Xw(o.solarRadiationHeatmapMaxValue),le=Af(wi),ae=Xw(o.shadowEnabled),oe=Xw(Zr),ie=Xw(os),re=Xw(Kr),ne=Xw(zu),ce=Xw(Ls),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),He=Object(u.a)(Pe,2),je=He[0],ze=He[1],Re=Object(r.useRef)(),De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(!1),Ye=Math.max(100,10*re),Le=16,Ne=ce.z<=0,Ue=Object(r.useMemo)((function(){return{lng:Q}}),[Q]),Ee=y/2,Ve=g/2,Je=w/2,Ge=z+Ee,Xe=Xw((function(e){var t,l=Object(h.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,Ww.isZero(M[2]))d=Xe.cx+d*Xe.lx,f=Xe.cy+f*Xe.ly;else{var Be=new We.Vector3(d*Xe.lx,f*Xe.ly,0);Be.applyAxisAngle(Rt,M[2]),d=Xe.cx+Be.x,f=Xe.cy+Be.y}}var Ke=Ee*Ee/P,qe=.25*P,Qe=new We.Vector3(-Ee,-Ve,Je+Ke),Ze=new We.Vector3(-Ee,Ve,Je+Ke),_e=new We.Vector3(Ee,-Ve,Je+Ke),$e=new We.Vector3(Ee,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(Ww.fetchHeatmapTexture(e,null!==te&&void 0!==te?te:5))}}),[ee,te]),Object(r.useEffect)((function(){Te(Math.max(1,Math.round(g/j)))}),[g,j]),Object(r.useEffect)((function(){var e=function(){Nt.getState().setEnableOrbitController(!0),Oe.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)+", "+f.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ue))}),[null===et||void 0===et?void 0:et.label,E,Q,d,f,p]),lt=Object(r.useMemo)((function(){return new We.Euler(0,0,M[2],"ZXY")}),[M]),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 Iy(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 We.Euler(0,Math.atan2(nt.x,nt.z),0,"ZXY"):new We.Euler(S,0,H,"ZXY")}),[rt,it,S,H]),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 We.Vector3(0,ut,qe).applyEuler(ct),gt=it.clone().multiplyScalar(Ye).applyEuler(new We.Euler(-lt.x,0,-lt.z)),mt=-(Ge+w)/2,wt=Object(r.useMemo)((function(){for(var e=[],t=Math.cos(H)*j,l=Math.sin(H)*j,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&&je?Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:je}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:100*v,side:We.FrontSide,color:"lightskyblue"})}),Object(pf.jsx)(cv,{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.Select),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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.BackSide,color:"white"})}),xt&&xt.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Rim Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),(0===t||t===xt.length-1||Pt)&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Focal Lines",userData:{unintersectable:!0},points:[e.points[8].clone(),e.points[8].clone().add(new We.Vector3(0,0,qe))],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:Ne?"dimgray":"white"})]},t)})),Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Outline 1",userData:{unintersectable:!0},points:[[-Ee,-Ve,Ke],[-Ee,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Outline 2",userData:{unintersectable:!0},points:[[Ee,-Ve,Ke],[Ee,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),se&&E&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ee,-Ve,Ke],[-Ee,Ve,Ke],[Ee,Ve,Ke],[Ee,-Ve,Ke],[-Ee,-Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),se&&!E&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Me,position:new We.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){ie(s,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),Fe.current&&G((function(e){var t=Ie.current.localToWorld(new We.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Lower)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Lower||ne===K.Lower?pt:ht})}),Object(pf.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),Fe.current&&G((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Upper)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Upper||ne===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),Fe.current&&G((function(e){var t=Fe.current.localToWorld(new We.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Left)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Left||ne===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),Fe.current&&G((function(e){var t=ke.current.localToWorld(new We.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Right)},onPointerOut:function(e){ot()},children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t):Object(pf.jsx)(n.a.Fragment,{},t)})),D&&it.z>0&&Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[ft,new We.Vector3(-.3*Ee,0,.09*Ke).applyEuler(ct),gt,new We.Vector3(-.6*Ee,0,.36*Ke).applyEuler(ct),ft,new We.Vector3(-.9*Ee,0,.81*Ke).applyEuler(ct),gt,new We.Vector3(0,0,0),ft,new We.Vector3(.3*Ee,0,.09*Ke).applyEuler(ct),gt,new We.Vector3(.6*Ee,0,.36*Ke).applyEuler(ct),ft,new We.Vector3(.9*Ee,0,.81*Ke).applyEuler(ct),gt],name:"Sun Beams",lineWidth:.25,color:"white"}),(he||N)&&!se&&Object(pf.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)]})]})},uv=n.a.memo(dv),fv=function(e){var t,l,a,c,s=e.id,d=e.cx,f=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,H=void 0===S?.1:S,j=e.latusRectum,z=void 0===j?2:j,R=e.tiltAngle,D=e.relativeAzimuth,W=e.poleHeight,M=e.poleRadius,I=void 0===M?.2:M,C=e.drawSunBeam,F=e.rotation,k=void 0===F?[0,0,0]:F,O=e.color,Y=void 0===O?"white":O,L=e.lineColor,N=void 0===L?"black":L,U=e.lineWidth,E=void 0===U?.25:U,G=e.showLabel,Q=void 0!==G&&G,Z=e.locked,_=void 0!==Z&&Z,$=e.parentId,ee=Xw(si),te=Xw(Vi),le=Xw(i.date),ae=Xw(i.latitude),oe=Xw(ki),ie=bf(Us),re=Xw(o.solarRadiationHeatmapMaxValue),ne=Af(wi),ce=Xw(o.shadowEnabled),se=Xw(Zr),de=Xw(os),ue=Xw(Kr),fe=Xw(zu),he=Xw(Ls),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],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Math.max(100,10*ue),Ne=he.z<=0,Ue=y/2,Ee=g/2,Ve=w/2,Je=W+Ue,Ge=Object(r.useMemo)((function(){return{lng:te}}),[te]),Xe=Xw((function(e){var t,l=Object(h.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,Ww.isZero(k[2]))d=Xe.cx+d*Xe.lx,f=Xe.cy+f*Xe.ly;else{var Be=new We.Vector3(d*Xe.lx,f*Xe.ly,0);Be.applyAxisAngle(Rt,k[2]),d=Xe.cx+Be.x,f=Xe.cy+Be.y}}var Ke=Ue*Ue/z,qe=.25*z,Qe=new We.Vector3(-Ue,-Ee,Ve+Ke),Ze=new We.Vector3(-Ue,Ee,Ve+Ke),_e=new We.Vector3(Ue,-Ee,Ve+Ke),$e=new We.Vector3(Ue,Ee,Ve+Ke),et=Object(r.useMemo)((function(){return se(s)}),[s]),tt=Object(Ly.a)(Ny),lt=P+1;Object(r.useEffect)((function(){if(et&&ie){var e=ne(et.id);e&&Re(Ww.fetchHeatmapTexture(e,null!==re&&void 0!==re?re:5))}}),[ie,re]),Object(r.useEffect)((function(){var e=function(){Nt.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)+", "+f.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ge))}),[null===et||void 0===et?void 0:et.label,_,te,d,f,p]),ot=Object(r.useMemo)((function(){return new We.Euler(0,0,k[2],"ZXY")}),[k]),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 Iy(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 We.Euler(Math.atan2(e,ut.z),0,Math.atan2(ut.y,ut.x)+vt,"ZXY")}return new We.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 We.Vector3(Ue*l,Ue*a,Ke)),i.push(new We.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 We.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 We.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new We.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 We.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new We.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,Ht=nt.clone().multiplyScalar(Le),jt=new We.Vector3(0,0,qe).applyEuler(ft);return Object(pf.jsxs)("group",{name:"Parabolic Dish Group "+s,rotation:ot,position:[d,f,p+Ve],children:[Object(pf.jsxs)("group",{rotation:ft,children:[Object(pf.jsx)(sv,{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.Select),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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:ze}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:100*v,side:We.FrontSide,color:"lightskyblue"})}),Object(pf.jsx)(sv,{receiveShadow:ce,castShadow:ce,uuid:s+" backside",ref:Me,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.Select),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===Me.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Me.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.BackSide,color:Y})}),wt&&wt.length>0&&wt.map((function(e,t){return Object(pf.jsx)(n.a.Fragment,{children:Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Wireframe",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:E,color:N})},t)})),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),nt.z>0&&Object(pf.jsx)("mesh",{position:[0,0,qe-.1],children:Object(pf.jsx)("sprite",{scale:[lt,lt,lt],children:Object(pf.jsx)("spriteMaterial",{map:tt,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})}),(A===J.CentralPole||A===J.CentralPoleWithTripod)&&Object(pf.jsx)(Lt.d,{name:"Parabolic Dish Receiver Pole",uuid:s,args:[H,H,qe,mt?6:2,1],rotation:[vt,0,0],position:[0,0,qe/2],receiveShadow:!1,castShadow:!0,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),A===J.CentralPoleWithTripod&&xt&&xt.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Tripod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:1,color:Ne?"dimgray":Y}),Object(pf.jsx)(Lt.h,{position:new We.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[H/2,4,4],name:"Parabolic Dish Tripod Joint",children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),A===J.Quadrupod&&At&&At.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Quadrupod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:2,color:Ne?"dimgray":Y}),Object(pf.jsx)(Lt.h,{position:new We.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[H/2,4,4],name:"Parabolic Dish Quadrupod Joint",children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),pe&&_&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ue,-Ee,Ke],[-Ue,Ee,Ke],[Ue,Ee,Ke],[Ue,-Ee,Ke],[-Ue,-Ee,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),pe&&!_&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Ie,position:new We.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){de(s,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),ke.current&&ee((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Lower)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||fe===K.Lower?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),ke.current&&ee((function(e){var t=Fe.current.localToWorld(new We.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Upper)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||fe===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),ke.current&&ee((function(e){var t=ke.current.localToWorld(new We.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Left)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||fe===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Oe,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),ke.current&&ee((function(e){var t=Oe.current.localToWorld(new We.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Right)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||fe===K.Right?pt:ht})})]})]})]}),Je>0&&Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),C&&nt.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-ot.x,0,-ot.z],userData:{unintersectable:!0},points:[jt,new We.Vector3(-.3*Ue,0,.09*Ke).applyEuler(ft),Ht,new We.Vector3(-.6*Ue,0,.36*Ke).applyEuler(ft),jt,new We.Vector3(-.9*Ue,0,.81*Ke).applyEuler(ft),Ht,jt,new We.Vector3(.3*Ue,0,.09*Ke).applyEuler(ft),Ht,new We.Vector3(.6*Ue,0,.36*Ke).applyEuler(ft),jt,new We.Vector3(.9*Ue,0,.81*Ke).applyEuler(ft),Ht],name:"Sun Beams",lineWidth:.25,color:"white"}),(xe||Q)&&!pe&&Object(pf.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(Ee*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},hv=n.a.memo(fv),pv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,f=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,H=e.drawSunBeam,j=e.rotation,z=void 0===j?[0,0,0]:j,R=e.color,D=void 0===R?"white":R,W=e.lineColor,M=void 0===W?"black":W,I=e.lineWidth,C=void 0===I?.5:I,F=e.showLabel,k=void 0!==F&&F,O=e.locked,Y=void 0!==O&&O,L=e.parentId,N=e.receiverId,U=Xw(si),E=Xw(Vi),J=Xw(i.date),Q=Xw(i.latitude),Z=Xw(ki),_=bf(Us),$=Xw(o.solarRadiationHeatmapMaxValue),ee=Af(wi),te=Xw(o.shadowEnabled),le=Xw(Zr),ae=Xw(os),oe=Xw(Kr),ie=Xw(zu),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],He=Object(r.useRef)(),je=Object(r.useRef)(),ze=Object(r.useRef)(),Re=Object(r.useRef)(),De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(!1),Ce=Math.max(100,10*oe),Fe=Object(r.useMemo)((function(){return{lng:E}}),[E]),ke=p/2,Oe=y/2,Ye=m/2,Le=T+ke,Ne=Xw((function(e){var t,l=Object(h.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(Ne)switch(Ne.type){case V.Foundation:if(f=Le+Ye+Ne.lz,Ww.isZero(z[2]))s=Ne.cx+s*Ne.lx,d=Ne.cy+d*Ne.ly;else{var Ue=new We.Vector3(s*Ne.lx,d*Ne.ly,0);Ue.applyAxisAngle(Rt,z[2]),s=Ne.cx+Ue.x,d=Ne.cy+Ue.y}}var Ee=new We.Vector3(-ke,-Oe,Ye),Ve=new We.Vector3(-ke,Oe,Ye),Je=new We.Vector3(ke,-Oe,Ye),Ge=new We.Vector3(ke,Oe,Ye),Xe=Object(r.useMemo)((function(){return le(c)}),[c]);Object(r.useEffect)((function(){if(Xe&&_){var e=ee(Xe.id);e&&Pe(Ww.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(){Nt.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",Fe))+((null===Xe||void 0===Xe?void 0:Xe.locked)?" ("+me.t("shared.ElementLocked",Fe)+")":"")+((null===Xe||void 0===Xe?void 0:Xe.label)?"":"\n"+me.t("word.Coordinates",Fe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",Fe))}),[null===Xe||void 0===Xe?void 0:Xe.label,Y,E,s,d,f]),Ke=Object(r.useMemo)((function(){return new We.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 Iy(new Date(J),Q)}),[J,Q]),_e=null===Ne||void 0===Ne?void 0:Ne.rotation[2],$e=N&&N!==L?le(N):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 We.Vector3((t.cx-s)*(_e?Math.cos(_e):1),(t.cy-d)*(_e?Math.sin(_e):0),t.cz-f+t.lz/2+(null!==(e=t.solarAbsorberPipe.absorberHeight)&&void 0!==e?e:10))}}else if(Ne&&Ne.type===V.Foundation){var l,a=Ne;if(a.solarStructure===G.FocusPipe&&a.solarAbsorberPipe)return new We.Vector3((a.cx-s)*(_e?Math.cos(_e):1),(a.cy-d)*(_e?Math.sin(_e):0),a.cz-f+a.lz/2+(null!==(l=a.solarAbsorberPipe.absorberHeight)&&void 0!==l?l:10))}return null}),[Ne,s,d,f,N,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 We.Vector3),lt=Object(r.useMemo)((function(){if(et&&Ze.z>0){var e=_e?new We.Vector3(Math.sin(_e),Math.cos(_e),0):new We.Vector3(0,1,0);tt.current.set(et.x,et.y,et.z);var t=Ze.z0&&(e.intersections[0].object===He.current&&(t.contextMenuObjectType=V.FresnelReflector))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===He.current&&(ue(!0),ne.style.cursor="move"))},onPointerOut:function(e){ue(!1),ne.style.cursor="default"},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),_&&Te?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",side:We.FrontSide,map:Te}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("white"),shininess:100*x,side:We.FrontSide,color:"lightskyblue"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D})]}),it&&it.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Module Line",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:C,color:M},t)})),Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 1",userData:{unintersectable:!0},points:[[-ke,-Oe,Ye],[-ke,Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:M}),Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 2",userData:{unintersectable:!0},points:[[ke,-Oe,Ye],[ke,Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:M}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),re&&Y&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ke,-Oe,Ye],[-ke,Oe,Ye],[ke,Oe,Ye],[ke,-Oe,Ye],[-ke,-Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),re&&!Y&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:je,position:new We.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){ae(c,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.a,{ref:ze,position:[(Ee.x+Je.x)/2,Ee.y,Ee.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 We.Vector3(0,y,-Ee.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Lower)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Lower||ie===K.Lower?pt:ht})}),Object(pf.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 We.Vector3(0,-y,-Ve.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Upper)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Upper||ie===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:De,position:[Ee.x,(Ee.y+Ve.y)/2,Ee.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 We.Vector3(p,0,-Ee.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Left)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Left||ie===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Me,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=Me.current.localToWorld(new We.Vector3(-p,0,-Je.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Right)},onPointerOut:function(e){Qe()},children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:D})},t)})),H&&Ze.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-Ke.x,0,-Ke.z],userData:{unintersectable:!0},points:et?[tt.current,new We.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)]:[new We.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(de||k)&&!re&&Object(pf.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(Oe*Math.abs(Math.sin(Xe.tiltAngle))+.1,.2)]})]})},yv=n.a.memo(pv),gv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,f=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,H=e.rotation,j=void 0===H?[0,0,0]:H,z=e.color,R=void 0===z?"white":z,D=(e.lineColor,e.lineWidth,e.showLabel),W=void 0!==D&&D,M=e.locked,I=void 0!==M&&M,C=e.parentId,F=e.towerId,k=Xw(si),O=Xw(Vi),Y=Xw(i.date),L=Xw(i.latitude),N=Xw(ki),U=bf(Us),E=Xw(o.solarRadiationHeatmapMaxValue),J=Af(wi),K=Xw(o.shadowEnabled),q=Xw(Zr),Q=Xw(os),Z=Xw(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:O}}),[O]),he=p/2,pe=y/2,ye=m/2,ge=A+Math.max(he,pe),we=Xw((function(e){var t,l=Object(h.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(f=ge+ye+we.lz,Ww.isZero(j[2]))s=we.cx+s*we.lx,d=we.cy+d*we.ly;else{var xe=new We.Vector3(s*we.lx,d*we.ly,0);xe.applyAxisAngle(Rt,j[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(Ww.fetchHeatmapTexture(e,null!==E&&void 0!==E?E:5))}}),[U,E]),Object(r.useEffect)((function(){var e=function(){Nt.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)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",fe))}),[null===ve||void 0===ve?void 0:ve.label,I,O,s,d,f]),Ae=Object(r.useMemo)((function(){return new We.Euler(0,0,j[2],"ZXY")}),[j]),Te=Object(r.useMemo)((function(){return Iy(new Date(Y),L)}),[Y,L]),Pe=null===we||void 0===we?void 0:we.rotation[2],He=F&&F!==C?q(F):null,je=Object(r.useMemo)((function(){if(He){if(He.type===V.Foundation){var e,t=He;if(t.solarStructure===G.FocusTower&&t.solarPowerTower)return new We.Vector3(t.cx-s,t.cy-d,t.cz-f+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 We.Vector3(a.cx-s,a.cy-d,a.cz-f+a.lz/2+(null!==(l=a.solarPowerTower.towerHeight)&&void 0!==l?l:20))}return null}),[we,s,d,f,F,null===He||void 0===He?void 0:He.cx,null===He||void 0===He?void 0:He.cy,null===He||void 0===He?void 0:He.cz]),ze=Object(r.useMemo)((function(){if(je&&Te.z>0){var e=je.clone().normalize().add(Te).normalize();Ww.isSame(e,Rt)&&(e=new We.Vector3(-.001,0,1).normalize()),Pe&&e.applyAxisAngle(Rt,-Pe);var t=Math.hypot(e.x,e.y);return new We.Euler(Math.atan2(t,e.z),0,Math.atan2(e.y,e.x)+vt,"ZXY")}return new We.Euler(v,0,b,"ZXY")}),[je,Te,v,b,Pe,null===He||void 0===He?void 0:He.cx,null===He||void 0===He?void 0:He.cy,null===He||void 0===He?void 0:He.cz]),Re=-(ge+m)/2,De=Math.max(1,(p+y)/8),Me=st*De*4;return Object(pf.jsxs)("group",{name:"Heliostat Group "+c,rotation:Ae,position:[s,d,f+ye],children:[Object(pf.jsxs)("group",{rotation:ze,children:[Object(pf.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.Select),k((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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),U&&re?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",side:We.FrontSide,map:re}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("white"),shininess:100*x,side:We.FrontSide,color:"lightskyblue"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R})]}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),_&&I&&Object(pf.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(pf.jsx)(Lt.h,{ref:se,position:new We.Vector3(0,0,0),args:[Me,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){Q(c,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})})]}),ge>0&&Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[P,P,ge+m,N.length<100?4:2,1],position:new We.Vector3(0,0,Re),rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:R})}),S&&Te.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-Ae.x,0,-Ae.z],userData:{unintersectable:!0},points:je?[je,new We.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)]:[new We.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(le||W)&&!_&&Object(pf.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)]})]})},mv=n.a.memo(gv),wv=function(e){var t,l,a,n,c,s,d=e.id,f=e.pvModelName,p=void 0===f?"SPR-X21-335-BLK":f,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,H=e.poleRadius,j=e.poleSpacing,z=e.drawSunBeam,R=e.rotation,D=void 0===R?[0,0,0]:R,W=e.normal,M=void 0===W?[0,0,1]:W,I=e.color,C=void 0===I?"white":I,F=(e.lineColor,e.lineWidth,e.showLabel),k=void 0!==F&&F,O=e.locked,Y=void 0!==O&&O,L=e.parentId,N=e.orientation,U=void 0===N?$.landscape:N,E=Xw(si),J=Xw(Vi),G=Xw(i.date),Q=Xw(i.latitude),Z=Xw(ki),_=bf(Us),ee=Xw(o.shadowEnabled),le=Xw(o.solarPanelShininess),ae=Xw(Zr),oe=Xw(os),ie=Xw(tc),re=Xw(Kr),ne=Xw(zu),ce=Xw(Du),se=Xw(Sr),de=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,ue=Xw(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],He=Object(r.useState)(),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Object(r.useRef)(0),Ne=Object(r.useRef)(0),Ue=Object(r.useRef)(),Ee=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Ve=Math.max(100,10*re),Je=(new We.Vector3).fromArray(M),Ge=ue[p],Xe=Object(r.useMemo)((function(){return{lng:J}}),[J]),Be=Xw((function(e){var t,l=Object(h.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,Ww.isZero(D[2]))y=Be.cx+y*Be.lx,g=Be.cy+g*Be.ly;else{var Ke=new We.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=Ww.getWorldDataById(Be.id),Qe=qe.pos;qe.rot;if(Ww.isZero(D[2]))y=Qe.x+y*Be.lx,g=Qe.y+g*Be.ly;else{var Ze=new We.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=Ww.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 We.Vector3(-_e,-$e,et),it=new We.Vector3(-_e,$e,et),rt=new We.Vector3(_e,-$e,et),nt=new We.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 We.Vector3(o*l-_e,-$e,v),new We.Vector3(o*l-_e,$e,v)]});for(var i=0;i<=t;i++)Ue.current.push({points:[new We.Vector3(-_e,i*a-$e,v),new We.Vector3(_e,i*a-$e,v)]})}}),[U,p,w,x,v]),Object(r.useEffect)((function(){var e=function(){Nt.getState().setEnableOrbitController(!0),Ye.current=!1,Jt(!1)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Re(Ww.isSame(Je,Rt))}),[M]);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 Ww.isSame(Je,St)?new We.Euler(vt,0,D[2]+vt,"ZXY"):Ww.isSame(Je,Ht)?new We.Euler(vt,0,D[2]-vt,"ZXY"):Ww.isSame(Je,jt)?new We.Euler(vt,0,D[2]+Math.PI,"ZXY"):Ww.isSame(Je,zt)?new We.Euler(vt,0,D[2],"ZXY"):new We.Euler(0,0,D[2],"ZXY")}),[M,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 Iy(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(Ww.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 We.Euler(Math.atan2(e,Tt.z),0,Math.atan2(Tt.y,Tt.x)+vt,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new We.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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),_&&Xt?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Xt}):Gt?de||0===le?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:Gt,color:C}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:We.FrontSide,map:Gt,color:C}):null,0===(null===Ge||void 0===Ge?void 0:Ge.bifacialityFactor)||de||0===S&&0===b?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Gt?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:We.FrontSide,map:Gt,color:C}):null]}),_&&Xt&&Ue.current&&Ue.current.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:d,args:[w,x],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),fe&&Y&&Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Me,position:new We.Vector3(0,0,0),args:[Ft,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(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),Fe.current&&E((function(e){var t=Ie.current.localToWorld(new We.Vector3(0,x,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Lower)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||ne===K.Lower?pt:ht})}),Object(pf.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),Fe.current&&E((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,-x,-it.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Upper)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||ne===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),Fe.current&&E((function(e){var t=Fe.current.localToWorld(new We.Vector3(w,0,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Left)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||ne===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),Fe.current&&E((function(e){var t=ke.current.localToWorld(new We.Vector3(-w,0,-rt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Right)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||ne===K.Right?pt:ht})})]})]})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Object(pf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,Pt.z],children:[Object(pf.jsx)(uy,{id:d,position:[0,-$e-kt/2,S],color:Te===q.Upper||ce===q.Upper?pt:ht,ratio:kt,handleType:q.Upper,hoverHandle:mt,noHoverHandle:wt}),Object(pf.jsx)(uy,{id:d,position:[0,$e+kt/2,S],color:Te===q.Lower||ce===q.Lower?pt:ht,ratio:kt,handleType:q.Lower,hoverHandle:mt,noHoverHandle:wt})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Math.abs(S)>.1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.g,{name:q.Tilt,args:[Ot,1.1*Ot,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){Nt.getState().setEnableOrbitController(!1),Ye.current=!0;var t=ae(d);Le.current=t.tiltAngle}E((function(e){e.rotateHandleType=q.Tilt}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:Te===q.Tilt||Vt?pt:ht})}),Vt&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.g,{ref:Oe,name:"Solar panel tilt handle",args:[Ot,2*Ot,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerDown:function(e){},onPointerUp:function(e){if(Math.abs(Ne.current-Le.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Le.current,newValue:Ne.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 We.Vector2;if(t.x=e.offsetX/pe.clientWidth*2-1,t.y=-e.offsetY/pe.clientHeight*2+1,Ee.setFromCamera(t,ye),Oe.current){var l=Ee.intersectObjects([Oe.current]);if(l.length>0){var a=l[0].point,o=Oe.current.parent;if(o){var i=o.position,r=(new We.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),Ne.current=n}}}}}},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,Ot],[0,0,1.75*Ot]],rotation:new We.Euler(b,0,Pt.z,"ZXY"),lineWidth:1}),Yt.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,Pt.z,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*Ot],[0,0,2*Ot]],color:"white",transparent:!0,opacity:.5}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*Ot,fontFace:"Times Roman",textHeight:.15*Ot,position:[0,0,1.6*Ot]})]},t)})),Object(pf.jsx)("group",{rotation:new We.Euler(b,0,Pt.z,"ZXY"),children:Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(b/Math.PI*180),"\xb0"),fontSize:20*Ot,fontFace:"Times Roman",textHeight:.2*Ot,position:[0,0,.75*Ot]})})]})]}),S>0&&ze&&Mt.map((function(e,t){return Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[H,H,S+2*(e.z-Wt)+v,ct,1],position:e,rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t)})),z&&xt.z>0&&Object(pf.jsxs)("group",{rotation:[-gt.x,0,-gt.z],children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[xt.clone().multiplyScalar(.5),Dt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:Dt.clone().multiplyScalar(.75),rotation:[vt+gt.x+Pt.x,0,gt.z+Pt.z,w0?eI:e>=M&&e<=I}),[D,M,I,W]),re=Object(r.useRef)(!1),ne=Xw(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 We.TextureLoader).load(El.fetchTextureImage(v,oe),(function(e){A&&(e.wrapS=We.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 El.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){bf.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=le.lz})),Ww.isMoveHandle(t)?q.domElement.style.cursor="move":q.domElement.style.cursor="pointer")}),[]),ye=Object(r.useCallback)((function(){j((function(e){e.hoveredHandle=null})),q.domElement.style.cursor=Xw.getState().addedCuboidId?"crosshair":"default"}),[]),ge=function(){return p!==xt&&(null===Z||void 0===Z?void 0:Z.current)?Ww.getObjectChildById(Z.current,p):null},we=Object(r.useMemo)((function(){return El.fetchSpread(v)}),[v]),xe=Object(r.useMemo)((function(){return El.fetchHeight(v)}),[v]);Object(Se.d)((function(e){var t=e.camera;if(_.current){var l=Ww.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 We.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(pf.jsx)(pf.Fragment,{children:S?Object(pf.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(pf.jsxs)("group",{position:[0,0,xe/2],children:[Object(pf.jsx)(fx.a,{ref:$,uuid:y,name:v,follow:!1,rotation:[vt,0,0],children:Object(pf.jsx)(Lt.f,{args:[we,xe],receiveShadow:!0,children:Object(pf.jsx)("meshToonMaterial",{map:ue,side:We.DoubleSide,alphaTest:.5})})}),Object(pf.jsx)(fx.a,{ref:te,name:"Interaction Billboard",visible:!1,position:[0,0,-xe/2],children:Object(pf.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),j((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),Nt.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(pf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,-xe/2),args:[.30000000000000004,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Nt.setState((function(e){e.flowerRef=_})))},onPointerEnter:function(e){pe(e,B.Default)},onPointerLeave:ye,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:O===B.Default||k===B.Default?pt:ut})})}),N&&!Q&&Object(pf.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!==(f=null===le||void 0===le?void 0:le.labelHeight)&&void 0!==f?f:.4)]})]})}):null})},bv=n.a.memo(vv),Av=l(21),Tv=l(22),Pv=l(841),Sv=l(94),Hv=Tv.a.div(av||(av=Object(Av.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"]))),jv=function(){var e=Xw(si),t=Xw(Gi),l=Xw(Vi),a=bf(ms),i=Xw(o.showDesignInfoPanel),r={lng:l};return Object(pf.jsx)(Hv,{style:{bottom:i?"42px":"6px"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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)})]})})},zv=n.a.memo(jv),Rv=Tv.a.div(ov||(ov=Object(Av.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"]))),Dv=function(){var e=Xw(si),t=Xw(Gi),l=Xw(Vi),a=bf(xs),i=Xw(o.showDesignInfoPanel),r={lng:l};return Object(pf.jsx)(Rv,{style:{bottom:i?"42px":"6px"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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)})]})})},Wv=n.a.memo(Dv),Mv=l(274),Iv=Object(Tv.a)(Mv.a)(iv||(iv=Object(Av.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"]))),Cv=n.a.memo((function(e){var t=e.initializing,l=bf(ys),a=bf(gs),o=bf(ws),r=bf(ms),n=bf(xs),c=Xw(i.noAnimationForSensorDataCollection),s=Xw(i.noAnimationForSolarPanelSimulation),d=Xw(i.noAnimationForHeatmapSimulation),u=Xw(i.noAnimationForSolarUpdraftTowerSimulation),f=Xw(i.noAnimationForThermalSimulation),h=bf(Gs),p=bf(Bs),y=bf(gu),g=bf(wu),m=bf(Jd),w=bf(Gd),x=bf(Lr),v=bf(Ir),b=bf(Fr),A=Xw.getState().elements;return Object(pf.jsx)(pf.Fragment,{children:(t||l||a||o)&&Object(pf.jsxs)(pf.Fragment,{children:[a&&(!d&&x||!f&&(v||b)||!c&&(y||g)||!u&&(m||w)||!s&&(h||p)||Ww.hasMovingParts(A))&&Object(pf.jsx)(zv,{}),o&&Object(pf.jsx)(Wv,{}),Object(pf.jsx)(Iv,{spinning:!r||!n})]})})})),Fv=function(){if(!bf.getState().waiting)return null;var e=function(){return Object(r.useEffect)((function(){bf.setState((function(e){e.waiting=!1}))})),null};return Object(pf.jsx)(e,{})},kv=function(){var e=Xw(ki),t=Object(r.useRef)(null);return Object(r.useEffect)((function(){t&&Nt.setState((function(e){e.contentRef=t}))}),[]),console.debug(e),Object(pf.jsxs)("group",{ref:t,name:"Content",children:[e.map((function(t){switch(t.type){case V.Foundation:return Object(pf.jsx)(jg,Object(d.a)({},t),t.id);case V.Sensor:var l=t;return l.parentType===V.Cuboid?null:Object(pf.jsx)(Sw,Object(d.a)({},l),t.id);case V.Light:var a=t;return a.parentType===V.Cuboid?null:Object(pf.jsx)(jw,Object(d.a)({},a),t.id);case V.Cuboid:return t.parentId!==xt?null:Object(pf.jsx)(Dw,{elements:e,cuboidModel:t},t.id);case V.Human:return Object(pf.jsx)(px,Object(d.a)({},t),t.id);case V.Tree:return Object(pf.jsx)($x,Object(d.a)({},t),t.id);case V.Flower:return Object(pf.jsx)(bv,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(pf.jsx)(xv,Object(d.a)({},t),t.id)}case V.ParabolicDish:return Object(pf.jsx)(hv,Object(d.a)({},t),t.id);case V.ParabolicTrough:return Object(pf.jsx)(uv,Object(d.a)({},t),t.id);case V.FresnelReflector:return Object(pf.jsx)(yv,Object(d.a)({},t),t.id);case V.Heliostat:return Object(pf.jsx)(mv,Object(d.a)({},t),t.id);case V.Polygon:switch(t.parentType){case V.Wall:return null;default:return Object(pf.jsx)(Nm,Object(d.a)({},t),t.id)}default:if(t.id)return Object(pf.jsx)(n.a.Fragment,{},t.id)}return null})),Object(pf.jsx)(Fv,{})]})},Ov=n.a.memo(kv),Yv=function(){var e=Xw(si),t=Xw(an),l=Xw(en),a=Xw(nn),i=Xw(Un),n=Xw(rs),c=Xw(Zr),s=Xw(bn),p=Xw(jn),y=Xw(Kc),g=Xw(Qr),m=Xw(Ru),w=Xw(Sr),x=Xw(Kn),v=Xw(Br),b=Xw(Vi),A=Xw(ns),T=Xw(ju),P=Xw(zu),S=Xw(Du),H=Xw(Wu),j=Xw(o.shadowEnabled),z=Xw(o.groundColor),R=Xw(o.waterSurface),D=Xw((function(e){return e.world.ground})),W=Xw(Cu),M=Xw(ku),I=bf(Us),C=Xw(Vu),F=Object(Se.f)(),k=F.get,O=F.scene,Y=F.invalidate,L=Object(r.useRef)(),N=Object(r.useRef)(),U=Object(r.useRef)(null),E=Object(r.useRef)(new We.Vector3),J=Object(r.useRef)(new We.Vector3),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 Map),ae=Object(r.useRef)(new We.Vector3(1,1,1)),oe=Object(r.useRef)(new We.Vector3(1,1,1)),ie=Object(r.useRef)([0,0,1]),re=Object(r.useRef)([0,0,1]),ne=Object(r.useRef)(null),ce=Object(r.useRef)(null),se=Object(r.useRef)(new Map),de=Object(r.useRef)(new Map),ue=Object(r.useRef)(new Map),fe=Object(r.useRef)(!1),he=Object(r.useRef)(!1),pe=Object(r.useRef)(!1),ye=Object(r.useRef)(!1),ge=Object(r.useRef)(!1),we=Object(r.useRef)(new Map),xe=Object(r.useRef)(new Map),ve=Object(r.useRef)(new Map),be=Object(r.useRef)(new We.Vector3),Ae=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(){W&&(e((function(e){e.addedFoundationId=null,e.deletedFoundationId=null})),fe.current=!1,he.current=!1)}),[W]),Object(r.useEffect)((function(){M&&(e((function(e){e.addedCuboidId=null,e.deletedCuboidId=null})),pe.current=!1,ye.current=!1)}),[M]);var Te=Object(Se.f)().camera,Pe=Object(r.useMemo)((function(){return new We.Raycaster}),[]),He=Object(r.useMemo)((function(){return new We.Vector2}),[]),je=U.current?Math.cos(U.current.rotation[2]):1,ze=U.current?Math.sin(U.current.rotation[2]):0,Re=Z.Ground,De=Object(r.useMemo)((function(){return new We.Vector3}),[]),Me=Object(r.useMemo)((function(){return new We.Euler}),[]),Ie=Object(r.useMemo)((function(){return new We.Euler}),[]);if(U.current)if(Ww.isPlantOrHuman(U.current)){Re=Z.Vertical;var Ce=Xw.getState().viewState.orthographic?0:-vt,Fe=Te.position,ke=Fe.x,Oe=Fe.y,Ye=-Math.atan2(ke,Oe);Me.set(Ce,0,Ye,"ZXY"),De.set(U.current.cx,U.current.cy,0)}else if(T===B.Top)Re=Z.Horizontal,De.set(U.current.cx,U.current.cy,U.current.lz),Me.set(0,0,0);else if(Ww.isMoveHandle(T)||P===K.Left||P===K.Right||P===K.Lower||P===K.Upper||P===K.LowerLeft||P===K.UpperLeft&&U.current.type!==V.Wall||P===K.LowerRight||P===K.UpperRight&&U.current.type!==V.Wall||S===q.Lower||S===q.Upper)Re=Z.Horizontal,De.set(U.current.cx,U.current.cy,st),Me.set(0,0,0);else if(P){Re=Z.Vertical;var Le=m(U.current,P),Ne=g(),Ue=-Math.atan2(Ne.x,Ne.y);De.set(Le.x,Le.y,0),Me.set(-vt,0,Ue,"ZXY")}var Ee=function(e){He.x=e.offsetX/k().gl.domElement.clientWidth*2-1,He.y=-e.offsetY/k().gl.domElement.clientHeight*2+1,Pe.setFromCamera(He,k().camera)},Ve=function(e){var t,l=Object(h.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},Je=function(t,l){t&&e((function(e){var a,o=Object(h.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()}}))},Ge=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},Xe=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Ww.getObjectChildById(a.current,t),i=Ww.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Ww.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}Y()}}}},Be=function(e,t){if(e&&e.current){var l=Ve(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Nt.getState().contentRef;i&&i.current&&(i.current.add(e.current),Je(xt,Ge(e.current)))}e.current.position.copy(l.point),Y()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),Je(Ge(r),Ge(e.current)));var n=Ww.getWorldDataById(Ge(r)).rot;Ie.set(0,0,-n);var c=(new We.Vector3).subVectors(l.point,r.localToWorld(new We.Vector3)).applyEuler(Ie);e.current.position.copy(c),Y()}}ge.current||(ge.current=!0)}}},Ke=function(t,l,a){e((function(e){var o,i=Object(h.a)(e.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===t){Ww.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()}}))},qe=function(e,t){var l=Nt.getState().contentRef,a=Ww.getObjectChildById(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(h.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=Nt.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 We.Vector3(t.cx,t.cy,t.cz).applyEuler(new We.Euler(0,0,e.rotation[2])).add(E.current);t.cx=s.x,t.cy=s.y,t.cz=0,X.current.set(t.id,new We.Vector3(s.x,s.y,0)),le.current.set(t.id,xt)},Qe=function(t){var a=Xw.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:ae.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:ae.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:ae.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(J.current.set(t.cx,t.cy,t.cz),oe.current.set(t.lx,t.ly,t.lz),te.current.clear(),le.current.clear(),X.current.clear(),_.current.clear(),ee.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(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Ww.isPlantOrHuman(o)&&o.parentId===t.id&&(te.current.set(o.id,t.id),!Ww.isResizingVertical(Xw.getState().resizeHandleType)))if(Math.abs(ae.current.z/2-o.cz)<.01){var i=new We.Vector3(o.cx,o.cy,o.cz).applyEuler(new We.Euler(0,0,t.rotation[2])).add(E.current).sub(J.current).applyEuler(new We.Euler(0,0,-t.rotation[2]));Math.abs(i.x)>Math.abs(oe.current.x/2)+.01||Math.abs(i.y)>Math.abs(oe.current.y/2)+.01?qe(t,o):(o.cx=i.x,o.cy=i.y)}else{var r=new We.Vector3(o.cx,o.cy,o.cz),n=(new We.Vector3).subVectors(J.current,E.current),c=(new We.Vector3).subVectors(r,n);Math.abs(r.x/ae.current.x)>.49?Math.abs(c.y)>t.ly/2+.5?qe(t,o):(o.cx=(r.x>0?t.lx:-t.lx)/2,o.cy=c.y):Math.abs(r.y/ae.current.y)>.49&&(Math.abs(c.x)>t.lx/2+.5?qe(t,o):(o.cx=c.x,o.cy=(r.y>0?t.ly:-t.ly)/2))}}}catch(s){a.e(s)}finally{a.f()}}})),J.current.distanceToSquared(E.current)>At&&oe.current.distanceToSquared(ae.current)>At){if(t.type===V.Foundation||t.type===V.Cuboid){var n=l(t.id);if(n.length>0){var f,y=Object(h.a)(n);try{for(y.s();!(f=y.n()).done;){var g=f.value;if(g.type===V.Polygon)_.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 We.Vector2(m.leftPoint[0],m.leftPoint[1]),b=new We.Vector2(m.rightPoint[0],m.rightPoint[1]);ee.current.set(g.id,[v,b])}X.current.set(g.id,new We.Vector3(g.cx,g.cy,g.cz))}}}catch(z){y.e(z)}finally{y.f()}}if(t.type===V.Foundation){var A=ot(t.id);if(A.length>0){var T,P=Object(h.a)(A);try{for(P.s();!(T=P.n()).done;){var S=T.value,H=new We.Vector3(S.cx,S.cy);X.current.set(S.id,H)}}catch(z){P.e(z)}finally{P.f()}}}}var j=function(){if(U.current){var t={name:"Resize",timestamp:Date.now(),resizedElementId:U.current.id,resizedElementType:U.current.type,oldCx:E.current.x,oldCy:E.current.y,oldCz:E.current.z,newCx:J.current.x,newCy:J.current.y,newCz:J.current.z,oldLx:ae.current.x,oldLy:ae.current.y,oldLz:ae.current.z,newLx:oe.current.x,newLy:oe.current.y,newLz:oe.current.z,oldChildrenPositionsMap:new Map(G.current),newChildrenPositionsMap:new Map(X.current),oldPolygonVerticesMap:new Map(Q.current),newPolygonVerticesMap:new Map(_.current),oldChildrenParentIdMap:new Map(te.current),newChildrenParentIdMap:new Map(le.current),oldWallPointsMap:new Map($.current),newWallPointsMap:new Map(ee.current),undo:function(){if(e((function(e){var l,a=Object(h.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(h.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(h.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,at(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),f=null===(s=t.newChildrenParentIdMap)||void 0===s?void 0:s.get(o);d&&f&&d!==f&&(Xe(d,f,o),Je(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(h.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],f=c(s);(null===f||void 0===f?void 0:f.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}},redo:function(){if(e((function(e){var l,a=Object(h.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(h.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(h.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&&(Xe(s,c,r),Je(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(h.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],f=c(s);(null===f||void 0===f?void 0:f.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}}};return t}}();j&&w(j)}},Ze=function(t){e((function(e){var l,a=Object(h.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()}}))},_e=function(t,l){var o,i,r;if(!t.locked){J.current.set(t.cx,t.cy,t.cz);var n=ne.current,c=null;switch(Ee(l),t.type){case V.Tree:c=null===(o=Nt.getState().treeRef)||void 0===o?void 0:o.current;break;case V.Flower:c=null===(i=Nt.getState().flowerRef)||void 0===i?void 0:i.current;break;case V.Human:c=null===(r=Nt.getState().humanRef)||void 0===r?void 0:r.current}if(c&&ge.current){var s=Pe.intersectObjects(Ww.fetchIntersectables(O),!1),d=Ve(s);if(d){var u=d.point;if("Ground"===d.object.name)Ke(t.id,xt,u),J.current.set(u.x,u.y,u.z),n=xt;else if(d.object.userData.stand){var p=Ge(d.object),y=d.object.parent;if(y){var g=(new We.Vector3).subVectors(u,y.localToWorld(new We.Vector3)).applyEuler(Ie);Ke(t.id,p,g),J.current.set(g.x,g.y,g.z),n=p}}}ge.current=!1}if(J.current.distanceToSquared(E.current)>At||0===Pe.intersectObjects([L.current]).length){var m=!0;if(!Xw.getState().viewState.orthographic&&!(m=J.current.length().02}if(!m||function(){if(Xw.getState().viewState.orthographic)return!1;if(L.current){var e=Pe.intersectObjects(k().scene.children,!0);if(e.length>0){var t,l=Object(h.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===Pe.intersectObjects([L.current]).length}()){a(t.id,E.current.x,E.current.y,E.current.z),c&&Ww.isPlantOrHuman(t)&&c.position.copy(E.current),Ww.isPlantOrHuman(t)&&Je(ne.current,t.id);var S=Nt.getState().contentRef;if((null===S||void 0===S?void 0:S.current)&&ne.current&&c){if(ne.current===xt)S.current.add(c);else{var H=Ww.getObjectChildById(S.current,ne.current);null===H||void 0===H||H.add(c)}Y()}Qh(me.t("message.CannotMoveObjectTooFar",Ae))}else{if(we.current.size>1){ve.current.clear();var j,z=Object(h.a)(Xw.getState().elements);try{for(z.s();!(j=z.n()).done;){var R=j.value;xe.current.has(R.id)&&ve.current.set(R.id,[R.cx,R.cy,R.cz])}}catch(F){z.e(F)}finally{z.f()}var D={name:"Move Foundation Group",timestamp:Date.now(),oldPositionMap:new Map(xe.current),newPositionMap:new Map(ve.current),undo:function(){Ze(D.oldPositionMap)},redo:function(){Ze(D.newPositionMap)}};w(D)}else{var W=t.type===V.Cuboid,M=W?ce.current:ne.current,I=W?t.parentId:n,C={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:E.current.x,oldCy:E.current.y,oldCz:E.current.z,newCx:J.current.x,newCy:J.current.y,newCz:J.current.z,oldRotation:Object(f.a)(ie.current),newRotation:Object(f.a)(t.rotation),oldParentId:M,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(f.a)(C.oldRotation))})),Je(C.oldParentId,C.movedElementId),C.movedElementType&&it(C.movedElementType)&&Xe(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(f.a)(C.newRotation))})),Je(C.newParentId,C.movedElementId),C.movedElementType&&it(C.movedElementType)&&Xe(C.newParentId,C.oldParentId,C.movedElementId)}};w(C)}v()}}}},$e=function(t){if(2!==t.button){if(Nt.setState((function(e){e.setEnableOrbitController(!0)})),U.current){var l=c(U.current.id);if(l)if(he.current)if(fe.current=!1,he.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(ye.current)if(pe.current=!1,ye.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 Xw.getState().resizeHandleType?Qe(l):Xw.getState().rotateHandleType?function(e){re.current=Object(f.a)(e.rotation);var t=(new We.Vector3).fromArray(ie.current);if((new We.Vector3).fromArray(re.current).distanceToSquared(t)>At){var l={name:"Rotate",timestamp:Date.now(),rotatedElementId:e.id,rotatedElementType:e.type,oldRotation:ie.current,newRotation:re.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):Xw.getState().moveHandleType&&_e(l,t),l.type===V.Foundation&&bf.getState().updateFoundationMovedFlag();U.current=null}e((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Nt.setState((function(e){e.humanRef=null,e.treeRef=null,e.flowerRef=null}))}},et=function(e,t){var l=Ww.getWorldDataById(e.id).pos,a=new We.Vector3(l.x,l.y),o=(new We.Vector3).subVectors(a,t);we.current.set(e.id,o),xe.current.set(e.id,[e.cx,e.cy,e.cz])},tt=function e(t,l){var a,o=t.intersections[0].point.clone().setZ(0),i=Object(h.a)(Xw.getState().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!Qf(r)||r.parentId!==xt||r.locked||r.id===l.id||we.current.has(r.id)||Ww.isChild(l.id,r.id)||Ww.isChild(r.id,l.id)||!Ww.areTwoBasesOverlapped(r,l)||(et(r,o),e(t,r)),r.id===l.id&&et(r,o)}}catch(n){i.e(n)}finally{i.f()}},lt=function(e,t){we.current.clear(),xe.current.clear(),t.enableGroupMaster&&Xw.getState().moveHandleType&&tt(e,t)},at=function(e){return e.type===V.SolarPanel&&e.parentType===V.Roof||(e.type===V.Window&&e.parentType===V.Roof||void 0)},ot=function(e){return Xw.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)))}))},it=function(e){return e===V.Human||e===V.Tree||e===V.Flower},rt=function(e,t){if(0===e.tempHumanPlant.length){var l=e.elements.filter((function(e){return it(e.type)&&Ww.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)}))}},nt=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(!we.current.has(a))return Ww.isChild(t,a)?void 0:l}},ct=function(e){return e===V.Foundation||e===V.Cuboid||e===V.Tree||e===V.Flower||e===V.Human},dt=function(e,t,l,a,o){if(e){var i,r=Object(h.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=Ge(n),s=se.current.get(c);if(s)if(Math.abs(ae.current.z/2-n.position.z)<.01){var d=(new We.Vector3).subVectors(s,a).applyEuler(new We.Euler(0,0,-o));n.position.setX(d.x),n.position.setY(d.y)}else{var u=(new We.Vector3).subVectors(s,E.current).applyEuler(new We.Euler(0,0,-o)),f=(new We.Vector3).subVectors(a,E.current),p=(new We.Vector3).subVectors(u,f);Math.abs(u.x/ae.current.x)>.49?(n.position.setX((u.x>0?t:-t)/2),n.position.setY(p.y)):Math.abs(u.y/ae.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()}}},ut=function(t){if(U.current){var a=new We.Vector2(t.x,t.y),o=new We.Vector2(H.x,H.y),i=o.distanceTo(a),r=Math.atan2(a.x-H.x,a.y-H.y)+U.current.rotation[2],n=Math.abs(i*Math.sin(r)),c=Math.abs(i*Math.cos(r)),s=(new We.Vector2).addVectors(a,o).multiplyScalar(.5);switch(e((function(e){if(U.current){var t,a=!1,o=Object(h.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===U.current.id){switch(i.type){case V.Cuboid:case V.Foundation:var r=l(i.id);if(r.length>0&&!C){var d,u=[],f=Object(h.a)(r);try{for(f.s();!(d=f.n()).done;){var p=d.value;if(!Ww.isPlantOrHuman(p)){var y=JSON.parse(JSON.stringify(p));if(u.push(y),Ww.isIdentical(y.normal,Tt))if(p.type===V.Wall){var g=ue.current.get(p.id);if(g){var m=-i.rotation[2],w=g.centerPointAbsPos,x=g.leftPointAbsPos,v=g.rightPointAbsPos,b=(new We.Vector2).subVectors(w,s).rotateAround(Dt,m),A=(new We.Vector2).subVectors(x,s).rotateAround(Dt,m),T=(new We.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=se.current.get(p.id);if(S){var H=-i.rotation[2],j=(new We.Vector2).subVectors(new We.Vector2(S.x,S.y),s).rotateAround(Dt,H);switch(P){case K.Lower:case K.Upper:y.cy=j.y/c;break;case K.Left:case K.Right:y.cx=j.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=j.x/n,y.cy=j.y/c}}}}}}catch(te){f.e(te)}finally{f.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(Ww.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(te){o.e(te)}finally{o.f()}if(a&&!C){var R,D=Object(h.a)(e.elements);try{for(D.s();!(R=D.n()).done;){var W=R.value;if(W.parentId===U.current.id)switch(W.type){case V.Wall:var M=W,I=ue.current.get(W.id);if(I){var F=-U.current.rotation[2],k=I.centerPointAbsPos,O=I.leftPointAbsPos,Y=I.rightPointAbsPos,L=(new We.Vector2).subVectors(k,s).rotateAround(Dt,F),N=(new We.Vector2).subVectors(O,s).rotateAround(Dt,F),E=(new We.Vector2).subVectors(Y,s).rotateAround(Dt,F);switch(P){case K.Lower:case K.Upper:W.cy=L.y;break;case K.Left:case K.Right:W.cx=L.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=L.x,W.cy=L.y}M.leftPoint=[N.x,N.y,0],M.rightPoint=[E.x,E.y,0]}break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:if(Ww.isIdentical(W.normal,Tt)){var J=se.current.get(W.id);if(J){var G=(new We.Vector2).subVectors(new We.Vector2(J.x,J.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=G.y/c;break;case K.Left:case K.Right:W.cx=G.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=G.x/n,W.cy=G.y/c}}}break;case V.Cuboid:var X=se.current.get(W.id);if(X){var B=(new We.Vector2).subVectors(new We.Vector2(X.x,X.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=B.y;break;case K.Left:case K.Right:W.cx=B.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=B.x,W.cy=B.y}}break;case V.Polygon:if(Ww.isIdentical(W.normal,Tt)){var q=W,Q=de.current.get(q.id);Q&&function(){var e=[];Q.forEach((function(t){var l=(new We.Vector2).subVectors(t,s).rotateAround(Dt,-U.current.rotation[2]);e.push({x:l.x/n,y:l.y/c})})),q.vertices=e}()}}if(W.foundationId===U.current.id&&W.type===V.SolarPanel&&W.parentType===V.Roof){var Z=se.current.get(W.id);if(Z){var _=(new We.Vector2).subVectors(new We.Vector2(Z.x,Z.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=_.y/c;break;case K.Left:case K.Right:W.cx=_.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=_.x/n,W.cy=_.y/c}}}if(W.foundationId===U.current.id&&W.type===V.Window&&W.parentType===V.Roof){var $=se.current.get(W.id);if($){var ee=(new We.Vector2).subVectors(new We.Vector2($.x,$.y),s).rotateAround(Dt,-U.current.rotation[2]);W.cx=ee.x,W.cy=ee.y}}}}catch(te){D.e(te)}finally{D.f()}}}})),U.current.type){case V.Foundation:var d=Nt.getState().foundationRef;(null===d||void 0===d?void 0:d.current)&&dt(null===d||void 0===d?void 0:d.current,n,c,d.current.position,U.current.rotation[2]);break;case V.Cuboid:var u=Nt.getState().cuboidRef;(null===u||void 0===u?void 0:u.current)&&u.current.parent&&dt(null===u||void 0===u?void 0:u.current,n,c,u.current.parent.position,U.current.rotation[2])}}},ft=function(e){var t=U.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(U.current.id,0,0,o+r)},ht=function(t){if(we.current.size>0)e((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Qf(o)&&we.current.has(o.id)){var i=we.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 l,o,i=U.current.lx/2,r=U.current.ly/2;switch(T){case B.Top:a(U.current.id,t.x,t.y);break;case B.Upper:l=t.x+ze*r,o=t.y-je*r,a(U.current.id,l,o);break;case B.Lower:l=t.x-ze*r,o=t.y+je*r,a(U.current.id,l,o);break;case B.Left:l=t.x+je*i,o=t.y+ze*i,a(U.current.id,l,o);break;case B.Right:l=t.x-je*i,o=t.y-ze*i,a(U.current.id,l,o)}}};return Object(pf.jsxs)(pf.Fragment,{children:[U.current&&Re!==Z.Ground&&Object(pf.jsx)(Lt.f,{ref:N,visible:!1,name:"Ground Intersection Plane",rotation:Me,position:De,args:[1e5,1e5],onPointerMove:function(t){var l;if(U.current&&U.current.type&&!U.current.locked&&(Ee(t),N.current&&Re===Z.Vertical&&(l=Pe.intersectObjects([N.current]))&&l.length>0)){var a=l[0].point;switch(U.current.type){case V.Tree:var o=U.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))}Be(Nt.getState().treeRef,t);break;case V.Flower:Be(Nt.getState().flowerRef,t);break;case V.Human:Be(Nt.getState().humanRef,t)}}},children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide,opacity:.5,transparent:!0})}),Object(pf.jsx)(Lt.f,{receiveShadow:j,ref:L,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===L.current&&e((function(e){_y.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&&L.current)if(fe.current){Ee(a);var o=Pe.intersectObjects([L.current]);o.length>0&&(Nt.getState().setEnableOrbitController(!1),e((function(e){e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(o[0].point)})),fe.current=!1,he.current=!0)}else if(pe.current){Ee(a);var i=Pe.intersectObjects([L.current]);i.length>0&&(Nt.getState().setEnableOrbitController(!1),e((function(e){if(e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(i[0].point),U.current){var t,l=nt(a,null===(t=U.current)||void 0===t?void 0:t.id);if(l){var o=Pe.intersectObjects([l.eventObject]);o.length>0&&e.resizeAnchor.copy(o[0].point)}}})),pe.current=!1,ye.current=!0)}else{if(a.intersections[0].object===L.current){if(e((function(e){e.clickObjectType=V.Ground,e.selectedElement=null,_y.selectNone(e),e.contextMenuObjectType=null,e.groupMasterId=null})),ct(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=t();if(u&&ct(u.type)){if(U.current=u,E.current.set(u.cx,u.cy,u.cz),ae.current.set(u.lx,u.ly,u.lz),ie.current=Object(f.a)(u.rotation),u.type===V.Foundation||u.type===V.Cuboid){var p=l(u.id);if(G.current.clear(),Q.current.clear(),$.current.clear(),p.length>0){var g,m=Object(h.a)(p);try{for(m.s();!(g=m.n()).done;){var x=g.value;if(x.type===V.Polygon)Q.current.set(x.id,x.vertices.map((function(e){return Object(d.a)({},e)})));else{if(x.type===V.Wall){var b=x,T=new We.Vector2(b.leftPoint[0],b.leftPoint[1]),P=new We.Vector2(b.rightPoint[0],b.rightPoint[1]);$.current.set(x.id,[T,P])}G.current.set(x.id,new We.Vector3(x.cx,x.cy,x.cz))}}}catch(Xe){m.e(Xe)}finally{m.f()}}if(u.type===V.Foundation){var S=ot(u.id);if(S.length>0){var H,j=Object(h.a)(S);try{for(j.s();!(H=j.n()).done;){var z=H.value,R=new We.Vector3(z.cx,z.cy);G.current.set(z.id,R)}}catch(Xe){j.e(Xe)}finally{j.f()}}}}switch(u.type){case V.Tree:ne.current=u.parentId,ae.current.set(u.lx,u.ly,u.lz);break;case V.Flower:case V.Human:ne.current=u.parentId;break;case V.Cuboid:if(Qf(u)&&u.parentId===xt&<(a,u),ce.current=u.parentId,Xw.getState().moveHandleType){var W=Ww.getWorldDataById(u.id).rot,M=new We.Euler(0,0,W);switch(Xw.getState().moveHandleType){case B.Right:be.current.set(-u.lx/2,0,0).applyEuler(M);break;case B.Left:be.current.set(u.lx/2,0,0).applyEuler(M);break;case B.Lower:be.current.set(0,u.ly/2,0).applyEuler(M);break;case B.Upper:be.current.set(0,-u.ly/2,0).applyEuler(M);break;default:be.current.set(0,0,0)}}se.current.clear();var I=Ww.getWorldDataById(u.id),C=I.pos,F=I.rot,k=new We.Vector3(C.x,C.y,C.z),O=l(u.id);if(O.length>0){var Y,N=Object(h.a)(O);try{for(N.s();!(Y=N.n()).done;){var J=Y.value;switch(J.type){case V.Cuboid:var X=new We.Vector3(J.cx,J.cy,J.cz).applyEuler(new We.Euler(0,0,F));X.add(k),se.current.set(J.id,X);break;case V.Tree:case V.Flower:case V.Human:var q=new We.Vector3(J.cx,J.cy,J.cz).applyEuler(new We.Euler(0,0,F));q.add(k),se.current.set(J.id,q);break;case V.SolarPanel:case V.Light:case V.Sensor:if(Ww.isIdentical(J.normal,Tt)){var Z=new We.Vector3(J.cx*u.lx,J.cy*u.ly,J.cz*u.lz).applyEuler(new We.Euler(0,0,F));Z.add(k),se.current.set(J.id,Z)}break;case V.Polygon:if(Ww.isIdentical(J.normal,Tt)){var _,ee=J,te=[],le=Object(h.a)(ee.vertices);try{for(le.s();!(_=le.n()).done;){var oe=_.value,re=new We.Vector2(oe.x*u.lx,oe.y*u.ly).rotateAround(Dt,F);re.add(new We.Vector2(k.x,k.y)),te.push(re)}}catch(Xe){le.e(Xe)}finally{le.f()}de.current.set(ee.id,te)}}}}catch(Xe){N.e(Xe)}finally{N.f()}}break;case V.Foundation:Qf(u)&<(a,u),se.current.clear(),de.current.clear(),ue.current.clear();var ge=new We.Vector2(u.cx,u.cy),me=new We.Vector3(u.cx,u.cy,u.cz),we=l(u.id);if(we.length>0){var xe,ve=u.rotation[2],Ae=Object(h.a)(we);try{for(Ae.s();!(xe=Ae.n()).done;){var Te=xe.value;switch(Te.type){case V.Wall:var Se=Te,He=new We.Vector2(Se.cx,Se.cy).rotateAround(Dt,ve);He.add(ge);var je=new We.Vector2(Se.leftPoint[0],Se.leftPoint[1]).rotateAround(Dt,ve);je.add(ge);var ze=new We.Vector2(Se.rightPoint[0],Se.rightPoint[1]).rotateAround(Dt,ve);ze.add(ge),ue.current.set(Se.id,{centerPointAbsPos:He,leftPointAbsPos:je,rightPointAbsPos:ze});break;case V.Tree:case V.Flower:case V.Human:var Re=new We.Vector3(Te.cx,Te.cy,Te.cz).applyEuler(new We.Euler(0,0,ve));Re.add(me),se.current.set(Te.id,Re);break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var De=new We.Vector3(Te.cx*u.lx,Te.cy*u.ly,Te.cz*u.lz).applyEuler(new We.Euler(0,0,ve));De.add(me),se.current.set(Te.id,De);break;case V.Polygon:var Me,Ie=Te,Ce=[],Fe=Object(h.a)(Ie.vertices);try{for(Fe.s();!(Me=Fe.n()).done;){var ke=Me.value,Oe=new We.Vector2(ke.x*u.lx,ke.y*u.ly).rotateAround(Dt,ve);Oe.add(ge),Ce.push(Oe)}}catch(Xe){Fe.e(Xe)}finally{Fe.f()}de.current.set(Ie.id,Ce)}}}catch(Xe){Ae.e(Xe)}finally{Ae.f()}}var Ye=ot(u.id);if(Ye.length>0){var Le,Ne=new We.Euler(0,0,u.rotation[2]),Ue=Object(h.a)(Ye);try{for(Ue.s();!(Le=Ue.n()).done;){var Ve=Le.value;if(Ve.type===V.Window){var Je=new We.Vector3(Ve.cx,Ve.cy).applyEuler(Ne);Je.add(me),se.current.set(Ve.id,Je)}else{var Ge=new We.Vector3(Ve.cx*u.lx,Ve.cy*u.ly).applyEuler(Ne);Ge.add(me),se.current.set(Ve.id,Ge)}}}catch(Xe){Ue.e(Xe)}finally{Ue.f()}}}}}}},onPointerMove:function(t){var l;if(U.current&&U.current.type&&!U.current.locked)switch(Ee(t),U.current.type){case V.Foundation:N.current&&(l=Pe.intersectObjects([N.current])).length>0&&(T?ht(l[0].point):P?ut(l[0].point):S&&ft(l[0].point));break;case V.Cuboid:if(N.current&&Re===Z.Horizontal&&(l=Pe.intersectObjects([N.current])).length>0){var o=l[0].point.clone(),i=nt(t,U.current.id);if(T)if(we.current.size>1)ht(o);else if(i){if(0===(l=Pe.intersectObjects([i.eventObject])).length)return;o.copy(l[0].point).add(be.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=Ww.getWorldDataById(r),i=a.pos,n=a.rot,c=(new We.Vector3).subVectors(o,i);if(c.applyEuler(new We.Euler(0,0,-n)),t.cx=c.x,t.cy=c.y,l.parentId!==r){t.parentId!==r&&rt(e,t.id);var s=Ww.getWorldDataById(l.id).rot;t.rotation[2]=s-n,t.parentId=r}else t.parentId!==r&&(t.parentId!==l.parentId&&rt(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===U.current.id}));if(t&&t.parentId!==xt){t.parentId!==xt&&rt(e,t.id);var l=Ww.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),ht(o);else if(P){var s=c(U.current.id);s&&s.parentId===xt&&ut(o)}}}if(L.current){if(A!==V.None){Ee(t);var d=Pe.intersectObjects([L.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})),U.current=f,fe.current=!0);break;case V.Cuboid:var h=n(D,u);h&&(e((function(e){e.addedCuboidId=h.id,e.objectTypeToAdd=V.None})),U.current=h,pe.current=!0)}}}if(U.current&&(fe.current||pe.current)){Ee(t);var p=Pe.intersectObjects([L.current]);if(0===p.length)return;var y=p[0].point;if(U.current.type===V.Foundation)a(U.current.id,y.x,y.y);else if(U.current.type===V.Cuboid){var g=nt(t,U.current.id);if(g){if(0===(p=Pe.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=U.current)||void 0===t?void 0:t.id)}));if(t){var l=Ww.getWorldDataById(m),a=l.pos,o=l.rot,i=(new We.Vector3).subVectors(y,a);i.applyEuler(new We.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=U.current)||void 0===t?void 0:t.id)}));if(t&&t.parentId!==xt){var l=Ww.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),a(U.current.id,y.x,y.y)}}}},children:I&&!R?Object(pf.jsx)("meshBasicMaterial",{color:z}):Object(pf.jsx)("meshStandardMaterial",{depthTest:!1,color:R?"white":z,map:R?Ww.WATER_TEXTURE:Ww.WHITE_TEXTURE,needsUpdate:!0})})]})},Lv=n.a.memo(Yv),Nv=function(e){var t,l,a,i=e.date,n=e.hourAngle,c=e.declinationAngle,s=e.worldLatitude,f=Xw(Kr),p=Xw(o.showSunAngles),y=null===(t=Xw(o.showAzimuthAngle))||void 0===t||t,g=null===(l=Xw(o.showElevationAngle))||void 0===l||l,m=null===(a=Xw(o.showZenithAngle))||void 0===a||a,w=Object(r.useState)(Ww.toRadians(42)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(Ly.a)(Ny),T=Math.max(2,.2*f),P=Math.max(.4,.025*f),S=Object(Se.e)(We.FontLoader,cy),H=.05*f,j={font:S,height:0,size:H},z=new Array(13).fill(0);Object(r.useEffect)((function(){b(Ww.toRadians(s))}),[s]);var R=Object(r.useMemo)((function(){for(var e=new We.BufferGeometry,t=new We.BufferGeometry,l=[],a=[],o=bt/72,i=0,r=0;rAt&&(c=.05*f+(i%3===0?.2:0),(s=new We.Vector3(f,n,0)).z=.002,a.push(Ww.sphericalToCartesianZ(s)),(s=new We.Vector3(f+c,n,0)).z=.002,a.push(Ww.sphericalToCartesianZ(s))),i++}for(var d=3*l.length,u=new Float32Array(d),h=new Float32Array(d),p=new Float32Array(d),y=0;y-.01&&e.push(n)}return e}),[v,f,c]),C=function(e){for(var t=Ry(e),l=[],a=Dy(e,Ww.toDegrees(v)),o=My(a.sunrise),i=My(a.sunset),r=(i-o)/48,n=o;n-.01&&l.push(c)}return l},F=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,f]),k=Object(r.useMemo)((function(){return Cy(f,n,c,v)}),[v,c,n,f]),O=Object(r.useMemo)((function(){return k.clone().normalize()}),[k]),Y=Object(r.useMemo)((function(){return new We.Vector3(k.x,k.y,0).normalize()}),[k]),L=Object(r.useMemo)((function(){return Math.asin(k.z/k.length())}),[k]),N=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,T,T,0,L,!1,0).getPoints(25),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[L,k]),U=Object(r.useMemo)((function(){return Math.acos(k.z/k.length())}),[k]),E=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,.8*T,.8*T,L,vt,!1,0).getPoints(25),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[U,k]),V=Object(r.useMemo)((function(){var e=Math.acos(k.y/Math.hypot(k.x,k.y));return k.x>0?-e:e}),[k]),J=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,1.2*T,1.2*T,vt,vt+V,k.x>0,0).getPoints(50),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[V,k]),G=Object(r.useMemo)((function(){for(var e=2*jy/12,t=bt/48,l=new We.BufferGeometry,a=0,o=[],i=[],r=-jy;rMath.PI&&(c=Math.PI),s>jy&&(s=jy);var d=Cy(f,n,r,v),u=Cy(f,c,r,v),h=Cy(f,c,s,v),p=Cy(f,n,s,v);(d.z>=0||u.z>=0||h.z>=0||p.z>=0)&&(o.push(d,u,h,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 We.BufferAttribute(new Uint16Array(i),1)),l}),[v,f]),X=.05*f,B=2+5*X;return Object(pf.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*-H:e>0&&e<7?.8*-H:1.2*-H}(Math.abs(l));return Object(pf.jsx)("group",{rotation:[vt,l*Math.PI/6,0],children:Object(pf.jsxs)("mesh",{position:[a,0,1.1*-f],rotation:[-vt,0,0],children:[Object(pf.jsx)("textGeometry",{args:["".concat(-30*l,"\xb0"),j]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)})),Object(pf.jsxs)("mesh",{rotation:new We.Euler(0,0,0),name:"Heliodon",children:[Object(pf.jsxs)("mesh",{children:[Object(pf.jsx)("bufferGeometry",Object(d.a)({},W)),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-.7,polygonOffsetUnits:-2})]}),Object(pf.jsxs)("lineSegments",{children:[Object(pf.jsx)("bufferGeometry",Object(d.a)({},M)),Object(pf.jsx)("meshBasicMaterial",{color:0})]}),Object(pf.jsxs)("mesh",{children:[I.length>3&&Object(pf.jsx)(Jl.a,{lineWidth:2,points:I,color:"yellow"}),F.filter((function(e){return e.length>3})).map((function(e,t){return Object(pf.jsx)(Jl.a,{opacity:0===t||6===t?1:.5,lineWidth:0===t||6===t?1:.5,points:e,color:"#999"},t)})),Object(pf.jsx)("mesh",{args:[G],children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,color:[1,1,0],transparent:!0,opacity:.5,depthWrite:!1,clippingPlanes:[new We.Plane(jt,0)]})}),Object(pf.jsx)("mesh",{position:k,children:Object(pf.jsx)("sprite",{scale:[B,B,B],children:Object(pf.jsx)("spriteMaterial",{map:A,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})}),Object(pf.jsxs)("mesh",{position:k,children:[Object(pf.jsx)("sphereGeometry",{args:[X,10,10]}),Object(pf.jsx)("meshBasicMaterial",{color:"white"})]})]})]}),Object(pf.jsx)(Lt.f,{args:[1e4,1e4],renderOrder:-1,userData:{unintersectable:!0},children:Object(pf.jsx)("meshBasicMaterial",{transparent:!0,opacity:0})}),p&&k.z>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[k.x,k.y,k.z]],name:"Line from origin to sun",lineWidth:.5,color:"white"}),Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[k.x,k.y,0]],name:"Line from origin to sun projection on ground",lineWidth:.5,color:"white"}),Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[k.x,k.y,0],[k.x,k.y,k.z]],name:"Line from sun projection on ground to sun",lineWidth:.5,color:"white"}),g&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:N,position:[0,0,0],rotation:new We.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Elevation Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Elevation Angle",backgroundColor:"indigo",text:Ww.toDegrees(L).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:O.clone().multiplyScalar(T).add(Y.clone().multiplyScalar(T)).multiplyScalar(.65)})]}),m&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:E,position:[0,0,0],rotation:new We.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Zenith Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Zenith Angle",backgroundColor:"navy",text:Ww.toDegrees(U).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:O.clone().multiplyScalar(T).add(Rt.clone().multiplyScalar(T)).multiplyScalar(.57)})]}),y&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:J,position:[0,0,0],color:"white",name:"Azimuth Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Azimuth Angle",backgroundColor:"firebrick",text:Ww.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(jt.clone().multiplyScalar(T)).multiplyScalar(1.1).add(new We.Vector3(0,0,P/2))})]})]})]})},Uv=n.a.memo(Nv),Ev=function(){var e=Xw(o.heliodon),t=Xw(Kr),l=Xw(i.latitude),a=Xw(i.date),n=Xw(Ns),c=Object(r.useMemo)((function(){return new Date(a)}),[a]),s=Object(r.useMemo)((function(){return[Wy(c),Ry(c)]}),[c]),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(r.useEffect)((function(){n(Cy(t,f,h,Ww.toRadians(l)))}),[l,f,h,t]),Object(pf.jsx)(pf.Fragment,{children:e&&Object(pf.jsx)(Uv,{date:new Date(a),hourAngle:f,declinationAngle:h,worldLatitude:l})})},Vv=n.a.memo(Ev),Jv=l.p+"static/media/ifi-logo.eb360016.png",Gv=l(536),Xv=l.n(Gv),Bv=l(537),Kv=l.n(Bv),qv=l(538),Qv=l.n(qv),Zv=l(539),_v=l.n(Zv),$v=l(540),eb=l.n($v),tb=l(183),lb=l(834),ab=l(214),ob=l(833),ib=l(842),rb=l(296),nb=l(297),cb=l.p+"static/media/magic-lamp.b58f942d.png",sb=(l(217),function(e){var t=e.top,l=e.height,a=e.color,o=Xw(Vi),i=Object(r.useMemo)((function(){return{lng:o}}),[o]),n=t+56+"px",c=t+100+"px",s=t+205+"px";return Object(pf.jsxs)("div",{children:[Object(pf.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(pf.jsx)("h2",{style:{marginTop:"20px",color:a},children:me.t("aboutUs.ProductBroughtToYouBy",i)}),Object(pf.jsxs)("p",{style:{fontSize:"12px",color:a},children:[Object(pf.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(pf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",style:{color:a},children:me.t("aboutUs.PrivacyPolicy",i)})]})]}),Object(pf.jsxs)("div",{children:[Object(pf.jsx)("hr",{style:{position:"absolute",left:"10%",width:"80%",marginTop:n,color:a}}),Object(pf.jsx)("table",{style:{position:"absolute",border:"none",top:c,left:"10%",width:"80%",fontSize:"small",color:a},children:Object(pf.jsx)("tbody",{children:Object(pf.jsxs)("tr",{style:{verticalAlign:"top"},children:[Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Software",i)}),"Charles Xie",Object(pf.jsx)("br",{}),"Xiaotong Ding",Object(pf.jsx)("br",{})]}),Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Content",i)}),"Rundong Jiang",Object(pf.jsx)("br",{}),"Charles Xie",Object(pf.jsx)("br",{})]}),Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Support",i)}),"Rundong Jiang",Object(pf.jsx)("br",{}),"Charles Xie",Object(pf.jsx)("br",{})]})]})})})]}),Object(pf.jsxs)("div",{style:{position:"absolute",left:"10%",marginRight:"10%",top:s,fontSize:"smaller",textAlign:"justify",color:a},children:[me.t("aboutUs.Translators",i),": ",E.Ukrainian," (Andriy Kashyrskyy), ",E.Spanish," (Alex Barco), ",E.Turkish," (Hasan Bircan)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("aboutUs.Acknowledgment",i),": ",me.t("aboutUs.FundingInformation",i)," ",me.t("aboutUs.Contact",i)]})]})}),db=n.a.memo(sb),ub=Tv.a.div(rv||(rv=Object(Av.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"]))),fb=function(e){var t=e.close,l=Xw(Vi);return Object(pf.jsxs)(ub,{children:[Object(pf.jsx)(db,{top:10,color:"antiquewhite"}),Object(pf.jsx)("div",{style:{position:"absolute",fontSize:"small",color:"antiquewhite",cursor:"pointer",bottom:"10px"},onMouseDown:function(){t()},children:me.t("word.Close",{lng:l})})]})},hb=n.a.memo(fb),pb=l(232),yb=l(231),gb=function(e){var t=e.name,l=Xw(si),a=Xw(Vi),o=Xw(i.cspTimesPerHour),r=Xw(i.cspDaysPerYear),n=Xw(i.cspGridCellSize),c={lng:a},s=tb.a.SubMenu,d=yb.a.Option;return Object(pf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==o&&void 0!==o?o:4,onChange:function(e){l((function(t){t.world.cspTimesPerHour=e}))},children:[Object(pf.jsx)(d,{value:1,children:"1"},1),Object(pf.jsx)(d,{value:2,children:"2"},2),Object(pf.jsx)(d,{value:3,children:"3"},3),Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12),Object(pf.jsx)(d,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},t+"-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==r&&void 0!==r?r:6,onChange:function(e){l((function(t){t.world.cspDaysPerYear=e})),Af.setState((function(e){e.yearlyParabolicTroughYield=[],e.yearlyParabolicDishYield=[],e.yearlyFresnelReflectorYield=[],e.yearlyHeliostatYield=[]}))},children:[Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},t+"-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},t+"-simulation-grid-cell-size")]})},t+"-analysis-options")},mb=function(){var e=Xw(si),t=Xw.getState().elements,l=Xw(Vi),a=Xw(i.timesPerHour),o=Xw(i.daysPerYear),r=Xw(i.pvGridCellSize),n=Xw(i.discretization),c=Xw(i.noAnimationForSolarPanelSimulation),s={lng:l},d=tb.a.SubMenu,u=yb.a.Option;return Object(pf.jsx)(d,{title:me.t("menu.solarPanel.EnergyAnalysisOptions",s),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",s)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(pf.jsx)(u,{value:1,children:"1"},1),Object(pf.jsx)(u,{value:2,children:"2"},2),Object(pf.jsx)(u,{value:3,children:"3"},3),Object(pf.jsx)(u,{value:4,children:"4"},4),Object(pf.jsx)(u,{value:6,children:"6"},6),Object(pf.jsx)(u,{value:12,children:"12"},12),Object(pf.jsx)(u,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",s)})]},"solar-panel-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.daysPerYear=t})),Af.setState((function(e){e.yearlyPvYield=[]}))},children:[Object(pf.jsx)(u,{value:4,children:"4"},4),Object(pf.jsx)(u,{value:6,children:"6"},6),Object(pf.jsx)(u,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",s)})]},"solar-panel-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.PanelDiscretization",s)+":"}),Object(pf.jsxs)(yb.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(pf.jsx)(u,{value:ae.EXACT,children:me.t("menu.solarPanel.Exact",s)},ae.EXACT),Object(pf.jsx)(u,{value:ae.APPROXIMATE,children:me.t("menu.solarPanel.Approximate",s)},ae.APPROXIMATE)]})]},"solar-panel-discretization"),(!n||n===ae.APPROXIMATE)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.EnergyGridCellSize",s)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",s)})]},"solar-panel-simulation-grid-cell-size"),!Ww.hasMovingParts(t)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.solarPanel.SolarPanelSimulationNoAnimation",s)+":"}),Object(pf.jsx)(ib.a,{checked:c,onChange:function(t){e((function(e){e.world.noAnimationForSolarPanelSimulation=t}))}})]},"solar-panel-simulation-no-animation")]})},"solar-panel-energy-analysis-options")},wb=function(){var e=Xw(si),t=Xw.getState().elements,l=Xw(Vi),a=Xw(i.sutTimesPerHour),o=Xw(i.sutDaysPerYear),r=Xw(i.sutGridCellSize),n=Xw(i.noAnimationForSolarUpdraftTowerSimulation),c={lng:l},s=tb.a.SubMenu,d=yb.a.Option;return Object(pf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.sutTimesPerHour=t}))},children:[Object(pf.jsx)(d,{value:1,children:"1"},1),Object(pf.jsx)(d,{value:2,children:"2"},2),Object(pf.jsx)(d,{value:3,children:"3"},3),Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12),Object(pf.jsx)(d,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},"sut-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.sutDaysPerYear=t})),Af.setState((function(e){e.yearlyUpdraftTowerYield=[]}))},children:[Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},"sut-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},"sut-simulation-grid-cell-size"),!Ww.hasMovingParts(t)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"320px"},children:me.t("menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation",c)+":"}),Object(pf.jsx)(ib.a,{checked:n,onChange:function(t){e((function(e){e.world.noAnimationForSolarUpdraftTowerSimulation=t}))}})]},"solar-updraft-tower-simulation-no-animation")]})},"sut-analysis-options")},xb=function(){var e=Xw(si),t=Xw(Vi),l=Xw(i.timesPerHour),a=Xw(i.daysPerYear),o=Xw(i.solarRadiationHeatmapGridCellSize),r={lng:t},n=tb.a.SubMenu,c=yb.a.Option;return Object(pf.jsx)(n,{title:me.t("menu.building.EnergyAnalysisOptions",r),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",r)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==l&&void 0!==l?l:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(pf.jsx)(c,{value:1,children:"1"},1),Object(pf.jsx)(c,{value:2,children:"2"},2),Object(pf.jsx)(c,{value:3,children:"3"},3),Object(pf.jsx)(c,{value:4,children:"4"},4),Object(pf.jsx)(c,{value:6,children:"6"},6),Object(pf.jsx)(c,{value:12,children:"12"},12),Object(pf.jsx)(c,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",r)})]},"building-energy-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.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(pf.jsx)(c,{value:4,children:"4"},4),Object(pf.jsx)(c,{value:6,children:"6"},6),Object(pf.jsx)(c,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",r)})]},"building-energy-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.building.EnergyGridCellSize",r)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",r)})]},"building-energy-simulation-grid-cell-size")]})},"building-energy-analysis-options")},vb=l(421),bb=l(422),Ab=l(423),Tb=l(424),Pb=l(425),Sb=l(426),Hb=l(427),jb=l(428),zb=l(429),Rb=l(430),Db=l(431),Wb=l(432),Mb=l(433),Ib=l(434),Cb=l(435),Fb=l(436),kb=l(437),Ob=l(438),Yb=l(439),Lb=l(440),Nb=l(441),Ub=l(442),Eb=l(443),Vb=l(444),Jb=l(445),Gb=l(446),Xb=l(447),Bb=l(448),Kb=l(449),qb=l(450),Qb=l(451),Zb=l(452),_b=l(453),$b=l(454),eA=l(455),tA=l(456),lA=l(457),aA=l(458),oA=l(459),iA=l(460),rA=l(461),nA=l(462),cA=l(463),sA=l(464),dA=l(465),uA=l(466),fA=l(467),hA=l(468),pA=l(469),yA=l(470),gA=l(471),mA=l(472),wA=l(473),xA=l(474),vA=l(475),bA=l(476),AA=l(477),TA=l(478),PA=l(479),SA=l(480),HA=l(481),jA=l(482),zA=l(483),RA=l(484),DA=l(485),WA=l(486),MA=l(487),IA=l(488),CA=l(489),FA=l(490),kA=l(491),OA=l(492),YA=l(493),LA=l(494),NA=l(495),UA=l(496),EA=l(497),VA=l(498),JA=l(499),GA=l(500),XA=l(501),BA=l(502),KA=l(503),qA=l(504),QA=l(505),ZA=l(506),_A=l(507),$A=l(508),eT=l(509),tT=l(510),lT=l(511),aT=l(512),oT=l(513),iT=l(514),rT=l(515),nT=l(516),cT=l(517),sT=l(518),dT=l(519),uT=l(520),fT=l(521),hT=l(522),pT=l(523),yT=l(524),gT=l(525),mT=l(526),wT=l(527),xT=l(528),vT=l(529),bT=l(530),AT=l(531),TT=l(532),PT=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"}(nv||(nv={}));var ST,HT,jT,zT=function(e,t,l){if(0===t(V.Foundation))return{status:nv.NO_BUILDING};var a,o=!1,i=!1,r=void 0,n=Object(h.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=Ww.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:nv.AT_LEAST_ONE_BAD_NO_GOOD,buildingCompletion:r}:i&&o?{status:nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD}:{status:nv.OK}},RT=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))},DT=function(e,t,l,a){return t<0&&e.low>=l-a||t>0&&e.high<=l+a?0:t},WT=function(e,t,l,a,o,i){if(l===U.Sinusoidal)return.5*(e+t)-.5*(e-t)*Math.cos(Ay*(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)},MT=function(e,t,l){var a,o,i,r=e.getFullYear(),n=e.getMonth(),c=e.getDate(),s=Ww.daysOfMonth(n,r)/2;if(c11&&(o=0),i=(c-s)/(s+Ww.daysOfMonth(o,r)/2)}return{low:t[a]+(t[o]-t[a])*i,high:l[a]+(l[o]-l[a])*i}},IT=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(Ty/(2*o));return e>0?n-h*Math.exp(-p)*Math.cos(Ty*(t-30)-p):n-h*Math.exp(-p)*Math.cos(Math.PI+Ty*(t-30)-p)}(e,t,a,o,n,c)-Math.exp(-c*Math.sqrt(Ay/(2*n)))*r*Math.cos(Ay*(l-(i-720)-120))},CT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYFzg7lwVNoAAABpJJREFUWIWtV21sU9cZfs69vv5KHAdj4+XLJAKGi8pgi1IJUIJokWNA0G1CVTa1g1E2IiHG5wgpSJaqddI0gaam0BA0sR8U2mraj0xNCZB0a2EJCYkDjkNHK1U0iRKUYDv+ur6fZz+CjW2cNB59fh2d8973ec57znnOuQTfM44cOVKuStJPALgEQfjy/ba29+aLJ/MNHj1w4AUQUiOo6v33Wlr6QZ4NP3z48DIqCOtERakDpRtUVXVyHMeAUoAQSLK8o/XChX/mJcDj8ZimJyc/UlXVpdfrWVEUUepw2E6ePDnddPDg0oSi1MiStElR1Q2gdJVOp+MAQJZlyLKMSCSCxv37ocgy/trWFlhaVrbmnTNnxnJxaXJ1WiwWXWhqaouoqojH4yCEYPzbb99t3Lu3KhyPr+U4Tq/RaEBkGbKiIJFIpL6dmZnB9ldfRW1dHQDg/siI5YvPP78CoDYXF5vd0dzcvGR6etotCMIOSimT7NdqNKsJw5SrqqpJzlRV1aelJASRcBgvrVuH3+zbl+pf6XTC7/M5KioqdL7h4a55Bezbs+d3VFH+IUvSLxRZZtLHFEXJIEwHIQTRaBRVy5bhyLFj0GieFlan06GsvBwDfX21NdXVfQNe79c5BZw4caJY4Pl2hhCzJEk5ieYiT/A8zMXFON7cDLPZ/EyM1WYDx3G4099fv93l+uCL3t5Iciw1y9D09CGDXl8k5kEOAJIkgWFZHDh0CDabbc4499atWL9hg/WbsbHL6f0sAHg8Hls8Frssy7KeUrpgclVVwfM8Gvfvx5q1a78z/oez+6GyqrKSu+fzdQNPKhCYmjqq12rNc63xXIhEInitoQHr1q9fULzZbMYbu3fDqNef3Lt7twsAWI/HY4rMzHwoK4oun9nH43G4t2zBaw0NeYm22WxQVBUjfr97y7ZtFzWPxsePmwoLTdFYLGUkhJBZhyIEJM39km1JklBSWorajRsRDodRVFS0YAH+4WH8+7PPYLfbbaHHj/+sYVlWpECvJEnLrVartchshiiKs0eOUkiyDKqqoMk2pbNtScIf3n4blZWVOOXxLFhANBLB2Pj4N1UOx++1BsN4auCn27dfutrRQdOhqiqVJImKokgFQaCxWIxGo1EaiURoMBikVzs66NGDB2k+uNPfTxt27hxM8qZbMZO9CQkhGaai1WozxhdZLCBMhl8BACilSPA8+EQCsWgUi61WGI3G1BjLMCn/SRdA9Ho9Hj58iE/a21FaVoYXVq3CSqcTPM9Do9GA47gMIlmWc5Z5xO/HuZYWAEA4HMaxpqanx/TJLZlLADiOw0wohOvXroGqKja98gpWOp34+MoVDA4MoNzhQHFxMTa9/DKWr1iRkxwAeJ5HIBBAQUHB7MzSCLPPWYYASilYlkVhYSEAQK/XAwAEQcDk5CRCoRCCwSDsdvu8AhiGAcdxYFkWTPYSUZrxBsh5HedKqNVqYTAYIMvyM3shH6hZXpMhjxACWZYRj8fnvPmeF0l/ySlAFEX8oKQE1TU1IISA53kAs0vzfYECcy9BIpGA3W7HW6dOYWxsDLFYLPVRNBoFwzDPX5n5TgHLPn2flJeXp9o/37kTSysrcdfrxZDXC1EUn09EGlICWJY1Jp6UPBtWqxX1bjfq3W6MjY5mmFO+IAwDAqR2cSqTZfHinu6urh2PAwFsdrngcDhyJiivqMiLkFKacsFbN2/iX11dMBiNqRdyquaDXu/NH1dXX/2v32/t7+tzBgMB2JYsgclkmjP56Ogovrx/H676+oz+iYkJ9Pb0zHoBw8BYUIDrnZ34pL39UTAUeme509nU1dWVyKgAALS2tt4G8LN9b7658dqnn751u7fXVVtXh02bN8/73MoGx3EpUyswGtHZ0RFUKT1rKy199/Tp01Ppsc88ywFgwOt9eM/vv7Rm9erbPp/PMXjnzlI+HkdJSQn0BsN3VuDe0BC+evAArEYTpcBZY1HR661tbe09PT3xbK6cApIYHBr62uf3/231iy/67nq9VXeHhsoEQUBpaSm0Oh0mJibgHx6Gy+0GAHz14AE+unwZ3TduSDqdrs1kNO4609LyYW/aKzgb8/4bZmPPrl2/FBKJpgqH40dbt22DrCi43tmJ3zY2ovvGDfzn1i1VEMVL1kWL/vSXc+dGFpIzLwEA0N3dzV66ePHXKnB8scWyIumY4ZmZvxeZTH88e+GCN598eQtIwuPxsIFHj37FctxLvCi+f/78+Xv/T57/AZ0qJoUasIdnAAAAAElFTkSuQmCC",FT="data:image/png;base64,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",kT="data:image/png;base64,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",OT="data:image/png;base64,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",YT="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",LT="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",NT="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",UT="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=",ET="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",VT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA45JREFUeNq81z1oFGkcx/Hv8zIz7tutOFlzd8REK1FJ4REECxUtRLRIuQTERhDBxkotDKuFBtu8EHE8sRKEJCvxSCRoY5HWQsHGUo1YKHrxBRb3b/HcZrO4u5nZhBt4YIedmd/nefvPLoVCgSSH1hprLcZ4GJO6DuYOoOLea4zBWksQBIRhCJ0AtLaAKQ0PI5OTCBDFQWwIQCkN6NKFC4iIa+Pj8RAbAgDVEJ4EsRGApuFxEesFlC5ebB0eB7EeQKzwtRCdAhKFr0ZoTQTY9QBKw8PJw2vt1q0VhOkEULp0qX3A/fvIuXPIq1etrxkbQ5RyiCSAX8KXllzRmZxEpqaQN28QYxBAjh1rD60jtIkDaDrnxSJy6BCyd68LPXsWOXoUCQLk2rW1p8MhVATGtAM0HfaJCWT7duT5c6S/3wEAuXEDefky/ppwCB0p5ZlmgJZzPj2NHD+O7N5dD1cK2bIF+fYt2cIcHUWUMpG1genqCiEMC2suuA8fkIEBF+z7yOCgw5w/j1SryXdHDbF5c5cll+u6fvly+xtOnqz3fMcON/QDA8jXr51v0Zs3kXw+f0d7nv2ju7t9JXrxAnbtgsFBeP0apqfhzBlIpej42LYNlKr8Tk9Pn6eUjkZHW2v7+5H9+5F375BsFjl8GLl3D3n4sLPeP3iApNPM+X4mT19fL1p7RinbFPHjhxv2ffvc+ciIm4qnTx1gaqp+baUSLzyTYQ7IZTIZ6O3txfM8jAmMUioaG2u84e1bV3BOn3bnBw4gYegWpggyO+sQp04he/a4HdMqvFyuhwM0AILAB4xRSjcgnjxxPV5YQJ49c5+vXKl///kzcuJEfZGC2x3tel5bBw0A3/cxxqCUNUqxgrh61T10aQk5eBBJp5GPH+sFKpdrDK/ViMVF5Pv31uE1gMnn8ywvL6OUQkTQWkm1Wp179Ig/e3r4a+dOd/HQECwuQrEIR47A48cwMgJBAN3dsHUrFAquhSEsLIC18P49DA0x/+ULReDf1QDf938dAWtXXt9Ga6K7d5vP56dProeVSvMmgszMNO952ylYBQCwWhNNTCTfarOzSC7HPPBbq1oQB8B/P6ui8fH44eUykkoxD2TbFaO4gESIuOFJAbEQ5TKyaVO88E4AbREuXMUO7xTQFDEzUwvX2SQvpE4BK4jbt937IJXS82CyWmv+LwCA0lr/nU77/yjlZ92/5uSAnwMAiEe8AH0apNkAAAAASUVORK5CYII=",JT="data:image/png;base64,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",GT=l(563),XT=l(802),BT=l(803),KT=l(32),qT=l.n(KT),QT=l(534),ZT=l.n(QT),_T=yb.a.Option,$T=function(e){var t,l,a,o=e.setDialogVisible,i=Xw(si),n=Xw(Gi),c=Xw(Vi),s=Object(r.useState)(Xw.getState().modelType),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(null!==(t=Xw.getState().modelAuthor)&&void 0!==t?t:ZT()()),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(null!==(l=null!==(a=Xw.getState().modelLabel)&&void 0!==a?a:Xw.getState().cloudFile)&&void 0!==l?l:null),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Xw.getState().modelDescription),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],D=j[1],W=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(null),k=Object(r.useRef)(null),O=GT.a.TextArea,Y={lng:c};Object(r.useEffect)((function(){var e;null===(e=k.current)||void 0===e||e.focus()}),[]);return Object(pf.jsxs)(lb.a,{width:560,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){o(!1)},children:me.t("word.Cancel",Y)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:k,onClick:function(){bf.setState((function(e){e.publishOnModelsMapFlag=!0})),i((function(e){e.modelType=f,e.modelAuthor=g,e.modelLabel=v,e.modelDescription=P})),bf.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(pf.jsx)(qT.a,{disabled:!z,bounds:I,onStart:function(e,t){return function(e,t){if(F.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=F.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(pf.jsx)("div",{ref:F,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:me.t("shared.ModelType",Y)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:f,onChange:function(e){h(e)},children:[Object(pf.jsxs)(_T,{value:R.UNKNOWN,children:[Object(pf.jsx)("img",{alt:"Building",width:24,src:JT,style:{marginRight:"8px"}}),me.t("word.Unknown",Y)]},R.UNKNOWN),Object(pf.jsxs)(_T,{value:R.UNDER_CONSTRUCTION,children:[Object(pf.jsx)("img",{alt:"Building",width:24,src:VT,style:{marginRight:"8px"}}),me.t("word.UnderConstruction",Y)]},R.UNDER_CONSTRUCTION),Object(pf.jsxs)(_T,{value:R.RESIDENTIAL_BUILDING,children:[Object(pf.jsx)("img",{alt:"Residential Building",width:24,src:CT,style:{marginRight:"8px"}}),me.t("word.ResidentialBuilding",Y)]},R.RESIDENTIAL_BUILDING),Object(pf.jsxs)(_T,{value:R.COMMERCIAL_BUILDING,children:[Object(pf.jsx)("img",{alt:"Commercial Building",width:24,src:FT,style:{marginRight:"8px"}}),me.t("word.CommercialBuilding",Y)]},R.COMMERCIAL_BUILDING),Object(pf.jsxs)(_T,{value:R.SCHOOL_BUILDING,children:[Object(pf.jsx)("img",{alt:"School Building",width:24,src:kT,style:{marginRight:"8px"}}),me.t("word.SchoolBuilding",Y)]},R.SCHOOL_BUILDING),Object(pf.jsxs)(_T,{value:R.TOURIST_ATTRACTION,children:[Object(pf.jsx)("img",{alt:"Tourist Attraction",width:24,src:OT,style:{marginRight:"8px"}}),me.t("word.TouristAttraction",Y)]},R.TOURIST_ATTRACTION),Object(pf.jsxs)(_T,{value:R.PHOTOVOLTAIC,children:[Object(pf.jsx)("img",{alt:"Photovoltaic",width:24,src:YT,style:{marginRight:"8px"}}),me.t("word.Photovoltaic",Y)]},R.PHOTOVOLTAIC),Object(pf.jsxs)(_T,{value:R.PARABOLIC_DISH,children:[Object(pf.jsx)("img",{alt:"Parabolic Dish",width:24,src:LT,style:{marginRight:"8px"}}),me.t("shared.ParabolicDishElement",Y)]},R.PARABOLIC_DISH),Object(pf.jsxs)(_T,{value:R.PARABOLIC_TROUGH,children:[Object(pf.jsx)("img",{alt:"Parabolic Trough",width:24,src:NT,style:{marginRight:"8px"}}),me.t("shared.ParabolicTroughElement",Y)]},R.PARABOLIC_TROUGH),Object(pf.jsxs)(_T,{value:R.FRESNEL_REFLECTOR,children:[Object(pf.jsx)("img",{alt:"Fresnel Reflector",width:24,src:UT,style:{marginRight:"8px"}}),me.t("shared.FresnelReflectorElement",Y)]},R.FRESNEL_REFLECTOR),Object(pf.jsxs)(_T,{value:R.SOLAR_POWER_TOWER,children:[Object(pf.jsx)("img",{alt:"Heliostat",width:24,src:ET,style:{marginRight:"8px"}}),me.t("shared.HeliostatElement",Y)]},R.SOLAR_POWER_TOWER)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Publisher",Y),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:30,style:{width:"100%"},value:null!==g&&void 0!==g?g:"",onChange:function(e){m(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Label",Y),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:50,style:{width:"100%"},value:null!==v&&void 0!==v?v:"",onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){b(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",Y),":",Object(pf.jsx)("br",{}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",Y),": 200)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(O,{rows:5,maxLength:200,style:{width:"100%"},value:null!==P&&void 0!==P?P:"",onChange:function(e){S(e.target.value)}})})]})]})},eP=n.a.memo($T),tP=yb.a.Option,lP=function(e){var t,l=e.saveAs,a=e.setDialogVisible,o=Xw(si),i=Xw(Gi),n=Xw(Vi),c=Object(r.useState)(null!==(t=Xw.getState().projectInfo.type)&&void 0!==t?t:W.SOLAR_PANEL_ARRAY),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(Xw.getState().projectInfo.title),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(Xw.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}),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useRef)(null),D=GT.a.TextArea,M={lng:n};return Object(pf.jsxs)(lb.a,{width:560,visible:!0,title:Object(pf.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",M)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",M)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.setState((function(e){l?e.saveProjectFlag=!0:e.createProjectFlag=!0})),bf.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",M)},"OK")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!T,bounds:j,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(pf.jsx)("div",{ref:R,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:me.t("projectPanel.ProjectType",M)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(yb.a,{disabled:l,style:{width:"100%"},value:d,onChange:function(e){f(e)},children:Object(pf.jsx)(tP,{value:W.SOLAR_PANEL_ARRAY,children:me.t("projectPanel.SolarPanelArray",M)},W.SOLAR_PANEL_ARRAY)})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Title",M),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:50,style:{width:"100%"},value:null!==y&&void 0!==y?y:"",onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){g(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",M),":",Object(pf.jsx)("br",{}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",M),": 200)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(D,{rows:5,maxLength:200,style:{width:"100%"},value:null!==x&&void 0!==x?x:"",onChange:function(e){v(e.target.value)}})})]})]})},aP=n.a.memo(lP),oP=l(34),iP=(l(336),l(337),function(){var e=Object(Nh.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:Xw.getState().language},e.next=3,oP.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)}}()),rP=function(e,t,l){var a={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:oP.a.firestore.FieldValue.arrayUnion(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},nP=function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))},cP=function(e,t,l){var a={timestamp:Date.now(),title:t,thumbnail:l};switch(e){case W.SOLAR_PANEL_ARRAY:var o=Xw.getState().world.latitude,i=Ww.countAllSolarPanels(),r=Ww.countAllSolarPanelDailyYields(),n=Ww.countAllSolarPanelYearlyYields(),c=Xw.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),Xw.getState().solarPanelArrayLayoutParams);break;case W.SOLAR_PANEL_TILT_ANGLE:}return a},sP=function(e,t){if(!t)return null;var l,a=[],o=Object(h.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value,r=Object(d.a)({},i);r.title=dP(e,i.title),r.timestamp=Date.now(),a.push(r)}}catch(n){o.e(n)}finally{o.f()}return a},dP=function(e,t){var l=t.lastIndexOf(" ");return e+t.substring(l)},uP=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()},fP=function(e,t,l,a){var o={lng:Xw.getState().language};oP.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&&oP.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)}))},hP=function(e,t,l,a,o){var i={lng:Xw.getState().language};return Xw.getState().undoManager.clear(),bf.setState((function(e){e.waiting=!0})),oP.a.firestore().collection("users").doc(e).collection(l?"designs":"files").doc(t).get().then((function(l){var r=l.data();if(r?Xw.getState().importContent(r,t):(Kh(me.t("message.CloudFileNotFound",i)+": "+t),Xw.getState().set((function(e){e.cloudFile=void 0})),bf.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),bf.setState((function(e){e.waiting=!1}))}))},pP=tb.a.SubMenu,yP={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},gP=Tv.a.div(ST||(ST=Object(Av.a)(["\n width: 100px;\n"]))),mP=Tv.a.img(HT||(HT=Object(Av.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"]))),wP=Tv.a.div(jT||(jT=Object(Av.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"]))),xP=function(e){var t=e.viewOnly,l=e.set2DView,a=e.resetView,n=e.zoomView,c=e.setNavigationView,s=e.canvas,p=Xw(si),y=bf(hf),g=Xw(ls),m=Xw(Bc),w=Xw(Kc),x=Xw(Hr),v=Xw(us),b=Xw(ss),A=Xw(tn),T=Xw(ds),P=Xw(is),S=Xw(Sr),H=bf(Ki),j=Xw.getState().loggable,z=Xw.getState().language,R=Xw.getState().floatingWindowOpacity,W=Xw.getState().undoManager,M=Xw(i.timesPerHour),I=Xw(i.solarPanelVisibilityGridCellSize),C=Xw(i.solarRadiationHeatmapGridCellSize),F=Xw(o.solarRadiationHeatmapMaxValue),k=Xw.getState().viewState.navigationView,O=Xw.getState().viewState.orthographic,Y=Xw.getState().viewState.autoRotate,L=Xw.getState().viewState.showSiteInfoPanel,N=Xw.getState().viewState.showDesignInfoPanel,U=Xw.getState().viewState.showInstructionPanel,J=Xw.getState().viewState.showMapPanel,X=Xw.getState().viewState.showWeatherPanel,B=Xw.getState().viewState.showDiurnalTemperaturePanel,K=bf.getState().showEconomicsPanel,q=bf.getState().showNavigationPanel,Q=Xw.getState().viewState.showStickyNotePanel,Z=Xw.getState().viewState.showHeliodonPanel,_=Xw.getState().viewState.shadowEnabled,$=Xw.getState().viewState.solarPanelShininess,ee=bf.getState().changed,te=Xw.getState().cloudFile,le=Xw.getState().user,ae=Xw.getState().viewState.axes,oe=Xw.getState().elementsToPaste,ie=bf.getState().runDynamicSimulation,re=bf.getState().runStaticSimulation,ne=Xw(i.noAnimationForHeatmapSimulation),ce=Xw(i.noAnimationForSensorDataCollection),se=Xw(o.solarRadiationHeatmapReflectionOnly),de=Xw.getState().elements,ue=Xw.getState().viewState.cameraPosition,fe=Xw.getState().viewState.panCenter,he=Xw.getState().selectedElement,pe=Xw.getState().projectInfo,ye=Xw.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],He=Object(r.useState)(!1),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useState)(!1),We=Object(u.a)(De,2),Me=We[0],Ie=We[1],Ce=Object(r.useState)(!1),Fe=Object(u.a)(Ce,2),ke=Fe[0],Oe=Fe[1],Ye=Object(r.useMemo)((function(){return{lng:z}}),[z]),Le=Object(r.useMemo)((function(){return Ww.isMac()}),[]),Ne=Object(r.useMemo)((function(){var e=Ww.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=vb;break;case"insolation_and_climate":t=bb;break;case"solar_radiation_to_box":t=Ab;break;case"sun_beam_at_center":t=Tb;break;case"thermal_vs_building_envelope":t=PT;break;case"effect_house_size":t=pT;break;case"effect_house_orientation":t=yT;break;case"effect_wall_roof_insulation":t=gT;break;case"effect_roof_color":t=mT;break;case"effect_eaves_overhang_length":t=wT;break;case"effect_window_shgc":t=xT;break;case"effect_thermostat_setpoint":t=vT;break;case"effect_solar_panels":t=bT;break;case"effect_ground_temperature":t=AT;break;case"effect_trees":t=TT;break;case"office_building_01":t=uA;break;case"hotel_01":t=fA;break;case"spanish_style_hotel":t=hA;break;case"apartment_building_01":t=pA;break;case"white_house":t=sA;break;case"bilim_mersin_turkiye":t=dA;break;case"south_burlington_high_school":t=yA;break;case"mescalero_apache_school":t=gA;break;case"heatmap_01":t=mA;break;case"vegetative_buffer_01":t=HA;break;case"solar_canopy_form_factors":t=CA;break;case"solar_canopy_over_bleachers":t=FA;break;case"solar_bus_stop":t=kA;break;case"solar_facade_tesla":t=LA;break;case"solar_canopy_over_garage":t=YA;break;case"bipv_01":t=OA;break;case"floatovoltaics":t=NA;break;case"agrivoltaics":t=UA;break;case"effect_tilt_angle_solar_panel":t=jA;break;case"effect_azimuth_solar_panel":t=zA;break;case"effect_azimuth_parabolic_trough":t=RA;break;case"effect_latus_rectum_parabolic_trough":t=DA;break;case"parabolic_dish_focus_sunlight":t=GA;break;case"effect_orientation_solar_panel":t=WA;break;case"solar_panel_types":t=Pb;break;case"vertical_bifacial_solar_panels":t=Sb;break;case"compare_monofacial_bifacial_solar_panels":t=Hb;break;case"why_solar_array":t=MA;break;case"solar_panel_array_auto_layout":t=IA;break;case"inter_row_spacing":t=EA;break;case"rooftop_solar_panels":t=jb;break;case"solar_panels_over_canal":t=Ib;break;case"solar_noise_barrier":t=Mb;break;case"rainbow_swash_solar_farm":t=zb;break;case"mickey_mouse_solar_farm":t=Rb;break;case"solar_farm_hsat_array":t=Db;break;case"solar_farm_aadat_array":t=Wb;break;case"solar_trackers":t=Cb;break;case"nevada_solar_one_parabolic_troughs":t=JA;break;case"tooele_parabolic_dish_array":t=XA;break;case"ps10_solar_power_tower":t=VA;break;case"linear_fresnel_reflectors":t=BA;break;case"linear_fresnel_reflectors_two_absorbers":t=KA;break;case"effect_absorber_pipe_height":t=qA;break;case"effect_azimuth_fresnel_reflector":t=QA;break;case"cosine_efficiency_heliostats":t=ZA;break;case"shadowing_blocking_heliostats":t=_A;break;case"effect_solar_power_tower_height":t=$A;break;case"solar_power_tower":t=eT;break;case"solar_updraft_tower":t=rT;break;case"solar_updraft_tower_city":t=nT;break;case"cape_cod_with_shed_dormer":t=kb;break;case"mansard_roof_with_dormers":t=Ob;break;case"t_shaped_house":t=Yb;break;case"all_roof_types":t=Fb;break;case"a_frame_house":t=$b;break;case"half_timbered_house":t=eA;break;case"dutch_gable_roof":t=_b;break;case"combination_roof_vs_bonnet_roof":t=tA;break;case"butterfly_roof_house":t=lA;break;case"gable_roof_vs_hip_roof":t=aA;break;case"gable_and_valley_roof":t=oA;break;case"clerestory_roof":t=iA;break;case"monitor_roof":t=rA;break;case"colonial_vs_saltbox":t=nA;break;case"gambrel_roof_vs_mansard_roof":t=cA;break;case"colonial_house":t=Qb;break;case"dutch_colonial_house":t=Zb;break;case"cape_cod_with_garage":t=Lb;break;case"greenhouse":t=wA;break;case"solarium":t=Gb;break;case"pavilion":t=xA;break;case"octagonal_pagoda":t=vA;break;case"ocean_front":t=bA;break;case"mosque_01":t=Xb;break;case"church_01":t=Bb;break;case"cathedral_01":t=Kb;break;case"cathedral_02":t=qb;break;case"adobe_taos_house":t=Nb;break;case"egyptian_pyramids":t=AA;break;case"mayan_pyramid":t=TA;break;case"si_o_se_pol":t=PA;break;case"stacked_cuboids":t=SA;break;case"barn_house":t=Vb;break;case"ranch_house":t=Ub;break;case"bonnet_house":t=Eb;break;case"modern_house_01":t=Jb;break;case"solar_radiation_predicted_vs_measured":t=tT;break;case"bestest_case_600":t=lT;break;case"bestest_case_610":t=aT;break;case"bestest_case_620":t=oT;break;case"bestest_case_630":t=iT;break;case"tucson_sundt_station":t=cT;break;case"ai_tilt_angle_one_row":t=sT;break;case"ai_tilt_angles_multiple_rows":t=dT;break;case"ai_solar_farm_design":t=uT;break;case"ai_solar_farm_design_block":t=fT;break;case"ai_fitchburg_solar_farm":t=hT}return t}(e.key);l&&(bf.setState((function(e){e.openModelsMap=!1})),!t&&ee?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",Ye),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){return Je(l)},onCancel:function(){bf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)},okText:me.t("word.Yes",Ye),cancelText:me.t("word.No",Ye)}):(bf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)),j&&p((function(t){t.actionInfo={name:"Open Example: "+e.key,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Ee=function(e){p((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,l){var a="QWecNcxhyvP6j6sBN11hBsfZDau1";e&&(iP(a,e,Ee).then((function(){hP(a,e+" "+l,!0,!0,t).then((function(){}))})),bf.setState((function(e){e.openModelsMap=!1})),j&&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})),bf.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=Xw.getState().countAllElementsByType(),Ze=Object(pf.jsxs)(tb.a,{triggerSubMenuAction:"click",children:[!H&&Object(pf.jsxs)(pP,{title:me.t("menu.fileSubMenu",Ye),children:[!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){W.clear(),p((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,window.history.pushState({},document.title,Ge),j&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.CreateNewFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+F)"]})]},"create-new-file"),!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){W.clear(),p((function(e){e.openLocalFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.cloudFile=void 0,window.history.pushState({},document.title,Ge),j&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.OpenLocalFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+O)"]}),"..."]},"open-local-file"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.saveLocalFileDialogVisible=!0})),j&&p((function(e){e.actionInfo={name:"Save as Local File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveAsLocalFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+S)"]}),"..."]},"save-local-file"),le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),j&&p((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.OpenCloudFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+O)"]}),"..."]},"open-cloud-file"),le.uid&&te&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.getState().setSaveCloudFileFlag(!0),j&&p((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveCloudFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+S)"]})]},"save-cloud-file"),le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){p((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0,j&&(e.actionInfo={name:"Save as Cloud File",timestamp:(new Date).getTime()})}))},children:[me.t("menu.file.SaveAsCloudFile",Ye),"..."]},"save-as-cloud-file"),!t&&Object(pf.jsxs)(tb.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(pf.jsx)(tb.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")),j&&p((function(e){e.actionInfo={name:"Take Screenshot",timestamp:(new Date).getTime()}})),bf.setState((function(e){e.openModelsMap=!1})))},children:me.t("menu.file.TakeScreenshot",Ye)},"screenshot")]},"file"),!H&&!t&&le.uid&&Object(pf.jsxs)(pP,{title:me.t("menu.projectSubMenu",Ye),children:[Object(pf.jsxs)(tb.a.Item,{onClick:function(){le.uid?(Re(!0),bf.setState((function(e){e.openModelsMap=!1})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){le.uid?(bf.setState((function(e){e.showProjectsFlag=!0,e.openModelsMap=!1})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){Ie(!0),bf.setState((function(e){e.openModelsMap=!1})),j&&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||W.hasUndo()||W.hasRedo())&&!H&&Object(pf.jsxs)(pP,{title:me.t("menu.editSubMenu",Ye),children:[he&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){he&&(m(he.id),j&&p((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:he.id,elementType:he.type}})))},children:[me.t("word.Copy",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+C)"]})]},"copy"),he&&Object(pf.jsxs)(tb.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(Ww.ifNeedListenToAutoDeletion(e[0]))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(h.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(f){o.e(f)}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(h.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(f){d.e(f)}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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+X)"]})]},"cut"),Be&&Object(pf.jsxs)(tb.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(h.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(f.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0]}))}};S(t)}}},children:[me.t("word.Paste",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+V)"]})]},"paste"),W.hasUndo()&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(W.hasUndo()){var e=W.undo();e&&Kh(me.t("menu.edit.Undo",Ye)+": "+e,qe),j&&p((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Undo",Ye)+": "+W.getLastUndoName(),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Z)"]})]},"undo"),W.hasRedo()&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(W.hasRedo()){var e=W.redo();e&&Kh(me.t("menu.edit.Redo",Ye)+": "+e,qe),j&&p((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Redo",Ye)+": "+W.getLastRedoName(),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Y)"]})]},"redo")]},"edit"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.viewSubMenu",Ye),children:[!O&&!Xe&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){var e={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(f.a)(ue),oldPanCenter:Object(f.a)(fe),undo:function(){var t=Nt.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(f.a)(e.oldCameraPosition),l.panCenter=Object(f.a)(e.oldPanCenter)})))},redo:function(){a()}};S(e),a(),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.orthographic=!1}))},style:{paddingLeft:"36px"},children:[me.t("menu.view.ResetView",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Ne,")"]})]},"reset-view"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(1.1)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomOut",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+])"]})]},"zoom-out-view"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(.9)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomIn",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+[)"]})]},"zoom-in-view"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:k,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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Q)"]})]})},"navigation-view-check-box"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:O,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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+B)"]})]})},"orthographic-check-box"),!O&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:Y,onChange:function(){if(!O){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Y,undo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=!e.checked}))},redo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=e.checked}))}};S(e),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.autoRotate=!e.viewState.autoRotate}))}},children:[me.t("menu.view.AutoRotate",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+M)"]})]})},"auto-rotate-check-box"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.settingsSubMenu",Ye),children:[!Z&&Object(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showEconomicsPanel=!0})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showNavigationPanel=!0})),j&&p((function(e){e.actionInfo={name:"Open Navigation Panel",timestamp:(new Date).getTime()}}))},children:[me.t("navigationPanel.NavigationParameters",Ye),"..."]},"navigation-panel-menu-item")]},"settings"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.view.accessoriesSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:N,onChange:function(){var e={name:"Show Design Information",timestamp:Date.now(),checked:!N,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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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"),!H&&Ke.gotSome()&&Object(pf.jsxs)(pP,{title:me.t("menu.analysisSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.physicsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:!ne||Ww.hasMovingParts(de)?function(){ie||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runDynamicSimulation",!ie),j&&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),j&&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(pf.jsx)(pP,{title:me.t("menu.physics.SolarRadiationHeatmapOptions",Ye),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapGridCellSize",Ye)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-radiation-heatmap-grid-cell-size"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapMaxValue",Ye)+":"}),Object(pf.jsx)(ob.a,{min:.5,max:50,step:.5,style:{width:60},precision:1,value:null!==F&&void 0!==F?F:5,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapMaxValue=e}))}})]},"solar-radiation-heatmap-max-value"),Ww.hasHeliostatOrFresnelReflectors(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.ReflectionHeatmap",Ye)+":"}),Object(pf.jsx)(ib.a,{checked:se,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapReflectionOnly=e}))}})]},"solar-radiation-heatmap-reflection-only"),!Ww.hasMovingParts(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapNoAnimation",Ye)+":"}),Object(pf.jsx)(ib.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(pf.jsxs)(pP,{title:me.t("menu.sensorSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){j&&p((function(e){e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(tb.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){j&&p((function(e){e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(pP,{title:me.t("word.Options",Ye),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",Ye)+":"}),Object(pf.jsx)(ob.a,{min:1,max:60,step:1,style:{width:60},precision:0,value:M,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){p((function(t){t.world.timesPerHour=e}))}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",Ye)})]},"sensor-simulation-sampling-frequency"),!Ww.hasMovingParts(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.sensor.SensorSimulationNoAnimation",Ye)+":"}),Object(pf.jsx)(ib.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(pf.jsxs)(pP,{title:me.t("menu.buildingSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){var e=zT(de,b,A);if(e.status!==nv.NO_BUILDING)if(e.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),j&&p((function(e){e.actionInfo={name:"Analyze Daily Building Energy",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(tb.a.Item,{onClick:function(){var e=zT(de,b,A);if(e.status!==nv.NO_BUILDING)if(e.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),bf.setState((function(e){e.runYearlyThermalSimulation=!0,e.simulationInProgress=!0})),j&&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(pf.jsx)(xb,{})]},"buildings"),Ke.solarPanelCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.solarPanelSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(mb,{}),Object(pf.jsx)(tb.a.Item,{onClick:function(){0!==v()?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){bf.setState((function(e){e.runSolarPanelVisibilityAnalysis=!e.runSolarPanelVisibilityAnalysis,e.simulationInProgress=!0})),j&&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(pf.jsx)(pP,{title:me.t("menu.solarPanel.VisibilityAnalysisOptions",Ye),children:Object(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{paddingRight:"10px"},children:me.t("menu.solarPanel.VisibilityGridCellSize",Ye)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.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(pf.jsxs)(pP,{title:me.t("menu.parabolicTroughSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"parabolic-trough"})]},"parabolic-trough"),Ke.parabolicDishCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.parabolicDishSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"parabolic-dish"})]},"parabolic-dish"),Ke.fresnelReflectorCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.fresnelReflectorSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"fresnel-reflector"})]},"fresnel-reflector"),Ke.heliostatCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.heliostatSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Heliostats",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Heliostats",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"heliostat"})]},"heliostat"),Ke.solarUpdraftTowerCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.solarUpdraftTowerSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(wb,{})]},"solar-updraft-tower")]},"analysis"),Object(pf.jsxs)(pP,{title:me.t("menu.tutorialsSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.solarEnergyScienceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SunAngles",Ye)},"sun_angles"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.InsolationAndClimate",Ye)},"insolation_and_climate"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SolarRadiationToBox",Ye)},"solar_radiation_to_box"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SunBeamAndHeliodon",Ye)},"sun_beam_at_center")]},"solar-energy-science"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingScienceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope",Ye)},"thermal_vs_building_envelope"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy",Ye)},"effect_house_size"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy",Ye)},"effect_house_orientation"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy",Ye)},"effect_wall_roof_insulation"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy",Ye)},"effect_roof_color"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy",Ye)},"effect_eaves_overhang_length"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy",Ye)},"effect_window_shgc"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy",Ye)},"effect_thermostat_setpoint"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy",Ye)},"effect_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy",Ye)},"effect_ground_temperature"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy",Ye)},"effect_trees")]},"building-science"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingDesignSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer",Ye)},"cape_cod_with_shed_dormer"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MansardRoofWithDormers",Ye)},"mansard_roof_with_dormers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableRoofVsHipRoof",Ye)},"gable_roof_vs_hip_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ColonialVsSaltbox",Ye)},"colonial_vs_saltbox"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GambrelRoofVsMansardRoof",Ye)},"gambrel_roof_vs_mansard_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof",Ye)},"combination_roof_vs_bonnet_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.DutchGableRoof",Ye)},"dutch_gable_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableAndValleyRoof",Ye)},"gable_and_valley_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ClerestoryRoof",Ye)},"clerestory_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MonitorRoof",Ye)},"monitor_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AFrameHouse",Ye)},"a_frame_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.HalfTimberedHouse",Ye)},"half_timbered_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AllBasicRoofTypes",Ye)},"all_roof_types")]},"building-design"),Object(pf.jsxs)(pP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel",Ye)},"effect_tilt_angle_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel",Ye)},"effect_azimuth_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelTypes",Ye)},"solar_panel_types"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels",Ye)},"vertical_bifacial_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels",Ye)},"compare_monofacial_bifacial_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarTrackers",Ye)},"solar_trackers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels",Ye)},"why_solar_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray",Ye)},"inter_row_spacing"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels",Ye)},"effect_orientation_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout",Ye)},"solar_panel_array_auto_layout"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RooftopSolarPanels",Ye)},"rooftop_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyFormFactors",Ye)},"solar_canopy_form_factors"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics",Ye)},"bipv_01")]},"photovoltaic-solar-power"),Object(pf.jsxs)(pP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish",Ye)},"parabolic_dish_focus_sunlight"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough",Ye)},"effect_azimuth_parabolic_trough"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough",Ye)},"effect_latus_rectum_parabolic_trough"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectors",Ye)},"linear_fresnel_reflectors"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors",Ye)},"effect_absorber_pipe_height"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors",Ye)},"effect_azimuth_fresnel_reflector"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers",Ye)},"linear_fresnel_reflectors_two_absorbers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.SolarPowerTower",Ye)},"solar_power_tower"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats",Ye)},"cosine_efficiency_heliostats"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats",Ye)},"shadowing_blocking_heliostats"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight",Ye)},"effect_solar_power_tower_height")]},"concentrated-solar-power"),Object(pf.jsx)(pP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower",Ye)},"solar_updraft_tower")},"other-types-of-solar-power"),Object(pf.jsxs)(pP,{title:me.t("menu.generativeDesignSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,48)},children:me.t("menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle",Ye)},"Tilt Angle"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,50)},children:me.t("menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle",Ye)},"Bifacial Tilt Angle"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces",Ye)},"Latitude"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.SimpleSolarFarmParetoFront",Ye)},"Pareto Front")]},"generative-design")]},"tutorials"),Object(pf.jsxs)(pP,{title:me.t("menu.examplesSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.solarEnergySubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.VegetativeBuffer",Ye)},"vegetative_buffer_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverBleachers",Ye)},"solar_canopy_over_bleachers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverGarage",Ye)},"solar_canopy_over_garage"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarBusStop",Ye)},"solar_bus_stop"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarFacadeTesla",Ye)},"solar_facade_tesla"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Floatovoltaics",Ye)},"floatovoltaics"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Agrivoltaics",Ye)},"agrivoltaics"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA",Ye)},"rainbow_swash_solar_farm"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL",Ye)},"mickey_mouse_solar_farm"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA",Ye)},"solar_panels_over_canal"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA",Ye)},"solar_noise_barrier"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.HSATSolarTrackersRaleighNC",Ye)},"solar_farm_hsat_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.AADATSolarTrackersLancasterCA",Ye)},"solar_farm_aadat_array")]},"photovoltaic-solar-power-examples"),Object(pf.jsxs)(pP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray",Ye)},"nevada_solar_one_parabolic_troughs"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TooeleParabolicDishArray",Ye)},"tooele_parabolic_dish_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TucsonLinearFresnelReflectors",Ye)},"tucson_sundt_station"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.PS10SolarPowerTower",Ye)},"ps10_solar_power_tower")]},"concentrated-solar-power-examples"),Object(pf.jsx)(pP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarUpdraftTowerInCity",Ye)},"solar_updraft_tower_city")},"other-types-of-solar-power-examples")]},"solar-energy"),Object(pf.jsxs)(pP,{title:me.t("menu.builtEnvironmentSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.residentialBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ColonialHouse",Ye)},"colonial_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.DutchColonialHouse",Ye)},"dutch_colonial_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.TShapedHouse",Ye)},"t_shaped_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.CapeCodHouseWithGarage",Ye)},"cape_cod_with_garage"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Solarium",Ye)},"solarium"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ButterflyRoofHouse",Ye)},"butterfly_roof_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.AdobeTaosHouse",Ye)},"adobe_taos_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.RanchHouse",Ye)},"ranch_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BonnetHouse",Ye)},"bonnet_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BarnStyleHouse",Ye)},"barn_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ModernHouse",Ye)},"modern_house_01")]},"residential_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.commercialBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.WhiteHouse",Ye)},"white_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.BilimMersinTurkiye",Ye)},"bilim_mersin_turkiye"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.SpanishStyleHotel",Ye)},"spanish_style_hotel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.ApartmentBuilding",Ye)},"apartment_building_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.OfficeBuilding",Ye)},"office_building_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.Hotel",Ye)},"hotel_01")]},"commercial_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.otherBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Greenhouse",Ye)},"greenhouse"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Church1",Ye)},"church_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral1",Ye)},"cathedral_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral2",Ye)},"cathedral_02"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Mosque1",Ye)},"mosque_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Pavilion",Ye)},"pavilion"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OctagonalPagoda",Ye)},"octagonal_pagoda"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OceanFront",Ye)},"ocean_front"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.EgyptianPyramids",Ye)},"egyptian_pyramids"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.MayanPyramid",Ye)},"mayan_pyramid"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.SiOSePol",Ye)},"si_o_se_pol"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.StackedCuboids",Ye)},"stacked_cuboids")]},"other_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingComplexesSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont",Ye)},"south_burlington_high_school"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico",Ye)},"mescalero_apache_school")]},"building_complexes"),Object(pf.jsx)(pP,{title:me.t("menu.urbanPlanningSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.urbanPlanningExamples.Heatmap1",Ye)},"heatmap_01")},"urban_planning")]},"built-environment"),Object(pf.jsxs)(pP,{title:me.t("menu.artificialIntelligenceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow",Ye)},"ai_tilt_angle_one_row"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows",Ye)},"ai_tilt_angles_multiple_rows"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign",Ye)},"ai_solar_farm_design"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock",Ye)},"ai_solar_farm_design_block"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign",Ye)},"ai_fitchburg_solar_farm")]},"artificial-intelligence"),Object(pf.jsxs)(pP,{title:me.t("menu.benchmarksSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.SolarRadiationPredictionVsMeasurement",Ye)},"solar_radiation_predicted_vs_measured"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase600",Ye)},"bestest_case_600"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase610",Ye)},"bestest_case_610"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase620",Ye)},"bestest_case_620"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase630",Ye)},"bestest_case_630")]},"benchmarks")]},"examples"),Object(pf.jsxs)(pP,{title:me.t("menu.publicSubMenu",Ye),children:[le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showModelsGallery=!0,e.leaderboardFlag=!0,e.openModelsMap=!1}))},children:[me.t("menu.ModelsGallery",Ye),"..."]},"my-models"),!H&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.openModelsMap=!0,e.showModelsGallery=!1})),j&&p((function(e){e.actionInfo={name:"Open Models Map",timestamp:(new Date).getTime()}}))},children:[me.t("menu.ModelsMap",Ye),"..."]},"models-map")]},"public"),Object(pf.jsx)(pP,{title:me.t("menu.languageSubMenu",Ye),children:Object(pf.jsxs)(rb.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=Xv.a;break;case"zh_tw":t.locale=Kv.a;break;case"es":t.locale=Qv.a;break;case"tr":t.locale=_v.a;break;case"ua":t.locale=eb.a;break;default:t.locale=xe.a}}))},children:[Object(pf.jsx)(rb.a,{style:yP,value:"en",children:E.English}),Object(pf.jsx)(rb.a,{style:yP,value:"es",children:E.Spanish}),Object(pf.jsx)(rb.a,{style:yP,value:"zh_cn",children:E.ChineseSimplified}),Object(pf.jsx)(rb.a,{style:yP,value:"zh_tw",children:E.ChineseTraditional}),Object(pf.jsx)(rb.a,{style:yP,value:"tr",children:E.Turkish}),Object(pf.jsx)(rb.a,{style:yP,value:"ua",children:E.Ukrainian})]})},"language"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){be(!0)},children:[me.t("menu.AboutUs",Ye),"..."]},"about")]});return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(nb.a,{overlay:Ze,trigger:["click"],onVisibleChange:function(e){e&&Oe(!ke)},children:Object(pf.jsxs)(gP,{children:[Object(pf.jsx)(mP,{src:cb,title:me.t("tooltip.clickToOpenMenu",Ye)}),Object(pf.jsx)(wP,{children:Object(pf.jsx)("span",{style:{fontSize:"10px",alignContent:"center",cursor:"pointer"},children:me.t("menu.mainMenu",Ye)})})]})}),ve&&Object(pf.jsx)(hb,{close:function(){return be(!1)}}),Pe&&Object(pf.jsx)(eP,{setDialogVisible:Se}),ze&&Object(pf.jsx)(aP,{saveAs:!1,setDialogVisible:Re}),Me&&Object(pf.jsx)(aP,{saveAs:!0,setDialogVisible:Ie})]})},vP=n.a.memo(xP),bP=l(541),AP=l.n(bP),TP=function(){var e={lng:Xw(Vi)};return Object(pf.jsx)(AP.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)})},PP=.7/Math.cos(Ww.toRadians(42.2845513)),SP=function(){var e,t,l=Xw(si),a=Xw(i.latitude),n=Xw(i.longitude),c=Xw(o.mapZoom),s=Xw(o.mapType),d=Object(r.useRef)(),u=Object(Ly.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=PP*Math.cos(Ww.toRadians(a))*t;return u?Object(pf.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){_y.selectNone(t),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Ground,t.contextMenuObjectType=V.Ground,t.pasteNormal=Rt})))},children:[Object(pf.jsx)("planeBufferGeometry",{args:[100,100]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",depthTest:!1,side:We.DoubleSide,map:u,opacity:1})]}):Object(pf.jsx)(pf.Fragment,{})},HP=n.a.memo(SP),jP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),r=Xw(ts),n=Xw(as),c=Xw(Kc),s=Xw(Sr),u=Ww.isMac();return Object(pf.jsxs)(tb.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(h.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(f.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0],e.updateElementOnRoofFlag=!0}))}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Paste",{lng:i}),Object(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",u?"\u2318":"Ctrl","+V)"]})]},a)},zP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),r=Xw(Bc),n=Xw(ln),c=Xw(Gi),s=Ww.isMac();return Object(pf.jsxs)(tb.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(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",s?"\u2318":"Ctrl","+C)"]})]},a)},RP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),n=Xw(Kc),c=Xw(ln),s=Xw(Sr),d=Ww.isMac(),u=Object(r.useMemo)((function(){return{lng:i}}),[i]);return Object(pf.jsxs)(tb.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(Ww.ifNeedListenToAutoDeletion(e[0]))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(h.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(f){o.e(f)}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(h.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(f){d.e(f)}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(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",d?"\u2318":"Ctrl","+X)"]})]},a)},DP=function(e){var t=e.keyName,l=Xw(Vi),a=Xw(hn),o=Xw(Sr),i=Xw((function(e){return e.elements.find((function(t){return e.selectedElementIdSet.has(t.id)}))})),r=function(e){i&&a(i.id,e)};return Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)},WP=l(45),MP=l.n(WP),IP=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}},CP=function(e){var t=Xw(Sr),l=Xw(gn);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)}}},FP=function(e,t){var l=Xw(yn),a=Xw(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)}}},kP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},OP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},YP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},LP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},NP=function(e){return Xw((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}))}))},UP=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)}]},EP=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=Xw(Ci),f=Xw(Fi),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(pf.jsx)(lb.a,{width:t,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return b(!0)},onMouseOut:function(){return b(!1)},children:[l,P&&Object(pf.jsx)("span",{style:{color:"red",fontWeight:"bold"},children:a})]}),footer:[Object(pf.jsx)(Sv.a,{onClick:o,children:me.t("word.Apply",h)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){c?c():(i(),f())},children:me.t("word.Cancel",h)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:T,children:me.t("word.OK",h)},"OK")],onCancel:i,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:A,children:e})})},children:s})},VP=l(60),JP=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(Rn),i=Xw(Zr),n=Xw(Mn),c=Xw(Sr),s=Xw(Vn),d=Xw(Ci),f=NP(V.Foundation),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e){if(f&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&e!==a.color)return!0}}catch(o){l.e(o)}finally{l.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}(e)){switch(s){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation)l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#808080")}}catch(v){r.e(v)}finally{r.f()}var g={name:"Set Color for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.a)(g.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(v){t.e(v)}finally{t.f()}},redo:function(){n(V.Foundation,g.newValue)}};c(g),n(V.Foundation,e),d(Xw.getState().applyCount+1);break;default:var m=i(f.id),w=m?m.color:f.color,x={name:"Set Color of Selected Foundation",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){o(x.changedElementId,x.oldValue)},redo:function(){o(x.changedElementId,x.newValue)}};c(x),o(f.id,e),d(Xw.getState().applyCount+1)}a((function(t){t.actionState.foundationColor=e}))}};return Object(pf.jsx)(EP,{width:600,title:me.t("word.Color",w),onApply:function(){x(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},GP=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ki),i=Xw(Zr),n=Xw(mn),c=Xw(bn),s=Xw(Tn),f=Xw(Kn),p=Xw(en),y=Xw(nn),g=Xw(Sr),m=Xw(Vn),w=Xw(si),x=Xw(Ii),v=Xw(Ci),b=Xw(Fi),A=NP(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],H=P[1],j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(new Map),F=Object(r.useRef)(!1),k=Object(r.useRef)(),O={lng:a},Y=function(e){return!function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var i=a,r=p(i.id);if(r.length>0&&!Ww.doesNewSizeContainAllChildren(i,r,e,i.ly))return!1}}}catch(c){l.e(c)}finally{l.f()}break;default:var n=p(A.id);if(n.length>0)return Ww.doesNewSizeContainAllChildren(A,n,e,A.ly)}return!0}}(e)},L=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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},N=function(e,t,l){if(e){var a,o=Object(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,D.current.set(i.id,new We.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(W.current.clear(),C.current.clear(),l.length>0){var o,i=Object(h.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 We.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);W.current.set(r.id,s),R.current.set(r.id,new We.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new We.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),M.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 We.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(h.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=W.current.get(b.id);if(A){var T=new We.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),D.current.set(b.id,new We.Vector3(T,b.cy))}break;case V.Polygon:var P=C.current.get(b.id);if(P){var S,H=[],z=Object(h.a)(P);try{for(z.s();!(S=z.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/t,O=F.y/e.ly;H.push({x:k,y:O})}}catch(J){z.e(J)}finally{z.f()}f(b.id,H),I.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(D.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var Y=Nt.getState().contentRef,U=L(null===Y||void 0===Y?void 0:Y.current,e.id);N(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,E),D.current.set(b.id,new We.Vector3(E,b.cy,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},E=function(e,t,l){if(e&&t){var a=Nt.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(h.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){if(A&&function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.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(Math.abs(i.lx-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(k.current=void 0,F.current=Y(e),F.current)k.current=e,H(l);else switch(R.current.clear(),D.current.clear(),M.current.clear(),I.current.clear(),m){case _.AllObjectsOfThisType:var a,r=new Map,n=Object(h.a)(o);try{for(n.s();!(a=n.n()).done;){var d=a.value;d.type===V.Foundation&&r.set(d.id,d.lx)}}catch(S){n.e(S)}finally{n.f()}var p,w=Object(h.a)(o);try{for(w.s();!(p=w.n()).done;){var b=p.value;b.type===V.Foundation&&U(b,e)}}catch(S){w.e(S)}finally{w.f()}var T={name:"Set Length for All Foundations",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(z.current),undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(T.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=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),w=null===(s=T.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);m&&w&&m!==w&&(E(m,w,p),J(m,p))}}catch(S){r.e(S)}finally{r.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(h.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];f(A,P)}}catch(S){v.e(S)}finally{v.f()}}},redo:function(){if(s(V.Foundation,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(h.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&&(E(c,n,i),J(c,i))}}catch(S){t.e(S)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var d,p=Object(h.a)(T.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}}};g(T),v(x+1);break;default:U(A,e);var P={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(M.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(c(A.id,P.oldSize),P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(E(n,s,i),J(n,i))}}catch(S){t.e(S)}finally{t.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var d,p=Object(h.a)(P.oldChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}},redo:function(){if(c(A.id,P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(E(s,n,i),J(s,i))}}catch(S){t.e(S)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var d,p=Object(h.a)(P.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}}};g(P),v(x+1)}}},X=function(){l(!1)},B=F.current?": "+me.t("message.NotApplicableToSelectedAction",O)+(void 0!==k.current?" ("+k.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",O),rejectedMessage:B,onApply:function(){G(S)},onClose:X,onClickCancel:function(){X(),b()},onClickOk:function(){G(S),F.current||(l(!1),v(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:S,onChange:H}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [0.1, 1000] ",me.t("word.MeterAbbreviation",O)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",O)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:m,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",O)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",O)})]})})})]})})},XP=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(nn),n=Xw(wn),c=Xw(Pn),s=Xw(Hn),f=Xw(Kn),p=Xw(en),y=Xw(Sr),g=Xw(Vn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(g){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation){var i=o,r=p(i.id);if(r.length>0&&!Ww.doesNewSizeContainAllChildren(i,r,i.lx,e))return!1}}}catch(c){l.e(c)}finally{l.f()}break;default:var n=p(b.id);if(n.length>0)return Ww.doesNewSizeContainAllChildren(b,n,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.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 We.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);D.current.set(r.id,s),z.current.set(r.id,new We.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new We.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),W.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 We.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(h.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;n(b.id,T),R.current.set(b.id,new We.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/e.lx,O=F.y/t;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}f(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(b.cz,E,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(z.current.clear(),R.current.clear(),W.current.clear(),M.current.clear(),g){case _.AllObjectsOfThisType:var r,n=new Map,d=Object(h.a)(a);try{for(d.s();!(r=d.n()).done;){var p=r.value;p.type===V.Foundation&&n.set(p.id,p.ly)}}catch(D){d.e(D)}finally{d.f()}var m,v=Object(h.a)(a);try{for(v.s();!(m=v.n()).done;){var A=m.value;A.type===V.Foundation&&N(A,e)}}catch(D){v.e(D)}finally{v.f()}var T={name:"Set Width for All Foundations",timestamp:Date.now(),oldSizes:n,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(D){t.e(D)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var r,n=Object(h.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),E(m,y))}}catch(D){n.e(D)}finally{n.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(h.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];f(A,P)}}catch(D){v.e(D)}finally{v.f()}}},redo:function(){if(s(V.Foundation,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(T.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=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);c&&d&&c!==d&&(U(d,c,r),E(d,r))}}catch(D){t.e(D)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(T.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}}};y(T),x(w+1);break;default:N(b,e);var P={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(c(b.id,P.oldSize),P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(s,d,r),E(s,r))}}catch(D){t.e(D)}finally{t.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(P.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}},redo:function(){if(c(b.id,P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(d,s,r),E(d,r))}}catch(D){t.e(D)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(h.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];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}}};y(P),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",k),rejectedMessage:X,onApply:function(){J(P)},onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},onClose:G,children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 1000] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:g,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",k)})]})})})]})})},BP=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(nn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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()}}))},H=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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},j=function(e,t,l){if(e){var a,o=Object(h.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=Nt.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 We.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new We.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,A.current.set(l.id,new We.Vector3(c.x,c.y,0)),v.current.set(l.id,xt)}},z=function(e,t){a((function(l){var a,o=Object(h.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 We.Vector3(i.cx,i.cy,i.cz)),Ww.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Nt.getState().contentRef,c=H(null===n||void 0===n?void 0:n.current,e.id);j(c,e,i)}else i.cz=r,A.current.set(i.id,new We.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},R=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef,o=H(null===a||void 0===a?void 0:a.current,t),i=H(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=H(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(h.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()}}))},W=function(e){if(p&&function(e){if(p){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(Math.abs(i.lz-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&l.set(y.id,y.lz)}}catch(M){r.e(M)}finally{r.f()}var g,m=Object(h.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;w.type===V.Foundation&&z(w,e)}}catch(M){m.e(M)}finally{m.f()}var T={name:"Set Height for All 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(){var e,t=Object(h.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];P(a,o)}}catch(M){t.e(M)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(T.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,d=Object(u.a)(i.value,2),f=d[0],p=d[1];s(f,p.x,p.y,p.z);var y=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(f),g=null===(c=T.newChildrenParentIdMap)||void 0===c?void 0:c.get(f);y&&g&&y!==g&&(R(y,g,f),D(y,f))}}catch(M){r.e(M)}finally{r.f()}}},redo:function(){var e=T.newValue;if(S(V.Foundation,e),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(h.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(M){l.e(M)}finally{l.f()}}}};n(T),S(V.Foundation,e),f(d+1);break;default:var H=i(p.id),j=H?H.lz:p.lz;z(p,e),P(p.id,e);var W={name:"Set Foundation Height",timestamp:Date.now(),oldValue:j,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(W.changedElementId,W.oldValue),W.oldChildrenPositionsMap&&W.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(W.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=W.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=W.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(M){t.e(M)}finally{t.f()}}},redo:function(){if(P(W.changedElementId,W.newValue),W.newChildrenPositionsMap&&W.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(W.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=W.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=W.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(c,n,i),D(c,i))}}catch(M){t.e(M)}finally{t.f()}}}};n(W),f(d+1)}a((function(t){t.actionState.foundationHeight=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",T),onApply:function(){W(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:10,style:{width:120},step:.1,precision:2,value:m,onChange:function(e){w(e)}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 10] ",me.t("word.MeterAbbreviation",T)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",T)})]})})})]})})},KP=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Un),n=Xw(En),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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){if(p&&function(e){if(p){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked){var i=o;if(Math.abs(-i.rotation[2]-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&l.set(y.id,-y.rotation[2])}}catch(v){r.e(v)}finally{r.f()}var g={name:"Set Azimuth for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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];i(a,0,0,-o)}}catch(v){t.e(v)}finally{t.f()}},redo:function(){n(V.Foundation,0,0,-g.newValue)}};c(g),n(V.Foundation,0,0,-e),f(d+1);break;default:var m=o(p.id),w=m?-m.rotation[2]:-p.rotation[2],x={name:"Set Foundation Azimuth",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(x.changedElementId,0,0,-x.oldValue)},redo:function(){i(x.changedElementId,0,0,-x.newValue)}};c(x),i(p.id,0,0,-e),f(d+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("word.Azimuth",x),onApply:function(){v(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Ww.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},qP="data:image/png;base64,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",QP="data:image/png;base64,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",ZP=l.p+"static/media/foundation_03_menu.1a0820a4.png",_P=l.p+"static/media/foundation_04_menu.cfdf351d.png",$P=l.p+"static/media/foundation_05_menu.7f382511.png",eS="data:image/png;base64,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",tS=l.p+"static/media/foundation_07_menu.cf056d65.png",lS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:se.NoTexture),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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(h.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){if(f&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&e!==a.textureType)return!0}}catch(i){l.e(i)}finally{l.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation)l.set(y.id,null!==(p=y.textureType)&&void 0!==p?p:se.NoTexture)}}catch(A){r.e(A)}finally{r.f()}var g={name:"Set Texture for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(A){t.e(A)}finally{t.f()}},redo:function(){b(g.newValue)}};n(g),b(e),d(s+1);break;default:var m=i(f.id),w=m?m.textureType:f.textureType,x={name:"Set Texture of Selected Foundation",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(x.changedElementId,x.oldValue)},redo:function(){v(x.changedElementId,x.newValue)}};n(x),v(f.id,e),d(s+1)}a((function(t){t.actionState.foundationTexture=e}))}};return Object(pf.jsx)(EP,{width:500,title:me.t("word.Texture",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(pf.jsxs)(x,{value:se.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:se.Texture01,children:[Object(pf.jsx)("img",{alt:se.Texture01,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture01",w)]},se.Texture01),Object(pf.jsxs)(x,{value:se.Texture02,children:[Object(pf.jsx)("img",{alt:se.Texture02,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture02",w)]},se.Texture02),Object(pf.jsxs)(x,{value:se.Texture03,children:[Object(pf.jsx)("img",{alt:se.Texture03,src:ZP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture03",w)]},se.Texture03),Object(pf.jsxs)(x,{value:se.Texture04,children:[Object(pf.jsx)("img",{alt:se.Texture04,src:_P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture04",w)]},se.Texture04),Object(pf.jsxs)(x,{value:se.Texture05,children:[Object(pf.jsx)("img",{alt:se.Texture05,src:$P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture05",w)]},se.Texture05),Object(pf.jsxs)(x,{value:se.Texture06,children:[Object(pf.jsx)("img",{alt:se.Texture06,src:eS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture06",w)]},se.Texture06),Object(pf.jsxs)(x,{value:se.Texture07,children:[Object(pf.jsx)("img",{alt:se.Texture07,src:tS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture07",w)]},se.Texture07)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},aS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberHeight||Math.abs(i.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberHeight)&&void 0!==m?m:10)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Height for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberHeight)&&void 0!==t?t:10:null!==(l=p.absorberHeight)&&void 0!==l?l:10;v(f.id,e);var P={name:"Set Absorber Height on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberHeight",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:50,style:{width:120},step:.5,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 50] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},oS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberAbsorptance||Math.abs(i.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberAbsorptance)&&void 0!==m?m:.95)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Pipe Absorptance for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberAbsorptance)&&void 0!==t?t:.95:null!==(l=p.absorberAbsorptance)&&void 0!==l?l:.95;v(f.id,e);var P={name:"Set Absorber Pipe Absorptance on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},iS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(i.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.absorberOpticalEfficiency)&&void 0!==l?l:.7;v(f.id,e);var P={name:"Set Absorber Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},rS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(i.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==m?m:.3)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.absorberThermalEfficiency)&&void 0!==l?l:.3;v(f.id,e);var P={name:"Set Absorber Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},nS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.apertureWidth||Math.abs(i.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.apertureWidth)&&void 0!==m?m:.6)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Aperture Width for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.apertureWidth)&&void 0!==t?t:.6:null!==(l=p.apertureWidth)&&void 0!==l?l:.6;v(f.id,e);var P={name:"Set Absorber Aperture Width on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:2,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, 2] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},cS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.poleNumber||i.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.poleNumber)&&void 0!==m?m:5)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Pipe Pole Number for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.poleNumber)&&void 0!==t?t:5:null!==(l=p.poleNumber)&&void 0!==l?l:5;v(f.id,e);var P={name:"Set Absorber Pipe Pole Number on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:1,max:100,style:{width:120},step:1,precision:0,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},sS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(S){a.e(S)}finally{a.f()}var m={name:"Set Solar Chimney Height for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){T(m.newValue)}};d(m),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var w,x,v=s(g.id),b=v&&v.solarUpdraftTower?null!==(w=v.solarUpdraftTower.chimneyHeight)&&void 0!==w?w:Math.max(v.lx,v.ly):null!==(x=g.solarUpdraftTower.chimneyHeight)&&void 0!==x?x:Math.max(g.lx,g.ly);A(g.id,e);var P={name:"Set Solar Chimney Height on Foundation",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(P.changedElementId,P.oldValue)},redo:function(){A(P.changedElementId,P.newValue)}};d(P),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},dS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(S){a.e(S)}finally{a.f()}var m={name:"Set Solar Chimney Radius for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){T(m.newValue)}};d(m),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var w,x,v=s(g.id),b=v&&v.solarUpdraftTower?null!==(w=v.solarUpdraftTower.chimneyRadius)&&void 0!==w?w:Math.max(1,.025*Math.min(v.lx,v.ly)):null!==(x=g.solarUpdraftTower.chimneyRadius)&&void 0!==x?x:Math.max(1,.025*Math.min(g.lx,g.ly));A(g.id,e);var P={name:"Set Solar Chimney Radius on Foundation",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(P.changedElementId,P.oldValue)},redo:function(){A(P.changedElementId,P.newValue)}};d(P),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:10,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [0.1, 10] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},uS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var n={name:"Set Solar Collector Radius for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){T(n.newValue)}};d(n),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var m,w,x=s(g.id),v=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorRadius)&&void 0!==m?m:Math.max(10,.5*Math.min(x.lx,x.ly)):null!==(w=g.solarUpdraftTower.collectorRadius)&&void 0!==w?w:Math.max(10,.5*Math.min(g.lx,g.ly));A(g.id,e);var b={name:"Set Solar Collector Radius on Foundation",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(b.changedElementId,b.oldValue)},redo:function(){A(b.changedElementId,b.newValue)}};d(b),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},fS=function(e){var t,l,a,o=e.setDialogVisible,i=Xw(si),n=(Xw(Vi),Xw(ki)),c=Xw(Zr),s=Xw(Sr),d=Xw(Vn),f=(Xw(Jn),Xw(Ii)),p=Xw(Ci),y=(Xw(Fi),NP(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(h.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(h.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){if(y&&function(e){switch(d){case _.AllObjectsOfThisType:var t,l=Object(h.a)(n);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(n);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Height for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){A(g.newValue)}};s(g),A(e),p(f+1);break;default:if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower){var m,w,x=c(y.id),v=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorHeight)&&void 0!==m?m:Math.max(3,10*x.lz):null!==(w=y.solarUpdraftTower.collectorHeight)&&void 0!==w?w:Math.max(3,10*y.lz);b(y.id,e);var T={name:"Set Solar Collector Height on Foundation",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(T.changedElementId,T.oldValue)},redo:function(){b(T.changedElementId,T.newValue)}};s(T),p(f+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",v),onApply:function(){T(w)},onClose:function(){o(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:20,style:{width:120},step:1,precision:1,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, 20] ",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",v)})]})})})]})})},hS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerHeight||Math.abs(i.solarPowerTower.towerHeight-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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(S){y.e(S)}finally{y.f()}var x={name:"Set Tower Height for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.towerHeight)&&void 0!==t?t:20:null!==(l=p.towerHeight)&&void 0!==l?l:20;v(f.id,e);var P={name:"Set Tower Height on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerHeight",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:10,max:500,style:{width:120},step:1,precision:1,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [10, 500] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},pS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerRadius||Math.abs(i.solarPowerTower.towerRadius-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.towerRadius)&&void 0!==m?m:1)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Tower Radius for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.towerRadius)&&void 0!==t?t:1:null!==(l=p.towerRadius)&&void 0!==l?l:1;v(f.id,e);var P={name:"Set Tower Radius on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerRadius",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.5,max:10,style:{width:120},step:.5,precision:1,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.5, 10] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},yS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverAbsorptance||Math.abs(i.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverAbsorptance)&&void 0!==m?m:.95)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Absorptance for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverAbsorptance)&&void 0!==t?t:.95:null!==(l=p.receiverAbsorptance)&&void 0!==l?l:.95;v(f.id,e);var P={name:"Set Receiver Absorptance on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverAbsorptance",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},gS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverOpticalEfficiency||Math.abs(i.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.receiverOpticalEfficiency)&&void 0!==l?l:.7;v(f.id,e);var P={name:"Set Receiver Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},mS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverThermalEfficiency||Math.abs(i.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverThermalEfficiency)&&void 0!==m?m:.3)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.receiverThermalEfficiency)&&void 0!==l?l:.3;v(f.id,e);var P={name:"Set Receiver Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},wS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Transmissivity for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorTransmissivity)&&void 0!==m?m:.9:null!==(w=p.solarUpdraftTower.collectorTransmissivity)&&void 0!==w?w:.9;v(p.id,e);var T={name:"Set Solar Collector Transmissivity on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},xS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Chimney Discharge Coefficient for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.dischargeCoefficient)&&void 0!==m?m:.65:null!==(w=p.solarUpdraftTower.dischargeCoefficient)&&void 0!==w?w:.65;v(p.id,e);var T={name:"Set Solar Chimney Discharge Coefficient on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.65,max:.7,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.65, 0.70]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},vS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Updraft Tower Turbine Efficiency for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.turbineEfficiency)&&void 0!==m?m:.3:null!==(w=p.solarUpdraftTower.turbineEfficiency)&&void 0!==w?w:.3;v(p.id,e);var T={name:"Set Solar Updraft Tower Turbine Efficiency on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.2,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.2, 1.0]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},bS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Emissivity for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorEmissivity)&&void 0!==m?m:.95:null!==(w=p.solarUpdraftTower.collectorEmissivity)&&void 0!==w?w:.95;v(p.id,e);var T={name:"Set Solar Collector Emissivity on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},AS=yb.a.Option,TS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(Gi),n=Xw(Vi),c=bf(Er),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=Xw(sf).geneticAlgorithmParams,P=Object(r.useRef)(T.selectionMethod),S=Object(r.useRef)(T.searchMethod),H=Object(r.useRef)(Math.min(T.objectiveFunctionType,M.YEARLY_TOTAL_OUTPUT)),j=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),k=Object(r.useRef)(null!==(l=T.crossoverRate)&&void 0!==l?l:.5),O=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 N={lng:n},U=function(){c||Kh(me.t("message.EvolutionStarted",N)),o((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=W.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=H.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=P.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=S.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=j.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=D.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=k.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=R.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=O.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=Y.current})),setTimeout((function(){bf.setState((function(e){e.runEvolution=!e.runEvolution})),o((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=W.SOLAR_PANEL_TILT_ANGLE,i&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return m(!0)},onMouseOut:function(){return m(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",N)+": ",me.t("optimizationMenu.GeneticAlgorithmSettings",N)]}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",N)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:L,onClick:function(){U(),a(!1)},children:me.t("word.Run",N)},"Run")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:A,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",N)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(AS,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",N)},M.YEARLY_TOTAL_OUTPUT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:P.current,style:{width:"100%"},value:P.current,onChange:function(e){P.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",N)},C.ROULETTE_WHEEL),Object(pf.jsx)(AS,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",N)},C.TOURNAMENT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:10,max:100,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:j.current,step:1,onChange:function(e){j.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:D.current,step:.01,onChange:function(e){D.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:R.current,step:.01,onChange:function(e){R.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",N)+" [0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:O.current,step:.001,onChange:function(e){O.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:S.current,style:{width:"100%"},value:S.current,onChange:function(e){S.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",N)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(AS,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",N)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),S.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",N)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Y.current,step:.01,onChange:function(e){Y.current=e,h(!f)}})})]})]})})},PS=yb.a.Option,SS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(Gi),s=Xw(Vi),d=bf(Er),f=Xw(sf).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),H=Object(r.useRef)(Math.min(f.objectiveFunctionType,M.YEARLY_TOTAL_OUTPUT)),j=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),k=Object(r.useRef)(null!==(a=f.cognitiveCoefficient)&&void 0!==a?a:.1),O=Object(r.useRef)(null!==(o=f.socialCoefficient)&&void 0!==o?o:.1),Y=Object(r.useRef)(f.convergenceThreshold),L=Object(r.useRef)(f.localSearchRadius),N=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=N.current)||void 0===e||e.focus()}),[]);var U={lng:s},E=function(){d||Kh(me.t("message.EvolutionStarted",U)),n((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=H.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=j.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=R.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=k.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=O.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(){bf.setState((function(e){e.runEvolution=!e.runEvolution})),n((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.SOLAR_PANEL_TILT_ANGLE,c&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){i(!1)},children:me.t("word.Cancel",U)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:N,onClick:function(){E(),i(!1)},children:me.t("word.Run",U)},"Run")],onCancel:function(){i(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:S,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,g(!y)},children:[Object(pf.jsx)(PS,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",U)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(PS,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",U)},M.YEARLY_TOTAL_OUTPUT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:O.current,step:.01,onChange:function(e){O.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:C.current,step:.01,onChange:function(e){C.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",U)+" [0.001, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:D.current,step:.001,onChange:function(e){D.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",U)+" [0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Y.current,step:.001,onChange:function(e){Y.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,g(!y)},children:[Object(pf.jsx)(PS,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",U)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(PS,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",U)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),j.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",U)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:L.current,step:.01,onChange:function(e){L.current=e,g(!y)}})})]})]})})},HS=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ki),i=Xw(ln),n=Xw(Sr),c=Xw(Vn),s=Xw(Jn),d=Xw(Ii),f=Xw(Ci),p=Xw(Fi),y=Xw(Zr),g=Xw(si),m=Xw((function(e){if(i){var t,l=Object(h.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)(Ww.toRValueInUS(v)),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useRef)(null),F={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 k=function(e,t){g((function(l){var a,o=Object(h.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()}}))},O=function(e){if(m&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(h.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(h.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];k(o,i)}}catch(r){l.e(r)}finally{l.f()}}(l.oldValues)},redo:function(){!function(e,t){var l,a=Object(h.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;k(o,t)}}catch(i){a.e(i)}finally{a.f()}}(l.oldValues,l.newValue)}};n(l),f(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(){k(s.changedElementId,s.oldValue)},redo:function(){k(s.changedElementId,s.newValue)}};n(s),k(m.id,e),f(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(){O(v),l(!1),f(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:[me.t("word.RValue",F)+" ","(",me.t("word.ThermalResistance",F),")"]}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){O(v)},children:me.t("word.Apply",F)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){Y(),p()},children:me.t("word.Cancel",F)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:L,children:me.t("word.OK",F)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!z,bounds:M,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(pf.jsx)("div",{ref:C,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",F),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",F),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisGroundFloor",F)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllGroundFloors",F)})]})})})]})})})},jS=n.a.memo((function(){var e,t,l,a,o,i,n,c,s,d,p=Xw(si),y=Xw(ki),g=Xw(Sr),m=Xw(fs),w=Xw($c),x=Xw(es),v=Xw(hn),b=Xw(un),A=Xw(rs),T=Xw(Kc),P=Xw(Ci),S=Xw(Vi),H=Xw(as),j=NP(V.Foundation),z=Object(r.useState)(!1),R=Object(u.a)(z,2),W=R[0],M=R[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useState)(!1),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],X=E[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],He=Pe[1],je=Object(r.useState)(!1),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useState)(!1),Ie=Object(u.a)(Me,2),Ce=Ie[0],Fe=Ie[1],ke=Object(r.useState)(!1),Oe=Object(u.a)(ke,2),Ye=Oe[0],Le=Oe[1],Ne=Object(r.useState)(!1),Ue=Object(u.a)(Ne,2),Ee=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],Ht=Object(r.useState)(!1),jt=Object(u.a)(Ht,2),zt=jt[0],Dt=jt[1],Wt=Object(r.useState)(!1),Mt=Object(u.a)(Wt,2),It=Mt[0],Ct=Mt[1],Ft=Object(r.useState)(!1),kt=Object(u.a)(Ft,2),Ot=kt[0],Yt=kt[1],Lt=IP(j),Nt=Lt.labelText,Ut=Lt.setLabelText,Et=CP(j),Vt=FP(j,Nt),Jt=OP(j),Gt=kP(j),Xt=YP(j),Bt=LP(j);Object(r.useEffect)((function(){var e;j&&Zt(null===(e=j.hvacSystem)||void 0===e?void 0:e.id)}),[j]);var Kt=Object(r.useState)(null===j||void 0===j||null===(e=j.hvacSystem)||void 0===e?void 0:e.id),qt=Object(u.a)(Kt,2),Qt=qt[0],Zt=qt[1];if(!j)return null;var _t=null!==(t=null===j||void 0===j?void 0:j.solarStructure)&&void 0!==t?t:G.None,$t=j?m(j.id,!0):new Ow,el=j?m(j.id,!1):new Ow,tl={lng:S},ll=!(null===j||void 0===j?void 0:j.locked),al=function(e,t){p((function(l){var a,o=Object(h.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(h.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(h.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(h.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=j.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(j.id,o.oldValue)},redo:function(){rl(j.id,o.newValue)}};g(o),rl(j.id,a)},cl=!j.notBuilding&&Ww.getBuildingCompletionStatus(j,y)===D.COMPLETE,sl=function(){p((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===j.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(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===j.id){a.notBuilding=!a.notBuilding;break}}}catch(o){l.e(o)}finally{l.f()}}))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[function(){if(H&&H.length>0){var e=H[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(pf.jsx)(jP,{keyName:"foundation-paste"}),Object(pf.jsx)(zP,{keyName:"foundation-copy"}),ll&&Object(pf.jsx)(RP,{keyName:"foundation-cut"}),Object(pf.jsx)(DP,{keyName:"foundation-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:j.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:j.id,selectedElementType:j.type,undo:function(){return sl()},redo:function(){return sl()}};g(t),sl()},children:me.t("foundationMenu.GroupMaster",{lng:S})})},"group-master"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!j.notBuilding,onChange:function(e){var t={name:"Building",timestamp:Date.now(),checked:e.target.checked,selectedElementId:j.id,selectedElementType:j.type,undo:function(){return dl()},redo:function(){return dl()}};g(t),dl()},children:me.t("word.Building",{lng:S})})},"building"),$t.gotSome()&&Object(pf.jsxs)(MP.a,{title:me.t("word.Elements",tl),style:{paddingLeft:"24px"},children:[el.gotSome()&&Object(pf.jsx)(tb.a.Item,{onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==j.id&&a.id!==j.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(j.id,!0);var o={name:"Lock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(h.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(j.id,!0)}};g(o)},children:me.t("foundationMenu.LockAllElementsOnThisFoundation",tl)},"lock-all-offsprings"),Object(pf.jsx)(tb.a.Item,{onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==j.id&&a.id!==j.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(j.id,!1);var o={name:"Unlock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(h.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(j.id,!1)}};g(o)},children:me.t("foundationMenu.UnlockAllElementsOnThisFoundation",tl)},"unlock-all-offsprings"),el.wallCount>0&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation",tl)+" ("+el.wallCount+" "+me.t("foundationMenu.Walls",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=new Set;Xw.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==j.id&&t.foundationId!==j.id||e.add(t.id)}));var t=Xw.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:j.id,removedElements:l,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(a.removedElements)),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))},redo:function(){var e=new Set;Xw.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation",tl)+" ("+el.windowCount+" "+me.t("foundationMenu.Windows",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Window&&e.foundationId===j.id}));x(j.id,V.Window);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Windows on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation",tl)+" ("+el.doorCount+" "+me.t("foundationMenu.Doors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Door&&e.foundationId===j.id}));x(j.id,V.Door);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Doors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation",tl)+" ("+el.sensorCount+" "+me.t("foundationMenu.Sensors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.foundationId===j.id}));x(j.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation",tl)+" ("+(el.insideLightCount+el.outsideLightCount)+" "+me.t("foundationMenu.Lights",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Light&&e.foundationId===j.id}));x(j.id,V.Light);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Lights on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation",tl)+" ("+el.solarPanelModuleCount+" "+me.t("foundationMenu.SolarPanels",tl)+", "+el.solarPanelCount+" "+me.t("foundationMenu.Racks",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.foundationId===j.id}));x(j.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation",tl)+" ("+el.parabolicTroughCount+" "+me.t("foundationMenu.ParabolicTroughs",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicTrough&&e.foundationId===j.id}));w(j.id,V.ParabolicTrough);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Troughs on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation",tl)+" ("+el.parabolicDishCount+" "+me.t("foundationMenu.ParabolicDishes",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicDish&&e.foundationId===j.id}));w(j.id,V.ParabolicDish);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Dishes on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation",tl)+" ("+el.fresnelReflectorCount+" "+me.t("foundationMenu.FresnelReflectors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.FresnelReflector&&e.foundationId===j.id}));w(j.id,V.FresnelReflector);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Fresnel Reflectors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation",tl)+" ("+el.heliostatCount+" "+me.t("foundationMenu.Heliostats",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Heliostat&&e.foundationId===j.id}));w(j.id,V.Heliostat);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Heliostats on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation",tl)+" ("+el.polygonCount+" "+me.t("foundationMenu.Polygons",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.foundationId===j.id}));w(j.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation",tl)+" ("+el.humanCount+" "+me.t("foundationMenu.Humans",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===j.id}));w(j.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation",tl)+" ("+el.treeCount+" "+me.t("foundationMenu.Trees",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===j.id}));w(j.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation",tl)+" ("+el.flowerCount+" "+me.t("foundationMenu.Flowers",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===j.id}));w(j.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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&&(!j.textureType||j.textureType===se.NoTexture)&&Object(pf.jsxs)(pf.Fragment,{children:[W&&Object(pf.jsx)(JP,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),M(!0)},children:[me.t("word.Color",tl)," ..."]},"foundation-color")]}),ll&&Object(pf.jsxs)(pf.Fragment,{children:[F&&Object(pf.jsx)(lS,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),k(!0)},children:[me.t("word.Texture",tl)," ..."]},"foundation-texture"),J&&Object(pf.jsx)(GP,{setDialogVisible:X}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),X(!0)},children:[me.t("word.Length",tl)," ..."]},"foundation-length"),L&&Object(pf.jsx)(XP,{setDialogVisible:N}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),N(!0)},children:[me.t("word.Width",tl)," ..."]},"foundation-width"),q&&Object(pf.jsx)(BP,{setDialogVisible:Q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Q(!0)},children:[me.t("word.Height",tl)," ..."]},"foundation-height"),$&&Object(pf.jsx)(KP,{setDialogVisible:ee}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ee(!0)},children:[me.t("word.Azimuth",tl)," ..."]},"foundation-azimuth"),cl&&ae&&Object(pf.jsx)(HS,{setDialogVisible:oe}),cl&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),oe(!0)},children:[me.t("foundationMenu.GroundFloorRValue",tl)," ..."]},"ground-floor-r-value")]}),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(j){p((function(e){e.objectTypeToAdd=V.Polygon}));var e=A(j,new We.Vector3(j.cx,j.cy,j.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"),!j.notBuilding&&$t.wallCount>0&&Object(pf.jsx)(MP.a,{title:me.t("word.BuildingHVACSystem",tl),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"18px",marginTop:10},children:[Object(pf.jsx)(Pv.b,{style:{width:"40px",paddingLeft:"0px",textAlign:"left"},children:"ID:"}),Object(pf.jsx)(GT.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(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"160px"},children:me.t("word.ThermostatSetpoint",tl)+":"}),Object(pf.jsx)(ob.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(l=null===(a=j.hvacSystem)||void 0===a?void 0:a.thermostatSetpoint)&&void 0!==l?l:20,onChange:function(e){var t,l,a=null!==(t=null===(l=j.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(j.id,i.oldValue)},redo:function(){ol(j.id,i.newValue)}};g(i),ol(j.id,o)}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"thermostat-temperature"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{title:me.t("word.TemperatureToleranceThresholdExplanation",tl),style:{width:"160px"},children:me.t("word.TemperatureToleranceThreshold",tl)+":"}),Object(pf.jsx)(ob.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(o=null===(i=j.hvacSystem)||void 0===i?void 0:i.temperatureThreshold)&&void 0!==o?o:3,onChange:function(e){var t,l,a=null!==(t=null===(l=j.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(j.id,i.oldValue)},redo:function(){il(j.id,i.newValue)}};g(i),il(j.id,o)}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"tolerance-threshold")]})},"building-hvac-system"),ll&&Object(pf.jsx)(MP.a,{title:me.t("foundationMenu.SolarStructure",tl),style:{paddingLeft:"24px"},children:Object(pf.jsx)(rb.a.Group,{value:_t,style:{paddingLeft:"12px"},onChange:function(e){if(j){var t=j.solarStructure,l=e.target.value,a={name:"Select Solar Structure for Selected Foundation",timestamp:Date.now(),oldValue:t,newValue:l,changedElementId:j.id,changedElementType:j.type,undo:function(){al(a.changedElementId,a.oldValue)},redo:function(){al(a.changedElementId,a.newValue)}};g(a),al(j.id,l)}},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:G.None,children:me.t("word.None",tl)}),Object(pf.jsx)(rb.a,{value:G.FocusPipe,children:me.t("solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors",tl)}),Object(pf.jsx)(rb.a,{value:G.FocusTower,children:me.t("solarPowerTowerMenu.ReceiverTowerForHeliostats",tl)}),Object(pf.jsx)(rb.a,{value:G.UpdraftTower,children:me.t("solarUpdraftTowerMenu.SolarUpdraftTower",tl)})]})})},"select-solar-structure"),ll&&j.solarStructure===G.FocusPipe&&Object(pf.jsxs)(MP.a,{title:me.t("solarAbsorberPipeMenu.AbsorberPipePhysicalProperties",tl),style:{paddingLeft:"24px"},children:[ne&&Object(pf.jsx)(aS,{setDialogVisible:ce}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ce(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberHeight",tl)," ..."]},"solar-absorber-pipe-height"),fe&&Object(pf.jsx)(nS,{setDialogVisible:he}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),he(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",tl)," ..."]},"solar-absorber-pipe-aperture-width"),ge&&Object(pf.jsx)(cS,{setDialogVisible:we}),Object(pf.jsxs)(tb.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(pf.jsx)(oS,{setDialogVisible:Ae}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ae(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",tl)," ..."]},"solar-absorber-pipe-absorptance"),Se&&Object(pf.jsx)(iS,{setDialogVisible:He}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),He(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",tl)," ..."]},"solar-absorber-optical-efficiency"),Re&&Object(pf.jsx)(rS,{setDialogVisible:De}),Object(pf.jsxs)(tb.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&&j.solarStructure===G.FocusTower&&Object(pf.jsxs)(MP.a,{title:me.t("solarPowerTowerMenu.ReceiverTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[Ce&&Object(pf.jsx)(hS,{setDialogVisible:Fe}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Fe(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerHeight",tl)," ..."]},"solar-power-tower-height"),Ye&&Object(pf.jsx)(pS,{setDialogVisible:Le}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Le(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerRadius",tl)," ..."]},"solar-power-tower-radius"),Ee&&Object(pf.jsx)(yS,{setDialogVisible:Ve}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ve(!0)},children:[me.t("solarPowerTowerMenu.ReceiverAbsorptance",tl)," ..."]},"solar-power-tower-receiver-absorptance"),Xe&&Object(pf.jsx)(gS,{setDialogVisible:Be}),Object(pf.jsxs)(tb.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(pf.jsx)(mS,{setDialogVisible:Ze}),Object(pf.jsxs)(tb.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&&j.solarStructure===G.UpdraftTower&&Object(pf.jsxs)(MP.a,{title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[et&&Object(pf.jsx)(sS,{setDialogVisible:tt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),tt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",tl)," ..."]},"solar-updraft-tower-chimney-height"),ot&&Object(pf.jsx)(dS,{setDialogVisible:it}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),it(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",tl)," ..."]},"solar-updraft-tower-chimney-radius"),ct&&Object(pf.jsx)(fS,{setDialogVisible:st}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),st(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",tl)," ..."]},"solar-updraft-tower-collector-height"),ft&&Object(pf.jsx)(uS,{setDialogVisible:ht}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ht(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",tl)," ..."]},"solar-updraft-tower-collector-radius"),gt&&Object(pf.jsx)(wS,{setDialogVisible:mt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),mt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",tl)," ..."]},"solar-updraft-tower-collector-transmissivity"),vt&&Object(pf.jsx)(bS,{setDialogVisible:bt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),bt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",tl)," ..."]},"solar-updraft-tower-collector-emissivity"),Pt&&Object(pf.jsx)(xS,{setDialogVisible:St}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),St(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",tl)," ..."]},"solar-updraft-tower-discharge-coefficient"),zt&&Object(pf.jsx)(vS,{setDialogVisible:Dt}),Object(pf.jsxs)(tb.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(pf.jsxs)(MP.a,{title:me.t("optimizationMenu.Optimization",tl),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(MP.a,{title:me.t("optimizationMenu.GeneticAlgorithm",tl),children:el.solarPanelCount>0&&Object(pf.jsxs)(pf.Fragment,{children:[It&&Object(pf.jsx)(TS,{setDialogVisible:Ct}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){Ct(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-ga-optimizer")]})},"genetic-algorithms"),Object(pf.jsx)(MP.a,{title:me.t("optimizationMenu.ParticleSwarmOptimization",tl),children:el.solarPanelCount>0&&Object(pf.jsxs)(pf.Fragment,{children:[Ot&&Object(pf.jsx)(SS,{setDialogVisible:Yt}),Object(pf.jsxs)(tb.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",tl),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===j||void 0===j?void 0:j.showLabel),onChange:Et,children:me.t("labelSubMenu.KeepShowingLabel",tl)})},"foundation-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",tl)+":",value:Nt,onChange:function(e){return Ut(e.target.value)},onPressEnter:Vt,onBlur:Vt})},"foundation-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelHeight",tl)+":",min:j.lz/2+.2,max:100,step:1,precision:1,value:null!==(n=j.labelHeight)&&void 0!==n?n:j.lz/2+.2,onChange:function(e){return Bt(e)}})},"foundation-label-height"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",tl)+":",min:10,max:100,step:1,precision:0,value:null!==(c=j.labelFontSize)&&void 0!==c?c:20,onChange:function(e){return Gt(e)}})},"foundation-label-font-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelSize",tl)+":",min:.2,max:5,step:.1,precision:1,value:null!==(s=j.labelSize)&&void 0!==s?s:.2,onChange:function(e){return Jt(e)}})},"foundation-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelColor",tl)+":",value:null!==(d=j.labelColor)&&void 0!==d?d:"#ffffff",onChange:function(e){return Xt(e.target.value)}})},"foundation-label-color")]})]},"foundation-label")]})})),zS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Sr),c=Xw(qn),s=Xw(Qn),d=Xw(rn),p=Xw(Ii),y=Xw(Ci),g=NP(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 H=function(e,t,l){o((function(a){var o,i=Object(h.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()}}))},j=function(e,t){o((function(l){var a,o=Object(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked){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(s){l.e(s)}finally{l.f()}break;case _.OnlyThisObject:if(g.faceColors){for(var n=0;n<4;n++)if(e!==g.faceColors[n])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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Cuboid){var s=r;if(s.faceColors)l.set(r.id,Object(f.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(W){a.e(W)}finally{a.f()}var x={name:"Set Color for All Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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 R=g.faceColors?g.faceColors[d]:g.color,D={name:"Set Color for Selected Side of Cuboid",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:g.id,changedElementType:g.type,changedSideIndex:d,undo:function(){void 0!==D.changedSideIndex&&H(D.changedSideIndex,D.changedElementId,D.oldValue)},redo:function(){void 0!==D.changedSideIndex&&H(D.changedSideIndex,D.changedElementId,D.newValue)}};n(D),H(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)}},W=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(pf.jsx)(EP,{width:600,title:me.t("word.Color",S),onApply:function(){D(x),a(!1),y(0)},onClose:function(){R(),a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.a,{color:null!==x&&void 0!==x?x:W,onChangeComplete:function(e){v(e.hex),P(!T)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value),P(!T)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",S)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",S)})]})})})]})})},RS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(en),n=Xw(mn),c=Xw(bn),s=Xw(Kn),f=Xw(nn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid){var r=o,n=i(r.id);if(n.length>0&&!Ww.doesNewSizeContainAllChildren(r,n,e,r.ly))return!1}}}catch(s){l.e(s)}finally{l.f()}break;default:var c=i(b.id);if(c.length>0)return Ww.doesNewSizeContainAllChildren(b,c,e,b.ly)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.a)(l);try{for(r.s();!(o=r.n()).done;){var u=o.value;if(Ww.isIdentical(u.normal,Tt))switch(u.type){case V.SolarPanel:case V.Sensor:var f=new We.Vector2(u.cx*e.lx,u.cy*e.ly).rotateAround(Dt,a);D.current.set(u.id,f),z.current.set(u.id,new We.Vector3(u.cx,u.cy));break;case V.Polygon:var p,y=u,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new We.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),W.current.set(u.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Ww.isPlantOrHuman(u)&&z.current.set(u.id,new We.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(h.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Ww.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),R.current.set(b.id,new We.Vector3(T,b.cy))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/t,O=F.y/e.ly;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}s(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}}if(Ww.isPlantOrHuman(b))if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(E,b.cy,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisTypeOnSurface:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&o.parentId===(null===b||void 0===b?void 0:b.parentId)&&!o.locked){var i=o;if(Math.abs(i.lx-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(y){case _.AllObjectsOfThisTypeOnSurface:var i,r=new Map,n=Object(h.a)(a);try{for(n.s();!(i=n.n()).done;){var d=i.value;d.type!==V.Cuboid||d.parentId!==b.parentId||d.locked||(r.set(d.id,d.lx),N(d,e))}}catch(v){n.e(v)}finally{n.f()}var g={name:"Set Length for All Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(v){t.e(v)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(h.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];f(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),E(w,y))}}catch(v){r.e(v)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var b,A=Object(h.a)(g.oldChildrenVerticesMap.entries());try{for(A.s();!(b=A.n()).done;){var T=Object(u.a)(b.value,2),P=T[0],S=T[1];s(P,S)}}catch(v){A.e(v)}finally{A.f()}}},redo:function(){if(function(e){var t,l=Object(h.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)||N(o,e)}}catch(v){l.e(v)}finally{l.f()}}(g.newSize),g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(g.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];f(r,n.x,n.y,n.z);var c=null===(l=g.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=g.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(U(d,c,r),E(d,r))}}catch(v){t.e(v)}finally{t.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(g.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:N(b,e);var m={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(c(b.id,m.oldSize),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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];f(i,r.x,r.y,r.z);var n=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(n,d,i),E(n,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.oldChildrenVerticesMap&&m.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}},redo:function(){if(c(b.id,m.newSize),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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];f(i,r.x,r.y,r.z);var n=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(d,n,i),E(d,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.newChildrenVerticesMap&&m.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(m),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",k),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 500] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",k)})]})})})]})})},DS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(en),n=Xw(nn),c=Xw(wn),s=Xw(Pn),f=Xw(Kn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid){var r=o,n=i(r.id);if(n.length>0&&!Ww.doesNewSizeContainAllChildren(r,n,r.lx,e))return!1}}}catch(s){l.e(s)}finally{l.f()}break;default:var c=i(b.id);if(c.length>0)return Ww.doesNewSizeContainAllChildren(b,c,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.a)(l);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(Ww.isIdentical(n.normal,Tt))switch(n.type){case V.SolarPanel:case V.Sensor:var u=new We.Vector2(n.cx*e.lx,n.cy*e.ly).rotateAround(Dt,a);D.current.set(n.id,u),z.current.set(n.id,new We.Vector3(n.cx,n.cy));break;case V.Polygon:var p,y=n,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new We.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),W.current.set(n.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Ww.isPlantOrHuman(n)&&z.current.set(n.id,new We.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(h.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Ww.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;c(b.id,T),R.current.set(b.id,new We.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/e.lx,O=F.y/t;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}f(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}}if(Ww.isPlantOrHuman(b))if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(b.cz,E,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisTypeOnSurface:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&o.parentId===(null===b||void 0===b?void 0:b.parentId)&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(r){l.e(r)}finally{l.f()}break;case _.AllObjectsOfThisType: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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(z.current.clear(),R.current.clear(),W.current.clear(),M.current.clear(),y){case _.AllObjectsOfThisTypeOnSurface:var i,r=new Map,c=Object(h.a)(a);try{for(c.s();!(i=c.n()).done;){var d=i.value;d.type!==V.Cuboid||d.parentId!==b.parentId||d.locked||(r.set(d.id,d.ly),N(d,e))}}catch(v){c.e(v)}finally{c.f()}var g={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(v){t.e(v)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(h.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),E(w,y))}}catch(v){r.e(v)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var b,A=Object(h.a)(g.oldChildrenVerticesMap.entries());try{for(A.s();!(b=A.n()).done;){var T=Object(u.a)(b.value,2),P=T[0],S=T[1];f(P,S)}}catch(v){A.e(v)}finally{A.f()}}},redo:function(){if(function(e){var t,l=Object(h.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)||N(o,e)}}catch(v){l.e(v)}finally{l.f()}}(g.newSize),g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(g.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=g.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=g.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(U(d,s,r),E(d,r))}}catch(v){t.e(v)}finally{t.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(g.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:N(b,e);var m={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(s(b.id,m.oldSize),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(c,d,i),E(c,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.oldChildrenVerticesMap&&m.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}},redo:function(){if(s(b.id,m.newSize),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(d,c,i),E(d,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.newChildrenVerticesMap&&m.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(m),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",k),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 500] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",k)})]})})})]})})},WS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw($r),n=Xw(Zr),c=Xw(jn),s=Xw(xn),d=Xw(zn),f=Xw(vn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(nn),w=Xw(Ii),x=Xw(Ci),v=NP(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),H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=$f(),D=function(e,t){c(e,t),s(e,t/2)},W=function(e){if(v){var t=i(v);if(t){var l,a=Object(h.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()}}}},M=function(e){if(v){var t=Ww.getBaseId(v.id);if(t){var l,a=Object(h.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type!==V.Cuboid||i.locked||Ww.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(h.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(h.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=Nt.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 We.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new We.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,z.current.set(l.id,new We.Vector3(c.x,c.y,0)),H.current.set(l.id,xt)}},F=function(e,t){a((function(l){var a,o=Object(h.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),j.current.set(i.id,new We.Vector3(i.cx,i.cy,i.cz)),Ww.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Nt.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 We.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},k=function(e,t,l){if(e&&t){var a=Nt.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)()}}},O=function(e,t){e&&a((function(l){var a,o=Object(h.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){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r=Ww.getBaseId(null===v||void 0===v?void 0:v.id);if(r&&r!==xt){var n,c=Object(h.a)(o);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Cuboid&&s.parentId&&s.parentId!==xt&&!s.locked){var d=s;if(r===Ww.getBaseId(d.id)&&Math.abs(d.lz-e)>At)return!0}}}catch(m){c.e(m)}finally{c.f()}}break;case _.AllObjectsOfThisTypeOnSurface:var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.Cuboid&&p.parentId!==xt&&p.parentId===(null===v||void 0===v?void 0:v.parentId)&&!p.locked){var g=p;if(Math.abs(g.lz-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,i=Object(h.a)(o);try{for(i.s();!(t=i.n()).done;){var r=t.value;r.type===V.Cuboid&&(l.set(r.id,r.lz),F(r,e))}}catch(J){i.e(J)}finally{i.f()}var c={name:"Set Height for All Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(c.oldChildrenPositionsMap&&c.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(c.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,s,d=Object(u.a)(i.value,2),f=d[0],p=d[1];m(f,p.x,p.y,p.z);var y=null===(n=c.oldChildrenParentIdMap)||void 0===n?void 0:n.get(f),g=null===(s=c.newChildrenParentIdMap)||void 0===s?void 0:s.get(f);y&&g&&y!==g&&(k(y,g,f),O(y,f))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=c.newValue;if(d(V.Cuboid,e),f(V.Cuboid,e/2),c.newChildrenPositionsMap&&c.newChildrenPositionsMap.size>0){var t,l=Object(h.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),p=null===(o=c.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&p&&s!==p&&(k(p,s,r),O(p,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(c),d(V.Cuboid,e),f(V.Cuboid,e/2),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:var s,g=new Map,b=Ww.getBaseId(v.id),A=Object(h.a)(o);try{for(A.s();!(s=A.n()).done;){var T=s.value;T.type===V.Cuboid&&Ww.getBaseId(T.id)===b&&(g.set(T.id,T.lz),F(T,e))}}catch(J){A.e(J)}finally{A.f()}var P={name:"Set Height for All Cuboids Above Same Base",timestamp:Date.now(),oldValues:g,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],f=s[1];m(d,f.x,f.y,f.z);var p=null===(n=P.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=P.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(k(p,y,d),O(p,d))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=P.newValue;if(M(e),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var t,l=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(k(s,c,r),O(s,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(P),M(e),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var R,I=new Map,C=Object(h.a)(o);try{for(C.s();!(R=C.n()).done;){var Y=R.value;Y.type===V.Cuboid&&Y.parentId===v.parentId&&(I.set(Y.id,Y.lz),F(Y,e))}}catch(J){C.e(J)}finally{C.f()}var L={name:"Set Height for All Cuboids on Same Surface",timestamp:Date.now(),oldValues:I,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],f=s[1];m(d,f.x,f.y,f.z);var p=null===(n=L.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=L.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(k(p,y,d),O(p,d))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=L.newValue;if(W(e),L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var t,l=Object(h.a)(L.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=L.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=L.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(k(s,c,r),O(s,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(L),W(e),x(w+1);break;default:var N=n(v.id),U=N?N.lz:v.lz;F(v,e),D(v.id,e);var E={name:"Set Cuboid Width",timestamp:Date.now(),oldValue:U,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),changedElementId:v.id,changedElementType:v.type,undo:function(){if(D(E.changedElementId,E.oldValue),E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var e,t=Object(h.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];m(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&&(k(n,c,i),O(n,i))}}catch(J){t.e(J)}finally{t.f()}}},redo:function(){if(D(E.changedElementId,E.newValue),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var e,t=Object(h.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];m(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&&(k(c,n,i),O(c,i))}}catch(J){t.e(J)}finally{t.f()}}}};p(E),x(w+1)}a((function(t){t.actionState.cuboidHeight=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",R),onApply:function(){Y(T)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",R),": [0.1, 1000] ",me.t("word.MeterAbbreviation",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",R)}),(null===v||void 0===v?void 0:v.parentId)!==xt&&Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("cuboidMenu.AllCuboidsAboveSameBase",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",R)})]})})})]})})},MS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Un),n=Xw(Sr),c=Xw(qn),s=Xw(Qn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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){if(p&&function(e){var t;switch(c){case _.AllObjectsOfThisTypeOnSurface:var l,o=Object(h.a)(a);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Cuboid&&i.parentId===(null===p||void 0===p?void 0:p.parentId)&&!i.locked){var r=i;if(Math.abs(-r.rotation[2]-e)>At)return!0}}}catch(n){o.e(n)}finally{o.f()}break;case _.AllObjectsOfThisType: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 _.AllObjectsOfThisTypeOnSurface:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type!==V.Cuboid||s.parentId!==p.parentId||s.locked||l.set(s.id,-s.rotation[2])}}catch(x){r.e(x)}finally{r.f()}var y={name:"Set Azimuth for All Cuboids on Surface",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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];i(a,0,0,-o)}}catch(x){t.e(x)}finally{t.f()}},redo:function(){v(y.newValue)}};n(y),v(e),f(d+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:var g=o(p.id),m=g?-g.rotation[2]:-p.rotation[2],w={name:"Set Cuboid Azimuth",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(w.changedElementId,0,0,-w.oldValue)},redo:function(){i(w.changedElementId,0,0,-w.newValue)}};n(w),i(p.id,0,0,-e),f(d+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Azimuth",x),onApply:function(){b(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Ww.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",x)})]})})})]})})},IS=l.p+"static/media/building_facade_05_menu.8fe3496b.png",CS=l.p+"static/media/building_facade_06_menu.4342d26b.png",FS=l.p+"static/media/building_facade_10_menu.de5158c9.png",kS=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(ki),o=Xw(Sr),i=Xw(qn),n=Xw(Qn),c=Xw(rn),s=Xw(Ii),d=Xw(Ci),p=NP(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=yb.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(h.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(h.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){l((function(t){var l,a=Object(h.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()}}))},P=function(e){if(p&&function(e){if(p){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked){var r=o;if(r.textureTypes)for(var n=0;n<4;n++)if(e!==r.textureTypes[n])return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.OnlyThisObject:if(p.textureTypes)for(var s=0;s<4;s++)if(e!==p.textureTypes[s])return!0;break;default:if(c>=0&&p.textureTypes&&e!==p.textureTypes[c])return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,r=new Map,n=Object(h.a)(a);try{for(n.s();!(t=n.n()).done;){var y=t.value;if(y.type===V.Cuboid){var g=y;r.set(y.id,g.textureTypes?Object(f.a)(g.textureTypes):void 0)}}}catch(S){n.e(S)}finally{n.f()}var m={name:"Set Texture for All Cuboids",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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 v=p.textureTypes?p.textureTypes[c]:de.NoTexture,P={name:"Set Texture for Selected Side of Cuboid",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:p.id,changedElementType:p.type,changedSideIndex:c,undo:function(){void 0!==P.changedSideIndex&&b(P.changedSideIndex,P.changedElementId,P.oldValue)},redo:function(){void 0!==P.changedSideIndex&&b(P.changedSideIndex,P.changedElementId,P.newValue)}};o(P),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(pf.jsx)(EP,{width:600,title:me.t("word.Texture",x),onApply:function(){P(m)},onClose:function(){(null===p||void 0===p?void 0:p.textureTypes)&&c>=0&&w(p.textureTypes[c]),t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(pf.jsxs)(v,{value:de.NoTexture,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade01,children:[Object(pf.jsx)("img",{alt:de.Facade01,src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QsaEigCbtge4wAAIABJREFUeJxVnNuvJVly1n8RsVbm3udUVVd1V99nembsGbBlg22QLeQ3SxiQECAhJN75w3jmnScLmYvAFojBWHgwM8Zuz326e7qqursuZ+/MtSJ4iNi7h5ZKXZe982SutSLii+/7IuX//s//Gt/+9n/njdff5L333mfMwRyD3hpBYKbs+xmPYLGOO4QABCJC4IQHiIAYKsLcTliv7+vCnBP3SYQjGqh0fDrrsjDmABEiBqrGPnZUG0tfWHrnv/zRH/PL3/omjx7eI0IgIHzS2koI7NsOMhFVTBoRAQQqikeAKJDfEVV8TsyMCHB3FEGaINpgTMYcWFPmdMIH1joAvTV+8uMf8fTz5/zmb/4G23nDCYhARAFn3zeWfsDxvA8PRv08UcHnJCLyzwgRjrsTBL2v7PuGqihPnjxjAH0xwFl63oSp4TFRM3prTBFcApGgNUOtASAiNGs0CQzHloUgUDVQUFVEjGU5IDRUG713wgMTAcnPhjuqRmtGxGSOM88++xyfgllHVYDA2gKSi6waNO2YGogjCiKKtoYQeB0GUUFU0NbwcDwckQCDiMDHIARCnDnz88vhiFkDUawbr84nfvbRz+nLARHFEGIOPBzThXU55jU8oM7o0hdMG90OqBi9dSIiD6AZgSL17KaCWu8MD3x6XsRh+CDCQQAndxNBVTAVnCAcfAxaWwhgzkEg7GNgYgiKWcPHwGPkqQhAAo+ZJ0sFNUMxYk6k9TzJgIjR+gqmiACh4BmF7g4RgCKqBOAzELHc2HDG2EEMU8EUCGeMDer6KoJay0ecjpjgDJr1XGxRFMnrRK4NYexjEO74nBCOiqIiDB+IGooioogIIo05Jngwx0YEzOkAtLbiY6CmNGtELg6Kf5lyIhzp+ZAiMN3Jr1dYBpkGAMcRFSIydV3+PkJwMhXs+8YcA3eYcwcVCKmToCDB9IEotPWIBjRbiOn4HAhCt86YO7gDGU1BMB1UFAlDTTEziMv9aEZTONProElGWRB4eB2EINwRgZiDZo2575gpQbCPgVbKExH2cQbVfIy5I9Zp/YAESDgewZwjN1s1o4Vg3zcCEFMiApVcmwjAHd93JMBDaOvhQGuNdekcDwvzbmddFgTBXVAJQoLwelDxys2Gap6uoUJrBgiHw4F9DPqq4IGvkjnb/Zr6JCqFNMP3iZhhankaAeaOWqd3w0y5Od5yOKzsPjLkZz4olYdFFMGJ2gDpSu+NOQbb2CCE3nsukueioQqhtKWjmdwAYblnzJm1R0TAA8I5HG9oXVnXzmFRtsPCPjesr/T1FmJmEPXGHBtSEbhLHtRM20pYpSgJ8InPwNQIcVZdaN/9P9/lhz/8EfuYvHrxnOETiZknzBZ8H8TcmO6odtw33CetHbIoVXEEvZ6MLMxU6GqGuINIoJDhbooAiCESuSCJFup0C9N3/vy736X3zpO3H+MuxAxs6bjvQOCX6B4TsYaPHRBEYfpEwrHWGGNDxBDtSEycmb/3yLoyZ0ZgTEQazZQxTgVWOsva+PDDH/GDn/yMP/2z73A+bfiYeDi9LczINN/7wvl0zuhRwcPZ9xPWVlSMfWxV45Sx7ZUujW4LPs+01lc8hOV4y737D9lHPijh9L4yhjP3l5j1DH+9X2GniDTACZ+AETjTJ0cJVLJ4NmuZN0UhHFPNFKiKj50ZE8FQs8xKOGYdRDAc7bfc3H+Nm9sHqC2MMRDNkNcsDvgI1DICLnVvjBMakpEUA7FHELlJZlw339rC8J2+LMSMTHnOFRQgwb5Pbu/d5/bBZ/SfP+PRo7e4O91BZJxGbaqK4L6zHgfWO00zWtwnaj1rIcK+n7GmQMsIlEC1owrtax+8yzvvvM6vfOuX+KVvfJXT6S6/KJlfFUPMmGPPWjETdV3qhoggaOZOTahpZqgoUUVvzoS82nrWBs1UYK0x50SrflnrjLHnBmlwPKz87+99j1/++td56/Ej3Lc6xTBnYMuCRNUBs6wFkVA0YfZkTqf3A4jgY6/PQIgkNAY0gpAEL2rGHBuqLQ+aAijHdeWLzz/lxfOnvPv2G5xPOyOiFjkzoPuse0u4nM8FRKCmjDnpvXE+n2mtQaXQPNACKG2OiYhx9/Ilp7sT+z7yprk8TCf2cc3VKsI+JoIjYnjVFvdReFyY0wsEVJ4ETBtjnuu01Ibtg23fK7UF5lWTfGftndN5Z+wb235m7BsewZh7Hgo1tj3Tk5mhHplC50A0oxFR9jGZsWEiTB8oZI1bjuxsyKWCzIloQ+dk3zfMJk2NMQZqnX0f7NsAlOHOBHo7MGfWi3BHZcGZVR8EV81UGU4MpbXG6XQiIjif96o7iViXdUGARlV8mtLXzpyesJRGb3FFNpJHgOGBaQMUj4kjqCeyCAwIYg5CJ6qtPg+B4179xgxcA5rUycjFlLqmFsJbpSWsjUuK2xIKt7rezKjKh6poVcHnYPpkXVaW1hlzEpdDQNDakgV+zir0k94PzHCQfL7shQpKF9JsLRdV1UAGY94xN0ebMX1PCKyGqWYUVqS4T2RKoUentZYABMVQJBeI6RPNLjox9tw3PBLqKYpKNWMSCAZYRUUeflNLBKUG0hCyRrS+QGR6s6aFxx1VSRit+YhEYM2uuXXMjWDmDZOpz7xytGb04TO72zEx1epZBBHwMQnPKGpiiGSxFipYyT5gjp1tv8tNppCZSX7O8558OlLgILcDpo/s7kWZ+0g43AsdOmjrmZoRYGZUjx0VAZnYsqDSEuWh/189NWl062iuRYactRVRYfpMDK3Bvu/VFHl15B0zQTThYXgUvndCEuOPsdP7kv0MyoyJ9X59SA+n9YWY+ahJsST0VSILtwgegxDPfmIOBNi2LXH/pTa5M7cdRNBmqHa6LogIY9sS/WmiP7nk/GpGs/6BWmOOvQqwfxmVIhnRRDaRIkzPTr61XvVholaJhGCOnX3br9B5jJ193xFVxtzRli3AGDM3dWbT6ATb3NDwoPWW0HDfiOms65q7WigJyZuO8PyMZ+Fs1rFCT0T2mRF5mt2rT5hefA+guQBCFjIzqU1qIJIQmUwJQsFpEbQ6fxFjWY+IZT1ofQURWmu5QZ5RqNYS1VThJCSpkZj0tmSzJ9TPEZiTmPldUYh56Wn27O5FmKOa3DlZ15tEhXPkc0c2usmxLbRlwVqjL2uhv4aQNVXwBAwxsdZovQMJgJo2VM0wyRsRBdOsI4lWMsVky7+hqkWf5MIPH4wrjUHVlajwnsVTCa31BAFMkORs3AfDdzQ/gvuo/iVTTUTSJ3PmRlpr9WMqxFvPgwDsc2T608z7IcGMmfUAYewDbZ3WVwJY2kLv67V2QaabC2gJZkL4fRBzMPaN1nqmqjGZc2ffz5maBaxZRozAZLJtd8QczLlXlEmhwI57ECKsyzGj15R1bYQ7EaDJOE7m2H6BlRyJLhNuZccqCfCzb6nTlAk8Hx6Ss2qZCkyVMQZOXv/CavqcBTkNKUgdc4AHrXWIic8dUUPCOZ/vGPvOmJ70iM8k9Hywn0+oWOL9fVQtSd7NrCGRvJu2hpii1pn74Hy+w+dMngmyDjKJSPY4PAlL1QahSJAR4qPgbaLOCDBRfN8Z+84cEysS9QL/zXq2CeHE3DBrrEuuIQ6n84kxPCmncLT3JTvYpLVQEfp6uHa5l/+a5QkZ2wnEiOzhUATf57UIx5wV3luxwUXThyPSEhW5Z8iqFpckieIIRBtBUg1eNLqaYWSxRoSxnZK87AsRs/I9SVAWwedjolIR406MceXsRC1h+fBEfHGJhmyGhUwXAdkzXYgaMfq6IiZ5MH2y7yfGHHnPkvVh+iz2OnLzxryyGV7UTSI1qhYXRS9K+0XyLSKYEVgES+/V6ORCjn1DxZJqZoArZp19nFBLRjXZS0M0ubBMCRlFEnl6iUgE11oyxtW/hAfgV7olkQQZHedTkY1azZ0V6Ve1QSTTmhlz7oyxZ9NZUJTqmRLVZUc8t3OyVwLhyUxnSjZG9V2mClXPhIzgbTsVxPYEHUiBgygQI4jPL6mgi3ZkC+Bs+4luHY+diPklr6Uwtg1N2jyLp5Boa9/3gpq5USqWTCVBW9bij5L5VW0wJ3NkmptzFuuaG920xCDkymvNmImQmNcI1GJoMz3mdURgXZNycNOMBs9iqNYwu9DvgWkW9QtqEtXiBR3tuVHbfqp6lzkdrQNgYJZpKZnZYPoO4qgmCyGqIMUou2cEamo7bVnxmIyxJUIt4SmbEWfW/yNGboZEpvDU0hIM+c5xvUdbDgvLstBb5+b2WBwqWfWtMTVpiQit1NXw2RljYK0hsuKHY7b/7nlaCdpywzifMzSjwG14RVP/EnWtt8y5ZZMmSkiqjPt+pi8L2hr9cMiItUbEgvtkWRbm2LO4izDnRrdEUPvcrvk9awosJoxtsKwHUGUOoXmiu7Fnx74s6/WUOx2zVA7XZWE93CAMmhnHm1vGGMn1+cC04b5ktF/5q0zFvS3sY88IbB1Emb7Tb+8xi932imDDaD/+wV/w+ZOP+dlPb+lyx3lPRXCOkTm+QjF8EjOyuSsgoNKIkGykqqtFJnPfWdZb5hgFI2f2OjPTU1/Xa9MV1YSOuVEMOGaNbWy8fHDk7uULPv7pj5B54nQ60XojXEq/IambIjXN+hU5RaTWEtOzM7fUG+bYKs1chK/Ug0STim/Wswb5zj53elvxsbGunWeffsQXn33KX//V93j+4mWCn1nycU95W7Uxi8IZc8PHRkT2M6qKWMt1nYOBJruM0LQzY0P+1b/4B/Gdv/yIfT/zz/7x7/P1D77C3d1dFUpn7ANTq+5ZGHMk/W6pI2xz1EYkbJ5jEHvWHjusiAtmicG9VMh8YM8+hKQZVIVmSoSwnc/cv3+PP/jDf8+HP/gpKsI//yf/iLcev86rly+wZYEZaOtMnyx9YY7BaTvTWwecfdvo6w3b+Q41A3da7+wlIJkI1huj0jMiWV+6ISPBw/SZ0nQzPv7Zx/zbf/efePXyzK/96rf4h//o77Pd3RE+2MZgWQoWVxOLKDOC/dWrZIGrOQ61RIRemktJCMuyQBPkX/7T34979x/jPjifXmAqGR296Gd3IrU1lt5Ry/zbe7t23glnswiOfSTErMaLoiMQIUTYTudEZuHslwKtSit9JAq+Cc7zu8HDR49QH7x8+TLFr31DLmnQnUk+TFI0+YCqyvQoPirrxAWmZp8R15TsDmNsmKUB4nQ+M/bJ2pMjK1YHd6OvN4gKnz17ys1xqUMWV6SICn1pVwbA6/tSvVESmRndw52Y2ZPNgEnV3EcPHyI46+HA9z/9hJcvX/Hg9j7aEx7GTJRipvy3//GnfPLkU47HQyp+KCJeUCV56OwnS4jyy995QkMPCmOx7Tvf/MbX+eo7b2W+tZZSbAgonLYTv/LNr3FcGoTz9Mkznr/caG0FdgLorfOd7/0FH/7wBxyPx0KEmffM8jBIszoypBhGiWUFYLK5DMYMtvPGNz/4gF/+2ge8eHGHWE+kFZMHt43X76/cbRv31pWPPnnKzf37deiMpsKzZ5/zR9/+NmYL1qxAEUjolabPjZGiaIRwmF66ypi0X/3GB/zkk2c8uH/Lo/tH1qXz+qPXsb4mERgJ+Q6tcefBB+0eDx/cT7LPKj5E0KB4H6lfiYjCrRrPpNl/+tcfcn72Kajy937r1/mNX/km53MW574eyqIz2U+vaE346Mkzbm9v+L133+dwcw+0ERNEg3VduH/viFrDx+TeW+/x1te+jhI01eqOkxxFwVE0SDuRaDZr5QCJUL54+gVvtxO/9zt/m9M+0bbQl46pQ0w+/fQTnr8687V33+O31pWb23tX+L70xvd/+GPu1ke889WvJ0ITQUtDR7XuobwACmMmNDaPtF950Kw3jscD67owcR7cf8DhcERtqUOfqaRJ8Pqb7/Nrf/f3eOPhfaK64uzGJ4qg1tPXVGEYPhOBzMm+7fTjgT/7z3/I9//kj1HrHNaVdV1ThzCjL4eyyUw6k27KoS8clwVtyvF4kw2b56KuS+f+/VsePnjA+XTmb/zW7/I3f/t3knUIpWlp5aK4QFflZjnw/OUrrBmLGef9nKjQOk8+fcLT//Ufadbo0tC2sB4WTIIx71jXlTGEtXfu33/AshxTZEJYrNPbyq//9u/yrb/1d/AxkIAYgxmDdemsx0MyxpXO9/OO9nTTbOczrTdaa8aypDFNFY43t1hfELOk3j0LreLcHG945903eeP11y6JNXuSJslJIclskhvi0+lmDJ+cTxttXbi5Ka+TFvJohhYKMU2vl6lhHGjiLK0QEWmQiNIafFTvQqM1ZfbGvQf3eO/NNxmeolFToakl5S7BsS/c3hx5+uxzXOG4LJxO5yRRW8fZ+XxZEJMEMqpJ+ElSG2opNYsls7CunRmZEbL4L7zx6BGP33iITCdUyiTorIeFe4eV8MFEWFrnxcuXKSEIvDptqAitmbCYYmJYPyRT2fuVxANBw5BQ1ttb3n/3bd56/TVEYCv9oXdLlKLKdj5T/Q5jOM2yf7m7O6PLyoPXXsu8bHqtPSpZ7rQSrVpHlpXGOZsvSwNfCJmGHDCK0CvFUJ2Hj17nq195h5hp5Rlz0tcl6Zw56a1xPKyshwVEuDmsnE/n1GqaEjH4SV8JsbwfrYMmUshMaa02REj06OB+YReUN15/nQ/efYu0xmjSK3NyPBxYesu+hWyYX9weaKqoKnennTmdlpR5NlDWrXiePJVIERiln/dl4fWHD3h07waA3R0TxQS26ay9M44r06uKRFSDJpyPK6Gd29ubfEC7cEW5wEmJJzqhkJJpqmmtZTEWcZoYk0D0QlWUS0Xg9uaGNx7cx31jUWOfM9W4QjoiyqGn21LJ3+/rwhgTVLh7dT99VpWmtZgAYZRxLopfE0TLmpgXy+dQ5d7tkdcf3E+Kx5KnmmNy6J3WixyNbJ7Xnka9EOG4OHf7mdZao2mmp74kn3MVaOLCR0XKm8BxXfKhAswT6ioQMjk0ZUZP1BCJrrx+oEhqzMuyZNdqWs6VMs5pmt2SLQ4UzwW5CEWiRMFGKTh5pc4TmHFcO+uhM8/O2tLT1YpS0bqHtSnH3mmqLKY0Ec61sce101rqJ1KHIVFAVlKrqBbJHCC1JxeVB1P60liWTkgCi1G/Lj9PVEqecJpZQWJwSyK0NVNU8we0bolILt1uoSzFrs1bb0XCFakG2RD2yMauBQzJ6ODSAKpyCpiqLC3tnum1bZhY1hPrxU81RBwJo1mA2jWd5VZkxEb9YKE2s1l22s2QXeimudGSaedi+TQVFjXMhG525bZclGYp/QWpzcfFfROBCUg9N5OyyJaOn9IRoUKzhMCoJtdWXuiMeONCmroHZuVKIdftbELzSGsQUjIncvVdXTelUlfUA5kqJld0n453vViChKZ++blJk2t2xphlTlaqh9FEKZE9z2WjuMqrcm26LvZOIG2+CFFp1Ym8thq9Up+poM6XtP6lOxfBLAt+KoRKi2CKEbXRqobXoY/IvoHqu2ImHxdVW9JX/eWfW60N5YOOyEjJA1HRJKTbsxpYRTINI7SsRcUrhV5v6JqySkpUyRMvkimqmTA8g7WpMPxqYUqqfZYfuPC4aQledVKzgAvQME3X+1U/wdEitvL6illS93UXGA5SIw7I9TOqGR0qgqtQ5DumFwBf3680ZZVKTWCx1F5y8aWU6ShA4aQApCwtU16y1VYdX+r7rTbmoj5eOn2tawpRLhYq/XG9D1WjXZQ1gXJBVBG85CKXypc5atAAE0hJi2sEaV1cS1cxqubV35koQ6TohC+j0Szdj2pfOlGydGWuvly/1SIrSVeI/0IqQBLbVwRcapYmzXytQVY94pf3K8WtyVXltIqcS7MrQc205L3jg8Ws0uXMAwZYQEQaMfJ6fMlo+wWsXO4x1++ahGvjRKBdvEymlnLktWBlLotfsGNOvwhIcl3tGlQoeFi2HAQXqU1J6Hz5TqCpRnqZ4zSygy5GGU1Tan2rNtnp0oB5jRKPHGuISB7NPVOYXPiKQnch5dasJbk4LU3SfS91UrneZ0F9UlsRBZXckFbuyHSgpE8NGXjVR2b+HhXCpUiirEO5zlxroVYal8s9VlpsVgvh6ZrGfU9mkoAZmafDkNiZ+5aaxvUkZYKxSg9WYWk4M3KRteTV4bm4Y+w8+/wl66GXzSf1cfGGhJa5wXGdhGcNGRHQyEzrW1WSxPn7dseLlyeG5+ltqgyqAEsiMYlkLqyUSKuFqTXIQxUJ1YOJ6biaNRStKNGroio16jBmmja2fcP2U0rLkhuYi0/BEE/wcs0/GXoq11KLVgaSP/g3/zqePPuMdT3y5uNHLMvK9DyJao1Q0Mhwf34aPHzzLY5rL/P1YN9H2k2jVLs5imDMFJNUdOrJc05+/sknPH/2HFHh4e2R43G5UvIqkrYboC8rL58/4yc/+5T7D17j8eOH9IuBzXqFPzz94jl3d/mdN959l0evPbg2qXNMZuRUVW9rLuIYzDmuU1AXA4YqnM87L54+5WbVZGB9sPQFxmDbzjz57DOeP3/J248f8+C1R4jBHHvp5A7aaMd73N67yfTaLGds5oTpyXsVZM9SETk9UPagMR35k//wB/Hxxz/j9uaWew9u0/nhVfNtKaTlxJws1tj2gQPtEmo+mR4sNSPHBUmEXze29c5FY2+9cXM8pod3TsaYv9D3wLxQ431hbDsfffQJD157jXu3N7TW0s4PWF+Z01mWlqdfG6eXLxnbGSz5pShdIm1DC7iz7ef0TLWF83a6wnkjCb/WWnb4y4qIsI2dGBuqxuk0ePLk57zxxhupX5STEUBa47AeefXiOaGKXjxnaojnQdB2abpTC/Fy0mzbiXW9wd1pN/fu8fM//4z15j7NGqMcESJlfylTQohkB66GioEViznLVC1KWw6pETBRXWmJGyFGFspyyd9teUpb60wmSuZlyuh2UQKPN7f8/OlTjvfu5UGhoGc4Ko3hJ/ZtMGdwOKbAtO/pkLdlRVjwMUvnB+md3oz0HwjL4YAPcrSu5km20s/TPRLMkea3w7ry6ZOf8vTzF3zjl77Jq1cvuMxOWst0tO871lfamp6v8+mUi2yNtS/M8BTnGJWncl37suIBfb1FW2s8efqEl69eZhhXwUp6oyCkJn1hfamTt6eMUA6/i+9WKg5MDCk3utWw5fTyVQnpXDFLLSLKFDC3zK0RXzaCInz88ceM6eXwS1TVD0eQmfp86Q7bdsqRM7kclJle3ytiTN1DC4DkWJoTjNRQ5qBJjtCxj/KRZSPcLCmlbd958uwz+lI0iArSpEx7lw48U+C+b7SWw60igUcewm2c00CCXW2q6d0SwjfUZxbgMVMw0asNJ2F3jJRjfd9SeDJBTGCOcm5c/FSJuDzKDEcu+vScssq5ulO6Vzw157ntGAozrkisMkDGgsDmDpKe33TltCqN+gtK4JZ6QkQaMshTj2UdCE0uLieeUt+fl6lXzVKufSVIJdL6xQZaymQh0XBhO59SPyEQadeNQNKIl8NErxJCW8eWiyNS6b2zHA5l/HBaWzFtmJY6i6DWW+keUqeCRA+hZcdUqDECHznToEWkERcZsl/FfjEpy1Ce+jHPSf4FgKGSN+gh6Xm6GsbKMGFWAywJF+d2wisiVTsXbxfh14do/YAWxTGrxU49Jptca72YgCsGvo48qGYfNrat3IkbIVrz+lsexnmZvN2K0UjKJ0eeUyb22BPGW1qD0oW/MfdZDXeNUI+ss5MgfKBi7HPPeU5tNCXoCuu6pAx69xJZ1nTDV5uTgNCr2UkFkOo/1mXN/qQljOzSy6KZvE2GexJ1F0Z0TGe1Y7nXB+tyqLxexL3kZG3vOX++9MZyaOzbwJZ8OYAG7COwZWWOEyJLOj7K3GetE/uWBbbmNkQcn2nEsGbQc2y5mWFrkpdz32mtYc0YKmSXLiy9sR6OLOtKU1AcHynzakBfF8bIMQhtHVTKEXNpPhvIIddOas5SJN07GiklxqR9+OGH/OjHP2afk307pctEKheOQVt6wbJE0dmIjbJLLkjMJBJViLGz9PQhNTtc0ZOPnAfc/UKj5GlADS4gQoUoj3CUH/hwOPD9n/yY2z/7Di9evmR79YIgeyPTctZrDnSq5oz81QhHzd6rlWRa5r0iXkRG2njIAUwkitG1SjGdMU5crmYW/OVff5+/+v5P+cYH7wPB2Hd8jiRfybmT6UJbFqQpPmrWX2oUkMgsUxxYqxG+i6pJOO32tUccb+7z9rtf5fHjt+v1DpZ1oMbPwrMQ54lVztteZupJa4aTMw6g18KdLvrL6zRAvGgTTc1cBcwWIqih+lLjW1LS7nA8LDy4/5C33/sKbzx+h7uXXxTNEMVPZb1Q6/g4JxMwS/3z1Mv7csRjlEE6QYeKsJ/ucoyh5j6Sy8vxvpyVWfKZKp12C558ccejF5P3v/I1Xrx4nqaE3olIe1Qzxcu4IJGDUNZqXEMN1cbYz3RrV/O56OWejDHPtK+89w7vv/Mu77z1mPfeeczdq7s0DXguJEFGTW1GzJwrv1g64dIMzutciE+nLwvD8/QrVGRFpY7s2LXe9KDNrgLVtp2vBbC3xjtvPeb9tx7y9psP2R8ciJrwQnMUOV30cn2XSpSDxa5esfy3HFhNU5wW7a5EjlMg9DXn2iE9VAKoPqgJYri5ueGzL77g+Ys7Hj96jcOqEGm+kwi0mlaK4bU6HKNeUtDLBTP95krRjDnIMY0c654stDmdOXd8H2w1+TN8S5TjhfnNEkJazgFS7w/xSMolh1XAYyZPhebkFXJ9G8TFzT7GGUFZ2sI+99yofZRc2mpxB8OVLp3T6cy+O2PbSaNe0iHdEkZOTS9xbu5lxsLTNRjpPofkoYZPVDuLpNZNNbCtd7bzzhiDdT1w8Zl5Tcf6GIxtcD6f2c7n/PO5DlRcXJmk/+yiPBRSTVekpNxd4EC01wFOWDL2M2oD7Ry8AAACgElEQVTZZzU8/Ug5RpacTZ6uElJGTQmVMpgbsaNk65+7nlJuRFoktUmZ49K9buWNkkuPYZrvBhHKpZ4b66TBWVRz3rH36kdaXWsk7A2u49Q5ZSTp87WLi77GB1Rpmn5dTVgFkM1vFXr3ywsGMt2nG18IzVdxiCi7J4LDnbYckJbUUfZl6cj0uraXYeKq9bCzb+eMCgU01dKcMxS0r9nItpznb5luAusL1hZsnjO0I2GnlrQoSFlBAy1KPiNgVtOZubJryxlyU/aRzZGVtgw5AixSsuUY7JEP21tPFFQjCn05ABeThF/JPpOE6WFKjKR0Ek7nfaLpQGy916hzNq046WQUGNueRTdSS/exIaWKzno7g5pCa+UnuzwfCUREywiSrYL7XnIBxZAnoeojRw5ayzcfXV9rdYEd1d9Za8Sc+D5SUw+p1xjNgp0aXOYF82B4ifqWBmpJYcEjcgaRpE9Su668TZTyaHi9IYGi0+cYNV3U0qxWnXTUXGK+xGWi61LaRqv0ktg+FygdJ1h6ZRGpYXwpoSw78rHn1FJQsqm2NIx7gpB0qeck14WKz54m3fJJ8eR8pVhOGvucnE8nWluS6a93pyRbnXUME3zmRuVLaHKASGrGRqwm5NN8kKx5b7TMlaPgmTOHV+dduy2UiFSk35pssNbpSB4rGyInxwCiXhzQer6gTCS1aq2NDKROTOVphTGh9xwxUMvR4X3b2LaNsZ9QJm1ZiQj284lm5dH1/F6QqEo8T2C+qExrVCB1E1Vl288pC0hJSZLoTsttE3MSkQYJyOKskg1sa5qvd1LJCMymBkiZIFSSUqnDmAGVB+kyFpEdfk4eIx1iZ850bnoI/w8KKWrBuLwZUAAAAABJRU5ErkJggg==",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture01",x)]},de.Facade01),Object(pf.jsxs)(v,{value:de.Facade02,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade03,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade04,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade05,children:[Object(pf.jsx)("img",{alt:de.Facade05,src:IS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture05",x)]},de.Facade05),Object(pf.jsxs)(v,{value:de.Facade06,children:[Object(pf.jsx)("img",{alt:de.Facade06,src:CS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture06",x)]},de.Facade06),Object(pf.jsxs)(v,{value:de.Facade07,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade08,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade09,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade10,children:[Object(pf.jsx)("img",{alt:de.Facade10,src:FS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture10",x)]},de.Facade10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){n(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",x)})]})})})]})})},OS=n.a.memo((function(){var e,t,l,a,o=Xw(si),i=Xw(Vi),n=Xw(Sr),c=Xw(fs),s=Xw($c),d=Xw(Qn),p=Xw(rs),y=Xw(Kc),g=Xw(Ci),m=Xw(rn),w=Xw(as),x=NP(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),H=S[0],j=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)(!1),U=Object(u.a)(N,2),E=U[0],J=U[1],G=IP(x),X=G.labelText,B=G.setLabelText,K=CP(x),q=FP(x,X),Q=kP(x),Z=OP(x),$=YP(x),ee=LP(x);if(!x)return null;var te=x?c(x.id,!1):new Ow,le=!(null===x||void 0===x?void 0:x.locked),ae={lng:i},oe=function(){o((function(e){var t,l=Object(h.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(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"cuboid-paste"}),Object(pf.jsx)(zP,{keyName:"cuboid-copy"}),le&&Object(pf.jsx)(RP,{keyName:"cuboid-cut"}),Object(pf.jsx)(DP,{keyName:"cuboid-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:x.stackable,onChange:function(e){o((function(e){var t,l=Object(h.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(pf.jsxs)(MP.a,{title:me.t("word.Clear",ae),style:{paddingLeft:"24px"},children:[te.sensorCount>0&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid",ae)+" ("+te.sensorCount+" "+me.t("cuboidMenu.Sensors",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid",ae)+" ("+te.solarPanelModuleCount+" "+me.t("cuboidMenu.SolarPanels",ae)+", "+te.solarPanelCount+" "+me.t("cuboidMenu.Racks",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid",ae)+" ("+te.polygonCount+" "+me.t("cuboidMenu.Polygons",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid",ae)+" ("+te.humanCount+" "+me.t("cuboidMenu.Humans",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid",ae)+" ("+te.treeCount+" "+me.t("cuboidMenu.Trees",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid",ae)+" ("+te.flowerCount+" "+me.t("cuboidMenu.Flowers",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(pf.Fragment,{children:[A&&Object(pf.jsx)(zS,{setDialogVisible:T}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),T(!0)},children:[me.t("word.Color",ae)," ..."]},"cuboid-color")]}),le&&Object(pf.jsxs)(pf.Fragment,{children:[H&&Object(pf.jsx)(kS,{setDialogVisible:j}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),j(!0)},children:[me.t("word.Texture",ae)," ..."]},"cuboid-texture"),C&&Object(pf.jsx)(RS,{setDialogVisible:F}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),F(!0)},children:[me.t("word.Length",ae)," ..."]},"cuboid-length"),D&&Object(pf.jsx)(DS,{setDialogVisible:W}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),W(!0)},children:[me.t("word.Width",ae)," ..."]},"cuboid-width"),Y&&Object(pf.jsx)(WS,{setDialogVisible:L}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),L(!0)},children:[me.t("word.Height",ae)," ..."]},"cuboid-height"),E&&Object(pf.jsx)(MS,{setDialogVisible:J}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),J(!0)},children:[me.t("word.Azimuth",ae)," ..."]},"cuboid-azimuth")]}),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(x){o((function(e){e.objectTypeToAdd=V.Polygon}));var e,t=Ww.getWorldDataById(x.id).pos;switch(m){case 0:e=St;break;case 1:e=Ht;break;case 2:e=jt;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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===x||void 0===x?void 0:x.showLabel),onChange:K,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"cuboid-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})})),YS=n.a.memo((function(){var e,t,l,a=Xw(si),r=Xw(ki),n=Xw(qc),c=Xw(hn),s=Xw(dn),d=Xw(Sr),p=Xw(i.latitude),y=null!==(e=Xw(i.leafDayOfYear1))&&void 0!==e?e:rt,g=null!==(t=Xw(i.leafDayOfYear2))&&void 0!==t?t:nt,m=null!==(l=Xw(i.monthlyIrradianceLosses))&&void 0!==l?l:new Array(12).fill(.05),w=Xw((function(e){return e.world.ground.albedo})),x=Xw(o.groundColor),v=Xw(o.groundImage),b=Xw(o.waterSurface),A=Xw(Vi),T=Xw(as),P={lng:A},S=Xw.getState().countAllElementsByType(!0),H=S.treeCount,j=S.flowerCount,z=S.humanCount,R=S.foundationCount,D=S.cuboidCount,W=S.solarPanelCount,M=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}))},F=function(e){a((function(t){t.viewState.groundColor=e}))},k=function(e){a((function(t){t.world.ground.albedo=e}))},O=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(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"ground-paste"}),z>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllPeople",P)+" ("+z+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Human)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedPeople",P)," (",z,")"]},"ground-remove-all-humans"),H>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllTrees",P)+" ("+H+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Tree)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedTrees",P)," (",H,")"]},"ground-remove-all-trees"),j>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFlowers",P)+" ("+j+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Flower)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFlowers",P)," (",j,")"]},"ground-remove-all-flowers"),W>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllSolarPanels",P)+" ("+W+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.SolarPanel)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedSolarPanels",P)," (",W,")"]},"ground-remove-all-solar-panels"),R>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFoundations",P)+" ("+R+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Foundation)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFoundations",P)," (",R,")"]},"ground-remove-all-foundations"),D>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllCuboids",P)+" ("+D+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Cuboid)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedCuboids",P)," (",D,")"]},"ground-remove-all-cuboids"),M&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.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(h.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"),!M&&r.length>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.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(h.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(MP.a,{title:me.t("word.Color",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsx)(VP.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(){F(a.oldValue)},redo:function(){F(a.newValue)}};d(a),F(l)}})},"ground-color"),Object(pf.jsx)(MP.a,{title:me.t("groundMenu.Vegetation",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(MP.a,{title:me.t("groundMenu.MonthlyIrradianceLoss",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(0,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(1,e)}})]},"irradiance-loss-jan"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(2,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(3,e)}})]},"irradiance-loss-mar"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(4,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(5,e)}})]},"irradiance-loss-may"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(6,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(7,e)}})]},"irradiance-loss-jul"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(8,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(9,e)}})]},"irradiance-loss-sep"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(10,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(11,e)}})]},"irradiance-loss-nov")]})},"monthly-irradiance-loss"),Object(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"60px"},children:[me.t("groundMenu.Albedo",P),":"]}),Object(pf.jsx)(ob.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(){k(a.oldValue)},redo:function(){k(a.newValue)}};d(a),k(l)}}})]},"ground-albedo")})]})})),LS=yb.a.Option,NS=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.humanName=e})),s(!c)}}},children:[Object(pf.jsxs)(LS,{value:ne.Jack,children:[Object(pf.jsx)("img",{alt:ne.Jack,src:Et,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jack",d)]},ne.Jack),Object(pf.jsxs)(LS,{value:ne.Jacob,children:[Object(pf.jsx)("img",{alt:ne.Jacob,src:Vt,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jacob",d)]},ne.Jacob),Object(pf.jsxs)(LS,{value:ne.Jacqueline,children:[Object(pf.jsx)("img",{alt:ne.Jacqueline,src:Jt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jacqueline",d)]},ne.Jacqueline),Object(pf.jsxs)(LS,{value:ne.Jaah,children:[Object(pf.jsx)("img",{alt:ne.Jaah,src:Ut,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaah",d)]},ne.Jaah),Object(pf.jsxs)(LS,{value:ne.Jade,children:[Object(pf.jsx)("img",{alt:ne.Jade,src:Gt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jade",d)]},ne.Jade),Object(pf.jsxs)(LS,{value:ne.Jamelia,children:[Object(pf.jsx)("img",{alt:ne.Jamelia,src:Xt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jamelia",d)]},ne.Jamelia),Object(pf.jsxs)(LS,{value:ne.James,children:[Object(pf.jsx)("img",{alt:ne.James,src:Bt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.James",d)]},ne.James),Object(pf.jsxs)(LS,{value:ne.Jane,children:[Object(pf.jsx)("img",{alt:ne.Jane,src:Kt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jane",d)]},ne.Jane),Object(pf.jsxs)(LS,{value:ne.Jaya,children:[Object(pf.jsx)("img",{alt:ne.Jaya,src:qt,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaya",d)]},ne.Jaya),Object(pf.jsxs)(LS,{value:ne.Jaye,children:[Object(pf.jsx)("img",{alt:ne.Jaye,src:Qt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jaye",d)]},ne.Jaye),Object(pf.jsxs)(LS,{value:ne.Jeanette,children:[Object(pf.jsx)("img",{alt:ne.Jeanette,src:Zt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jeanette",d)]},ne.Jeanette),Object(pf.jsxs)(LS,{value:ne.Jedi,children:[Object(pf.jsx)("img",{alt:ne.Jedi,src:_t,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jedi",d)]},ne.Jedi),Object(pf.jsxs)(LS,{value:ne.Jeff,children:[Object(pf.jsx)("img",{alt:ne.Jeff,src:$t,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jeff",d)]},ne.Jeff),Object(pf.jsxs)(LS,{value:ne.Jena,children:[Object(pf.jsx)("img",{alt:ne.Jena,src:el,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jena",d)]},ne.Jena),Object(pf.jsxs)(LS,{value:ne.Jennifer,children:[Object(pf.jsx)("img",{alt:ne.Jennifer,src:tl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jennifer",d)]},ne.Jennifer),Object(pf.jsxs)(LS,{value:ne.Jess,children:[Object(pf.jsx)("img",{alt:ne.Jess,src:ll,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jess",d)]},ne.Jess),Object(pf.jsxs)(LS,{value:ne.Jett,children:[Object(pf.jsx)("img",{alt:ne.Jett,src:al,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jett",d)]},ne.Jett),Object(pf.jsxs)(LS,{value:ne.Jill,children:[Object(pf.jsx)("img",{alt:ne.Jill,src:ol,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jill",d)]},ne.Jill),Object(pf.jsxs)(LS,{value:ne.Jiya,children:[Object(pf.jsx)("img",{alt:ne.Jiya,src:il,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jiya",d)]},ne.Jiya),Object(pf.jsxs)(LS,{value:ne.Joan,children:[Object(pf.jsx)("img",{alt:ne.Joan,src:rl,height:20,style:{paddingRight:"8px"}})," ",me.t("people.Joan",d)]},ne.Joan),Object(pf.jsxs)(LS,{value:ne.Jocelyn,children:[Object(pf.jsx)("img",{alt:ne.Jocelyn,src:nl,height:20,style:{paddingRight:"23px"}})," ",me.t("people.Jocelyn",d)]},ne.Jocelyn),Object(pf.jsxs)(LS,{value:ne.Joel,children:[Object(pf.jsx)("img",{alt:ne.Joel,src:cl,height:20,style:{paddingRight:"7px"}})," ",me.t("people.Joel",d)]},ne.Joel),Object(pf.jsxs)(LS,{value:ne.Joey,children:[Object(pf.jsx)("img",{alt:ne.Joey,src:sl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joey",d)]},ne.Joey),Object(pf.jsxs)(LS,{value:ne.John,children:[Object(pf.jsx)("img",{alt:ne.John,src:dl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.John",d)]},ne.John),Object(pf.jsxs)(LS,{value:ne.Jonathon,children:[Object(pf.jsx)("img",{alt:ne.Jonathon,src:ul,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jonathon",d)]},ne.Jonathon),Object(pf.jsxs)(LS,{value:ne.Jose,children:[Object(pf.jsx)("img",{alt:ne.Jose,src:fl,height:20,style:{paddingRight:"5px"}})," ",me.t("people.Jose",d)]},ne.Jose),Object(pf.jsxs)(LS,{value:ne.Joseph,children:[Object(pf.jsx)("img",{alt:ne.Joseph,src:hl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joseph",d)]},ne.Joseph),Object(pf.jsxs)(LS,{value:ne.Joshua,children:[Object(pf.jsx)("img",{alt:ne.Joshua,src:pl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joshua",d)]},ne.Joshua),Object(pf.jsxs)(LS,{value:ne.Judd,children:[Object(pf.jsx)("img",{alt:ne.Judd,src:yl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judd",d)]},ne.Judd),Object(pf.jsxs)(LS,{value:ne.Judy,children:[Object(pf.jsx)("img",{alt:ne.Judy,src:gl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judy",d)]},ne.Judy),Object(pf.jsxs)(LS,{value:ne.Julia,children:[Object(pf.jsx)("img",{alt:ne.Julia,src:ml,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Julia",d)]},ne.Julia),Object(pf.jsxs)(LS,{value:ne.Julio,children:[Object(pf.jsx)("img",{alt:ne.Julio,src:wl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Julio",d)]},ne.Julio),Object(pf.jsxs)(LS,{value:ne.Jumapili,children:[Object(pf.jsx)("img",{alt:ne.Jumapili,src:xl,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jumapili",d)]},ne.Jumapili),Object(pf.jsxs)(LS,{value:ne.June,children:[Object(pf.jsx)("img",{alt:ne.June,src:vl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.June",d)]},ne.June),Object(pf.jsxs)(LS,{value:ne.Juro,children:[Object(pf.jsx)("img",{alt:ne.Juro,src:bl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Juro",d)]},ne.Juro),Object(pf.jsxs)(LS,{value:ne.Justin,children:[Object(pf.jsx)("img",{alt:ne.Justin,src:Al,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Justin",d)]},ne.Justin)]})},US=l(305),ES=n.a.memo((function(){var e,t=Xw(si),l=Xw(Sr),a=Xw($r),i=Xw(is),n=Xw(Vi),c=null!==(e=Xw(o.orthographic))&&void 0!==e&&e,s=NP(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(h.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(h.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(US.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=Ww.absoluteHumanOrTreeCoordinates(e,l,o,r);e=n.x,l=n.y,o=n.z}var c=Xw.getState().cameraDirection.clone().normalize().multiplyScalar(.5);e+=c.x,l+=c.y;var d=Object(f.a)(Xw.getState().viewState.cameraPosition);new US.b(d).to([e,l,o],1e3).easing(US.a.Quadratic.In).onUpdate((function(e){!function(e,l,a){var o=Nt.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"human-copy"}),m&&Object(pf.jsx)(RP,{keyName:"human-cut"}),Object(pf.jsx)(DP,{keyName:"human-lock"}),m&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{onClick:function(){g(!y),b.current=!0},style:{paddingLeft:"36px"},children:me.t("peopleMenu.ViewFromThisPerson",{lng:n})},"human-move-view"),m&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"120px"},children:[me.t("peopleMenu.ChangePerson",{lng:n}),": "]}),Object(pf.jsx)(NS,{},"humans")]},"human-change-person")})]}):null})),VS=yb.a.Option,JS=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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=El.fetchSpread(l),r.lz=El.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.flowerType=e})),s(!c)}}},children:[Object(pf.jsxs)(VS,{value:ie.WhiteFlower,children:[Object(pf.jsx)("img",{alt:ie.WhiteFlower,src:Nl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.WhiteFlower",d)]},ie.WhiteFlower),Object(pf.jsxs)(VS,{value:ie.YellowFlower,children:[Object(pf.jsx)("img",{alt:ie.YellowFlower,src:Ul,height:20,style:{paddingRight:"16px"}})," ",me.t("flower.YellowFlower",d)]},ie.YellowFlower),Object(pf.jsxs)(VS,{value:ie.Hibiscus,children:[Object(pf.jsx)("img",{alt:ie.Hibiscus,src:Wl,height:20,style:{paddingRight:"19px"}})," ",me.t("flower.Hibiscus",d)]},ie.Hibiscus),Object(pf.jsxs)(VS,{value:ie.Hydrangea,children:[Object(pf.jsx)("img",{alt:ie.Hydrangea,src:Ml,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hydrangea",d)]},ie.Hydrangea),Object(pf.jsxs)(VS,{value:ie.Spirea,children:[Object(pf.jsx)("img",{alt:ie.Spirea,src:kl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Spirea",d)]},ie.Spirea),Object(pf.jsxs)(VS,{value:ie.Hosta,children:[Object(pf.jsx)("img",{alt:ie.Hosta,src:Il,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hosta",d)]},ie.Hosta),Object(pf.jsxs)(VS,{value:ie.Peony,children:[Object(pf.jsx)("img",{alt:ie.Peony,src:Cl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.Peony",d)]},ie.Peony),Object(pf.jsxs)(VS,{value:ie.Boxwood,children:[Object(pf.jsx)("img",{alt:ie.Boxwood,src:Hl,height:20,style:{paddingRight:"23px"}})," ",me.t("flower.Boxwood",d)]},ie.Boxwood),Object(pf.jsxs)(VS,{value:ie.TallBush,children:[Object(pf.jsx)("img",{alt:ie.TallBush,src:Yl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.TallBush",d)]},ie.TallBush),Object(pf.jsxs)(VS,{value:ie.CactusCombo1,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo1,src:jl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo1",d)]},ie.CactusCombo1),Object(pf.jsxs)(VS,{value:ie.CactusCombo2,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo2,src:zl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo2",d)]},ie.CactusCombo2),Object(pf.jsxs)(VS,{value:ie.CactusCombo3,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo3,src:Rl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo3",d)]},ie.CactusCombo3),Object(pf.jsxs)(VS,{value:ie.CactusCombo4,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo4,src:Dl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo4",d)]},ie.CactusCombo4),Object(pf.jsxs)(VS,{value:ie.RedRose,children:[Object(pf.jsx)("img",{alt:ie.RedRose,src:Fl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.RedRose",d)]},ie.RedRose),Object(pf.jsxs)(VS,{value:ie.Bellflower,children:[Object(pf.jsx)("img",{alt:ie.Bellflower,src:Sl,height:20,style:{paddingRight:"20px"}})," ",me.t("flower.Bellflower",d)]},ie.Bellflower),Object(pf.jsxs)(VS,{value:ie.Sunflower,children:[Object(pf.jsx)("img",{alt:ie.Sunflower,src:Ol,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.Sunflower",d)]},ie.Sunflower),Object(pf.jsxs)(VS,{value:ie.Tulip,children:[Object(pf.jsx)("img",{alt:ie.Tulip,src:Ll,height:20,style:{paddingRight:"24px"}})," ",me.t("flower.Tulip",d)]},ie.Tulip)]})},GS=function(){var e=NP(V.Flower),t=Xw(si),l=Xw(Vi),a=Xw(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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"flower-copy"}),i&&Object(pf.jsx)(RP,{keyName:"flower-cut"}),Object(pf.jsx)(DP,{keyName:"flower-lock"}),i&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("flowerMenu.Type",o),": "]}),Object(pf.jsx)(JS,{},"flowers")]},"flower-change-type")})]})},XS=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(In),s=Xw(Cn),d=Xw(Fn),f=Xw(kn),p=Xw(Sr),y=Xw(Gn),g=Xw(Xn),m=Xw(Ii),w=Xw(Ci),x=NP(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){if(x&&function(e){if(x){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.lineColor)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===x.parentId&&Ww.isIdentical(n.normal,x.normal)&&!n.locked&&n.lineColor!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!d.locked&&d.lineColor!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==(null===x||void 0===x?void 0:x.lineColor))return!0}return!1}}(e))switch(y){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon)l.set(g.id,null!==(r=g.lineColor)&&void 0!==r?r:"black")}}catch(k){a.e(k)}finally{a.f()}var v={name:"Set Line Color for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){f(V.Polygon,v.newValue)}};p(v),f(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var b,A=new Map,T=Object(h.a)(o);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.parentId===x.parentId&&Ww.isIdentical(S.normal,x.normal))A.set(S.id,null!==(P=S.lineColor)&&void 0!==P?P:"gray")}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Line Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:A,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&s(V.Polygon,H.groupId,H.normal,H.newValue)}};p(H),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===x.foundationId)z.set(W.id,null!==(D=W.lineColor)&&void 0!==D?D:"black")}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Line Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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];c(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&d(V.Polygon,M.groupId,M.newValue)}};p(M),d(V.Polygon,x.foundationId,e),w(m+1)}break;default:var I=i(x.id),C=I?I.lineColor:x.lineColor,F={name:"Set Line Color of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(F.changedElementId,F.oldValue)},redo:function(){c(F.changedElementId,F.newValue)}};p(F),c(x.id,e),w(m+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.LineColor",P),onApply:function(){S(A)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},BS=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Rn),s=Xw(Dn),d=Xw(Wn),f=Xw(Mn),p=Xw(Sr),y=Xw(Gn),g=Xw(Xn),m=Xw(Ii),w=Xw(Ci),x=NP(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){if(x&&function(e){if(x){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.color)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.foundationId===x.foundationId&&!n.locked&&n.color!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(h.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===x.parentId&&Ww.isIdentical(d.normal,x.normal)&&!d.locked&&d.color!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==x.color)return!0}return!1}}(e))switch(y){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon)l.set(g.id,null!==(r=g.color)&&void 0!==r?r:"gray")}}catch(k){a.e(k)}finally{a.f()}var v={name:"Set Fill Color for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){f(V.Polygon,v.newValue)}};p(v),f(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var b,A=new Map,T=Object(h.a)(o);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.foundationId===x.foundationId)A.set(S.id,null!==(P=S.color)&&void 0!==P?P:"gray")}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Fill Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&d(V.Polygon,H.groupId,H.newValue)}};p(H),d(V.Polygon,x.foundationId,e),w(m+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.parentId===x.parentId&&Ww.isIdentical(W.normal,x.normal))z.set(W.id,null!==(D=W.color)&&void 0!==D?D:"gray")}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Fill Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:z,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(h.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];c(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&s(V.Polygon,M.groupId,M.normal,M.newValue)}};p(M),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;default:var I=i(x.id),C=I?I.color:x.color,F={name:"Set Fill Color of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(F.changedElementId,F.oldValue)},redo:function(){c(F.changedElementId,F.newValue)}};p(F),c(x.id,e),w(m+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.FillColor",P),onApply:function(){S(A)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},KS=l.p+"static/media/polygon_08_menu.e9d3ae98.png",qS=l.p+"static/media/polygon_10_menu.e1254bdd.png",QS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Gn),d=Xw(Xn),f=Xw(Ii),p=Xw(Ci),y=NP(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=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Ww.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(h.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.textureType)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===y.parentId&&Ww.isIdentical(n.normal,y.normal)&&!n.locked&&n.textureType!==e)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(h.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.foundationId===y.foundationId&&!u.locked&&u.textureType!==e)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.textureType))return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon)l.set(d.id,null!==(r=d.textureType)&&void 0!==r?r:ce.NoTexture)}}catch(k){a.e(k)}finally{a.f()}var g={name:"Set Texture for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S(g.newValue)}};c(g),S(e),p(f+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon&&b.parentId===y.parentId&&Ww.isIdentical(b.normal,y.normal))w.set(b.id,null!==(v=b.textureType)&&void 0!==v?v:ce.NoTexture)}}catch(k){x.e(k)}finally{x.f()}var H={name:"Set Texture for All Polygons on Same Surface",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&T(H.groupId,H.normal,H.newValue)}};c(H),T(y.parentId,y.normal,e),p(f+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===y.foundationId)z.set(W.id,null!==(D=W.textureType)&&void 0!==D?D:ce.NoTexture)}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Texture for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&P(M.groupId,M.newValue)}};c(M),P(y.foundationId,e),p(f+1)}break;default:var I=i(y.id),C=I?I.textureType:y.textureType,F={name:"Set Texture of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(F.changedElementId,F.oldValue)},redo:function(){A(F.changedElementId,F.newValue)}};c(F),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("polygonMenu.FillTexture",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsxs)(b,{value:ce.NoTexture,children:[Object(pf.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(pf.jsxs)(b,{value:ce.Texture01,children:[Object(pf.jsx)("img",{alt:ce.Texture01,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture01",v)]},ce.Texture01),Object(pf.jsxs)(b,{value:ce.Texture02,children:[Object(pf.jsx)("img",{alt:ce.Texture02,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture02",v)]},ce.Texture02),Object(pf.jsxs)(b,{value:ce.Texture03,children:[Object(pf.jsx)("img",{alt:ce.Texture03,src:ZP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture03",v)]},ce.Texture03),Object(pf.jsxs)(b,{value:ce.Texture04,children:[Object(pf.jsx)("img",{alt:ce.Texture04,src:_P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture04",v)]},ce.Texture04),Object(pf.jsxs)(b,{value:ce.Texture05,children:[Object(pf.jsx)("img",{alt:ce.Texture05,src:$P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture05",v)]},ce.Texture05),Object(pf.jsxs)(b,{value:ce.Texture06,children:[Object(pf.jsx)("img",{alt:ce.Texture06,src:eS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture06",v)]},ce.Texture06),Object(pf.jsxs)(b,{value:ce.Texture07,children:[Object(pf.jsx)("img",{alt:ce.Texture07,src:tS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture07",v)]},ce.Texture07),Object(pf.jsxs)(b,{value:ce.Texture08,children:[Object(pf.jsx)("img",{alt:ce.Texture08,src:KS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture08",v)]},ce.Texture08),Object(pf.jsxs)(b,{value:ce.Texture09,children:[Object(pf.jsx)("img",{alt:ce.Texture09,src:"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==",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture09",v)]},ce.Texture09),Object(pf.jsxs)(b,{value:ce.Texture10,children:[Object(pf.jsx)("img",{alt:ce.Texture10,src:qS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture10",v)]},ce.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},ZS=function(){function e(){Object(je.a)(this,e)}return Object(ke.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=Ww.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=Ww.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y}));x.x=v.x=T+w;var S=Ww.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y})),H=Math.max(P.length,S.length)/2;if(H>0)for(var j=0;j0)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}(),_S=function(){function e(){Object(je.a)(this,e)}return Object(ke.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,f=[],p=!Ww.isZero(t.rotation[2]),y=[],g=Object(h.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(je){g.e(je)}finally{g.f()}var w=p?Ww.rotatePolygon(y,t.cx,t.cy,t.rotation[2]):y,x=Ww.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},H={x:x.maxX(),y:0},j=0;j<=T;j++){var z=P+j*r;S.y=H.y=z-b;var R=Ww.polygonIntersections(S,H,w).sort((function(e,t){return e.x-t.x}));S.y=H.y=z+b;var D=Ww.polygonIntersections(S,H,w).sort((function(e,t){return e.x-t.x})),W=Math.max(R.length,D.length)/2;if(W>0)for(var M=0;M0){var q=Ww.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,Ww.changeOrientation(Q,l,a),f.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=Ww.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y}));le.x=ae.x=ie+b;var ne=Ww.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=Ww.relativeCoordinates(ie,(Ae+Te)/2,0,t),He=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);He.referenceId=e.id,Ww.changeOrientation(He,l,a),f.push(He)}}}return f}}]),e}(),$S=yb.a.Option,eH=function(e){var t,l=e.setDialogVisible,o=Xw(si),i=Xw(Vi),n=Xw(ki),c=Xw.getState().solarPanelArrayLayoutParams,s=Xw(an),d=Xw($r),f=Xw(Yi),p=Xw(Ni),y=Xw(pn),g=Xw(Zc),m=Xw(_c),w=Xw(Qc),x=Xw(Sr),v=Xw(Ii),b=Xw(Ci),A=Xw(Fi),T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)({left:0,top:0,bottom:0,right:0}),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useRef)(null),N=Object(r.useRef)(!0),U=Object(r.useRef)(null),E=Object(r.useRef)(null),J=Object(r.useRef)(!1),G=Object(r.useRef)(Xw(a.pvModelName)),X=Object(r.useRef)(Xw(a.rowAxis)),B=Object(r.useRef)(Xw(a.orientation)),K=Object(r.useRef)(Xw(a.tiltAngle)),q=Object(r.useRef)(Xw(a.rowWidth)),Q=Object(r.useRef)(Xw(a.interRowSpacing)),Z=Object(r.useRef)(null!==(t=Xw(a.margin))&&void 0!==t?t:0),_=Object(r.useRef)(Xw(a.poleHeight)),te=Object(r.useRef)(Xw(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=E.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?_S.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current):ZS.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(h.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:Xw.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(h.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(h.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)}}N.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(){N.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.referenceId!==e.id&&Ww.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(pf.jsxs)(pf.Fragment,{children:[R&&Object(pf.jsx)(lb.a,{width:400,visible:R,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){D(!1)},children:me.t("word.Cancel",le)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:E,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(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{disabled:!N.current,onClick:function(){ce(),J.current=!1},children:me.t("word.Apply",le)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){l(!1),A(),N.current=!0,J.current=!1},children:me.t("word.Cancel",le)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:U,onClick:function(){N.current?(ce(),J.current=!0):l(!1)},children:me.t("word.OK",le)},"OK")],onCancel:function(){l(!1),N.current=!0},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!I,bounds:O,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(pf.jsx)("div",{ref:L,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayModel",le)+" ("+Object.keys(f).length+" "+me.t("word.Options",le)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(yb.a,{defaultValue:"Custom",style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,N.current=!0,H(!S)},children:Object.keys(f).map((function(e){return Object(pf.jsx)($S,{value:e,children:e+(f[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",le)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowAxis",le)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,N.current=!0,H(!S)},children:[Object(pf.jsx)($S,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",le)},ee.leftRight),Object(pf.jsx)($S,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",le)},ee.upDown),Object(pf.jsx)($S,{value:ee.eastWest,children:me.t("polygonMenu.SolarPanelArrayEastWestRowAxis",le)},ee.eastWest),Object(pf.jsx)($S,{value:ee.northSouth,children:me.t("polygonMenu.SolarPanelArrayNorthSouthRowAxis",le)},ee.northSouth)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayOrientation",le)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,N.current=!0,H(!S)},children:[Object(pf.jsx)($S,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",le)},$.portrait),Object(pf.jsx)($S,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",le)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayTiltAngle",le)+" ([-90\xb0, 90\xb0]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:-90,max:90,style:{width:"100%"},precision:2,value:parseFloat(Ww.toDegrees(K.current).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){K.current=Ww.toRadians(e),N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowWidth",le)+" ([1-100] "+me.t("solarPanelMenu.Panels",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.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,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayInterRowSpacing",le)+" ([1, 20] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:1,max:20,style:{width:"100%"},precision:2,value:Q.current,step:.5,onChange:function(e){Q.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayMargin",le)+" ([0, 5] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:"100%"},precision:1,value:Z.current,step:.1,onChange:function(e){Z.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleHeight",le)+" ([0, 10] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:0,max:10,style:{width:"100%"},precision:2,value:_.current,step:.1,onChange:function(e){_.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleSpacing",le)+" ([2, 50] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:2,max:50,style:{width:"100%"},precision:2,value:te.current,step:.5,onChange:function(e){te.current=e,N.current=!0,H(!S)}})})]})]})]})},tH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Gn),d=Xw(Xn),f=Xw(Ii),p=Xw(Ci),y=NP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.lineStyle)&&void 0!==t?t:k.Solid),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Ww.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(h.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.lineStyle)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===y.parentId&&Ww.isIdentical(n.normal,y.normal)&&!n.locked&&e!==n.lineStyle)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(h.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&e!==u.lineStyle)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.lineStyle))return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon)l.set(d.id,null!==(r=d.lineStyle)&&void 0!==r?r:k.Solid)}}catch(O){a.e(O)}finally{a.f()}var g={name:"Set Line Style for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){S(g.newValue)}};c(g),S(e),p(f+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon&&b.parentId===y.parentId&&Ww.isIdentical(b.normal,y.normal))w.set(b.id,null!==(v=b.lineStyle)&&void 0!==v?v:k.Solid)}}catch(O){x.e(O)}finally{x.f()}var H={name:"Set Line Style for All Polygons on Same Surface",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){H.groupId&&T(H.groupId,H.normal,H.newValue)}};c(H),T(y.parentId,y.normal,e),p(f+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===y.foundationId)z.set(W.id,null!==(D=W.lineStyle)&&void 0!==D?D:k.Solid)}}catch(O){R.e(O)}finally{R.f()}var M={name:"Set Line Style for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){M.groupId&&P(M.groupId,M.newValue)}};c(M),P(y.foundationId,e),p(f+1)}break;default:var I=i(y.id),C=I?I.lineStyle:y.lineStyle,F={name:"Set Line Style of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(F.changedElementId,F.oldValue)},redo:function(){A(F.changedElementId,F.newValue)}};c(F),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.LineStyle",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"200px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsxs)(b,{value:k.Solid,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px solid dimGray"},children:" "}),me.t("polygonMenu.SolidLine",v)]},k.Solid),Object(pf.jsxs)(b,{value:k.Dashed,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dashed dimGray"},children:" "}),me.t("polygonMenu.DashedLine",v)]},k.Dashed),Object(pf.jsxs)(b,{value:k.Dotted,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dotted dimGray"},children:" "}),me.t("polygonMenu.DottedLine",v)]},k.Dotted)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},lH=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw($r),n=Xw(On),c=Xw(Yn),s=Xw(Ln),d=Xw(Nn),f=Xw(Sr),p=Xw(Gn),y=Xw(Xn),g=Xw(Ii),m=Xw(Ci),w=NP(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=yb.a.Option,S=function(e){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Polygon&&!o.locked&&e!==o.lineWidth)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===w.parentId&&Ww.isIdentical(n.normal,w.normal)&&!n.locked&&n.lineWidth!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!d.locked&&d.lineWidth!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==(null===w||void 0===w?void 0:w.lineWidth))return!0}return!1}}(e))switch(p){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var y,x=t.value;if(x.type===V.Polygon)l.set(x.id,null!==(y=x.lineWidth)&&void 0!==y?y:1)}}catch(k){r.e(k)}finally{r.f()}var v={name:"Set Line Width for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){d(V.Polygon,v.newValue)}};f(v),d(V.Polygon,e),m(g+1);break;case _.AllObjectsOfThisTypeOnSurface:if(i(w)){var b,A=new Map,T=Object(h.a)(a);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.parentId===w.parentId&&Ww.isIdentical(S.normal,w.normal))A.set(S.id,null!==(P=S.lineWidth)&&void 0!==P?P:1)}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Line Width for All Polygons on Same Surface",timestamp:Date.now(),oldValues:A,newValue:e,groupId:w.parentId,normal:w.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&c(V.Polygon,H.groupId,H.normal,H.newValue)}};f(H),c(V.Polygon,w.parentId,w.normal,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,z=new Map,R=Object(h.a)(a);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===w.foundationId)z.set(W.id,null!==(D=W.lineWidth)&&void 0!==D?D:1)}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Line Width for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];n(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&s(V.Polygon,M.groupId,M.newValue)}};f(M),s(V.Polygon,w.foundationId,e),m(g+1)}break;default:var I=o(w.id),C=I?I.lineWidth:w.lineWidth,F={name:"Set Line Width of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(F.changedElementId,F.oldValue)},redo:function(){n(F.changedElementId,F.newValue)}};f(F),n(w.id,e),m(g+1)}};return Object(pf.jsx)(EP,{width:560,title:me.t("polygonMenu.LineWidth",T),onApply:function(){S(b),l(!1),m(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"200px"},value:b,onChange:function(e){return A(e)},children:[Object(pf.jsx)(P,{value:O.One,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"1px solid dimGray"}})},O.One),Object(pf.jsx)(P,{value:O.Two,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"2px solid dimGray"}})},O.Two),Object(pf.jsx)(P,{value:O.Three,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"3px solid dimGray"}})},O.Three),Object(pf.jsx)(P,{value:O.Four,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"4px solid dimGray"}})},O.Four),Object(pf.jsx)(P,{value:O.Five,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"5px solid dimGray"}})},O.Five)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",T)})]})})})]})})},aH=l(830),oH=l(831),iH=yb.a.Option,rH=aH.a.TabPane,nH=function(e){var t,l,a,o,i,n,c,s,d,f,h=e.setDialogVisible,p=Xw(si),y=Xw(Gi),g=Xw(Vi),m=bf(Er),w=Xw(Yi),x=Xw(ln),v=Xw($r),b=Xw(tn),A=Xw(sf).geneticAlgorithmParams,T=Xw(df),P=Xw(uf),S=Xw(af),H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)(!1),k=Object(u.a)(D,2),O=k[0],Y=k[1],L=Object(r.useState)({left:0,top:0,bottom:0,right:0}),N=Object(u.a)(L,2),U=N[0],E=N[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=W.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 Uw),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(){bf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){h(!1)},children:me.t("word.Cancel",de)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!O,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();E({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(pf.jsx)("div",{ref:J,children:e})})},children:Object(pf.jsxs)(aH.a,{defaultActiveKey:P,type:"card",onChange:function(e){p((function(t){t.geneticAlgorithmWizardSelectedTab=e}))},children:[Object(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Parameters",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:G.current,style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",de)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(iH,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",de)},M.YEARLY_TOTAL_OUTPUT),Object(pf.jsx)(iH,{value:M.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",de)},M.DAILY_AVERAGE_OUTPUT),Object(pf.jsx)(iH,{value:M.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",de)},M.YEARLY_AVERAGE_OUTPUT),Object(pf.jsx)(iH,{value:M.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",de)},M.DAILY_PROFIT),Object(pf.jsx)(iH,{value:M.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",de)},M.YEARLY_PROFIT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",de)},C.ROULETTE_WHEEL),Object(pf.jsx)(iH,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",de)},C.TOURNAMENT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",de)+" [10, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",de)+" [5, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Q.current,step:.01,onChange:function(e){Q.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",de)+" (0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:te.current,step:.001,onChange:function(e){te.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",de)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(iH,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",de)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",de)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Variables",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.a,{range:!0,onChange:function(e){ae.current=Ww.toRadians(e[0]),oe.current=Ww.toRadians(e[1]),R(!z)},min:-90,max:90,defaultValue:[Ww.toDegrees(ae.current),Ww.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Constants",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",de)+" ("+Object.keys(w).length+" "+me.t("word.Options",de)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(yb.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(pf.jsx)(iH,{value:e,children:e+(w[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",de)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ue.current,onChange:function(e){ue.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",de)},ee.leftRight),Object(pf.jsx)(iH,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",de)},ee.upDown)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",de)},$.portrait),Object(pf.jsx)(iH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",de)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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")]})})})},cH=n.a.memo(nH),sH=yb.a.Option,dH=aH.a.TabPane,uH=function(e){var t,l,a,o,i,n,c,s,d,f,h,p,y=e.setDialogVisible,g=Xw(si),m=Xw(Gi),w=Xw(Vi),x=bf(Er),v=Xw(Yi),b=Xw(ln),A=Xw($r),T=Xw(tn),P=Xw(sf).particleSwarmOptimizationParams,S=Xw(df),H=Xw(ff),j=Xw(af),z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],C=R[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)({left:0,top:0,bottom:0,right:0}),U=Object(u.a)(N,2),E=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)(j.electricitySellingPrice),Ae=Object(r.useRef)(j.operationalCostPerUnit);Object(r.useEffect)((function(){be.current=j.electricitySellingPrice}),[j.electricitySellingPrice]),Object(r.useEffect)((function(){Ae.current=j.operationalCostPerUnit}),[j.operationalCostPerUnit]);var Te=function(){x||Kh(me.t("message.EvolutionStarted",ue)),g((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.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 Uw),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(){bf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){y(!1)},children:me.t("word.Cancel",ue)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!Y,bounds:E,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(pf.jsx)("div",{ref:G,children:e})})},children:Object(pf.jsxs)(aH.a,{defaultActiveKey:H,type:"card",onChange:function(e){g((function(t){t.particleSwarmOptimizationWizardSelectedTab=e}))},children:[Object(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Parameters",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",ue)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(sH,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",ue)},M.YEARLY_TOTAL_OUTPUT),Object(pf.jsx)(sH,{value:M.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",ue)},M.DAILY_AVERAGE_OUTPUT),Object(pf.jsx)(sH,{value:M.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",ue)},M.YEARLY_AVERAGE_OUTPUT),Object(pf.jsx)(sH,{value:M.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",ue)},M.DAILY_PROFIT),Object(pf.jsx)(sH,{value:M.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",ue)},M.YEARLY_PROFIT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",ue)+" [10, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",ue)+" [5, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:te.current,step:.01,onChange:function(e){te.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",ue)+" [0.001, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Q.current,step:.001,onChange:function(e){Q.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",ue)+" (0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:le.current,step:.001,onChange:function(e){le.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",ue)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(sH,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",ue)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",ue)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Variables",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.a,{range:!0,onChange:function(e){oe.current=Ww.toRadians(e[0]),ie.current=Ww.toRadians(e[1]),C(!D)},min:-90,max:90,defaultValue:[Ww.toDegrees(oe.current),Ww.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Constants",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",ue)+" ("+Object.keys(v).length+" "+me.t("word.Options",ue)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(yb.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(pf.jsx)(sH,{value:e,children:e+(v[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",ue)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:fe.current,onChange:function(e){fe.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",ue)},ee.leftRight),Object(pf.jsx)(sH,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",ue)},ee.upDown)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ge.current,onChange:function(e){ge.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",ue)},$.portrait),Object(pf.jsx)(sH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",ue)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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")]})})})},fH=n.a.memo(uH),hH=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(Gn),i=Xw(Xn),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Polygon),p=Object(r.useState)(void 0!==(null===f||void 0===f?void 0:f.opacity)?f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(o){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Polygon&&e!==i.opacity&&!i.locked)return!0}}catch(p){a.e(p)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Polygon&&c.foundationId===f.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s,d=Object(h.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Polygon&&u.parentId===f.parentId&&Ww.isIdentical(u.normal,f.normal)&&e!==u.opacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.opacity))return!0}return!1}}(e))switch(o){case _.AllObjectsOfThisType:var t,i=new Map,r=Object(h.a)(l);try{for(r.s();!(t=r.n()).done;){var d=t.value;if(d.type===V.Polygon&&!d.locked){var u=d;i.set(d.id,u.opacity),x(u.id,e)}}}catch(I){r.e(I)}finally{r.f()}var p={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(l);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.Polygon&&w.foundationId===f.foundationId&&!w.locked){var A=w;g.set(w.id,A.opacity),x(A.id,e)}}}catch(I){m.e(I)}finally{m.f()}var T={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};a(T),c(n+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(f.parentId){var P,S=new Map,H=Object(h.a)(l);try{for(H.s();!(P=H.n()).done;){var j=P.value;if(j.type===V.Polygon&&j.parentId===f.parentId&&Ww.isIdentical(j.normal,f.normal)&&!j.locked){var z=j;S.set(j.id,z.opacity),x(z.id,e)}}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:f.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};a(R),c(n+1)}break;default:if(f){var D=s(f.id),W=void 0!==D.opacity?D.opacity:void 0!==f.opacity?f.opacity:1,M={name:"Set Polygon Opacity",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(M.changedElementId,M.oldValue)},redo:function(){x(M.changedElementId,M.newValue)}};a(M),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("polygonMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return i(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",w)})]})})})]})})},pH=n.a.memo((function(){var e,t,l,a,o,i,n,c,s=Xw(si),d=Xw(Vi),f=Xw(Sr),p=Xw(as),y=Xw(Ci),g=NP(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"),H=Object(u.a)(S,2),j=H[0],z=H[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),W=D[0],M=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),F=C[0],k=C[1],O=Object(r.useState)(null!==(i=null===g||void 0===g?void 0:g.fontStrokeColor)&&void 0!==i?i:"black"),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(null!==(n=null===g||void 0===g?void 0:g.fontStrokeWidth)&&void 0!==n?n:0),E=Object(u.a)(U,2),J=E[0],G=E[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],He=Object(r.useState)(!1),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De={lng:d},We=Xw((function(e){var t,l=Object(h.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"),M(null!==(a=g.fontOutlineColor)&&void 0!==a?a:"white"),k(null!==(o=g.fontOutlineWidth)&&void 0!==o?o:0),N(null!==(i=g.fontStrokeColor)&&void 0!==i?i:"black"),G(null!==(r=g.fontStrokeWidth)&&void 0!==r?r:0))}),[g]),!g||!We)return null;var Me=!(null===g||void 0===g?void 0:g.locked),Ie=function(e,t){s((function(l){var a,o=Object(h.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(h.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()}}))},Fe=function(e,t){s((function(l){var a,o=Object(h.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()}}))},ke=function(e,t){s((function(l){var a,o=Object(h.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()}}))},Oe=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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()}}))},Ne=function(e,t){s((function(l){var a,o=Object(h.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(h.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()}}))},Ee=function(e,t){s((function(l){var a,o=Object(h.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(){ke(g.id,t.oldValue)},redo:function(){ke(g.id,t.newValue)}};f(t),ke(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(){Oe(g.id,t.oldValue)},redo:function(){Oe(g.id,t.newValue)}};f(t),Oe(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:j,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ye(g.id,t.oldValue)},redo:function(){Ye(g.id,t.newValue)}};f(t),Ye(g.id,j)}},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:F,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Le(g.id,t.oldValue)},redo:function(){Le(g.id,t.newValue)}};f(t),Le(g.id,F)}},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:W,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ne(g.id,t.oldValue)},redo:function(){Ne(g.id,t.newValue)}};f(t),Ne(g.id,W)}},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)}};f(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(){Ee(g.id,t.oldValue)},redo:function(){Ee(g.id,t.newValue)}};f(t),Ee(g.id,L)}};return Object(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"polygon-paste"}),Object(pf.jsx)(zP,{keyName:"polygon-copy"}),Me&&Object(pf.jsx)(RP,{keyName:"polygon-cut"}),((null===We||void 0===We?void 0:We.type)===V.Foundation||(null===We||void 0===We?void 0:We.type)===V.Cuboid)&&Object(pf.jsxs)(MP.a,{title:me.t("polygonMenu.Layout",De),style:{paddingLeft:"24px"},children:[ve&&Object(pf.jsx)(eH,{setDialogVisible:be}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){y(0),be(!0)},style:{paddingLeft:"36px"},children:[me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",De)," ..."]},"solar-panel-layout"),Object(pf.jsxs)(MP.a,{title:me.t("polygonMenu.SolarPanelArrayLayoutGenerativeDesign",De),style:{paddingLeft:"24px"},children:[Pe&&Object(pf.jsx)(cH,{setDialogVisible:Se}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){y(0),Se(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.GeneticAlgorithm",De)," ..."]},"solar-panel-layout-ga"),ze&&Object(pf.jsx)(fH,{setDialogVisible:Re}),Object(pf.jsxs)(tb.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(pf.jsx)(DP,{keyName:"polygon-lock"}),Me&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)}};f(t),Ie(g.id,e.target.checked)}},children:me.t("polygonMenu.Filled",De)})},"polygon-filled"),Me&&g.filled&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){Fe(g.id,l.checked?0:100)},redo:function(){Fe(g.id,l.checked?100:0)}};f(l),Fe(g.id,e.target.checked?100:0)}},children:me.t("polygonMenu.Shiny",De)})},"polygon-shiny"),Me&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)}};f(t),Ce(g.id,e.target.checked)}},children:me.t("polygonMenu.NoOutline",De)})},"polygon-no-outline"),Me&&Object(pf.jsxs)(pf.Fragment,{children:[K&&Object(pf.jsx)(XS,{setDialogVisible:q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),q(!0)},children:[me.t("polygonMenu.LineColor",De)," ..."]},"polygon-line-color"),_&&Object(pf.jsx)(tH,{setDialogVisible:$}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),$(!0)},children:[me.t("polygonMenu.LineStyle",De)," ..."]},"polygon-line-style"),le&&Object(pf.jsx)(lH,{setDialogVisible:ae}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ae(!0)},children:[me.t("polygonMenu.LineWidth",De)," ..."]},"polygon-line-width")]}),Me&&g.filled&&(!g.textureType||g.textureType===ce.NoTexture)&&Object(pf.jsxs)(pf.Fragment,{children:[re&&Object(pf.jsx)(BS,{setDialogVisible:ne}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ne(!0)},children:[me.t("polygonMenu.FillColor",De)," ..."]},"polygon-fill-color")]}),Me&&g.filled&&Object(pf.jsxs)(pf.Fragment,{children:[ue&&Object(pf.jsx)(QS,{setDialogVisible:fe}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),fe(!0)},children:[me.t("polygonMenu.FillTexture",De)," ..."]},"polygon-texture")]}),Me&&g.filled&&Object(pf.jsxs)(pf.Fragment,{children:[ye&&Object(pf.jsx)(hH,{setDialogVisible:ge}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ge(!0)},children:[me.t("polygonMenu.Opacity",De)," ..."]},"polygon-opacity")]}),Me&&Object(pf.jsx)(MP.a,{title:me.t("polygonMenu.TextBox",De),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("word.Text",De)+":",value:x,onChange:function(e){return v(e.target.value)},onPressEnter:Ve,onBlur:Ve})},"polygon-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("word.FontColor",De)+":",value:j,onChange:function(e){return z(e.target.value)},onPressEnter:Ge,onBlur:Ge})},"polygon-font-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("polygonMenu.FontOutlineColor",De)+":",value:W,onChange:function(e){return M(e.target.value)},onPressEnter:Be,onBlur:Be})},"polygon-font-outline-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("polygonMenu.FontOutlineWidth",De)+":",min:0,max:1,step:.01,precision:2,value:F,onChange:function(e){return k(e)},onPressEnter:Xe,onBlur:Xe})},"polygon-font-outline-width"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("polygonMenu.FontStrokeColor",De)+":",value:L,onChange:function(e){return N(e.target.value)},onPressEnter:qe,onBlur:qe})},"polygon-font-stroke-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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")]})})),yH=n.a.memo((function(){var e=Xw(si),t=Xw(Vi),l=NP(V.Polygon),a=Xw(Kn),o=Xw(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(h.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(h.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(pf.jsx)(tb.a.Item,{onClick:function(){r(Q.Delete)},children:me.t("polygonMenu.DeleteVertex",i)},"polygon-vertex-delete")]})})),gH=n.a.memo((function(){var e=Xw(Vi),t=NP(V.Sensor),l=IP(t),a=l.labelText,o=l.setLabelText,i=CP(t),r=FP(t,a);if(!t)return null;var n={lng:e};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"sensor-copy"}),Object(pf.jsx)(RP,{keyName:"sensor-cut"}),Object(pf.jsx)(DP,{keyName:"sensor-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===t||void 0===t?void 0:t.showLabel),onChange:i,children:me.t("labelSubMenu.KeepShowingLabel",n)})},"sensor-show-label"),Object(pf.jsx)(tb.a,{children:Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",n)+":",value:a,onChange:function(e){return o(e.target.value)},onPressEnter:r,onBlur:r})},"sensor-label-text")})]})})),mH=n.a.memo((function(){var e,t,l,a=Xw(si),o=Xw(Vi),i=Xw(Sr),n=Xw($r),c=Xw(Gc),s=NP(V.Light),d=Object(r.useState)(null!==(e=null===s||void 0===s?void 0:s.intensity)&&void 0!==e?e:3),f=Object(u.a)(d,2),p=f[0],y=f[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),H=S[0],j=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(h.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()}}))},W=function(e,t){a((function(l){var a,o=Object(h.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()}}))},M=function(e,t){a((function(l){var a,o=Object(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"light-copy"}),Object(pf.jsx)(RP,{keyName:"light-cut"}),Object(pf.jsx)(DP,{keyName:"light-lock"}),R&&(R.type===V.Roof||R.type===V.Wall)&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:H,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),j(t)}},children:me.t("lightMenu.Inside",z)})},"light-inside"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"80px"},children:[me.t("lightMenu.Intensity",z),":"]}),Object(pf.jsx)(ob.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(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(s.id,e),y(e),a((function(t){t.actionState.lightIntensity=e}))}}(e)}})]},"light-intensity"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"80px"},children:[me.t("lightMenu.MaximumDistance",z),":"]}),Object(pf.jsx)(ob.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(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(s.id,e),x(e),a((function(t){t.actionState.lightDistance=e}))}}(e)}})]},"light-distance")]}),Object(pf.jsx)(MP.a,{title:me.t("word.Color",{lng:o}),style:{paddingLeft:"24px"},children:Object(pf.jsx)(VP.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")]})})),wH=function(){var e,t,l,a,n,c,s,d,u=Xw(si),f=Xw(Vi),h=Xw(Sr),p=Xw.getState().world,y=Xw(o.axes),g=Xw(o.theme),m=null===(e=Xw(o.showAzimuthAngle))||void 0===e||e,w=null===(t=Xw(o.showElevationAngle))||void 0===t||t,x=null===(l=Xw(o.showZenithAngle))||void 0===l||l,v=null!==(a=Xw(o.directLightIntensity))&&void 0!==a?a:1,b=null!==(n=Xw(o.ambientLightIntensity))&&void 0!==n?n:.1,A=null!==(c=Xw(i.airAttenuationCoefficient))&&void 0!==c?c:.01,T=null!==(s=Xw(i.airConvectiveCoefficient))&&void 0!==s?s:5,P=null!==(d=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==d?d:900,S={lng:f},H=Object(r.useMemo)((function(){return Dy(new Date(p.date),p.latitude)}),[p.date,p.latitude]),j={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}))},W=function(e){u((function(t){t.viewState.showElevationAngle=e}))},M=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}))},F=function(e){u((function(t){t.world.airAttenuationCoefficient=e}))},k=function(e){u((function(t){t.world.airConvectiveCoefficient=e}))},O=function(e){u((function(t){t.world.highestTemperatureTimeInMinutes=e}))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(MP.a,{title:me.t("skyMenu.Theme",S),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(pf.jsx)(rb.a,{style:j,value:N.Default,children:me.t("skyMenu.ThemeDefault",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Desert,children:me.t("skyMenu.ThemeDesert",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Dune,children:me.t("skyMenu.ThemeDune",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Forest,children:me.t("skyMenu.ThemeForest",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Grassland,children:me.t("skyMenu.ThemeGrassland",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Hill,children:me.t("skyMenu.ThemeHill",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Lake,children:me.t("skyMenu.ThemeLake",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Mountain,children:me.t("skyMenu.ThemeMountain",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Rural,children:me.t("skyMenu.ThemeRural",S)})]})},"theme"),Object(pf.jsx)(MP.a,{title:me.t("skyMenu.SelectSunAnglesToShow",S),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){W(a.oldValue)},redo:function(){W(a.newValue)}};h(a),W(l)},children:me.t("skyMenu.ShowElevationAngle",S)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){M(a.oldValue)},redo:function(){M(a.newValue)}};h(a),M(l)},children:me.t("skyMenu.ShowZenithAngle",S)})})]})},"sun-angles"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.DirectLightBrightnessAtNoon",S)+" [0.1-2]:"}),Object(pf.jsx)(ob.a,{min:.1,max:2,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(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.AmbientLightBrightnessAtNoon",S)+" [0.01-1]:"}),Object(pf.jsx)(ob.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(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.SunlightAttenuationCoefficientInAir",S)+":"}),Object(pf.jsx)(ob.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(){F(a.oldValue)},redo:function(){F(a.newValue)}};h(a),F(l)}}})]},"air-attenuation-coefficient"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.ConvectiveCoefficientOfAir",S)+" [W/(m\xb2\xd7K)]:"}),Object(pf.jsx)(ob.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(){k(a.oldValue)},redo:function(){k(a.newValue)}};h(a),k(l)}}})]},"air-convective-coefficient"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.HighestTemperatureTimeInMinutes",S)+":"}),Object(pf.jsx)(ob.a,{min:720,max:H.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(){O(a.oldValue)},redo:function(){O(a.newValue)}};h(a),O(l)}}})]},"highest-temperature-time-in-minutes")]})]})},xH=function e(){Object(je.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",H)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.PanelSize",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(yb.a,{disabled:!0,style:{width:"100%"},value:P,onChange:function(e){},children:xH.instance.nominalStrings.map((function(e){return Object(pf.jsx)(bH,{value:e,children:e},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.CellType",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{disabled:!0,style:{width:"100%"},value:j.cellType,onChange:function(e){},children:[Object(pf.jsx)(bH,{value:"Monocrystalline",children:me.t("pvModelPanel.Monocrystalline",H)},"Monocrystalline"),Object(pf.jsx)(bH,{value:"Polycrystalline",children:me.t("pvModelPanel.Polycrystalline",H)},"Polycrystalline"),Object(pf.jsx)(bH,{value:"Thin Film",children:me.t("pvModelPanel.ThinFilm",H)},"Thin Film")]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.BifacialityFactor",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:2,value:j.bifacialityFactor,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("word.Color",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{disabled:!0,style:{width:"100%"},value:j.color,onChange:function(e){},children:[Object(pf.jsx)(bH,{value:"Black",children:me.t("pvModelPanel.Black",H)},"Black"),Object(pf.jsx)(bH,{value:"Blue",children:me.t("pvModelPanel.Blue",H)},"Blue")]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.SolarCellEfficiency",H)+" (%):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:2,value:100*j.efficiency,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.NominalOperatingCellTemperature",H)+" (\xb0C):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:1,value:j.noct,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.TemperatureCoefficientOfPmax",H)+" (%/\xb0C):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(GT.a,{disabled:!0,style:{width:"100%"},value:j.pmaxTC,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:3,children:me.t("word.ApplyTo",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:21,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})]})},TH=yb.a.Option,PH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ni),c=Xw($r),s=Xw(cn),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){a((function(l){var a,o=Object(h.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()}}))},j=function(e,t){a((function(l){var a,o=Object(h.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(h.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&&Ww.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(h.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){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)}H(w.id,e)}},W=function(e,t){return!function(e,t){var l=c(e);if(l){if(l.type===V.Cuboid&&!Ww.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?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},M=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.orientation!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.SolarPanel&&n.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!n.locked&&n.orientation!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s=c(w);if(s)if(s.type===V.Cuboid){var d,u=Object(h.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.SolarPanel&&p.parentId===w.parentId&&Ww.isIdentical(p.normal,w.normal)&&!p.locked&&p.orientation!==e)return!0}}catch(x){u.e(x)}finally{u.f()}}else{var y,g=Object(h.a)(o);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.SolarPanel&&m.parentId===w.parentId&&!m.locked&&m.orientation!==e)return!0}}catch(x){g.e(x)}finally{g.f()}}break;default:if((null===w||void 0===w?void 0:w.orientation)!==e)return!0}return!1}}(e)){switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&W(r,e)){T.current=!0;break}}}catch(ie){l.e(ie)}finally{l.f()}if(T.current)P.current=e,A(w.orientation);else{var n,s=new Map,p=Object(h.a)(o);try{for(p.s();!(n=p.n()).done;){var m=n.value;m.type===V.SolarPanel&&s.set(m.id,m.orientation)}}catch(ie){p.e(ie)}finally{p.f()}var x={name:"Set Orientation for All Solar Panels",timestamp:Date.now(),oldValues:s,newValue:e,undo:function(){var e,t=Object(h.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];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){R(x.newValue)}};d(x),R(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var v,b=Object(h.a)(o);try{for(b.s();!(v=b.n()).done;){var S=v.value;if(S.type===V.SolarPanel&&S.foundationId===w.foundationId&&W(S,e)){T.current=!0;break}}}catch(ie){b.e(ie)}finally{b.f()}if(T.current)P.current=e,A(w.orientation);else{var M,I=new Map,C=Object(h.a)(o);try{for(C.s();!(M=C.n()).done;){var F=M.value;F.type===V.SolarPanel&&F.foundationId===w.foundationId&&I.set(F.id,F.orientation)}}catch(ie){C.e(ie)}finally{C.f()}var k={name:"Set Orientation for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:I,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){k.groupId&&j(k.groupId,k.newValue)}};d(k),j(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var O=c(w);if(O){if(T.current=!1,O.type===V.Cuboid){var Y,L=Object(h.a)(o);try{for(L.s();!(Y=L.n()).done;){var N=Y.value;if(N.type===V.SolarPanel&&N.parentId===w.parentId&&Ww.isIdentical(N.normal,w.normal)&&W(N,e)){T.current=!0;break}}}catch(ie){L.e(ie)}finally{L.f()}}else{var U,E=Object(h.a)(o);try{for(E.s();!(U=E.n()).done;){var J=U.value;if(J.type===V.SolarPanel&&J.parentId===w.parentId&&W(J,e)){T.current=!0;break}}}catch(ie){E.e(ie)}finally{E.f()}}if(T.current)P.current=e,A(w.orientation);else{var G=new Map,X=O.type===V.Cuboid;if(X){var B,K=Object(h.a)(o);try{for(K.s();!(B=K.n()).done;){var q=B.value;q.type===V.SolarPanel&&q.parentId===w.parentId&&Ww.isIdentical(q.normal,w.normal)&&G.set(q.id,q.orientation)}}catch(ie){K.e(ie)}finally{K.f()}}else{var Q,Z=Object(h.a)(o);try{for(Z.s();!(Q=Z.n()).done;){var $=Q.value;$.type===V.SolarPanel&&$.parentId===w.parentId&&G.set($.id,$.orientation)}}catch(ie){Z.e(ie)}finally{Z.f()}}var ee=X?w.normal:void 0,te={name:"Set Orientation for All Solar Panels on Surface",timestamp:Date.now(),oldValues:G,newValue:e,groupId:w.parentId,normal:ee,undo:function(){var e,t=Object(h.a)(te.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){te.groupId&&z(te.groupId,te.normal,te.newValue)}};d(te),z(w.parentId,ee,e),g(y+1)}}break;default:var le=i(w.id),ae=le?le.orientation:w.orientation;if(T.current=W(w,e),T.current)P.current=e,A(ae);else{var oe={name:"Set Orientation of Selected Solar Panel",timestamp:Date.now(),oldValue:ae,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(oe.oldValue)},redo:function(){D(oe.newValue)}};d(oe),D(e),g(y+1)}}a((function(t){t.actionState.solarPanelOrientation=e}))}},I=function(){w&&(A(w.orientation),T.current=!1,l(!1))},C=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(P.current?" ("+(P.current===$.portrait?me.t("solarPanelMenu.Portrait",S):me.t("solarPanelMenu.Landscape",S))+")":""):"";return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.Orientation",S),rejectedMessage:C,onApply:function(){M(b)},onClose:I,onClickCancel:function(){I(),m()},onClickOk:function(){M(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:b,onChange:function(e){return A(e)},children:[Object(pf.jsx)(TH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",S)},$.portrait),Object(pf.jsx)(TH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",S)},$.landscape)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",S)})]})})})]})})},SH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Ni),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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],H=P[1],j=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");H(w.orientation===$.portrait?t.width:t.length)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLx(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t,l){o((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.lx=Ww.panelizeLx(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(h.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=Ww.panelizeLx(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){return!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.lx=t,l.type===V.Wall?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.lx-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.lx-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.lx-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.lx-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&C(a,e)){j.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(j.current)z.current=e,A(w.lx);else{var o,r=new Map,c=Object(h.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&r.set(p.id,p.lx)}}catch(ae){c.e(ae)}finally{c.f()}var m={name:"Set Length for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){I(m.newValue)}};d(m),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){j.current=!1;var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.foundationId===w.foundationId&&C(b,e)){j.current=!0;break}}}catch(ae){v.e(ae)}finally{v.f()}if(j.current)z.current=e,A(w.lx);else{var T,P=new Map,S=Object(h.a)(i);try{for(S.s();!(T=S.n()).done;){var H=T.value;H.type===V.SolarPanel&&H.foundationId===w.foundationId&&P.set(H.id,H.lx)}}catch(ae){S.e(ae)}finally{S.f()}var R={name:"Set Length for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:P,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){R.groupId&&W(R.groupId,R.newValue)}};d(R),W(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=s(w);if(F){if(j.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(i);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===w.parentId&&Ww.isIdentical(Y.normal,w.normal)&&C(Y,e)){j.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(i);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===w.parentId&&C(U,e)){j.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(j.current)z.current=e,A(w.lx);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(i);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===w.parentId&&Ww.isIdentical(B.normal,w.normal)&&E.set(B.id,B.lx)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===w.parentId&&E.set(Q.id,Q.lx)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?w.normal:void 0,$={name:"Set Length for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.parentId,normal:Z,undo:function(){var e,t=Object(h.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];D(a,o)}}catch(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&M($.groupId,$.normal,$.newValue)}};d($),M(w.parentId,Z,e),g(y+1)}}break;default:var ee=n(w.id),te=ee?ee.lx:w.lx;if(j.current=C(w,e),j.current)z.current=e,A(te);else{var le={name:"Set Solar Panel Array Length",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(le.changedElementId,le.oldValue)},redo:function(){D(le.changedElementId,le.newValue)}};d(le),D(w.id,e),g(y+1)}}},k=function(){j.current=!1,a(!1)},O=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",R),rejectedMessage:O,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),j.current||(a(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsWide",R),Object(pf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},HH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Ni),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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],H=P[1],j=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");H(w.orientation===$.portrait?t.length:t.width),A(w.ly)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLy(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t,l){o((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.ly=Ww.panelizeLy(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(h.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=Ww.panelizeLy(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=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&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.ly=t,l.type===V.Wall?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.ly-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.ly-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.ly-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.ly-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&C(a,e)){j.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(j.current)z.current=e,A(w.ly);else{var o,r=new Map,c=Object(h.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&r.set(p.id,p.ly)}}catch(ae){c.e(ae)}finally{c.f()}var m={name:"Set Width for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){I(m.newValue)}};d(m),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){j.current=!1;var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.foundationId===w.foundationId&&C(b,e)){j.current=!0;break}}}catch(ae){v.e(ae)}finally{v.f()}if(j.current)z.current=e,A(w.ly);else{var T,P=new Map,S=Object(h.a)(i);try{for(S.s();!(T=S.n()).done;){var H=T.value;H.type===V.SolarPanel&&H.foundationId===w.foundationId&&P.set(H.id,H.ly)}}catch(ae){S.e(ae)}finally{S.f()}var R={name:"Set Width for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:P,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){R.groupId&&W(R.groupId,R.newValue)}};d(R),W(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=s(w);if(F){if(j.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(i);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===w.parentId&&Ww.isIdentical(Y.normal,w.normal)&&C(Y,e)){j.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(i);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===w.parentId&&C(U,e)){j.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(j.current)z.current=e,A(w.ly);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(i);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===w.parentId&&Ww.isIdentical(B.normal,w.normal)&&E.set(B.id,B.ly)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===w.parentId&&E.set(Q.id,Q.ly)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?w.normal:void 0,$={name:"Set Width for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.parentId,normal:Z,undo:function(){var e,t=Object(h.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];D(a,o)}}catch(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&M($.groupId,$.normal,$.newValue)}};d($),M(w.parentId,Z,e),g(y+1)}}break;default:var ee=n(w.id),te=ee?ee.ly:w.ly;if(j.current=C(w,e),j.current)z.current=e,A(te);else{var le={name:"Set Solar Panel Array Width",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(le.changedElementId,le.oldValue)},redo:function(){D(le.changedElementId,le.newValue)}};d(le),D(w.id,e),g(y+1)}}},k=function(){j.current=!1,a(!1)},O=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",R),rejectedMessage:O,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),j.current||(a(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsLong",R),Object(pf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},jH=function(e){var t,l=e.setDialogVisible,a=e.isOnWall,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(tc),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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)(),H=$f(),j=function(e,t,l){o((function(a){var o,i=Object(h.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(h.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&&Ww.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(h.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){if(a&&(e=-e),w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.tiltAngle-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.tiltAngle-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.tiltAngle-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.tiltAngle-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&.5*r.ly*Math.abs(Math.sin(e))>r.poleHeight){P.current=!0;break}}}catch(oe){l.e(oe)}finally{l.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var p,m=new Map,x=Object(h.a)(i);try{for(x.s();!(p=x.n()).done;){var v=p.value;v.type===V.SolarPanel&&m.set(v.id,v.tiltAngle)}}catch(oe){x.e(oe)}finally{x.f()}var b={name:"Set Tilt Angle for All Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}b.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){R(b.newValue,!a)}};d(b),R(e,!a),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){P.current=!1;var A,H=Object(h.a)(i);try{for(H.s();!(A=H.n()).done;){var D=A.value;if(D.type===V.SolarPanel&&D.foundationId===w.foundationId&&D.parentType!==V.Wall&&.5*D.ly*Math.abs(Math.sin(e))>D.poleHeight){P.current=!0;break}}}catch(oe){H.e(oe)}finally{H.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var W,M=new Map,I=Object(h.a)(i);try{for(I.s();!(W=I.n()).done;){var C=W.value;C.type===V.SolarPanel&&C.foundationId===w.foundationId&&M.set(C.id,C.tiltAngle)}}catch(oe){I.e(oe)}finally{I.f()}var F={name:"Set Tilt Angle for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}F.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){F.groupId&&j(F.groupId,F.newValue,!a)}};d(F),j(w.foundationId,e,!a),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var k=s(w);if(k){P.current=!1;var O=k.type===V.Cuboid;if(O){var Y,L=Object(h.a)(i);try{for(L.s();!(Y=L.n()).done;){var N=Y.value;if(N.type===V.SolarPanel&&N.parentId===w.parentId&&Ww.isIdentical(N.normal,w.normal)&&.5*N.ly*Math.abs(Math.sin(e))>N.poleHeight){P.current=!0;break}}}catch(oe){L.e(oe)}finally{L.f()}}else if(w.parentType===V.Wall)P.current=!1;else{var U,E=Object(h.a)(i);try{for(E.s();!(U=E.n()).done;){var J=U.value;if(J.type===V.SolarPanel&&J.parentId===w.parentId&&.5*J.ly*Math.abs(Math.sin(e))>J.poleHeight){P.current=!0;break}}}catch(oe){E.e(oe)}finally{E.f()}}if(P.current)S.current=e,T(w.tiltAngle);else{var G=new Map;if(O){var X,B=Object(h.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;K.type===V.SolarPanel&&K.parentId===w.parentId&&Ww.isIdentical(K.normal,w.normal)&&G.set(K.id,K.tiltAngle)}}catch(oe){B.e(oe)}finally{B.f()}}else{var q,Q=Object(h.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;Z.type===V.SolarPanel&&Z.parentId===w.parentId&&G.set(Z.id,Z.tiltAngle)}}catch(oe){Q.e(oe)}finally{Q.f()}}var $=O?w.normal:void 0,ee={name:"Set Tilt Angle for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:G,newValue:e,groupId:w.parentId,normal:$,undo:function(){var e,t=Object(h.a)(ee.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(oe){t.e(oe)}finally{t.f()}ee.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){ee.groupId&&z(ee.groupId,ee.normal,ee.newValue)}};d(ee),z(w.parentId,$,e),g(y+1)}}break;default:var te=n(w.id),le=te?te.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(le);else{var ae={name:"Set Solar Panel Array Tilt Angle",timestamp:Date.now(),oldValue:le,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){c(ae.changedElementId,ae.oldValue)},redo:function(){c(ae.changedElementId,ae.newValue)}};d(ae),c(w.id,e),g(y+1)}}o((function(t){t.actionState.solarPanelTiltAngle=e}))}},W=function(){P.current=!1,l(!1)},M=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+Ww.toDegrees(S.current).toFixed(1)+"\xb0)":null):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.TiltAngle",H),rejectedMessage:M,onApply:function(){D(A)},onClose:W,onClickCancel:function(){W(),m()},onClickOk:function(){D(A),P.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:a?0:-90,max:90,style:{width:120},precision:2,value:parseFloat(Ww.toDegrees(A).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){T(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [",a?"0\xb0":"-90\xb0",", 90\xb0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.SouthFacingIsPositive",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},zH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(ic),c=Xw(rc),s=Xw(nc),d=Xw(cc),f=Xw($r),p=Xw(Sr),y=Xw(Zn),g=Xw(_n),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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],H=P[1],j=$f(),z=function(e,t){return!function(e,t){var l=f(e);if(l){if(l.type===V.Cuboid&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.relativeAzimuth=-t,l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.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){var i=a;if(Math.abs(-i.relativeAzimuth-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.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&&c.parentType!==V.Wall){var s=c;if(Math.abs(-s.relativeAzimuth-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(null===v||void 0===v?void 0:v.parentId){var d=f(v);if(d)if(d.type===V.Cuboid){var u,p=Object(h.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Ww.isIdentical(g.normal,v.normal)&&!g.locked){var m=g;if(Math.abs(-m.relativeAzimuth-e)>At)return!0}}}catch(T){p.e(T)}finally{p.f()}}else{var w,x=Object(h.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.relativeAzimuth-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.relativeAzimuth)-e)>At)return!0}return!1}}(e)){switch(A.current=void 0,y){case _.AllObjectsOfThisType:b.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&z(r,e)){b.current=!0;break}}}catch(oe){l.e(oe)}finally{l.f()}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var g,x=new Map,T=Object(h.a)(o);try{for(T.s();!(g=T.n()).done;){var P=g.value;P.type===V.SolarPanel&&P.parentType!==V.Wall&&x.set(P.id,-P.relativeAzimuth)}}catch(oe){T.e(oe)}finally{T.f()}var S={name:"Set Relative Azimuth for All Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}},redo:function(){d(V.SolarPanel,-S.newValue)}};p(S),d(V.SolarPanel,-e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){b.current=!1;var j,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.SolarPanel&&D.foundationId===v.foundationId&&D.parentType!==V.Wall&&z(D,e)){b.current=!0;break}}}catch(oe){R.e(oe)}finally{R.f()}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var W,M=new Map,I=Object(h.a)(o);try{for(I.s();!(W=I.n()).done;){var C=W.value;C.type===V.SolarPanel&&C.foundationId===v.foundationId&&C.parentType!==V.Wall&&M.set(C.id,-C.relativeAzimuth)}}catch(oe){I.e(oe)}finally{I.f()}var F={name:"Set Relative Azimuth for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}},redo:function(){F.groupId&&s(V.SolarPanel,F.groupId,-F.newValue)}};p(F),s(V.SolarPanel,v.foundationId,-e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:if(v.parentId){var k=f(v);if(k){if(b.current=!1,k.type===V.Cuboid){var O,Y=Object(h.a)(o);try{for(Y.s();!(O=Y.n()).done;){var L=O.value;if(L.type===V.SolarPanel&&L.parentId===v.parentId&&Ww.isIdentical(L.normal,v.normal)&&z(L,e)){b.current=!0;break}}}catch(oe){Y.e(oe)}finally{Y.f()}}else{var N,U=Object(h.a)(o);try{for(U.s();!(N=U.n()).done;){var E=N.value;if(E.type===V.SolarPanel&&E.parentId===v.parentId&&z(E,e)){b.current=!0;break}}}catch(oe){U.e(oe)}finally{U.f()}}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var J=new Map,G=k.type===V.Cuboid;if(G){var X,B=Object(h.a)(o);try{for(B.s();!(X=B.n()).done;){var K=X.value;K.type===V.SolarPanel&&K.parentId===v.parentId&&Ww.isIdentical(K.normal,v.normal)&&J.set(K.id,-K.relativeAzimuth)}}catch(oe){B.e(oe)}finally{B.f()}}else{var q,Q=Object(h.a)(o);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;Z.type===V.SolarPanel&&Z.parentId===v.parentId&&J.set(Z.id,-Z.relativeAzimuth)}}catch(oe){Q.e(oe)}finally{Q.f()}}var $=G?v.normal:void 0,ee={name:"Set Relative Azimuth for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:J,newValue:e,groupId:v.parentId,normal:$,undo:function(){var e,t=Object(h.a)(ee.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(oe){t.e(oe)}finally{t.f()}},redo:function(){ee.groupId&&c(V.SolarPanel,ee.groupId,ee.normal,-ee.newValue)}};p(ee),c(V.SolarPanel,v.parentId,$,-e),w(m+1)}}}break;default:var te=i(v.id),le=te?-te.relativeAzimuth:-v.relativeAzimuth;if(b.current=z(v,e),b.current)A.current=e,H(le);else{var ae={name:"Set Solar Panel Array Relative Azimuth",timestamp:Date.now(),oldValue:le,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(ae.changedElementId,-ae.oldValue)},redo:function(){n(ae.changedElementId,-ae.newValue)}};p(ae),n(v.id,-e),w(m+1)}}a((function(t){t.actionState.solarPanelRelativeAzimuth=-e}))}},D=function(){b.current=!1,l(!1)},W=b.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==A.current?" ("+Ww.toDegrees(A.current).toFixed(1)+"\xb0)":null):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarCollectorMenu.RelativeAzimuth",j),rejectedMessage:W,onApply:function(){R(S)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(S),b.current||(l(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},precision:2,step:1,value:parseFloat(Ww.toDegrees(S).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){H(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",j),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",j)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},RH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=NP(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=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.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(h.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&&Ww.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.trackerType!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.SolarPanel&&c.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!c.locked&&c.trackerType!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d=n(y);if(d)if(d.type===V.Cuboid){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.SolarPanel&&p.parentId===y.parentId&&Ww.isIdentical(p.normal,y.normal)&&!p.locked&&p.trackerType!==e)return!0}}catch(x){f.e(x)}finally{f.f()}}else{var g,m=Object(h.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.SolarPanel&&w.parentId===y.parentId&&!w.locked&&w.trackerType!==e)return!0}}catch(x){m.e(x)}finally{m.f()}}break;default:if((null===y||void 0===y?void 0:y.trackerType)!==e)return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;r.type===V.SolarPanel&&l.set(r.id,r.trackerType)}}catch(L){a.e(L)}finally{a.f()}var d={name:"Set Tracker Type for All Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){S(d.newValue)}};c(d),S(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.SolarPanel&&x.foundationId===y.foundationId&&m.set(x.id,x.trackerType)}}catch(L){w.e(L)}finally{w.f()}var v={name:"Set Tracker Type for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){v.groupId&&T(v.groupId,v.newValue)}};c(v),T(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var b=n(y);if(b){var H=new Map,j=b.type===V.Cuboid;if(j){var z,R=Object(h.a)(o);try{for(R.s();!(z=R.n()).done;){var D=z.value;D.type===V.SolarPanel&&D.parentId===y.parentId&&Ww.isIdentical(D.normal,y.normal)&&H.set(D.id,D.trackerType)}}catch(L){R.e(L)}finally{R.f()}}else{var W,M=Object(h.a)(o);try{for(M.s();!(W=M.n()).done;){var I=W.value;I.type===V.SolarPanel&&I.parentId===y.parentId&&H.set(I.id,I.trackerType)}}catch(L){M.e(L)}finally{M.f()}}var C=j?y.normal:void 0,F={name:"Set Tracker Type for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:H,newValue:e,groupId:y.parentId,normal:C,undo:function(){var e,t=Object(h.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];A(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){F.groupId&&P(F.groupId,F.normal,F.newValue)}};c(F),P(y.parentId,C,e),p(f+1)}break;default:var k=i(y.id),O=k?k.trackerType:y.trackerType,Y={name:"Set Solar Panel Array Tracker Type",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(Y.changedElementId,Y.oldValue)},redo:function(){A(Y.changedElementId,Y.newValue)}};c(Y),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.Tracker",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsxs)(yb.a,{style:{width:"120px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsx)(b,{value:te.NO_TRACKER,title:me.t("solarPanelMenu.NoTracker",v),children:me.t("word.None",v)},"NONE"),Object(pf.jsx)(b,{value:te.HORIZONTAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.HorizontalSingleAxisTracker",v),children:"HSAT"},"HSAT"),Object(pf.jsx)(b,{value:te.VERTICAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.VerticalSingleAxisTracker",v),children:"VSAT"},"VSAT"),Object(pf.jsx)(b,{value:te.ALTAZIMUTH_DUAL_AXIS_TRACKER,title:me.t("solarPanelMenu.AltazimuthDualAxisTracker",v),children:"AADAT"},"AADAT")]}),Object(pf.jsx)("div",{style:{paddingTop:"20px",paddingRight:"10px",textAlign:"left",fontSize:"11px"},children:me.t("solarPanelMenu.SolarTrackerFollowsSun",v)})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},DH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(dc),s=Xw(uc),d=Xw(fc),f=Xw($r),p=Xw(Sr),y=Xw(Zn),g=Xw(_n),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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),H=Object(r.useRef)(),j=$f(),z=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){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(h.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=f(v);if(d)if(d.type===V.Cuboid){var u,p=Object(h.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Ww.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(h.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(H.current=void 0,y){case _.AllObjectsOfThisType:S.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){S.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(S.current)H.current=e,P(v.poleHeight);else{var g,x=new Map,b=Object(h.a)(o);try{for(b.s();!(g=b.n()).done;){var A=g.value;A.type===V.SolarPanel&&x.set(A.id,A.poleHeight)}}catch(ae){b.e(ae)}finally{b.f()}var T={name:"Set Pole Height for All Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){d(V.SolarPanel,T.newValue)}};p(T),d(V.SolarPanel,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var j,z=Object(h.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.SolarPanel&&R.foundationId===v.foundationId&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){S.current=!0;break}}}catch(ae){z.e(ae)}finally{z.f()}if(S.current)H.current=e,P(v.poleHeight);else{var D,W=new Map,M=Object(h.a)(o);try{for(M.s();!(D=M.n()).done;){var I=D.value;I.type===V.SolarPanel&&I.foundationId===v.foundationId&&W.set(I.id,I.poleHeight)}}catch(ae){M.e(ae)}finally{M.f()}var C={name:"Set Pole Height for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:W,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){C.groupId&&s(V.SolarPanel,C.groupId,C.newValue)}};p(C),s(V.SolarPanel,v.foundationId,e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=f(v);if(F){if(S.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(o);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===v.parentId&&Ww.isIdentical(Y.normal,v.normal)&&.5*Y.ly*Math.abs(Math.sin(Y.tiltAngle))>e){S.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(o);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===v.parentId&&.5*U.ly*Math.abs(Math.sin(U.tiltAngle))>e){S.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(S.current)H.current=e,P(v.poleHeight);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(o);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===v.parentId&&Ww.isIdentical(B.normal,v.normal)&&E.set(B.id,B.poleHeight)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(o);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===v.parentId&&E.set(Q.id,Q.poleHeight)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?v.normal:void 0,$={name:"Set Pole Height for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:v.parentId,normal:Z,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&c(V.SolarPanel,$.groupId,$.normal,$.newValue)}};p($),c(V.SolarPanel,v.parentId,Z,e),w(m+1)}}break;default:var ee=i(v.id),te=ee?ee.poleHeight:v.poleHeight;if(S.current=.5*v.ly*Math.abs(Math.sin(v.tiltAngle))>e,S.current)H.current=e,P(te);else{var le={name:"Set Solar Panel Array Pole Height",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(le.changedElementId,le.oldValue)},redo:function(){n(le.changedElementId,le.newValue)}};p(le),n(v.id,e),w(m+1)}}a((function(t){t.actionState.solarPanelPoleHeight=e}))}},R=function(){S.current=!1,l(!1)},D=S.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==H.current?" ("+H.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarCollectorMenu.PoleHeight",j),rejectedMessage:D,onApply:function(){z(T)},onClose:R,onClickCancel:function(){R(),x()},onClickOk:function(){z(T),S.current||(l(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:10,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 10] ",me.t("word.MeterAbbreviation",j)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},WH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=NP(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(h.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(h.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(h.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&&Ww.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(h.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){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var i=a;if(Math.abs(i.poleSpacing-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,c=Object(h.a)(o);try{for(c.s();!(r=c.n()).done;){var d=r.value;if(d.type===V.SolarPanel&&d.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!d.locked){var u=d;if(Math.abs(u.poleSpacing-e)>At)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeOnSurface:var f=n(y);if(f)if(f.type===V.Cuboid){var p,g=Object(h.a)(o);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(m.type===V.SolarPanel&&m.parentId===y.parentId&&Ww.isIdentical(m.normal,y.normal)&&!m.locked){var w=m;if(Math.abs(w.poleSpacing-e)>At)return!0}}}catch(T){g.e(T)}finally{g.f()}}else{var x,v=Object(h.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){var A=b;if(Math.abs(A.poleSpacing-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var d=t.value;d.type===V.SolarPanel&&l.set(d.id,d.poleSpacing)}}catch(N){r.e(N)}finally{r.f()}var g={name:"Set Pole Spacing for All Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){P(g.newValue)}};c(g),P(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;v.type===V.SolarPanel&&v.foundationId===y.foundationId&&w.set(v.id,v.poleSpacing)}}catch(N){x.e(N)}finally{x.f()}var S={name:"Set Pole Spacing for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(N){t.e(N)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};c(S),A(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var H=n(y);if(H){var j=new Map,z=H.type===V.Cuboid;if(z){var R,D=Object(h.a)(o);try{for(D.s();!(R=D.n()).done;){var W=R.value;W.type===V.SolarPanel&&W.parentId===y.parentId&&Ww.isIdentical(W.normal,y.normal)&&j.set(W.id,W.poleSpacing)}}catch(N){D.e(N)}finally{D.f()}}else{var M,I=Object(h.a)(o);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type===V.SolarPanel&&C.parentId===y.parentId&&j.set(C.id,C.poleSpacing)}}catch(N){I.e(N)}finally{I.f()}}var F=z?y.normal:void 0,k={name:"Set Pole Spacing for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:j,newValue:e,groupId:y.parentId,normal:F,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(N){t.e(N)}finally{t.f()}},redo:function(){k.groupId&&T(k.groupId,k.normal,k.newValue)}};c(k),T(y.parentId,F,e),p(f+1)}break;default:var O=i(y.id),Y=O?O.poleSpacing:y.poleSpacing,L={name:"Set Solar Panel Array Pole Spacing",timestamp:Date.now(),oldValue:Y,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(L.changedElementId,L.oldValue)},redo:function(){b(L.changedElementId,L.newValue)}};c(L),b(y.id,e),p(f+1)}a((function(t){t.actionState.solarPanelPoleSpacing=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.PoleSpacing",v),onApply:function(){S(w),l(!1),p(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:1,style:{width:120},precision:2,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [1, 10] ",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},MH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw($r),s=Xw(Sr),d=Xw(Zn),f=Xw(_n),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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(h.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&&Ww.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(h.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()}}))},H=function(e){if(g&&function(e){if(g){switch(d){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.frameColor!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.SolarPanel&&n.foundationId===(null===g||void 0===g?void 0:g.foundationId)&&!n.locked&&n.frameColor!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s=c(g);if(s)if(s.type===V.Cuboid){var u,f=Object(h.a)(i);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.SolarPanel&&p.parentId===g.parentId&&Ww.isIdentical(p.normal,g.normal)&&!p.locked&&p.frameColor!==e)return!0}}catch(x){f.e(x)}finally{f.f()}}else{var y,m=Object(h.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.SolarPanel&&w.parentId===g.parentId&&!w.locked&&w.frameColor!==e)return!0}}catch(x){m.e(x)}finally{m.f()}}break;default:if((null===g||void 0===g?void 0:g.frameColor)!==e)return!0}return!1}}(e)){switch(d){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var r,f=t.value;if(f.type===V.SolarPanel)l.set(f.id,null!==(r=f.frameColor)&&void 0!==r?r:"white")}}catch(G){a.e(G)}finally{a.f()}var m={name:"Set Frame Color for All Solar Panels",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){S(m.newValue)}};s(m),S(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var w,x=new Map,v=Object(h.a)(i);try{for(v.s();!(w=v.n()).done;){var b,H=w.value;if(H.type===V.SolarPanel&&H.foundationId===g.foundationId)x.set(H.id,null!==(b=H.frameColor)&&void 0!==b?b:"white")}}catch(G){v.e(G)}finally{v.f()}var j={name:"Set Frame Color for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:g.foundationId,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){j.groupId&&T(j.groupId,j.newValue)}};s(j),T(g.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var z=c(g);if(z){var R=new Map,D=z.type===V.Cuboid;if(D){var W,M=Object(h.a)(i);try{for(M.s();!(W=M.n()).done;){var I,C=W.value;if(C.type===V.SolarPanel&&C.parentId===g.parentId&&Ww.isIdentical(C.normal,g.normal))R.set(C.id,null!==(I=C.frameColor)&&void 0!==I?I:"white")}}catch(G){M.e(G)}finally{M.f()}}else{var F,k=Object(h.a)(i);try{for(k.s();!(F=k.n()).done;){var O,Y=F.value;if(Y.type===V.SolarPanel&&Y.parentId===g.parentId)R.set(Y.id,null!==(O=Y.frameColor)&&void 0!==O?O:"white")}}catch(G){k.e(G)}finally{k.f()}}var L=D?g.normal:void 0,N={name:"Set Frame Color for All Solar Panels on Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:g.parentId,normal:L,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){N.groupId&&P(N.groupId,N.normal,N.newValue)}};s(N),P(g.parentId,L,e),y(p+1)}break;default:var U=n(g.id),E=U?U.frameColor:g.frameColor,J={name:"Set Frame Color of Selected Solar Panel",timestamp:Date.now(),oldValue:E,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(g.id,J.oldValue)},redo:function(){A(g.id,J.newValue)}};s(J),A(g.id,e),y(p+1)}o((function(t){t.actionState.solarPanelFrameColor=e}))}};return Object(pf.jsx)(EP,{width:680,title:me.t("solarPanelMenu.FrameColor",b),onApply:function(){H(x)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){f(e.target.value)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",b)})]})})})]})})},IH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=Xw((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(h.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(h.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(h.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&&Ww.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(h.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){var t,l;if(y&&function(e){var t;switch(s){case _.AllObjectsOfThisType:var l,a=Object(h.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;if(i.type===V.SolarPanel&&!i.locked){var r,c=i;if(Math.abs((null!==(r=c.inverterEfficiency)&&void 0!==r?r:.95)-e)>At)return!0}}}catch(z){a.e(z)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(h.a)(o);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(f.type===V.SolarPanel&&f.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!f.locked){var p,g=f;if(Math.abs((null!==(p=g.inverterEfficiency)&&void 0!==p?p:.95)-e)>At)return!0}}}catch(z){u.e(z)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=n(y);if(m)if(m.type===V.Cuboid){var w,x=Object(h.a)(o);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.SolarPanel&&v.parentId===y.parentId&&Ww.isIdentical(v.normal,y.normal)&&!v.locked){var b,A=v;if(Math.abs((null!==(b=A.inverterEfficiency)&&void 0!==b?b:.95)-e)>At)return!0}}}catch(z){x.e(z)}finally{x.f()}}else{var T,P=Object(h.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 H,j=S;if(Math.abs((null!==(H=j.inverterEfficiency)&&void 0!==H?H:.95)-e)>At)return!0}}}catch(z){P.e(z)}finally{P.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 _.AllObjectsOfThisType:var a,r=new Map,d=Object(h.a)(o);try{for(d.s();!(a=d.n()).done;){var g,m=a.value;if(m.type===V.SolarPanel)r.set(m.id,null!==(g=m.inverterEfficiency)&&void 0!==g?g:.95)}}catch(X){d.e(X)}finally{d.f()}var w={name:"Set Inverter Efficiency for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(X){t.e(X)}finally{t.f()}},redo:function(){P(w.newValue)}};c(w),P(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var x,v=new Map,S=Object(h.a)(o);try{for(S.s();!(x=S.n()).done;){var H,j=x.value;if(j.type===V.SolarPanel&&j.foundationId===y.foundationId)v.set(j.id,null!==(H=j.inverterEfficiency)&&void 0!==H?H:.95)}}catch(X){S.e(X)}finally{S.f()}var z={name:"Set Inverter Efficiency for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){z.groupId&&A(z.groupId,z.newValue)}};c(z),A(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var R=n(y);if(R){var D=new Map,W=R.type===V.Cuboid;if(W){var M,I=Object(h.a)(o);try{for(I.s();!(M=I.n()).done;){var C,F=M.value;if(F.type===V.SolarPanel&&F.parentId===y.parentId&&Ww.isIdentical(F.normal,y.normal))D.set(F.id,null!==(C=F.inverterEfficiency)&&void 0!==C?C:.95)}}catch(X){I.e(X)}finally{I.f()}}else{var k,O=Object(h.a)(o);try{for(O.s();!(k=O.n()).done;){var Y,L=k.value;if(L.type===V.SolarPanel&&L.parentId===y.parentId)D.set(L.id,null!==(Y=L.inverterEfficiency)&&void 0!==Y?Y:.95)}}catch(X){O.e(X)}finally{O.f()}}var N=W?y.normal:void 0,U={name:"Set Inverter Efficiency for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:D,newValue:e,groupId:y.parentId,normal:N,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&T(U.groupId,U.normal,U.newValue)}};c(U),T(y.parentId,N,e),p(f+1)}break;default:var E=i(y.id),J=E?null!==(t=E.inverterEfficiency)&&void 0!==t?t:.95:null!==(l=y.inverterEfficiency)&&void 0!==l?l:.95,G={name:"Set Solar Panel Array Inverter Efficiency",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(G.changedElementId,G.oldValue)},redo:function(){b(G.changedElementId,G.newValue)}};c(G),b(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.InverterEfficiency",v),onApply:function(){S(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.5,max:1,step:.01,style:{width:120},precision:2,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[0.5, 1.0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.InverterEfficiencyExplained",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},CH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(Vi),i=Xw(ki),n=Xw(Zr),c=Xw($r),s=Xw(Sr),d=Xw(Zn),f=Xw(_n),p=Xw(Ii),y=Xw(Ci),g=Xw(Fi),m=Xw((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],H=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useRef)(null),W=Object(r.useRef)(null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1),M={lng:o};Object(r.useEffect)((function(){var e;m&&(W.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1)}),[m.dcToAcRatio]);var I=function(e,t){a((function(l){var a,o=Object(h.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(h.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()}}))},F=function(e,t,l){a((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e)&&(r.dcToAcRatio=l)}}}catch(n){i.e(n)}finally{i.f()}}))},k=function(e){a((function(t){var l,a=Object(h.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()}}))},O=function(e){var t,l;if(m&&function(e){var t;switch(d){case _.AllObjectsOfThisType:var l,a=Object(h.a)(i);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var r,n=o;if(Math.abs((null!==(r=n.dcToAcRatio)&&void 0!==r?r:1)-e)>At)return!0}}}catch(z){a.e(z)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(h.a)(i);try{for(u.s();!(s=u.n()).done;){var f=s.value;if(f.type===V.SolarPanel&&f.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!f.locked){var p,y=f;if(Math.abs((null!==(p=y.dcToAcRatio)&&void 0!==p?p:1)-e)>At)return!0}}}catch(z){u.e(z)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var g=c(m);if(g)if(g.type===V.Cuboid){var w,x=Object(h.a)(i);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.SolarPanel&&v.parentId===m.parentId&&Ww.isIdentical(v.normal,m.normal)&&!v.locked){var b,A=v;if(Math.abs((null!==(b=A.dcToAcRatio)&&void 0!==b?b:1)-e)>At)return!0}}}catch(z){x.e(z)}finally{x.f()}}else{var T,P=Object(h.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===m.parentId&&!S.locked){var H,j=S;if(Math.abs((null!==(H=j.dcToAcRatio)&&void 0!==H?H:1)-e)>At)return!0}}}catch(z){P.e(z)}finally{P.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 _.AllObjectsOfThisType:var a,o=new Map,r=Object(h.a)(i);try{for(r.s();!(a=r.n()).done;){var f,g=a.value;if(g.type===V.SolarPanel)o.set(g.id,null!==(f=g.dcToAcRatio)&&void 0!==f?f:1)}}catch(K){r.e(K)}finally{r.f()}var w={name:"Set DC-AC Ratio for All Solar Panel Arrays",timestamp:Date.now(),oldValues:o,newValue:e,undo:function(){var e,t=Object(h.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(K){t.e(K)}finally{t.f()}},redo:function(){k(w.newValue)}};s(w),k(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,A=new Map,T=Object(h.a)(i);try{for(T.s();!(x=T.n()).done;){var P,S=x.value;if(S.type===V.SolarPanel&&S.foundationId===m.foundationId)A.set(S.id,null!==(P=S.dcToAcRatio)&&void 0!==P?P:1)}}catch(K){T.e(K)}finally{T.f()}var H={name:"Set DC-AC Ratio for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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];I(a,o)}}catch(K){t.e(K)}finally{t.f()}},redo:function(){H.groupId&&C(H.groupId,H.newValue)}};s(H),C(m.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var j=c(m);if(j){var z=new Map,R=j.type===V.Cuboid;if(R){var D,W=Object(h.a)(i);try{for(W.s();!(D=W.n()).done;){var M,O=D.value;if(O.type===V.SolarPanel&&O.parentId===m.parentId&&Ww.isIdentical(O.normal,m.normal))z.set(O.id,null!==(M=O.dcToAcRatio)&&void 0!==M?M:1)}}catch(K){W.e(K)}finally{W.f()}}else{var Y,L=Object(h.a)(i);try{for(L.s();!(Y=L.n()).done;){var N,U=Y.value;if(U.type===V.SolarPanel&&U.parentId===m.parentId)z.set(U.id,null!==(N=U.dcToAcRatio)&&void 0!==N?N:1)}}catch(K){L.e(K)}finally{L.f()}}var E=R?m.normal:void 0,J={name:"Set DC-AC Ratio for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:z,newValue:e,groupId:m.parentId,normal:E,undo:function(){var e,t=Object(h.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(K){t.e(K)}finally{t.f()}},redo:function(){J.groupId&&F(J.groupId,J.normal,J.newValue)}};s(J),F(m.parentId,E,e),y(p+1)}break;default:var G=n(m.id),X=G?null!==(t=G.dcToAcRatio)&&void 0!==t?t:1:null!==(l=m.dcToAcRatio)&&void 0!==l?l:1,B={name:"Set Solar Panel Array DC-AC Ratio",timestamp:Date.now(),oldValue:X,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){I(B.changedElementId,B.oldValue)},redo:function(){I(B.changedElementId,B.newValue)}};s(B),I(m.id,e),y(p+1)}b(!v)}},Y=function(){var e;W.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1,l(!1)},L=function(){O(W.current),l(!1),y(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return S(!0)},onMouseOut:function(){return S(!1)},children:me.t("solarPanelMenu.DcToAcSizeRatio",M)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){O(W.current)},children:me.t("word.Apply",M)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){Y(),g()},children:me.t("word.Cancel",M)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:L,children:me.t("word.OK",M)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:D,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:2,step:.01,style:{width:120},precision:2,value:W.current,onChange:function(e){W.current=e,b(!v)},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[1.0, 2.0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.DcToAcSizeRatioExplained",M)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){f(e.target.value),b(!v)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",M)})]})})})]})})})},FH=n.a.memo((function(){var e,t,l,a,o=Xw(lc),i=Xw(Sr),n=Xw(Ci),c=Xw(Vi),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[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=IP(s),ce=ne.labelText,se=ne.setLabelText,de=CP(s),ue=FP(s,ce),fe=YP(s),he=OP(s),pe=kP(s),ye=LP(s);if(!s)return null;var ge={lng:c},we=(new We.Vector3).fromArray(s.normal),xe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"solar-panel-copy",paddingLeft:"36px"}),xe&&Object(pf.jsx)(RP,{keyName:"solar-panel-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"solar-panel-lock"}),s&&xe&&Object(pf.jsxs)(pf.Fragment,{children:[h&&Object(pf.jsx)(AH,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),p(!0)},style:{paddingLeft:"36px"},children:[me.t("solarPanelMenu.ChangePvModel",ge)," (",s.pvModelName,") ..."]},"solar-panel-change"),m&&Object(pf.jsx)(PH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px",width:"150px"},onClick:function(){n(0),w(!0)},children:[me.t("solarPanelMenu.Orientation",ge)," ..."]},"solar-panel-orientation"),S&&Object(pf.jsx)(SH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),H(!0)},children:[me.t("word.Length",ge)," ..."]},"solar-panel-length"),b&&Object(pf.jsx)(HH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),A(!0)},children:[me.t("word.Width",ge)," ..."]},"solar-panel-width"),R&&Object(pf.jsx)(IH,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),D(!0)},children:[me.t("solarPanelMenu.InverterEfficiency",ge)," ..."]},"solar-panel-inverter-efficiency"),I&&Object(pf.jsx)(CH,{setDialogVisible:C}),Object(pf.jsxs)(tb.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle")}),O&&Object(pf.jsx)(jH,{setDialogVisible:Y,isOnWall:s.parentType===V.Wall}),we&&Ww.isSame(we,Rt)&&Object(pf.jsxs)(pf.Fragment,{children:[s.trackerType===te.NO_TRACKER&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle"),U&&Object(pf.jsx)(zH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),E(!0)},children:[me.t("solarCollectorMenu.RelativeAzimuth",ge)," ..."]},"solar-panel-relative-azimuth"),s.parentType!==V.Roof&&Object(pf.jsxs)(pf.Fragment,{children:[X&&Object(pf.jsx)(RH,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),B(!0)},children:[me.t("solarPanelMenu.Tracker",ge)," ..."]},"solar-panel-tracker")]})]}),xe&&Object(pf.jsxs)(pf.Fragment,{children:[ie&&Object(pf.jsx)(MH,{setDialogVisible:re}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),re(!0)},children:[me.t("solarPanelMenu.FrameColor",ge)," ..."]},"solar-panel-frame-color")]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("solarCollectorMenu.Pole",ge),style:{paddingLeft:"24px"},children:[Q&&Object(pf.jsx)(DH,{setDialogVisible:Z}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),Z(!0)},children:[me.t("solarCollectorMenu.PoleHeight",ge)," ..."]},"solar-panel-pole-height"),ee&&Object(pf.jsx)(WH,{setDialogVisible:le}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),le(!0)},children:[me.t("solarPanelMenu.PoleSpacing",ge)," ..."]},"solar-panel-pole-spacing")]},"solar-panel-pole"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ge),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:de,children:me.t("labelSubMenu.KeepShowingLabel",ge)})},"solar-panel-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",ge)+":",value:ce,onChange:function(e){return se(e.target.value)},onPressEnter:ue})},"solar-panel-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),kH=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Pn),n=Xw(Sn),c=Xw(Hn),s=Xw($r),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},j=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.ParabolicTrough&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!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===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&H(r,e)){T.current=!0;break}}}catch(k){l.e(k)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(h.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.ParabolicTrough&&p.set(x.id,x.ly)}}catch(k){m.e(k)}finally{m.f()}var v={name:"Set Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){c(V.ParabolicTrough,v.newValue)}};d(v),c(V.ParabolicTrough,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var b,S=Object(h.a)(a);try{for(S.s();!(b=S.n()).done;){var j=b.value;if(j.type===V.ParabolicTrough&&j.foundationId===w.foundationId&&H(j,e)){T.current=!0;break}}}catch(k){S.e(k)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var z,R=new Map,D=Object(h.a)(a);try{for(D.s();!(z=D.n()).done;){var W=z.value;W.type===V.ParabolicTrough&&W.foundationId===w.foundationId&&R.set(W.id,W.ly)}}catch(k){D.e(k)}finally{D.f()}var M={name:"Set Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];i(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&n(V.ParabolicTrough,M.groupId,M.newValue)}};d(M),n(V.ParabolicTrough,w.foundationId,e),g(y+1)}}break;default:var I=o(w.id),C=I?I.ly:w.ly;if(T.current=H(w,e),T.current)P.current=e,A(C);else{var F={name:"Set Parabolic Trough Length",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(F.changedElementId,F.oldValue)},redo:function(){i(F.changedElementId,F.newValue)}};d(F),i(w.id,e),g(y+1)}}},z=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.ParabolicTrough)return null;var R=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",S),rejectedMessage:R,onApply:function(){j(b)},onClose:z,onClickCancel:function(){z(),m()},onClickOk:function(){j(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("parabolicTroughMenu.ModulesLong",S),Object(pf.jsx)("br",{}),me.t("word.Maximum",S),": 100 ",me.t("parabolicTroughMenu.Modules",S)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",S)})]})})})]})})},OH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughWidth=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},YH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicTrough&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicTrough&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Parabolic Troughs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,A.newValue)}};f(A),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},LH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Lc),c=Xw(Nc),s=Xw(Uc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.latusRectum)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Latus Rectum for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.latusRectum);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.latusRectum)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Latus Rectum for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.latusRectum:x.latusRectum;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Latus Rectum",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughLatusRectum=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},NH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ec),c=Xw(Vc),s=Xw(Jc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.moduleLength)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Module Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.moduleLength);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.moduleLength)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Module Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.moduleLength:x.moduleLength;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Module Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughModuleLength=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},UH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Parabolic Trough Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},EH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(xc),c=Xw(vc),s=Xw(bc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.absorptance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Absorptance for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.absorptance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Absorptance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.absorptance:m.absorptance,H={name:"Set Parabolic Trough Absorptance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},VH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ac),c=Xw(Tc),s=Xw(Pc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.opticalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Optical Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.opticalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Optical Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.opticalEfficiency:m.opticalEfficiency,H={name:"Set Parabolic Trough Optical Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},JH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sc),c=Xw(Hc),s=Xw(jc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.thermalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Thermal Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.thermalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Thermal Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.thermalEfficiency:m.thermalEfficiency,H={name:"Set Parabolic Trough Thermal Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},GH=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(lc),n=Xw(Sr),c=Xw(Ci),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=IP(s),q=K.labelText,Q=K.setLabelText,Z=CP(s),_=FP(s,q),$=OP(s),ee=kP(s),te=YP(s),le=LP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"parabolic-trough-copy",paddingLeft:"36px"}),oe&&Object(pf.jsx)(RP,{keyName:"parabolic-trough-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"parabolic-trough-lock"}),s&&oe&&Object(pf.jsxs)(pf.Fragment,{children:[S&&Object(pf.jsx)(kH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),H(!0)},children:[me.t("word.Length",ae)," ..."]},"parabolic-trough-length"),b&&Object(pf.jsx)(OH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("word.Width",ae)," ..."]},"parabolic-trough-width"),h&&Object(pf.jsx)(NH,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicTroughMenu.ModuleLength",ae)," ..."]},"parabolic-trough-module-length"),m&&Object(pf.jsx)(LH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicTroughMenu.LatusRectum",ae)," ..."]},"parabolic-trough-latus-rectum"),R&&Object(pf.jsx)(YH,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-trough-pole-height"),I&&Object(pf.jsx)(UH,{setDialogVisible:C}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-trough-reflectance"),O&&Object(pf.jsx)(EH,{setDialogVisible:Y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-trough-absorptance"),U&&Object(pf.jsx)(VH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),E(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-trough-optical-efficiency"),X&&Object(pf.jsx)(JH,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-trough-thermal-efficiency"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-trough-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.Label",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-trough-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),XH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(Pn),s=Xw(An),d=Xw(Sn),f=Xw(Tn),p=Xw(Hn),y=Xw($r),g=Xw(Sr),m=Xw(Oc),w=Xw(Yc),x=Xw(Ii),v=Xw(Ci),b=Xw(Fi),A=NP(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],H=P[1],j=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,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},W=function(e){if(A&&function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===A||void 0===A?void 0:A.foundationId)&&!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)){switch(z.current=void 0,m){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&D(r,e)){j.current=!0;break}}}catch(N){l.e(N)}finally{l.f()}if(j.current)z.current=e,H(A.lx);else{var y,w=new Map,b=Object(h.a)(o);try{for(b.s();!(y=b.n()).done;){var T=y.value;T.type===V.ParabolicDish&&w.set(T.id,T.lx)}}catch(N){b.e(N)}finally{b.f()}var P={name:"Set Diameter for All Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){f(V.ParabolicDish,P.newValue),p(V.ParabolicDish,P.newValue)}};g(P),f(V.ParabolicDish,e),p(V.ParabolicDish,e),v(x+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(A.foundationId){j.current=!1;var S,R=Object(h.a)(o);try{for(R.s();!(S=R.n()).done;){var W=S.value;if(W.type===V.ParabolicDish&&W.foundationId===A.foundationId&&D(W,e)){j.current=!0;break}}}catch(N){R.e(N)}finally{R.f()}if(j.current)z.current=e,H(A.lx);else{var M,I=new Map,C=Object(h.a)(o);try{for(C.s();!(M=C.n()).done;){var F=M.value;F.type===V.ParabolicDish&&F.foundationId===A.foundationId&&I.set(F.id,F.lx)}}catch(N){C.e(N)}finally{C.f()}var k={name:"Set Diameter for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:I,newValue:e,groupId:A.foundationId,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){k.groupId&&(s(V.ParabolicDish,k.groupId,k.newValue),d(V.ParabolicDish,k.groupId,k.newValue))}};g(k),s(V.ParabolicDish,A.foundationId,e),d(V.ParabolicDish,A.foundationId,e),v(x+1)}}break;default:var O=i(A.id),Y=O?O.lx:A.lx;if(j.current=D(A,e),j.current)z.current=e,H(Y);else{var L={name:"Set Parabolic Dish Diameter",timestamp:Date.now(),oldValue:Y,newValue:e,changedElementId:A.id,changedElementType:A.type,undo:function(){n(L.changedElementId,L.oldValue),c(L.changedElementId,L.oldValue)},redo:function(){n(L.changedElementId,L.newValue),c(L.changedElementId,L.newValue)}};g(L),n(A.id,e),c(A.id,e),v(x+1)}}a((function(t){t.actionState.parabolicDishRimDiameter=e}))}},M=function(){j.current=!1,l(!1)};if((null===A||void 0===A?void 0:A.type)!==V.ParabolicDish)return null;var I=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.RimDiameter",R),rejectedMessage:I,onApply:function(){W(S)},onClose:M,onClickCancel:function(){M(),b()},onClickOk:function(){W(S),j.current||(l(!1),v(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:S,onChange:H}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",R),": 1 ",me.t("word.MeterAbbreviation",R),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",R),": 10 ",me.t("word.MeterAbbreviation",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){w(e.target.value)},value:m,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",R)})]})})})]})})},BH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicDish&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicDish,A.newValue)}};f(A),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.ParabolicDish&&z.foundationId===x.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicDish&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicDish,I.groupId,I.newValue)}};f(I),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Dish Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.ExtraPoleHeightInAdditionToRadius",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",H)})]})})})]})})},KH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Lc),c=Xw(Nc),s=Xw(Uc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicDish&&y.set(v.id,v.latusRectum)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Latus Rectum for All Parabolic Dishes",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicDish,b.newValue)}};f(b),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicDish&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.latusRectum);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicDish&&M.foundationId===x.foundationId&&D.set(M.id,M.latusRectum)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Latus Rectum for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicDish,I.groupId,I.newValue)}};f(I),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.latusRectum:x.latusRectum;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Dish Latus Rectum",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishLatusRectum=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",H)})]})})})]})})},qH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Parabolic Dish Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},QH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(xc),c=Xw(vc),s=Xw(bc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.absorptance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Absorptance for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.absorptance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Absorptance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.absorptance:m.absorptance,H={name:"Set Parabolic Dish Absorptance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},ZH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ac),c=Xw(Tc),s=Xw(Pc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.opticalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Optical Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.opticalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Optical Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.opticalEfficiency:m.opticalEfficiency,H={name:"Set Parabolic Dish Optical Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){T(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},_H=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sc),c=Xw(Hc),s=Xw(jc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.thermalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Thermal Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.thermalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Thermal Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.thermalEfficiency:m.thermalEfficiency,H={name:"Set Parabolic Dish Thermal Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},$H=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Oc),s=Xw(Yc),d=Xw(Ii),f=Xw(Ci),p=NP(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=yb.a.Option,b=function(e,t){a((function(l){var a,o=Object(h.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(h.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(h.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){if(p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&a.structureType!==e)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.ParabolicDish&&n.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!n.locked&&n.structureType!==e)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if((null===p||void 0===p?void 0:p.structureType)!==e)return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.ParabolicDish&&l.set(s.id,s.structureType)}}catch(j){r.e(j)}finally{r.f()}var y={name:"Set Structure Type for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T(y.newValue)}};n(y),T(e),f(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.ParabolicDish&&x.foundationId===p.foundationId&&m.set(x.id,x.structureType)}}catch(j){w.e(j)}finally{w.f()}var v={name:"Set Structure Type for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){v.groupId&&A(v.groupId,v.newValue)}};n(v),A(p.foundationId,e),f(d+1)}break;default:var P=i(p.id),S=P?P.structureType:p.structureType,H={name:"Set Parabolic Dish Structure Type",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(H.changedElementId,H.oldValue)},redo:function(){b(H.changedElementId,H.newValue)}};n(H),b(p.id,e),f(d+1)}a((function(t){t.actionState.parabolicDishReceiverStructure=e}))}};return(null===p||void 0===p?void 0:p.type)!==V.ParabolicDish?null:Object(pf.jsx)(EP,{width:640,title:me.t("parabolicDishMenu.ReceiverStructure",x),onApply:function(){P(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsxs)(yb.a,{value:m,onChange:function(e){return w(e)},children:[Object(pf.jsx)(v,{value:J.CentralPole,children:me.t("parabolicDishMenu.CentralPole",x)},J.CentralPole),Object(pf.jsx)(v,{value:J.CentralPoleWithTripod,children:me.t("parabolicDishMenu.CentralPoleWithTripod",x)},J.CentralPoleWithTripod),Object(pf.jsx)(v,{value:J.Quadrupod,children:me.t("parabolicDishMenu.Quadrupod",x)},J.Quadrupod)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",x)})]})})})]})})},ej=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(hc),c=Xw(pc),s=Xw(yc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=NP(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){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.parentId===w.parentId&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.ParabolicDish&&l.set(y.id,y.poleRadius)}}catch(z){r.e(z)}finally{r.f()}var x={name:"Set Pole Radius for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){s(V.ParabolicDish,x.newValue)}};f(x),s(V.ParabolicDish,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var v,b=new Map,A=Object(h.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.ParabolicDish&&T.foundationId===w.foundationId&&b.set(T.id,T.poleRadius)}}catch(z){A.e(z)}finally{A.f()}var P={name:"Set Pole Radius for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:b,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){P.groupId&&c(V.ParabolicDish,P.groupId,P.newValue)}};f(P),c(V.ParabolicDish,w.foundationId,e),m(g+1)}break;default:var S=i(w.id),H=S?S.poleRadius:w.poleRadius,j={name:"Set Parabolic Dish Pole Radius",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(j.changedElementId,j.oldValue)},redo:function(){n(j.changedElementId,j.newValue)}};f(j),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(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){P(b)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",T)})]})})})]})})},tj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(lc),n=Xw(Sr),c=Xw(Ci),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=IP(s),q=K.labelText,Q=K.setLabelText,Z=CP(s),_=FP(s,q),$=OP(s),ee=kP(s),te=YP(s),le=LP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"parabolic-dish-copy",paddingLeft:"36px"}),oe&&Object(pf.jsx)(RP,{keyName:"parabolic-dish-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"parabolic-dish-lock"}),s&&oe&&Object(pf.jsxs)(pf.Fragment,{children:[b&&Object(pf.jsx)(XH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("parabolicDishMenu.RimDiameter",ae)," ..."]},"parabolic-dish-radius"),m&&Object(pf.jsx)(KH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicDishMenu.LatusRectum",ae)," ..."]},"parabolic-dish-latus-rectum"),h&&Object(pf.jsx)($H,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicDishMenu.ReceiverStructure",ae)," ..."]},"parabolic-dish-structure-type"),S&&Object(pf.jsx)(BH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),H(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-dish-pole-height"),R&&Object(pf.jsx)(ej,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.PoleRadius",ae)," ..."]},"parabolic-dish-pole-radius"),I&&Object(pf.jsx)(qH,{setDialogVisible:C}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-dish-reflectance"),O&&Object(pf.jsx)(QH,{setDialogVisible:Y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-dish-absorptance"),U&&Object(pf.jsx)(ZH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),E(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-dish-optical-efficiency"),X&&Object(pf.jsx)(_H,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-dish-thermal-efficiency"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-dish-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-dish-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),lj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Pn),n=Xw(Sn),c=Xw(Hn),s=Xw($r),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},j=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!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===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&H(r,e)){T.current=!0;break}}}catch(k){l.e(k)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(h.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.FresnelReflector&&p.set(x.id,x.ly)}}catch(k){m.e(k)}finally{m.f()}var v={name:"Set Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){c(V.FresnelReflector,v.newValue)}};d(v),c(V.FresnelReflector,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var b,S=Object(h.a)(a);try{for(S.s();!(b=S.n()).done;){var j=b.value;if(j.type===V.FresnelReflector&&j.foundationId===w.foundationId&&H(j,e)){T.current=!0;break}}}catch(k){S.e(k)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var z,R=new Map,D=Object(h.a)(a);try{for(D.s();!(z=D.n()).done;){var W=z.value;W.type===V.FresnelReflector&&W.foundationId===w.foundationId&&R.set(W.id,W.ly)}}catch(k){D.e(k)}finally{D.f()}var M={name:"Set Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];i(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&n(V.FresnelReflector,M.groupId,M.newValue)}};d(M),n(V.FresnelReflector,w.foundationId,e),g(y+1)}}break;default:var I=o(w.id),C=I?I.ly:w.ly;if(T.current=H(w,e),T.current)P.current=e,A(C);else{var F={name:"Set Fresnel Reflector Length",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(F.changedElementId,F.oldValue)},redo:function(){i(F.changedElementId,F.newValue)}};d(F),i(w.id,e),g(y+1)}}},z=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.FresnelReflector)return null;var R=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",S),rejectedMessage:R,onApply:function(){j(b)},onClose:z,onClickCancel:function(){z(),m()},onClickOk:function(){j(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("fresnelReflectorMenu.ModulesLong",S),Object(pf.jsx)("br",{}),me.t("word.Maximum",S),": 200 ",me.t("fresnelReflectorMenu.Modules",S)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",S)})]})})})]})})},aj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=(Xw(Vi),Xw(ki)),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(Dc),y=Xw(Wc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.FresnelReflector,b.newValue)}};f(b),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.FresnelReflector&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.FresnelReflector,I.groupId,I.newValue)}};f(I),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Fresnel Reflector Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorWidth=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",H)})]})})})]})})},oj=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(sc),s=Xw(uc),d=Xw(fc),f=Xw($r),p=Xw(Sr),y=Xw(Dc),g=Xw(Wc),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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),H=Object(r.useRef)(),j=Object(r.useRef)(null!==(l=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==l?l:1),z=$f(),R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var o=a;if(Math.abs(o.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&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(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(f(v)){var d,u=Object(h.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.parentId===v.parentId&&!p.locked){var g=p;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){u.e(m)}finally{u.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(H.current=void 0,y){case _.AllObjectsOfThisType:S.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&.5*a.ly*Math.abs(Math.sin(a.tiltAngle))>e){S.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(S.current)H.current=e,j.current=v.poleHeight;else{var r,g=new Map,x=Object(h.a)(i);try{for(x.s();!(r=x.n()).done;){var b=r.value;b.type===V.FresnelReflector&&g.set(b.id,b.poleHeight)}}catch(O){x.e(O)}finally{x.f()}var A={name:"Set Pole Height for All Fresnel Reflectors",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){d(V.FresnelReflector,A.newValue)}};p(A),d(V.FresnelReflector,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var T,P=Object(h.a)(i);try{for(P.s();!(T=P.n()).done;){var z=T.value;if(z.type===V.FresnelReflector&&z.foundationId===v.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){S.current=!0;break}}}catch(O){P.e(O)}finally{P.f()}if(S.current)H.current=e,j.current=v.poleHeight;else{var R,D=new Map,W=Object(h.a)(i);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===v.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&s(V.FresnelReflector,I.groupId,I.newValue)}};p(I),s(V.FresnelReflector,v.foundationId,e),w(m+1)}}break;default:var C=n(v.id),F=C?C.poleHeight:v.poleHeight;if(S.current=.5*v.lx*Math.abs(Math.sin(v.tiltAngle))>e,S.current)H.current=e,j.current=F;else{var k={name:"Set Fresnel Reflector Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){c(k.changedElementId,k.oldValue)},redo:function(){c(k.changedElementId,k.newValue)}};p(k),c(v.id,e),w(m+1)}}o((function(t){t.actionState.fresnelReflectorPoleHeight=e}))}},D=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!==H.current?" ("+H.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",z),rejectedMessage:W,onApply:function(){R(T)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(T),S.current||(a(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",z),": [0, 5] ",me.t("word.MeterAbbreviation",z)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",z)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",z)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",z)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",z)})]})})})]})})},ij=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ec),c=Xw(Vc),s=Xw(Jc),d=Xw($r),f=Xw(Sr),p=Xw(Dc),y=Xw(Wc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&y.set(v.id,v.moduleLength)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Module Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.FresnelReflector,b.newValue)}};f(b),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.FresnelReflector&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.moduleLength);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===x.foundationId&&D.set(M.id,M.moduleLength)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Module Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.FresnelReflector,I.groupId,I.newValue)}};f(I),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.moduleLength:x.moduleLength;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Fresnel Reflector Module Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorModuleLength=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("fresnelReflectorMenu.ModuleLength",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",H)})]})})})]})})},rj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.FresnelReflector,w.newValue)}};d(w),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.FresnelReflector,T.groupId,T.newValue)}};d(T),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Fresnel Reflector Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,value:v,step:.01,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},nj=yb.a.Option,cj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Cc),c=Xw(Fc),s=Xw(kc),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=NP(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(h.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){if(m&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&a.receiverId!==e)return!0}}catch(c){l.e(c)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&n.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!n.locked&&n.receiverId!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===m||void 0===m?void 0:m.receiverId)!==e)return!0}return!1}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&l.set(p.id,p.receiverId)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Receiver for All Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.FresnelReflector,w.newValue)}};d(w),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&A.foundationId===m.foundationId&&v.set(A.id,A.receiverId)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Receiver for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.FresnelReflector,T.groupId,T.newValue)}};d(T),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.receiverId:m.receiverId,H={name:"Set Receiver for Fresnel Reflector",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:640,title:me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",A),onApply:function(){v&&P(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsx)(yb.a,{style:{width:"160px"},value:v,onChange:function(e){b(e)},children:T.map((function(e,t){return Object(pf.jsx)(nj,{value:e,children:me.t("fresnelReflectorMenu.AbsorberPipe",A)+" "+(t+1)},t)}))})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},sj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Zr),o=Xw(lc),i=Xw(ac),n=Xw(oc),c=Xw(Sr),s=Xw(Dc),d=Xw(Wc),f=Xw(Ii),p=Xw(Ci),y=NP(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){if(y&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&o.drawSunBeam!==e)return!0}}catch(c){a.e(c)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&n.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllObjectsOfThisType:var t,r=new Map,d=Object(h.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.FresnelReflector&&r.set(g.id,g.drawSunBeam)}}catch(H){d.e(H)}finally{d.f()}var m={name:"Draw Sun Beam for All Fresnel Reflectors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(H){t.e(H)}finally{t.f()}},redo:function(){n(V.FresnelReflector,m.newValue)}};c(m),n(V.FresnelReflector,e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var w,x=new Map,v=Object(h.a)(l);try{for(v.s();!(w=v.n()).done;){var b=w.value;b.type===V.FresnelReflector&&b.foundationId===y.foundationId&&x.set(b.id,b.drawSunBeam)}}catch(H){v.e(H)}finally{v.f()}var A={name:"Draw Sun Beam for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.a)(A.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(){A.groupId&&i(V.FresnelReflector,A.groupId,A.newValue)}};c(A),i(V.FresnelReflector,y.foundationId,e),p(f+1)}break;default:var T=a(y.id),P=T?T.drawSunBeam:y.drawSunBeam,S={name:"Draw Sun Beam for Fresnel Reflector",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(S.changedElementId,S.oldValue)},redo:function(){o(S.changedElementId,S.newValue)}};c(S),o(y.id,e),p(f+1)}};return(null===y||void 0===y?void 0:y.type)!==V.FresnelReflector?null:Object(pf.jsx)(EP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){b(w)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:4,children:Object(pf.jsx)(ib.a,{checked:w,onChange:function(e){x(e)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",v)})]})})})]})})},dj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(Ci),n=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=IP(n),Y=O.labelText,L=O.setLabelText,N=CP(n),U=FP(n,Y),E=OP(n),J=kP(n),G=YP(n),X=LP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"fresnel-reflector-copy",paddingLeft:"36px"}),K&&Object(pf.jsx)(RP,{keyName:"fresnel-reflector-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"fresnel-reflector-lock"}),n&&K&&Object(pf.jsxs)(pf.Fragment,{children:[W&&Object(pf.jsx)(cj,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),M(!0)},children:[me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",B)," ..."]},"fresnel-reflector-receiver"),x&&Object(pf.jsx)(lj,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("word.Length",B)," ..."]},"fresnel-reflector-length"),y&&Object(pf.jsx)(aj,{setDialogVisible:g}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Width",B)," ..."]},"fresnel-reflector-width"),d&&Object(pf.jsx)(ij,{setDialogVisible:f}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("fresnelReflectorMenu.ModuleLength",B)," ..."]},"fresnel-reflector-module-length"),T&&Object(pf.jsx)(oj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"fresnel-reflector-pole-height"),j&&Object(pf.jsx)(rj,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"fresnel-reflector-reflectance"),F&&Object(pf.jsx)(sj,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),k(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"fresnel-reflector-draw-sun-beam"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:N,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"fresnel-reflector-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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 E(e)}})},"fresnel-reflector-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),uj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Pn),c=Xw(Sn),s=Xw(Hn),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.ly)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.ly);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&y.set(v.id,v.ly)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,b.newValue)}};f(b),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.ly);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.ly)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.ly:x.ly;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Heliostat Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatWidth=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},fj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Length for All Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,b.newValue)}};f(b),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Length for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Heliostat Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatLength=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},hj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.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(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.Heliostat&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Heliostats",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,A.newValue)}};f(A),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&.5*Math.max(z.lx,z.ly)*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.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(F);else{var k={name:"Set Heliostat Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},pj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Mc),p=Xw(Ic),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.Heliostat,w.newValue)}};d(w),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.Heliostat,T.groupId,T.newValue)}};d(T),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Heliostat Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},yj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Zr),o=Xw(lc),i=Xw(ac),n=Xw(oc),c=Xw(Sr),s=Xw(Mc),d=Xw(Ic),f=Xw(Ii),p=Xw(Ci),y=NP(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){if(y&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Heliostat&&!o.locked&&o.drawSunBeam!==e)return!0}}catch(c){a.e(c)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&n.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllObjectsOfThisType:var t,r=new Map,d=Object(h.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.Heliostat&&r.set(g.id,g.drawSunBeam)}}catch(H){d.e(H)}finally{d.f()}var m={name:"Draw Sun Beam for All Heliostats",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(H){t.e(H)}finally{t.f()}},redo:function(){n(V.Heliostat,m.newValue)}};c(m),n(V.Heliostat,e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var w,x=new Map,v=Object(h.a)(l);try{for(v.s();!(w=v.n()).done;){var b=w.value;b.type===V.Heliostat&&b.foundationId===y.foundationId&&x.set(b.id,b.drawSunBeam)}}catch(H){v.e(H)}finally{v.f()}var A={name:"Draw Sun Beam for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.a)(A.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(){A.groupId&&i(V.Heliostat,A.groupId,A.newValue)}};c(A),i(V.Heliostat,y.foundationId,e),p(f+1)}break;default:var T=a(y.id),P=T?T.drawSunBeam:y.drawSunBeam,S={name:"Draw Sun Beam for Heliostat",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(S.changedElementId,S.oldValue)},redo:function(){o(S.changedElementId,S.newValue)}};c(S),o(y.id,e),p(f+1)}};return(null===y||void 0===y?void 0:y.type)!==V.Heliostat?null:Object(pf.jsx)(EP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){b(w)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:4,children:Object(pf.jsx)(ib.a,{checked:w,onChange:x})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",v)})]})})})]})})},gj=yb.a.Option,mj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Cc),c=Xw(Fc),s=Xw(kc),d=Xw(Sr),f=Xw(Mc),p=Xw(Ic),y=Xw(Ii),g=Xw(Ci),m=NP(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(h.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){if(m&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&a.towerId!==e)return!0}}catch(c){l.e(c)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&n.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!n.locked&&n.towerId!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===m||void 0===m?void 0:m.towerId)!==e)return!0}return!1}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&l.set(p.id,p.towerId)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Tower for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.Heliostat,w.newValue)}};d(w),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&A.foundationId===m.foundationId&&v.set(A.id,A.towerId)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Tower for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.Heliostat,T.groupId,T.newValue)}};d(T),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.towerId:m.towerId,H={name:"Set Tower for Heliostat",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("heliostatMenu.SelectTowerToReflectSunlightTo",A),onApply:function(){v&&P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(yb.a,{style:{width:"120px"},value:v,onChange:b,children:T.map((function(e,t){return Object(pf.jsx)(gj,{value:e,children:me.t("heliostatMenu.Tower",A)+" "+(t+1)},t)}))})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},wj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(hc),c=Xw(pc),s=Xw(yc),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=NP(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){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.parentId===w.parentId&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Heliostat&&l.set(y.id,y.poleRadius)}}catch(z){r.e(z)}finally{r.f()}var x={name:"Set Pole Radius for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){s(V.Heliostat,x.newValue)}};f(x),s(V.Heliostat,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var v,b=new Map,A=Object(h.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.Heliostat&&T.foundationId===w.foundationId&&b.set(T.id,T.poleRadius)}}catch(z){A.e(z)}finally{A.f()}var P={name:"Set Pole Radius for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:b,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){P.groupId&&c(V.Heliostat,P.groupId,P.newValue)}};f(P),c(V.Heliostat,w.foundationId,e),m(g+1)}break;default:var S=i(w.id),H=S?S.poleRadius:w.poleRadius,j={name:"Set Heliostat Pole Radius",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(j.changedElementId,j.oldValue)},redo:function(){n(j.changedElementId,j.newValue)}};f(j),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(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){P(b)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",T)})]})})})]})})},xj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(Ci),n=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=IP(n),Y=O.labelText,L=O.setLabelText,N=CP(n),U=FP(n,Y),E=OP(n),J=kP(n),G=YP(n),X=LP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"heliostat-copy",paddingLeft:"36px"}),K&&Object(pf.jsx)(RP,{keyName:"heliostat-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"heliostat-lock"}),n&&K&&Object(pf.jsxs)(pf.Fragment,{children:[F&&Object(pf.jsx)(mj,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),k(!0)},children:[me.t("heliostatMenu.SelectTowerToReflectSunlightTo",B)," ..."]},"heliostat-tower"),y&&Object(pf.jsx)(fj,{setDialogVisible:g}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Length",B)," ..."]},"heliostat-length"),d&&Object(pf.jsx)(uj,{setDialogVisible:f}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("word.Width",B)," ..."]},"heliostat-width"),x&&Object(pf.jsx)(hj,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"heliostat-pole-height"),T&&Object(pf.jsx)(wj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.PoleRadius",B)," ..."]},"heliostat-pole-radius"),j&&Object(pf.jsx)(pj,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"heliostat-reflectance"),W&&Object(pf.jsx)(yj,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),M(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"heliostat-draw-sun-beam"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:N,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"heliostat-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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 E(e)}})},"heliostat-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),vj=yb.a.Option,bj=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.treeType=e})),s(!c)}}},children:[Object(pf.jsxs)(vj,{value:oe.Apple,children:[Object(pf.jsx)("img",{alt:oe.Apple,src:gx,height:20,style:{paddingRight:"8px"}})," ",me.t("tree.Apple",d)]},oe.Apple),Object(pf.jsxs)(vj,{value:oe.Birch,children:[Object(pf.jsx)("img",{alt:oe.Birch,src:vx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Birch",d)]},oe.Birch),Object(pf.jsxs)(vj,{value:oe.Coconut,children:[Object(pf.jsx)("img",{alt:oe.Coconut,src:Tx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Coconut",d)]},oe.Coconut),Object(pf.jsxs)(vj,{value:oe.Dogwood,children:[Object(pf.jsx)("img",{alt:oe.Dogwood,src:Sx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Dogwood",d)]},oe.Dogwood),Object(pf.jsxs)(vj,{value:oe.Elm,children:[Object(pf.jsx)("img",{alt:oe.Elm,src:Rx,height:20,style:{paddingRight:"20px"}}),me.t("tree.Elm",d)]},oe.Elm),Object(pf.jsxs)(vj,{value:oe.FanPalm,children:[Object(pf.jsx)("img",{alt:oe.FanPalm,src:Mx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.FanPalm",d)]},oe.FanPalm),Object(pf.jsxs)(vj,{value:oe.Linden,children:[Object(pf.jsx)("img",{alt:oe.Linden,src:Cx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Linden",d)]},oe.Linden),Object(pf.jsxs)(vj,{value:oe.Magnolia,children:[Object(pf.jsx)("img",{alt:oe.Magnolia,src:Yx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Magnolia",d)]},oe.Magnolia),Object(pf.jsxs)(vj,{value:oe.Maple,children:[Object(pf.jsx)("img",{alt:oe.Maple,src:Ex,height:20,style:{paddingRight:"12px"}})," ",me.t("tree.Maple",d)]},oe.Maple),Object(pf.jsxs)(vj,{value:oe.Oak,children:[Object(pf.jsx)("img",{alt:oe.Oak,src:Xx,height:20,style:{paddingRight:"17px"}}),me.t("tree.Oak",d)]},oe.Oak),Object(pf.jsxs)(vj,{value:oe.Pine,children:[Object(pf.jsx)("img",{alt:oe.Pine,src:qx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Pine",d)]},oe.Pine),Object(pf.jsxs)(vj,{value:oe.Spruce,children:[Object(pf.jsx)("img",{alt:oe.Spruce,src:Qx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Spruce",d)]},oe.Spruce)]})},Aj=n.a.memo((function(){var e,t,l,a,o,i,n=Xw(si),c=Xw(Vi),s=Xw(bn),d=Xw(jn),f=NP(V.Tree),p=Xw(Sr),y=Object(r.useState)(null!==(e=null===f||void 0===f?void 0:f.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===f||void 0===f?void 0:f.lz)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=IP(f),P=T.labelText,S=T.setLabelText,H=CP(f),j=FP(f,P),z=OP(f),R=kP(f),D=YP(f),W=LP(f);if(!f)return null;var M={lng:c},I=!(null===f||void 0===f?void 0:f.locked),C=function(e,t){n((function(l){var a,o=Object(h.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()}}))},F=function(e,t){n((function(l){var a,o=Object(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"tree-copy"}),I&&Object(pf.jsx)(RP,{keyName:"tree-cut"}),Object(pf.jsx)(DP,{keyName:"tree-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:(null===f||void 0===f?void 0:f.showModel)&&(null===f||void 0===f?void 0:f.type)===V.Tree,onChange:function(e){return function(e){if(f){var t={name:"Show Tree Model",timestamp:Date.now(),checked:e,selectedElementId:f.id,selectedElementType:V.Tree,undo:function(){C(f.id,!t.checked)},redo:function(){C(f.id,t.checked)}};p(t),C(f.id,e)}}(e.target.checked)},children:me.t("treeMenu.ShowModel",M)})},"tree-show-model"),I&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:f.flip,onChange:function(e){var t=e.target.checked,l={name:"Flip Tree",timestamp:Date.now(),checked:t,selectedElementId:f.id,selectedElementType:V.Tree,undo:function(){F(f.id,!l.checked)},redo:function(){F(f.id,l.checked)}};p(l),F(f.id,t)},children:me.t("treeMenu.Flip",{lng:c})})},"tree-flip"),I&&Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("treeMenu.Type",M),": "]}),Object(pf.jsx)(bj,{},"trees")]},"tree-change-type"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("treeMenu.Spread",M)+" ("+me.t("word.MeterAbbreviation",M)+")",":"]}),Object(pf.jsx)(ob.a,{style:{width:"160px"},min:1,max:50,step:1,precision:1,value:m,onChange:function(e){return function(e){if(f&&e&&e!==m){var t={name:"Set Tree Spread",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){s(t.changedElementId,t.oldValue)},redo:function(){s(t.changedElementId,t.newValue)}};p(t),s(f.id,e),w(e),n((function(t){t.actionState.treeSpread=e}))}}(e)}})]},"tree-spread"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("word.Height",M)+" ("+me.t("word.MeterAbbreviation",M)+")",":"]}),Object(pf.jsx)(ob.a,{style:{width:"160px"},min:1,max:30,step:1,precision:1,value:b,onChange:function(e){return function(e){if(f&&e&&e!==b){var t={name:"Set Tree Height",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){d(t.changedElementId,t.oldValue)},redo:function(){d(t.changedElementId,t.newValue)}};p(t),d(f.id,e),A(e),n((function(t){t.actionState.treeHeight=e}))}}(e)}})]},"tree-height")]}),I&&Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",M),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===f||void 0===f?void 0:f.showLabel),onChange:H,children:me.t("labelSubMenu.KeepShowingLabel",M)})},"tree-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",M)+":",value:P,onChange:function(e){return S(e.target.value)},onPressEnter:j,onBlur:j})},"tree-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelHeight",M)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=f.labelHeight)&&void 0!==l?l:.2,onChange:function(e){return W(e)}})},"tree-label-height"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",M)+":",min:10,max:100,step:1,precision:0,value:null!==(a=f.labelFontSize)&&void 0!==a?a:20,onChange:function(e){return R(e)}})},"tree-label-font-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelSize",M)+":",min:.2,max:5,step:.1,precision:1,value:null!==(o=f.labelSize)&&void 0!==o?o:.2,onChange:function(e){return z(e)}})},"tree-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelColor",M)+":",value:null!==(i=f.labelColor)&&void 0!==i?i:"#ffffff",onChange:function(e){return D(e.target.value)}})},"tree-label-color")]})]},"tree-label")]})})),Tj=l(804),Pj="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=",Sj="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC",Hj=l.p+"static/media/wall_03_menu.39f5c56a.png",jj="data:image/png;base64,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",zj=l.p+"static/media/wall_05_menu.c887c64e.png",Rj=l.p+"static/media/wall_06_menu.3dc4a0c2.png",Dj="data:image/png;base64,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",Wj="data:image/png;base64,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",Mj=l.p+"static/media/wall_09_menu.5124ae81.png",Ij=l.p+"static/media/wall_10_menu.a934991d.png",Cj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Ku),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=$f(),p=NP(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=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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=Ww.getAllConnectedWalls(p);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(p&&function(e){if(p){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.textureType&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===p.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(y){r.e(y)}finally{r.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(p),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var f=s.value;if(e!==f.textureType&&!f.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.textureType))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var f,y=t.value;if(y.type===V.Wall&&!y.locked)l.set(y.id,null!==(f=y.textureType)&&void 0!==f?f:ue.Default)}}catch(k){r.e(k)}finally{r.f()}var g={name:"Set Texture for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){T(g.newValue)}};i(g),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var P=m.value;P.type!==V.Wall||P.foundationId!==p.foundationId||P.locked||w.set(P.id,P.textureType)}}catch(k){x.e(k)}finally{x.f()}var S={name:"Set Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};i(S),A(p.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(p){var H,j=Ww.getAllConnectedWalls(p),z=new Map,R=Object(h.a)(j);try{for(R.s();!(H=R.n()).done;){var D=H.value;z.set(D.id,D.textureType)}}catch(k){R.e(k)}finally{R.f()}var W={name:"Set Texture for All Connected Walls",timestamp:Date.now(),oldValues:z,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){b(W.newValue)}};i(W),b(e),s(c+1)}break;default:if(p){var M,I=d(p.id),C=null!==(M=null===I||void 0===I?void 0:I.textureType)&&void 0!==M?M:p.textureType,F={name:"Set Texture of Selected Wall",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(F.changedElementId,F.oldValue)},redo:function(){v(F.changedElementId,F.newValue)}};i(F),v(p.id,e),s(c+1)}}a((function(t){t.actionState.wallTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",f),onApply:function(){P(m)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(pf.jsxs)(x,{value:ue.NoTexture,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",f)]},ue.NoTexture),Object(pf.jsxs)(x,{value:ue.Default,children:[Object(pf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",f)]},ue.Default),Object(pf.jsxs)(x,{value:ue.Texture01,children:[Object(pf.jsx)("img",{alt:ue.Texture01,src:Pj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",f)]},ue.Texture01),Object(pf.jsxs)(x,{value:ue.Texture02,children:[Object(pf.jsx)("img",{alt:ue.Texture02,src:Sj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",f)]},ue.Texture02),Object(pf.jsxs)(x,{value:ue.Texture03,children:[Object(pf.jsx)("img",{alt:ue.Texture03,src:Hj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",f)]},ue.Texture03),Object(pf.jsxs)(x,{value:ue.Texture04,children:[Object(pf.jsx)("img",{alt:ue.Texture04,src:jj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",f)]},ue.Texture04),Object(pf.jsxs)(x,{value:ue.Texture05,children:[Object(pf.jsx)("img",{alt:ue.Texture05,src:zj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",f)]},ue.Texture05),Object(pf.jsxs)(x,{value:ue.Texture06,children:[Object(pf.jsx)("img",{alt:ue.Texture06,src:Rj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",f)]},ue.Texture06),Object(pf.jsxs)(x,{value:ue.Texture07,children:[Object(pf.jsx)("img",{alt:ue.Texture07,src:Dj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",f)]},ue.Texture07),Object(pf.jsxs)(x,{value:ue.Texture08,children:[Object(pf.jsx)("img",{alt:ue.Texture08,src:Wj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",f)]},ue.Texture08),Object(pf.jsxs)(x,{value:ue.Texture09,children:[Object(pf.jsx)("img",{alt:ue.Texture09,src:Mj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",f)]},ue.Texture09),Object(pf.jsxs)(x,{value:ue.Texture10,children:[Object(pf.jsx)("img",{alt:ue.Texture10,src:Ij,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",f)]},ue.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},Fj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=$f(),p=UP(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(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.color&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.color&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.color&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.color))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.color)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1);break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.color)&&void 0!==F?F:d.color)&&void 0!==C?C:"#ffffff",Y={name:"Set Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.Color",f),onApply:function(){A(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},kj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=UP(null!==(t=null===d||void 0===d?void 0:d.structureColor)&&void 0!==t?t:"#ffffff"),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){a((function(l){var a,o=Object(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.structureColor&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.structureColor&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.structureColor&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.structureColor))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.structureColor)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Structure Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.structureColor)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Structure Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Structure Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1)}break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.structureColor)&&void 0!==F?F:d.structureColor)&&void 0!==C?C:"#ffffff",Y={name:"Set Structure Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallStructureColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.StructureColor",m),onApply:function(){A(y)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:y,onChangeComplete:g})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",m)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",m)})]})})})]})})},Oj=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=Xw(ki),d=Xw(Sr),f=Xw(Ku),p=Xw(Ii),y=Xw(Ci),g=Xw(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(h.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=Ww.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(h.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(h.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(h.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(h.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){if(t&&function(e){switch(f){case _.AllObjectsOfThisType:var l,o=Object(h.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i[a]&&!i.locked)return!0}}catch(g){o.e(g)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===t.foundationId&&e!==c[a]&&!c.locked)return!0}}catch(g){n.e(g)}finally{n.f()}break;case _.AllConnectedObjects:var d,u=Ww.getAllConnectedWalls(t),p=Object(h.a)(u);try{for(p.s();!(d=p.n()).done;){var y=d.value;if(e!==y[a]&&!y.locked)return!0}}catch(g){p.e(g)}finally{p.f()}break;default:if(e!==t[a])return!0}return!1}(e))switch(f){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&i.set(n.id,n[a])}}catch(I){r.e(I)}finally{r.f()}var c={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){T(c.newValue)}};d(c),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var g,m=new Map,w=Object(h.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&x.foundationId===t.foundationId&&m.set(x.id,x[a])}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(h.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];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P.groupId&&A(P.groupId,P.newValue)}};d(P),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var S,H=Ww.getAllConnectedWalls(t),j=new Map,z=Object(h.a)(H);try{for(z.s();!(S=z.n()).done;){var R=S.value;j.set(R.id,R[a])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:j,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){b(D.newValue)}};d(D),b(e),y(p+1)}break;default:if(t){var W=t[a],M={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};d(M),v(t.id,e),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){P(m.current)},onClose:function(){m.current=t[a],c()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Yj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.rValue&&!o.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.rValue&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.rValue&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(L){r.e(L)}finally{r.f()}var g={name:"Set R-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(null===f||void 0===f?void 0:f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Wall&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(L){x.e(L)}finally{x.f()}var H={name:"Set R-Value for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.AllConnectedObjects:if(f){var j,z=Ww.getAllConnectedWalls(f),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W=j.value;if(!W.locked){var M,I=W;R.set(W.id,null!==(M=I.rValue)&&void 0!==M?M:2),T(I.id,e)}}}catch(L){D.e(L)}finally{D.f()}var C={name:"Set R-Value for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){P(C.oldValues)},redo:function(){S(C.oldValues,C.newValue)}};o(C),c(n+1)}break;default:if(f){var F,k,O=null!==(F=null!==(k=s(f.id).rValue)&&void 0!==k?k:f.rValue)&&void 0!==F?F:2,Y={name:"Set Wall R-Value",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(Y.changedElementId,Y.oldValue)},redo:function(){T(Y.changedElementId,Y.newValue)}};o(Y),T(f.id,e),c(n+1)}}d((function(t){t.actionState.wallRValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.RValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){H(g)},onClose:function(){var e;m(null!==(e=null===f||void 0===f?void 0:f.rValue)&&void 0!==e?e:2),l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",A)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",A)})]})})})]})})},Lj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.volumetricHeatCapacity&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.volumetricHeatCapacity)&&void 0!==p?p:.5),x(y.id,e)}}}catch(L){r.e(L)}finally{r.f()}var g={name:"Set Volumetric Heat Capacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(null===f||void 0===f?void 0:f.foundationId){var m,w=new Map,A=Object(h.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;if(T.type===V.Wall&&T.foundationId===f.foundationId&&!T.locked){var P,S=T;w.set(T.id,null!==(P=S.volumetricHeatCapacity)&&void 0!==P?P:.5),x(S.id,e)}}}catch(L){A.e(L)}finally{A.f()}var H={name:"Set Volumetric Heat Capacity for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){v(H.oldValues)},redo:function(){b(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.AllConnectedObjects:if(f){var j,z=Ww.getAllConnectedWalls(f),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W=j.value;if(!W.locked){var M,I=W;R.set(W.id,null!==(M=I.volumetricHeatCapacity)&&void 0!==M?M:.5),x(I.id,e)}}}catch(L){D.e(L)}finally{D.f()}var C={name:"Set Volumetric Heat Capacity for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){v(C.oldValues)},redo:function(){b(C.oldValues,C.newValue)}};o(C),c(n+1)}break;default:if(f){var F,k,O=null!==(F=null!==(k=s(f.id).volumetricHeatCapacity)&&void 0!==k?k:f.volumetricHeatCapacity)&&void 0!==F?F:.5,Y={name:"Set Volumetric Heat Capacity of Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};o(Y),x(f.id,e),c(n+1)}}d((function(t){t.actionState.wallVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Nj=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=Xw(ki),d=Xw(Sr),f=Xw(Ku),p=Xw(Ii),y=Xw(Ci),g=Xw(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(h.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=Ww.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(h.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(h.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(h.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(h.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){if(t&&function(e){switch(f){case _.AllObjectsOfThisType:var l,o=Object(h.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)return!0}}catch(g){o.e(g)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===t.foundationId&&e!==c.parapet[a]&&!c.locked)return!0}}catch(g){n.e(g)}finally{n.f()}break;case _.AllConnectedObjects:var d,u=Ww.getAllConnectedWalls(t),p=Object(h.a)(u);try{for(p.s();!(d=p.n()).done;){var y=d.value;if(e!==y.parapet[a]&&!y.locked)return!0}}catch(g){p.e(g)}finally{p.f()}break;default:if(e!==t.parapet[a])return!0}return!1}(e))switch(f){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&i.set(n.id,n.parapet[a])}}catch(I){r.e(I)}finally{r.f()}var c={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){T(c.newValue)}};d(c),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var g,m=new Map,w=Object(h.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&x.foundationId===t.foundationId&&m.set(x.id,x.parapet[a])}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(h.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];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P.groupId&&A(P.groupId,P.newValue)}};d(P),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var S,H=Ww.getAllConnectedWalls(t),j=new Map,z=Object(h.a)(H);try{for(z.s();!(S=z.n()).done;){var R=S.value;j.set(R.id,R.parapet[a])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:j,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){b(D.newValue)}};d(D),b(e),y(p+1)}break;default:if(t){var W=t.parapet[a],M={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};d(M),v(t.id,e),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){P(m.current)},onClose:function(){c()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Uj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=$f(),p=UP(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(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.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)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.parapet.color&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.parapet.color&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.parapet.color))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.parapet.color)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Parapet Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.parapet.color)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Parapet Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Parapet Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1)}break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.parapet.color)&&void 0!==F?F:d.parapet.color)&&void 0!==C?C:"#ffffff",Y={name:"Set Parapet Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallParapet.color=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.ParapetColor",f),onApply:function(){A(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},Ej=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Ku),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.parapet.textureType)&&void 0!==t?t:ue.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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(f){var t=Ww.getAllConnectedWalls(f);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.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)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.parapet.textureType&&!c.locked)return!0}}catch(y){r.e(y)}finally{r.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.parapet.textureType&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.parapet.textureType))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Wall&&!y.locked)l.set(y.id,null!==(p=y.parapet.textureType)&&void 0!==p?p:ue.Default)}}catch(k){r.e(k)}finally{r.f()}var g={name:"Set Parapet Texture for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){T(g.newValue)}};i(g),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var P=m.value;P.type!==V.Wall||P.foundationId!==f.foundationId||P.locked||w.set(P.id,P.parapet.textureType)}}catch(k){x.e(k)}finally{x.f()}var S={name:"Set Parapet Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};i(S),A(f.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(f){var H,j=Ww.getAllConnectedWalls(f),z=new Map,R=Object(h.a)(j);try{for(R.s();!(H=R.n()).done;){var D=H.value;z.set(D.id,D.parapet.textureType)}}catch(k){R.e(k)}finally{R.f()}var W={name:"Set Parapet Texture for All Connected Walls",timestamp:Date.now(),oldValues:z,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){b(W.newValue)}};i(W),b(e),s(c+1)}break;default:if(f){var M,I=d(f.id),C=null!==(M=null===I||void 0===I?void 0:I.parapet.textureType)&&void 0!==M?M:f.parapet.textureType,F={name:"Set Parapet Texture of Selected Wall",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(F.changedElementId,F.oldValue)},redo:function(){v(F.changedElementId,F.newValue)}};i(F),v(f.id,e),s(c+1)}}a((function(t){t.actionState.wallParapet.textureType=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){P(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(pf.jsxs)(x,{value:ue.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:ue.Default,children:[Object(pf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",w)]},ue.Default),Object(pf.jsxs)(x,{value:ue.Texture01,children:[Object(pf.jsx)("img",{alt:ue.Texture01,src:Pj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",w)]},ue.Texture01),Object(pf.jsxs)(x,{value:ue.Texture02,children:[Object(pf.jsx)("img",{alt:ue.Texture02,src:Sj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",w)]},ue.Texture02),Object(pf.jsxs)(x,{value:ue.Texture03,children:[Object(pf.jsx)("img",{alt:ue.Texture03,src:Hj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",w)]},ue.Texture03),Object(pf.jsxs)(x,{value:ue.Texture04,children:[Object(pf.jsx)("img",{alt:ue.Texture04,src:jj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",w)]},ue.Texture04),Object(pf.jsxs)(x,{value:ue.Texture05,children:[Object(pf.jsx)("img",{alt:ue.Texture05,src:zj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",w)]},ue.Texture05),Object(pf.jsxs)(x,{value:ue.Texture06,children:[Object(pf.jsx)("img",{alt:ue.Texture06,src:Rj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",w)]},ue.Texture06),Object(pf.jsxs)(x,{value:ue.Texture07,children:[Object(pf.jsx)("img",{alt:ue.Texture07,src:Dj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",w)]},ue.Texture07),Object(pf.jsxs)(x,{value:ue.Texture08,children:[Object(pf.jsx)("img",{alt:ue.Texture08,src:Wj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",w)]},ue.Texture08),Object(pf.jsxs)(x,{value:ue.Texture09,children:[Object(pf.jsx)("img",{alt:ue.Texture09,src:Mj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",w)]},ue.Texture09),Object(pf.jsxs)(x,{value:ue.Texture10,children:[Object(pf.jsx)("img",{alt:ue.Texture10,src:Ij,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",w)]},ue.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.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"}(vH||(vH={}));var Vj,Jj={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"}},Gj={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"}},Xj={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},Bj=n.a.memo((function(){var e=Xw(Vi),t=Xw(si),l=Xw(Ci),a=Xw(fs),o=Xw($c),i=Xw(Sr),n=Xw(hn),c=Xw(fn),s=Xw(Xc),d=Xw(Gc),p=Xw(Kc),y=Xw(_r),g=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[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)}))},W=function(e,l){t((function(t){var a,o=Object(h.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!==Ee.Stud&&l!==Ee.Pillar||(r.opacity=0);break}}}catch(n){o.e(n)}finally{o.f()}}))},M=function(e,l){t((function(t){var a,o=Object(h.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(h.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(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),v(e)},children:[me.t("wallMenu.".concat(e),R)," ..."]},"wall-".concat(e))},F=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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:a(r,l),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){!function(e){if(g){var l=Xw.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(f.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"))},k=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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"))},O=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(pf.jsx)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[function(){var e=Xw.getState().elementsToPaste;if(e&&e.length>0){var t=e[0];if(Ww.isLegalOnWall(t.type))return!0}return!1}()?Object(pf.jsx)(jP,{keyName:"wall-paste"}):null,Object(pf.jsx)(zP,{keyName:"wall-copy"}),!g||g.locked?null:Object(pf.jsx)(RP,{keyName:"wall-cut"}),Object(pf.jsx)(DP,{keyName:"wall-lock"}),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[function(){switch(x){case vH.Height:case vH.Opacity:case vH.Thickness:case vH.StructureSpacing:case vH.StructureWidth:case vH.EavesLength:var e=Jj[x];return e?Object(pf.jsx)(Oj,{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 vH.ParapetHeight:case vH.CopingsHeight:case vH.CopingsWidth:var t=Gj[x];return t?Object(pf.jsx)(Nj,{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 vH.Color:return Object(pf.jsx)(Fj,{setDialogVisible:function(){return v(null)}});case vH.StructureColor:return Object(pf.jsx)(kj,{setDialogVisible:function(){return v(null)}});case vH.ParapetColor:return Object(pf.jsx)(Uj,{setDialogVisible:function(){return v(null)}});case vH.Texture:return Object(pf.jsx)(Cj,{setDialogVisible:function(){return v(null)}});case vH.ParapetTexture:return Object(pf.jsx)(Ej,{setDialogVisible:function(){return v(null)}})}}(),function(){var e=g?a(g.id,!0):new Ow;if(e.gotSome()&&Xw.getState().contextMenuObjectType){var t=g?a(g.id,!1):new Ow;return Object(pf.jsxs)(MP.a,{title:me.t("word.Elements",R),style:{paddingLeft:"24px"},children:[F(V.Window,t.windowCount),F(V.Door,t.doorCount),F(V.SolarPanel,t.solarPanelCount),F(V.Sensor,t.sensorCount),F(V.Light,t.insideLightCount+t.outsideLightCount),F(V.Polygon,t.polygonCount),k(V.Window,t.windowCount),O(V.Window,e.windowCount),k(V.SolarPanel,t.solarPanelCount),O(V.SolarPanel,e.solarPanelCount),k(V.Sensor,t.sensorCount),O(V.Sensor,e.sensorCount),Y(e.outsideLightCount,!0),Y(e.insideLightCount,!1),k(V.Polygon,t.polygonCount),O(V.Polygon,e.polygonCount)]},"lock-unlock-clear-on-wall")}return null}(),g?Object(pf.jsxs)(MP.a,{title:me.t("wallMenu.Parapet",R),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),C(vH.ParapetColor),C(vH.ParapetTexture),C(vH.ParapetHeight),C(vH.CopingsHeight),C(vH.CopingsWidth)]},"wall-parapet"):null,function(){var e;return g?Object(pf.jsx)(MP.a,{title:me.t("wallMenu.WallStructure",R),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.a.Group,{value:null!==(e=g.wallStructure)&&void 0!==e?e:Ee.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(){W(l.changedElementId,l.oldValue)},redo:function(){W(l.changedElementId,l.newValue)}};i(l),W(g.id,e.target.value),t((function(t){t.actionState.wallStructure=e.target.value,t.actionState.wallStructure!==Ee.Stud&&t.actionState.wallStructure!==Ee.Pillar||(t.actionState.wallOpacity=0)}))},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Default,children:me.t("wallMenu.DefaultStructure",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Stud,children:me.t("wallMenu.StudStructure",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Pillar,children:me.t("wallMenu.PillarStructure",R)})]})},"wall-structure"):null}(),(null===g||void 0===g?void 0:g.wallStructure)===Ee.Stud||(null===g||void 0===g?void 0:g.wallStructure)===Ee.Pillar?Object(pf.jsxs)(pf.Fragment,{children:[C(vH.StructureSpacing),C(vH.StructureWidth),C(vH.StructureColor),C(vH.Opacity)]}):null,Object(pf.jsx)(tb.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=Ww.wallAbsolutePosition(new We.Vector3(a,o,i),l).setZ(t.lz/2+l.lz);return(new We.Vector3).subVectors(e,n).applyEuler(new We.Euler(0,0,-r))}return new We.Vector3}(Xw.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 We.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(pf.jsxs)(MP.a,{title:me.t("wallMenu.Fill",R),style:{paddingLeft:"24px"},children:[Object(pf.jsxs)(rb.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(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(g.id,e.target.value)},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Full,children:me.t("wallMenu.Full",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Partial,children:me.t("wallMenu.Partial",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Empty,children:me.t("wallMenu.Empty",R)})]}),g.fill!==Ue.Full&&Object(pf.jsx)("div",{style:{paddingLeft:"10px",paddingTop:"10px"},children:Object(pf.jsx)(ab.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(vH.Thickness),C(vH.Height),C(vH.EavesLength),T&&Object(pf.jsx)(Yj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),P(!0)},children:[me.t("word.RValue",R)," ..."]},"wall-r-value"),j&&Object(pf.jsx)(Lj,{setDialogVisible:z}),Object(pf.jsxs)(tb.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)===Ee.Default?C(vH.Texture):null,!((null===g||void 0===g?void 0:g.wallStructure)===Ee.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(vH.Color)]})]})})),Kj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(si),d=Xw(Zr),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:fe.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.textureType&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.textureType&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked)l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:fe.Default)}}catch(M){r.e(M)}finally{r.f()}var y={name:"Set Texture for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Door||x.foundationId!==f.foundationId||x.locked||m.set(x.id,x.textureType)}}catch(M){w.e(M)}finally{w.f()}var T={name:"Set Texture for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){A(T.oldValues)},redo:function(){T.groupId&&b(T.oldValues,T.newValue)}};o(T),b(m,e),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var P,S=new Map,H=Object(h.a)(Xw.getState().elements);try{for(H.s();!(P=H.n()).done;){var j=P.value;j.type!==V.Door||j.parentId!==f.parentId||j.locked||S.set(j.id,j.textureType)}}catch(M){H.e(M)}finally{H.f()}var z={name:"Set Texture for All Doors On the Same Wall",timestamp:Date.now(),oldValues:S,newValue:e,groupId:f.parentId,undo:function(){A(z.oldValues)},redo:function(){z.groupId&&b(z.oldValues,z.newValue)}};o(z),b(S,e),c(n+1)}break;default:if(f){var R=d(f.id),D=R?R.textureType:f.textureType,W={name:"Set Texture of Selected Door",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};o(W),v(f.id,e),c(n+1)}}s((function(t){t.actionState.doorTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(pf.jsxs)(x,{value:fe.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:fe.Default,children:[Object(pf.jsx)("img",{alt:fe.Default,src:rm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.TextureDefault",w)]},fe.Default),Object(pf.jsxs)(x,{value:fe.Texture01,children:[Object(pf.jsx)("img",{alt:fe.Texture01,src:nm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture01",w)]},fe.Texture01),Object(pf.jsxs)(x,{value:fe.Texture02,children:[Object(pf.jsx)("img",{alt:fe.Texture02,src:cm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture02",w)]},fe.Texture02),Object(pf.jsxs)(x,{value:fe.Texture03,children:[Object(pf.jsx)("img",{alt:fe.Texture03,src:sm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture03",w)]},fe.Texture03),Object(pf.jsxs)(x,{value:fe.Texture04,children:[Object(pf.jsx)("img",{alt:fe.Texture04,src:dm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture04",w)]},fe.Texture04),Object(pf.jsxs)(x,{value:fe.Texture05,children:[Object(pf.jsx)("img",{alt:fe.Texture05,src:um,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture05",w)]},fe.Texture05),Object(pf.jsxs)(x,{value:fe.Texture06,children:[Object(pf.jsx)("img",{alt:fe.Texture06,src:fm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture06",w)]},fe.Texture06),Object(pf.jsxs)(x,{value:fe.Texture07,children:[Object(pf.jsx)("img",{alt:fe.Texture07,src:hm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture07",w)]},fe.Texture07),Object(pf.jsxs)(x,{value:fe.Texture08,children:[Object(pf.jsx)("img",{alt:fe.Texture08,src:pm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture08",w)]},fe.Texture08),Object(pf.jsxs)(x,{value:fe.Texture09,children:[Object(pf.jsx)("img",{alt:fe.Texture09,src:ym,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture09",w)]},fe.Texture09),Object(pf.jsxs)(x,{value:fe.Texture10,children:[Object(pf.jsx)("img",{alt:fe.Texture10,src:gm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture10",w)]},fe.Texture10),Object(pf.jsxs)(x,{value:fe.Texture11,children:[Object(pf.jsx)("img",{alt:fe.Texture11,src:mm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture11",w)]},fe.Texture11),Object(pf.jsxs)(x,{value:fe.Texture12,children:[Object(pf.jsx)("img",{alt:fe.Texture12,src:wm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture12",w)]},fe.Texture12),Object(pf.jsxs)(x,{value:fe.Texture13,children:[Object(pf.jsx)("img",{alt:fe.Texture13,src:xm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture13",w)]},fe.Texture13),Object(pf.jsxs)(x,{value:fe.Texture14,children:[Object(pf.jsx)("img",{alt:fe.Texture14,src:vm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture14",w)]},fe.Texture14),Object(pf.jsxs)(x,{value:fe.Texture15,children:[Object(pf.jsx)("img",{alt:fe.Texture15,src:bm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture15",w)]},fe.Texture15),Object(pf.jsxs)(x,{value:fe.Texture16,children:[Object(pf.jsx)("img",{alt:fe.Texture16,src:Am,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture16",w)]},fe.Texture16),Object(pf.jsxs)(x,{value:fe.Texture17,children:[Object(pf.jsx)("img",{alt:fe.Texture17,src:Tm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture17",w)]},fe.Texture17)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},qj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Zu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&e!==a.color&&!a.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Door&&c.foundationId===(null===f||void 0===f?void 0:f.foundationId)&&e!==c.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===f||void 0===f?void 0:f.parentId)&&e!==u.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked)l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(F){r.e(F)}finally{r.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Door&&T.foundationId===f.foundationId&&!f.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(F){w.e(F)}finally{w.f()}var P={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){b(P.oldValues)},redo:function(){P.groupId&&v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1)}break;case _.OnlyThisSide:if(f.parentId){var S,H=new Map,j=Object(h.a)(Xw.getState().elements);try{for(j.s();!(S=j.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.parentId===f.parentId&&!f.locked)H.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(F){j.e(F)}finally{j.f()}var D={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:f.parentId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(H,e),s(c+1)}break;default:if(f){var W,M=d(f.id),I=null!==(W=M?M.color:f.color)&&void 0!==W?W:"#ffffff",C={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};i(C),x(f.id,e),s(c+1)}}a((function(t){t.actionState.doorColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("word.Color",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},Qj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.uValue)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.uValue&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.uValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.uValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.uValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){P(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){P(y.oldValues)},redo:function(){S(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).uValue)&&void 0!==m?m:f.uValue)&&void 0!==g?g:1,x={name:"Set Door U-Value",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(x.changedElementId,x.oldValue)},redo:function(){T(x.changedElementId,x.newValue)}};o(x),T(f.id,e),c(n+1)}}d((function(t){t.actionState.doorUValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toUValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toUValueInUS(.01),max:Ww.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(Ww.toUValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toUValueInUS(.01).toFixed(3),", ",Ww.toUValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",A)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",A)})]})})})]})})},Zj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(Zu),i=Xw(Ii),n=Xw(Ci),c=Xw(Zr),s=Xw(si),d=Xw($r),f=NP(V.Door),p=Object(r.useMemo)((function(){var e=f?f.lx:1,t=f?d(f):null;return t?e*t.lx:e}),[null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(o){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Door&&!i.locked){var r=d(i);if(r&&e!==i.lx*r.lx)return!0}}}catch(x){a.e(x)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(l);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&s.foundationId===f.foundationId&&!s.locked){var u=d(s);if(u&&e!==s.lx*u.lx)return!0}}}catch(x){c.e(x)}finally{c.f()}break;case _.OnlyThisSide:var p,y=Object(h.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===f.parentId&&!g.locked){var m=d(g);if(m&&e!==g.lx*m.lx)return!0}}}catch(x){y.e(x)}finally{y.f()}break;default:var w=d(f);if(w&&e!==f.lx*w.lx)return!0}return!1}}(e))switch(o){case _.AllObjectsOfThisType:var t=new Map;s((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var u=new Map;s((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:u,newValue:e,groupId:f.foundationId,undo:function(){b(p.oldValues)},redo:function(){A(p.oldValues,p.newValue)}};a(p),n(i+1)}break;case _.OnlyThisSide:if(f.parentId){var y=new Map;s((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:y,newValue:e,groupId:f.parentId,undo:function(){b(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};a(g),n(i+1)}break;default:if(f){var m,w,x=c(f.id),T=f?d(x):null,P=(null!==(m=null!==(w=x.lx)&&void 0!==w?w:f.lx)&&void 0!==m?m:.1)*(T?T.lx:1),S={name:"Set Door Width",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(S.changedElementId,S.oldValue)},redo:function(){v(S.changedElementId,S.newValue)}};a(S),v(f.id,e),n(i+1)}}},P=f?d(f):null,S=P&&f?2*P.lx*Math.min(Math.abs(.5-f.cx),Math.abs(-.5-f.cx)):100;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",x),onApply:function(){T(m)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},_j=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=Xw($r),p=NP(V.Door),y=Object(r.useMemo)((function(){var e=p?p.lz:1,t=p?f(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(h.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=f(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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&!o.locked){var r=f(o);if(r&&e!==o.lz*r.lz)return!0}}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&s.foundationId===p.foundationId&&!s.locked){var d=f(s);if(d&&e!==s.lz*d.lz)return!0}}}catch(x){c.e(x)}finally{c.f()}break;case _.OnlyThisSide:var u,y=Object(h.a)(a);try{for(y.s();!(u=y.n()).done;){var g=u.value;if(g.type===V.Door&&g.parentId===p.parentId&&!g.locked){var m=f(g);if(m&&e!==g.lz*m.lz)return!0}}}catch(x){y.e(x)}finally{y.f()}break;default:var w=f(p);if(w&&e!==p.lz*w.lz)return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){var r=i,n=r?f(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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var r=new Map;d((function(t){var l,a=Object(h.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,n=i?f(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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:p.foundationId,undo:function(){A(u.oldValues)},redo:function(){T(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(p.parentId){var y=new Map;d((function(t){var l,a=Object(h.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?f(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 On the Same Wall",timestamp:Date.now(),oldValues:y,newValue:e,groupId:p.parentId,undo:function(){A(g.oldValues)},redo:function(){T(g.oldValues,g.newValue)}};o(g),c(n+1)}break;default:if(p){var m,w,x=s(p.id),v=p?f(x):null,P=(null!==(m=null!==(w=x.lz)&&void 0!==w?w:p.lz)&&void 0!==m?m:.2)*(v?v.lz:1),S={name:"Set Door Height",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(S.changedElementId,S.oldValue)},redo:function(){b(S.changedElementId,S.newValue)}};o(S),b(p.id,e),c(n+1)}}},S=p?f(p):null,H=null!==(t=null===S||void 0===S?void 0:S.lz)&&void 0!==t?t:20;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",v),onApply:function(){P(w)},onClose:function(){x(y),l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:H,style:{width:120},step:.1,precision:2,value:w,formatter:function(e){return Number(e).toFixed(2)},onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, ",H.toFixed(1),"]",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",v)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",v)})]})})})]})})},$j=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===(null===f||void 0===f?void 0:f.foundationId)&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===f||void 0===f?void 0:f.parentId)&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).volumetricHeatCapacity)&&void 0!==m?m:f.volumetricHeatCapacity)&&void 0!==g?g:.5,A={name:"Set Volumetric Heat Capacity of Door",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(f.id,e),c(n+1)}}d((function(t){t.actionState.doorVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},ez=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.opacity&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.opacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.opacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.opacity)&&void 0!==r?r:1),n.opacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).opacity)&&void 0!==m?m:f.opacity)&&void 0!==g?g:1,A={name:"Set Opacity of Door",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(f.id,e),c(n+1)}}d((function(t){t.actionState.doorOpacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},tz=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Sr),c=Xw(Zu),s=Xw(Ii),d=Xw(Ci),f=Xw(Zr),p=NP(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(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&!a.locked&&e!==a.frameColor)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Door&&n.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!n.locked&&e!==n.frameColor)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===p||void 0===p?void 0:p.parentId)&&!u.locked&&e!==u.frameColor)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.frameColor))return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Door&&!u.locked)l.set(u.id,null!==(r=u.frameColor)&&void 0!==r?r:"#ffffff")}}catch(F){a.e(F)}finally{a.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&T.foundationId===p.foundationId&&!p.locked)m.set(T.id,null!==(x=T.frameColor)&&void 0!==x?x:"#ffffff")}}catch(F){w.e(F)}finally{w.f()}var P={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){A(P.oldValues)},redo:function(){P.groupId&&b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1)}break;case _.OnlyThisSide:if(p.parentId){var S,H=new Map,j=Object(h.a)(Xw.getState().elements);try{for(j.s();!(S=j.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.parentId===p.parentId&&!p.locked)H.set(R.id,null!==(z=R.frameColor)&&void 0!==z?z:"#ffffff")}}catch(F){j.e(F)}finally{j.f()}var D={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:p.parentId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(H,e),d(s+1)}break;default:if(p){var W,M=f(p.id),I=null!==(W=M?M.frameColor:p.frameColor)&&void 0!==W?W:"#ffffff",C={name:"Set Color of Selected Door",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)}}o((function(t){t.actionState.doorColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("doorMenu.FrameColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},lz=n.a.memo((function(){var e=NP(V.Door),t=Xw(Vi),l=Xw(Ci),a=Xw(Sr),o=Xw(si),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[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),H=S[0],j=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1];if(!e)return null;var N={lng:t},U="36px",E=function(e,t){o((function(l){var a,o=Object(h.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(h.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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"door-copy"}),!e.locked&&Object(pf.jsx)(RP,{keyName:"door-cut"}),Object(pf.jsx)(DP,{keyName:"door-lock"}),!e.locked&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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",N)})},"door-filled"),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"10px"},children:Object(pf.jsx)(ab.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",N)})}),e?Object(pf.jsx)(MP.a,{title:me.t("doorMenu.DoorType",N),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(){E(l.changedElementId,l.oldValue)},redo:function(){E(l.changedElementId,l.newValue)}};a(l),E(e.id,t.target.value),o((function(e){e.actionState.doorType=t.target.value}))},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Gy.Default,children:me.t("doorMenu.Default",N)}),Object(pf.jsx)(rb.a,{style:Xj,value:Gy.Arched,children:me.t("doorMenu.Arched",N)})]})},"door-type"):null,A&&Object(pf.jsx)(Zj,{setDialogVisible:T}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),T(!0)},children:[me.t("word.Width",N)," ..."]},"door-width"),H&&Object(pf.jsx)(_j,{setDialogVisible:j}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),j(!0)},children:[me.t("word.Height",N)," ..."]},"door-height"),e.filled&&Object(pf.jsxs)(pf.Fragment,{children:[D&&Object(pf.jsx)(Qj,{setDialogVisible:W}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),W(!0)},children:[me.t("word.UValue",N)," ..."]},"door-u-value"),Y&&Object(pf.jsx)($j,{setDialogVisible:L}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),L(!0)},children:[me.t("word.VolumetricHeatCapacity",N)," ..."]},"door-heat-capacity"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),s(!0)},children:[me.t("word.Texture",N)," ..."]},"door-texture"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),y(!0)},children:[me.t("word.Color",N)," ..."]},"door-color"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),x(!0)},children:[me.t("doorMenu.FrameColor",N)," ..."]},"door-frame-color"),(e.textureType===fe.Default||e.textureType===fe.NoTexture)&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),F(!0)},children:[me.t("wallMenu.Opacity",N)," ..."]},"door-opacity")]})]}),c&&Object(pf.jsx)(Kj,{setDialogVisible:s}),p&&Object(pf.jsx)(qj,{setDialogVisible:y}),w&&Object(pf.jsx)(tz,{setDialogVisible:x}),C&&Object(pf.jsx)(ez,{setDialogVisible:F})]})})),az=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),r=Xw(Sr),n=Xw(Qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Window),p=UP(null!==(t=null===f||void 0===f||null===(l=f.shutter)||void 0===l?void 0:l.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){o((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){if(!i.locked){var r=i;r.shutter&&(r.shutter.color=t)}break}}}catch(n){o.e(n)}finally{o.f()}}))},v=function(e,t){var l,a=Object(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Window&&e!==a.shutter.color&&!a.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var c=o.value;if(c.type===V.Window&&c.foundationId===f.foundationId&&e!==c.shutter.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===f.parentId&&e!==u.shutter.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.shutter.color))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var u,p,y=t.value;if(y.type===V.Window&&!y.locked)l.set(y.id,null!==(u=null===(p=y.shutter)||void 0===p?void 0:p.color)&&void 0!==u?u:"#808080")}}catch(O){a.e(O)}finally{a.f()}var g={name:"Set Shutter Color for All Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(g.oldValues)},redo:function(){v(g.oldValues,g.newValue)}};r(g),v(l,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,A=Object(h.a)(i);try{for(A.s();!(m=A.n()).done;){var T,P,S=m.value;if(S.type===V.Window&&S.foundationId===f.foundationId&&!f.locked)w.set(S.id,null!==(T=null===(P=S.shutter)||void 0===P?void 0:P.color)&&void 0!==T?T:"#808080")}}catch(O){A.e(O)}finally{A.f()}var H={name:"Set Shutter Color for All Windows Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){b(H.oldValues)},redo:function(){H.groupId&&v(H.oldValues,H.newValue)}};r(H),v(w,e),s(c+1)}break;case _.OnlyThisSide:if(f.parentId){var j,z=new Map,R=Object(h.a)(i);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.Window&&D.parentId===f.parentId&&!D.locked){var W=D;W.shutter&&z.set(D.id,W.shutter.color)}}}catch(O){R.e(O)}finally{R.f()}var M={name:"Set Shutter Color for All Windows On the Same Wall",timestamp:Date.now(),oldValues:z,newValue:e,groupId:f.parentId,undo:function(){b(M.oldValues)},redo:function(){v(M.oldValues,M.newValue)}};r(M),v(z,e),s(c+1)}break;default:if(f){var I,C=d(f.id),F=null!==(I=C?C.tint:f.tint)&&void 0!==I?I:"#808080",k={name:"Set Shutter Color of Selected window",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(k.changedElementId,k.oldValue)},redo:function(){x(k.changedElementId,k.newValue)}};r(k),x(f.id,e),s(c+1)}}o((function(t){t.actionState.windowShutterColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("windowMenu.ShutterColor",w),onApply:function(){A(g)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},oz=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Sr),n=Xw(Qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=Xw(si),p=NP(V.Window),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.shutter)||void 0===l?void 0:l.width)&&void 0!==t?t:.5),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){f((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){var r=i;r.shutter&&(r.shutter.width=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){var t,l=Object(h.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(h.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(p&&function(e){if(p){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Window&&e!==a.shutter.width&&!a.locked)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Window&&c.foundationId===p.foundationId&&e!==c.shutter.width&&!c.locked)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===p.parentId&&e!==u.shutter.width&&!u.locked)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.shutter.width))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Window&&!r.locked){var u=r;u.shutter&&(l.set(r.id,u.shutter.width),v(u.id,e))}}}catch(O){a.e(O)}finally{a.f()}var y={name:"Set Shutter Width for All Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){A(y.oldValues,y.newValue)}};i(y),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;if(x.type===V.Window&&x.foundationId===p.foundationId&&!x.locked){var T=x;T.shutter&&(m.set(x.id,T.shutter.width),v(T.id,e))}}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Shutter Width for All Windows Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){b(P.oldValues)},redo:function(){A(P.oldValues,P.newValue)}};i(P),s(c+1)}break;case _.OnlyThisSide:if(p.parentId){var S,H=new Map,j=Object(h.a)(o);try{for(j.s();!(S=j.n()).done;){var z=S.value;if(z.type===V.Window&&z.parentId===p.parentId&&!z.locked){var R=z;R.shutter&&(H.set(z.id,R.shutter.width),v(R.id,e))}}}catch(O){j.e(O)}finally{j.f()}var D={name:"Set Shutter Width for All Windows On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:p.parentId,undo:function(){b(D.oldValues)},redo:function(){A(D.oldValues,D.newValue)}};i(D),s(c+1)}break;default:if(p){var W,M,I,C,F=null!==(W=null!==(M=null===(I=d(p.id).shutter)||void 0===I?void 0:I.width)&&void 0!==M?M:null===(C=p.shutter)||void 0===C?void 0:C.width)&&void 0!==W?W:.5,k={name:"Set Window Shutter Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(k.changedElementId,k.oldValue)},redo:function(){v(k.changedElementId,k.newValue)}};i(k),v(p.id,e),s(c+1)}}f((function(t){t.actionState.windowShutterWidth=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("windowMenu.ShutterWidth",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:.5,style:{width:120},step:.01,precision:2,value:m,formatter:function(e){return Number(e).toFixed(2)},onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 0.5]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",x)})]})})})]})})};!function(e){e.left="left",e.right="right",e.both="both"}(Vj||(Vj={}));var iz,rz=function(e){var t,l,a,o,i=e.windowId,n=Xw(si),c=Xw(Vi),s=Xw(Ci),d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[1],g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v={lng:c},b=Xw((function(e){var t,l=Object(h.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()}return null})),A=function(e,t){Xw.getState().set((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(r.id===i){var n=r;if(n.shutter)switch(t){case Vj.left:n.shutter.showLeft=e;break;case Vj.right:n.shutter.showRight=e;break;case Vj.both:n.shutter.showLeft=e,n.shutter.showRight=e}break}}}catch(c){o.e(c)}finally{o.f()}}))},T=function(e,t){var l,a,o,r,n=null===b||void 0===b||null===(l=b.shutter)||void 0===l?void 0:l.showLeft,c=null===b||void 0===b||null===(a=b.shutter)||void 0===a?void 0:a.showRight;t===Vj.left?n=e:(t===Vj.right||(n=e),c=e);var s=function(e,t){Xw.getState().set((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){var r=Object(u.a)(t,2),n=r[0],c=r[1],s=i;s.shutter&&(s.shutter.showLeft=n,s.shutter.showRight=c);break}}}catch(d){o.e(d)}finally{o.f()}}))},d={name:"".concat(t," shutter"),timestamp:Date.now(),selectedElementId:i,selectedElementType:V.Window,oldShow:[null===b||void 0===b||null===(o=b.shutter)||void 0===o?void 0:o.showLeft,null===b||void 0===b||null===(r=b.shutter)||void 0===r?void 0:r.showRight],newShow:[n,c],undo:function(){s(this.selectedElementId,this.oldShow)},redo:function(){s(this.selectedElementId,this.newShow)}};Xw.getState().addUndoable(d)};return Object(pf.jsx)(pf.Fragment,{children:(null===b||void 0===b?void 0:b.type)===V.Window&&Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Shutter",v),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&(null===b||void 0===b||null===(t=b.shutter)||void 0===t?void 0:t.showLeft),onChange:function(e){var t=e.target.checked;T(t,Vj.left),A(t,Vj.left),n((function(e){e.actionState.windowShutterLeft=t}))},children:me.t("windowMenu.LeftShutter",{lng:c})})},"left-shutter"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&(null===b||void 0===b||null===(l=b.shutter)||void 0===l?void 0:l.showRight),onChange:function(e){var t=e.target.checked;T(t,Vj.right),A(t,Vj.right),n((function(e){e.actionState.windowShutterRight=t}))},children:me.t("windowMenu.RightShutter",{lng:c})})},"right-shutter"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&((null===b||void 0===b||null===(a=b.shutter)||void 0===a?void 0:a.showLeft)&&(null===b||void 0===b||null===(o=b.shutter)||void 0===o?void 0:o.showRight)),onChange:function(e){var t=e.target.checked;T(t,Vj.both),A(t,Vj.both),n((function(e){e.actionState.windowShutterLeft=t,e.actionState.windowShutterRight=t}))},children:me.t("windowMenu.BothShutters",{lng:c})})},"both-shutters"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),p&&Object(pf.jsx)(az,{setDialogVisible:y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){s(0),y(!0)},children:[me.t("windowMenu.ShutterColor",v)," ..."]},"shutter-color"),w&&Object(pf.jsx)(oz,{setDialogVisible:x}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){s(0),x(!0)},children:[me.t("windowMenu.ShutterWidth",v)," ..."]},"shutter-width")]},"window-shutter")})},nz=function(e){var t,l=e.window,a=e.dataType,o=e.attributeKey,i=e.setDialogVisible,r=Xw(ki),n=Xw(si),c=Xw(Sr),s=Xw(Qu),d=Xw(Ii),f=Xw(Ci),p=UP(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(h.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(h.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(h.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(h.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){var t,l=Object(h.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()}},P=function(e){if(l&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(r);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Window&&e!==i[o]&&!i.locked)return!0}}catch(y){a.e(y)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(r);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&d.foundationId===l.foundationId&&e!==d[o]&&!d.locked)return!0}}catch(y){c.e(y)}finally{c.f()}break;case _.OnlyThisSide:var u,f=Object(h.a)(r);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.Window&&p.parentId===l.parentId&&e!==p[o]&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==l[o])return!0}return!1}(e)){switch(s){case _.AllObjectsOfThisType:var t,i=new Map,u=Object(h.a)(r);try{for(u.s();!(t=u.n()).done;){var p=t.value;p.type!==V.Window||p.locked||i.set(p.id,p[o])}}catch(I){u.e(I)}finally{u.f()}var y={name:"Set ".concat(a," for All Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){T(y.oldValues)},redo:function(){A(y.newValue)}};c(y),A(e),f(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(l.foundationId){var g,m=new Map,w=Object(h.a)(r);try{for(w.s();!(g=w.n()).done;){var P=g.value;P.type!==V.Window||P.foundationId!==l.foundationId||l.locked||m.set(P.id,P[o])}}catch(I){w.e(I)}finally{w.f()}var S={name:"Set ".concat(a," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:l.foundationId,undo:function(){T(S.oldValues)},redo:function(){b(S.groupId,S.newValue)}};c(S),b(l.foundationId,e),f(d+1)}break;case _.OnlyThisSide:if(l.parentId){var H,j=new Map,z=Object(h.a)(r);try{for(z.s();!(H=z.n()).done;){var R=H.value;R.type!==V.Window||R.parentId!==l.parentId||R.locked||j.set(R.id,R[o])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(a," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:j,newValue:e,groupId:l.parentId,undo:function(){T(D.oldValues)},redo:function(){v(l.parentId,D.newValue)}};c(D),v(l.parentId,e),f(d+1)}break;default:if(l){var W=l[o],M={name:"Set ".concat(a," of Selected window"),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:l.id,changedElementType:l.type,undo:function(){x(M.changedElementId,M.oldValue)},redo:function(){x(M.changedElementId,M.newValue)}};c(M),x(l.id,e),f(d+1)}}n((function(t){switch(a){case iz.Tint:t.actionState.windowTint=e;break;case iz.MullionColor:t.actionState.windowMullionColor=e;break;case iz.Color:t.actionState.windowColor=e}}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("windowMenu.".concat(a),w),onApply:function(){l[o]!==g&&P(g)},onClose:function(){i()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:null!==g&&void 0!==g?g:"#73D8FF",onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},cz=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,f=Xw(ki),p=Xw(Sr),y=Xw(Qu),g=Xw(Ii),m=Xw(Ci),w=Xw(si),x=Xw($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(),H=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]},j=function(e,t){w((function(l){var o,i=Object(h.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||H(r,a,t);break}}}catch(n){i.e(n)}finally{i.f()}}))},z=function(e,t){e&&w((function(l){var o,i=Object(h.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||H(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){e&&w((function(l){var o,i=Object(h.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||H(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},D=function(e){w((function(t){var l,o=Object(h.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||H(i,a,e)}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e){var t,l=Object(h.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];j(o,i)}}catch(r){l.e(r)}finally{l.f()}},M=function(e){if(t&&function(e){switch(y){case _.AllObjectsOfThisType:var l,o=Object(h.a)(f);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&!i.locked){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(T){o.e(T)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(f);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Window&&d.foundationId===t.foundationId&&!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(T){s.e(T)}finally{s.f()}break;case _.OnlyThisSide:var g,m=Object(h.a)(f);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.Window&&w.parentId===t.parentId&&!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(T){m.e(T)}finally{m.f()}break;default:var A=x(t);if(A&&t.parentType!==V.Roof){if("lx"===a){if(e!==t[a]*A.lx)return!0}else if("lz"===a){if(e!==t[a]*A.lz)return!0}else if(e!==t[a])return!0}else if(e!==t[a])return!0}return!1}(e)){switch(y){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(f);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Window&&!n.locked){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(G){r.e(G)}finally{r.f()}var u={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){W(u.oldValues)},redo:function(){D(u.newValue)}};p(u),D(e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var v,b=new Map,A=Object(h.a)(f);try{for(A.s();!(v=A.n()).done;){var T=v.value;if(T.type===V.Window&&T.foundationId===t.foundationId&&!T.locked){var P=T,S=x(P),H=P[a];S&&P.parentType!==V.Roof&&("lx"===a?H*=S.lx:"lz"===a&&(H*=S.lz)),b.set(T.id,H)}}}catch(G){A.e(G)}finally{A.f()}var M={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:b,newValue:e,groupId:t.foundationId,undo:function(){W(M.oldValues)},redo:function(){R(t.foundationId,M.newValue)}};p(M),R(t.foundationId,e),m(g+1)}break;case _.OnlyThisSide:if(t.parentId){var I,C=new Map,F=Object(h.a)(f);try{for(F.s();!(I=F.n()).done;){var k=I.value;if(k.type===V.Window&&k.parentId===t.parentId&&!k.locked){var O=k,Y=x(O),L=O[a];Y&&O.parentType!==V.Roof&&("lx"===a?L*=Y.lx:"lz"===a&&(L*=Y.lz)),C.set(k.id,L)}}}catch(G){F.e(G)}finally{F.f()}var N={name:"Set ".concat(l," for All Windows On the Same Parent"),timestamp:Date.now(),oldValues:C,newValue:e,groupId:t.parentId,undo:function(){W(N.oldValues)},redo:function(){z(t.parentId,N.newValue)}};p(N),z(t.parentId,e),m(g+1)}break;default:if(t){var U=t[a],E=x(t);E&&t.parentType!==V.Roof&&("lx"===a?U*=E.lx:"lz"===a&&(U*=E.lz));var J={name:"Set Window ".concat(l),timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){j(J.changedElementId,J.oldValue)},redo:function(){j(J.changedElementId,J.newValue)}};p(J),j(t.id,e),m(g+1)}}w((function(t){switch(l){case iz.Width:t.actionState.windowWidth=e;break;case iz.Height:t.actionState.windowHeight=e;break;case iz.Opacity:t.actionState.windowOpacity=e;break;case iz.FrameWidth:t.actionState.windowFrameWidth=e;break;case iz.SillWidth:t.actionState.windowSillWidth=e;break;case iz.MullionSpacing:t.actionState.windowMullionSpacing=e;break;case iz.MullionWidth:t.actionState.windowMullionWidth=e}}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("windowMenu.".concat(l),S),onApply:function(){M(T)},onClose:function(){d()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Object(pf.jsx)("br",{})," ",c]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:n}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",S)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",S)})]})})})]})})},sz=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Window),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.uValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Window&&e!==o.uValue&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Window&&c.foundationId===f.foundationId&&e!==c.uValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===f.parentId&&e!==u.uValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.uValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Window&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.uValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(Y){r.e(Y)}finally{r.f()}var g={name:"Set U-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Window&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.uValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(Y){x.e(Y)}finally{x.f()}var H={name:"Set U-Value for All Windows Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var j,z=new Map,R=Object(h.a)(a);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.Window&&D.parentId===f.parentId&&!D.locked){var W,M=D;z.set(D.id,null!==(W=M.uValue)&&void 0!==W?W:2),T(M.id,e)}}}catch(Y){R.e(Y)}finally{R.f()}var I={name:"Set U-Value for All Windows On the Same Wall",timestamp:Date.now(),oldValues:z,newValue:e,groupId:f.parentId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;default:if(f){var C,F,k=null!==(C=null!==(F=s(f.id).uValue)&&void 0!==F?F:f.uValue)&&void 0!==C?C:2,O={name:"Set Window U-Value",timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(O.changedElementId,O.oldValue)},redo:function(){T(O.changedElementId,O.newValue)}};o(O),T(f.id,e),c(n+1)}}d((function(t){t.actionState.windowUValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toUValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toUValueInUS(.01),max:Ww.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(Ww.toUValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toUValueInUS(.01).toFixed(3),", ",Ww.toUValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",A)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",A)})]})})})]})})};!function(e){e.Color="Color",e.Tint="Tint",e.Opacity="Opacity",e.MullionWidth="MullionWidth",e.MullionSpacing="MullionSpacing",e.MullionColor="MullionColor",e.FrameWidth="FrameWidth",e.SillWidth="SillWidth",e.Width="Width",e.Height="Height"}(iz||(iz={}));var dz,uz,fz,hz,pz,yz,gz,mz,wz,xz,vz,bz,Az,Tz,Pz,Sz,Hz,jz,zz,Rz,Dz,Wz,Mz,Iz,Cz,Fz,kz,Oz,Yz,Lz,Nz,Uz={Tint:{attributeKey:"tint"},Color:{attributeKey:"color"},MullionColor:{attributeKey:"mullionColor"}},Ez={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},MullionWidth:{attributeKey:"mullionWidth",range:[0,.2],step:.1,unit:"word.MeterAbbreviation",digit:1},MullionSpacing:{attributeKey:"mullionSpacing",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}},Vz=n.a.memo((function(){var e=Xw(si),t=Xw(Vi),l=Xw(Sr),a=Xw(Ci),o=Xw($r),i=Object(r.useState)(null),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[1],g=NP(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(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Window&&i.id===t){i.mullion=l,e.selectedElement=i;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(t,l){e((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Window&&i.id===t){i.windowType=l,e.selectedElement=i;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(t,l){e((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.frame=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(t,l){e((function(e){var a,o=Object(h.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()}}))},T=function(t,l){e((function(e){var a,o=Object(h.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()}}))},P=function(e){return Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),s(e)},children:[me.t("windowMenu.".concat(e),m)," ..."]},"window-".concat(e))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"window-copy"}),!g||g.locked?null:Object(pf.jsx)(RP,{keyName:"window-cut"}),Object(pf.jsx)(DP,{keyName:"window-lock"}),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){A(g.id,!o.checked)},redo:function(){A(g.id,o.checked)}};l(o),A(g.id,a),e((function(e){e.actionState.windowEmpty=a}))},children:me.t("windowMenu.Empty",m)})},"window-empty"),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"10px"},children:Object(pf.jsx)(ab.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(){T(g.id,!o.checked)},redo:function(){T(g.id,o.checked)}};l(o),T(g.id,a),e((function(e){e.actionState.windowInterior=a}))},children:me.t("windowMenu.Interior",m)})}),P(iz.Width),P(iz.Height),P(iz.Opacity),P(iz.Tint),p&&Object(pf.jsx)(sz,{setDialogVisible:y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),y(!0)},children:[me.t("word.UValue",m)," ..."]},"window-u-value"),function(){var e;return g?Object(pf.jsx)(MP.a,{title:me.t("windowMenu.WindowType",m),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.a.Group,{value:null!==(e=g.windowType)&&void 0!==e?e:Yt.Default,style:{height:"75px"},onChange:function(e){var t={name:"Select Window Type",timestamp:Date.now(),oldValue:g.windowType,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){v(t.changedElementId,t.oldValue)},redo:function(){v(t.changedElementId,t.newValue)}};l(t),v(g.id,e.target.value)},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Default,children:me.t("windowMenu.Default",m)}),Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Arched,children:me.t("windowMenu.Arched",m)}),Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Polygonal,children:me.t("windowMenu.Polygonal",m)})]})},"window-type"):null}(),g?Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Mullion",m),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:g.mullion,onChange:function(t){var a=t.target.checked,o={name:"Mullion",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.windowMullion=a}))},children:me.t("windowMenu.Mullion",{lng:t})})},"mullion"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),P(iz.MullionWidth),P(iz.MullionSpacing),P(iz.MullionColor)]},"window-mullion"):null,g?Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Frame",m),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:g.frame,onChange:function(t){var a=t.target.checked,o={name:"Frame",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){b(g.id,!o.checked)},redo:function(){b(g.id,o.checked)}};l(o),b(g.id,a),e((function(e){e.actionState.windowFrame=a}))},children:me.t("windowMenu.Frame",{lng:t})})},"frame"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),P(iz.FrameWidth),P(iz.SillWidth),P(iz.Color)]},"window-frame"):null,Object(pf.jsx)(rz,{windowId:g.id}),function(){switch(c){case iz.Tint:case iz.MullionColor:case iz.Color:var e=Uz[c];return e?Object(pf.jsx)(nz,{window:g,dataType:c,attributeKey:e.attributeKey,setDialogVisible:function(){return s(null)}}):null;case iz.Opacity:case iz.Width:case iz.Height:case iz.MullionSpacing:case iz.MullionWidth:case iz.SillWidth:case iz.FrameWidth:var t,l=Ez[c];return c===iz.Width?l.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===iz.Height&&(l.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lz*Math.min(Math.abs(.5-g.cz),Math.abs(-.5-g.cz)):100),l?Object(pf.jsx)(cz,{windowModel:g,dataType:c,attributeKey:l.attributeKey,range:l.range,step:l.step,setDialogVisible:function(){return s(null)},unit:l.unit?me.t(l.unit,m):void 0,note:l.note?me.t(l.note,m):void 0,digit:null!==(t=l.digit)&&void 0!==t?t:0}):null}}()]})]})})),Jz=l.p+"static/media/roof_01_menu.1418beb1.png",Gz=l.p+"static/media/roof_02_menu.055d6e06.png",Xz=l.p+"static/media/roof_03_menu.1d45e089.png",Bz=l.p+"static/media/roof_04_menu.20dee2dd.png",Kz=l.p+"static/media/roof_05_menu.34757ec1.png",qz=l.p+"static/media/roof_06_menu.0fce42da.png",Qz=l.p+"static/media/roof_07_menu.d0b809f8.png",Zz=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(si),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:he.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.textureType&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);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.textureType)&&void 0!==u?u:he.Default)}}catch(j){r.e(j)}finally{r.f()}var y={name:"Set Texture for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(a);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Roof||x.foundationId!==f.foundationId||x.locked||m.set(x.id,x.textureType)}}catch(j){w.e(j)}finally{w.f()}var T={name:"Set Texture for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){A(T.oldValues)},redo:function(){T.groupId&&b(T.oldValues,T.newValue)}};o(T),b(m,e),c(n+1)}break;default:if(f){var P=d(f.id),S=P?P.textureType:f.textureType,H={name:"Set Texture of Selected Roof",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(H.changedElementId,H.oldValue)},redo:function(){v(H.changedElementId,H.newValue)}};o(H),v(f.id,e),c(n+1)}}s((function(t){t.actionState.roofTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(pf.jsxs)(x,{value:he.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:he.Default,children:[Object(pf.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(pf.jsxs)(x,{value:he.Texture01,children:[Object(pf.jsx)("img",{alt:he.Texture01,src:Jz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture01",w)]},he.Texture01),Object(pf.jsxs)(x,{value:he.Texture02,children:[Object(pf.jsx)("img",{alt:he.Texture02,src:Gz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture02",w)]},he.Texture02),Object(pf.jsxs)(x,{value:he.Texture03,children:[Object(pf.jsx)("img",{alt:he.Texture03,src:Xz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture03",w)]},he.Texture03),Object(pf.jsxs)(x,{value:he.Texture04,children:[Object(pf.jsx)("img",{alt:he.Texture04,src:Bz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture04",w)]},he.Texture04),Object(pf.jsxs)(x,{value:he.Texture05,children:[Object(pf.jsx)("img",{alt:he.Texture05,src:Kz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture05",w)]},he.Texture05),Object(pf.jsxs)(x,{value:he.Texture06,children:[Object(pf.jsx)("img",{alt:he.Texture06,src:qz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture06",w)]},he.Texture06),Object(pf.jsxs)(x,{value:he.Texture07,children:[Object(pf.jsx)("img",{alt:he.Texture07,src:Qz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture07",w)]},he.Texture07)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},_z=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.color&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.color&&!c.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.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(R){r.e(R)}finally{r.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Roof&&T.foundationId===f.foundationId&&!f.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){b(P.oldValues)},redo:function(){P.groupId&&v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1)}break;default:if(f){var S,H=d(f.id),j=null!==(S=H?H.color:f.color)&&void 0!==S?S:"#ffffff",z={name:"Set Color of Selected Roof",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(z.changedElementId,z.oldValue)},redo:function(){x(z.changedElementId,z.newValue)}};i(z),x(f.id,e),s(c+1)}}a((function(t){t.actionState.roofColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},$z=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.thickness&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.thickness&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.thickness))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked){var p=u;l.set(u.id,p.thickness),x(p.id,e)}}}catch(R){r.e(R)}finally{r.f()}var y={name:"Set Thickness for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(a);try{for(w.s();!(g=w.n()).done;){var A=g.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked){var T=A;m.set(A.id,T.thickness),x(T.id,e)}}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Thickness for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){v(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),c(n+1)}break;default:if(f){var S,H,j=null!==(S=null!==(H=s(f.id).thickness)&&void 0!==H?H:f.thickness)&&void 0!==S?S:.4,z={name:"Set Roof Thickness",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(z.changedElementId,z.oldValue)},redo:function(){x(z.changedElementId,z.newValue)}};o(z),x(f.id,e),c(n+1)}}d((function(t){t.actionState.roofThickness=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Thickness",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.05, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},eR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterSpacing&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterSpacing&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterSpacing))return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(d=u.rafterSpacing)&&void 0!==d?d:1),x(u.id,e)}}catch(z){r.e(z)}finally{r.f()}var p={name:"Set Rafter Spacing for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked)g.set(A.id,null!==(w=A.rafterSpacing)&&void 0!==w?w:1),x(A.id,e)}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Spacing for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1)}break;default:if(f){var P,S,H=null!==(P=null!==(S=s(f.id).rafterSpacing)&&void 0!==S?S:f.rafterSpacing)&&void 0!==P?P:1,j={name:"Set Roof Rafter Spacing",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};o(j),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.RafterSpacing",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.1, 100] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},tR=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(qu),i=Xw(Ii),n=Xw(Ci),c=Xw(Zr),s=Xw(si),d=NP(V.Roof),f=Object(r.useState)(void 0!==(null===d||void 0===d?void 0:d.opacity)?d.opacity:.5),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Roof&&e!==i.opacity&&!i.locked)return!0}}catch(s){a.e(s)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===d.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.opacity))return!0}return!1}}(e)){switch(o){case _.AllObjectsOfThisType:var t,r=new Map,u=Object(h.a)(l);try{for(u.s();!(t=u.n()).done;){var f=t.value;if(f.type===V.Roof&&!f.locked){var p=f;r.set(f.id,p.opacity),w(p.id,e)}}}catch(z){u.e(z)}finally{u.f()}var y={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var g,m=new Map,b=Object(h.a)(l);try{for(b.s();!(g=b.n()).done;){var A=g.value;if(A.type===V.Roof&&A.foundationId===d.foundationId&&!A.locked){var T=A;m.set(A.id,T.opacity),w(T.id,e)}}}catch(z){b.e(z)}finally{b.f()}var P={name:"Set Opacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:d.foundationId,undo:function(){x(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};a(P),n(i+1)}break;default:if(d){var S=c(d.id),H=void 0!==S.opacity?S.opacity:void 0!==d.opacity?d.opacity:.5,j={name:"Set Roof Opacity",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(j.changedElementId,j.oldValue)},redo:function(){w(j.changedElementId,j.newValue)}};a(j),w(d.id,e),n(i+1)}}s((function(t){t.actionState.roofGlassOpacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.Opacity",m),onApply:function(){b(y)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},lR=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(Vi),n=Xw(ln),c=Xw(Sr),s=Xw(qu),d=Xw(_u),f=Xw(Ii),p=Xw(Ci),y=Xw(Fi),g=Xw(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}),H=Object(u.a)(S,2),j=H[0],z=H[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 W={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 M=function(e,t){o((function(l){var a,o=Object(h.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(h.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;M(o,t)}}catch(i){a.e(i)}finally{a.f()}},C=function(e){var t,l=Object(h.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];M(o,i)}}catch(r){l.e(r)}finally{l.f()}},F=function(e){if(n)switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(Xw.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(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(n.foundationId){var d,u=new Map,y=Object(h.a)(Xw.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(f+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(){M(T.changedElementId,T.oldValue)},redo:function(){M(T.changedElementId,T.newValue)}};c(T),M(n.id,e),p(f+1)}}},k=function(){(null===n||void 0===n?void 0:n.glassTint)&&v(n.glassTint),a(!1)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t("roofMenu.GlassTint",W)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){F(x)},children:me.t("word.Apply",W)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){k(),y()},children:me.t("word.Cancel",W)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:D,onClick:function(){var e=g(n.id);e&&e.glassTint!==x&&F(x),a(!1),p(0)},children:me.t("word.OK",W)},"OK")],onCancel:k,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!T,bounds:j,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(pf.jsx)("div",{ref:R,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",W)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",W)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",W)})]})})})]})})})},aR=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.rafterColor&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterColor&&!c.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterColor))return!0}return!1}}(e))switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(r=u.rafterColor)&&void 0!==r?r:"#ffffff")}}catch(z){a.e(z)}finally{a.f()}var p={name:"Set Rafter Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(o);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!f.locked)g.set(A.id,null!==(w=A.rafterColor)&&void 0!==w?w:"#ffffff")}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){b(T.oldValues)},redo:function(){T.groupId&&v(T.oldValues,T.newValue)}};i(T),v(g,e),s(c+1)}break;default:if(f){var P,S=d(f.id),H=null!==(P=S?S.rafterColor:f.rafterColor)&&void 0!==P?P:"#ffffff",j={name:"Set Rafter Color of Selected Roof",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};i(j),x(f.id,e),s(c+1)}}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},oR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterWidth&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterWidth&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterWidth))return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(d=u.rafterWidth)&&void 0!==d?d:.1),x(u.id,e)}}catch(z){r.e(z)}finally{r.f()}var p={name:"Set Rafter Width for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked)g.set(A.id,null!==(w=A.rafterWidth)&&void 0!==w?w:.1),x(A.id,e)}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Width for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1)}break;default:if(f){var P,S,H=null!==(P=null!==(S=s(f.id).rafterWidth)&&void 0!==S?S:f.rafterWidth)&&void 0!==P?P:.1,j={name:"Set Roof Rafter Width",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};o(j),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.RafterWidth",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.01, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},iR=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(si),n=Xw(Sr),c=Xw(qu),s=Xw(Ii),d=Xw(Ci),f=Xw(Zr),p=NP(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(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.sideColor&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Roof&&n.foundationId===p.foundationId&&e!==n.sideColor&&!n.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.sideColor))return!0}return!1}}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(r=u.sideColor)&&void 0!==r?r:"#ffffff")}}catch(R){a.e(R)}finally{a.f()}var y={name:"Set Side Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&T.foundationId===p.foundationId&&!p.locked)m.set(T.id,null!==(x=T.sideColor)&&void 0!==x?x:"#ffffff")}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Side Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){A(P.oldValues)},redo:function(){P.groupId&&b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1)}break;default:if(p){var S,H=f(p.id),j=null!==(S=H?H.sideColor:p.sideColor)&&void 0!==S?S:"#ffffff",z={name:"Set Side Color of Selected Roof",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(z.changedElementId,z.oldValue)},redo:function(){v(z.changedElementId,z.newValue)}};n(z),v(p.id,e),d(s+1)}}i((function(t){t.actionState.roofSideColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofSideColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",x)})]})})})]})})},rR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rValue&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rValue&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(W){r.e(W)}finally{r.f()}var g={name:"Set R-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Roof&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(W){x.e(W)}finally{x.f()}var H={name:"Set R-Value for All Roofs Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;default:if(f){var j,z,R=null!==(j=null!==(z=s(f.id).rValue)&&void 0!==z?z:f.rValue)&&void 0!==j?j:2,D={name:"Set Roof R-Value",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(D.changedElementId,D.oldValue)},redo:function(){T(D.changedElementId,D.newValue)}};o(D),T(f.id,e),c(n+1)}}d((function(t){t.actionState.roofRValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("roofMenu.RoofRValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",A)})]})})})]})})},nR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Roof),f=Object(r.useState)(null!==(t=null===d||void 0===d?void 0:d.rise)&&void 0!==t?t:0),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){Xw.getState().updateRoofRiseById(e,t),Xw.getState().set((function(e){e.updateElementOnRoofFlag=!0}))},x=function(e){var t,l=Object(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rise&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===d.foundationId&&e!==c.rise&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.rise))return!0}return!1}}(e))switch(console.log("get",Xw.getState().roofActionScope),Xw.getState().roofActionScope){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.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(j){r.e(j)}finally{r.f()}var f={name:"Set Rise for All Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(f.oldValues)},redo:function(){v(f.oldValues,f.newValue)}};o(f),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var p,y=new Map,g=Object(h.a)(a);try{for(g.s();!(p=g.n()).done;){var m=p.value;m.type!==V.Roof||m.foundationId!==d.foundationId||m.locked||(y.set(m.id,m.rise),w(m.id,e))}}catch(j){g.e(j)}finally{g.f()}var b={name:"Set Rise for All Roofs Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:d.foundationId,undo:function(){x(b.oldValues)},redo:function(){v(b.oldValues,b.newValue)}};o(b),c(n+1)}break;default:if(d){var A,T,P=s(d.id),S=null!==(A=null!==(T=null===P||void 0===P?void 0:P.rise)&&void 0!==T?T:null===d||void 0===d?void 0:d.rise)&&void 0!==A?A:0,H={name:"Set Roof Rise",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(H.changedElementId,H.oldValue)},redo:function(){w(H.changedElementId,H.newValue)}};o(H),w(d.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.Rise",m),onApply:function(){b(y)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 200] ",me.t("word.MeterAbbreviation",m)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",m)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},cR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;default:if(f){var p,y,g=null!==(p=null!==(y=s(f.id).volumetricHeatCapacity)&&void 0!==y?y:f.volumetricHeatCapacity)&&void 0!==p?p:.5,m={name:"Set Volumetric Heat Capacity of Roof",timestamp:Date.now(),oldValue:g,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(m.changedElementId,m.oldValue)},redo:function(){x(m.changedElementId,m.newValue)}};o(m),x(f.id,e),c(n+1)}}d((function(t){t.actionState.roofVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},sR=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ln),i=Xw(Sr),n=Xw(qu),c=Xw(_u),s=Xw(Ii),d=Xw(Ci),f=Xw(Fi),p=Xw(Zr),y=Xw(si),g=Xw((function(e){if(o){var t,l=Object(h.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)(Ww.toRValueInUS(x)),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),W=D[0],M=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 F=function(e,t){y((function(l){var a,o=Object(h.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()}}))},k=function(e){var t,l=Object(h.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()}},O=function(e,t){var l,a=Object(h.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()}},Y=function(e){if(g){switch(n){case _.AllObjectsOfThisType:var t=new Map;y((function(l){var a,o=Object(h.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(){k(l.oldValues)},redo:function(){O(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(h.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(){k(o.oldValues)},redo:function(){O(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,f={name:"Set Ceiling R-Value",timestamp:Date.now(),oldValue:u,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){F(f.changedElementId,f.oldValue)},redo:function(){F(f.changedElementId,f.newValue)}};i(f),F(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)},N=function(){Y(x),l(!1),d(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){Y(x)},children:me.t("word.Apply",C)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){L(),f()},children:me.t("word.Cancel",C)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:N,children:me.t("word.OK",C)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!j,bounds:W,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();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(pf.jsx)("div",{ref:I,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))},onPressEnter:N}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",C),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))},onPressEnter:N}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",C),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return c(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisCeiling",C)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllCeilingsAboveFoundation",C)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllCeilings",C)})]})})})]})})})},dR=n.a.memo((function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(lf),o=Xw(fs),i=Xw($c),n=Xw(hn),c=Xw(fn),s=Xw(Xc),d=Xw(Gc),p=Xw(Ci),y=Xw(Sr),g=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useState)(!1),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],G=E[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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:a(o,l),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){!function(e){if(g){var l=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsx)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(h.a)(Xw.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(h.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){Xw.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(pf.jsxs)(tb.a.ItemGroup,{children:[function(){var e=Xw.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(pf.jsx)(jP,{keyName:"roof-paste"}),Object(pf.jsx)(DP,{keyName:"roof-lock"}),g.rise>0&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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 Ow;if(e.gotSome()&&Xw.getState().contextMenuObjectType){var t=g?o(g.id,!1):new Ow;return Object(pf.jsxs)(MP.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(pf.jsx)(MP.a,{title:me.t("roofMenu.RoofStructure",we),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(pf.jsx)(rb.a,{style:ve,value:Ct.Default,children:me.t("roofMenu.DefaultStructure",we)}),Object(pf.jsx)(rb.a,{style:ve,value:Ct.Rafter,children:me.t("roofMenu.RafterStructure",we)}),Object(pf.jsx)(rb.a,{style:ve,value:Ct.Glass,children:me.t("roofMenu.GlassStructure",we)})]})},"roof-structure"),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[(g.roofStructure===Ct.Rafter||g.roofStructure===Ct.Glass)&&Object(pf.jsxs)(pf.Fragment,{children:[le&&Object(pf.jsx)(tR,{setDialogVisible:ae}),Object(pf.jsxs)(tb.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(pf.jsxs)(pf.Fragment,{children:[j&&Object(pf.jsx)(aR,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),z(!0)},children:[me.t("roofMenu.RafterColor",we)," ..."]},"roof-rafter-color"),x&&Object(pf.jsx)(eR,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),v(!0)},children:[me.t("roofMenu.RafterSpacing",we)," ..."]},"roof-rafter-spacing"),T&&Object(pf.jsx)(oR,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),P(!0)},children:[me.t("roofMenu.RafterWidth",we)," ..."]},"roof-rafter-width")]}),F&&Object(pf.jsx)($z,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),k(!0)},children:[me.t(g.roofStructure===Ct.Rafter?"roofMenu.RafterThickness":"word.Thickness",we)," ","..."]},"roof-thickness"),g.roofStructure===Ct.Glass&&g.roofType===It.Gable&&Object(pf.jsxs)(pf.Fragment,{children:[_&&Object(pf.jsx)(lR,{setDialogVisible:$}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),$(!0)},children:[me.t("roofMenu.GlassTint",we)," ..."]},"roof-glass-tint-selection")]}),W&&Object(pf.jsx)(nR,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),M(!0)},children:[me.t("roofMenu.Rise",we)," ..."]},"roof-rise"),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(pf.jsxs)(pf.Fragment,{children:[re&&Object(pf.jsx)(rR,{setDialogVisible:ne}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ne(!0)},children:[me.t("roofMenu.RoofRValue",we)," ..."]},"roof-r-value"),g.ceiling&&de&&Object(pf.jsx)(sR,{setDialogVisible:ue}),g.ceiling&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ue(!0)},children:[me.t("roofMenu.CeilingRValue",we)," ..."]},"ceiling-r-value"),ye&&Object(pf.jsx)(cR,{setDialogVisible:ge}),Object(pf.jsxs)(tb.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(pf.jsxs)(pf.Fragment,{children:[L&&Object(pf.jsx)(Zz,{setDialogVisible:N}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),N(!0)},children:[me.t("word.Texture",we)," ..."]},"roof-texture")]}),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(pf.jsxs)(pf.Fragment,{children:[J&&Object(pf.jsx)(_z,{setDialogVisible:G}),(g.textureType===he.NoTexture||g.textureType===he.Default)&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),G(!0)},children:[me.t("roofMenu.RoofColor",we)," ..."]},"roof-color"),K&&Object(pf.jsx)(iR,{setDialogVisible:q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),q(!0)},children:[me.t("roofMenu.RoofSideColor",we)," ..."]},"roof-side-color")]})]})]})})),uR=function(e){var t=e.children,l=Xw(vs);return Object(pf.jsx)(nb.a,{trigger:["contextMenu"],overlay:function(){switch(l){case V.Ground:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(YS,{})});case V.Sky:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(wH,{})});case V.Foundation:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(jS,{})});case V.Cuboid:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(OS,{})});case V.Polygon:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(pH,{})});case V.PolygonVertex:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(yH,{})});case V.SolarPanel:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(FH,{})});case V.ParabolicTrough:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(GH,{})});case V.ParabolicDish:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(tj,{})});case V.FresnelReflector:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(dj,{})});case V.Heliostat:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(xj,{})});case V.Sensor:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(gH,{})});case V.Light:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(mH,{})});case V.Human:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(ES,{})});case V.Tree:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Aj,{})});case V.Flower:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(GS,{})});case V.Wall:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Bj,{})});case V.Window:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Vz,{})});case V.Roof:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(dR,{})});case V.Door:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(lz,{})});default:return Object(pf.jsx)(pf.Fragment,{})}}(),children:t},"canvas-context-menu")},fR=n.a.memo(uR),hR=l(49),pR=(l(725),l(829)),yR=l(832),gR=l(845),mR=l(846),wR="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",xR="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=",vR="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==",bR=pR.a.Column,AR=Tv.a.div(dz||(dz=Object(Av.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: 99;\n"]))),TR=Tv.a.div(uz||(uz=Object(Av.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"]))),PR=Tv.a.div(fz||(fz=Object(Av.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=e.cloudFileArray,l=e.openCloudFile,a=e.deleteCloudFile,o=e.renameCloudFile,i=Xw(Vi),c=n.a.useRef(null),s=Object(r.useRef)(null),d=s.current?s.current.clientWidth+40:680,p=s.current?s.current.clientHeight+100:600,y=Object(r.useState)({x:0,y:0}),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],H=P[1],j=Object(r.useState)({left:0,top:0,bottom:0,right:0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(),N=Object(u.a)(L,2),U=N[0],E=N[1],V=Object(r.useRef)(null),J=Object(r.useRef)(Object(f.a)(t)),G=Object(r.useState)(!1),X=Object(u.a)(G,2),B=X[0],K=X[1],q=GT.a.Search,Q={lng:i};Object(r.useEffect)((function(){var e=function(){w({x:Math.max(0,d-window.innerWidth),y:Math.min(0,window.innerHeight-p)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(J.current=Object(f.a)(t),K(!B))}),[t]);var Z=function(){bf.setState((function(e){e.showCloudFilePanel=!1}))},_=function(){U&&I&&O&&(o(U,I,O),Y(void 0)),A(!1)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(lb.a,{title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return H(!0)},onMouseOut:function(){return H(!1)},children:me.t("word.Rename",Q)}),visible:b,onOk:_,onCancel:function(){A(!1),Y(void 0)},modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!S,bounds:R,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();D({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(pf.jsx)("div",{ref:V,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",style:{width:"100%"},children:[Object(pf.jsx)(GT.a,{placeholder:"Title",value:O||I,onPressEnter:_,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){Y(e.target.value)}}),Object(pf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",Q)+": "+me.t("cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks",Q),"."]})]})}),Object(pf.jsx)(qT.a,{nodeRef:c,handle:".handle",bounds:"parent",axis:"both",position:m,onDrag:function(e,t){w({x:Math.max(t.x,d-window.innerWidth),y:Math.min(t.y,window.innerHeight-p)})},onStop:function(e,t){},children:Object(pf.jsx)(AR,{ref:c,children:Object(pf.jsxs)(TR,{ref:s,children:[Object(pf.jsxs)(PR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("cloudFilePanel.MyCloudFiles",Q)+" ("+J.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){Z()},onTouchStart:function(){Z()},children:me.t("word.Close",Q)})]}),Object(pf.jsx)("span",{style:{direction:"ltr"},children:Object(pf.jsx)(q,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("cloudFilePanel.SearchByTitle",Q),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){J.current=[];var l,a=Object(h.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()))&&J.current.push(i)}}catch(r){a.e(r)}finally{a.f()}K(!B)}}})}),Object(pf.jsxs)(pR.a,{size:"small",style:{width:"100%",direction:"ltr"},dataSource:J.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(pf.jsx)(bR,{title:me.t("word.Title",Q),dataIndex:"title",width:"58%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",cursor:"pointer"},title:me.t("word.Open",Q),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(pf.jsx)(bR,{title:me.t("word.Time",Q),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(pf.jsx)(yR.a.Text,{style:{fontSize:"12px"},children:e})}},"time"),Object(pf.jsx)(bR,{width:"17%",title:me.t("word.Action",Q),render:function(e,t){return Object(pf.jsxs)(Pv.b,{size:"middle",children:[Object(pf.jsx)("img",{title:me.t("word.Delete",Q),alt:"Delete",src:xR,onClick:function(){!function(e,t){lb.a.confirm({title:me.t("cloudFilePanel.DoYouReallyWantToDelete",Q)+' "'+t+'"?',content:Object(pf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",Q)+": "+me.t("message.ThisCannotBeUndone",Q)]}),icon:Object(pf.jsx)(mR.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(pf.jsx)("img",{title:me.t("word.Rename",Q),alt:"Rename",src:wR,onClick:function(){C(t.title),E(t.userid),A(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("cloudFilePanel.GenerateLink",Q),alt:"Link",src:vR,onClick:function(){var e=Ge+"?client=web&userid="+t.userid+"&title="+encodeURIComponent(t.title);Zh(e),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",Q)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},HR=n.a.memo(SR),jR=pR.a.Column,zR=Tv.a.div(hz||(hz=Object(Av.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"]))),RR=Tv.a.div(pz||(pz=Object(Av.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"]))),DR=Tv.a.div(yz||(yz=Object(Av.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.likesArray,l=e.openCloudFile,a=Xw(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(){bf.setState((function(e){e.showLikesPanel=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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(pf.jsx)(zR,{ref:o,children:Object(pf.jsxs)(RR,{ref:i,children:[Object(pf.jsxs)(DR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("cloudFilePanel.MyLikes",y)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){g()},onTouchStart:function(){g()},children:me.t("word.Close",y)})]}),Object(pf.jsx)(pR.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(pf.jsx)(jR,{title:me.t("word.Title",y),render:function(e,t){return Object(pf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){var e=t,a=e.lastIndexOf(", ");a>=0&&(bf.setState((function(e){e.openModelsMap=!1})),l(e.substring(a+2),e.substring(0,a)))},children:t.substring(0,t.lastIndexOf(", "))},t)}},"title")})]})})})})},MR=n.a.memo(WR),IR=pR.a.Column,CR=Tv.a.div(gz||(gz=Object(Av.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"]))),FR=Tv.a.div(mz||(mz=Object(Av.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"]))),kR=Tv.a.div(wz||(wz=Object(Av.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"]))),OR=function(e){var t=e.publishedModels,l=e.openCloudFile,a=Xw(Vi),o=Xw(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(){bf.setState((function(e){e.showPublishedModelsPanel=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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(pf.jsx)(CR,{ref:i,children:Object(pf.jsxs)(FR,{ref:c,children:[Object(pf.jsxs)(kR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("modelsMap.MyPublishedModels",g)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){m()},onTouchStart:function(){m()},children:me.t("word.Close",g)})]}),Object(pf.jsx)(pR.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(pf.jsx)(IR,{title:me.t("word.Title",g),render:function(e,t){return Object(pf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){o.uid&&(bf.setState((function(e){e.openModelsMap=!1})),l(o.uid,t))},children:t},t)}},"title")})]})})})})},YR=n.a.memo(OR),LR=(lb.a.confirm,yb.a.Option),NR=Tv.a.div(xz||(xz=Object(Av.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"]))),UR=Tv.a.div(vz||(vz=Object(Av.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"]))),ER=Tv.a.div(bz||(bz=Object(Av.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,l,a,o,i,c,s,d,f,h=e.openCloudFile,p=Xw(si),y=bf(hf),g=Xw(Vi),m=Xw(di),w=bf(ui),x=bf(Rs),v=bf(Ds),b=n.a.useRef(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null!==(t=m.schoolID)&&void 0!==t?t:H.UNKNOWN),P=Object(r.useRef)(null!==(l=m.classID)&&void 0!==l?l:j.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),W=D[0],M=D[1],I={lng:g};Object(r.useEffect)((function(){var e=function(){M({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(){bf.setState((function(e){e.showAccountSettingsPanel=!1}))},F=m&&m.email&&m.email.endsWith("intofuture.org");return Object(pf.jsxs)(pf.Fragment,{children:[x&&Object(pf.jsx)(MR,{likesArray:null!==(a=m.likes)&&void 0!==a?a:[],openCloudFile:h}),v&&Object(pf.jsx)(YR,{publishedModels:null!==(o=m.published)&&void 0!==o?o:[],openCloudFile:h}),Object(pf.jsx)(qT.a,{nodeRef:b,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){},children:Object(pf.jsx)(NR,{ref:b,children:Object(pf.jsxs)(UR,{ref:A,children:[Object(pf.jsxs)(ER,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("accountSettingsPanel.MyAccountSettings",I)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){C()},onTouchStart:function(){C()},children:me.t("word.Close",I)})]}),Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,onClick:function(){m.uid&&(Zh(m.uid),Bh(me.t("accountSettingsPanel.IDInClipBoard",I)))},children:Object(pf.jsx)(Sv.a,{title:me.t("accountSettingsPanel.ClickToCopyMyID",I),style:{cursor:"copy",borderRadius:"8px"},children:me.t("accountSettingsPanel.MyID",I)})}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:m.uid})]}),!1,Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.SchoolID",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.jsxs)(yb.a,{style:{width:"90%"},value:T.current,onChange:function(e){T.current=e,p((function(t){t.user.schoolID=e}))},children:[Object(pf.jsx)(LR,{value:H.UNKNOWN,children:H.UNKNOWN},H.UNKNOWN),Object(pf.jsx)(LR,{value:H.SCHOOL1,children:H.SCHOOL1},H.SCHOOL1),Object(pf.jsx)(LR,{value:H.SCHOOL2,children:H.SCHOOL2},H.SCHOOL2),Object(pf.jsx)(LR,{value:H.SCHOOL3,children:H.SCHOOL3},H.SCHOOL3),Object(pf.jsx)(LR,{value:H.SCHOOL4,children:H.SCHOOL4},H.SCHOOL4),Object(pf.jsx)(LR,{value:H.SCHOOL5,children:H.SCHOOL5},H.SCHOOL5)]})})]}),Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.ClassID",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.jsxs)(yb.a,{style:{width:"90%"},value:P.current,onChange:function(e){P.current=e,p((function(t){t.user.classID=e}))},children:[Object(pf.jsx)(LR,{value:j.UNKNOWN,children:j.UNKNOWN},j.UNKNOWN),Object(pf.jsx)(LR,{value:j.CLASS1,children:j.CLASS1},j.CLASS1),Object(pf.jsx)(LR,{value:j.CLASS2,children:j.CLASS2},j.CLASS2),Object(pf.jsx)(LR,{value:j.CLASS3,children:j.CLASS3},j.CLASS3),Object(pf.jsx)(LR,{value:j.CLASS4,children:j.CLASS4},j.CLASS4),Object(pf.jsx)(LR,{value:j.CLASS5,children:j.CLASS5},j.CLASS5),Object(pf.jsx)(LR,{value:j.CLASS6,children:j.CLASS6},j.CLASS6),Object(pf.jsx)(LR,{value:j.CLASS7,children:j.CLASS7},j.CLASS7),Object(pf.jsx)(LR,{value:j.CLASS8,children:j.CLASS8},j.CLASS8),Object(pf.jsx)(LR,{value:j.CLASS9,children:j.CLASS9},j.CLASS9)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.AllPublished",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.PublishedUnderAliases",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.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(Ww.getLatLngKey(e.latitude,e.longitude));if(i){var r,n=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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(Ww.getLatLngKey(e.latitude,e.longitude));if(a){var o,i=Object(h.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(pf.jsx)(GR.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(W){var e=W.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(W){var e=W.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(W){var e=W.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(W){var e=W.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(pf.jsxs)(pf.Fragment,{children:[j&&_.current.map((function(e,t){var l=.2*T;return Object(pf.jsx)(GR.c,{icon:{path:google.maps.SymbolPath.CIRCLE,strokeColor:"red",strokeWeight:l+2,scale:l},position:e},t)})),F&&F.size&&L&&Object(pf.jsx)(GR.b,{position:{lat:L.lat(),lng:L.lng()},children:Object(pf.jsxs)("div",{style:{border:"2px solid gainsboro",maxHeight:"400px",overflowY:"auto"},onMouseLeave:function(){k(null),N(null)},children:[F.size>1?Object(pf.jsxs)("div",{style:{background:"#dddddd",textAlign:"left",borderBottom:"1px solid gainsboro",paddingBottom:"4px",marginBottom:"4px"},children:[V?Object(pf.jsx)(QR.a,{title:me.t("modelsMap.SortFromNewestToOldest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!1)}}):Object(pf.jsx)(ZR.a,{title:me.t("modelsMap.SortFromOldestToNewest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!0)}}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:[F.size," ",me.t("modelsMap.ModelsFoundOnThisSite",$)]}),L&&Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["\xa0\u2014"," ",me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"]})]}):"",Object(f.a)(F.keys()).sort((function(e,t){var l,a,o=F.get(e),i=F.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=F.get(e);return a?Object(pf.jsxs)("div",{style:{padding:(null===F||void 0===F?void 0:F.size)>1?"5px 5px 20px 5px":"5px",background:t%2===0?"white":"#eeeeee"},children:[0===t&&Object(pf.jsxs)("div",{style:{fontSize:"12px",display:"block",paddingBottom:"6px"},children:[a.countryCode&&Object(pf.jsx)(tD.a,{countryCode:a.countryCode,style:{marginRight:"6px",width:"20px"},svg:!0}),null!==(l=a.address)&&void 0!==l?l:"Unknown",1===F.size&&Object(pf.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(pf.jsx)(qR.a,{style:{background:ce(a)?"#FEF9EC":t%2===0?"white":"#eeeeee",width:"400px"},bordered:!1,ghost:!0,defaultActiveKey:["0"],children:Object(pf.jsx)(lD,{header:Object(pf.jsxs)(pf.Fragment,{children:[a.label,ce(a)&&Object(pf.jsx)(_R.a,{style:{marginLeft:"8px"}})]}),style:{fontSize:"12px"},children:Object(pf.jsx)("div",{style:{fontSize:"10px",display:"block",textAlign:"left"},children:Object(pf.jsxs)(Pv.b,{align:"start",children:[a.thumbnailUrl&&Object(pf.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(pf.jsxs)("div",{children:[a.description&&""!==a.description.trim()?a.description:"","\xa0\u2014\xa0 By"," ",Object(pf.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(pf.jsx)(eD.a,{date:new Date(a.timeCreated)})]})]})})},t)}),Object(pf.jsxs)("div",{style:{marginTop:"10px",fontSize:"11px"},children:[te&&Object(pf.jsx)(pf.Fragment,{children:ce(a)?Object(pf.jsx)($R.a,{style:{cursor:"pointer"},title:me.t("word.Unpin",$),onClick:function(){return se(a,!1)}}):Object(pf.jsx)(_R.a,{style:{cursor:"pointer"},title:me.t("word.Pin",$),onClick:function(){return se(a,!0)}})}),Object(pf.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(pf.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(pf.jsx)("img",{alt:"Delete",onClick:function(){return e=a,void lb.a.confirm({title:me.t("message.DoYouWantToDeleteModelFromMap",$),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){s(e,(function(){m((function(t){if(t.modelSites){var l=t.modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(l){var a,o,i,r=void 0,n=Object(h.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(f){n.e(f)}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)))}}})),k(null),N(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:xR,height:ee,width:ee}),g.uid?Object(pf.jsx)(pf.Fragment,{children:g.likes&&g.likes.includes(Ww.getModelKey(a))?Object(pf.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(pf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Like",$),src:KR,height:ee,width:ee})}):Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)("img",{alt:"Like",style:{marginLeft:"10px",opacity:.5},title:me.t("word.MustLogInToLike",$),src:KR,height:ee,width:ee})}),"\xa0\xa0\xa0",re(a),Object(pf.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(pf.jsx)(GR.d,{children:function(e){return Object(pf.jsx)("div",{children:Object(f.a)(z.keys()).map((function(t,l){var a=z.get(t);if(!a||!a.size)return null;var o=Object(f.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=aD(i);return Object(pf.jsx)(GR.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=F,Z.current=l,k(a);var o=t.split(", ");N(new google.maps.LatLng(Number.parseFloat(o[0]),Number.parseFloat(o[1])))},onMouseOut:function(e){F===q.current&&(k(null),N(null))}},l)}))})}})]})})},iD=n.a.memo(oD),rD=l(853),nD=l(854),cD=l(844),sD=l(838),dD=l(851),uD=l(852),fD=function(e){var t=e.author,l=e.models,a=e.closeCallback,o=e.openCloudFile,i=Xw(di),n=Xw(Vi),c=Xw(si),s=Xw($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],H=GT.a.Search,j=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(h.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(pf.jsx)(sD.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",j))+" (0)",placement:"bottom",visible:!0,height:"150px",onClose:function(){a()},children:Object(pf.jsx)(XR.a,{image:XR.a.PRESENTED_IMAGE_SIMPLE,style:{color:R?"lightgray":"dimgray"}})}):Object(pf.jsx)(sD.a,{extra:Object(pf.jsxs)(Pv.b,{children:[P?Object(pf.jsx)(dD.a,{title:me.t("modelsMap.SortFromNewestToOldest",j),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!1)}}):Object(pf.jsx)(uD.a,{title:me.t("modelsMap.SortFromOldestToNewest",j),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!0)}}),Object(pf.jsx)(H,{title:me.t("modelsMap.SearchByLabel",j),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(l){d.current.clear();var t,a=Object(h.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",j))+" ("+z+")",placement:"bottom",visible:!0,height:"164px",onClose:function(){b(void 0),a()},children:Object(pf.jsx)("table",{children:Object(pf.jsx)("tbody",{children:Object(pf.jsx)("tr",{children:Object(f.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(pf.jsx)("td",{children:Object(pf.jsxs)("div",{style:{display:"block",marginTop:"4px"},children:[Object(pf.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(pf.jsxs)("div",{children:[Object(pf.jsx)("img",{alt:a.type,src:aD(a),style:{position:"relative",left:"8px",bottom:"28px",width:"16px",height:"16px"}}),Object(pf.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}))})})})})},hD=n.a.memo(fD),pD=["places"],yD=Tv.a.div(Az||(Az=Object(Av.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"]))),gD=function(e){var t,l,a=e.openCloudFile,o=e.deleteModelFromMap,i=e.likeModelFromMap,n=e.pinModelFromMap,c=Xw(di),s=Xw(Vi),d=Xw(si),p=Xw(Sr),y=Xw($i),g=Xw(qi),m=void 0!==g?g:42.2844063,w=Xw(Qi),x=void 0!==w?w:-71.3488548,v=null!==(t=Xw.getState().modelsMapAddress)&&void 0!==t?t:Xe,b=bf(er),A=bf(yr),T=Xw(or),P=Xw(ir),S=Xw(rr),H=Object(r.useRef)(S?new Map(S):new Map),j=Object(r.useState)(),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(),k=Object(r.useRef)(),O=Object(r.useMemo)((function(){return{lng:s}}),[s]),Y=GT.a.Search;Object(r.useEffect)((function(){H.current=S?new Map(S):new Map,R&&(F.current=S.get(R)),C(!I)}),[S,R]);var L=Object(GR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:pD}),N=L.isLoaded,U=L.loadError,E=function(){bf.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(h.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(pf.jsxs)(yD,{onKeyDown:function(e){"Escape"===e.key&&E()},children:[N&&Object(pf.jsx)(Pv.b,{children:Object(pf.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(pf.jsx)(GR.e,{onLoad:function(e){k.current=e},onPlacesChanged:function(){var e,t=null===(e=k.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(pf.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"}})})})}),N?Object(pf.jsx)(iD,{selectAuthor:function(e){D(e),bf.setState((function(t){t.showLeaderboard||(t.leaderboardFlag=!0),e&&(F.current=H.current.get(e))}))},closeMap:E,openModel:a,deleteModel:o,likeModel:i,pinModel:n}):Object(pf.jsx)(Iv,{}),U&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})}),Object(pf.jsxs)(pf.Fragment,{children:[R&&Object(pf.jsx)(hD,{author:R,models:F.current,closeCallback:function(){D(void 0),F.current=void 0}}),A&&!R&&Object(pf.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(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(Y,{title:me.t("modelsMap.SearchByPublisher",O),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(S){H.current.clear();var t,l=Object(h.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())&&H.current.set(o,i)}}catch(r){l.e(r)}finally{l.f()}C(!I)}}}),0===H.current.size?Object(pf.jsx)(XR.a,{image:XR.a.PRESENTED_IMAGE_SIMPLE}):Object(pf.jsx)("table",{children:Object(pf.jsx)("tbody",{children:Object(f.a)(H.current.keys()).sort((function(e,t){var l=H.current.get(e),a=H.current.get(t);return(a?a.size:0)-(l?l.size:0)})).map((function(e,t){if(t>50)return null;var l=H.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(pf.jsxs)("tr",{style:{width:"180px"},children:[Object(pf.jsx)("td",{style:{width:"150px"},children:Object(pf.jsx)(BR.a,{icon:Object(pf.jsx)(rD.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(pf.jsx)("td",{children:null===l||void 0===l?void 0:l.size})]},t)}))})})]})}),Object(pf.jsx)(Pv.b,{children:Object(pf.jsxs)("div",{title:me.t("modelsMap.TotalNumberOfUserPublishedModels",O)+": "+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(){bf.setState((function(e){e.showLeaderboard||(e.leaderboardFlag=!0),e.showLeaderboard=!e.showLeaderboard}))},children:[A?Object(pf.jsx)(nD.a,{title:me.t("word.Close",O),style:{marginRight:"8px"}}):Object(pf.jsx)(cD.a,{title:me.t("word.Open",O),style:{marginRight:"8px"}}),me.t("word.Leaderboard",O)]})}),T&&Object(pf.jsx)(Pv.b,{children:Object(pf.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",O)+": ",T.countryCode&&Object(pf.jsx)(tD.a,{countryCode:T.countryCode,style:{marginLeft:"2px",marginRight:"4px",width:"20px"},svg:!0}),T.title+", by "+T.author]})}),Object(pf.jsx)(Pv.b,{children:Object(pf.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(){E()},children:me.t("word.Close",O)})}),V&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)(ab.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(){bf.setState((function(e){e.modelsMapWeatherStations=!e.modelsMapWeatherStations}))},children:b?Object(pf.jsx)("span",{title:me.t("mapPanel.WeatherStationsNote",O),children:me.t("mapPanel.WeatherStations",O)}):Object(pf.jsx)("span",{children:me.t("mapPanel.WeatherStations",O)})})})]})]})},mD=n.a.memo(gD),wD=l(839),xD="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==",vD="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=",bD="data:image/png;base64,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",AD="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",TD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC",PD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==",SD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC",HD="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=",jD="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=",zD="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",RD="data:image/png;base64,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",DD="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",WD="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",MD="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==",ID="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==",CD="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",FD="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=",kD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=",OD="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",YD="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=",LD=function(e){var t=Object.assign({},e);return Object(pf.jsx)("div",{style:{verticalAlign:"top",display:"inline-block",marginTop:"4px",marginRight:"8px"},children:t.children})},ND=function(){var e=Xw(si),t=bf(hf),l=Xw(Gi),a=Xw.getState().elements,n=Xw(Vi),c=Xw(is),s=Xw(cs),d=Xw(o.showHeliodonPanel),p=Xw(i.noAnimationForHeatmapSimulation),y=bf(Us),g=Xw(zr),m=Xw(ns),w=Xw(Iu),x=Xw(Fu),v=Xw(Ou),b=Xw(Gu),A=Xw(Xu),T=Xw(Sr),P=bf(Lr),S=bf(Nr),H=Xw(Eu),j=Object(r.useState)(V.Foundation),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(V.Wall),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(V.SolarPanel),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useMemo)((function(){return{lng:n}}),[n]),N="invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)",U="invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)",E=function(){e((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.actionModeLock=!1}))},J=function(t){e((function(e){e.objectTypeToAdd=t,e.groupActionMode=!1,e.groupMasterId=null,e.actionModeLock=!1})),Nt.getState().setEnableOrbitController(!1),c()},G=function(e,t,l,a){var o=e.charAt(0).toLowerCase()+e.slice(1).replace(/\s+/g,"");return Object(pf.jsxs)(tb.a.Item,{style:{userSelect:"none"},onClick:function(){l(e),J(e)},children:[Object(pf.jsx)("img",{alt:e,src:t,height:36,width:36,style:{filter:N,verticalAlign:"middle",marginRight:"10px"}}),me.t("toolbar.SwitchToAdding".concat(null!==a&&void 0!==a?a:e.replaceAll(" ","")),L)]},"add-".concat(o,"-menu-item"))},X=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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{title:me.t("toolbar.Add".concat(null!==o&&void 0!==o?o:t.replaceAll(" ","")),L)+(i?"\n"+(s?me.t("toolbar.ClickToUnlockThisModeForNextAction",L):me.t("toolbar.DoubleClickToLockThisModeForNextAction",L)):""),alt:t,src:l,height:36,width:36,style:{filter:m===t||a?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){J(t)},onDoubleClick:function(){i&&e((function(e){e.actionModeLock=!0}))}}),(m===t||a)&&i&&s&&Object(pf.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:m===t||a?U:N,verticalAlign:"top"}})]})},B=function(e){return Object(pf.jsx)(nb.a,{overlay:e,trigger:["click"],children:Object(pf.jsx)("span",{title:me.t("toolbar.ClickForMoreButtons",L),style:{cursor:"pointer",verticalAlign:"middle",fontSize:"10px",marginLeft:"4px",width:"10px",height:"36px",color:"#666666",fontWeight:"bold"},children:"\u25bc"})})},K=Object(pf.jsxs)(tb.a,{children:[G(V.Foundation,xD,D),G(V.Cuboid,vD,D),G(V.Tree,WD,D),G(V.Flower,MD,D),G(V.Human,ID,D,"People")]}),q=Object(pf.jsxs)(tb.a,{children:[G(V.Wall,TD,C),G(V.Window,PD,C),G(V.Door,SD,C),G(V.PyramidRoof,HD,C),G(V.HipRoof,jD,C),G(V.GableRoof,DD,C),G(V.GambrelRoof,zD,C),G(V.MansardRoof,RD,C)]}),Q=Object(pf.jsxs)(tb.a,{children:[G(V.SolarPanel,AD,Y),G(V.ParabolicTrough,CD,Y),G(V.ParabolicDish,FD,Y),G(V.FresnelReflector,kD,Y),G(V.Heliostat,OD,Y),G(V.Sensor,bD,Y),G(V.Light,YD,Y)]});return Object(pf.jsxs)("div",{children:[Object(pf.jsx)(LD,{children:Object(pf.jsx)("img",{title:me.t("toolbar.Select",L),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:m!==V.None||w||x||v||b||A||H?N:U,cursor:"pointer",verticalAlign:"middle"},onClick:E})}),Object(pf.jsx)(LD,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ManipulateGroup",L),alt:"Group",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==",height:36,width:36,style:{filter:H?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){e((function(e){if(e.groupActionMode)e.groupMasterId=null;else{if(e.selectedElement)if(Qf(e.selectedElement))e.groupMasterId=Ww.getBaseId(e.selectedElement.id);else{var t,l=Ww.getBaseId(null!==(t=e.selectedElement.foundationId)&&void 0!==t?t:e.selectedElement.parentId);e.groupMasterId=l;var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.selected=i.id===l}}catch(c){o.e(c)}finally{o.f()}e.selectedElementIdSet.clear(),l&&e.selectedElementIdSet.add(l)}else{var r,n=Object(h.a)(e.elements);try{for(n.s();!(r=n.n()).done;){r.value.selected=!1}}catch(c){n.e(c)}finally{n.f()}e.selectedElementIdSet.clear()}e.objectTypeToAdd=V.None}e.groupActionMode=!e.groupActionMode}))}})}),Object(pf.jsxs)(LD,{children:[function(e){switch(e){case V.Foundation:return X(e,xD,Xw.getState().addedFoundationId);case V.Cuboid:return X(e,vD,Xw.getState().addedCuboidId);case V.Tree:return X(e,WD);case V.Flower:return X(e,MD);case V.Human:return X(e,ID,void 0,"People")}}(R),B(K)]}),Object(pf.jsxs)(LD,{children:[function(e){switch(e){case V.Wall:return X(e,TD,Xw.getState().addedWallId);case V.Window:return X(e,PD,Xw.getState().addedWindowId);case V.Door:return X(e,SD,Xw.getState().addedDoorId);case V.PyramidRoof:return X(V.PyramidRoof,HD);case V.HipRoof:return X(V.HipRoof,jD);case V.GableRoof:return X(V.GableRoof,DD);case V.GambrelRoof:return X(V.GambrelRoof,zD);case V.MansardRoof:return X(V.MansardRoof,RD)}}(I),B(q)]}),Object(pf.jsxs)(LD,{children:[function(e){switch(e){case V.SolarPanel:return X(e,AD);case V.ParabolicTrough:return X(e,CD);case V.ParabolicDish:return X(e,FD);case V.FresnelReflector:return X(e,kD);case V.Heliostat:return X(e,OD);case V.Sensor:return X(e,bD);case V.WindTurbine:return X(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 X(e,YD)}}(O),B(Q)]}),Object(pf.jsx)(LD,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ClearScene",L),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(){lb.a.confirm({title:me.t("toolbar.DoYouReallyWantToClearContent",L)+"?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var t=JSON.parse(JSON.stringify(Xw.getState().elements));g();var l={name:"Clear Scene",timestamp:Date.now(),removedElements:t,undo:function(){e((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(l.removedElements))}))},redo:function(){g()}};T(l)}}),E()}})}),Object(pf.jsx)(LD,{children:Object(pf.jsx)("img",{title:me.t("toolbar.SpatialAnalysisOfEnergy",L),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:y?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){y?bf.setState((function(e){e.showSolarRadiationHeatmap=!1,e.showHeatFluxes=!1})):!p||Ww.hasMovingParts(a)?(P||Kh(me.t("message.SimulationStarted",L)),setTimeout((function(){c(),t("runDynamicSimulation",!P),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()})}))}),100)):(S||Kh(me.t("message.SimulationStarted",L)),setTimeout((function(){c(),t("runStaticSimulation",!S),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()})}))}),100))}})}),Object(pf.jsx)(LD,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ShowSunAndTimeSettings",L),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?U:N,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}))}};T(t),e((function(e){e.viewState.showHeliodonPanel=!e.viewState.showHeliodonPanel}))}})})]})},UD=n.a.memo(ND),ED=Tv.a.div(Tz||(Tz=Object(Av.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"]))),VD=function(e){var t=e.signIn,l=e.signOut,a=Xw(Vi),o=Xw(di),i=bf(Ki),n=Object(r.useMemo)((function(){return{lng:a}}),[a]),c=Object(pf.jsxs)(tb.a,{triggerSubMenuAction:"click",children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showAccountSettingsPanel=!0}))},children:me.t("avatarMenu.AccountSettings",n)},"account"),Object(pf.jsx)(tb.a.Item,{onClick:l,children:me.t("avatarMenu.SignOut",n)},"signOut")]});return Object(pf.jsx)(ED,{children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[!i&&Object(pf.jsx)(UD,{}),Object(pf.jsx)("div",{style:{verticalAlign:"top"},children:o.displayName?Object(pf.jsx)(nb.a,{overlay:c,trigger:["click"],children:Object(pf.jsx)("a",{className:"ant-dropdown-link",onClick:function(e){return e.preventDefault()},title:me.t("tooltip.clickToAccessCloudTools",n),children:Object(pf.jsx)(wD.a,{size:32,src:o.photoURL,alt:o.displayName})})}):Object(pf.jsx)(Sv.a,{type:"primary",title:me.t("avatarMenu.PrivacyInfo",n),onClick:t,children:me.t("avatarMenu.SignIn",n)})})]})})},JD=n.a.memo(VD),GD=function(e){var t=e.saveToCloud,l=e.isLoading,a=e.setTitle,o=e.getTitle,i=e.setTitleDialogVisible,n=e.isTitleDialogVisible,c=Xw(si),s=Xw(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(pf.jsx)(lb.a,{width:500,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:A,children:me.t("word.Cancel",v)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:b,disabled:!o(),children:me.t("word.OK",v)},"OK")],confirmLoading:l(),onCancel:A,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:x,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[Object(pf.jsxs)("span",{children:[me.t("word.Title",v),":"]}),Object(pf.jsx)(GT.a,{style:{width:"400px"},placeholder:"Title",value:o(),onPressEnter:b,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){a(e.target.value)}})]})})},XD=n.a.memo(GD),BD=pR.a.Column,KD=Tv.a.div(Pz||(Pz=Object(Av.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: 99;\n"]))),qD=Tv.a.div(Sz||(Sz=Object(Av.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"]))),QD=Tv.a.div(Hz||(Hz=Object(Av.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"]))),ZD=function(e){var t=e.projects,l=e.setProjectState,a=e.deleteProject,o=e.renameProject,i=Xw(Vi),c=Xw(di),s=n.a.useRef(null),d=Object(r.useRef)(null),p=d.current?d.current.clientWidth+40:680,y=d.current?d.current.clientHeight+100:600,g=Object(r.useState)({x:0,y:0}),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),H=S[0],j=S[1],z=Object(r.useState)({left:0,top:0,bottom:0,right:0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useRef)(null),U=Object(r.useRef)(Object(f.a)(t)),E=Object(r.useState)(!1),V=Object(u.a)(E,2),J=V[0],G=V[1],X=GT.a.Search,B=Object(r.useMemo)((function(){return{lng:i}}),[i]);Object(r.useEffect)((function(){var e=function(){x({x:Math.max(0,p-window.innerWidth),y:Math.min(0,window.innerHeight-y)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(U.current=Object(f.a)(t),G(!J))}),[t]);var K=function(){bf.setState((function(e){e.showProjectListPanel=!1}))},q=function(){C&&Y&&(o(C,Y),L(void 0),G(!J)),T(!1)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(lb.a,{title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return j(!0)},onMouseOut:function(){return j(!1)},children:me.t("word.Rename",B)}),visible:A,onOk:q,onCancel:function(){T(!1),L(void 0)},modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!H,bounds:D,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();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(pf.jsx)("div",{ref:N,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",style:{width:"100%"},children:[Object(pf.jsx)(GT.a,{placeholder:"Title",value:Y||C,onPressEnter:q,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){L(e.target.value)}}),Object(pf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",B)+": "+me.t("projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks",B),"."]})]})}),Object(pf.jsx)(qT.a,{nodeRef:s,handle:".handle",bounds:"parent",axis:"both",position:w,onDrag:function(e,t){x({x:Math.max(t.x,p-window.innerWidth),y:Math.min(t.y,window.innerHeight-y)})},onStop:function(e,t){},children:Object(pf.jsx)(KD,{ref:s,children:Object(pf.jsxs)(qD,{ref:d,children:[Object(pf.jsxs)(QD,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("projectListPanel.MyProjects",B)+" ("+U.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){K()},onTouchStart:function(){K()},children:me.t("word.Close",B)})]}),Object(pf.jsx)("span",{style:{direction:"ltr"},children:Object(pf.jsx)(X,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("projectListPanel.SearchByTitle",B),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){U.current=[];var l,a=Object(h.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()))&&U.current.push(i)}}catch(r){a.e(r)}finally{a.f()}G(!J)}}})}),Object(pf.jsxs)(pR.a,{size:"small",style:{width:"100%",direction:"ltr",verticalAlign:"top"},dataSource:U.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(pf.jsx)(BD,{title:me.t("word.Type",B),dataIndex:"type",width:"25%",render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})}},"type"),Object(pf.jsx)(BD,{title:me.t("word.Title",B),dataIndex:"title",width:"33%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",cursor:"pointer",verticalAlign:"top"},title:me.t("word.Open",B),children:e})},onCell:function(e){return{onClick:function(){var t=window.getSelection();t&&t.toString().length>0||l(e)}}}},"title"),Object(pf.jsx)(BD,{title:me.t("word.Time",B),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})}},"time"),Object(pf.jsx)(BD,{width:"17%",title:me.t("word.Action",B),render:function(e,t){return Object(pf.jsxs)(Pv.b,{size:"middle",style:{verticalAlign:"top"},children:[Object(pf.jsx)("img",{title:me.t("word.Delete",B),alt:"Delete",src:xR,onClick:function(){var e;e=t.title,lb.a.confirm({title:me.t("projectListPanel.DoYouReallyWantToDeleteProject",B)+' "'+e+'"?',content:Object(pf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",B)+": "+me.t("message.ThisCannotBeUndone",B)]}),icon:Object(pf.jsx)(mR.a,{}),onOk:function(){a(e)}})},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("word.Rename",B),alt:"Rename",src:wR,onClick:function(){F(t.title),T(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("projectListPanel.GenerateProjectLink",B),alt:"Link",src:vR,onClick:function(){var e=Ge+"?client=web&userid="+c.uid+"&project="+encodeURIComponent(t.title);Zh(e),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",B)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},_D=n.a.memo(ZD),$D=function(e,t,l){Object(r.useEffect)((function(){e&&(t(),l())}),[e])},eW=function(e){var t=e.viewOnly,l=void 0!==t&&t,a=e.canvas,o=Xw(si),n=bf(hf),c=Xw(Vi),s=Xw(di),p=Xw(i.latitude),y=Xw(i.longitude),g=Xw(i.address),m=Xw(i.countryCode),w=Xw(jr),v=bf(Ts),b=bf(Hs),A=bf(js),T=bf(zs),P=bf(Ki),R=Xw(ar),D=bf(nr),M=bf(hr),I=bf(pr),C=bf(gr),F=bf(mr),k=Xw(tr),O=Xw(lr),Y=Xw(Hr),L=Xw(Rr),N=bf(Di),U=Xw(wr),E=Xw(rr),J=bf(cr),G=bf(sr),X=bf(dr),B=bf(ur),K=bf(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)(),He=Object(r.useRef)(),je=Object(r.useRef)(!0),ze=Object(r.useMemo)((function(){return{lng:c}}),[c]);Object(r.useEffect)((function(){var e=0===oP.a.apps.length;return 1===oP.a.apps.length&&oP.a.apps[0].name===S.LOG_DATA&&(e=!0),e?oP.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"}):oP.a.app(),oP.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:Gw.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(He.current=new Map,s.aliases&&s.aliases.length>0){var e,t=Object(h.a)(s.aliases);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l!==s.displayName){var a=E.get(l);a&&(He.current=new Map([].concat(Object(f.a)(He.current),Object(f.a)(a))))}}}catch(i){t.e(i)}finally{t.f()}}if(s.displayName){var o=E.get(s.displayName);o&&(He.current=new Map([].concat(Object(f.a)(He.current),Object(f.a)(o))))}}),[E,s.displayName,s.aliases]),$D(D,(function(){R&&(Je(R,!1,!1),xe(R))}),(function(){return n("saveCloudFileFlag",!1)})),$D(M,(function(){Ie().then((function(){Ce().then((function(){}))}))}),(function(){return n("modelsMapFlag",!1)})),$D(I,(function(){Fe().then((function(){Ce().then((function(){}))}))}),(function(){return n("leaderboardFlag",!1)})),$D(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:Xw.getState().modelType,author:null!==(t=Xw.getState().modelAuthor)&&void 0!==t?t:s.displayName,userid:s.uid,title:we,label:Xw.getState().modelLabel,description:Xw.getState().modelDescription,timeCreated:Date.now()},i=Ww.getModelKey(l),r=oP.a.firestore().collection("models");if(r){var n=oP.a.storage().ref();if(a)Ww.resizeCanvas(a,200).toBlob((function(e){if(e){var t=n.child("images/"+i+".png").put(e,{contentType:"image/png"});t.on(oP.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(Ww.getLatLngKey(p,y));n.get().then((function(e){if(e.exists){var t=e.data();t&&t[i]?n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.UpdatedOnModelsMap",ze)+".")})):n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))}else n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))})).catch((function(e){Qh(me.t("message.CannotPublishModelOnMap",ze)+": "+e)})),oP.a.firestore().collection("board").doc("people").update(Object(hR.a)({},(null!==(t=a.author)&&void 0!==t?t:"Anonymous")+"."+Ww.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(Ww.getModelKey(a),a)}}))})),oP.a.firestore().collection("board").doc("info").set({latestModel:a},{merge:!0}).then((function(){}))}))}))}}))}oP.a.firestore().collection("users").doc(s.uid).update(Xw.getState().modelAuthor===s.displayName?{published:oP.a.firestore.FieldValue.arrayUnion(we)}:{published:oP.a.firestore.FieldValue.arrayUnion(we),aliases:oP.a.firestore.FieldValue.arrayUnion(Xw.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)})),$D(J,(function(){if(!s||!s.uid)return;var e=bf.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)+".");Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(f){i.e(f)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r,n,c=null!==(r=bf.getState().projectType)&&void 0!==r?r:W.SOLAR_PANEL_ARRAY,d=null!==(n=bf.getState().projectDescription)&&void 0!==n?n:null,u=(new Date).getTime();oP.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:Gw.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=Gw.getDefaultHiddenParameters(t.projectInfo.type)}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ne(!1).then((function(){le(!te)})),_(!1)}))}}))}),(function(){return n("createProjectFlag",!1)})),$D(G,(function(){if(!s||!s.uid)return;var e=bf.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)+".");Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.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=Xw.getState().projectInfo.designs;if(r){var n,c,d,f,p,y,g,m,w=bf.getState().projectType,x=bf.getState().projectDescription,v=Xw.getState().projectInfo.owner,A=(new Date).getTime(),T=Xw.getState().projectInfo.counter,P=null!==(n=Xw.getState().projectInfo.dataColoring)&&void 0!==n?n:null,S=null!==(c=Xw.getState().projectInfo.selectedProperty)&&void 0!==c?c:null,H=!!Xw.getState().projectInfo.sortDescending,j=null!==(d=Xw.getState().projectInfo.xAxisNameScatteredPlot)&&void 0!==d?d:"rowWidth",z=null!==(f=Xw.getState().projectInfo.yAxisNameScatteredPlot)&&void 0!==f?f:"rowWidth",R=null!==(p=Xw.getState().projectInfo.dotSizeScatteredPlot)&&void 0!==p?p:5,D=null!==(y=Xw.getState().projectInfo.thumbnailWidth)&&void 0!==y?y:200,W=null!==(g=sP(t,r))&&void 0!==g?g:[],M=Object(h.a)(r.entries());try{for(M.s();!(m=M.n()).done;){var I=Object(u.a)(m.value,2),C=I[0],F=I[1];fP(F.title,W[C].title,v,s.uid)}}catch(J){M.e(J)}finally{M.f()}var k=Xw.getState().projectImages;if(k&&k.size>0){var O,Y,L=Object(h.a)(r.entries());try{for(L.s();!(Y=L.n()).done;){var N=Object(u.a)(Y.value,2),U=N[0],E=N[1],V=k.get(E.title);V&&(W[U].thumbnail=uP(V))}}catch(J){L.e(J)}finally{L.f()}oP.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:H,xAxisNameScatteredPlot:j,yAxisNameScatteredPlot:z,dotSizeScatteredPlot:R,thumbnailWidth:D,designs:W,ranges:null!==(O=Xw.getState().projectInfo.ranges)&&void 0!==O?O:null,hiddenParameters:Xw.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=W}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ne(!1).then((function(){le(!te)})),_(!1)}))}}}}))}),(function(){return n("saveProjectFlag",!1)})),$D(B,(function(){Ue(!0)}),(function(){return n("showProjectsFlag",!1)})),$D(K,(function(){Ue(!1),le(!te)}),(function(){return n("updateProjectsFlag",!1)})),$D(F,(function(){if(!s.uid)return;Qe().then((function(){bf.setState((function(e){e.showCloudFilePanel=!0}))}))}),(function(){return n("listCloudFilesFlag",!1)})),$D(X,(function(){var e=Xw.getState().projectInfo.owner;if(s.uid!==e)Kh(me.t("message.CannotAddDesignToProjectOwnedByOthers",ze));else{var t=Xw.getState().projectInfo.title;if(t){var l,i,r;_(!0);var n=null!==(l=Xw.getState().projectInfo.type)&&void 0!==l?l:W.SOLAR_PANEL_ARRAY,c=null!==(i=Xw.getState().projectInfo.thumbnailWidth)&&void 0!==i?i:200,d=null!==(r=Xw.getState().projectInfo.counter)&&void 0!==r?r:0;!function(e,t,l,i){if(!s.uid||!a)return;var r=Ww.resizeCanvas(a,i).toDataURL(),n=cP(e,l,r);oP.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).update({designs:oP.a.firestore.FieldValue.arrayUnion(n),counter:oP.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(k)}),[O]),Object(r.useEffect)((function(){xe(null!==R&&void 0!==R?R:"My Aladdin File")}),[R]),Object(r.useEffect)((function(){je.current?je.current=!1:Me(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),iP(t,a,Ee).finally((function(){_(!1)})),l&&Ve(t,l)):l&&qe(t,l)}else o((function(e){e.cloudFile=void 0}))},We=function(){var e=Object(Nh.a)(Lh.a.mark((function e(t){var l,a,i,r,n,c,s,d,u,f,p;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return l=oP.a.firestore(),a=!1,i=!1,r=0,n=H.UNKNOWN,c=j.UNKNOWN,s=[],d=[],u=[],e.next=11,l.collection("users").get().then((function(e){r=e.size;var l,o=Object(h.a)(e.docs);try{for(o.s();!(l=o.n()).done;){var f=l.value;if(f.id===t.uid){var p=f.data();return a=!!p.signFile,i=!!p.noLogging,n=p.schoolID?p.schoolID:H.UNKNOWN,c=p.classID?p.classID:j.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})),bf.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!==(f=t.schoolID)&&void 0!==f?f:H.UNKNOWN,classID:null!==(p=t.classID)&&void 0!==p?p:j.UNKNOWN,since:x()(new Date).format("MM/DD/YYYY hh:mm A"),os:Ww.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)}}(),Me=function(e){var t,l;e.uid&&oP.a.firestore().collection("users").doc(e.uid).update({signFile:!!e.signFile,schoolID:null!==(t=e.schoolID)&&void 0!==t?t:H.UNKNOWN,classID:null!==(l=e.classID)&&void 0!==l?l:j.UNKNOWN}).then((function(){Kh(me.t("message.YourAccountSettingsWereSaved",ze))})).catch((function(e){Qh(me.t("message.CannotSaveYourAccountSettings",ze)+": "+e)}))},Ie=function(){var e=Object(Nh.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,oP.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(Nh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,oP.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(Ww.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)}}(),Fe=function(){var e=Object(Nh.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,oP.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)}}(),ke=function(e,t){var l;s&&s.uid&&(oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e),oP.a.firestore.FieldValue.delete())).then((function(){Bh(me.t("message.ModelDeletedFromMap",ze)),t&&t()})).catch((function(e){Qh(me.t("message.CannotDeleteModelFromMap",ze)+": "+e)})),oP.a.firestore().collection("board").doc("people").update(Object(hR.a)({},(null!==(l=e.author)&&void 0!==l?l:"Anonymous")+"."+Ww.getModelKey(e),oP.a.firestore.FieldValue.delete())).then((function(){o((function(t){t.peopleModels&&(t.peopleModels.delete(Ww.getModelKey(e)),bf.setState((function(e){e.leaderboardFlag=!0})))}))})),oP.a.firestore().collection("users").doc(s.uid).update({published:oP.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)}}))})))},Oe=function(e,t,l){if(s&&s.uid){var a=Ww.getModelKey(e);oP.a.firestore().collection("users").doc(s.uid).update(t?{likes:oP.a.firestore.FieldValue.arrayUnion(a)}:{likes:oP.a.firestore.FieldValue.arrayRemove(a)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}));var o=a+".likeCount";oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(t?Object(hR.a)({},o,oP.a.firestore.FieldValue.increment(1)):Object(hR.a)({},o,oP.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&&oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e)+".pinned",t)).then((function(){l&&l()})).catch((function(e){}))},Le=function(e){s&&s.uid&&oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e)+".clickCount",oP.a.firestore.FieldValue.increment(1))).then((function(){})).catch((function(e){}))},Ne=function(){var e=Object(Nh.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,oP.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:Gw.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&&Ne(!e).then((function(){e&&bf.setState((function(e){e.showProjectListPanel=!0})),pe(!he)}))},Ee=function(e){o((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,t){e&&t&&(_(!0),hP(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(h.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?lb.a.confirm({title:me.t("message.CloudFileWithTitleExistsDoYouWantToOverwrite",ze),icon:Object(pf.jsx)(mR.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=oP.a.firestore().collection("users").doc(s.uid);a&&(U&&bf.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})),bf.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){N?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(pf.jsx)(pb.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){N?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(pf.jsx)(pb.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),hP(e,t,!1,a,l).finally((function(){_(!1)})))},Qe=function(){var e=Object(Nh.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,oP.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(pf.jsx)(pf.Fragment,{children:P&&Object(pf.jsx)(mD,{openCloudFile:Ke,deleteModelFromMap:ke,likeModelFromMap:Oe,pinModelFromMap:Ye})}):Object(pf.jsxs)(pf.Fragment,{children:[Z&&Object(pf.jsx)(Iv,{}),Object(pf.jsx)(XD,{saveToCloud:Je,isLoading:function(){return Z},setTitle:xe,getTitle:function(){return we},setTitleDialogVisible:Te,isTitleDialogVisible:function(){return Ae}}),Object(pf.jsx)(JD,{signIn:function(){var e=new oP.a.auth.GoogleAuthProvider;oP.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,We(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,e.groupMasterId=null}))},signOut:function(){oP.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})),bf.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(pf.jsx)(HR,{cloudFileArray:ie,openCloudFile:Be,deleteCloudFile:function(e,t){oP.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=oP.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(h.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(f.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(pf.jsx)(_D,{projects:se,setProjectState:Ee,deleteProject:function(e){s.uid&&oP.a.firestore().collection("users").doc(s.uid).collection("projects").doc(e).delete().then((function(){if(Se.current&&s.uid){var t,l=Object(h.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(h.a)(a.designs);try{var n=function(){var e=i.value;o((function(t){e.title===t.cloudFile&&(t.cloudFile=void 0)})),oP.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=Gw.getDefaultHiddenParameters(t.projectInfo.type),t.designProjectType=null,t.projectView=!1)}))})).catch((function(e){Qh(me.t("message.CannotDeleteProject",ze)+": "+e)}))},renameProject:function(e,t){Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.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=oP.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,f,p=null!==(c=sP(t,a.designs))&&void 0!==c?c:[],y=Object(h.a)(a.designs.entries());try{for(y.s();!(f=y.n()).done;){var g=Object(u.a)(f.value,2),m=g[0],w=g[1];fP(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(h.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(pf.jsx)(hD,{author:void 0,models:He.current,openCloudFile:Be,closeCallback:function(){n("showModelsGallery",!1),He.current=void 0}}),T&&Object(pf.jsx)(JR,{openCloudFile:qe}),P&&Object(pf.jsx)(mD,{openCloudFile:Ke,deleteModelFromMap:ke,likeModelFromMap:Oe,pinModelFromMap:Ye})]})},tW=n.a.memo(eW),lW=(l(728),function(){var e,t,l=Xw(Xi),a=Xw(Bi),o=Xw(di),i=Xw(ar),n=Object(r.useRef)(!0),c=Object(r.useRef)(!0),s=Object(r.useRef)(),d=null!==(e=o.schoolID)&&void 0!==e?e:H.UNKNOWN,u=null!==(t=o.classID)&&void 0!==t?t:j.UNKNOWN;return Object(r.useEffect)((function(){var e,t=void 0,l=Object(h.a)(oP.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=oP.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=oP.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(pf.jsx)(pf.Fragment,{})}),aW=n.a.memo(lW),oW=function(){var e=Xw(o.directLightIntensity),t=Xw(o.ambientLightIntensity),l=Xw(Ls),a=Xw(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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("ambientLight",{intensity:.1+(s?(null!==t&&void 0!==t?t:.1)*d:0),name:"Ambient Light"}),Object(pf.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})]})},iW=n.a.memo(oW),rW=function(e){var t=e.element,l=Xw(qr),a=Xw(zu),o=Xw(Hu),i=Xw(Ru),n=t.type===V.Roof,c="lightGray",s=Object(Se.e)(We.FontLoader,cy),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 We.Euler(vt,0,e,"ZXY")}),[l.x,l.y]);if(!a&&!o)return null;var p=function(){var e=t.lz;return n&&(e=Xw.getState().selectedElementHeight),Math.ceil(e)+1}(),y=function(){var e=t.lz;return n&&(e=t.rise),e.toFixed(1)+" m"}(),g=n?Xw.getState().selectedElementHeight+1:t.lz-.175,m=new Array(p+1).fill(0);return Object(pf.jsxs)("group",{position:f,rotation:h,name:"Vertical Ruler",children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[0,p,0]],color:c}),Object(pf.jsxs)("mesh",{position:[-1.5,g,0],userData:{unintersectable:!0},children:[Object(pf.jsx)("textGeometry",{args:[y,u]}),Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})]}),m.map((function(e,t){var l=.2+(t%5===0?.05:0),a=Object(pf.jsx)("textGeometry",{args:["".concat(t),d]});return Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,t,0],[l,t,0]],lineWidth:.5,color:c}),!n&&Object(pf.jsxs)("mesh",{position:[.4,t-.125,0],userData:{unintersectable:!0},children:[a,Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:c})]})]},t)}))]})},nW=function(){var e=Xw(ju),t=Xw(Du),l=Xw(zu),a=Xw(Hu),i=Xw(o.groundImage),n=Xw(Kr),c=Xw(Fu),s=Xw(Iu),d=Xw((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=Ww.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,H=function(e){return Ww.isTopResizeHandle(e)||(null===d||void 0===d?void 0:d.type)===V.Wall&&Ww.isTopResizeHandleOfWall(e)||(null===d||void 0===d?void 0:d.type)===V.Roof&&Ww.isRiseHandleOfRoof(e)}(null!==l&&void 0!==l?l:a);return d?Object(pf.jsxs)(pf.Fragment,{children:[((p||e||Ww.isMoveHandle(a))&&!i&&P()||c||s)&&Object(pf.jsx)("gridHelper",{rotation:[vt,0,0],name:"Grid",args:[w,A,"gray","#444444"]}),(t||S)&&d&&P()&&Object(pf.jsx)(sy,{element:d}),H&&Object(pf.jsx)(rW,{element:d})]}):null},cW="black",sW="white",dW=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&&Nt.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=cW,e.stroke(),e.beginPath(),e.arc(p,p,d,0,2*Math.PI),e.lineWidth=u,e.strokeStyle=cW,e.stroke(),e.lineWidth=f,e.beginPath(),e.moveTo(p,p-t),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p-t),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=cW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=cW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=cW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=cW,e.stroke(),e.fill(),e.font=c,e.fillStyle=sW,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=cW,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(pf.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},uW=n.a.memo(dW),fW=l(344),hW=l.n(fW),pW=n.a.memo((function(){var e,t,l=Xw(si),a=Xw(ef),o=Xw($u),i=Xw(Sr),n=Object(r.useRef)(!1),c=Object(r.useRef)(!1);Xw(Nu),Xw(Uu),Object(r.useEffect)((function(){Nt.setState((function(e){e.listenToAutoDeletionByDeleteRef=n,e.listenToAutoDeletionByCutRef=c}))}),[]);var s=Object($y.debounce)((function(){var e,t,r=bf.getState().selectedElementId;if(r){var n=Xw.getState().getAutoDeletedElements();if(n){var c=Xw.getState().deletedElements,s=Xw.getState().elementsToPaste,d=null===(e=Nt.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current,u=null===(t=Nt.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current,h=[],p="";d?(Nt.getState().setListenToAutoDeletionByCut(!1),h=[].concat(Object(f.a)(s),Object(f.a)(n)),p="Cut"):u&&(Nt.getState().setListenToAutoDeletionByDelete(!1),h=[].concat(Object(f.a)(c),Object(f.a)(n)),p="Delete");var y={name:p,timestamp:Date.now(),deletedElements:Object(f.a)(h),selectedElementId:r,undo:function(){var e=y.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===y.selectedElementId}));if(t){if(t.type===V.Wall){var i=t;i.leftJoints.length>0&&a(i.leftJoints[0],[i.id]),i.rightJoints.length>0&&o(i.rightJoints[0],[i.id])}l((function(t){var l;(l=t.elements).push.apply(l,Object(f.a)(e)),t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag,t.deletedRoofId=null,t.autoDeletedRoof=null,t.autoDeletedChild=null}))}}},redo:function(){if(0!==y.deletedElements.length){var e=new Set(y.deletedElements.map((function(e){return e.id})));l((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var l=y.deletedElements.find((function(e){return e.type===V.Roof}));l&&(t.deletedRoofId=l.id)}))}}};i(y),l((function(e){e.deletedRoofId=null,e.autoDeletedRoof=null,e.autoDeletedChild=null})),bf.getState().setPrimitiveStore("selectedElementId",null)}}}),50);return((null===(e=Nt.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current)||(null===(t=Nt.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current))&&Xw.getState().getAutoDeletedElements()&&s(),null})),yW=["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"],gW=function(e){var t,l=e.canvas,a=e.set2DView,i=e.setNavigationView,n=e.resetView,c=e.zoomView,s=Xw(si),d=Xw(Gi),u=Xw(is),p=Xw(Vi),y=Xw(Pr),g=Xw(Sr),m=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,w=Xw(an),x=Xw(Zr),v=Xw(Bc),b=Xw(Kc),A=Xw(ls),T=Xw($r),P=Xw(mn),S=Xw(wn),H=Xw($u),j=Xw(ef),z=Xw(As),R=Xw(on),D=Xw(Vu),W=.1,M=Object(r.useMemo)((function(){return{lng:p}}),[p]),I=function(e,t){return l&&(l.style.cursor="default"),b(e,t)},C=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=Zm.getRoofBoundaryVertices(o),n=Zm.getSolarPanelVerticesOnRoof(a,i);if(!Hp(n,r)||!jp(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&&!Ww.isSolarCollectorWithinHorizontalSurface(a,c))return Qh(me.t("message.MoveOutsideBoundaryCancelled",M)),!1}return!0},F=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,D===t.id&&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-W/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=C(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=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Xw.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&P(y.id,y.cx+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=W,D===t.id&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=W;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=W);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+W/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=W/r.lx)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=C(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=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx+c.displacement)}};g(c),P(t.id,t.cx+l)}}}else{var d=W*e,u={name:"Move All Right",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.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=W,D===t.id&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=W;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=W);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+W/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=W/r.ly)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=C(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=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy+c.displacement)}};g(c),S(t.id,t.cy+l)}}}else{var d=W*e,u={name:"Move All Up",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},Y=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,D===t.id&&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-W/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=C(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=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Xw.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},L=function(e){Xw.getState().set((function(t){t.multiSelectionsMode=e}))},N=function(e){var t=w();switch(e){case"left":F(1);break;case"shift+left":F(.2);break;case"ctrl+shift+left":case"meta+shift+left":F(5);break;case"right":k(1);break;case"shift+right":k(.2);break;case"ctrl+shift+right":case"meta+shift+right":k(5);break;case"down":Y(1);break;case"shift+down":Y(.2);break;case"ctrl+shift+down":case"meta+shift+down":Y(5);break;case"up":O(1);break;case"shift+up":O(.2);break;case"ctrl+shift+up":case"meta+shift+up":O(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),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=I(t.id,!0);if(0===l.length)break;if(Ww.ifNeedListenToAutoDeletion(t))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(f.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(h.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&&I(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(h.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(f.a)(p.pastedElements)),e.selectedElement=p.pastedElements[0]}))}};g(p)}break;case"ctrl+alt+h":case"ctrl+home":if(!m){var x=Xw.getState().viewState.cameraPosition,T=Xw.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(f.a)(x),oldPanCenter:Object(f.a)(T),undo:function(){var e=Nt.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(f.a)(P.oldCameraPosition),t.panCenter=Object(f.a)(P.oldPanCenter)})))},redo:function(){n()}};g(P),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.orthographic=!1})),n()}}break;case"f2":case"ctrl+b":case"meta+b":!function(){if(!Xw.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:!Xw.getState().viewState.navigationView,undo:function(){i(!e.checked)},redo:function(){i(e.checked)}};g(e),i(!Xw.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:!Xw.getState().viewState.autoRotate,undo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=!e.checked}))},redo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=e.checked}))}};g(e),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,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,e.groupMasterId=null,window.history.pushState({},document.title,Ge),d&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}));break;case"ctrl+s":case"meta+s":bf.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":bf.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":bf.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":if(!t)break;if(t.locked)Kh(me.t("message.ThisElementIsLocked",M));else{var S=I(t.id,!1);if(0===S.length)break;if(Ww.ifNeedListenToAutoDeletion(t))Nt.getState().setListenToAutoDeletionByDelete(!0),bf.getState().setPrimitiveStore("selectedElementId",t.id);else{var R={name:"Delete",timestamp:Date.now(),deletedElements:S,selectedElementId:t.id,undo:function(){var e=R.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===R.selectedElementId}));if(t&&(s((function(l){var a;(a=l.elements).push.apply(a,Object(f.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,l.deletedRoofId=null})),t.type===V.Wall)){var l=t;l.leftJoints.length>0&&j(l.leftJoints[0],[l.id]),l.rightJoints.length>0&&H(l.rightJoints[0],[l.id])}}},redo:function(){var e=R.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===R.selectedElementId}));t&&I(t.id,!1)}}};g(R)}}break;case"ctrl+z":case"meta+z":if(y.hasUndo()){var W=y.undo();D===(null===t||void 0===t?void 0:t.id)&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),W&&Kh(me.t("menu.edit.Undo",M)+": "+W,qe),d&&s((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}break;case"ctrl+y":case"meta+y":if(y.hasRedo()){var C=y.redo();C&&Kh(me.t("menu.edit.Redo",M)+": "+C,qe),D===(null===t||void 0===t?void 0:t.id)&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),d&&s((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}break;case"shift":Xw.getState().viewState.navigationView&&bf.setState((function(e){e.navigationMoveSpeed=5*Xw.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=5*Xw.getState().minimumNavigationTurnSpeed})),z(!0);break;case"esc":var N=Xw.getState().addedFoundationId,U=Xw.getState().addedCuboidId,E=Xw.getState().addedWallId,J=Xw.getState().addedWindowId,G=Xw.getState().addedDoorId;N?b(N,!1):U?b(U,!1):E?b(E,!1):J?(b(J,!1),bf.getState().setPrimitiveStore("elementBeingCanceledId",J)):G&&(b(G,!1),bf.getState().setPrimitiveStore("elementBeingCanceledId",G)),s((function(e){e.objectTypeToAdd=V.None,e.actionModeLock=!1,e.moveHandleType=null,e.resizeHandleType=null,e.groupMasterId=null,e.groupActionMode=!1})),Nt.getState().setEnableOrbitController(!0),u();break;case"ctrl":L(!0)}};Object(r.useEffect)((function(){return function(){U.current=null}}),[]);var U=Object(r.useRef)(null);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(hW.a,{handleKeys:yW,handleEventType:"keydown",onKeyEvent:function(e,t){t.preventDefault(),U.current!==e&&(U.current=e,N(e))}}),Object(pf.jsx)(hW.a,{handleKeys:yW,handleEventType:"keyup",onKeyEvent:function(e,t){t.preventDefault(),U.current=null,function(e){switch(e){case"shift":Xw.getState().viewState.navigationView&&bf.setState((function(e){e.navigationMoveSpeed=Xw.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=Xw.getState().minimumNavigationTurnSpeed})),z(!1);break;case"ctrl+o":case"meta+o":Xw.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":L(!1)}}(e)}}),Object(pf.jsx)(pW,{})]})},mW=n.a.memo(gW),wW=function(){var e=Xw(si),t=Xw(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(h.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 We.Vector3,g=new We.Vector3,m=Object(h.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(h.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(pf.jsx)(pf.Fragment,{})},xW=n.a.memo(wW),vW=l(805),bW=l(806),AW=function(e){var t=(new We.Vector3).subVectors(e.localToWorld(new We.Vector3(0,0,1e3)),e.position);return 0===t.x&&0===t.y&&e.getWorldDirection(t),t},TW=function(e){var t=document.getElementById("compassCanvas");if(t){var l=AW(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&&!bf.getState().isCameraUnderGround?bf.getState().setPrimitiveStore("isCameraUnderGround",!0):!o&&bf.getState().isCameraUnderGround&&bf.getState().setPrimitiveStore("isCameraUnderGround",!1)}},PW=function(){var e=Xw(si),t=Xw(o.orthographic),l=Xw(o.enableRotate),a=Xw(o.autoRotate),i=Xw(Tr),n=Xw(Kr),c=Xw(o.cameraPosition),s=Xw(o.cameraZoom),d=Xw(o.navigationView),u=bf(gi),f=bf(mi),h=d&&!t,p=Math.hypot(c[0],c[1],c[2]),y=(t?50*s:10*p)*n,g=Object(r.useMemo)((function(){return new We.Vector3(-y,-y,0)}),[y]),m=Object(r.useMemo)((function(){return new We.Vector3(y,y,y/2)}),[y]),w=Object(Se.f)(),x=w.gl,v=w.invalidate,b=w.get,A=w.set,T=(w.camera,Object(r.useMemo)((function(){var e=b().camera;return e.up.set(0,0,1),e}),[])),P=Object(r.useMemo)((function(){return x.domElement}),[]),S=Object(r.useRef)(null),H=Object(r.useRef)(null),j=Object(r.useRef)(null);Object(r.useEffect)((function(){Xw.getState().viewState.cameraPosition2D[2]<100&&e((function(e){e.viewState.cameraPosition2D[2]=150}))}),[]),Object(r.useEffect)((function(){S&&S.current&&Nt.setState((function(e){e.orbitControlsRef=S}))}),[]),Object(r.useEffect)((function(){S.current&&(S.current.addEventListener("change",z),S.current.addEventListener("start",R),S.current.addEventListener("end",D));var e=S.current;return function(){e&&(e.removeEventListener("change",z),e.removeEventListener("start",R),e.removeEventListener("end",D))}}),[]),Object(r.useEffect)((function(){var e=Xw.getState().viewState;if(S.current){if(H.current){var l,a,o=W(null!==(l=e.cameraPosition)&&void 0!==l?l:[0,0,20]),i=W(null!==(a=e.panCenter)&&void 0!==a?a:[0,0,0]);H.current.position.copy(o),H.current.lookAt(i),H.current.zoom=1,t||(S.current.object=H.current,S.current.target.copy(i))}if(j.current){var r,n,c=W(null!==(r=e.cameraPosition2D)&&void 0!==r?r:[0,0,1e3]).setZ(1e3),s=W(null!==(n=e.panCenter2D)&&void 0!==n?n:[0,0,0]);j.current.position.copy(c),j.current.rotation.set(0,0,0),j.current.lookAt(s),j.current.zoom=e.cameraZoom,t&&(S.current.object=j.current,S.current.target.copy(s))}S.current.update()}TW(b().camera)}),[i]),Object(r.useEffect)((function(){if(j.current&&H.current&&S.current){var e,l,a=Xw.getState().viewState,o=S.current,i=j.current,r=H.current;if(t)i.rotation.set(0,0,0),o.object=i,o.target.copy(W(null!==(e=a.panCenter2D)&&void 0!==e?e:[0,0,0])),A({camera:i});else o.object=r,o.target.copy(W(null!==(l=a.panCenter)&&void 0!==l?l:[0,0,0])),A({camera:r});TW(b().camera)}}),[t]),Object(r.useEffect)((function(){t&&S.current&&(j.current&&(j.current.zoom=s,S.current.object=j.current),z(),S.current.update())}),[s]);var z=function(){v(),Xw.getState().viewState.orthographic||(TW(b().camera),S.current&&S.current.target.clamp(g,m))},R=function(){bf.setState((function(e){e.duringCameraInteraction=!0}))},D=function(){bf.setState((function(e){e.duringCameraInteraction=!1})),e((function(e){if(S.current){var t=e.viewState,l=b().camera,a=l.position,o=S.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]):(t.cameraPosition=[a.x,a.y,a.z],t.panCenter=[o.x,o.y,o.z],e.cameraDirection=AW(l))}}))},W=function(e){return e&&Array.isArray(e)?new We.Vector3(e[0],e[1],e[2]):e&&null!==e.x?new We.Vector3(e.x,e.y,e.z):new We.Vector3(0,0,5)};Object(Se.d)((function(e){a&&S.current&&S.current.update()}));var M=Nt((function(e){return e.compassRef}));return Object(r.useEffect)((function(){TW(b().camera)}),[M]),Object(r.useEffect)((function(){S.current&&(h?S.current.listenToKeyEvents(window):S.current.removeKeyEvents())}),[h]),Object(r.useEffect)((function(){if(S.current)if(h){var e=b().camera;e.position.z=3,e.lookAt(0,0,2)}else S.current.update()}),[h]),Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(vW.a,{ref:H,fov:45,far:ct,up:[0,0,1]}),Object(pf.jsx)(bW.a,{ref:j,up:[0,0,1]}),Object(pf.jsx)("myOrbitControls",{ref:S,args:[T,P],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})]})},SW=n.a.memo(PW),HW=l(807),jW=l(808),zW=l(809),RW=l(810),DW=l(811),WW=l(812),MW=l(813),IW=l(814),CW=l(815),FW=l(816),kW=l(817),OW=l(818),YW=Tv.a.div(jz||(jz=Object(Av.a)(["\n display: flex;\n flex-direction: column;\n z-index: 999;\n"]))),LW=function(e){var t=e.style,l=e.size,a=e.margin,o=e.round,i=e.handleShareWindowClose,r=Xw(di),n=Xw(Vi),c=Xw(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(pf.jsxs)(YW,{style:t,children:[Object(pf.jsx)(HW.a,{url:h,title:u,via:f,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(jW.a,{size:l,round:o})}),Object(pf.jsx)(zW.a,{url:h,quote:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(RW.a,{size:l,round:o})}),Object(pf.jsx)(DW.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(WW.a,{size:l,round:o})}),Object(pf.jsx)(MW.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(IW.a,{size:l,round:o})}),Object(pf.jsx)(CW.a,{url:h,title:u,summary:f,source:me.t("name.IFI",d),style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(FW.a,{size:l,round:o})}),Object(pf.jsx)(kW.a,{url:h,title:u,onShareWindowClose:i,children:Object(pf.jsx)(OW.a,{size:l,round:o})})]})},NW=n.a.memo(LW),UW=function(){function e(t,l,a){if(Object(je.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(f){r.e(f)}finally{r.f()}var c=null;do{o=Math.random()*t,i=0;var s,d=Object(h.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(f){d.e(f)}finally{d.f()}}while(null===c);return a&&c?new EW(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 EW(this.survivors[o],this.survivors[i])}},{key:"mutate",value:function(e){if(!Ww.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}(),JW=function(){function e(t,l,a,o,i,r,n,c,s,d){Object(je.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=F.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 VW(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}(),GW=function(){function e(){Object(je.a)(this,e)}return Object(ke.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}(),XW=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 f;Object(je.a)(this,l),(f=t.call(this,a,o,i,r,e.length,n,c,s,d)).solarPanels=void 0,f.solarPanels=e;var p,y=f.population.individuals[0],g=Object(h.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),f.searchMethod===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var b=1;b1;)T=GW.gaussian()*f.localSearchRadius+v;A.setGene(w,T)}f.geneNames[w]="Tilt Angle ("+x.id+")"}}catch(P){g.e(P)}finally{g.f()}return f}return Object(ke.a)(l,[{key:"applyFittest",value:function(){var e=this.population.getFittest();if(e){for(var t=0;t0&&(T.current=Object(f.a)(j.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(bf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);j.current.length=0;var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;j.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(h.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 XW(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,H.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&&(H.current=P.current.evolveIndividual(S.current%w.populationSize,function(){var e=0;switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:var t,l=Af.getState().dailyPvYield,a=Object(h.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(f){a.e(f)}finally{a.f()}break;case M.YEARLY_TOTAL_OUTPUT:var n,c=Af.getState().yearlyPvYield,s=Object(h.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(f){s.e(f)}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(H.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"+(H.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:XW.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){bf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.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 M.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1);break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}var t,l=Object(h.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(h.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&&bf.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(pf.jsx)(pf.Fragment,{})},KW=n.a.memo(BW),qW=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(je.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 H=n[0];if(n.length>1){var j=S.population.individuals[0],z=S.maximumTiltAngle===S.minimumTiltAngle?0:(H.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);j.setGene(0,z);var R=n[1],D=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(H.cx-R.cx)*S.foundation.lx:Math.abs(H.cy-R.cy)*S.foundation.ly,W=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(D-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);W<0?W=0:W>1&&(W=1),j.setGene(1,W);var M=c?c.rowsPerRack:Math.max(1,Math.round(H.ly/(H.orientation===$.portrait?e.length:e.width))),I=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(M-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);I<0?I=0:I>1&&(I=1),j.setGene(2,I)}}return S}return Object(ke.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Ww.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:return"kWh";case M.YEARLY_PROFIT:case M.DAILY_PROFIT:return"dollars"}return null}},{key:"individualToString",value:function(e){var t="F("+Ww.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=ZS.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(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Ww.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),F.current.length>0&&(C.current=Object(f.a)(F.current),N(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){j.current=s,s?(cancelAnimationFrame(S.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",k))):(bf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&O){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),H.current=!1;var n=p(V.SolarPanel,O.id);F.current.length=0;var c,s=Object(h.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;F.current.push(JSON.parse(JSON.stringify(d)))}}catch(y){s.e(y)}finally{s.f()}z.current=new qW(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,F.current,P,u,O,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(f.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:var l,a=Af.getState().dailyPvYield,i=Object(h.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 M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:var c,s=Af.getState().yearlyPvYield,d=Object(h.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var f in u)u.hasOwnProperty(f)&&"Total"===f&&(t+=u[f])}}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 M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case M.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case M.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&&!j.current){if(D.current||z.current.outsideGenerationCounter>=b.maximumGenerations){if(cancelAnimationFrame(S.current),H.current=!0,C.current.length>0&&v(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),N(!0),Kh(me.t("message.EvolutionCompleted",k)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",k):me.t("message.MaximumNumberOfGenerationsHasBeenReached",k))),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)),N(!1)}),100)}},N=function(e){bf.setState((function(t){switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(f.a)(C.current))})),e&&bf.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(pf.jsx)(pf.Fragment,{})},ZW=n.a.memo(QW),_W=function(){function e(t,l){Object(je.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}(),eM=function(){function e(t,l,a,o,i,r,n,c,s){Object(je.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=F.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.swarm=new $W(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}(),tM=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 f;Object(je.a)(this,l),(f=t.call(this,a,o,i,r,n,e.length,c,s,d)).solarPanels=void 0,f.solarPanels=e;var p,y=f.swarm.particles[0],g=Object(h.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,f.searchMethod===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var v=1;v1;)A=GW.gaussian()*f.localSearchRadius+x;b.position[w]=A}}}catch(T){g.e(T)}finally{g.f()}return f}return Object(ke.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(f.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(f.a)(j.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(bf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);j.current.length=0;var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;j.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(h.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 tM(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,H.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&&(H.current=P.current.updateParticle(S.current%w.swarmSize,function(){var e=0;switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:var t,l=Af.getState().dailyPvYield,a=Object(h.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(f){a.e(f)}finally{a.f()}break;case M.YEARLY_TOTAL_OUTPUT:var n,c=Af.getState().yearlyPvYield,s=Object(h.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(f){s.e(f)}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(H.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"+(H.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:tM.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){bf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}var t,l=Object(h.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(h.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&&bf.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(pf.jsx)(pf.Fragment,{})},aM=n.a.memo(lM),oM=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(je.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 H=n[0];if(n.length>1){var j=S.swarm.particles[0];j.position[0]=S.maximumTiltAngle===S.minimumTiltAngle?0:(H.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);var z=n[1],R=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(H.cx-z.cx)*S.foundation.lx:Math.abs(H.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),j.position[1]=D;var W=c?c.rowsPerRack:Math.max(1,Math.round(H.ly/(H.orientation===$.portrait?e.length:e.width))),M=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(W-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);M<0?M=0:M>1&&(M=1),j.position[2]=M}}return S}return Object(ke.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Ww.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:return"kWh";case M.YEARLY_PROFIT:case M.DAILY_PROFIT:return"dollars"}return null}},{key:"particleToString",value:function(e,t){var l="F("+Ww.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=ZS.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(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Ww.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(f.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),F.current.length>0&&(C.current=Object(f.a)(F.current),N(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){j.current=s,s?(cancelAnimationFrame(S.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",k))):(bf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&O){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),H.current=!1;var n=p(V.SolarPanel,O.id);F.current.length=0;var c,s=Object(h.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;F.current.push(JSON.parse(JSON.stringify(d)))}}catch(f){s.e(f)}finally{s.f()}z.current=new oM(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,F.current,P,u,O,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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:var l,a=Af.getState().dailyPvYield,i=Object(h.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 M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:var c,s=Af.getState().yearlyPvYield,d=Object(h.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var f in u)u.hasOwnProperty(f)&&"Total"===f&&(t+=u[f])}}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 M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case M.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case M.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&&!j.current){if(D.current||z.current.outsideStepCounter>=b.maximumSteps){if(cancelAnimationFrame(S.current),H.current=!0,C.current.length>0&&g(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),N(!0),Kh(me.t("message.EvolutionCompleted",k)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",k):me.t("message.MaximumNumberOfStepsHasBeenReached",k))),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)),N(!1)}),100)}},N=function(e){bf.setState((function(t){switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(f.a)(C.current))})),e&&bf.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(pf.jsx)(pf.Fragment,{})},rM=n.a.memo(iM),nM=function(){var e=Xw(ns),t=Xw(Iu),l=Xw(Fu);return Object(Se.f)().gl.domElement.style.cursor=e!==V.None||l||t?"crosshair":"default",null},cM=n.a.memo(nM),sM=function(e){var t=e.width,l=void 0===t?400:t,a=e.height,n=void 0===a?400:a,c=Xw(si),s=Xw(Sr),d=Xw(i.latitude),f=Xw(i.longitude),p=Xw(o.mapZoom),y=Xw(o.mapTilt),g=Xw(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,f);(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(h.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($y.throttle)((function(){if(x){var e=x.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==d||l!==f){T();var a={name:"Set Location",timestamp:Date.now(),oldLatitude:d,newLatitude:t,oldLongitude:f,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($y.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(pf.jsx)(GR.a,{mapContainerStyle:{border:"1px solid",width:l+"px",height:n+"px"},mapTypeId:g,center:{lat:d,lng:f},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}))}}}})},dM=n.a.memo(sM),uM=["places"],fM=Tv.a.div(zz||(zz=Object(Av.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"]))),hM=Tv.a.div(Rz||(Rz=Object(Av.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"]))),pM=Tv.a.div(Dz||(Dz=Object(Av.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"]))),yM=function(){var e=Xw(Vi),t=Xw(si),l=Xw(Sr),a=Xw(i.address),c=Xw(i.latitude),s=Xw(i.longitude),d=Xw(o.mapPanelX),f=Xw(o.mapPanelY),p=Xw(o.groundImage),y=Xw(o.mapZoom),g=Xw(Ei),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(f)?0:Math.min(f,window.innerHeight-b)}),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D={lng:e};Object(r.useEffect)((function(){var e=function(){S({x:Math.min(d,window.innerWidth-v),y:Math.min(f,window.innerHeight-b)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var W=Object(GR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:uM}),M=W.isLoaded,I=W.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(pf.jsx)(qT.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(pf.jsx)(fM,{ref:m,style:{zIndex:"mapPanel"===g?Ke:10},children:Object(pf.jsxs)(hM,{ref:x,children:[Object(pf.jsxs)(pM,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("word.Location",D)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){C()},onMouseDown:function(){C()},children:me.t("word.Close",D)})]}),Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(Pv.b,{style:{paddingTop:"10px"},align:"center",size:20,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[Object(pf.jsx)(Pv.b,{children:me.t("mapPanel.ImageOnGround",D)+":"}),Object(pf.jsx)(ib.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}))}})]})}),M&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:Object(pf.jsx)(GR.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(h.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(pf.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"}})})})}),M?Object(pf.jsx)(Pv.b,{children:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(dM,{width:400,height:400}),Object(pf.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(pf.jsx)(Iv,{}),I&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})})]})]})})})},gM=n.a.memo(yM),mM=l(348),wM=l(819),xM=l(68),vM=l.n(xM),bM=Tv.a.div(Wz||(Wz=Object(Av.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"]))),AM=Tv.a.div(Mz||(Mz=Object(Av.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"]))),TM=Tv.a.div(Iz||(Iz=Object(Av.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"]))),PM=function(){var e=Xw(Vi),t=Xw(si),l=Xw(Sr),a=Xw(i.date),c=Xw(i.latitude),s=Xw(i.address),d=bf(Wr),f=Xw(Mr),h=bf(Lr),p=Xw(o.showSunAngles),y=Xw(o.heliodon),g=Xw(o.heliodonPanelX),m=Xw(o.heliodonPanelY),w=Xw(Ei),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)}),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useMemo)((function(){return new Date(a)}),[a]),C=Object(r.useMemo)((function(){return Dy(I,c)}),[I,c]),F={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(k),function(){cancelAnimationFrame(v.current)}}),[d]),Object(r.useEffect)((function(){d&&0===C.sunset&&(cancelAnimationFrame(v.current),bf.setState((function(e){e.animateSun=!1})))}),[C.sunset]);var k=function e(){var t=Xw.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=Dy(I,Xw.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),O(I,!1),b.current=l}}else cancelAnimationFrame(v.current)},O=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($y.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})),M(!W)},redo:function(){t((function(e){e.world.latitude=a.newLatitude,e.world.address=a.newAddress})),M(!W)}};l(a),t((function(t){t.world.latitude=e,t.world.address=""}))}),500,{leading:!1,trailing:!0}));return Object(pf.jsx)(qT.a,{nodeRef:x,handle:".handle",bounds:"parent",axis:"both",position:j,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(pf.jsx)(bM,{ref:x,style:{zIndex:"heliodonPanel"===w?Ke:11},children:Object(pf.jsxs)(AM,{ref:A,children:[Object(pf.jsxs)(TM,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("heliodonPanel.SunAndTimeSettings",F)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Y()},onMouseDown:function(){Y()},children:me.t("word.Close",F)})]}),Object(pf.jsxs)(Pv.b,{style:{padding:"20px"},align:"baseline",size:20,children:[Object(pf.jsxs)("div",{children:[me.t("menu.settings.Heliodon",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)("div",{children:[Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.SunAngles",F)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("div",{children:[me.t("word.Animate",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.a,{checked:d,onChange:function(e){var t={name:"Animate Heliodon",timestamp:Date.now(),checked:!d,undo:function(){bf.setState((function(e){e.animateSun=!t.checked}))},redo:function(){bf.setState((function(e){e.animateSun=t.checked}))}};l(t),bf.setState((function(t){t.animateSun=e}))}})]}),d&&Object(pf.jsxs)("div",{children:[Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.TwentyFourHours",F)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)("div",{children:[me.t("word.Date",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(mM.a,{disabled:h,value:vM()(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(pf.jsxs)("div",{children:[me.t("word.Time",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(wM.a,{disabled:h,value:vM()(I,"HH:mm"),format:"HH:mm",onChange:function(e){e&&(null===O||void 0===O||O(e.toDate(),!0))}})]}),!h&&Object(pf.jsxs)("div",{children:[me.t("word.Latitude",F),": ",c.toFixed(2),"\xb0",Object(pf.jsx)(oH.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})]})]})]})})})},SM=n.a.memo(PM),HM=l(285),jM=l(822),zM=l(823),RM=l(239),DM=l(824),WM=l(554),MM=l(135),IM=l(125),CM=l(136),FM=l(234),kM=["title","titleId"];function OM(){return(OM=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 LM(e,t){var l=e.title,a=e.titleId,o=YM(e,kM);return r.createElement("svg",OM({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,Cz||(Cz=r.createElement("defs",null,r.createElement("style",{type:"text/css"}))),Fz||(Fz=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})),kz||(kz=r.createElement("path",{d:"M347.505182 165.510915h552.305182v139.99559H347.505182z","p-id":5969})),Oz||(Oz=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})),Yz||(Yz=r.createElement("path",{d:"M347.505182 442.115105h552.305182v139.99559H347.505182z","p-id":5971})),Lz||(Lz=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})),Nz||(Nz=r.createElement("path",{d:"M347.505182 718.719294h552.305182v139.99559H347.505182z","p-id":5973})))}var NM,UM,EM=r.forwardRef(LM),VM=(l.p,Object(Tv.a)(EM)(NM||(NM=Object(Av.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"])))),JM=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.changeHorizontalGrid,o=e.changeVerticalGrid,i={lng:Xw(Vi)},n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===a||void 0===a||a(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",i)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===o||void 0===o||o(!l)},children:me.t("menu.graph.ShowVerticalGridLines",i)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:f,placement:"bottomRight",visible:s,onVisibleChange:function(e){d(e)},children:Object(pf.jsx)(VM,{style:{right:"32px"},onClick:function(e){e.stopPropagation()}})})})},GM=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],H=P[1],j=Object(r.useState)(!0),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[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 F=Object(r.useMemo)((function(){for(var e=[],l=0;l1&&Object(pf.jsx)(FM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})}),Object(pf.jsx)(JM,{horizontalGrid:S,verticalGrid:R,changeHorizontalGrid:function(e){H(e)},changeVerticalGrid:function(e){D(e)}})]})})})},XM=l(290),BM=l(291),KM=l(825),qM=l(826),QM=["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"}(UM||(UM={}));var ZM,_M,$M,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,HI,jI,zI,RI,DI,WI,MI,II,CI,FI,kI,OI,YI,LI,NI,UI,EI,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=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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.jsx)("circle",{cx:"0",cy:"0",r:"3",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.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},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.direction,d=e.fillColor,u=Math.round(r.length/c);if(t&&l&&i>0&&i%u===0){var f;switch(s){case UM.UP:f="-4,2.5,4,2.5,0,-3.5";break;case UM.LEFT:f="2.5,4,2.5,-4,-3.5,0";break;case UM.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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.jsx)("polygon",{points:f,style:{opacity:a,stroke:o,fill:null!==d&&void 0!==d?d:"white",strokeWidth:1}})})}return null},HC=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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.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},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=.05*n;return Object(pf.jsx)("svg",{x:t-100*u,y:l-100*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(pf.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},zC=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(pf.jsx)("svg",{x:t-150*u,y:l-150*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(pf.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},RC=function(e,t,l,a,o){switch(e){case"circle":return Object(pf.jsx)(TC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"square":return Object(pf.jsx)(PC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"triangle up":return Object(pf.jsx)(SC,{scale:1.1*t,numberOfSymbols:l,direction:UM.UP,opacity:a,fillColor:o});case"triangle down":return Object(pf.jsx)(SC,{scale:1.1*t,numberOfSymbols:l,direction:UM.DOWN,opacity:a,fillColor:o});case"triangle right":return Object(pf.jsx)(SC,{scale:1.1*t,numberOfSymbols:l,direction:UM.RIGHT,opacity:a,fillColor:o});case"triangle left":return Object(pf.jsx)(SC,{scale:1.1*t,numberOfSymbols:l,direction:UM.LEFT,opacity:a,fillColor:o});case"star":return Object(pf.jsx)(jC,{scale:1.25*t,numberOfSymbols:l,opacity:a,fillColor:o});case"diamond":return Object(pf.jsx)(HC,{scale:1.1*t,numberOfSymbols:l,opacity:a,fillColor:o});case"hexagon":return Object(pf.jsx)(zC,{scale:1.3*t,numberOfSymbols:l,opacity:a,fillColor:o})}},DC=Object(Tv.a)(EM)(ZM||(ZM=Object(Av.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"]))),WC=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:Xw(Vi)},h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.LineWidth",f)+":",Object(pf.jsx)(oH.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*o,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",f)+":",Object(pf.jsx)(oH.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*i,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",f)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",f)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:m,placement:"bottomRight",visible:y,onVisibleChange:function(e){g(e)},children:Object(pf.jsx)(DC,{style:{right:a>1?"25px":"32px"},onClick:function(e){e.stopPropagation()}})})})},MC=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,H=Object(r.useState)(0),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)(!0),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useState)(!0),F=Object(u.a)(C,2),k=F[0],O=F[1],N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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,E]),$=function(e){},ee=function(e){V(e.dataKey)},te=function(e){V(null)};return Object(pf.jsx)(pf.Fragment,{children:i&&Object(pf.jsx)("div",{id:"line-graph-"+d+"-"+f,style:{width:"100%",height:"".concat(c,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(pf.jsx)(jM.a,{width:"100%",height:"100%",children:a===Y.Area?Object(pf.jsxs)(KM.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(RM.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(pf.jsx)(DM.a,{vertical:k,horizontal:M,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(WM.a,{x:b,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(MM.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(pf.jsx)(IM.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(CM.a,{domain:[g,w],fontSize:"10px",children:Object(pf.jsx)(IM.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(pf.jsx)(FM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]}):Object(pf.jsxs)(qM.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(RM.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(pf.jsx)(DM.a,{vertical:k,horizontal:M,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(WM.a,{x:b,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(MM.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(pf.jsx)(IM.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(CM.a,{domain:[g,w],fontSize:"10px",children:Object(pf.jsx)(IM.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(pf.jsx)(FM.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]})}),Object(pf.jsx)(WC,{lineCount:z,symbolSize:Q,lineWidth:X,horizontalGrid:M,verticalGrid:k,changeHorizontalGrid:function(e){I(e)},changeVerticalGrid:function(e){O(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)}})]})})})},IC=Tv.a.div(_M||(_M=Object(Av.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"]))),CC=Tv.a.div($M||($M=Object(Av.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"]))),FC=Tv.a.div(eI||(eI=Object(Av.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"]))),kC=function(e){var t,l=e.city,a=e.graphs,c=Xw(Vi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=Xw(Sr),h=new Date(Xw(i.date)),p=Xw(Is),y=Xw(o.weatherPanelRect),g=Xw(Ei),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],H={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 Ft(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 j=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",H),me.t("word.Temperature",H),me.t("weatherPanel.SunshineHours",H)],D=["NA","\xb0C","\xb0C",me.t("word.Hour",H)],W=it[h.getMonth()],M=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(pf.jsx)(qT.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 Ft(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(pf.jsx)(IC,{ref:m,style:{zIndex:"weatherPanel"===g?Ke:10},children:Object(pf.jsxs)(CC,{ref:w,style:{opacity:s,width:(y?y.width:500)+"px",height:(y?y.height:500)+"px"},children:[Object(pf.jsxs)(FC,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("word.Weather",H)+": "+((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(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){M()},onMouseDown:function(){M()},children:me.t("word.Close",H)})]}),Object(pf.jsx)(pf.Fragment,{children:a.map((function(e){return e===L.SunshineHours?Object(pf.jsx)(GM,{type:e,dataSource:z[e],height:j,dataKeyAxisX:"Month",labelX:me.t("word.Month",H),labelY:R[e],unitY:D[e],yMin:0,fractionDigits:1,referenceX:W,color:"#FFD700"},e):Object(pf.jsx)(MC,{chartType:Y.Line,type:e,dataSource:z[e],height:j,dataKeyAxisX:"Month",labelX:me.t("word.Month",H),labelY:R[e],unitY:D[e],fractionDigits:1,referenceX:W},e)}))})]})})})},OC=n.a.memo(kC),YC=l(855),LC=l(856),NC=l(857),UC=l(858),EC=["Daylight","Clearness"],VC=Tv.a.div(tI||(tI=Object(Av.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"]))),JC=Tv.a.div(lI||(lI=Object(Av.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"]))),GC=Tv.a.div(aI||(aI=Object(Av.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"]))),XC=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=new Date(Xw(i.date)),h=Af(Au),p=Af(Pu),y=Xw(o.yearlyLightSensorPanelRect),g=Xw(ss),m=Xw(o.yearlyLightSensorPanelShowDaylight),w=Xw(o.yearlyLightSensorPanelShowClearness),x=Xw(Ei),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)(),H=P.current?P.current.clientWidth+40:y?y.width+40:640,j=P.current?P.current.clientHeight+100:y?y.height+100:600,z=Object(r.useState)({x:y?Math.max(y.x,H-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=n.a.useRef(null),I={lng:a},C=it[f.getMonth()];Object(r.useEffect)((function(){W({x:Math.max(null===y||void 0===y?void 0:y.x,H-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-j)})}),[y,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===y||void 0===y?void 0:y.x,H-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-j)})};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 Ft(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,H,j]);var F=function(){d((function(e){e.viewState.showYearlyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Yearly Light Sensor Graph",timestamp:(new Date).getTime()})}))},k=me.t("word.Month",I),O=me.t("word.Radiation",I),N=!h||!h[0]||0===Object.keys(h[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:M,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ft(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="yearlyLightSensorPanel"}))},children:Object(pf.jsx)(VC,{ref:M,style:{zIndex:"yearlyLightSensorPanel"===x?Ke:9},children:Object(pf.jsxs)(JC,{ref:P,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:500)+"px"},children:[Object(pf.jsxs)(GC,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",I)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",I)+" "+l+" | "+f.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){F()},onMouseDown:function(){F()},children:me.t("word.Close",I)})]}),m&&Object(pf.jsx)(MC,{type:L.DaylightData,chartType:Y.Area,dataSource:h.map((function(e){return{Month:e.Month,Daylight:e.Daylight}})),height:100,dataKeyAxisX:"Month",labelX:k,labelY:me.t("word.Daylight",I),unitY:me.t("word.Hour",I),yMin:0,curveType:"linear",fractionDigits:1,referenceX:C}),w&&Object(pf.jsx)(GM,{type:L.ClearnessData,dataSource:h.map((function(e){return{Month:e.Month,Clearness:e.Clearness}})),height:100,dataKeyAxisX:"Month",labelX:k,labelY:me.t("yearlyLightSensorPanel.SkyClearness",I),unitY:"%",yMin:0,yMax:100,fractionDigits:1,referenceX:C,color:"#66CDAA"}),A&&Object(pf.jsx)(MC,{type:L.YearlyRadiationSensorData,chartType:Y.Line,dataSource:h.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,EC)})),labels:p,height:100,dataKeyAxisX:"Month",labelX:k,labelY:O,unitY:"kWh/m\xb2/"+me.t("word.Day",I),yMin:0,curveType:"linear",fractionDigits:2,referenceX:C}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",padding:"10px",direction:"ltr"},children:[Object(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.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(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.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(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.a,{title:me.t("yearlyLightSensorPanel.ShowAverageDailySolarRadiation",I),checked:A,onChange:function(e){T(e)}}),me.t("word.Radiation",I)]}),Object(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(Sv.a,{type:"default",icon:N?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(N?"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()})})),bf.setState((function(e){e.runYearlyLightSensor=!0,e.pauseYearlyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",I))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",I),onClick:function(){_h("line-graph-"+k+"-"+O,"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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})]})})})},BC=n.a.memo(XC),KC=Tv.a.div(oI||(oI=Object(Av.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"]))),qC=Tv.a.div(iI||(iI=Object(Av.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"]))),QC=Tv.a.div(rI||(rI=Object(Av.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"]))),ZC=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=new Date(Xw(i.date)),h=Af(Pu),p=Af(vu),y=Xw(o.dailyLightSensorPanelRect),g=Xw(ss),m=Xw(Ei),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],H=P[1],j={lng:a};Object(r.useEffect)((function(){H({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(){H({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 Ft(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",j),D=me.t("word.Radiation",j),W=!p||!p[0]||0===Object.keys(p[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){H({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 Ft(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(pf.jsx)(KC,{ref:w,style:{zIndex:"dailyLightSensorPanel"===m?Ke:9},children:Object(pf.jsxs)(qC,{ref:x,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:360)+"px"},children:[Object(pf.jsxs)(QC,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",j)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",j)+" "+l+" | "+vM()(f).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",j)})]}),Object(pf.jsx)(MC,{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(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(pf.jsx)(Sv.a,{type:"default",icon:W?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(W?"word.Run":"word.Update",j),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",j)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailyLightSensor=!0,e.pauseDailyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",j))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("line-graph-"+R+"-"+D,"daily-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),p&&p.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",j),onClick:function(){$h(p,"daily-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",j)),c&&d((function(e){e.actionInfo={name:"Export Daily Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},_C=n.a.memo(ZC),$C=Tv.a.div(nI||(nI=Object(Av.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"]))),eF=Tv.a.div(cI||(cI=Object(Av.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"]))),tF=Tv.a.div(sI||(sI=Object(Av.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"]))),lF=GT.a.TextArea,aF=function(){var e,t=Xw(Vi),l=Xw(Sr),a=null!==(e=Xw(Ui))&&void 0!==e?e:Qe,i=Xw(si),c=Xw(Oi),s=Xw(o.stickyNotePanelRect),d=Xw(Ei),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 Ft(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 H=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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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 Ft(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(pf.jsx)($C,{ref:f,style:{zIndex:"stickyNotePanel"===d?Ke:12},children:Object(pf.jsxs)(eF,{ref:h,style:{opacity:a,width:(s?s.width:400)+"px",height:(s?s.height:300)+"px"},children:[Object(pf.jsxs)(tF,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("menu.view.accessories.Note",S)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){H()},onTouchStart:function(){H()},children:me.t("word.Close",S)})]}),Object(pf.jsx)(lF,{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}))}})]})})})})},oF=n.a.memo(aF),iF=Tv.a.div(dI||(dI=Object(Av.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"]))),rF=Tv.a.div(uI||(uI=Object(Av.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"]))),nF=function(){var e,t,l=Xw(Vi),a=Xw(Ls),i=null!==(e=Xw(o.orthographic))&&void 0!==e&&e,r=null!==(t=Xw(o.navigationView))&&void 0!==t&&t,n={lng:l},c=a.y>0?"navajowhite":"antiquewhite",s=Ww.isMac();return Object(pf.jsx)(iF,{children:Object(pf.jsxs)(rF,{style:{color:c,fontSize:"9px"},children:[!i&&Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Rotate",n)}),": ",me.t("instructionPanel.DragMouse",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Zoom",n)}),":"," ",me.t(s?"instructionPanel.MouseWheelOrKeysMac":"instructionPanel.MouseWheelOrKeys",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Pan",n)}),":"," ",me.t(s?"instructionPanel.HoldMetaDragMouse":"instructionPanel.HoldCtrlDragMouse",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t(i?"instructionPanel.Exit2DMode":"instructionPanel.Enter2DMode",n)}),":"," ",me.t("word.Press",n)," ",s?"\u2318":"Ctrl","+B"]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t(r?"instructionPanel.DisableNavigation":"instructionPanel.EnableNavigation",n)}),": ",me.t("word.Press",n)," ",s?"\u2318":"Ctrl","+U"]}),r&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Move",n)}),": ",me.t("instructionPanel.MoveInstruction",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Turn",n)}),": ",me.t("instructionPanel.TurnInstruction",n)]})]})]})})},cF=n.a.memo(nF),sF=l(570),dF=l(859),uF=["Daylight","Clearness"],fF=Tv.a.div(fI||(fI=Object(Av.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=Tv.a.div(hI||(hI=Object(Av.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=Tv.a.div(pI||(pI=Object(Av.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=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.daysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(ed),w=Xw(td),x=Af(ad),v=Xw(ss),b=Xw(o.yearlyPvYieldPanelRect),A=bf(Er),T=Xw.getState().economicsParams,P=bf(gs),S=Xw(Ei),H=n.a.useRef(null),j=Object(r.useRef)(null),z=j.current?j.current.clientWidth+40:640,R=j.current?j.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}),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useState)(0),F=Object(u.a)(C,2),k=F[0],O=F[1],N=Object(r.useRef)(new Map),U=Object(r.useRef)(),E=it[g.getMonth()],J={lng:c},G=v(V.SolarPanel);Object(r.useEffect)((function(){var e=0;N.current.clear();var t,l=Object(h.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],N.current.set(o,(null!==(i=N.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(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),j.current&&(U.current||(U.current=new ResizeObserver((function(){p((function(e){j.current&&(e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.width=j.current.offsetWidth,e.viewState.yearlyPvYieldPanelRect.height=j.current.offsetHeight)}))}))),U.current.observe(j.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=Ww.countAllSolarPanels(),Q=12/y,Z=k*Q,_=q*T.operationalCostPerUnit*365,$=Z*T.electricitySellingPrice,ee=$-_,te=!m||!m[0]||0===Object.keys(m[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:H,handle:".handle",bounds:"parent",axis:"both",position:M,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 Ft(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(pf.jsx)(fF,{ref:H,style:{zIndex:"yearlyPvYieldPanel"===S?Ke:9},children:Object(pf.jsxs)(hF,{ref:j,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(pF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelYearlyYield",J)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",J)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){X()},onMouseDown:function(){X()},children:me.t("word.Close",J)})]}),Object(pf.jsx)(MC,{type:L.YearlyPvYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,uF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:B,labelY:K,unitY:me.t("word.kWh",J),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!P&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&G>1&&N.current.size>0?Object(pf.jsx)(sF.a,{title:me.t("shared.OutputBreakdown",J),content:Object(f.a)(N.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*Q).toFixed(2)})]}),t===N.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",J)})}):Object(pf.jsxs)(pf.Fragment,{children:[Z>0&&Object(pf.jsx)(Pv.b,{children:me.t("solarPanelYieldPanel.YearlyTotal",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)}),Z>0&&Object(pf.jsx)(sF.a,{title:me.t("shared.MoreResults",J),content:Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",J)+": "}),Object(pf.jsx)(BT.a,{span:10,children:q})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:[(Z/q).toFixed(2)," kWh"]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",_.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",$.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",J)+": "}),Object(pf.jsx)(BT.a,{span:10,children:(ee>0?"$":"-$")+Math.abs(ee).toFixed(2)})]})]}),children:Object(pf.jsx)(Sv.a,{type:"default",children:me.t("shared.MoreResults",J)})})]}),!A&&Object(pf.jsxs)(pf.Fragment,{children:[G>1&&Object(pf.jsx)(ib.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",J),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:te?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})]})})})},gF=n.a.memo(yF),mF=Tv.a.div(yI||(yI=Object(Av.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=Tv.a.div(gI||(gI=Object(Av.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=Tv.a.div(mI||(mI=Object(Av.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=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(Zs),m=Xw(_s),w=Xw(o.dailyPvYieldPanelRect),x=Af(ad),v=bf(Er),b=Xw.getState().economicsParams,A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=S.current?S.current.offsetWidth+40:w?w.width+40:640,j=S.current?S.current.offsetHeight+100:w?w.height+100:500,z=Object(r.useState)({x:w?Math.max(w.x,H-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useRef)(new Map),O=Object(r.useRef)(),N={lng:a};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(h.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],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)}),[g]),Object(r.useEffect)((function(){W({x:Math.max(null===w||void 0===w?void 0:w.x,H-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===w||void 0===w?void 0:w.x,H-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),S.current&&(O.current||(O.current=new ResizeObserver((function(){d((function(e){S.current&&(e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.width=S.current.offsetWidth,e.viewState.dailyPvYieldPanelRect.height=S.current.offsetHeight)}))}))),O.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=O.current)||void 0===t||t.disconnect()}}),[w,H,j]);var U=function(){d((function(e){e.viewState.showDailyPvYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.SolarPanel);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1)}))}),[E,m]);var J=me.t("word.Hour",N),G=me.t("solarPanelYieldPanel.YieldPerHour",N),X=Ww.countAllSolarPanels(),B=X*b.operationalCostPerUnit,K=C*b.electricitySellingPrice,q=K-B,Q=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.dailyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyPvYieldPanel"}))},children:Object(pf.jsx)(mF,{ref:P,style:{zIndex:"dailyPvYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(wF,{ref:S,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(xF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelDailyYield",N)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",N)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){U()},onMouseDown:function(){U()},children:me.t("word.Close",N)})]}),Object(pf.jsx)(MC,{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",N),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&k.current.size>0?Object(pf.jsx)(sF.a,{title:me.t("shared.OutputBreakdown",N),content:Object(f.a)(k.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===k.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",N)+": "+C.toFixed(3)+" "+me.t("word.kWh",N)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",N)})}):Object(pf.jsxs)(pf.Fragment,{children:[C>0&&Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("solarPanelYieldPanel.DailyTotal",N)+": "+C.toFixed(3)+" "+me.t("word.kWh",N)}),C>0&&Object(pf.jsx)(sF.a,{title:me.t("shared.MoreResults",N),content:Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",N)+": "}),Object(pf.jsx)(BT.a,{span:10,children:X})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:[(C/X).toFixed(2)," kWh"]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",B.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",K.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",N)+": "}),Object(pf.jsx)(BT.a,{span:10,children:(q>0?"$":"-$")+Math.abs(q).toFixed(2)})]})]}),children:Object(pf.jsx)(Sv.a,{type:"default",children:me.t("shared.MoreResults",N)})})]}),!v&&Object(pf.jsxs)(pf.Fragment,{children:[E>1&&Object(pf.jsx)(ib.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",N),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",N)),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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Q?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(Q?"word.Run":"word.Update",N),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",N)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",N),onClick:function(){_h("line-graph-"+J+"-"+G,"daily-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",N)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",N),onClick:function(){$h(g,"daily-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",N)),c&&d((function(e){e.actionInfo={name:"Export Solar Panel Daily Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},bF=n.a.memo(vF),AF=Tv.a.div(wI||(wI=Object(Av.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"]))),TF=Tv.a.div(xI||(xI=Object(Av.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)"})),PF=function(){var e,t=Xw(ki),l=Xw(ss),a=Xw(hs),o=Xw($r),i=Xw(Vi),r=Xw(Ls),n=Xw(Kr),c=Xw(Ss),s=Xw((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=Ww.countAllChildSolarPanels(h.id),u=Ww.countAllChildSolarPanelDailyYields(h.id))}else d=Ww.countAllChildSolarPanels(s.id),u=Ww.countAllChildSolarPanelDailyYields(s.id),f=Ww.countAllChildElementsByType(s.id,V.Heliostat);else d=Ww.countAllSolarPanels(),u=Ww.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&&Ww.getBuildingCompletionStatus(s,t)===D.COMPLETE;return Object(pf.jsx)(AF,{children:Object(pf.jsx)(TF,{projectView:c,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:g,fontSize:"10px"},children:[d>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{alt:"Solar panel count",title:me.t("designInfoPanel.NumberOfSelectedSolarPanels",p),src:AD,height:24,width:36,style:{paddingLeft:"10px",cursor:"pointer",filter:"invert(100%) "}}),Object(pf.jsx)("span",{children:d})]}),f>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{alt:"Heliostat count",title:me.t("designInfoPanel.NumberOfSelectedHeliostats",p),src:OD,height:24,width:36,style:{paddingLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",filter:"invert(100%) "}}),Object(pf.jsx)("span",{children:f})]}),u>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("span",{children:u.toFixed(1)+" "+me.t("word.kWh",p)})]}),!s&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("span",{children:2*n+" "+me.t("word.MeterAbbreviation",p)})]}),w&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsxs)("span",{children:[Ww.getBuildingArea(s,t).toFixed(2)+" "+me.t("word.MeterAbbreviation",p),Object(pf.jsx)("sup",{children:"2"})]})]})]})})})},SF=n.a.memo(PF),HF=Tv.a.div(vI||(vI=Object(Av.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"]))),jF=Tv.a.div(bI||(bI=Object(Av.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)"})),zF=function(e){var t,l=e.city,a=Xw(Vi),o=Xw(i.date),n=Xw(i.address),c=Xw(i.latitude),s=Xw(i.longitude),d=Xw(i.diurnalTemperatureModel),f=Xw(Ws),h=Xw(Ls),p=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,y=Xw(Ss),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),H=h.y>0,j={lng:a};Object(r.useEffect)((function(){if(l){var e=f[l];if(e){var t=MT(S,e.lowestTemperatures,e.highestTemperatures);v(t);var a=WT(t.high,t.low,d,p,z,Ww.minutesIntoDay(S));P(a)}}}),[l,o]);var z=Object(r.useMemo)((function(){return Dy(S,c)}),[o,c]),R=H?"navajowhite":"antiquewhite",D=H?"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(pf.jsx)(HF,{children:Object(pf.jsx)(jF,{projectView:y,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:R,fontSize:"10px"},children:[Object(pf.jsx)("img",{title:me.t("word.Location",j),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(pf.jsx)("img",{title:me.t("word.Date",j),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(pf.jsx)("img",{title:me.t("word.Temperature",j),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",j)+":"+w.low.toFixed(1)+"\xb0C, "+me.t("siteInfoPanel.High",j)+": "+w.high.toFixed(1)+"\xb0C)":""]})})})},RF=n.a.memo(zF),DF=Tv.a.div(AI||(AI=Object(Av.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"]))),WF=Tv.a.div(TI||(TI=Object(Av.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"]))),MF=function(){var e=Xw(si),t=Xw(Vi),l=Xw(o.solarRadiationHeatmapMaxValue),a=Xw(o.showSiteInfoPanel),i=Xw(o.heatFluxScaleFactor),r=bf(Es),n={lng:t};return Object(pf.jsx)(DF,{style:{top:a?"110px":"80px"},children:Object(pf.jsx)(WF,{style:{width:r?"300px":"160px",left:r?"calc(100vw / 2 - 150px)":"calc(100vw / 2 - 80px)"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[me.t("visualizationControlPanel.ColorContrast",n)+":",Object(pf.jsx)(ob.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(pf.jsxs)(pf.Fragment,{children:[me.t("visualizationControlPanel.FluxScale",n)+":",Object(pf.jsx)(ob.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}))}})]})]})})})},IF=n.a.memo(MF),CF=pR.a.Column,FF=Tv.a.div(PI||(PI=Object(Av.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"]))),kF=Tv.a.div(SI||(SI=Object(Av.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"]))),OF=Tv.a.div(HI||(HI=Object(Av.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(){var e=Xw(Vi),t=Xw(Gi),l=Xw(si),a=new Date(Xw(i.date)),c=Xw(o.visibilityResultsPanelRect),s=Af(Js),d=Xw(us),f=Xw(Ei),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],H={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 Ft(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,H),vantage:"("+l.position.x.toFixed(1)+", "+l.position.y.toFixed(1)+", "+l.position.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",H),total:a.toFixed(2),itemized:i>1?o.substring(0,o.length-2):"---"})})),S(e)}}),[s,e]);var j=function(){l((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!1,t&&(e.actionInfo={name:"Close Visibility Results Panel",timestamp:(new Date).getTime()})}))};return Object(pf.jsx)(qT.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 Ft(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(pf.jsx)(FF,{ref:h,style:{zIndex:"visibilityResultsPanel"===f?Ke:8},children:Object(pf.jsxs)(kF,{ref:p,style:{width:(c?c.width:600)+"px",height:(c?c.height:470)+"px"},children:[Object(pf.jsxs)(OF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("visibilityPanel.SolarPanelVisibility",H)+" \u2014 "+vM()(a).format("h:mm A MM/DD")}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){j()},onMouseDown:function(){j()},children:me.t("word.Close",H)})]}),Object(pf.jsxs)(pR.a,{id:"visibility-results-table",style:{width:"100%",direction:"ltr"},dataSource:P,pagination:{defaultPageSize:5,showSizeChanger:!0,pageSizeOptions:["5","10","50"]},children:[Object(pf.jsx)(CF,{title:me.t("visibilityPanel.Observer",H),dataIndex:"observer"},"observer"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.VantagePoint",H),dataIndex:"vantage"},"vantage"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.TotalVisibility",H),dataIndex:"total"},"total"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.ItemizedVisibilityByFields",H),dataIndex:"itemized"},"itemized")]}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(LC.a,{}),title:me.t("word.Update",H),onClick:function(){0!==d()?(Kh(me.t("message.SimulationStarted",H)),setTimeout((function(){bf.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",H))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("visibility-results-table","visibility-results",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H))}))}})]})]})})})},LF=n.a.memo(YF),NF=["Daylight","Clearness"],UF=Tv.a.div(jI||(jI=Object(Av.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"]))),EF=Tv.a.div(zI||(zI=Object(Av.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"]))),VF=Tv.a.div(RI||(RI=Object(Av.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=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(yd),w=Xw(gd),x=Af(wd),v=Xw(ss),b=Xw(o.yearlyParabolicTroughYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicTroughYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicTroughYieldPanel"}))},children:Object(pf.jsx)(UF,{ref:P,style:{zIndex:"yearlyParabolicTroughYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(EF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(VF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(MC,{type:L.YearlyParabolicTroughYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,NF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("parabolicTroughYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},GF=n.a.memo(JF),XF=Tv.a.div(DI||(DI=Object(Av.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"]))),BF=Tv.a.div(WI||(WI=Object(Av.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=Tv.a.div(MI||(MI=Object(Av.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(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(fd),m=Xw(hd),w=Xw(o.dailyParabolicTroughYieldPanelRect),x=Af(wd),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyParabolicTroughYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Trough Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.ParabolicTrough);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("parabolicTroughYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"}))},children:Object(pf.jsx)(XF,{ref:A,style:{zIndex:"dailyParabolicTroughYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(BF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(KF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(MC,{type:L.DailyParabolicTroughYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("parabolicTroughYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},QF=n.a.memo(qF),ZF=Tv.a.div(II||(II=Object(Av.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"]))),_F=Tv.a.div(CI||(CI=Object(Av.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=Tv.a.div(FI||(FI=Object(Av.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=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(cu),m=Xw(su),w=Xw(o.dailyParabolicDishYieldPanelRect),x=Af(pu),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyParabolicDishYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Dish Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.ParabolicDish);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("parabolicDishYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicDishYieldPanel"}))},children:Object(pf.jsx)(ZF,{ref:A,style:{zIndex:"dailyParabolicDishYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(_F,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)($F,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(MC,{type:L.DailyParabolicDishYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("parabolicDishYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},tk=n.a.memo(ek),lk=["Daylight","Clearness"],ak=Tv.a.div(kI||(kI=Object(Av.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"]))),ok=Tv.a.div(OI||(OI=Object(Av.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=Tv.a.div(YI||(YI=Object(Av.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(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(uu),w=Xw(fu),x=Af(pu),v=Xw(ss),b=Xw(o.yearlyParabolicDishYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicDishYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicDishYieldPanel"}))},children:Object(pf.jsx)(ak,{ref:P,style:{zIndex:"yearlyParabolicDishYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(ok,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(ik,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(MC,{type:L.YearlyParabolicDishYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,lk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("parabolicDishYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},nk=n.a.memo(rk),ck=Tv.a.div(LI||(LI=Object(Av.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"]))),sk=Tv.a.div(NI||(NI=Object(Av.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"]))),dk=Tv.a.div(UI||(UI=Object(Av.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"]))),uk=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(Pd),m=Xw(Sd),w=Xw(o.dailyFresnelReflectorYieldPanelRect),x=Af(Dd),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyFresnelReflectorYieldPanel=!1,c&&(e.actionInfo={name:"Close Fresnel Reflector Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.FresnelReflector);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("fresnelReflectorYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"}))},children:Object(pf.jsx)(ck,{ref:A,style:{zIndex:"dailyFresnelReflectorYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(sk,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(dk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(MC,{type:L.DailyFresnelReflectorYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("fresnelReflectorYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-fresnel-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},fk=n.a.memo(uk),hk=["Daylight","Clearness"],pk=Tv.a.div(EI||(EI=Object(Av.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"]))),yk=Tv.a.div(VI||(VI=Object(Av.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"]))),gk=Tv.a.div(JI||(JI=Object(Av.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"]))),mk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(jd),w=Xw(zd),x=Af(Dd),v=Xw(ss),b=Xw(o.yearlyFresnelReflectorYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyFresnelReflectorYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyFresnelReflectorYieldPanel"}))},children:Object(pf.jsx)(pk,{ref:P,style:{zIndex:"yearlyFresnelReflectorYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(yk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(gk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(MC,{type:L.YearlyFresnelReflectorYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,hk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("fresnelReflectorYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},wk=n.a.memo(mk),xk=Tv.a.div(GI||(GI=Object(Av.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"]))),vk=Tv.a.div(XI||(XI=Object(Av.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"]))),bk=Tv.a.div(BI||(BI=Object(Av.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"]))),Ak=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(kd),m=Xw(Od),w=Xw(o.dailyHeliostatYieldPanelRect),x=Af(Ed),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyHeliostatYieldPanel=!1,c&&(e.actionInfo={name:"Close Heliostat Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.Heliostat);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("heliostatYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyHeliostatYieldPanel"}))},children:Object(pf.jsx)(xk,{ref:A,style:{zIndex:"dailyHeliostatYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(vk,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(bk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(MC,{type:L.DailyHeliostatYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("heliostatYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Heliostats",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},Tk=n.a.memo(Ak),Pk=["Daylight","Clearness"],Sk=Tv.a.div(KI||(KI=Object(Av.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"]))),Hk=Tv.a.div(qI||(qI=Object(Av.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"]))),jk=Tv.a.div(QI||(QI=Object(Av.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"]))),zk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(Ld),w=Xw(Nd),x=Af(Ed),v=Xw(ss),b=Xw(o.yearlyHeliostatYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyHeliostatYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyHeliostatYieldPanel"}))},children:Object(pf.jsx)(Sk,{ref:P,style:{zIndex:"yearlyHeliostatYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(Hk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(jk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(MC,{type:L.YearlyHeliostatYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,Pk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("heliostatYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},Rk=n.a.memo(zk),Dk=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,H=void 0===S?12:S,j=Object(r.useState)(0),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[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 F=Object(r.useMemo)((function(){var e,t=[];t.push(Object(pf.jsx)(BM.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=RC(QM[2*l+1],1,H,o=null===I||I===a?1:.25),t.push(Object(pf.jsx)(BM.a,{yAxisId:"right",type:b,name:a,dataKey:a,stroke:Be[2*l+1],opacity:o,strokeWidth:2,dot:H>0&&(i||e),isAnimationActive:!1},"right-"+l))}return t}),[b,R,2,H,1,I]);return Object(pf.jsx)(pf.Fragment,{children:t&&Object(pf.jsx)("div",{id:"biaxial-line-graph-"+o+"-"+i+"-"+n,style:{width:"100%",height:"".concat(l,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(pf.jsx)(jM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(qM.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(RM.a,{formatter:function(e){return e.toFixed(P)}}),Object(pf.jsx)(DM.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(WM.a,{yAxisId:"left",x:A,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(MM.a,{dataKey:null!==a&&void 0!==a?a:o,fontSize:"10px",children:Object(pf.jsx)(IM.a,{value:o+(c?" ("+c+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(CM.a,{domain:[h,y],yAxisId:"left",fontSize:"10px",children:Object(pf.jsx)(IM.a,{dx:-15,value:i+(s?" ("+s+")":""),offset:0,angle:-90,position:"center"})}),Object(pf.jsx)(CM.a,{domain:[m,x],yAxisId:"right",orientation:"right",fontSize:"10px",children:Object(pf.jsx)(IM.a,{dx:15,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),F,R>1&&Object(pf.jsx)(FM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})})})})})},Wk=Tv.a.div(ZI||(ZI=Object(Av.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"]))),Mk=Tv.a.div(_I||(_I=Object(Av.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=Tv.a.div($I||($I=Object(Av.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"]))),Ck=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ds),g=Af(qd),m=Af(Kd),w=Xw(Qd),x=Xw(o.dailyUpdraftTowerYieldPanelRect),v=Af(lu),b=bf(gs),A=Xw(Ei),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),H=P.current?P.current.clientWidth+40:x?x.width+40:680,j=P.current?P.current.clientHeight+100:x?x.height+100:650,z=Object(r.useState)({x:x?Math.max(x.x,H-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useRef)(new Map),O={lng:a};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(h.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],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)}),[g]),Object(r.useEffect)((function(){W({x:Math.max(null===x||void 0===x?void 0:x.x,H-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-j)})}),[x,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===x||void 0===x?void 0:x.x,H-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-j)})};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 Ft(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,H,j]);var N=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 E=me.t("word.Hour",O),V=me.t("updraftTowerYieldPanel.YieldPerHour",O),J=me.t("updraftTowerYieldPanel.ChimneyAirTemperature",O),X=me.t("updraftTowerYieldPanel.ChimneyWindSpeed",O),B=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ft(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.dailyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"}))},children:Object(pf.jsx)(Wk,{ref:T,style:{zIndex:"dailySolarUpdraftTowerYieldPanel"===A?Ke:9},children:Object(pf.jsxs)(Mk,{ref:P,style:{opacity:s,width:(x?x.width:640)+"px",height:(x?x.height:550)+"px"},children:[Object(pf.jsxs)(Ik,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerDailyYield",O)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",O)+" "+l+" | "+vM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",O)})]}),Object(pf.jsx)(MC,{type:L.DailyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:g,labels:v,height:100,dataKeyAxisX:"Hour",labelX:E,labelY:V,unitY:me.t("word.kWh",O),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),Object(pf.jsx)(Dk,{dataSource:m,height:100,dataKeyAxisX:"Hour",labelX:E,labelY1:J,labelY2:X,unitY1:"\xb0C",unitY2:me.t("word.MeterPerSecond",O),yMin1:0,yMin2:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!b&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[U>1&&k.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(k.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===k.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",O)+": "+C.toFixed(3)+" "+me.t("word.kWh",O)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",O)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("updraftTowerYieldPanel.DailyTotal",O),":",C.toFixed(2)," ",me.t("word.kWh",O)]}),Object(pf.jsx)(Sv.a,{type:"default",icon:B?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(B?"word.Run":"word.Update",O),onClick:function(){0!==U?(Kh(me.t("message.SimulationStarted",O)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!0,e.pauseDailySimulationForUpdraftTower=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",O))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",O),onClick:function(){_h("line-graph-"+E+"-"+V,"daily-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",O)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",O),onClick:function(){$h(g,"daily-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",O)),c&&d((function(e){e.actionInfo={name:"Export Daily Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},Fk=n.a.memo(Ck),kk=Tv.a.div(eC||(eC=Object(Av.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"]))),Ok=Tv.a.div(tC||(tC=Object(Av.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"]))),Yk=Tv.a.div(lC||(lC=Object(Av.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"]))),Lk=function(e){var t,l,a,c=e.city,s=Xw(Vi),d=Xw(Sr),f=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,h=Xw(si),p=new Date(Xw(i.date)),y=Xw(i.latitude),g=Xw(i.ground),m=null!==(l=Xw(i.diurnalTemperatureModel))&&void 0!==l?l:U.Sinusoidal,w=null!==(a=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==a?a:900,v=Xw(Is),b=Xw(o.diurnalTemperaturePanelRect),A=Xw(Ei),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),H=P.current?P.current.clientWidth+40:b?b.width+40:640,j=P.current?P.current.clientHeight+100:b?b.height+100:500,z=Object(r.useState)({x:b?Math.min(b.x,window.innerWidth-H):0,y:b?Math.min(b.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(m),I=Object(u.a)(M,2),C=I[0],F=I[1],k={lng:s};Object(r.useEffect)((function(){W({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-H),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-j)})}),[b,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-H),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-j)})};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 Ft(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,H,j]);var O=Object(r.useMemo)((function(){var e=[];if(c){var t=v(c);if(t)for(var l=Dy(p,y),a=0;a<24;a++){var o;p.setHours(a);var i=MT(p,t.lowestTemperatures,t.highestTemperatures),r=Ww.minutesIntoDay(p);e.push({Hour:a,Sinusoidal:WT(i.high,i.low,U.Sinusoidal,w,l,r),PartonLogan:WT(i.high,i.low,U.PartonLogan,w,l,r),Ground:IT(y,Ww.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()]),N=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(pf.jsx)(qT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.min(t.x,window.innerWidth-H),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){h((function(e){e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ft(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.x=Math.min(t.x,window.innerWidth-H),e.viewState.diurnalTemperaturePanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){h((function(e){e.selectedFloatingWindow="diurnalTemperaturePanel"}))},children:Object(pf.jsx)(kk,{ref:T,style:{zIndex:"diurnalTemperaturePanel"===A?Ke:10},children:Object(pf.jsxs)(Ok,{ref:P,style:{opacity:f,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(Yk,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("menu.settings.DiurnalTemperature",k)+": "+c+" | "+x()(p).format("MM/DD")}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(MC,{chartType:Y.Line,type:L.HourlyTemperatures,selectedIndex:C-U.Sinusoidal,dataSource:O,height:100,dataKeyAxisX:"Hour",labelX:me.t("word.Hour",k),labelY:me.t("word.Temperature",k),unitY:"\xb0C",fractionDigits:1,referenceX:p.getHours()}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center"},children:[Object(pf.jsx)(Pv.b,{children:me.t("diurnalTemperaturePanel.SelectAirTemperatureModel",k)}),Object(pf.jsxs)(rb.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(){F(a.oldValue),h((function(e){e.world.diurnalTemperatureModel=a.oldValue}))},redo:function(){F(a.newValue),h((function(e){e.world.diurnalTemperatureModel=a.newValue}))}};d(a),F(l),h((function(e){e.world.diurnalTemperatureModel=l}))},value:C,children:[Object(pf.jsx)(rb.a,{value:U.Sinusoidal,children:me.t("diurnalTemperaturePanel.Sinusoidal",k)}),Object(pf.jsx)(rb.a,{value:U.PartonLogan,children:"Parton-Logan"})]})]})]})})})},Nk=n.a.memo(Lk),Uk=["Daylight","Clearness"],Ek=Tv.a.div(aC||(aC=Object(Av.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"]))),Vk=Tv.a.div(oC||(oC=Object(Av.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"]))),Jk=Tv.a.div(iC||(iC=Object(Av.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"]))),Gk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.sutDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af($d),w=Xw(eu),x=Af(lu),v=Xw(ds),b=Xw(o.yearlyUpdraftTowerYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyUpdraftTowerYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"}))},children:Object(pf.jsx)(Ek,{ref:P,style:{zIndex:"yearlySolarUpdraftTowerYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(Vk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(Jk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(MC,{type:L.YearlyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,Uk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:J,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[V>1&&O.current.size>0?Object(pf.jsx)(sF.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("updraftTowerYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0,e.pauseYearlySimulationForUpdraftTower=!1}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},Xk=n.a.memo(Gk),Bk=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,H=Xw(df),j=Object(r.useState)(null),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useRef)([]),M=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;W.current.length=0;for(var s=0;s0&&(f||e),isAnimationActive:!1},"left-"+s)),W.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=RC(QM[s],1,i,p);r.push(Object(pf.jsx)(BM.a,{yAxisId:"right",type:A,name:h,dataKey:h,stroke:Be[s],opacity:p,strokeWidth:2,dot:i>0&&(y||e),isAnimationActive:!1},"right")),W.current.push({id:h,type:"line",value:h,color:Be[n]})}else{var g=Math.floor((s-a)/c),m="Individual"+(s+1),w=RC(QM[g],.5,i,.5,Be[g]);r.push(Object(pf.jsx)(BM.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(pf.jsx)(pf.Fragment,{children:t&&Object(pf.jsx)("div",{id:"biaxial-line-graph-"+i+"-"+n+"-"+c,style:{width:"100%",height:"".concat(a,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(pf.jsx)(jM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(qM.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(RM.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?Ww.toDegrees(e.value*(H.maximumTiltAngle-H.minimumTiltAngle)+H.minimumTiltAngle).toFixed(S)+"\xb0":"Inter-Row Spacing"===e.name?(e.value*(H.maximumInterRowSpacing-H.minimumInterRowSpacing)+H.minimumInterRowSpacing).toFixed(S)+"m":"Rack Width"===e.name?Math.floor(e.value*(H.maximumRowsPerRack-H.minimumRowsPerRack)+H.minimumRowsPerRack)+" panels":"Objective"===e.name?e.value.toFixed(S)+" "+f:e.value.toFixed(S),Object(pf.jsxs)("div",{children:[e.name,": ",l]},e.name))})):null}}),Object(pf.jsx)(DM.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(WM.a,{yAxisId:"left",x:T,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(MM.a,{dataKey:null!==o&&void 0!==o?o:i,style:{fontSize:"10px"},children:Object(pf.jsx)(IM.a,{value:i+(s?" ("+s+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(CM.a,{domain:[p,g],yAxisId:"left",style:{fontSize:"10px"},children:Object(pf.jsx)(IM.a,{dx:-20,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),Object(pf.jsx)(CM.a,{domain:[w,v],yAxisId:"right",orientation:"right",style:{fontSize:"10px"},children:Object(pf.jsx)(IM.a,{dx:30,value:c+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),M,Object(pf.jsx)(FM.a,{payload:W.current,iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){D(null)},onMouseEnter:function(e){D(e.id)}})]})})})})})},Kk=Tv.a.div(rC||(rC=Object(Av.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"]))),qk=Tv.a.div(nC||(nC=Object(Av.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"]))),Qk=Tv.a.div(cC||(cC=Object(Av.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"]))),Zk=function(){var e,t=Xw(Vi),l=Xw(Gi),a=null!==(e=Xw(Ui))&&void 0!==e?e:Qe,i=Xw(si),c=Xw(of),s=Xw(nf),d=Xw(o.evolutionPanelRect),f=Xw(ln),h=Xw(Gr),p=Xw.getState().evolutionaryAlgorithmState,y=bf(gs),g=bf(ws),m=Xw(Ei),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],H=P[1],j=Object(r.useMemo)((function(){return{lng:t}}),[t]);Object(r.useEffect)((function(){H({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(){H({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 Ft(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",j)}),[h,j]),C=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_TILT_ANGLE?me.t("solarPanelMenu.TiltAngle",j):me.t("optimizationMenu.NormalizedVariables",j)}),[R.problem,j]),F=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_TILT_ANGLE?"\xb0":""}),[R.problem]),k=Object(r.useMemo)((function(){return R.problem!==W.SOLAR_PANEL_ARRAY||R.objectiveFunctionType!==M.DAILY_PROFIT&&R.objectiveFunctionType!==M.YEARLY_PROFIT?me.t("word.kWh",j):me.t("word.dollar",j)}),[R.problem,R.objectiveFunctionType,j]),O=Object(r.useMemo)((function(){switch(R.objectiveFunctionType){case M.DAILY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionDailyProfit",j);case M.YEARLY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",j);case M.DAILY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",j);case M.YEARLY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",j);case M.DAILY_TOTAL_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",j)}return me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",j)}),[R.objectiveFunctionType,j]),Y=Object(r.useMemo)((function(){return!!f&&(R.problem===W.SOLAR_PANEL_TILT_ANGLE?f.type===V.Foundation:R.problem===W.SOLAR_PANEL_ARRAY&&f.type===V.Polygon)}),[R.problem,f]),L=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_ARRAY?me.t("optimizationMenu.ClickTargetPolygonToActivate",j):me.t("optimizationMenu.ClickTargetFoundationToActivate",j)}),[R.problem,j]),N=Object(r.useMemo)((function(){var e="";return R.problem===W.SOLAR_PANEL_TILT_ANGLE&&(e+=me.t("optimizationMenu.SolarPanelTiltAngleOptimization",j)),R.problem===W.SOLAR_PANEL_ARRAY&&(e+=me.t("optimizationMenu.SolarPanelArrayLayout",j)),e+=": ",e+=h===I.GENETIC_ALGORITHM?me.t("optimizationMenu.GeneticAlgorithm",j):me.t("optimizationMenu.ParticleSwarmOptimization",j)}),[R.problem,h,j]);return Object(pf.jsx)(qT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){H({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 Ft(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(pf.jsx)(Kk,{ref:w,style:{zIndex:"solarPanelOptimizationResult"===m?Ke:9},children:Object(pf.jsxs)(qk,{ref:x,style:{opacity:a,width:(d?d.width:640)+"px",height:(d?d.height:400)+"px"},children:[Object(pf.jsxs)(Qk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:N}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",j)})]}),Object(pf.jsx)(Bk,{dataSource:c,labels:s,height:100,dataKeyAxisX:"Step",labelX:D,labelY1:C,labelY2:O,unitY1:F,unitY2:k,curveType:"linear",fractionDigits:2}),!y&&!g&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Y&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(uD.a,{}),title:me.t("word.Run",j),onClick:function(){Kh(me.t("message.EvolutionStarted",j)),setTimeout((function(){bf.setState((function(e){e.runEvolution=!0,e.pauseEvolution=!1,e.evolutionInProgress=!0})),l&&i((function(e){var t;R.problem===W.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===W.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(pf.jsx)("span",{children:L}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("biaxial-line-graph-"+D+"-"+C+"-"+O,"solar-panel-tilt-angle-evolution",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j))}))}})]})]})})})},_k=n.a.memo(Zk),$k=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(Vi),o=Xw(af),i=Xw(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(pf.jsxs)(lb.a,{width:500,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",P)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.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(pf.jsx)("div",{ref:v,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.ElectricitySellingPrice",P)+" ([0.1, 1]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.OperationalCostPerUnit",P)+" ([0.1, 1]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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)}})})]})]})},eO=n.a.memo($k),tO=function(e,t,l){var a=Xw.getState().elements,o=Xw(_r),i=Xw(Zr),n=bf(bi),c=Af(Ai),s=Af(Pi),d=Af(Hi),u=[],f=[],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=MT(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(h.a)(a);try{for(v.s();!(m=v.n()).done;){var b=m.value;if(Ww.onBuildingEnvelope(b)){var A=c.get(b.id);if(A){var T=b.type===V.Foundation?b:o(b);if(T&&!T.notBuilding&&Ww.getBuildingCompletionStatus(T,a)===D.COMPLETE){var P,S,H,j=x.get(T.id);if(!j)j=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,j),(null===(H=T.hvacSystem)||void 0===H?void 0:H.id)?T.hvacSystem.id&&T.hvacSystem.id.length>0&&!f.includes(T.hvacSystem.id)&&f.push(T.hvacSystem.id):T.label&&T.label.length>0&&!f.includes(T.label)&&f.push(T.label);b.type===V.Foundation?j.geothermal+=A[n]:A[n]<0?j.heater+=A[n]:j.ac+=A[n]}}}}}catch(Se){v.e(Se)}finally{v.f()}var z,R=Object(h.a)(a);try{for(R.s();!(z=R.n()).done;){var W=z.value;if(W.type===V.Foundation){var M=W;if(!M.notBuilding&&Ww.getBuildingCompletionStatus(M,a)!==D.COMPLETE)continue;var I=x.get(W.id);if(I){var C=s.get(W.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 F=d.get(W.id);F&&(I.solarPanel+=F[n])}}}}}catch(Se){R.e(Se)}finally{R.f()}if(x.size>1){var k,O=1,Y=Object(h.a)(x.keys());try{for(Y.s();!(k=Y.n()).done;){var L=k.value;w.Hour=n;var N=x.get(L);if(N){var U=i(L);if(U&&U.type===V.Foundation){var E=U;if(!E.notBuilding&&Ww.getBuildingCompletionStatus(E,a)===D.COMPLETE){var J,G,X,B,K,q,Q=null!==(J=null===(G=E.hvacSystem)||void 0===G?void 0:G.thermostatSetpoint)&&void 0!==J?J:20,Z=null!==(X=null===(B=E.hvacSystem)||void 0===B?void 0:B.temperatureThreshold)&&void 0!==X?X:3,_=null!==(K=null===(q=E.hvacSystem)||void 0===q?void 0:q.id)&&void 0!==K?K:N.label&&""!==N.label?N.label:O.toString();_===O.toString()&&O++;var $=Math.abs(DT(r,N.heater,Q,Z)),ee=DT(r,N.ac,Q,Z);$>0?($-=N.geothermal)<0&&($=0):ee>0&&(ee+=N.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!==N.solarPanel){var ae="Solar "+_;w[ae]?w[ae]=w[ae]-N.solarPanel:w[ae]=-N.solarPanel}var oe,ie,re="Net "+_;if(w[re])w[re]=w[re]+$+ee-(null!==(oe=N.solarPanel)&&void 0!==oe?oe:0);else w[re]=$+ee-(null!==(ie=N.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+=N.solarPanel,g.current.set(_,ne))}}}}}catch(Se){Y.e(Se)}finally{Y.f()}}else{var ce,se=Object(h.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&&Ww.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(DT(r,ue.heater,xe,ve)),Ae=DT(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:f}},lO=l(827),aO=Object(Tv.a)(EM)(sC||(sC=Object(Av.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"]))),oO=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:Xw(Vi)},p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.LineWidth",h)+":",Object(pf.jsx)(oH.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*a,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",h)+":",Object(pf.jsx)(oH.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*o,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.BarCategoryGap",h)+":",Object(pf.jsx)(oH.a,{min:0,max:20,tooltipVisible:!1,defaultValue:i,onChange:function(e){null===f||void 0===f||f(e)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",h)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",h)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:w,placement:"bottomRight",visible:g,onVisibleChange:function(e){m(e)},children:Object(pf.jsx)(aO,{style:{right:"25px"},onClick:function(e){e.stopPropagation()}})})})},iO=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),H=S[0],j=S[1],z=Object(r.useState)(),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!0),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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(H!==t&&j(t),1===t&&l[0])for(var o in l[0])if(o.startsWith("Heater")){W(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(pf.jsx)(HM.a,{name:n,dataKey:n,stroke:i,fill:"#FA8072",opacity:null===E||E===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l)),n=H>1?o[r*l+1]:D?"AC "+D:"AC",t.push(Object(pf.jsx)(HM.a,{name:n,dataKey:n,stroke:i,fill:"#00BFFF",opacity:null===E||E===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+1)),a&&(n=H>1?o[r*l+2]:D?"Solar "+D:"Solar",t.push(Object(pf.jsx)(HM.a,{name:n,dataKey:n,stroke:i,fill:"#3CB371",opacity:null===E||E===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=RC(QM[s],Q,T,null===E||E===d?1:.25);0===s&&(e=u),t.push(Object(pf.jsx)(BM.a,{type:w,name:d,dataKey:d,stroke:Be[s],opacity:null===E||E===d?1:.25,strokeWidth:X,dot:T>0&&(u||e),isAnimationActive:!1},s*l+c))}return t}),[t,w,o,H,D,X,T,Q,E]);return Object(pf.jsx)(pf.Fragment,{children:l&&Object(pf.jsx)("div",{id:"line-graph-"+c+"-"+s,style:{width:"100%",height:"".concat(i,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(pf.jsx)(jM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(lO.a,{data:l,stackOffset:"sign",barGap:0,barCategoryGap:ee,onMouseDown:function(e){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(RM.a,{formatter:function(e){return e.toFixed(b)+" "+f}}),Object(pf.jsx)(DM.a,{vertical:Y,horizontal:C,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(WM.a,{x:x,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(MM.a,{dataKey:null!==n&&void 0!==n?n:c,fontSize:"10px",children:Object(pf.jsx)(IM.a,{value:c+(d?" ("+d+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(CM.a,{domain:[p,g],fontSize:"10px",children:Object(pf.jsx)(IM.a,{dx:-15,value:s+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),le,Object(pf.jsx)(WM.a,{y:0,stroke:"#888"}),H>0&&Object(pf.jsx)(FM.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){V(null)},onMouseEnter:function(e){V(e.dataKey)}})]})}),Object(pf.jsx)(oO,{symbolSize:Q,lineWidth:X,barCategoryGap:ee,horizontalGrid:C,verticalGrid:Y,changeHorizontalGrid:function(e){F(e)},changeVerticalGrid:function(e){L(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)},changeBarCategoryGap:function(e){te(e)}})]})})})},rO=Tv.a.div(dC||(dC=Object(Av.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"]))),nO=Tv.a.div(uC||(uC=Object(Av.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"]))),cO=Tv.a.div(fC||(fC=Object(Av.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"]))),sO=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=Xw(is),p=Xw(Is),y=new Date(Xw(i.date)),g=Xw(o.dailyBuildingEnergyPanelRect),m=bf(bi),w=bf(Ir),x=bf(Or),v=bf(gs),b=Ww.hasSolarPanels(Xw.getState().elements),A=Af(id),T=Af(rd),P=Af(nd),S=Xw(Ei),H=n.a.useRef(null),j=Object(r.useRef)(null),z=Object(r.useRef)(),R=j.current?j.current.clientWidth+40:g?g.width+40:640,W=j.current?j.current.clientHeight+100:g?g.height+100:460,M=Object(r.useState)({x:g?Math.max(g.x,R-window.innerWidth):0,y:g?Math.min(g.y,window.innerHeight-W):0}),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)([]),O=Object(u.a)(k,2),Y=O[0],N=O[1],U=Object(r.useState)(0),E=Object(u.a)(U,2),V=E[0],J=E[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(){N([]),J(0),K(0),_(0),le(0),re([])},pe=tO(y,ce,b),ye=pe.sum,ge=pe.sumHeaterMap,we=pe.sumAcMap,xe=pe.sumSolarPanelMap,ve=pe.dataLabels;Object(r.useEffect)((function(){N(ye);var e=0,t=0,l=0,a=ge.size>1;if(ge){se.current=[];var o,i=Object(h.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(h.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 f,p=Object(h.a)(xe.keys());try{for(p.s();!(f=p.n()).done;){var y=f.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(h.a)(ge.keys());try{for(w.s();!(m=w.n()).done;){var x=m.value,v=0,S=ge.get(x),H=we.get(x),j=xe.get(x);S&&(v+=S),H&&(v+=H),j&&(v-=j),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,W=0;W0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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()}}))}})]})]})})})},dO=n.a.memo(sO),uO=Tv.a.div(hC||(hC=Object(Av.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"]))),fO=Tv.a.div(pC||(pC=Object(Av.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"]))),hO=Tv.a.div(yC||(yC=Object(Av.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=Xw.getState().world,s=Xw(Is),d=Xw(Vi),p=Xw(Gi),y=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,g=Xw(si),m=Xw(is),w=new Date(Xw(i.date)),x=Xw(o.yearlyBuildingEnergyPanelRect),v=bf(bi),b=bf(Fr),A=bf(Yr),T=bf(gs),P=Ww.hasSolarPanels(Xw.getState().elements),S=Af(id),H=Af(rd),j=Af(nd),z=Xw(Ei),R=Object(r.useRef)(null),W=Object(r.useRef)(),M=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,M-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-I):0}),F=Object(u.a)(C,2),k=F[0],O=F[1],Y=n.a.useRef(null),N={lng:d},U=s(null!==a&&void 0!==a?a:"Boston MA, USA"),E=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=tO(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)),He=Object(r.useRef)(new Array(V).fill(0)),je=Object(r.useRef)([]),ze=Object(r.useRef)([]),Re=Object(r.useRef)([]),De=Object(r.useRef)([]);Object(r.useEffect)((function(){We()}),[V,A]),Object(r.useEffect)((function(){b&&We()}),[b]);var We=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),He.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(je.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(h.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(h.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(h.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(f.a)(Ae.current));var We=0;if(we){var Me,Ie=Object(h.a)(we.keys());try{for(Ie.s();!(Me=Ie.n()).done;){var Ce,Fe=Me.value;We+=null!==(Ce=we.get(Fe))&&void 0!==Ce?Ce:0}}catch(qe){Ie.e(qe)}finally{Ie.f()}}var ke=0;if(xe){var Oe,Ye=Object(h.a)(xe.keys());try{for(Ye.s();!(Oe=Ye.n()).done;){var Le,Ne=Oe.value;ke+=null!==(Le=xe.get(Ne))&&void 0!==Le?Le:0}}catch(qe){Ye.e(qe)}finally{Ye.f()}}var Ue=0;if(ve&&P){var Ee,Ve=Object(h.a)(ve.keys());try{for(Ve.s();!(Ee=Ve.n()).done;){var Je,Ge=Ee.value;Ue+=null!==(Je=ve.get(Ge))&&void 0!==Je?Je:0}}catch(qe){Ve.e(qe)}finally{Ve.f()}}Te.current[e]=We*J*30,Pe.current[e]=ke*J*30,Se.current[e]=Ue*J*30,He.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(He.current.slice(0,e+1).reduce((function(e,t){return e+t}),0)),S(Xe),H(Be),j(Ke),bf.getState().showSolarRadiationHeatmap||Af.getState().clearDataStore()}),[v]),Object(r.useEffect)((function(){O({x:Math.max(null===x||void 0===x?void 0:x.x,M-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})}),[x,M,I]),Object(r.useEffect)((function(){var e=function(){O({x:Math.max(null===x||void 0===x?void 0:x.x,M-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})};return window.addEventListener("resize",e),R.current&&(W.current||(W.current=new ResizeObserver((function(){g((function(e){R.current&&(e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ft(0,0,600,500)),e.viewState.yearlyBuildingEnergyPanelRect.width=R.current.offsetWidth,e.viewState.yearlyBuildingEnergyPanelRect.height=R.current.offsetHeight)}))}))),W.current.observe(R.current)),function(){var t;window.removeEventListener("resize",e),null===(t=W.current)||void 0===t||t.disconnect()}}),[x,M,I]);var Me=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",N),Ce=me.t("word.Energy",N),Fe=!he||!he[0]||0===Object.keys(he[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:Y,handle:".handle",bounds:"parent",axis:"both",position:k,onDrag:function(e,t){O({x:Math.max(t.x,M-window.innerWidth),y:Math.min(t.y,window.innerHeight-I)})},onStop:function(e,t){g((function(e){e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ft(0,0,600,360)),e.viewState.yearlyBuildingEnergyPanelRect.x=Math.max(t.x,M-window.innerWidth),e.viewState.yearlyBuildingEnergyPanelRect.y=Math.min(t.y,window.innerHeight-I)}))},onMouseDown:function(){g((function(e){e.selectedFloatingWindow="yearlyBuildingEnergyPanel"}))},children:Object(pf.jsx)(uO,{ref:Y,style:{zIndex:"yearlyBuildingEnergyPanel"===z?Ke:9},children:Object(pf.jsxs)(fO,{ref:R,style:{opacity:y,width:(x?x.width:600)+"px",height:(x?x.height:400)+"px"},children:[Object(pf.jsxs)(hO,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("buildingEnergyPanel.YearlyBuildingEnergy",N)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",N)+" "+a+" | "+w.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Me()},onMouseDown:function(){Me()},children:me.t("word.Close",N)})]}),Object(pf.jsx)(iO,{type:L.YearlyBuildingEnergy,dataSource:he,hasSolarPanels:P,labels:se,height:100,dataKeyAxisX:"Month",labelX:Ie,labelY:Ce,unitY:me.t("word.kWh",N),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!T&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[0===je.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Heater",N)+": "+B.toFixed(0)}):Object(pf.jsx)(sF.a,{content:je.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Heater",N)+": "+B.toFixed(0)})}),0===ze.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.AC",N)+": "+Z.toFixed(0)}):Object(pf.jsx)(sF.a,{content:ze.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.AC",N)+": "+Z.toFixed(0)})}),0!==te&&Object(pf.jsx)(pf.Fragment,{children:0===Re.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.SolarPanel",N)+": "+te.toFixed(0)}):Object(pf.jsx)(sF.a,{content:Re.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.SolarPanel",N)+": "+te.toFixed(0)})})}),0===De.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Net",N)+": "+ie.toFixed(0)}):Object(pf.jsx)(sF.a,{content:De.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Net",N)+": "+ie.toFixed(0)})}),Object(pf.jsx)(Sv.a,{type:"default",icon:Fe?Object(pf.jsx)(YC.a,{}):Object(pf.jsx)(LC.a,{}),title:me.t(Fe?"word.Run":"word.Update",N),onClick:function(){var e=Xw.getState().elements,t=Xw.getState().countElementsByType,l=Xw.getState().getChildrenOfType,a=zT(e,t,l);if(a.status!==nv.NO_BUILDING)if(a.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)a.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",N)),Kh(me.t("message.SimulationStarted",N)),setTimeout((function(){m(),bf.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",N);break;case D.WALL_EMPTY:o=me.t("message.BuildingContainsEmptyWall",N);break;case D.ROOF_MISSING:o=me.t("message.BuildingRoofMissing",N);break;default:o=me.t("message.UnknownErrors",N)}Qh(me.t("message.SimulationWillNotStartDueToErrors",N)+": "+o)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.SaveAsImage",N),onClick:function(){_h("line-graph-"+Ie+"-"+Ce,"yearly-building-energy",{}).then((function(){Kh(me.t("message.ScreenshotSaved",N)),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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsCsv",N),onClick:function(){$h(Ae.current,"yearly-building-energy.csv"),Kh(me.t("message.CsvFileSaved",N)),p&&g((function(e){e.actionInfo={name:"Export Yearly Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},yO=n.a.memo(pO),gO=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(Vi),o=Xw(Sr),i=Xw(pi),n=Xw(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 H=function(e){l((function(t){t.minimumNavigationMoveSpeed=e})),bf.setState((function(t){t.navigationMoveSpeed=e}))},j=function(e){l((function(t){t.minimumNavigationTurnSpeed=e})),bf.setState((function(t){t.navigationTurnSpeed=e}))};return Object(pf.jsxs)(lb.a,{width:500,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",S)},"Cancel"),Object(pf.jsx)(Sv.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(){H(l.oldValue)},redo:function(){H(l.newValue)}};o(l),H(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(){j(c.oldValue)},redo:function(){j(c.newValue)}};o(c),j(r)}}(),t(!1)},children:me.t("word.OK",S)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:b,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumMoveSpeed",S)+" ([1, 10]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumTurnSpeed",S)+" ([1, 5]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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)}})})]})]})},mO=n.a.memo(gO),wO=function(){var e=Xw(o.showSiteInfoPanel),t=Xw(o.showDesignInfoPanel),l=Xw(o.showInstructionPanel),a=Xw(o.showMapPanel),n=Xw(o.showHeliodonPanel),c=Xw(o.showStickyNotePanel),s=Xw(o.showWeatherPanel),d=Xw(o.showDiurnalTemperaturePanel),f=bf(fi),h=bf(hi),p=bf(Us),y=Xw(o.showDailyLightSensorPanel),g=Xw(o.showYearlyLightSensorPanel),m=Xw(o.showDailyPvYieldPanel),w=Xw(o.showYearlyPvYieldPanel),x=Xw(o.showVisibilityResultsPanel),v=Xw(o.showDailyParabolicTroughYieldPanel),b=Xw(o.showYearlyParabolicTroughYieldPanel),A=Xw(o.showDailyParabolicDishYieldPanel),T=Xw(o.showYearlyParabolicDishYieldPanel),P=Xw(o.showDailyFresnelReflectorYieldPanel),S=Xw(o.showYearlyFresnelReflectorYieldPanel),H=Xw(o.showDailyHeliostatYieldPanel),j=Xw(o.showYearlyHeliostatYieldPanel),z=Xw(o.showDailyUpdraftTowerYieldPanel),R=Xw(o.showYearlyUpdraftTowerYieldPanel),D=Xw(o.showDailyBuildingEnergyPanel),W=Xw(o.showYearlyBuildingEnergyPanel),M=Xw(o.showEvolutionPanel),I=Xw(Ss),C=Xw(i.latitude),F=Xw(i.longitude),k=Xw(Ys),O=Object(r.useState)("Boston MA, USA"),Y=Object(u.a)(O,2),N=Y[0],U=Y[1];return Object(r.useEffect)((function(){var e;U(null!==(e=k(C,F))&&void 0!==e?e:"Boston MA, USA")}),[C,F]),Object(pf.jsxs)(pf.Fragment,{children:[a&&Object(pf.jsx)(gM,{}),n&&Object(pf.jsx)(SM,{}),c&&Object(pf.jsx)(oF,{}),e&&Object(pf.jsx)(RF,{city:N}),t&&Object(pf.jsx)(SF,{}),l&&!I&&Object(pf.jsx)(cF,{}),s&&Object(pf.jsx)(OC,{city:N,graphs:[L.MonthlyTemperatures,L.SunshineHours]}),d&&Object(pf.jsx)(Nk,{city:N}),f&&Object(pf.jsx)(eO,{setDialogVisible:function(e){bf.setState((function(t){t.showEconomicsPanel=e}))}}),h&&Object(pf.jsx)(mO,{setDialogVisible:function(e){bf.setState((function(t){t.showNavigationPanel=e}))}}),g&&Object(pf.jsx)(BC,{city:N}),y&&Object(pf.jsx)(_C,{city:N}),w&&Object(pf.jsx)(gF,{city:N}),m&&Object(pf.jsx)(bF,{city:N}),x&&Object(pf.jsx)(LF,{}),b&&Object(pf.jsx)(GF,{city:N}),v&&Object(pf.jsx)(QF,{city:N}),T&&Object(pf.jsx)(nk,{city:N}),A&&Object(pf.jsx)(tk,{city:N}),P&&Object(pf.jsx)(fk,{city:N}),S&&Object(pf.jsx)(wk,{city:N}),H&&Object(pf.jsx)(Tk,{city:N}),j&&Object(pf.jsx)(Rk,{city:N}),z&&Object(pf.jsx)(Fk,{city:N}),R&&Object(pf.jsx)(Xk,{city:N}),D&&Object(pf.jsx)(dO,{city:N}),W&&Object(pf.jsx)(yO,{city:N}),p&&Object(pf.jsx)(IF,{}),M&&Object(pf.jsx)(_k,{})]})},xO=n.a.memo(wO),vO=function(){function e(){Object(je.a)(this,e)}return Object(ke.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?Ww.absoluteCoordinates(o.cx,o.cy,o.cz,i,r,o.lz):Ww.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,Ww.isZero(o.rotation[0])?f.z+=o.poleHeight:(p=o.rotation[0],y=h,g=!1)),u&&!Ww.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 We.Vector3).fromArray(o.normal),H=e.getMonth(),j=Ww.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,W=f.x-(v-P)/2,M=f.y-(b-P)/2,I=d||u?f.z:i.lz+o.poleHeight+o.lz,C=new We.Vector2(f.x,f.y),F=new We.Vector3,k=Array.from(Array(A),(function(){return new Array(T)})),O=new We.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 We.Quaternion).setFromUnitVectors(Rt,Y);(O=(new We.Euler).setFromQuaternion(L)).z+=y;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var N=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(Y.x,0,Y.z).normalize());(O=(new We.Euler).setFromQuaternion(N)).z+=y;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:var U=new We.Vector3(Y.x,-Y.y,0).normalize(),E=Math.acos(jt.dot(U))*Math.sign(U.x);O=new We.Euler(o.tiltAngle,0,E+h,"ZYX");break;case te.TILTED_SINGLE_AXIS_TRACKER:}}S.applyEuler(O),d&&!g&&(O.x=o.rotation[0],O.z=o.rotation[2]+h),u&&(O.x=vt+o.tiltAngle,O.z=i.relativeAngle+h);for(var J=Fy(l,j,n,py.SPHERE_MODEL),G=ky(t.ground,H,S,J),X=S.dot(l),B=new We.Vector2,K=new We.Vector3,q=0;q0&&(B.set(W+q*R,M+Q*D),K.set(B.x-C.x,B.y-C.y,0),K.applyEuler(O),F.set(f.x+K.x,f.y+K.y,I+K.z),c(o.id,F,l)<0&&(k[q][Q]+=X*J));var Z=0;switch(a.shadeTolerance){case le.NONE:for(var _=Number.MAX_VALUE,ee=0;ee0){var E,J=Object(h.a)(r);try{for(J.s();!(E=J.n()).done;){var G=E.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 We.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(h.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===Gy.Arched){var re=P.clone().add(new We.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(h.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.ySy||ye<0)&&pe&&(F[O][Y]+=I),C>0&&ye<0&&(k[O][Y]+=C*M,pe&&(F[O][Y]+=C*M))}}}return{intensity:F,unitArea:b*A,heatmap:k}}},{key:"computeDoorSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(i.cx,i.cy,i.cz),r).setZ(i.lz/2+r.lz).clone().add(new We.Vector3(o.cx*i.lx,0,o.cz*i.lz)),v=new We.Vector3(Math.cos(w-vt),Math.sin(w-vt),0),b=g*Math.cos(w),A=g*Math.sin(w),T=new We.Vector3,P=Fy(a,d,n,py.SPHERE_MODEL),S=ky(l.ground,t.getMonth(),v,P),H=v.dot(a),j=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.doorType===Gy.Arched)for(var z=0;z0&&c(o.id,T,a)<0&&(j[z][R]+=H*P))}else for(var M=0;M0){var C=M-p/2+.5,F=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+F*m),c(o.id,T,a)<0&&(j[M][I]+=H*P)}return{intensity:j,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&&(j[z][R]+=H*P))}else for(var M=0;M0){var C=M-p/2+.5,F=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+F*m),c(o.id,T,a)<0&&(j[M][I]+=H*P)}return{intensity:j,unitArea:g*m}}},{key:"computeRoofWindowSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Ww.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 We.Vector3(o.cx,o.cy,o.cz).applyEuler(new We.Euler(0,0,r.rotation[2]));w.x+=r.cx,w.y+=r.cy,w.z+=r.lz;var x=new We.Euler(o.rotation[0],o.rotation[1],o.rotation[2]+r.rotation[2],"ZXY"),v=new We.Vector3(0,0,1).applyEuler(x),b=new We.Vector3,A=Fy(a,d,n,py.SPHERE_MODEL),T=ky(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 H=0;H0&&c(o.id,b,a)<0&&(S[H][j]+=P*A))}else for(var W=0;W0){var I=W-p/2+.5,C=M-y/2+.5,F=new We.Vector3(I,C,0);F.applyEuler(x),b.set(w.x+F.x,w.y+F.y,w.z+F.z),c(o.id,b,a)<0&&(S[W][M]+=P*A)}return{intensity:S,unitArea:g*m}}},{key:"computePyramidRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,w=Ww.dayOfYear(t),x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,w,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.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 We.Vector3).subVectors(w,y),S=(new We.Vector3).subVectors(T,y),H=(new We.Vector3).subVectors(T,w),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/m)),D=Math.max(2,Math.round(z/m)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(W),P.normalize();var M=R*S.dot(P)/j;S.normalize(),H.normalize();var I=(new We.Vector3).crossVectors(S,H).normalize(),C=P.multiplyScalar(.5*j/R),F=(new We.Vector3).crossVectors(I,P).normalize().multiplyScalar(.5*z/D),k=new We.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+Hy+(r?o.thickness:0));k.add(C).add(F),C.multiplyScalar(2),F.multiplyScalar(2),A.push(C.length()*F.length());var O=new We.Vector3,Y=[],L=.01;Y.push({x:-.01,y:-.01}),Y.push({x:R+L,y:-.01}),Y.push({x:M,y:D+L});for(var N=ky(l.ground,t.getMonth(),I,v),U=I.dot(a),E=0;ESy||X<0)&&(W[E][J]+=N),U>0&&X<0&&(W[E][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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],y=o.id+"-"+n,m=f[0].clone().applyEuler(x),T=f[1].clone().applyEuler(x),P=f[2].clone().applyEuler(x),S=(new We.Vector3).subVectors(T,m),H=(new We.Vector3).subVectors(P,m),j=(new We.Vector3).subVectors(P,T),z=S.length(),R=(new We.Vector3).crossVectors(H,j).length()/z,D=Math.max(2,Math.round(z/w)),W=Math.max(2,Math.round(R/w)),M=Array(D).fill(0).map((function(){return Array(W).fill(0)}));b.push(M),S.normalize();var I=D*H.dot(S)/z;H.normalize(),j.normalize();var C=(new We.Vector3).crossVectors(H,j).normalize(),F=S.multiplyScalar(.5*z/D),k=(new We.Vector3).crossVectors(C,S).normalize().multiplyScalar(.5*R/W),O=new We.Vector3,Y=new We.Vector3(c.cx+m.x,c.cy+m.y,c.lz+m.z+Hy+(r?o.thickness:0));Y.add(F).add(k),F.multiplyScalar(2),k.multiplyScalar(2),A.push(F.length()*k.length());var L,N=ky(l.ground,t.getMonth(),C,v),U=C.dot(a),E=[],V=Object(h.a)(f);try{for(V.s();!(L=V.n()).done;){var J=L.value;E.push({x:J.x,y:J.y})}}catch(ae){V.e(ae)}finally{V.f()}if(n%2===0)for(var G=0;GSy||q<0)&&(M[G][B]+=N),U>0&&q<0&&(M[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:W+Z});for(var _=0;_Sy||le<0)&&(M[_][ee]+=N),U>0&&le<0&&(M[_][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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.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 We.Vector3).subVectors(m,y),S=(new We.Vector3).subVectors(T,y),H=(new We.Vector3).subVectors(T,m),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/w)),D=Math.max(2,Math.round(z/w)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(W),P.normalize(),S.normalize(),H.normalize();var M=(new We.Vector3).crossVectors(S,H).normalize(),I=P.multiplyScalar(.5*j/R),C=(new We.Vector3).crossVectors(M,P).normalize().multiplyScalar(.5*z/D),F=new We.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+Hy+(r?o.thickness:0));F.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),A.push(I.length()*C.length());for(var k=new We.Vector3,O=ky(l.ground,t.getMonth(),M,v),Y=M.dot(a),L=0;LSy||E<0)&&(W[L][U]+=O),Y>0&&E<0&&(W[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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.a)(n.entries());try{for(T.s();!(g=T.n()).done;){var P=Object(u.a)(g.value,2),S=P[0],H=P[1],j=o.id+"-"+S;S===n.length-1?function(){var i,n=Number.MAX_VALUE,u=Number.MAX_VALUE,f=-Number.MAX_VALUE,y=-Number.MAX_VALUE,g=Object(h.a)(H);try{for(g.s();!(i=g.n()).done;){var m=i.value.clone().applyEuler(x);m.x>f&&(f=m.x),m.xy&&(y=m.y),m.ySy||O<0)&&(D[F][k]+=I),C>0&&O<0&&(D[F][k]+=C*v)}}}():function(){var i=H[0].clone().applyEuler(x),n=H[1].clone().applyEuler(x),u=H[2].clone().applyEuler(x),f=(new We.Vector3).subVectors(n,i),h=(new We.Vector3).subVectors(u,i),y=(new We.Vector3).subVectors(u,n),g=f.length(),m=(new We.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 We.Vector3).crossVectors(h,y).normalize(),R=f.multiplyScalar(.5*g/T),D=(new We.Vector3).crossVectors(z,f).normalize().multiplyScalar(.5*m/P),W=new We.Vector3(c.cx+i.x,c.cy+i.y,c.lz+i.z+Hy+(r?o.thickness:0));W.add(R).add(D),R.multiplyScalar(2),D.multiplyScalar(2),A.push(R.length()*D.length());for(var M=new We.Vector3,I=ky(l.ground,t.getMonth(),z,v),C=z.dot(a),F=0;FSy||Y<0)&&(S[F][O]+=I),C>0&&Y<0&&(S[F][O]+=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 f,p,y=Ww.dayOfYear(t),g=null!==(f=l.solarRadiationHeatmapGridCellSize)&&void 0!==f?f:.5,m=new We.Euler(0,0,n.rotation[2],"ZYX"),w=Fy(a,y,d,py.SPHERE_MODEL),x=[],v=[],b=Number.MAX_VALUE,A=Number.MAX_VALUE,T=-Number.MAX_VALUE,P=-Number.MAX_VALUE,S=Object(h.a)(r);try{for(S.s();!(p=S.n()).done;){var H,j=p.value,z=Object(h.a)(j);try{for(z.s();!(H=z.n()).done;){var R=H.value.clone().applyEuler(m);R.x>T&&(T=R.x),R.xP&&(P=R.y),R.ySy||E<0)&&(C[N][U]+=Y),L>0&&E<0&&(C[N][U]+=L*w)}}return{segmentIntensities:x,segmentUnitArea:v}}},{key:"computeGableRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,f){var p,y,g=Ww.dayOfYear(t),m=null!==(p=l.solarRadiationHeatmapGridCellSize)&&void 0!==p?p:.5,w=new We.Euler(0,0,n.rotation[2],"ZYX"),x=Fy(a,g,d,py.SPHERE_MODEL),v=[],b=[],A=Object(h.a)(r.entries());try{var T=function(){var r=Object(u.a)(y.value,2),d=r[0],h=r[1],p=o.id+"-"+d,g=h[0].clone().applyEuler(w),A=h[1].clone().applyEuler(w),T=h[2].clone().applyEuler(w),P=(new We.Vector3).subVectors(A,g),S=(new We.Vector3).subVectors(T,g),H=(new We.Vector3).subVectors(T,A),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/m)),D=Math.max(2,Math.round(z/m)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));v.push(W),P.normalize(),S.normalize(),H.normalize();var M=(new We.Vector3).crossVectors(S,H).normalize(),I=P.multiplyScalar(.5*j/R),C=(new We.Vector3).crossVectors(M,P).normalize().multiplyScalar(.5*z/D),F=new We.Vector3(n.cx+g.x,n.cy+g.y,n.lz+g.z+Hy+(i?o.thickness:0));F.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),b.push(I.length()*C.length());for(var k=new We.Vector3,O=ky(l.ground,t.getMonth(),M,x),Y=M.dot(a),L=0;LSy||E<0)&&(W[L][U]+=O),Y>0&&E<0&&(W[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(h.a)(t);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Zm.getAbsoluteWindowVerticesOnRoof(r,a),c=Ww.getPoints(n);if(Ww.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(h.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value,f=Zm.getAbsoluteSolarPanelVerticesOnRoof(u,a),p=Ww.getPoints(f);if(Ww.isPointInside(e.x,e.y,p))return!1}}catch(y){d.e(y)}finally{d.f()}}return!0}}]),e}(),bO=function(e){var t,l,a,o,i=e.city,n=Xw(si),c=bf(hf),s=Xw(Is),d=Xw(_r),p=Xw($r),y=Xw(tn),g=Xw(Ni),m=Af(xi),w=Af(Ri),x=Af(zi),v=Af(Ti),b=Af(Si),A=Af(ji),T=Xw(Vi),P=Xw(Gi),S=bf(Ir),H=bf(Cr),j=bf(Fr),z=bf(kr),R=Xw.getState().world,D=Xw.getState().elements,W=!!R.noAnimationForThermalSimulation,M=null!==(t=R.highestTemperatureTimeInMinutes)&&void 0!==t?t:900,I=Object(r.useRef)(0),C=Object(r.useRef)(!1),F=Object(r.useRef)(new Date(R.date)),k=Object(r.useRef)(0),O=Object(r.useRef)(!1),Y=Object(r.useRef)(new Date(R.date)),L=Object(r.useRef)(0),N=Object(r.useRef)({high:20,low:0}),E=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 We.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.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(h.a)(D);try{for(t.s();!(e=t.n()).done;){var l,a,o,i=e.value;if(Ww.onBuildingEnvelope(i))null===(l=G.current.get(i.id))||void 0===l||l.fill(0);if(i.type===V.Roof){var r,n=Object(h.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(!W||Ww.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=F.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),O.current=!1};ge()}}),[S]),Object(r.useEffect)((function(){O.current=H,H?(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())}),[H]);var ge=function(){ze()},we=function(){O.current?(le.setTime(Y.current.getTime()),O.current=!1):(F.current=new Date(R.date),L.current=Ww.dayOfYear(le),le.setHours(0,re/2)),C.current=!1,pe(),ye()},xe=function(){var e,t=Object(h.a)(D);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(Ww.onBuildingEnvelope(l)||l.type===V.SolarPanel){var a=G.current.get(l.id);a&&v(l.id,Object(f.a)(a));var o=$.current.get(l.id);o&&m(l.id,o.map((function(e){return Object(f.a)(e)})))}if(l.type===V.Roof){var i,r=Object(h.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(f.a)(s));var d=$.current.get(c);d&&m(c,d.map((function(e){return Object(f.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(f.a)(u)),(u=B.current.get(l.id))&&A(l.id,Object(f.a)(u))}}}catch(p){t.e(p)}finally{t.f()}bf.setState((function(e){e.flagOfDailySimulation=!e.flagOfDailySimulation,e.runYearlyThermalSimulation||(e.showSolarRadiationHeatmap=!0,e.showHeatFluxes=!0)})),P&&!j&&setTimeout((function(){n((function(e){var t=Af.getState().totalBuildingHeater,l=Af.getState().totalBuildingAc,a=Af.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&&!O.current){if(le.getMinutes()+60*le.getHours()+(Ww.dayOfYear(le)-L.current)*by+re>by)return ze(),cancelAnimationFrame(I.current),n((function(e){e.world.date=F.current.toLocaleString("en-US"),e.viewState.showDailyBuildingEnergyPanel=!0,e.selectedFloatingWindow="dailyBuildingEnergyPanel"})),bf.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(j){if(!W||Ww.hasMovingParts(D))return He(),Pe(le.getMonth()),fe(),I.current=requestAnimationFrame(je),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=F.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),O.current=!1};setTimeout((function(){}),50)}}),[j]),Object(r.useEffect)((function(){O.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),je())}),[z]);var He=function(){O.current?(le.setTime(Y.current.getTime()),O.current=!1):(F.current=new Date(R.date),k.current=0,le.setMonth(0,22),L.current=Ww.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},je=function e(){if(j&&!O.current)if(le.getMinutes()+60*le.getHours()+(Ww.dayOfYear(le)-L.current)*byAt?te.sunshineHours[le.getMonth()]/(30*e*ie):0,Q.current=Cy(1,Wy(le),Ry(le),Ww.toRadians(R.latitude)).normalize();var t,l=Object(h.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),Me(a);break;case V.Wall:Ce(a);break;case V.Roof:var o=a;Oe(o),Fe(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=vO.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))}(E.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=vO.computeRoofWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),n=0;n0){for(var s=vO.computeWallWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),u=0;u0){for(var h=vO.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=vO.computeWallSolarRadiationEnergy(le,R,Q.current,e,t,m,w,A,b?0:1,ae,ue),P=0;P0){var I,C=Object(h.a)(m);try{for(C.s();!(I=C.n()).done;){var F=I.value;g-=Ww.getWindowArea(F,e)}}catch(X){C.e(X)}finally{C.f()}}if(w&&w.length>0){var k,O=Object(h.a)(w);try{for(O.s();!(k=O.n()).done;){var Y=k.value;g-=Y.lx*Y.lz*e.lx*e.lz}}catch(X){O.e(X)}finally{O.f()}}var L=Ww.isZero(v)||Ww.isZero(x)?0:v*x/((null!==(r=e.volumetricHeatCapacity)&&void 0!==r?r:.5)*g*e.ly),N=(E.current+L-i)*g/(null!==(n=e.rValue)&&void 0!==n?n:2)*.001/ie;c&&e.openToOutside&&(N+=(E.current-i)*(p-g)*50*.001/ie),he(e.id,N)}else if(e.openToOutside){var U=Ww.getWallVertices(e,0),J=Ww.getPolygonArea(U),G=E.current-i;he(e.id,G*J*50*.001/ie)}}},Fe=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=Ww.calculateBuildingArea(e),n=J.current-i;he(o.id,n*r/(null!==(a=o.rValue)&&void 0!==a?a:2)*.001/ie)}},ke=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)},Oe=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=Ne(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(h.a)(a.entries());try{for(s.s();!(r=s.n()).done;){var f,p=Object(u.a)(r.value,2),y=p[0],g=p[1],m=(g.surfaceTemperature-(e.ceiling?ke(e,g.surfaceTemperature,n):n))*g.totalArea/(null!==(f=e.rValue)&&void 0!==f?f: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(h.a)(t);try{for(n.s();!(o=n.n()).done;){var c,s=o.value,d=Object(h.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(h.a)(t);try{for(b.s();!(w=b.n()).done;){var A,T=w.value,P=[],H=Object(h.a)(T);try{for(H.s();!(A=H.n()).done;){var j=A.value;P.push(Ww.mapVector3ToPoint2(j))}}catch(me){H.e(me)}finally{H.f()}v+=Ww.getPolygonArea(P)}}catch(me){b.e(me)}finally{b.f()}if(g.length>0){var z,D=Object(h.a)(g);try{for(D.s();!(z=D.n()).done;){var W=z.value;v-=W.lx*W.lz}}catch(me){D.e(me)}finally{D.f()}v<0&&(v=0)}m.push(v)}else{var M,I=Object(h.a)(t);try{for(I.s();!(M=I.n()).done;){var C=M.value,F=Ww.getTriangleArea(C[0],C[1],C[2]);if(g.length>0){var k,O=Object(h.a)(g);try{for(O.s();!(k=O.n()).done;){var Y=k.value;Zm.onSegment(C,Y.cx,Y.cy)&&(F-=Y.lx*Y.lz)}}catch(me){O.e(me)}finally{O.f()}F<0&&(F=0)}m.push(F)}}catch(me){I.e(me)}finally{I.f()}}var L=RT(e),N=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var U=y(V.SolarPanel,e.id),J=vO.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(h.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=0;if(3===b.length?A=Ww.getTriangleArea(b[0],b[1],b[2]):4===b.length&&(A=Ww.getTriangleArea(b[0],b[1],b[2])+Ww.getTriangleArea(b[2],b[3],b[0])),w.length>0){var T,P=Object(h.a)(w);try{for(P.s();!(T=P.n()).done;){var H=T.value;Zm.onSegment(b,H.cx,H.cy)&&(A-=H.lx*H.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 j=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=RT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var W=y(V.SolarPanel,e.id),M=vO.computeHipRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,W,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(h.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=Ww.getTriangleArea(b[0],b[1],b[2])+Ww.getTriangleArea(b[2],b[3],b[0]);if(w.length>0){var T,P=Object(h.a)(w);try{for(P.s();!(T=P.n()).done;){var H=T.value;Zm.onSegment(b,H.cx,H.cy)&&(A-=H.lx*H.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 j=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=RT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var W=y(V.SolarPanel,e.id),M=vO.computeGambrelRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,W,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(h.a)(m);try{for(T.s();!(A=T.n()).done;){var P=A.value;Zm.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 H,j=t[a-1],z=new Array,D=Object(h.a)(j);try{for(D.s();!(H=D.n()).done;){var W=H.value;z.push({x:W.x,y:W.y})}}catch(pe){D.e(pe)}finally{D.f()}var M=Ww.getPolygonArea(z);if(m.length>0){for(var I=m.length-1;I>=0;I--){var C=m[I];Zm.onSegment(j,C.cx,C.cy)&&(M-=C.lx*C.lz,m.splice(I,1))}M<0&&(M=0)}g.push(M);var F=i?[g.reduce((function(e,t){return e+t}),0)]:g,k=RT(e),O=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var Y=y(V.SolarPanel,e.id),L=vO.computeMansardRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,m,Y,ae,ue),N=0;N0){var d,u=Object(h.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;Zm.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=RT(e),m=Array(a).fill(0);if(Q.current&&Q.current.z>0){for(var w=y(V.SolarPanel,e.id),v=vO.computeGableRoofSolarRadiationEnergy(le,R,Q.current,e,!0,t,l,i,w,ae,ue),b=0;b0&&(f(),j(),bf.setState((function(e){e.runStaticSimulation=!1,e.simulationInProgress=!1,e.showSolarRadiationHeatmap=!0})),Kh(me.t("message.SimulationCompleted",m)))}),[p]);var H=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},j=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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,P.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(h.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:W(l);break;case V.Wall:M(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:k(o);break;case It.Mansard:F(o);break;case It.Hip:O(o)}}}}catch(r){t.e(r)}finally{t.f()}},z=function(e){var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Ww.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 j=Ww.getWorldDataById(e.id);A=j.pos.x,P=j.pos.y,S=j.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)})),W=Array(f).fill(0).map((function(){return Array(h).fill(0)})),M=Array(f).fill(0).map((function(){return Array(h).fill(0)})),I=Rt,C=zt.clone().applyAxisAngle(Rt,e.rotation[2]),F=jt.clone().applyAxisAngle(Rt,e.rotation[2]),k=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),O=St.clone().applyAxisAngle(Rt,e.rotation[2]),Y=new We.Vector3,L=0,U=new We.Vector2(A,P),E=new We.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 _=Fy(Z,i,v,py.SPHERE_MODEL),$=ky(o.ground,l,I,_),ee=I.dot(Z),te=A-r/2,le=P-n/2,ae=S+s/2,oe=0;oe0&&(E.set(te+(oe+.5)*p,le+(ie+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,ae),H(e.id,Y,Z)||(z[oe][ie]+=ee*_));te=A-r/2,le=S-s/2,$=ky(o.ground,l,C,_),ee=C.dot(Z);for(var re=0;re0&&(E.set(te+(re+.5)*p,J),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(ne+.5)*g),H(e.id,Y,Z)||(R[re][ne]+=ee*_));$=ky(o.ground,l,F,_),ee=F.dot(Z);for(var ce=0;ce0&&(E.set(te+(ce+.5)*p,G),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(h-(se+.5))*g),H(e.id,Y,Z)||(D[ce][se]+=ee*_));te=P-n/2,le=S-s/2,$=ky(o.ground,l,k,_),ee=k.dot(Z);for(var de=0;de0&&(E.set(X,te+(de+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(ue+.5)*g),H(e.id,Y,Z)||(W[de][ue]+=ee*_));$=ky(o.ground,l,O,_),ee=O.dot(Z);for(var fe=0;fe0&&(E.set(B,te+(fe+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(he+.5)*g),H(e.id,Y,Z)||(M[fe][he]+=ee*_))}}W=Ww.transpose(W),M=Ww.transpose(M);var pe=L*b/60,ye=pe>At?w.sunshineHours[l]/(30*pe*o.timesPerHour):0;N(z,ye),N(R,ye),N(D,ye),N(W,ye),N(M,ye),d(e.id+"-top",z),d(e.id+"-south",R),d(e.id+"-north",D),d(e.id+"-west",W),d(e.id+"-east",M)},R=function(e){for(var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Ww.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 We.Vector2(e.cx,e.cy),m=new We.Vector3,A=Array(s).fill(0).map((function(){return Array(u).fill(0)})),P=0,S=0;S<24;S++)for(var j=0;j0){P++;for(var D=Fy(R,i,v,py.SPHERE_MODEL),W=ky(o.ground,l,Rt,D),M=Rt.dot(R),I=new We.Vector2,C=0;C0&&(I.set(p+(C+.5)*f,y+(F+.5)*h),I.rotateAround(g,e.rotation[2]),m.set(I.x,I.y,c),H(e.id,m,R)||(A[C][F]+=M*D))}}var k=P*b/60,O=k>At?w.sunshineHours[l]/(30*k*o.timesPerHour):0;N(A,O),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=Ww.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 We.Vector3(0,0,p),m=s*s,A=0,P=0;P<24;P++)for(var S=0;S0){A++;for(var R=Fy(z,c,v,py.SPHERE_MODEL),D=ky(o.ground,r,Rt,R),W=Rt.dot(z),M=0;Mm||(y[M][I]+=D,W>0&&(H(e.id+"-sut",g,z)||(y[M][I]+=W*R)))}}}var C=A*b/60,F=C>At?w.sunshineHours[r]/(30*C*o.timesPerHour):0;N(y,F),d(e.id+"-sut",y)}},W=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?Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t,s(e),e.lz):Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t),r=(new We.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,Ww.isZero(e.rotation[0])?i.z+=e.poleHeight:(f=e.rotation[0],u=n,h=!1)),a&&!Ww.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 We.Euler(l&&!h?0:f,0,u,"ZYX");r.applyEuler(A);var P=x.getFullYear(),S=x.getMonth(),j=x.getDate(),z=Ww.dayOfYear(x),R=e.lx,D=e.ly,W=Math.max(2,Math.round(e.lx/T)),M=Math.max(2,Math.round(e.ly/T)),I=R/W,C=D/M,F=i.x-(R-T)/2,k=i.y-(D-T)/2,O=l||a?i.z:t.lz+e.poleHeight+e.lz,Y=new We.Vector2(i.x,i.y),L=new We.Vector3,U=Array(W).fill(0).map((function(){return Array(M).fill(0)})),E=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){E++;for(var K=Fy(B,z,v,py.SPHERE_MODEL),q=ky(o.ground,S,r,K),Q=r.dot(B),Z=new We.Vector2,_=new We.Vector3,$=0;$0&&(Z.set(F+$*I,k+ee*C),_.set(Z.x-Y.x,Z.y-Y.y,0),_.applyEuler(A),L.set(i.x+_.x,i.y+_.y,O+_.z),H(e.id,L,B)||(U[$][ee]+=Q*K))}}var le=E*b/60,ae=le>At?w.sunshineHours[S]/(30*le*o.timesPerHour):0;N(U,ae),d(e.id,U)},M=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=Ww.dayOfYear(x),n=e.lx,c=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(e.cx,e.cy,c/2),t).setZ(c/2+t.lz),m=new We.Vector3(Math.cos(y-vt),Math.sin(y-vt),0),A=new We.Vector3,P=Array(u).fill(0).map((function(){return Array(f).fill(0)})),S=0,j=h*Math.cos(y),z=h*Math.sin(y),R=Ww.getWallVertices(e,2),D=(c-e.lz)/2,W=0;W<24;W++)for(var M=0;M0){S++;for(var F=Fy(C,r,v,py.SPHERE_MODEL),k=ky(o.ground,a,m,F),O=m.dot(C),Y=0;Y0&&(A.set(g.x+U*j,g.y+U*z,g.z+E*p),H(e.id,A,C)||(P[Y][L]+=O*F)))}}}var V=S*b/60,J=V>At?w.sunshineHours[a]/(30*V*o.timesPerHour):0;N(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=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(a.cx,a.cy,a.cz),t).setZ(a.lz/2+t.lz).clone().add(new We.Vector3(e.cx*a.lx,0,e.cz*a.lz)),S=new We.Vector3(Math.cos(A-vt),Math.sin(A-vt),0),j=new We.Vector3,z=Array(p).fill(0).map((function(){return Array(y).fill(0)})),R=0,D=g*Math.cos(A),W=g*Math.sin(A),M=0;M<24;M++)for(var I=0;I0){R++;var k=Fy(F,u,v,py.SPHERE_MODEL),O=ky(o.ground,r,S,k),Y=S.dot(F);if(e.doorType===Gy.Arched)for(var L=0;L0&&(H(e.id,j,F)||(z[L][U]+=Y*k)))}else for(var J=0;J0&&(j.set(P.x+X*D,P.y+X*W,P.z+B*m),H(e.id,j,F)||(z[J][G]+=Y*k))}}}var K=R*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;N(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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(r,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;N(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},F=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);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(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.a)(l.entries());try{for(R.s();!(m=R.n()).done;){var D=Object(u.a)(m.value,2),W=D[0],M=D[1],I=e.id+"-"+W;W===l.length-1?function(){var e,l=Number.MAX_VALUE,a=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(h.a)(M);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 O=Fy(k,j,v,py.SPHERE_MODEL),Y=ky(o.ground,P,Rt,O),L=Rt.dot(k),U=0;U0&&(R.y=m.y+E*y,H(I,R,k)||(g[U][E]+=L*O))}}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;N(g,J),d(I,g)}():function(){var e=M[0].clone().applyEuler(z),l=M[1].clone().applyEuler(z),a=M[2].clone().applyEuler(z),i=(new We.Vector3).subVectors(l,e),r=(new We.Vector3).subVectors(a,e),n=(new We.Vector3).subVectors(a,l),c=i.length(),s=(new We.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 We.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*c/u),g=(new We.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*s/f),m=new We.Vector3(t.cx+e.x,t.cy+e.y,t.lz+e.z+Hy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var x=0,R=new We.Vector3,D=0;D<24;D++)for(var W=0;W0){x++;for(var k=Fy(F,j,v,py.SPHERE_MODEL),O=ky(o.ground,P,p,k),Y=p.dot(F),L=0;L0&&(R.copy(m).add(U).add(g.clone().multiplyScalar(E)),H(I,R,F)||(h[L][E]+=Y*k))}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;N(h,J),d(I,h)}()}}catch(C){R.e(C)}finally{R.f()}}}},k=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(r,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;N(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},O=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=0,F=new We.Vector3,k=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);if(k.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2),a%2===0)for(var O=0;O<24;O++)for(var Y=0;Y0){C++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(F.copy(k).add(X).add(I.clone().multiplyScalar(B)),H(r,F,U)||(D[G][B]+=J*E))}}else for(var K=0;K<24;K++)for(var q=0;q0){C++;for(var _=Fy(Z,j,v,py.SPHERE_MODEL),$=ky(o.ground,P,W,_),ee=W.dot(Z),te=0;te0&&(F.copy(k).add(le).add(I.clone().multiplyScalar(ae)),H(r,F,Z)||(D[te][ae]+=ee*_))}}var oe=C*b/60,ie=oe>At?w.sunshineHours[P]/(30*oe*o.timesPerHour):0;N(D,ie),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},Y=function(e,t,l){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Ww.dayOfYear(x),s=new We.Euler(0,0,t.rotation[2],"ZYX"),u=l[0][0].z,f=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(h.a)(l);try{for(m.s();!(a=m.n()).done;){var A,P=a.value,S=Object(h.a)(P);try{for(S.s();!(A=S.n()).done;){var j=A.value.clone().applyEuler(s);j.x>y&&(y=j.x),j.xg&&(g=j.y),j.y0){C++;for(var U=Fy(L,c,v,py.SPHERE_MODEL),E=ky(o.ground,r,Rt,U),V=Rt.dot(L),J=0;J0&&(F.y=I.y+G*W,H(e.id,F,L)||(M[J][G]+=V*U))}}}var X=C*b/60,B=X>At?w.sunshineHours[r]/(30*X*o.timesPerHour):0;N(M,B),d(e.id,M)},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=Ww.dayOfYear(x),f=new We.Euler(0,0,t.rotation[2],"ZYX"),p=Object(h.a)(l.entries());try{var g=function(){var l=Object(u.a)(a.value,2),s=l[0],h=l[1],p=e.id+"-"+s,y=h[0].clone().applyEuler(f),g=h[1].clone().applyEuler(f),m=h[2].clone().applyEuler(f),x=(new We.Vector3).subVectors(g,y),A=(new We.Vector3).subVectors(m,y),P=(new We.Vector3).subVectors(m,g),S=x.length(),j=(new We.Vector3).crossVectors(A,P).length()/S,z=Math.max(2,Math.round(S/T)),R=Math.max(2,Math.round(j/T)),D=Array(z).fill(0).map((function(){return Array(R).fill(0)}));x.normalize(),A.normalize(),P.normalize();var W=(new We.Vector3).crossVectors(A,P).normalize(),M=x.multiplyScalar(.5*S/z),I=(new We.Vector3).crossVectors(W,x).normalize().multiplyScalar(.5*j/R),C=new We.Vector3(t.cx+y.x,t.cy+y.y,t.lz+y.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,c,v,py.SPHERE_MODEL),V=ky(o.ground,r,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(p,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;N(D,q),d(p,D)};for(p.s();!(a=p.n()).done;)g()}catch(m){p.e(m)}finally{p.f()}}},N=function(e,t){for(var l=0;l=Y.sunset)return cancelAnimationFrame(M.current),bf.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(h.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=F.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(h.a)(u);try{for(x.s();!(p=x.n()).done;){var v,A=p.value,T=Object(h.a)(A);try{for(T.s();!(v=T.n()).done;){var H=v.value;if(Math.abs(H.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 j=F.current.get(d.id);if(j){for(var z=0;z1){W.current.length=0,z.set(t,l);var a=D.current.filter((function(t){return t.uuid!==e}));return z.intersectObjects(a,!1,W.current),W.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,D.current)}}catch(i){a.e(i)}finally{a.f()}}},X=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=Ww.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=F.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)})),F.current.set(e.id+"-top",h));var y=F.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)})),F.current.set(e.id+"-south",y));var g=F.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)})),F.current.set(e.id+"-north",g));var m=F.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)})),F.current.set(e.id+"-west",m));var w=F.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)})),F.current.set(e.id+"-east",w));var x=Rt,v=zt.clone().applyAxisAngle(Rt,e.rotation[2]),b=jt.clone().applyAxisAngle(Rt,e.rotation[2]),A=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),T=St.clone().applyAxisAngle(Rt,e.rotation[2]),P=p(e),j=e.cx,z=e.cy,D=e.cz;if(P&&P.type===V.Cuboid){var W=Ww.getWorldDataById(e.id);j=W.pos.x,z=W.pos.y,D=W.pos.z}for(var M=new We.Vector3,I=new We.Vector2(j,z),C=new We.Vector2,k=z-o/2,O=z+o/2,Y=j-a/2,L=j+a/2,N=Fy(t,l,H,py.SPHERE_MODEL),U=ky(c.ground,S.getMonth(),x,N),J=x.dot(t),G=j-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]),M.set(C.x,C.y,B),E(e.id,M,t)||(h[K][q]+=J*N));G=j-a/2,X=D-i/2,U=ky(c.ground,S.getMonth(),v,N),J=v.dot(t);for(var Q=0;Q0&&(C.set(G+(Q+.5)*d,k),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(Z+.5)*f),E(e.id,M,t)||(y[Q][Z]+=J*N));U=ky(c.ground,S.getMonth(),b,N),J=b.dot(t);for(var _=0;_0&&(C.set(G+(_+.5)*d,O),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(s-($+.5))*f),E(e.id,M,t)||(g[_][$]+=J*N));G=z-o/2,X=D-i/2,U=ky(c.ground,S.getMonth(),A,N),J=A.dot(t);for(var ee=0;ee0&&(C.set(Y,G+(ee+.5)*u),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(te+.5)*f),E(e.id,M,t)||(m[ee][te]+=J*N));U=ky(c.ground,S.getMonth(),T,N),J=T.dot(t);for(var le=0;le0&&(C.set(L,G+(le+.5)*u),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(ae+.5)*f),E(e.id,M,t)||(w[le][ae]+=J*N))}},B=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=Ww.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 We.Vector2(e.cx,e.cy),p=new We.Vector3,y=F.current.get(e.id);y&&y.length===r&&y[0].length===n||(y=Array(r).fill(0).map((function(){return Array(n).fill(0)})),F.current.set(e.id,y));for(var g=Fy(t,l,H,py.SPHERE_MODEL),m=ky(c.ground,S.getMonth(),Rt,g),w=Rt.dot(t),x=new We.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),E(e.id,p,t)||(y[v][b]+=w*g))}},K=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=Ww.dayOfYear(S),o=e.lx,i=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(e.cx,e.cy,e.cz),l).setZ(i/2+l.lz),h=new We.Vector3(Math.cos(u-vt),Math.sin(u-vt),0),p=s*Math.cos(u),g=s*Math.sin(u),m=new We.Vector3,w=F.current.get(e.id);w&&w.length===r&&w[0].length===n||(w=Array(r).fill(0).map((function(){return Array(n).fill(0)})),F.current.set(e.id,w));for(var x=Ww.getWallVertices(e,1),v=(i-e.lz)/2,b=Fy(t,a,H,py.SPHERE_MODEL),A=ky(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),E(e.id,m,t)||(w[P][j]+=T*b)))}}},q=function(e){var t=Iy(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=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(i.cx,i.cy,i.cz),l).setZ(i.lz/2+l.lz).clone().add(new We.Vector3(e.cx*i.lx,0,e.cz*i.lz)),m=new We.Vector3(Math.cos(h-vt),Math.sin(h-vt),0),w=u*Math.cos(h),x=u*Math.sin(h),v=new We.Vector3,b=F.current.get(e.id);b&&b.length===s&&b[0].length===d||(b=Array(s).fill(0).map((function(){return Array(d).fill(0)})),F.current.set(e.id,b));var A=Fy(t,o,H,py.SPHERE_MODEL),T=ky(c.ground,S.getMonth(),m,A),P=m.dot(t);if(e.doorType===Gy.Arched)for(var j=0;j0&&(E(e.id,v,t)||(b[j][z]+=P*A)))}else for(var M=0;M0){var C=M-s/2+.5,k=I-d/2+.5;v.set(g.x+C*w,g.y+C*x,g.z+k*f),E(e.id,v,t)||(b[M][I]+=P*A)}}},Q=function(e,t,l,a){var o,i=a[0][0].z,r=Ww.dayOfYear(S),n=Fy(e,r,H,py.SPHERE_MODEL),s=new We.Euler(0,0,l.rotation[2],"ZYX"),d=Number.MAX_VALUE,u=Number.MAX_VALUE,f=-Number.MAX_VALUE,p=-Number.MAX_VALUE,y=Object(h.a)(a);try{for(y.s();!(o=y.n()).done;){var g,m=o.value,w=Object(h.a)(m);try{for(w.s();!(g=w.n()).done;){var x=g.value.clone().applyEuler(s);x.x>f&&(f=x.x),x.xp&&(p=x.y),x.y0&&(z.y=j.y+I*T,E(t.id,z,e)||(P[M][I]+=W*n))}},Z=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(r,z,t)||(A[M][C]+=W*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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(z){f.e(z)}finally{f.f()}}}catch(z){n.e(z)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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],j=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(h.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+H*y,E(j,v,t)||(g[T][H]+=A*x))}}():function(){var e=P[0].clone().applyEuler(w),a=P[1].clone().applyEuler(w),o=P[2].clone().applyEuler(w),i=(new We.Vector3).subVectors(a,e),r=(new We.Vector3).subVectors(o,e),n=(new We.Vector3).subVectors(o,a),s=i.length(),d=(new We.Vector3).crossVectors(r,n).length()/s,u=Math.max(2,Math.round(s/R)),f=Math.max(2,Math.round(d/R)),h=F.current.get(j);h&&h.length===u&&h[0].length===f||(h=Array(u).fill(0).map((function(){return Array(f).fill(0)})),F.current.set(j,h)),i.normalize(),r.normalize(),n.normalize();var p=(new We.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*s/u),g=(new We.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*d/f),m=new We.Vector3(l.cx+e.x,l.cy+e.y,l.lz+e.z+Hy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var v=new We.Vector3,b=ky(c.ground,S.getMonth(),p,x),A=p.dot(t),T=0;T0&&(v.copy(m).add(H).add(g.clone().multiplyScalar(z)),E(j,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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(r,z,t)||(A[M][C]+=W*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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3,z=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);z.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(j.copy(z).add(I).add(H.clone().multiplyScalar(C)),E(r,j,t)||(A[M][C]+=W*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=Iy(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=Ww.dayOfYear(S),r=new We.Euler(0,0,l.rotation[2],"ZYX"),n=Fy(t,i,H,py.SPHERE_MODEL),s=Object(h.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 We.Vector3).subVectors(h,f),g=(new We.Vector3).subVectors(p,f),m=(new We.Vector3).subVectors(p,h),w=y.length(),x=(new We.Vector3).crossVectors(g,m).length()/w,v=Math.max(2,Math.round(w/R)),b=Math.max(2,Math.round(x/R)),A=F.current.get(d);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(d,A)),y.normalize(),g.normalize(),m.normalize();var T=(new We.Vector3).crossVectors(g,m).normalize(),P=y.multiplyScalar(.5*w/v),H=(new We.Vector3).crossVectors(T,y).normalize().multiplyScalar(.5*x/b),j=new We.Vector3(l.cx+f.x,l.cy+f.y,l.lz+f.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,n),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(d,z,t)||(A[M][C]+=W*n))};for(s.s();!(o=s.n()).done;)d()}catch(f){s.e(f)}finally{s.f()}}}},ae=function(e){var t=Iy(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=Ww.dayOfYear(S),r=o?Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l,y(e),e.lz):Ww.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,Ww.isZero(e.rotation[0])?r.z+=e.poleHeight:(d=e.rotation[0],s=n,u=!1)),o&&!Ww.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 We.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,j=r.x-(x-R)/2,z=r.y-(v-R)/2,D=a||o?r.z:l.lz+e.poleHeight+e.lz,W=new We.Vector2(r.x,r.y),M=new We.Vector3,I=F.current.get(e.id);I&&I.length===b&&I[0].length===A||(I=Array(b).fill(0).map((function(){return Array(A).fill(0)})),F.current.set(e.id,I));var C=new We.Euler(a&&!u?0:d,0,s,"ZYX");if(e.trackerType!==te.NO_TRACKER){var k=n?t.clone().applyAxisAngle(Rt,-n):t.clone();switch(e.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var O=(new We.Quaternion).setFromUnitVectors(Rt,k);(C=(new We.Euler).setFromQuaternion(O)).z+=s;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var Y=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(k.x,0,k.z).normalize());(C=(new We.Euler).setFromQuaternion(Y)).z+=s;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:if(Math.abs(e.tiltAngle)>.001){var L=new We.Vector3(k.x,-k.y,0).normalize(),N=Math.acos(jt.dot(L))*Math.sign(L.x);C=new We.Euler(e.tiltAngle,0,N+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=Fy(t,i,H,py.SPHERE_MODEL),J=ky(c.ground,S.getMonth(),w,U),G=w.dot(t),X=new We.Vector2,B=new We.Vector3,K=0;K0&&(X.set(j+K*T,z+q*P),B.set(X.x-W.x,X.y-W.y,0),B.applyEuler(C),M.set(r.x+B.x,r.y+B.y,D+B.z),E(e.id,M,t)||(I[K][q]+=G*U))}},oe=function(e){var t=Iy(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=Ww.dayOfYear(S),o=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new We.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 We.Vector2(o.x,o.y),b=new We.Vector3,A=F.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),F.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,j=Ww.isZero(P),z=j?1:Math.cos(P),D=j?0:Math.sin(P),W=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),M=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(W.x*z,W.x*D,W.z).normalize()),I=(new We.Euler).setFromQuaternion(M);i.copy(r.clone().applyEuler(I));for(var C=Fy(t,a,H,py.SPHERE_MODEL),k=ky(c.ground,S.getMonth(),i,C),O=i.dot(t),Y=new We.Vector2,L=new We.Vector3,N=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;G0&&(Y.set(N,w+X*g),j||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),E(e.id,b,t)||(A[G][X]+=O*C*V))}}},ie=function(e){var t=Iy(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=Ww.dayOfYear(S),o=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new We.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 We.Vector2(o.x,o.y),b=new We.Vector3,A=F.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),F.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,j=Ww.isZero(P),z=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),D=(new We.Quaternion).setFromUnitVectors(Rt,z),W=(new We.Euler).setFromQuaternion(D);i.copy(r.clone().applyEuler(W));for(var M=Fy(t,a,H,py.SPHERE_MODEL),I=ky(c.ground,S.getMonth(),i,M),C=i.dot(t),k=new We.Vector2,O=new We.Vector3,Y=0,L=0,N=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&&(k.set(Y,L),j||k.rotateAround(v,P),O.set(k.x-v.x,k.y-v.y,0),O.applyEuler(W),b.set(o.x+O.x,o.y+O.y,x+O.z),E(e.id,b,t)||(V=1/Math.sqrt(1+(N*N+U*U)*J),A[G][X]+=C*M*V)))}},re=function(e){var t,l=Iy(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),E(e.id,P,l)||E(e.id,P,D)||(j[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),E(e.id,P,l)||(j[_][$]+=X*U))}}}}},ne=function(e){var t,l=Iy(S,c.latitude);if(!(l.z0&&(L.set(U,b+X*w),N.set(L.x-T.x,L.y-T.y,0),N.applyEuler(D),P.set(n.x+N.x,n.y+N.y,A+N.z),E(e.id,P,l)||E(e.id,P,z)||(j[J][X]+=Y*k))}else for(var B=0;B0&&(L.set(U,b+K*w),N.set(L.x-T.x,L.y-T.y,0),N.applyEuler(D),P.set(n.x+N.x,n.y+N.y,A+N.z),E(e.id,P,l)||(j[B][K]+=Y*k))}}}}},ce=function(e){var t=e.solarUpdraftTower;if(t){var l=Iy(S,c.latitude);if(!(l.z<=0)){var a=Ww.dayOfYear(S),o=(new We.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=F.current.get(u);f&&f.length===r&&f[0].length===r||(f=Array(r).fill(0).map((function(){return Array(r).fill(0)})),F.current.set(u,f));for(var h,p,y=Fy(l,a,H,py.SPHERE_MODEL),g=ky(c.ground,S.getMonth(),o,y),m=new We.Vector3(0,0,d),w=o.dot(l),x=i*i,v=0;vx||(f[v][b]+=g,w>0&&(E(u,m,l)||(f[v][b]+=w*y)))}}}};return Object(pf.jsx)(pf.Fragment,{})},HO=n.a.memo(SO),jO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(pd),x=Xw($n),v=Af(md),b=Xw(ec),A=Xw(hd),T=Xw(gd),P=Af(xd),S=bf(cd),H=bf(sd),j=bf(dd),z=bf(ud),R=Xw(o.showDailyParabolicTroughYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Ww.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",W)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=j,j?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),ae())}),[j]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,oe(),void(d&&c((function(e){var t=Af.getState().sumDailyParabolicTroughYield();e.actionInfo={name:"Daily Simulation for Parabolic Troughs Completed",result:{totalYield:t},details:Af.getState().dailyParabolicTroughYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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&&(M.set(x+O*h,v+Y*y),c||M.rotateAround(A,n),F.set(M.x-A.x,M.y-A.y,0),F.applyEuler(R),T.set(o.x+F.x,o.y+F.y,b+F.z),pe(e.id,T,t)||(k+=W*D));var L=K.current.get(e.id);if(L)L[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=k/(u*f)}}},ue=function(){var e=$.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},fe=function(){var e=ee.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-N[I.getMonth()])},pe=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(h.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(h.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===O?a.fill(0):q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},zO=n.a.memo(jO),RO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(du),x=Xw($n),v=Af(hu),b=Xw(ec),A=Xw(su),T=Xw(fu),P=Af(yu),S=bf(ou),H=bf(iu),j=bf(ru),z=bf(nu),R=Xw(o.showDailyParabolicDishYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Ww.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",W)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=j,j?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),ae())}),[j]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,oe(),void(d&&c((function(e){var t=Af.getState().sumDailyParabolicDishYield();e.actionInfo={name:"Daily Simulation for Parabolic Dishes Completed",result:{totalYield:t},details:Af.getState().dailyParabolicDishYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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+F*u,w+k*f),P||D.rotateAround(v,T),W.set(D.x-v.x,D.y-v.y,0),W.applyEuler(j),b.set(o.x+W.x,o.y+W.y,x+W.z),pe(e.id,b,t)||(M+=R*z));var O=K.current.get(e.id);if(O)O[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=M/(s*d)}}},ue=function(){var e=$.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},fe=function(){var e=ee.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-N[I.getMonth()])},pe=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(h.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(h.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===O?a.fill(0):q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},DO=n.a.memo(RO),WO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(Hd),x=Xw($n),v=Xw(Sd),b=Af(Rd),A=Xw(ec),T=Xw(zd),P=Af(Wd),S=bf(vd),H=bf(bd),j=bf(Ad),z=bf(Td),R=Xw(o.showDailyFresnelReflectorYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Ww.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",W)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=j,j?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),oe())}),[j]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),B.current=!0,ie(),void(d&&c((function(e){var t=Af.getState().sumDailyFresnelReflectorYield();e.actionInfo={name:"Daily Simulation for Fresnel Reflectors Completed",result:{totalYield:t},details:Af.getState().dailyFresnelReflectorYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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),N.set(L.x-P.x,L.y-P.y,0),N.applyEuler(r),S.set(s.x+N.x,s.y+N.y,T+N.z),ye(e.id,S,l)||ye(e.id,S,n)||(E+=Y*O))}var K=q.current.get(e.id);if(K)K[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=E/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(){var e=te.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):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-N[I.getMonth()])},ye=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(h.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(h.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===O?a.fill(0):Q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},MO=n.a.memo(WO),IO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(Yd),x=Xw($n),v=Xw(Od),b=Af(Ud),A=Xw(ec),T=Xw(Nd),P=Af(Vd),S=bf(Md),H=bf(Id),j=bf(Cd),z=bf(Fd),R=Xw(o.showDailyHeliostatYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Ww.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",W)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=j,j?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),oe())}),[j]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForHeliostats=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),B.current=!0,ie(),void(d&&c((function(e){var t=Af.getState().sumDailyHeliostatYield();e.actionInfo={name:"Daily Simulation for Heliostats Completed",result:{totalYield:t},details:Af.getState().dailyHeliostatYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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&&(M.set(O,A+L*v),F.set(M.x-P.x,M.y-P.y,0),F.applyEuler(n),S.set(s.x+F.x,s.y+F.y,T+F.z),ye(e.id,S,l)||ye(e.id,S,r)||(k+=W*D))}var N=q.current.get(e.id);if(N)N[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=k/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(){var e=te.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):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-N[I.getMonth()])},ye=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(h.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(h.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===O?a.fill(0):Q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},CO=n.a.memo(IO),FO=function(e){var t,l,a,n,c,s=e.city,d=Xw(si),f=bf(hf),p=Xw(Gi),y=Xw(Vi),g=Xw.getState().world,m=Xw.getState().elements,w=Xw(Is),x=Af(au),v=Af(Zd),b=Af(_d),A=Af(tu),T=bf(Jd),P=bf(Xd),S=bf(Gd),H=bf(Bd),j=Xw(o.showDailyUpdraftTowerYieldPanel),z=Xw(i.noAnimationForSolarUpdraftTowerSimulation),R=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,D=null!==(l=g.sutGridCellSize)&&void 0!==l?l:1,W=Object(Se.f)().scene,M=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),F=s?null===(a=w(s))||void 0===a?void 0:a.elevation:0,k=null!==(n=g.sutTimesPerHour)&&void 0!==n?n:4,O=60/k,Y=null!==(c=g.sutDaysPerYear)&&void 0!==c?c:6,L=12/Y,N=Object(r.useMemo)((function(){return new We.Raycaster}),[]),U=Object(r.useRef)([]),E=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 Dy(C,g.latitude)}),[g.date,g.latitude]),oe=Object(r.useRef)(ae),ie=Ww.daysInYear(C)/12;Object(r.useEffect)((function(){if(T){if(!z||Ww.hasMovingParts(m))return ne(),J.current=requestAnimationFrame(ce),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",M)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.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),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(f("simulationPaused",!1),ce())}),[P]);var re=function(){Te(),ge();var e,t=Object(h.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"})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,se(),p&&d((function(e){var t=Af.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Static Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.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),-O/2)),X.current=!1,Te(),ge()},ce=function e(){if(T&&!ee.current){if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*by+O>=ae.sunset)return cancelAnimationFrame(J.current),d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,se(),void(p&&d((function(e){var t=Af.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Dynamic Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}})));C.setHours(C.getHours(),C.getMinutes()+O),d((function(e){e.world.date=C.toLocaleString("en-US")}));var t,l=Object(h.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(h.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,f=Math.PI*o.solarUpdraftTower.chimneyRadius*o.solarUpdraftTower.chimneyRadius,p=Math.PI*o.solarUpdraftTower.collectorRadius*o.solarUpdraftTower.collectorRadius,y=1239.7*f,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*gy*f,P=new Date(g.date),S=void 0,H=void 0;s&&(S=w(s),H=MT(P,S.lowestTemperatures,S.highestTemperatures));for(var j=0;j0&&j>0&&v[j-1]>z){var W,M,I=(v[j-1]+z)/2,C=(null!==(W=g.airConvectiveCoefficient)&&void 0!==W?W:5)*p*(I-z),F=I+my,k=F*F*F*F,O=D*D*D*D,Y=(null!==(M=o.solarUpdraftTower.collectorEmissivity)&&void 0!==M?M:.95)*wy*p*(k-O);A[j]-=C+Y,A[j]<0&&(A[j]=0)}var L=A[j]/(y*D),N=D*(1+Math.cbrt(L*L/x))-my,U=N>z?Math.sqrt(x*((N+my)/D-1)):0;A[j]=T*U*U*U*.001,v[j]=N,b[j]=U}}}}}}catch(E){l.e(E)}finally{l.f()}de()},de=function(){var e,t=new Map,l=0,a=[],o=Object(h.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 f={};f.Hour=u;for(var p=1;p<=l;p++){var y,g="Tower"+p;f[a[p-1]]=null===(y=t.get(g))||void 0===y?void 0:y[u]}d.push(f)}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,H,j="Temperature Tower"+P;T["T_"+a[P-1]]=null===(S=t.get(j))||void 0===S?void 0:S[A],j="Wind Speed Tower"+P,T["V_"+a[P-1]]=null===(H=t.get(j))||void 0===H?void 0:H[A]}w.push(T)}v(w),x(a)};Object(r.useEffect)((function(){if(S){if(!z||Ww.hasMovingParts(m))return ue(),J.current=requestAnimationFrame(he),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",M)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};fe()}}),[S]),Object(r.useEffect)((function(){ee.current=H,H?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(f("simulationPaused",!1),he())}),[H]);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=Dy(C,g.latitude),C.setHours(Math.floor(oe.current.sunrise/60),-O/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=Dy(C,g.latitude),ge();var t,l=Object(h.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"})),bf.setState((function(e){e.runYearlySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,ye(),p&&d((function(e){var t=Af.getState().sumYearlyUpdraftTowerYield();e.actionInfo={name:"Static Yearly Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.getState().yearlyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},he=function e(){if(S&&!ee.current)if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*by+O0&&H>0&&r[H-1]>z){var W,M,I=(r[H-1]+z)/2,F=(null!==(W=g.airConvectiveCoefficient)&&void 0!==W?W:5)*v*(I-z),k=I+my,O=k*k*k*k,Y=D*D*D*D,L=(null!==(M=o.solarUpdraftTower.collectorEmissivity)&&void 0!==M?M:.95)*wy*v*(O-Y);i[H]-=F+L,i[H]<0&&(i[H]=0)}var N=i[H]/(b*D),U=D*(1+Math.cbrt(N*N/A))-my,E=U>z?Math.sqrt(A*((U+my)/D-1)):0;i[H]=T*E*E*E*.001,r[H]=U,n[H]=E}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()}j&&de()},ye=function(){var e,t=[],l=[],a=0,o=Object(h.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 f,p=Object(h.a)(t.entries());try{for(p.s();!(f=p.n()).done;){var y=Object(u.a)(f.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(h.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(h.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=Iy(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 We.Vector3).fromArray(e.normal),r=C.getFullYear(),n=C.getMonth(),c=C.getDate(),s=Ww.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 We.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=Fy(T,s,F,py.SPHERE_MODEL),S=ky(g.ground,n,Rt,P),H=i.dot(T);w=0;for(var j=0;jm||(w++,l[v]+=S,H>0&&(Pe(e.id+"-sut",y,T)||(l[v]+=H*P)))}}}w&&(l[v]/=w),l[v]*=x}}},be=function(){var e=ae.daylight()/60;return e>At?I.sunshineHours[C.getMonth()]/(30*e*k):0},Ae=function(){var e=C.getMonth(),t=oe.current.daylight()/60;return t>At?I.sunshineHours[e]/(30*t*k):0},Te=function(){var e=W.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,U.current)}}catch(i){a.e(i)}finally{a.f()}}},Pe=function(e,t,l){if(U.current.length>1){E.current.length=0,N.set(t,l);var a=U.current.filter((function(t){return t.uuid!==e}));return N.intersectObjects(a,!1,E.current),E.current.length>0}return!1};return Object(pf.jsx)(pf.Fragment,{})},kO=n.a.memo(FO),OO=function e(t,l){Object(je.a)(this,e),this.position=void 0,this.observer=void 0,this.position=t,this.observer=l},YO=function(){var e,t=Xw(Vi),l=Xw.getState().world,a=Xw.getState().elements,o=Xw(si),i=bf(hf),n=Xw($r),c=Xw(_r),s=bf(Vs),d=Object(Se.f)().scene,f={lng:t},p=Object(r.useMemo)((function(){return new We.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",f))),i("simulationInProgress",!1)}),[s]);var x=function(){if(Af.getState().clearSolarPanelVisibilityResults(),function(){g.current=[];var e,t=Object(h.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?Ww.absoluteHumanOrTreeCoordinates(o.cx,o.cy,o.cz,i):new We.Vector3(o.cx,o.cy,o.cz);r.z+=o.lz,g.current.push(new OO(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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,m.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(h.a)(g.current);try{for(t.s();!(e=t.n()).done;){var l,o=e.value,i=new Map,r=Object(h.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,f=Object(h.a)(a);try{for(f.s();!(u=f.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){f.e(b)}finally{f.f()}Af.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=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l);a&&(o.z=e.cz+l.cz+l.lz/2);var i=(new We.Vector3).fromArray(e.normal),r=l.rotation[2]+e.relativeAzimuth;Math.abs(e.tiltAngle)>.001&&i.applyEuler(new We.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 We.Vector2(o.x,o.y),P=0,S=new We.Vector3,H=new We.Vector3,j=new We.Vector2,z=Ww.isZero(r),R=0;R0&&(H.normalize(),b(e.id,S,H)&&(P+=Math.abs(H.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(h.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(pf.jsx)(pf.Fragment,{})},LO=n.a.memo(YO),NO=function(e){var t,l=e.city,a=Xw(si),n=bf(hf),c=Xw(Gi),s=Xw(Vi),d=Xw.getState().world,f=Xw.getState().elements,p=Xw($r),y=Xw(_r),g=Xw(Is),m=Xw(Fs),w=Xw(Os),x=Af(Su),v=Af(bu),b=Af(Tu),A=bf(gu),T=bf(mu),P=bf(wu),S=bf(xu),H=Xw(o.showDailyLightSensorPanel),j=Xw(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]),W=new Date(d.date),M=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,F=null!==(t=d.timesPerHour)&&void 0!==t?t:4,k=60/F,O=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Y=Object(r.useRef)([]),L=Object(r.useRef)([]),N=Object(r.useRef)(0),U=Object(r.useRef)(!1),E=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 Dy(W,d.latitude)}),[d.date,d.latitude]),$=Object(r.useRef)(_);Object(r.useEffect)((function(){if(A){if(!j||Ww.hasMovingParts(f))return te(),N.current=requestAnimationFrame(le),function(){cancelAnimationFrame(N.current),U.current||(Kh(me.t("message.SimulationAborted",R)),a((function(e){e.world.date=E.current.toLocaleString("en-US")})),bf.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(W.getTime()),cancelAnimationFrame(N.current),n("simulationPaused",!0),Kh(me.t("message.SimulationPaused",R))):(n("simulationPaused",!1),le())}),[T]);var ee=function(){ge(),de();var e,t=Object(h.a)(f);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"})),bf.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:Af.getState().dailyLightSensorData,timestamp:(new Date).getTime()}}))},te=function(){q.current?(W.setTime(Q.current.getTime()),q.current=!1):(E.current=new Date(d.date),Z.current=W.getDay(),W.setHours(Math.floor(_.sunrise/60),-k/2)),U.current=!1,ge(),de()},le=function e(){if(A&&!q.current){if(W.getMinutes()+60*W.getHours()+(W.getDay()-Z.current)*by+k>=_.sunset)return cancelAnimationFrame(N.current),a((function(e){e.world.date=E.current.toLocaleString("en-US"),e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),bf.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:Af.getState().dailyLightSensorData,timestamp:(new Date).getTime()}})));W.setHours(W.getHours(),W.getMinutes()+k),a((function(e){e.world.date=W.toLocaleString("en-US")}));var t,l=Object(h.a)(f);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()}N.current=requestAnimationFrame(e)}},ae=function(){var e,t=pe(),l=Object(h.a)(f);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[W.getMinutes()>=30?W.getHours()+1===24?0:W.getHours()+1:W.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=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t,a||void 0),i=(new We.Vector3).fromArray(e.normal);i.applyAxisAngle(Rt,t.rotation[2]);for(var r=W.getFullYear(),n=W.getMonth(),c=W.getDate(),s=Ww.dayOfYear(W),u=0;u<24;u++)for(var f=0;f0){var m=Fy(g,s,C,py.SPHERE_MODEL),w=i.dot(g);w>0&&(we(e.id,o,g)||(l[u]+=w*m)),l[u]+=ky(d.ground,n,i,m)}}}},pe=function(){var e=_.daylight()/60;return e>At?D.sunshineHours[W.getMonth()]/(30*e*F):0},ye=function(){var e=W.getMonth(),t=$.current.daylight()/60;return t>At?(X.current[e]=t,B.current[e]=D.sunshineHours[e]/(30*t),B.current[e]/F):(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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.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,O.set(t,l);var a=Y.current.filter((function(t){return t.uuid!==e}));return O.intersectObjects(a,!1,L.current),L.current.length>0}return!1};return Object(pf.jsx)(pf.Fragment,{})},UO=n.a.memo(NO),EO=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))},VO=function(e){var t,l,a,n,c,s=e.city,d=Xw(si),f=bf(hf),p=Xw(Gi),y=Xw(Vi),g=Xw.getState().world,m=Xw.getState().elements,w=Xw(Ni),x=Xw(Is),v=Xw($r),b=Xw(_r),A=Af($s),T=Xw($n),P=Af(ld),S=Xw(ec),H=Xw(_s),j=Xw(td),z=Af(od),R=bf(Gs),D=bf(Xs),W=bf(qs),M=bf(Bs),I=bf(Ks),C=bf(Qs),F=Xw(o.showDailyPvYieldPanel),k=Xw(i.noAnimationForSolarPanelSimulation),O=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,Y=bf(Er),L=Object(Se.f)().scene,N=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]),E=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 We.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 Dy(E,g.latitude)}),[g.date,g.latitude]),ye=Object(r.useRef)(pe),ge=Ww.daysInYear(E)/12;Object(r.useEffect)((function(){if(R){if(!k||Ww.hasMovingParts(m))return xe(),oe.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(oe.current),ie.current||(Kh(me.t("message.SimulationAborted",N)),d((function(e){e.world.date=re.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),de.current=!1};setTimeout((function(){we(!1)}),50)}}),[R]),Object(r.useEffect)((function(){D&&k&&!Ww.hasMovingParts(m)&&setTimeout((function(){we(!0)}),50)}),[D]),Object(r.useEffect)((function(){de.current=W,W?(ue.current=new Date(E.getTime()),cancelAnimationFrame(oe.current),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",N))):(f("simulationPaused",!1),ve())}),[W]);var we=function(e){Le(),Me();var t,l=Object(h.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")})),bf.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",N)),p)){var o=Af.getState().sumDailyPvYield(),i=Af.getState().getDailyPvProfit(),r=Af.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?(E.setTime(ue.current.getTime()),de.current=!1):(re.current=new Date(g.date),fe.current=E.getDay(),E.setHours(Math.floor(pe.sunrise/60),-X/2)),ie.current=!1,Le(),Me()},ve=function e(){if(R&&!de.current){if(E.getMinutes()+60*E.getHours()+(E.getDay()-fe.current)*by+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")})),bf.setState((function(e){e.runDailySimulationForSolarPanels=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),ie.current=!0,be(),!Y&&(Kh(me.t("message.SimulationCompleted",N)),p)){var t=Af.getState().sumDailyPvYield(),l=Af.getState().getDailyPvProfit(),a=Af.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}E.setHours(E.getHours(),E.getMinutes()+X),d((function(e){e.world.date=E.toLocaleString("en-US")}));var o,i=Object(h.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(h.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=ke(o)*t,n=0;n0){var B=Fy(U,R,J,py.SPHERE_MODEL),K=ky(g.ground,j,y,B),q=y.dot(U),Q=new We.Vector2,_=new We.Vector3;if(o.bifacialityFactor>0)for(var ee=y.clone().negate(),oe=K+ky(g.ground,j,ee,B)*o.bifacialityFactor,ie=0;ie0?q:-q*o.bifacialityFactor)*B);else for(var ce=0;ce0&&(Q.set(M+ce*D,I+se*W),_.set(Q.x-F.x,Q.y-F.y,0),_.applyEuler(m),k.set(r.x+_.x,r.y+_.y,C+_.z),Ye(e.id,k,U)||(O[ce][se]+=q*B));var de=0;Oe(N);var ue=EO(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+ky(g.ground,S,q,U)*o.bifacialityFactor,_=0;_0?X:-X*o.bifacialityFactor)*U);else for(var oe=0;oe0&&(B.set(R+oe*j,D+ie*z),K.set(B.x-M.x,B.y-M.y,0),K.applyEuler(F),I.set(r.x+K.x,r.y+K.y,W+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?E.getHours()+1===24?0:E.getHours()+1:E.getHours()]+=Te*re/(x*A)}}},Me=function(){var e,t=Object(h.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(h.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[E.getMonth()]/(30*e*G):0},Fe=function(){var e=ye.current.daylight()/60;return e>At?U.sunshineHours[E.getMonth()]/(30*e*G):0},ke=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[E.getMonth()])},Oe=function(e){if(s){var t=x(s);if(t){var l=MT(e,t.lowestTemperatures,t.highestTemperatures);he.current=WT(l.high,l.low,g.diurnalTemperatureModel,O,Dy(e,g.latitude),Ww.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,_.current)}}catch(i){a.e(i)}finally{a.f()}}};return Object(pf.jsx)(pf.Fragment,{})},JO=n.a.memo(VO),GO=function(){var e=Xw(i.latitude),t=Xw(i.longitude),l=Xw(Ys),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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(AO,{city:n}),Object(pf.jsx)(PO,{city:n}),Object(pf.jsx)(HO,{city:n}),Object(pf.jsx)(UO,{city:n}),Object(pf.jsx)(JO,{city:n}),Object(pf.jsx)(LO,{}),Object(pf.jsx)(zO,{city:n}),Object(pf.jsx)(DO,{city:n}),Object(pf.jsx)(MO,{city:n}),Object(pf.jsx)(CO,{city:n}),Object(pf.jsx)(kO,{city:n})]})},XO=n.a.memo(GO),BO=l(843),KO=l(118),qO=l(860),QO=l(573),ZO=l(861),_O=l(862),$O=l(863),eY=l(864),tY=l(865),lY=l(866),aY=l(867),oY=l(572),iY=l(301),rY=l(571),nY=l(868),cY=l(869),sY=l(870),dY="data:image/png;base64,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",uY=l(338),fY=l(91),hY=l(218),pY=l(557),yY=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,f=e.max,p=e.step,y=e.value,g=Xw(si),m=Xw(di),w=Xw(Vi),x=Xw(Ps),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)(f);Object(r.useEffect)((function(){P.current=d}),[d]),Object(r.useEffect)((function(){S.current=f}),[f]);var H={lng:w},j=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})),bf.setState((function(e){e.updateProjectsFlag=!0}))},W=function(){j&&x.owner&&x.title?function(e,t,l){var a={lng:Xw.getState().language};return oP.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()},M=function(e,t){return Object(pf.jsx)("span",{style:{display:"block",width:t+"px"},children:e})},I=function(){return Object(pf.jsx)("text",{onClick:W,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(pf.jsxs)(pf.Fragment,{children:["orientation"!==o?Object(pf.jsx)(sF.a,{content:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(ob.a,{style:{width:"240px"},addonBefore:M(me.t("word.Minimum",H)+(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(h.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&&nP(m.uid,x.title,t.projectInfo.ranges);else{var d={variable:o,minimum:e,maximum:f};t.projectInfo.ranges.push(d),m.uid&&x.title&&rP(m.uid,x.title,d)}}else{var p={variable:o,minimum:e,maximum:f};t.projectInfo.ranges=[p],m.uid&&x.title&&rP(m.uid,x.title,p)}})),P.current=e,T(!A)}}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{style:{width:"240px"},addonBefore:M(me.t("word.Maximum",H)+(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(h.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&&nP(m.uid,x.title,t.projectInfo.ranges);else{var f={variable:o,minimum:d,maximum:e};t.projectInfo.ranges.push(f),m.uid&&x.title&&rP(m.uid,x.title,f)}}else{var p={variable:o,minimum:d,maximum:e};t.projectInfo.ranges=[p],m.uid&&x.title&&rP(m.uid,x.title,p)}})),S.current=e,T(!A)}})]}),children:I()}):Object(pf.jsx)(pf.Fragment,{children:I()}),void 0!==y&&Object(pf.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",H)+(0===y?" (\u25ad)":" (\u25af)"):y.toFixed(s))+(""!==n?n:"")}),Object(pf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(f),stroke:"gold",strokeWidth:10,onClick:W,style:{cursor:"pointer"},strokeOpacity:x.selectedProperty===o?.5:0}),Object(pf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(f),stroke:"black",strokeWidth:2}),R.map((function(e){var t=e.value,l=e.yOffset;return Object(pf.jsxs)("g",{transform:"translate(0, ".concat(l,")"),shapeRendering:"crispEdges",children:[Object(pf.jsx)("line",{x1:-5,x2:0,stroke:"black",strokeWidth:1}),Object(pf.jsx)("text",{style:{fontSize:"10px",textAnchor:"start",alignmentBaseline:"central",transform:"translateX(-25px)"},children:"orientation"===o?0===t?"\u25ad":"\u25af":t},t)]},t)}))]})},gY=n.a.memo(yY),mY={top:30,right:55,bottom:36,left:55},wY=["#e0ac2b","#e85252","#6689c6","#9a6fb0","#a53253","#69b3a2","#556b2f","#8b008b","#ff1493","#d2691e","#2f4f4f","#dc143c"],xY=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,h=e.digits,p=e.tickIntegers,y=e.hover,g=e.hoveredIndex,m=e.selectedIndex,w=l-mY.right-mY.left,x=a-mY.top-mY.bottom,v=Object(f.a)(new Set(o.map((function(e){return e.group})))),b=uY.b().range([0,w]).domain(s).padding(0),A={};s.forEach((function(e,t){var l,a;A[e]=fY.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=hY.a().domain(v).range(wY),P=pY.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(pf.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})),H=s.map((function(e,t){var l,a=A[e];return Object(pf.jsx)("g",{transform:"translate("+b(e)+",0)",children:Object(pf.jsx)(gY,{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:h[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(pf.jsx)("svg",{id:t,width:l,height:a,onContextMenu:function(e){e.stopPropagation()},children:Object(pf.jsxs)("g",{width:w,height:x,transform:"translate(".concat([mY.left,mY.top].join(","),")"),children:[S,H]})})},vY=n.a.memo(xY),bY=l(347),AY=l(161),TY=l(828),PY=l(292),SY=Object(Tv.a)(EM)(gC||(gC=Object(Av.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"]))),HY=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.symbolSize,o=e.changeHorizontalGrid,i=e.changeVerticalGrid,n=e.changeSymbolSize,c={lng:Xw(Vi)},s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",c)+":",Object(pf.jsx)(oH.a,{min:1,max:8,tooltipVisible:!1,value:a,onChange:function(e){null===n||void 0===n||n(e)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===o||void 0===o||o(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",c)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===i||void 0===i||i(!l)},children:me.t("menu.graph.ShowVerticalGridLines",c)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:p,placement:"bottomRight",visible:f,onVisibleChange:function(e){h(e)},children:Object(pf.jsx)(SY,{style:{top:"120px",right:"16px"},onClick:function(e){e.stopPropagation()}})})})},jY=GT.a.TextArea,zY=yb.a.Option,RY=Tv.a.div(mC||(mC=Object(Av.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"]))),DY=Tv.a.div(wC||(wC=Object(Av.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"]))),WY=Tv.a.div(xC||(xC=Object(Av.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"]))),MY=Tv.a.div(vC||(vC=Object(Av.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),IY=Tv.a.div(bC||(bC=Object(Av.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"]))),CY=Tv.a.div(AC||(AC=Object(Av.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"]))),FY=function(e){var t,l,a,o,i,n,c,s,d,p,y,g,m,w,v,b,A,T,P,S,H,j=e.relativeWidth,R=e.canvas,D=Xw(si),M=Xw(di),I=Xw(Vi),C=Xw(ar),F=Xw(Ps),k=Xw(df),O=Xw(af),Y=Object(r.useState)(),L=Object(u.a)(Y,2),N=L[0],U=L[1],E=Object(r.useState)(),V=Object(u.a)(E,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=F.description)&&void 0!==t?t:null),ae=Object(r.useRef)(!1),oe=Object(r.useRef)(!1),ie=Object(r.useRef)(null!==(l=F.dataColoring)&&void 0!==l?l:z.ALL),re=Object(r.useRef)(!1),ne=Object(r.useRef)(null!==(a=F.designs)&&void 0!==a?a:[]),ce=Object(r.useRef)(null!==(o=F.thumbnailWidth)&&void 0!==o?o:200),se=Object(r.useRef)(null!==(i=F.xAxisNameScatteredPlot)&&void 0!==i?i:"rowWidth"),de=Object(r.useRef)(null!==(n=F.yAxisNameScatteredPlot)&&void 0!==n?n:"rowWidth"),ue=Object(r.useRef)(null!==(c=F.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=F.xAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[F.xAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;de.current=null!==(e=F.yAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[F.yAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;ue.current=null!==(e=F.dotSizeScatteredPlot)&&void 0!==e?e:5}),[F.dotSizeScatteredPlot]),Object(r.useEffect)((function(){var e;ce.current=null!==(e=F.thumbnailWidth)&&void 0!==e?e:200}),[F.thumbnailWidth]);var pe=Object(r.useMemo)((function(){return{lng:I}}),[I]),ye=M.uid===F.owner;Object(r.useEffect)((function(){if(ne.current=[],F.designs){var e,t=Object(h.a)(F.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=F.selectedProperty;if(a){var o=F.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*(Ww.calculateCost(e)-Ww.calculateCost(t)):"yearlyProfit"===a?o*(Ww.calculateProfit(e)-Ww.calculateProfit(t)):a in e&&a in t?o*(e[a]-t[a]):0:0}))}q(!K)}}),[F.designs,F.sortDescending,F.selectedProperty]),Object(r.useEffect)((function(){if(U(void 0),F.designs){var e,t=Object(h.a)(F.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,F.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),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},we=function(){M.uid&&F.title&&N&&function(e,t,l){var a={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:oP.a.firestore.FieldValue.arrayRemove(l)}).then((function(){bf.setState((function(e){e.updateProjectsFlag=!0})),oP.a.firestore().collection("users").doc(e).collection("designs").doc(l.title).delete().then((function(){Xw.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)}))}(M.uid,F.title,N).then((function(){D((function(e){if(e.projectInfo.designs){var t,l=-1,a=Object(h.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===N.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(j*window.innerWidth/ve-be),Te=Object(r.useMemo)((function(){var e,t,l,a,o,i;return[Gw.getVariables(F.type,null!==(e=F.hiddenParameters)&&void 0!==e?e:[]),Gw.getTitles(F.type,pe,null!==(t=F.hiddenParameters)&&void 0!==t?t:[]),Gw.getUnits(F.type,pe,null!==(l=F.hiddenParameters)&&void 0!==l?l:[]),Gw.getDigits(F.type,null!==(a=F.hiddenParameters)&&void 0!==a?a:[]),Gw.getTickIntegers(F.type,null!==(o=F.hiddenParameters)&&void 0!==o?o:[]),Gw.getTypes(F.type,null!==(i=F.hiddenParameters)&&void 0!==i?i:[])]}),[F.type,F.hiddenParameters,_,pe]),Pe=Object(u.a)(Te,6),Se=Pe[0],He=Pe[1],je=Pe[2],ze=Pe[3],Re=Pe[4],De=Pe[5],We=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a,o,i,r,n,c,s,d,u,f,p,y,g,m=t.value,w={};(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("rowWidth"))||(w.rowWidth=m.rowsPerRack),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("tiltAngle"))||(w.tiltAngle=Ww.toDegrees(m.tiltAngle)),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("interRowSpacing"))||(w.interRowSpacing=m.interRowSpacing),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("latitude"))||(w.latitude=null!==(n=m.latitude)&&void 0!==n?n:42),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("orientation"))||(w.orientation=m.orientation===$.landscape?0:1),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("poleHeight"))||(w.poleHeight=m.poleHeight),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("unitCost"))||(w.unitCost=m.unitCost),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("sellingPrice"))||(w.sellingPrice=m.sellingPrice),(null===(f=F.hiddenParameters)||void 0===f?void 0:f.includes(""))||(w.totalYearlyCost=Ww.calculateCost(m)),(null===(p=F.hiddenParameters)||void 0===p?void 0:p.includes("totalYearlyYield"))||(w.totalYearlyYield=.001*m.yearlyYield),(null===(y=F.hiddenParameters)||void 0===y?void 0:y.includes("meanYearlyYield"))||(w.meanYearlyYield=m.yearlyYield/m.panelCount),(null===(g=F.hiddenParameters)||void 0===g?void 0:g.includes("yearlyProfit"))||(w.yearlyProfit=Ww.calculateProfit(m)),w.group=F.dataColoring===z.INDIVIDUALS?m.title:"default",w.selected=N===m,w.hovered=J===m,w.invisible=m.invisible,e.push(w)}}catch(x){l.e(x)}finally{l.f()}}return e}),[F.designs,F.type,J,N,O,F.hiddenParameters,F.dataColoring,_]),Me=function(e,t){var l=t;if(F.ranges){var a,o=Object(h.a)(F.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(F.ranges){var a,o=Object(h.a)(F.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(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Me("rowWidth",k.minimumRowsPerRack)),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Me("tiltAngle",Ww.toDegrees(k.minimumTiltAngle))),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Me("interRowSpacing",k.minimumInterRowSpacing)),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Me("latitude",-90)),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(0),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Me("poleHeight",0)),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Me("unitCost",.1)),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Me("sellingPrice",.1)),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Me("totalYearlyCost",0)),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Me("totalYearlyYield",0)),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Me("meanYearlyYield",0)),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Me("yearlyProfit",-10)),f}return[]}),[k,F.type,F.ranges,F.hiddenParameters,_]),Fe=Object(r.useMemo)((function(){if(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Ie("rowWidth",k.maximumRowsPerRack)),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Ie("tiltAngle",Ww.toDegrees(k.maximumTiltAngle))),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Ie("interRowSpacing",k.maximumInterRowSpacing)),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Ie("latitude",90)),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Ie("poleHeight",5)),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Ie("unitCost",1)),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Ie("sellingPrice",.5)),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Ie("totalYearlyCost",100)),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Ie("totalYearlyYield",100)),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Ie("meanYearlyYield",1e3)),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Ie("yearlyProfit",10)),f}return[]}),[k,F.type,F.ranges,F.hiddenParameters,_]),ke=Object(r.useMemo)((function(){if(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(1),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(.1),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(.1),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(.1),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(.1),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(.01),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(.01),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(.1),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(1),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(1),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(.1),f}return[]}),[F.type,F.hiddenParameters,_]),Oe=Object(r.useRef)(!(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("rowWidth"))),Ye=Object(r.useRef)(!(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("tiltAngle"))),Le=Object(r.useRef)(!(null===(p=F.hiddenParameters)||void 0===p?void 0:p.includes("interRowSpacing"))),Ne=Object(r.useRef)(!(null===(y=F.hiddenParameters)||void 0===y?void 0:y.includes("latitude"))),Ue=Object(r.useRef)(!(null===(g=F.hiddenParameters)||void 0===g?void 0:g.includes("orientation"))),Ee=Object(r.useRef)(!(null===(m=F.hiddenParameters)||void 0===m?void 0:m.includes("poleHeight"))),Ve=Object(r.useRef)(!(null===(w=F.hiddenParameters)||void 0===w?void 0:w.includes("unitCost"))),Je=Object(r.useRef)(!(null===(v=F.hiddenParameters)||void 0===v?void 0:v.includes("sellingPrice"))),Xe=Object(r.useRef)(!(null===(b=F.hiddenParameters)||void 0===b?void 0:b.includes("totalYearlyCost"))),Be=Object(r.useRef)(!(null===(A=F.hiddenParameters)||void 0===A?void 0:A.includes("totalYearlyYield"))),Ke=Object(r.useRef)(!(null===(T=F.hiddenParameters)||void 0===T?void 0:T.includes("meanYearlyYield"))),qe=Object(r.useRef)(!(null===(P=F.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;Oe.current=!(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth")),Ye.current=!(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle")),Le.current=!(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing")),Ne.current=!(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude")),Ue.current=!(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation")),Ee.current=!(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight")),Ve.current=!(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost")),Je.current=!(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice")),Xe.current=!(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost")),Be.current=!(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield")),Ke.current=!(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield")),qe.current=!(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit")),q(!K)}),[F.hiddenParameters]),Object(r.useEffect)((function(){le.current=F.description}),[F.description]);var Qe=function(e){var t;t=e.title,D((function(e){if(e.projectInfo.designs){var l,a=Object(h.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&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};oP.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(f.a)(i.designs));var n,c=-1,s=Object(h.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,oP.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(){}))}(M.uid,F.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?M.uid&&F.title&&function(e,t,l,a){var o={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({hiddenParameters:a?oP.a.firestore.FieldValue.arrayUnion(l):oP.a.firestore.FieldValue.arrayRemove(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",o)+": "+e)}))}(M.uid,F.title,t,!e).then((function(){Ze(e,t)})):Ze(e,t)},$e=function(){D((function(e){e.projectInfo.dataColoring=ie.current})),bf.setState((function(e){e.updateProjectsFlag=!0})),q(!K)},et=function(e){ie.current=e,ye?M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,ie.current).then((function(){$e()})):$e()},tt=function(){return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(zY,{value:"rowWidth",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})},"rowWidth"),Object(pf.jsx)(zY,{value:"tiltAngle",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})},"tiltAngle"),Object(pf.jsx)(zY,{value:"interRowSpacing",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})},"interRowSpacing"),Object(pf.jsx)(zY,{value:"latitude",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})},"latitude"),Object(pf.jsx)(zY,{value:"orientation",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})},"orientation"),Object(pf.jsx)(zY,{value:"poleHeight",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})},"poleHeight"),Object(pf.jsx)(zY,{value:"unitCost",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})},"unitCost"),Object(pf.jsx)(zY,{value:"sellingPrice",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})},"sellingPrice"),Object(pf.jsx)(zY,{value:"totalYearlyCost",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})},"totalYearlyCost"),Object(pf.jsx)(zY,{value:"totalYearlyYield",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})},"totalYearlyYield"),Object(pf.jsx)(zY,{value:"meanYearlyYield",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})},"meanYearlyYield"),Object(pf.jsx)(zY,{value:"yearlyProfit",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})},"yearlProfit")]})},lt=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(!a.invisible&&a!==N){var o={};Gw.setScatterData(se.current,"x",o,a),Gw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,F.designs,F.type,N]),at=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a===N){var o={};Gw.setScatterData(se.current,"x",o,a),Gw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,F.designs,F.type,N]),ot=function(e){var t={min:0,max:1};if(F.type===W.SOLAR_PANEL_ARRAY&&k)switch(e){case"rowWidth":t.min=Me("rowWidth",k.minimumRowsPerRack),t.max=Ie("rowWidth",k.maximumRowsPerRack);break;case"tiltAngle":t.min=Me("tiltAngle",Ww.toDegrees(k.minimumTiltAngle)),t.max=Ie("tiltAngle",Ww.toDegrees(k.maximumTiltAngle));break;case"interRowSpacing":t.min=Me("interRowSpacing",k.minimumInterRowSpacing),t.max=Ie("interRowSpacing",k.maximumInterRowSpacing);break;case"latitude":t.min=Me("latitude",-90),t.max=Ie("latitude",90);break;case"orientation":t.min=0,t.max=1;break;case"poleHeight":t.min=Me("poleHeight",0),t.max=Ie("poleHeight",5);break;case"unitCost":t.min=Me("unitCost",.1),t.max=Ie("unitCost",1);break;case"sellingPrice":t.min=Me("sellingPrice",.1),t.max=Ie("sellingPrice",.5);break;case"totalYearlyCost":t.min=Me("totalYearlyCost",0),t.max=Ie("totalYearlyCost",100);break;case"totalYearlyYield":t.min=Me("totalYearlyYield",0),t.max=Ie("totalYearlyYield",100);break;case"meanYearlyYield":t.min=Me("meanYearlyYield",0),t.max=Ie("meanYearlyYield",1e3);break;case"yearlyProfit":t.min=Me("yearlyProfit",-10),t.max=Ie("yearlyProfit",10)}return t},it=Object(r.useMemo)((function(){return ot(se.current)}),[se.current,F.ranges]),rt=Object(r.useMemo)((function(){return ot(de.current)}),[de.current,F.ranges]),nt=Object(r.useMemo)((function(){return Gw.getUnit(se.current,pe)}),[se.current,pe]),ct=Object(r.useMemo)((function(){return Gw.getUnit(de.current,pe)}),[de.current,pe]),st=function(e){var t=e.cx,l=e.cy;return Object(pf.jsx)(AY.a,{cx:t,cy:l,fill:"#8884d8",r:ue.current})};return Object(pf.jsx)(RY,{onContextMenu:function(e){e.stopPropagation()},children:Object(pf.jsxs)(DY,{children:[Object(pf.jsxs)(WY,{children:[Object(pf.jsx)("span",{children:(ye?me.t("projectPanel.Project",pe):me.t("projectPanel.ProjectByOtherPeople",pe))+": "+F.title+(ye?"":" ("+me.t("word.Owner",pe)+": "+(null===(S=F.owner)||void 0===S?void 0:S.substring(0,4))+"***)")+" ("+ne.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ge()},onTouchStart:function(){ge()},children:Object(pf.jsx)(KO.a,{title:me.t("word.Close",pe)})})]}),Object(pf.jsx)(qR.a,{style:{backgroundColor:"white",border:"none"},onChange:function(e){oe.current=e.length>0,q(!K)},children:Object(pf.jsx)(qR.a.Panel,{style:{backgroundColor:"white",border:"none"},header:Object(pf.jsxs)(MY,{children:[Object(pf.jsx)("span",{children:me.t("projectPanel.ProjectDescription",pe)+" | "+me.t("projectPanel.ProjectType",pe)+": "+F.type}),Object(pf.jsxs)("span",{children:[ye&&Object(pf.jsxs)(pf.Fragment,{children:[oe.current&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),te.current=!te.current,q(!K)},children:te.current?Object(pf.jsx)(qO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionNonEditable",pe)}):Object(pf.jsx)(QO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionEditable",pe)})}),Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),bf.setState((function(e){e.curateDesignToProjectFlag=!0}))},children:Object(pf.jsx)(ZO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.CurateCurrentDesign",pe)})}),N&&N.title===C&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){var t;(e.stopPropagation(),R&&M.uid&&F.title&&C)&&function(e,t,l,a,o,i){var r={lng:Xw.getState().language};return bf.setState((function(e){e.waiting=!0})),oP.a.firestore().collection("users").doc(e).collection("designs").doc(o).set(Xw.getState().exportContent()).then((function(){if(bf.getState().setChanged(!1),i){var n=Ww.resizeCanvas(i,a).toDataURL();oP.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(f.a)(i.designs));var s,d=-1,p=Object(h.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]=cP(t,o,n),oP.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(){Xw.getState().set((function(e){e.projectInfo.designs=c})),bf.setState((function(e){e.updateProjectsFlag=!0,e.waiting=!1}))})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",r)+": "+e)})).finally((function(){}))}}))}(M.uid,F.type,F.title,null!==(t=F.thumbnailWidth)&&void 0!==t?t:200,C,R).then((function(){q(!K)}))},children:Object(pf.jsx)(_O.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.UpdateSelectedDesign",pe)})}),N&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),we(),U(void 0)},children:Object(pf.jsx)($O.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.RemoveSelectedDesign",pe)})}),N&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){if(e.stopPropagation(),F.title){var t=Ge+"?client=web&userid="+M.uid+"&project="+encodeURIComponent(F.title);N&&(t+="&title="+encodeURIComponent(N.title)),Zh(t),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",pe)+".")}},children:Object(pf.jsx)(eY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectListPanel.GenerateProjectLink",pe)})})]}),F.designs&&F.designs.length>1&&F.selectedProperty&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),D((function(e){e.projectInfo.sortDescending=!e.projectInfo.sortDescending}))},children:F.sortDescending?Object(pf.jsx)(tY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)}):Object(pf.jsx)(lY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)})}),Object(pf.jsx)(sF.a,{title:Object(pf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("projectPanel.ProjectSettings",pe)}),content:function(){return Object(pf.jsx)("div",{style:{width:"250px"},onClick:function(e){return e.stopPropagation()},children:Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{span:14,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.ThumbnailImageSize",pe),": "]})}),Object(pf.jsx)(BT.a,{span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ce.current,onChange:function(e){ce.current=e,ye?M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){D((function(e){e.projectInfo.thumbnailWidth=ce.current}))})):D((function(e){e.projectInfo.thumbnailWidth=ce.current})),q(!K)},children:[Object(pf.jsx)(zY,{value:100,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Small",pe)})},"small-thumbnail"),Object(pf.jsx)(zY,{value:125,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Medium",pe)})},"medium-thumbnail"),Object(pf.jsx)(zY,{value:200,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Large",pe)})},"large-thumbnail")]})})]})})},children:Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){return e.stopPropagation()},children:Object(pf.jsx)(aY.a,{style:{fontSize:"24px",color:"gray"}})})})]})]}),children:Object(pf.jsx)(jY,{title:te.current?void 0:me.t("projectPanel.DoubleClickToMakeDescriptionEditable",pe),bordered:te.current,readOnly:!te.current,value:null!==(H=le.current)&&void 0!==H?H: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&&M.uid&&ye&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.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(pf.jsxs)(CY,{children:[Object(pf.jsx)(BO.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===F.thumbnailWidth?8:125===F.thumbnailWidth?12:30;return Object(pf.jsxs)(BO.b.Item,{style:{marginBottom:"-28px"},onMouseOver:function(){G(e)},onMouseLeave:function(){G(void 0)},children:[Object(pf.jsx)("img",{loading:"eager",width:Ae+"px",height:"auto",onError:function(e){e.target.src=dY},onLoad:function(t){D((function(l){l.projectImages.set(e.title,t.target)})),bf.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":"")+(N===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:dY,style:{transition:".5s ease",opacity:J===e?.5:1,padding:"1px",cursor:"pointer",borderRadius:N===e?"0":"10px",border:N===e?"2px solid red":"none"},onDoubleClick:function(t){var l=t.target;l.src===dY&&(l.src=e.thumbnailUrl),U(e),F.owner&&hP(F.owner,e.title,!0,!0).then((function(){}))},onClick:function(t){var l=t.target;l.src===dY&&(l.src=e.thumbnailUrl),U(e!==N?e:void 0)}}),Object(pf.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(pf.jsxs)("div",{style:{position:"relative",right:"10px",textAlign:"right",bottom:"36px",color:"white"},children:[e.title===C&&Object(pf.jsx)(oY.a,{style:{paddingRight:"4px",fontSize:"16px"}}),e.invisible?Object(pf.jsx)(iY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignNotShownInSolutionSpaceClickToShow",pe)}):Object(pf.jsx)(rY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignShownInSolutionSpaceClickToHide",pe)})]})]})}}),Object(pf.jsxs)(IY,{children:[Object(pf.jsx)("span",{style:{paddingLeft:"20px"},children:me.t("projectPanel.DistributionInSolutionSpace",pe)}),Object(pf.jsxs)("span",{children:[F.type===W.SOLAR_PANEL_ARRAY&&Object(pf.jsx)(sF.a,{title:me.t("projectPanel.ChooseSolutionSpace",pe),onVisibleChange:function(e){re.current&&(e||bf.setState((function(e){e.updateProjectsFlag=!0})),re.current=!1)},content:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(ab.a,{onChange:function(e){Oe.current=e.target.checked,_e(Oe.current,"rowWidth"),ee(!_)},checked:Oe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ye.current=e.target.checked,_e(Ye.current,"tiltAngle"),ee(!_)},checked:Ye.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Le.current=e.target.checked,_e(Le.current,"interRowSpacing"),ee(!_)},checked:Le.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ne.current=e.target.checked,_e(Ne.current,"latitude"),ee(!_)},checked:Ne.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ue.current=e.target.checked,_e(Ue.current,"orientation"),ee(!_)},checked:Ue.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ee.current=e.target.checked,_e(Ee.current,"poleHeight"),ee(!_)},checked:Ee.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ve.current=e.target.checked,_e(Ve.current,"unitCost"),ee(!_)},checked:Ve.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Je.current=e.target.checked,_e(Je.current,"sellingPrice"),ee(!_)},checked:Je.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Xe.current=e.target.checked,_e(Xe.current,"totalYearlyCost"),ee(!_)},checked:Xe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Be.current=e.target.checked,_e(Be.current,"totalYearlyYield"),ee(!_)},checked:Be.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ke.current=e.target.checked,_e(Ke.current,"meanYearlyYield"),ee(!_)},checked:Ke.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){qe.current=e.target.checked,_e(qe.current,"yearlyProfit"),ee(!_)},checked:qe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})})]}),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(nY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(sF.a,{title:me.t("projectPanel.ChooseDataColoring",pe),content:function(){var e;return Object(pf.jsx)("div",{children:Object(pf.jsxs)(rb.a.Group,{onChange:function(e){et(e.target.value)},value:null!==(e=F.dataColoring)&&void 0!==e?e:z.ALL,children:[Object(pf.jsx)(rb.a,{style:{fontSize:"12px"},value:z.ALL,children:me.t("projectPanel.SameColorForAllDesigns",pe)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(rb.a,{style:{fontSize:"12px"},value:z.INDIVIDUALS,children:me.t("projectPanel.OneColorForEachDesign",pe)})]})})}(),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(cY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(sF.a,{title:me.t("projectPanel.GenerateScatteredPlot",pe),content:Object(pf.jsxs)("div",{style:{width:"280px"},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{span:8,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectXAxis",pe),": "]})}),Object(pf.jsx)(BT.a,{span:16,children:Object(pf.jsx)(yb.a,{style:{width:"100%"},value:se.current,onChange:function(e){se.current=e,ye&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"8px"},children:[Object(pf.jsx)(BT.a,{span:8,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectYAxis",pe),": "]})}),Object(pf.jsx)(BT.a,{span:16,children:Object(pf.jsx)(yb.a,{style:{width:"100%"},value:de.current,onChange:function(e){de.current=e,ye&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(pf.jsx)(XT.a,{style:{paddingBottom:"8px"},children:Object(pf.jsxs)("div",{children:[Object(pf.jsxs)(TY.a,{id:"scattered-chart",width:280,height:240,margin:{top:0,right:0,bottom:-10,left:-10},children:[Object(pf.jsx)(DM.a,{strokeWidth:"1",stroke:"gray",horizontal:fe.current,vertical:he.current}),Object(pf.jsx)(MM.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(pf.jsx)(CM.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(pf.jsx)(RM.a,{cursor:{strokeDasharray:"3 3"},formatter:function(e){return e.toFixed(2)}}),Object(pf.jsx)(PY.a,{name:"All",data:lt,fill:"#8884d8",shape:Object(pf.jsx)(st,{})}),N&&Object(pf.jsx)(PY.a,{name:"Selected",data:at,fill:"red",shape:"star"})]}),Object(pf.jsx)(HY,{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&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)}})]})}),Object(pf.jsx)(XT.a,{children:Object(pf.jsx)("span",{style:{width:"100%",textAlign:"center"},children:Object(pf.jsx)(NC.a,{style:{fontSize:"18px",color:"gray",paddingRight:"8px"},title:me.t("projectPanel.ScatteredPlotScreenshot",pe),onClick:function(){var e=document.getElementById("scattered-chart");e&&Object(bY.saveSvgAsPng)(e,"scattered-chart-"+F.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))}})})})]}),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(sY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:"20px",background:"white"},onClick:function(){var e=document.getElementById("design-space");e&&Object(bY.saveSvgAsPng)(e,"design-space-"+F.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))},children:Object(pf.jsx)(NC.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.SolutionSpaceScreenshot",pe)})})]})]}),Object(pf.jsx)(vY,{id:"design-space",width:j*window.innerWidth,height:xe/2-120,data:We,types:De,minima:Ce,maxima:Fe,steps:ke,variables:Se,titles:He,units:je,digits:ze,tickIntegers:Re,hover:function(e){F.designs&&e>=0&&e0){bf.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})),bf.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}()&&bf.setState((function(e){e.saveLocalFileDialogVisible=!1})),x(!1)},C=function(){bf.setState((function(e){e.saveLocalFileDialogVisible=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{title:Object(pf.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(pf.jsx)(Sv.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(pf.jsx)(Sv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")]:[Object(pf.jsx)(Sv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!A,bounds:H,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();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(pf.jsx)("div",{ref:z,children:e})})},children:Object(pf.jsx)(GT.a,{placeholder:"File name",value:h,onPressEnter:I,onChange:function(e){a((function(t){t.localFileName=e.target.value}))}})})})},UY=n.a.memo(NY),EY=function(){var e=Xw(Ji),t=Xw((function(e){return e.world})),l=Xw((function(e){return e.elements})),a=Xw((function(e){return e.viewState})),o=Xw((function(e){return e.notes})),i=bf(Us),n=bf(Es),c=bf(Wi),s=bf(Mi),d=Xw(Ms),u=Xw(Cs),f=Xw(ks),h=Xw(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(),bf.setState((function(e){e.openModelsMap=g,g&&(e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.leaderboardFlag=!0,e.showLeaderboard=!0)}))}),[]),Object(r.useEffect)((function(){bf.getState().skipChange?s(!1):bf.getState().changed||c(!0)}),[t,a,l,o]),Object(r.useEffect)((function(){i&&bf.setState((function(e){e.showSolarRadiationHeatmap=!1})),n&&bf.setState((function(e){e.showHeatFluxes=!1}))}),[t,l]),Object(pf.jsx)(qw.a,{locale:e,children:Object(pf.jsxs)(Bw,{children:[y?Object(pf.jsx)(LY,{viewOnly:!0}):Object(pf.jsxs)(Kw.a,{onBeforeunload:function(){return""},children:[Object(pf.jsx)(LY,{viewOnly:!1})," "]}),Object(pf.jsx)(UY,{viewOnly:y})]})})};s.a.render(Object(pf.jsx)(n.a.StrictMode,{children:Object(pf.jsx)(EY,{})}),document.getElementById("root"))}},[[789,1,2]]]); -//# sourceMappingURL=main.71a8bdfe.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":"iEcUsFGYBwg7FEsGAWwpDs","time":"08/15/2023 04:56 pm","timestamp":1692132972037,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"5/1/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Leominster State Forest, Leominster, MA 01420, 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":42.52092349999999,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.8384068},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152009,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":0.07401736805849783,"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":3.700868402924892,"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":3.700868402924892,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3.700868402924892,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":3.700868402924892,"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":3.700868402924892,"centerRoofHeight":[-0.022465454047944533,5.827600046994059],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","rightRoofHeight":3.7008684029248915,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"lx":7.5,"windows":[],"lz":3.700868402924892,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,5.827600046994059],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":3.7008684029248915,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3.700868402924892,"ly":0.3,"cx":-5.457020109151015,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"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":3.700868402924892,"leftRoofHeight":3.700868402924892,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3.700868402924892,"lx":12,"color":"white","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.700868402924892,"rightTopPartialHeight":3.700868402924892,"locked":true},{"type":"Foundation","ly":8.209748806830484,"lz":0.07401736805849783,"rotation":[0,0,0],"cz":0.05,"cx":0.3444310502028619,"lx":9.082946486026735,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.588798589487019,"id":"8fpWrU7qVyVgipB7LtABom","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"showLabel":false,"cz":3.903941909848086,"roofId":"bMyAZV3jeEtHec1SxNb6X8","lz":5.234219703671004,"ly":0.3,"leftRoofHeight":5.712225310760859,"relativeAngle":3.141592653589793,"rightRoofHeight":5.712225310760859,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":6.4566666666666634,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture Default","cx":-0.034941558187143285,"leftPoint":[3.193391775146188,1.612200631492839,0],"type":"Wall","rightPoint":[-3.263274891520475,1.612200631492839,0],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.612200631492839,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"white","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.805475873448939,"rightUnfilledHeight":4.805475873448939,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":5.234219703671004,"selected":false,"ly":0.3,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.22448562198120414,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[3.193391775146188,-1.1632293875304307,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","textureType":"Wall Texture Default","cx":3.193391775146189,"centerRoofHeight":[0.5,5.712225310760859],"showLabel":false,"leftRoofHeight":5.234219703671004,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.570796326794896,"windows":[],"rightRoofHeight":5.712225310760859,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[3.1933917751461904,1.612200631492839,0],"lx":2.7754300190232697,"color":"white","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.5697809504114297,"rightUnfilledHeight":5.234219703671004,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":5.712225310760859,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture Default","cx":-3.263274891520475,"rightPoint":[-3.263274891520475,-1.1632293875304307,0],"lz":5.234219703671004,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","centerRoofHeight":[-0.5,5.712225310760859],"cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-3.263274891520475,1.612200631492839,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":2.7754300190232697,"cy":0.22448562198120414,"windows":[],"ly":0.3,"rightRoofHeight":5.234219703671004,"color":"white","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.234219703671004,"rightUnfilledHeight":3.5697809504114297,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"ly":0,"cx":0,"type":"Roof","thickness":0.2,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture Default","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.126731644069167,"ceiling":false,"locked":true},{"rightPoint":[3.193391775146188,-1.1632293875304307,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.034941558187143285,"ly":0.3,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":5.234219703671004,"rightRoofHeight":5.234219703671004,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-3.263274891520475,-1.1632293875304307,0],"type":"Wall","cy":-1.1632293875304307,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":5.234219703671004,"windows":[],"showLabel":false,"textureType":"Wall Texture Default","lx":6.4566666666666634,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.5697809504114297,"rightUnfilledHeight":3.5697809504114297,"leftTopPartialHeight":5.234219703671004,"rightTopPartialHeight":5.234219703671004,"locked":true},{"ridgeLeftPoint":[-0.5,1],"roofType":"Gable","id":"bMyAZV3jeEtHec1SxNb6X8","ridgeRightPoint":[0.5,1],"selected":false,"wallsId":["7xigJB2WiCCrREDc2Ja3YN"],"rotation":[0,0,0],"cz":0,"cy":0,"foundationId":"8fpWrU7qVyVgipB7LtABom","lz":0,"lx":0,"showLabel":false,"parentId":"8fpWrU7qVyVgipB7LtABom","textureType":"Roof Texture Default","normal":[0,0,1],"type":"Roof","thickness":0.1,"cx":0,"ly":0,"color":"#666666","rise":0.4780056070898553,"ceiling":false,"locked":true},{"foundationId":"8fpWrU7qVyVgipB7LtABom","lx":0.15384615384615385,"id":"kT8BzEWny2ZAvkGr4E4KEf","type":"Window","ly":0.3,"showLabel":false,"rotation":[0,0,0],"selected":false,"color":"#ffffff","lz":0.14780124246219536,"cz":0.4037254895427074,"normal":[0,0,1],"cx":-0.23283427981414576,"cy":0.1,"parentId":"7xigJB2WiCCrREDc2Ja3YN","shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","cz":0.4037254895427074,"cx":0.23180175529168826,"ly":0.3,"lx":0.15384615384615385,"rotation":[0,0,0],"lz":0.14780124246219536,"normal":[0,0,1],"selected":false,"type":"Window","id":"7u1AuHohJXNKKJPafwNUFQ","cy":0.1,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"normal":[0,0,1],"rotation":[0,0,0],"lz":0.07401736805849783,"cz":0.05,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.813410596867628,"solarUpdraftTower":{},"cy":0.16141466329287235,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"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":6.661563125264805,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","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":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"locked":true},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360516,0],"rotation":[0,0,0],"cy":0.11982626583605155,"lz":6.661563125264805,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.5,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"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":1.5096768753682475,"rightUnfilledHeight":1.5096768753682475,"leftTopPartialHeight":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"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":6.661563125264805,"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","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"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.661563125264805,"rightTopPartialHeight":6.661563125264805,"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":6.661563125264805,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"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.661563125264805,"rightTopPartialHeight":6.661563125264805,"locked":true},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":0,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.005759415706553773,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"cx":0.19999999999999998,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.005759415706553773,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.37499999999999994,"cy":0,"cz":0,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"lz":0.3942112571821837,"cy":0,"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.3466666666666667,"cz":-0.05913168857732756,"ly":0.3,"showLabel":false,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"selected":false,"cz":-0.05913168857732756,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","type":"Window","normal":[0,0,1],"id":"rgPxjoaTPqdF2tQvSYYJxX","lx":0.13333333333333333,"ly":0.3,"color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","lz":0.3942112571821837,"cy":0,"cx":0,"rotation":[0,0,0],"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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.05913168857732756,"lx":0.13333333333333333,"color":"#ffffff","cy":0,"mullionSpacing":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"type":"Human","name":"Judd","cx":-0.09889479147539992,"cy":-3.5804269948570657,"cz":0.03700868412852199,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.544,"locked":true},{"type":"Tree","name":"Magnolia","cx":11.305837530144139,"cy":-3.6653094140688935,"cz":0,"lx":7.849178627898182,"lz":8.26765132308192,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"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":0.7,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.25},"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":true},{"type":"Door","cx":0.004166666666666666,"cy":0,"cz":-0.14191725928869298,"lx":0.10833333333333332,"ly":0,"lz":0.716165481422614,"textureType":"Door Texture Default","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,"opacity":1,"locked":true},{"type":"Human","name":"Jess","cx":10.043178984637636,"cy":-3.1477838439296697,"cz":0,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hDyRWYv3zznENZxyb7giJb","selected":false,"ly":0.43,"locked":true},{"type":"Flower","name":"Hosta","cx":-4.865498633056688,"cy":-5.35511145051621,"cz":4.440892098500626e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rQBZjpiN17FBa7zVGS29EM","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.913277609806336,"cy":-5.374330832155909,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gc42wB2NVDE3XxmJXbCjzF","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.365516144068206,"cy":-5.032667389054726,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vUf5PGrUMVgXbqYPHJhogg","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.451426749352761,"cy":-5.0400985854852,"cz":0,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nQJ3744KdWm46uETjWgCgh","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.305907483983008,"cy":-4.741244078804888,"cz":-4.440892098500626e-16,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"v55S46CRAfNBqtvC7SejWL","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.64587810641245,"cy":-5.149011385356842,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"cjq5zpMwEQ68Pvr3BHuvAN","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":11.069278217326396,"cy":-5.113715548843749,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"bq7T5SUabm6WYJRf7MELsr","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.087718880149556,"cy":-5.171937637087455,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kGacG4GbyL6sr53BA3szew","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":11.337264912334188,"cy":-4.906129973770318,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"3mzXsN58FdxQCLpv8kVCYw","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":10.431075288929677,"cy":-3.991597909938303,"cz":0,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"acUhTF9RVe5riGAE9cfhJn","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":9.86441386534317,"cy":-4.67810479084557,"cz":-8.881784197001252e-16,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ooTJkhwo3iWiDqyRe6jwef","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":9.406250442154278,"cy":-4.8162245440076354,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"p8SDFTinzKkCMVNKYGXSQU","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":9.924833666037356,"cy":-5.548260780564018,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"vXr6WeGdxpL14pfLB8tAGS","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":-0.8637473869150567,"cy":-5.021658074995834,"cz":0.03700868412863657,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8jaD71ndVi3Pxu67kBrHve","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":1.960367825542456,"cy":-5.044972777905908,"cz":0.03700868412852288,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"xu93thGDcf75KxzfVpckCK","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-2.974917470063473,"cy":-4.971526921550339,"cz":0.03700868412852377,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aPfi6ru8UEQvmRY7YmRfhQ","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":2.9943532379673203,"cy":-2.3800793411851497,"cz":0.03700868412852288,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"p12f94kQKCXpPNEEPe9ktz","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-8.658559512721883,"cy":0.2268652768492938,"cz":4.440892098500626e-16,"lx":5.410682322966088,"lz":5.9930306282885,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"8MCf8WzkvdtkVT9MPmDy4G","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-8.813697651847779,"cy":-3.717743510806919,"cz":-4.440892098500626e-16,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kwZdR8kant3eBoLCjjUQCJ","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-9.660182286895216,"cy":-0.10473626441648776,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"hM4s39UWZUWNoUSUMHrmbJ","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-9.04189556545002,"cy":-0.8584081924043119,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"nQgYQhsWvwPQorjAb4dSNv","selected":false,"locked":true},{"type":"Polygon","cx":-0.00213352886578518,"cy":-0.2942089556230589,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.04166666666666669,"y":-0.13775856472283443},{"x":-0.04166666666666669,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.13775856472283443}],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":1,"id":"eYBEchBwdGr5aCP6pHEkhr","text":"175","fontSize":0.3,"fontColor":"gold","fontStrokeWidth":0.01,"noOutline":true,"opacity":0,"locked":true},{"type":"Door","cx":-0.013333333333333334,"cy":0,"cz":-0.3986137684780472,"lx":0.10666666666666667,"ly":0,"lz":0.20277246304390567,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture #8","color":"#ffffff","uValue":10,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d48TNpLXWZQD5hZa4SumwF","locked":true,"interior":true},{"type":"Window","cx":0.546396492045166,"cy":-2.2182418146601295,"cz":4.9719401800066105,"lx":6.2858321442603895,"ly":0.2,"lz":2.946512926202779,"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.535854716076799,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qbq4krxSBYqvGnjWC2BaZ6","empty":true,"locked":true,"interior":true}],"sceneRadius":19,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.3385955283596493,-0.960681989394115,-9.84385140521351e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.3385955283596493,-0.9616823668411001,150],"theme":"Hill","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-4.575836374358772,-13.55189382123386,1.5270764549730371],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"directLightIntensity":2,"ambientLightIntensity":0.2,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":38.96037486782549,"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.6129423584899516,-0.1380765532376687,1.3729341918793292],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"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}')},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"]}')},582:function(e,t,l){},599:function(e,t,l){},789: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 Ha})),l.d(o,"cameraZoom",(function(){return ja})),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 Wa})),l.d(o,"mapType",(function(){return Ma})),l.d(o,"showSiteInfoPanel",(function(){return Ia})),l.d(o,"showDesignInfoPanel",(function(){return Ca})),l.d(o,"showInstructionPanel",(function(){return Fa})),l.d(o,"showHeliodonPanel",(function(){return ka})),l.d(o,"heliodonPanelX",(function(){return Oa})),l.d(o,"heliodonPanelY",(function(){return Ya})),l.d(o,"showMapPanel",(function(){return La})),l.d(o,"mapPanelX",(function(){return Na})),l.d(o,"mapPanelY",(function(){return Ua})),l.d(o,"showWeatherPanel",(function(){return Ea})),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 Ho})),l.d(o,"showDailyUpdraftTowerYieldPanel",(function(){return jo})),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 Wo})),l.d(o,"evolutionPanelRect",(function(){return Mo}));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 Fo})),l.d(i,"leafDayOfYear1",(function(){return ko})),l.d(i,"leafDayOfYear2",(function(){return Oo})),l.d(i,"ground",(function(){return Yo})),l.d(i,"address",(function(){return Lo})),l.d(i,"countryCode",(function(){return No})),l.d(i,"airAttenuationCoefficient",(function(){return Uo})),l.d(i,"airConvectiveCoefficient",(function(){return Eo})),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(582),l(23)),u=l(4),f=l(8),h=l(2),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(798),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",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",AllCuboids:"All Cuboids",OnlyThisSide:"Only This Side",AllSidesOfThisCuboid:"All Sides of This Cuboid",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",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",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",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",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",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",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",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",AllWindows:"All Windows",Width:"Width",Height:"Height",Mullion:"Mullion",MullionWidth:"Mullion Width",MullionSpacing:"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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"My Cloud Files",GenerateLink:"Generate Link",LinkGeneratedInClipBoard:"A link has been 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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Click to access cloud tools"},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",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",AllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53",OnlyThisSide:"\u53ea\u8fd9\u4e2a\u8868\u9762",AllSidesOfThisCuboid:"\u8fd9\u4e2a\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",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",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",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",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",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",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",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",AllWindows:"\u6240\u6709\u7684\u7a97\u6237",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Mullion:"\u76f4\u68c2",MullionWidth:"\u76f4\u68c2\u5bbd\u5ea6",MullionSpacing:"\u76f4\u68c2\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",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",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",EnableNavigation:"\u9032\u5165\u5bfc\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5bfc\u822a\u6a21\u5f0f",Move:"\u79fb\u52a8",MoveInstruction:"\u6309\u4e0bW/A/S/D/Z/X\u952e",Turn:"\u62d0\u5f2f",TurnInstruction:"\u6309\u4e0b\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:{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\u5df2\u7ecf\u590d\u5236\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:{SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyProjects:"\u6211\u7684\u9879\u76ee",GenerateProjectLink:"\u751f\u6210\u9879\u76ee\u94fe\u63a5",ProjectLinkGeneratedInClipBoard:"\u9879\u76ee\u94fe\u63a5\u5df2\u7ecf\u590d\u5236\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",clickToAccessCloudTools:"\u70b9\u51fb\u6253\u5f00\u4e91\u83dc\u5355"},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",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",AllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4",OnlyThisSide:"\u53ea\u9019\u500b\u8868\u9762",AllSidesOfThisCuboid:"\u9019\u500b\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",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",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",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",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",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",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",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",AllWindows:"\u6240\u6709\u7684\u7a97\u6236",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Mullion:"\u76f4\u6afa",MullionWidth:"\u76f4\u6afa\u5bec\u5ea6",MullionSpacing:"\u76f4\u6afa\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",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",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",EnableNavigation:"\u9032\u5165\u5c0e\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5c0e\u822a\u6a21\u5f0f",Move:"\u79fb\u52d5",MoveInstruction:"\u6309\u4e0bW/A/S/D/Z/X\u9375",Turn:"\u62d0\u5f4e",TurnInstruction:"\u6309\u4e0b\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:{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\u5df2\u7d93\u5fa9\u88fd\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:{SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyProjects:"\u6211\u7684\u9805\u76ee",GenerateProjectLink:"\u751f\u6210\u9805\u76ee\u93c8\u63a5",ProjectLinkGeneratedInClipBoard:"\u9805\u76ee\u93c8\u63a5\u5df2\u7d93\u5fa9\u88fd\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",clickToAccessCloudTools:"\u9ede\u64ca\u6253\u958b\u96f2\u83dc\u55ae"},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",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",AllCuboids:"Todos los cuboides",OnlyThisSide:"Solamente este lado",AllSidesOfThisCuboid:"Todos los lados en este cuboide",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",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",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",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",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",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",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",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",AllWindows:"All Windows",Width:"Ancho",Height:"Altura",Mullion:"Mullion",MullionWidth:"Mullion Width",MullionSpacing:"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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Haz clic para acceder a las herramientas en la nube"},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",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",AllCuboids:"T\xfcm K\xfcbikler",OnlyThisSide:"Sadece Se\xe7ili Y\xfczey",AllSidesOfThisCuboid:"Se\xe7ili K\xfcbik T\xfcm Y\xfczeyler",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",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",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",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",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",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",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",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",AllWindows:"T\xfcm Pencereler",Width:"Geni\u015flik",Height:"Y\xfckseklik",Mullion:"Tiriz",MullionWidth:"Tiriz Geni\u015fli\u011fi",MullionSpacing:"Tiriz Aral\u0131\u011f\u0131",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",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",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",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",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:{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:{SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project has been 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",clickToAccessCloudTools:"Bulut Ara\xe7lar\u0131na Eri\u015fmek \u0130\xe7in T\u0131klay\u0131n\u0131z"},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\u0443\u0442\u0438",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",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",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",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",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",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",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",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",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",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",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",AllWindows:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Mullion:"\u0420\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u0439 \u0441\u0442\u043e\u0432\u043f\u0435\u0446\u044c",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",MullionSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u043c\u0438 \u0441\u0442\u043e\u0432\u043f\u0446\u044f\u043c\u0438",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",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",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:"Enter 2D mode",Exit2DMode:"Exit 2D mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",Move:"Move",MoveInstruction:"Press W/A/S/D/Z/X keys",Turn:"Turn",TurnInstruction:"Press arrow keys",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:{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:{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 has been 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",clickToAccessCloudTools:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0441\u0442\u044c, \u0449\u043e\u0431 \u043e\u0442\u0440\u0438\u043c\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0445\u043c\u0430\u0440\u043d\u0438\u0445 \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0456\u0432"},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:"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:"\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,H,j,z,R,D,W,M,I,C,F,k,O,Y,L,N,U,E,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.dfa085ac.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),He=l(412),je=l(11),ze=l(40),Re=l(15),De=l(16),We=l(3),Me={type:"change"},Ie={type:"start"},Ce={type:"end"},Fe=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a){var o;Object(je.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 We.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:We.MOUSE.ROTATE,MIDDLE:We.MOUSE.DOLLY,RIGHT:We.MOUSE.PAN},o.touches={ONE:We.TOUCH.ROTATE,TWO:We.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,H=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(Me),i.update(),n=r.NONE},o.update=function(){var t=new We.Vector3,l=(new We.Quaternion).setFromUnitVectors(e.up,new We.Vector3(0,1,0)),a=l.clone().invert(),o=new We.Vector3,p=new We.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(Me),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 We.Spherical,d=new We.Spherical,u=1,f=new We.Vector3,h=!1,p=new We.Vector2,y=new We.Vector2,g=new We.Vector2,m=new We.Vector2,w=new We.Vector2,x=new We.Vector2,v=new We.Vector2,b=new We.Vector2,A=new We.Vector2,T=[],P={},S=!1,H=0;function j(){return Math.pow(.95,i.zoomSpeed)}function z(e){d.theta-=e}function R(e){d.phi-=e}var D=function(){var e=new We.Vector3;return function(t,l){e.setFromMatrixColumn(l,0),e.multiplyScalar(-t),f.add(e)}}(),W=function(){var e=new We.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)}}(),M=function(){var e=new We.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),W(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),W(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 We.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(Me)}}(),C=function(){var e=new We.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(Me)}}(),F=function(){var e=new We.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(Me)}}(),k=function(){var e=new We.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),Math.abs(Math.abs(e.z-H)-Math.PI)<.01&&(S=!S),S?e.x-=.01*t:e.x+=.01*t,e.x=Math.max(.1,e.x),H=e.z,l.quaternion.setFromEuler(e),i.dispatchEvent(Me)}}(),O=function(){var e=new We.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(Me)}}();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 N(e){p.set(e.clientX,e.clientY)}function U(e){m.set(e.clientX,e.clientY)}function E(){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),M(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 We.TOUCH.ROTATE:if(!1===i.enableRotate)return;E(),n=r.TOUCH_ROTATE;break;case We.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 We.TOUCH.DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;i.enableZoom&&J(),i.enablePan&&V(),n=r.TOUCH_DOLLY_PAN;break;case We.TOUCH.DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;i.enableZoom&&J(),i.enableRotate&&E(),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 We.MOUSE.DOLLY:if(!1===i.enableZoom)return;!function(e){v.set(e.clientX,e.clientY)}(e),n=r.DOLLY;break;case We.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;N(e),n=r.ROTATE}break;case We.MOUSE.PAN:if(e.ctrlKey||e.metaKey){if(!1===i.enableRotate)return;N(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(j()):A.y<0&&L(j()),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),M(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(j()):e.deltaY>0&&Y(j()),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:F(i.moveSpeed);break;case i.keys.MOVE_LEFT:F(-i.moveSpeed);break;case i.keys.ROTATE_UP:k(i.turnSpeed);break;case i.keys.ROTATE_DOWN:k(-i.turnSpeed);break;case i.keys.ROTATE_LEFT:O(-i.turnSpeed);break;case i.keys.ROTATE_RIGHT:O(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(je.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 We.Vector3,t=new We.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(je.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 We.Vector3,f=new We.Vector3,h=new We.Vector3,p=new We.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,H=0;H<=i;H++){var j=H/i;n=Math.cos(j*x),c=Math.sin(j*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,h=0;switch(e.type){case V.Cuboid:s=e.id;break;case V.Wall:s=e.parentId,h=e.ly;break;case V.Roof:s=e.parentId,h=e.thickness}var p=Xw.getState().actionState,y={showLeft:p.windowShutterLeft,showRight:p.windowShutterRight,color:p.windowShutterColor,width:p.windowShutterWidth};return{type:V.Window,cx:t,cy:l,cz:a,lx:d,ly:h,lz:u,shutter:y,mullion:p.windowMullion,mullionWidth:p.windowMullionWidth,mullionSpacing:p.windowMullionSpacing,mullionColor:p.windowMullionColor,frame:p.windowFrame,frameWidth:p.windowFrameWidth,sillWidth:Zm.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(f.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=Xw.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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=Xw.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(f.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(837),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},Ha=function(e){return e.viewState.panCenter2D},ja=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},Wa=function(e){return e.viewState.mapTilt},Ma=function(e){return e.viewState.mapType},Ia=function(e){return e.viewState.showSiteInfoPanel},Ca=function(e){return e.viewState.showDesignInfoPanel},Fa=function(e){return e.viewState.showInstructionPanel},ka=function(e){return e.viewState.showHeliodonPanel},Oa=function(e){return e.viewState.heliodonPanelX},Ya=function(e){return e.viewState.heliodonPanelY},La=function(e){return e.viewState.showMapPanel},Na=function(e){return e.viewState.mapPanelX},Ua=function(e){return e.viewState.mapPanelY},Ea=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},Ho=function(e){return e.viewState.yearlyHeliostatYieldPanelRect},jo=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},Wo=function(e){return e.viewState.showEvolutionPanel},Mo=function(e){return e.viewState.evolutionPanelRect},Io=function(e){return e.world.latitude},Co=function(e){return e.world.longitude},Fo=function(e){return e.world.date},ko=function(e){return e.world.leafDayOfYear1},Oo=function(e){return e.world.leafDayOfYear2},Yo=function(e){return e.world.ground},Lo=function(e){return e.world.address},No=function(e){return e.world.countryCode},Uo=function(e){return e.world.airAttenuationCoefficient},Eo=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},Hi=function(e){return e.hourlySolarPanelOutputArrayMap},ji=function(e){return e.setHourlySolarPanelOutputArray},zi=function(e){return e.getRoofSegmentVertices},Ri=function(e){return e.getRoofSegmentVerticesWithoutOverhang},Di=function(e){return e.changed},Wi=function(e){return e.setChanged},Mi=function(e){return e.setSkipChange},Ii=function(e){return e.applyCount},Ci=function(e){return e.setApplyCount},Fi=function(e){return e.revertApply},ki=function(e){return e.elements},Oi=function(e){return e.notes},Yi=function(e){return e.pvModules},Li=function(e){return e.loadPvModules},Ni=function(e){return e.getPvModule},Ui=function(e){return e.floatingWindowOpacity},Ei=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},Hr=function(e){return e.importContent},jr=function(e){return e.exportContent},zr=function(e){return e.clearContent},Rr=function(e){return e.createEmptyFile},Dr=function(e){return e.aabb},Wr=function(e){return e.animateSun},Mr=function(e){return e.animate24Hours},Ir=function(e){return e.runDailyThermalSimulation},Cr=function(e){return e.pauseDailyThermalSimulation},Fr=function(e){return e.runYearlyThermalSimulation},kr=function(e){return e.pauseYearlyThermalSimulation},Or=function(e){return e.clearDailySimulationResultsFlag},Yr=function(e){return e.clearYearlySimulationResultsFlag},Lr=function(e){return e.runDynamicSimulation},Nr=function(e){return e.runStaticSimulation},Ur=function(e){return e.pauseSimulation},Er=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.getSelectedElement},on=function(e){return e.overlapWithSibling},rn=function(e){return e.selectedSideIndex},nn=function(e){return e.setElementPosition},cn=function(e){return e.setElementSize},sn=function(e){return e.setElementNormal},dn=function(e){return e.updateAllElementLocks},un=function(e){return e.updateElementLockByFoundationId},fn=function(e){return e.updateElementLockByParentId},hn=function(e){return e.updateElementLockById},pn=function(e){return e.updateElementReferenceById},yn=function(e){return e.updateElementLabelById},gn=function(e){return e.updateElementShowLabelById},mn=function(e){return e.updateElementCxById},wn=function(e){return e.updateElementCyById},xn=function(e){return e.updateElementCzById},vn=function(e){return e.updateElementCzForAll},bn=function(e){return e.updateElementLxById},An=function(e){return e.updateElementLxAboveFoundation},Tn=function(e){return e.updateElementLxForAll},Pn=function(e){return e.updateElementLyById},Sn=function(e){return e.updateElementLyAboveFoundation},Hn=function(e){return e.updateElementLyForAll},jn=function(e){return e.updateElementLzById},zn=function(e){return e.updateElementLzForAll},Rn=function(e){return e.updateElementColorById},Dn=function(e){return e.updateElementColorOnSurface},Wn=function(e){return e.updateElementColorAboveFoundation},Mn=function(e){return e.updateElementColorForAll},In=function(e){return e.updateElementLineColorById},Cn=function(e){return e.updateElementLineColorOnSurface},Fn=function(e){return e.updateElementLineColorAboveFoundation},kn=function(e){return e.updateElementLineColorForAll},On=function(e){return e.updateElementLineWidthById},Yn=function(e){return e.updateElementLineWidthOnSurface},Ln=function(e){return e.updateElementLineWidthAboveFoundation},Nn=function(e){return e.updateElementLineWidthForAll},Un=function(e){return e.updateElementRotationById},En=function(e){return e.updateElementRotationForAll},Vn=function(e){return e.foundationActionScope},Jn=function(e){return e.setFoundationActionScope},Gn=function(e){return e.polygonActionScope},Xn=function(e){return e.setPolygonActionScope},Bn=function(e){return e.updatePolygonVertexPositionById},Kn=function(e){return e.updatePolygonVerticesById},qn=function(e){return e.cuboidActionScope},Qn=function(e){return e.setCuboidActionScope},Zn=function(e){return e.solarPanelActionScope},_n=function(e){return e.setSolarPanelActionScope},$n=function(e){return e.updateSolarCollectorDailyYieldById},ec=function(e){return e.updateSolarCollectorYearlyYieldById},tc=function(e){return e.updateSolarPanelTiltAngleById},lc=function(e){return e.updateSolarCollectorDrawSunBeamById},ac=function(e){return e.updateSolarCollectorDrawSunBeamAboveFoundation},oc=function(e){return e.updateSolarCollectorDrawSunBeamForAll},ic=function(e){return e.updateSolarCollectorRelativeAzimuthById},rc=function(e){return e.updateSolarCollectorRelativeAzimuthOnSurface},nc=function(e){return e.updateSolarCollectorRelativeAzimuthAboveFoundation},cc=function(e){return e.updateSolarCollectorRelativeAzimuthForAll},sc=function(e){return e.updateSolarCollectorPoleHeightById},dc=function(e){return e.updateSolarCollectorPoleHeightOnSurface},uc=function(e){return e.updateSolarCollectorPoleHeightAboveFoundation},fc=function(e){return e.updateSolarCollectorPoleHeightForAll},hc=function(e){return e.updateSolarCollectorPoleRadiusById},pc=function(e){return e.updateSolarCollectorPoleRadiusAboveFoundation},yc=function(e){return e.updateSolarCollectorPoleRadiusForAll},gc=function(e){return e.updateCspReflectanceById},mc=function(e){return e.updateCspReflectanceAboveFoundation},wc=function(e){return e.updateCspReflectanceForAll},xc=function(e){return e.updateParabolicCollectorAbsorptanceById},vc=function(e){return e.updateParabolicCollectorAbsorptanceAboveFoundation},bc=function(e){return e.updateParabolicCollectorAbsorptanceForAll},Ac=function(e){return e.updateParabolicCollectorOpticalEfficiencyById},Tc=function(e){return e.updateParabolicCollectorOpticalEfficiencyAboveFoundation},Pc=function(e){return e.updateParabolicCollectorOpticalEfficiencyForAll},Sc=function(e){return e.updateParabolicCollectorThermalEfficiencyById},Hc=function(e){return e.updateParabolicCollectorThermalEfficiencyAboveFoundation},jc=function(e){return e.updateParabolicCollectorThermalEfficiencyForAll},zc=function(e){return e.parabolicTroughActionScope},Rc=function(e){return e.setParabolicTroughActionScope},Dc=function(e){return e.fresnelReflectorActionScope},Wc=function(e){return e.setFresnelReflectorActionScope},Mc=function(e){return e.heliostatActionScope},Ic=function(e){return e.setHeliostatActionScope},Cc=function(e){return e.updateSolarReceiverById},Fc=function(e){return e.updateSolarReceiverAboveFoundation},kc=function(e){return e.updateSolarReceiverForAll},Oc=function(e){return e.parabolicDishActionScope},Yc=function(e){return e.setParabolicDishActionScope},Lc=function(e){return e.updateParabolaLatusRectumById},Nc=function(e){return e.updateParabolaLatusRectumAboveFoundation},Uc=function(e){return e.updateParabolaLatusRectumForAll},Ec=function(e){return e.updateModuleLengthById},Vc=function(e){return e.updateModuleLengthAboveFoundation},Jc=function(e){return e.updateModuleLengthForAll},Gc=function(e){return e.updateInsideLightById},Xc=function(e){return e.updateInsideLightsByParentId},Bc=function(e){return e.copyElementById},Kc=function(e){return e.removeElementById},qc=function(e){return e.removeElementsByType},Qc=function(e){return e.clearDeletedElements},Zc=function(e){return e.countElementsByReferenceId},_c=function(e){return e.removeElementsByReferenceId},$c=function(e){return e.removeAllChildElementsByType},es=function(e){return e.removeAllElementsOnFoundationByType},ts=function(e){return e.pasteElementsToPoint},ls=function(e){return e.pasteElementsByKey},as=function(e){return e.elementsToPaste},os=function(e){return e.selectMe},is=function(e){return e.selectNone},rs=function(e){return e.addElement},ns=function(e){return e.objectTypeToAdd},cs=function(e){return e.actionModeLock},ss=function(e){return e.countElementsByType},ds=function(e){return e.countSolarStructuresByType},us=function(e){return e.countObservers},fs=function(e){return e.countAllOffspringsByTypeAtOnce},hs=function(e){return e.countSolarPanelsOnRack},ps=function(e){return e.selectedElementAngle},ys=function(e){return e.waiting},gs=function(e){return e.simulationInProgress},ms=function(e){return e.simulationPaused},ws=function(e){return e.evolutionInProgress},xs=function(e){return e.evolutionPaused},vs=function(e){return e.contextMenuObjectType},bs=function(e){return e.enableFineGrid},As=function(e){return e.setEnableFineGrid},Ts=function(e){return e.showCloudFilePanel},Ps=function(e){return e.projectInfo},Ss=function(e){return e.projectView},Hs=function(e){return e.showProjectListPanel},js=function(e){return e.showModelsGallery},zs=function(e){return e.showAccountSettingsPanel},Rs=function(e){return e.showLikesPanel},Ds=function(e){return e.showPublishedModelsPanel},Ws=function(e){return e.weatherData},Ms=function(e){return e.loadWeatherData},Is=function(e){return e.getWeather},Cs=function(e){return e.loadHorizontalSolarRadiationData},Fs=function(e){return e.getHorizontalSolarRadiation},ks=function(e){return e.loadVerticalSolarRadiationData},Os=function(e){return e.getVerticalSolarRadiation},Ys=function(e){return e.getClosestCity},Ls=function(e){return e.sunlightDirection},Ns=function(e){return e.setSunlightDirection},Us=function(e){return e.showSolarRadiationHeatmap},Es=function(e){return e.showHeatFluxes},Vs=function(e){return e.runSolarPanelVisibilityAnalysis},Js=function(e){return e.solarPanelVisibilityResults},Gs=function(e){return e.runDailySimulationForSolarPanels},Xs=function(e){return e.runDailySimulationForSolarPanelsLastStep},Bs=function(e){return e.runYearlySimulationForSolarPanels},Ks=function(e){return e.runYearlySimulationForSolarPanelsLastStep},qs=function(e){return e.pauseDailySimulationForSolarPanels},Qs=function(e){return e.pauseYearlySimulationForSolarPanels},Zs=function(e){return e.dailyPvYield},_s=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyPvIndividualOutputs},$s=function(e){return e.setDailyPvYield},ed=function(e){return e.yearlyPvYield},td=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyPvIndividualOutputs},ld=function(e){return e.setYearlyPvYield},ad=function(e){return e.solarPanelLabels},od=function(e){return e.setSolarPanelLabels},id=function(e){return e.setTotalBuildingHeater},rd=function(e){return e.setTotalBuildingAc},nd=function(e){return e.setTotalBuildingSolarPanel},cd=function(e){return e.runDailySimulationForParabolicTroughs},sd=function(e){return e.runYearlySimulationForParabolicTroughs},dd=function(e){return e.pauseDailySimulationForParabolicTroughs},ud=function(e){return e.pauseYearlySimulationForParabolicTroughs},fd=function(e){return e.dailyParabolicTroughYield},hd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicTroughIndividualOutputs},pd=function(e){return e.setDailyParabolicTroughYield},yd=function(e){return e.yearlyParabolicTroughYield},gd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicTroughIndividualOutputs},md=function(e){return e.setYearlyParabolicTroughYield},wd=function(e){return e.parabolicTroughLabels},xd=function(e){return e.setParabolicTroughLabels},vd=function(e){return e.runDailySimulationForFresnelReflectors},bd=function(e){return e.runYearlySimulationForFresnelReflectors},Ad=function(e){return e.pauseDailySimulationForFresnelReflectors},Td=function(e){return e.pauseYearlySimulationForFresnelReflectors},Pd=function(e){return e.dailyFresnelReflectorYield},Sd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyFresnelReflectorIndividualOutputs},Hd=function(e){return e.setDailyFresnelReflectorYield},jd=function(e){return e.yearlyFresnelReflectorYield},zd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyFresnelReflectorIndividualOutputs},Rd=function(e){return e.setYearlyFresnelReflectorYield},Dd=function(e){return e.fresnelReflectorLabels},Wd=function(e){return e.setFresnelReflectorLabels},Md=function(e){return e.runDailySimulationForHeliostats},Id=function(e){return e.runYearlySimulationForHeliostats},Cd=function(e){return e.pauseDailySimulationForHeliostats},Fd=function(e){return e.pauseYearlySimulationForHeliostats},kd=function(e){return e.dailyHeliostatYield},Od=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyHeliostatIndividualOutputs},Yd=function(e){return e.setDailyHeliostatYield},Ld=function(e){return e.yearlyHeliostatYield},Nd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyHeliostatIndividualOutputs},Ud=function(e){return e.setYearlyHeliostatYield},Ed=function(e){return e.heliostatLabels},Vd=function(e){return e.setHeliostatLabels},Jd=function(e){return e.runDailySimulationForUpdraftTower},Gd=function(e){return e.runYearlySimulationForUpdraftTower},Xd=function(e){return e.pauseDailySimulationForUpdraftTower},Bd=function(e){return e.pauseYearlySimulationForUpdraftTower},Kd=function(e){return e.dailyUpdraftTowerResults},qd=function(e){return e.dailyUpdraftTowerYield},Qd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyUpdraftTowerIndividualOutputs},Zd=function(e){return e.setDailyUpdraftTowerResults},_d=function(e){return e.setDailyUpdraftTowerYield},$d=function(e){return e.yearlyUpdraftTowerYield},eu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyUpdraftTowerIndividualOutputs},tu=function(e){return e.setYearlyUpdraftTowerYield},lu=function(e){return e.updraftTowerLabels},au=function(e){return e.setUpdraftTowerLabels},ou=function(e){return e.runDailySimulationForParabolicDishes},iu=function(e){return e.runYearlySimulationForParabolicDishes},ru=function(e){return e.pauseDailySimulationForParabolicDishes},nu=function(e){return e.pauseYearlySimulationForParabolicDishes},cu=function(e){return e.dailyParabolicDishYield},su=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicDishIndividualOutputs},du=function(e){return e.setDailyParabolicDishYield},uu=function(e){return e.yearlyParabolicDishYield},fu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicDishIndividualOutputs},hu=function(e){return e.setYearlyParabolicDishYield},pu=function(e){return e.parabolicDishLabels},yu=function(e){return e.setParabolicDishLabels},gu=function(e){return e.runDailyLightSensor},mu=function(e){return e.pauseDailyLightSensor},wu=function(e){return e.runYearlyLightSensor},xu=function(e){return e.pauseYearlyLightSensor},vu=function(e){return e.dailyLightSensorData},bu=function(e){return e.setDailyLightSensorData},Au=function(e){return e.yearlyLightSensorData},Tu=function(e){return e.setYearlyLightSensorData},Pu=function(e){return e.sensorLabels},Su=function(e){return e.setSensorLabels},Hu=function(e){return e.hoveredHandle},ju=function(e){return e.moveHandleType},zu=function(e){return e.resizeHandleType},Ru=function(e){return e.getResizeHandlePosition},Du=function(e){return e.rotateHandleType},Wu=function(e){return e.resizeAnchor},Mu=function(e){return e.isAddingElement},Iu=function(e){return e.addedFoundationId},Cu=function(e){return e.deletedFoundationId},Fu=function(e){return e.addedCuboidId},ku=function(e){return e.deletedCuboidId},Ou=function(e){return e.addedWallId},Yu=function(e){return e.deletedWallId},Lu=function(e){return e.deletedRoofId},Nu=function(e){return e.autoDeletedRoof},Uu=function(e){return e.autoDeletedChild},Eu=function(e){return e.groupActionMode},Vu=function(e){return e.groupMasterId},Ju=function(e){return e.groupActionUpdateFlag},Gu=function(e){return e.addedWindowId},Xu=function(e){return e.addedDoorId},Bu=function(e){return e.updateWallMapOnFoundationFlag},Ku=function(e){return e.wallActionScope},qu=function(e){return e.roofActionScope},Qu=function(e){return e.windowActionScope},Zu=function(e){return e.doorActionScope},_u=function(e){return e.setRoofActionScope},$u=function(e){return e.updateWallLeftJointsById},ef=function(e){return e.updateWallRightJointsById},tf=function(e){return e.updateWallLeftPointById},lf=function(e){return e.updateRoofStructureById},af=function(e){return e.economicsParams},of=function(e){return e.fittestIndividualResults},rf=function(e){return e.setFittestIndividualResults},nf=function(e){return e.variableLabels},cf=function(e){return e.setVariableLabels},sf=function(e){return e.evolutionaryAlgorithmState},df=function(e){return e.solarPanelArrayLayoutConstraints},uf=function(e){return e.geneticAlgorithmWizardSelectedTab},ff=function(e){return e.particleSwarmOptimizationWizardSelectedTab},hf=function(e){return e.setPrimitiveStore},pf=l(0),yf=n.a.memo((function(e){var t=e.hx,l=e.hy,a=e.hz,i=e.position,n=e.rotation,c=Xw(bs),s=Xw(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(pf.jsxs)("group",{position:null!==i&&void 0!==i?i:[0,0,a+.01],rotation:n,children:[b.map((function(e){return Object(pf.jsx)(Jl.a,{points:[[e,-l,0],[e,l,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)})),A.map((function(e){return Object(pf.jsx)(Jl.a,{points:[[-t,e,0],[t,e,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)}))]})})),gf=function(e){var t=e.x,l=e.z,a=e.handleType,o=e.scale,i=void 0===o?[1,1,1]:o,n=Xw(si),c=Xw(zu),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(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:h})})},mf=n.a.memo(gf),wf=function(e){var t=e.handleType,l=Xw(ju),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(pf.jsx)(Lt.h,{ref:a,name:t,args:[.1,6,6],onPointerEnter:function(){c("red")},onPointerLeave:function(){null===l&&c("white")},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},xf=n.a.memo(wf),vf=l(166),bf=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:W.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}})),Af=y()((function(e,t){return{roofSegmentVerticesMap:new Map,setRoofSegmentVertices:function(t,l){e((function(e){e.roofSegmentVerticesMap.set(t,Object(f.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(f.a)(t)}))},yearlyLightSensorData:[],setYearlyLightSensorData:function(t){e((function(e){e.yearlyLightSensorData=Object(f.a)(t)}))},sensorLabels:[],setSensorLabels:function(t){e((function(e){e.sensorLabels=Object(f.a)(t)}))},dailyPvYield:[],setDailyPvYield:function(t){e((function(e){e.dailyPvYield=Object(f.a)(t)})),bf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumDailyPvYield:function(){var e,t=0,l=Object(h.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=Ww.countAllSolarPanels();return e*Xw.getState().economicsParams.electricitySellingPrice-t*Xw.getState().economicsParams.operationalCostPerUnit},yearlyPvYield:[],setYearlyPvYield:function(t){e((function(e){e.yearlyPvYield=Object(f.a)(t)})),bf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumYearlyPvYield:function(){var e,t,l,a=0,o=Object(h.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=Xw.getState().world)||void 0===t?void 0:t.daysPerYear)&&void 0!==e?e:6))},getYearlyPvProfit:function(){var e=Ww.countAllSolarPanels();return this.sumYearlyPvYield()*Xw.getState().economicsParams.electricitySellingPrice-e*Xw.getState().economicsParams.operationalCostPerUnit*365},solarPanelLabels:[],setSolarPanelLabels:function(t){e((function(e){e.solarPanelLabels=Object(f.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(f.a)(t)}))},sumDailyParabolicDishYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyParabolicDishYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyParabolicTroughYield:[],setDailyParabolicTroughYield:function(t){e((function(e){e.dailyParabolicTroughYield=Object(f.a)(t)}))},sumDailyParabolicTroughYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyParabolicTroughYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyFresnelReflectorYield:[],setDailyFresnelReflectorYield:function(t){e((function(e){e.dailyFresnelReflectorYield=Object(f.a)(t)}))},sumDailyFresnelReflectorYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyFresnelReflectorYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyHeliostatYield:[],setDailyHeliostatYield:function(t){e((function(e){e.dailyHeliostatYield=Object(f.a)(t)}))},sumDailyHeliostatYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyHeliostatYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},dailyUpdraftTowerResults:[],dailyUpdraftTowerYield:[],setDailyUpdraftTowerResults:function(t){e((function(e){e.dailyUpdraftTowerResults=Object(f.a)(t)}))},setDailyUpdraftTowerYield:function(t){e((function(e){e.dailyUpdraftTowerYield=Object(f.a)(t)}))},sumDailyUpdraftTowerYield:function(){var e,t=0,l=Object(h.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(f.a)(t)}))},sumYearlyUpdraftTowerYield:function(){var e,t=0,l=Object(h.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(f.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()}))}}})),Tf="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC",Pf=l.p+"static/media/roof_01.1418beb1.png",Sf=l.p+"static/media/roof_02.055d6e06.png",Hf=l.p+"static/media/roof_03.1d45e089.png",jf=l.p+"static/media/roof_04.20dee2dd.png",zf=l.p+"static/media/roof_05.34757ec1.png",Rf=l.p+"static/media/roof_06.0fce42da.png",Df=l.p+"static/media/roof_07.d0b809f8.png",Wf=new We.MeshStandardMaterial({color:"white",side:We.FrontSide}),Mf=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.spacingX,h=l.spacingY,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(pf.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 We.EllipseCurve(0,l-a,a,a,o,r,!1,0).getPoints(24).map((function(e){return new We.Vector3(e.x,e.y)}));return new We.CatmullRomCurve3(n)},v=Object(r.useMemo)((function(){var e=[],t=Math.round(i/f)-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(pf.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(pf.jsxs)(pf.Fragment,{children:[T(s,0),T(m,g),T(m,-g)]})]})})),If=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),h=l.color,p=l.width,y=l.sillWidth,g=Object(r.useMemo)((function(){return Object(pf.jsx)("meshStandardMaterial",{color:h})}),[h]),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)),h=Math.PI-u,y=n-c,g=new We.EllipseCurve(0,r,a,a,o,i,!1,0).getPoints(36),m=new We.EllipseCurve(0,y,c,c,h,u,!0,0).getPoints(36);return new We.Shape([].concat(Object(f.a)(g),Object(f.a)(m)))}),[c,n,i,p]);return Object(pf.jsxs)("group",{name:"Window Frame Group",position:[0,-w/2,0],children:[d>.1?Object(pf.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(pf.jsx)(Lt.a,{position:[0,0,n/2],args:[i+2*p,w,p],castShadow:a,receiveShadow:a,children:g}),Object(pf.jsx)(Lt.a,{position:[-i/2-m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(pf.jsx)(Lt.a,{position:[i/2+m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(pf.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})]})})),Cf=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 We.EllipseCurve(0,e-l,l,l,a,o,!1,0).getPoints(24).map((function(e){return new We.Vector3(e.x,e.y)}));return new We.CatmullRomCurve3(i)},A=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:f})}),[f]),T=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:yt})}),[]),P=function(e,t){return Object(pf.jsxs)(pf.Fragment,{children:[v>.1?Object(pf.jsx)(Lt.e,{position:[0,0,c/2-v],rotation:[vt,0,0],args:[(l=e,(new We.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(pf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,x-e/2],material:t}),o&&Object(pf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,-x],material:t}),Object(pf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[w,0,-v/2],material:t}),Object(pf.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(pf.jsxs)("group",{name:"Window Wireframe Group",children:[y>0&&Object(pf.jsx)("group",{position:[0,t,0],children:P(g,A)}),p&&h&&P(m,T)]})})),Ff=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.shutter,f=e.glassMaterial,h=e.showHeatFluxes,p=e.area,y=e.empty,g=e.interior,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Xw(o.shadowEnabled),T=Af(Ai),P=Object(r.useRef)(0),S=Object(r.useRef)(),H=Object(u.a)(l,4),j=H[0],z=H[1],R=H[2],D=H[3],W=Object(u.a)(a,3),M=(W[0],W[1]),I=(W[2],function(e,t){if(D>0){var l=.5*j,a=.5*R,o=Math.min(D,R,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(R-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 We.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},Of=n.a.memo(Ff),Yf=new We.MeshStandardMaterial({color:"white",side:We.DoubleSide}),Lf=new We.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(pf.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 We.Vector3(m,-w),t=new We.Vector3(m,w),l=new We.Vector3(-m,w),a=new We.Vector3(-m,-w);return[e,t,new We.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(pf.jsxs)("group",{name:"Window Frame Group",position:[0,-x/2,0],children:[Object(pf.jsx)(Lt.e,{position:[0,x/2,0],rotation:[vt,0,0],args:[P,{steps:1,depth:x,bevelEnabled:!1}],children:g}),Object(pf.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})]})})),Uf=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.shutter,y=e.area,g=e.showHeatFluxes,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Af(Ai),T=Object(r.useRef)(0),P=Object(r.useRef)(),S=Object(u.a)(i,3),H=(S[0],S[1]),j=(S[2],Object(u.a)(l,3)),z=j[0],R=j[1],D=j[2],W=l.map((function(e){return e/2})),M=Object(u.a)(W,3),I=M[0],C=M[1],F=M[2],k=Object(u.a)(a,2),O=k[0],Y=k[1],L=f.lineWidth,N=f.lineColor,U=f.selected,E=f.locked,V=(f.opacity,O*z),J=Math.hypot(Y,I-V),G=Math.asin(Y/J),X=Math.hypot(Y,I+V),B=-Math.asin(Y/X),K=Xw(o.shadowEnabled),q=function(e,t){var l=.5*z,o=.5*(D+a[1]),i=a[1],r=[{x:-l,y:-o},{x:l,y:-o},{x:l,y:o-i},{x:z*a[0],y:o},{x:-l,y:o-i}];return Ww.isPointInside(e,t,r)},Q=Object(r.useMemo)((function(){var e;if(g&&!d&&(!m||!m.notBuilding)){var l=A.get(t);if(l){var o=l.reduce((function(e,t){return e+t}),0);if(0!==y){var i=4*(null!==(e=w.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),r=D+a[1],n=Math.max(2,Math.round(z/i)),c=Math.max(2,Math.round(r/i)),s=z/n,u=r/c,f=o/y*(null!==x&&void 0!==x?x:_e);T.current=f<0?1:0,P.current=Ww.getEuler(Rt,jt,"YXZ",Math.sign(f)*vt);var h=[],p=a[1]/2;if(f<0)for(var v=0;v1&&void 0!==arguments[1]?arguments[1]:0;return Object(pf.jsx)(Lt.d,{args:[te,te,e,3,1],position:[t,le,0],rotation:[0,0,vt],material:ee})},oe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object(pf.jsx)(Lt.f,{args:[e,R],position:[t,0,0],material:Yf,receiveShadow:K,castShadow:K})};return Object(pf.jsxs)(pf.Fragment,{children:[!s&&Object(pf.jsxs)("mesh",{name:"Triangle Glass Plane",position:[0,H,0],rotation:[vt,0,0],children:[Object(pf.jsx)("shapeBufferGeometry",{args:[$]}),c]}),h.showFrame&&Object(pf.jsx)(Nf,{dimension:l,polygonTop:a,frameData:h,shadowEnabled:K}),Object(pf.jsx)(qg,{cx:_,lx:Z,lz:D,color:p.color,showLeft:p.showLeft,showRight:p.showRight,spacing:h.showFrame?h.width/2:0}),Object(pf.jsxs)("group",{position:[0,C,.001-F],children:[oe(z),ae(z)]}),Object(pf.jsxs)("group",{position:[.001-I,C,0],rotation:[0,vt,0],children:[oe(D),ae(D)]}),Object(pf.jsxs)("group",{position:[I-.001,C,0],rotation:[0,-vt,0],children:[oe(D),ae(D)]}),Object(pf.jsxs)("group",{position:[.001-I,C,F-.01],rotation:[0,B,0],children:[oe(X,X/2),ae(X,X/2)]}),Object(pf.jsxs)("group",{position:[I-.001,C,F-.01],rotation:[0,G,0],children:[oe(J,-J/2),ae(J,-J/2)]}),Q&&Q.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==b&&void 0!==b?b:et,color:null!==v&&void 0!==v?v:$e}),";",Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[T.current].clone().add(new We.Vector3(0,0===T.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=P.current)&&void 0!==l?l:[0,0,0],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==v&&void 0!==v?v:$e})})]},t)}))]})},Ef=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 We.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},Vf=n.a.memo(Uf),Jf=function(e){var t=e.id,l=e.index,a=e.foundationModel,i=e.roofType,c=e.segment,s=e.centroid,d=e.thickness,f=e.color,p=e.sideColor,y=e.texture,g=e.heatmap,m=e.windows,w=Xw(tn),x=bf(Es),v=Xw(o.heatFluxScaleFactor),b=Xw(o.heatFluxColor),A=Xw(o.heatFluxWidth),T=Af(Ri),P=Lp(),S=P.transparent,H=P.opacity,j=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(r.useRef)(),D=Xw.getState().world,W=Af.getState().hourlyHeatExchangeArrayMap,M=c.points,I=Object(r.useMemo)((function(){if(x){var e=T(t);if(e){var l=[],a=new We.Vector3(0,0,d+.1);switch(i){case It.Hip:case It.Pyramid:var o,r=Object(h.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 f,p=Object(h.a)(e.entries());try{for(p.s();!(f=p.n()).done;){var y=Object(u.a)(f.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(h.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 H=[];H.push(S[0].clone().sub(s).add(a)),H.push(S[1].clone().sub(s).add(a)),l.push(H)}var j=[];j.push(S[0].clone().sub(s).add(a)),j.push(S[3].clone().sub(s).add(a)),l.push(j),(j=[]).push(S[1].clone().sub(s).add(a)),j.push(S[2].clone().sub(s).add(a)),l.push(j)}}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=W.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)(M,5),c=n[0],d=(n[1],n[2],n[3],n[4].z-c.z),f=r[l].map((function(e){return e.clone().sub(s).add(new We.Vector3(0,0,d))}));if(f){var p,y=[],g=Object(h.a)(f);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=f[0].clone(),P=f[1].clone(),S=f[2].clone(),H=(new We.Vector3).subVectors(P,A),I=(new We.Vector3).subVectors(S,A),C=(new We.Vector3).subVectors(S,P),F=H.length(),k=(new We.Vector3).crossVectors(I,C).length()/F,O=Math.max(2,Math.floor(F/b)),Y=Math.max(2,Math.floor(k/b));H.normalize(),I.normalize(),C.normalize();var L=(new We.Vector3).crossVectors(I,C).normalize(),N=H.multiplyScalar(.5*F/O),U=(new We.Vector3).crossVectors(L,H).normalize().multiplyScalar(.5*k/Y),E=A.clone().add(N).add(U);N.multiplyScalar(2),U.multiplyScalar(2),z.current=L.clone().multiplyScalar(.1);var J=[],G=new We.Vector3,X=4===f.length?Ww.getTriangleArea(f[0],f[1],f[2])+Ww.getTriangleArea(f[2],f[3],f[0]):Ww.getTriangleArea(f[0],f[1],f[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 Zm.onSegment(K[l],e.cx,a)}))),B&&B.length>0){var q,Q=Object(h.a)(B);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;X-=Ww.getWindowArea(Z)}}catch(ue){Q.e(ue)}finally{Q.f()}}var _,$=i/X*(null!==v&&void 0!==v?v:_e);j.current=$<0?1:0,R.current=Ww.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(h.a)(B);try{for(re.s();!(ae=re.n()).done;){var ne=ae.value,ce=Zm.getRelativeWindowVerticesOnRoof(ne),se=Ww.getPoints(ce);if(Ww.isPointInside(oe,ie,se)){_=!1;break}}}catch(ue){re.e(ue)}finally{re.f()}}if(_&&Ww.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Gf,{id:t,index:l,segment:c,color:f,sideColor:p,texture:y,heatmap:g,transparent:S,opacity:H,windows:m,centroid:s}),I&&I.map((function(e,t){return Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:z.current?e[j.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==b&&void 0!==b?b:$e})})]},t)}))]})},Gf=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=Xw(o.shadowEnabled),x=bf(Us),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 We.Vector3(e.lx,e.lz,2*e.ly),l=new We.Vector3(e.cx,e.cy,e.cz).sub(m),a=(new We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"]));if(e.windowType===Yt.Polygonal){var o,i=null!==(o=e.polygonTop)&&void 0!==o?o:Zg,r=Object(u.a)(i,2),n=r[0],c=r[1],s=t.x/2,d=t.y/2,h=n*t.x,p=Ef(s,d,h,c),y=new We.Mesh(new We.ExtrudeBufferGeometry([p],{steps:1,depth:t.z,bevelEnabled:!1})),g=new We.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=kf(t.x,t.y,e.archHeight),x=new We.Mesh(new We.ExtrudeBufferGeometry([w],{steps:1,depth:t.z,bevelEnabled:!1})),v=new We.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 We.Mesh(new We.BoxBufferGeometry(t.x,t.y,t.z));return b.position.copy(l),b.rotation.copy(a),b.updateMatrix(),b}))}),[g,m]),H=null!==(t=z())&&void 0!==t?t:6,j=Object(r.useMemo)((function(){return Array(H).fill(0)}),[H]);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 We.Vector3).subVectors(o,a),n=r.length(),c=(new We.Vector3).subVectors(i,a),s=new We.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],H=s[2].equals(A);if(x)X(H);else{var j=(new We.Vector3).subVectors(m,y),z=(new We.Vector3).subVectors(w,y),D=(new We.Vector3).subVectors(A,y),W=new We.Vector2(m.x-y.x,m.y-y.y).length(),M=W,I=j.dot(z)/W,C=j.clone().cross(z).length()/W,F=j.dot(D)/W,k=j.clone().cross(D).length()/W;H?(l.push(0,0,M,0,F,k),l.push(M,0,I,C,F,k)):(l.push(0,0,M,0,I,C),l.push(0,0,I,C,F,k))}B(6);var O=R(b.slice(0,b.length/2)),Y=Object(u.a)(O,2),L=Y[0],N=Y[1];G(L.reverse()),G(N.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 We.Float32BufferAttribute(t,3)),e.setAttribute("uv",new We.Float32BufferAttribute(l,2)),e.computeVertexNormals(),e.computeBoundingSphere(),g.length>0){for(var U=[],E=0;E0&&void 0!==arguments[0]&&arguments[0],t=(new We.Vector3).subVectors(b[1],b[0]),a=t.length();t.normalize();var o=(new We.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 We.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(h.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(f.a)(p)),t.push.apply(t,Object(f.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=Ww.distanceFromPointToLine2D(i,l,a),n=Ww.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(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:A,transparent:p,opacity:y})},W=function(){return Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:n,map:A,transparent:p,opacity:y})},M=function(){return Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:c,transparent:p,opacity:y})},I=w&&!x;return Object(pf.jsx)("mesh",{ref:v,name:"Buffer Roof Segment ".concat(a),uuid:l+"-"+a,userData:{simulation:!0},receiveShadow:I,castShadow:I,frustumCulled:!1,children:j.map((function(e,t){return 0!==t?Object(pf.jsx)(M,{},"side"+t):x?Object(pf.jsx)(D,{},"heatmap"+t):Object(pf.jsx)(W,{},"texture"+t)}))})})),Xf=n.a.memo(Jf),Bf=function(e){var t=e.cz,l=e.points,a=new We.Shape;a.moveTo(l[0].x,l[0].y);var o,i=Object(h.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(pf.jsx)(Lt.e,{scale:.99,position:[0,0,t],args:[a,{steps:1,depth:.1,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide,color:"white"})})},Kf=n.a.memo(Bf),qf=l(88);function Qf(e){return e.type===V.Foundation||e.type===V.Cuboid}var Zf=function(e,t){var l=e.id,a=e.cx,o=e.cy,i=e.lx,n=e.ly,c=e.lz,s=(e.selected,e.enableGroupMaster),d=Xw(Ju),p=Object(r.useRef)(new Set),y=Object(r.useRef)([]),g=Object(r.useRef)(new Set),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)([a,o,c/2]),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(0),H=Object(u.a)(S,2),j=H[0],z=H[1],R=e.type===V.Cuboid;Object(r.useEffect)((function(){t===l?(p.current.clear(),g.current.clear(),y.current=[],D(e),e.enableGroupMaster?(M(e),p.current.size>1?C():I()):I()):(P([a,o,0]),v(null),z(0))}),[t,d,s]);var D=function(e){var t,l=e.lx/2,a=e.ly/2,o=new We.Vector2,i=Ww.getWorldDataById(e.id),r=i.pos,n=i.rot,c=new We.Vector2(r.x,r.y),s=[new We.Vector2(l,a),new We.Vector2(-l,a),new We.Vector2(l,-a),new We.Vector2(-l,-a)].map((function(e){return e.rotateAround(o,n).add(c),{x:e.x,y:e.y}}));p.current.add(e.id),(t=y.current).push.apply(t,Object(f.a)(s))},W=function e(t){p.current.add(t.id),g.current.add(t.id);var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Cuboid||o.locked||o.parentId!==t.id||e(o)}}catch(i){a.e(i)}finally{a.f()}},M=function e(t){var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Qf(o)&&o.parentId===xt&&!o.locked&&!p.current.has(o.id))Ww.isChild(t.id,o.id,!0)?W(o):Ww.areTwoBasesOverlapped(o,t)&&(D(o),e(o))}}catch(i){a.e(i)}finally{a.f()}},I=function(){var t,l=R?0:3,r=l,s=new Map,d=Object(h.a)(Xw.getState().elements);try{for(d.s();!(t=d.n()).done;){var u=t.value;if(u.foundationId===(null===e||void 0===e?void 0:e.id)){if(u.type===V.Wall){var f,m=u;if(l=Math.max(l,m.lz),m.roofId)(null!==(f=s.get(m.roofId))&&void 0!==f?f:0)1){var b=Ww.calculatePolygonBounds(y.current),A=Ww.getWorldDataById(e.parentId),T=A.pos,S=A.topZ,H=new We.Vector3(b.x+b.width/2,b.y+b.height/2),j=(new We.Vector3).subVectors(H,T).setZ(0);v([b.width,b.height,r-S]),P(j.toArray()),z(0)}else P([a,o,0]),z(null===e||void 0===e?void 0:e.rotation[2]),v([i,n,l+c])},C=function(){var t,l=Ww.calculatePolygonBounds(y.current),a=R?0:1,o=c,i=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var n=t.value;if(n.foundationId&&p.current.has(n.foundationId)){if(n.type===V.Wall){var s,d=n;if(a=Math.max(a,d.lz),d.roofId)(null!==(s=i.get(d.roofId))&&void 0!==s?s:0)0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Zm.getWallHeight($,l),r=i.lh,n=i.rh;ee.current||(0===l&&(r=$[0].lz),l===$.length-1&&(n=$[$.length-1].lz));var c=Zm.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=Zm.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 We.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=Zm.getIntersectionPoint(ne[u-1].leftPoint,ne[u-1].rightPoint,ne[u].leftPoint,ne[u].rightPoint).setZ($[$.length-1].lz-t).sub(ie),h=Zm.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 We.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 We.Vector3).fromArray($[0].leftPoint));var t,l=Object(h.a)($);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new We.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(O.position.x-a,O.position.y-i)-ue;eh.set(oe.x,oe.y,ae),th.set(-vt,0,fe,"ZXY")}var pe=Bp();Object(r.useEffect)((function(){if(!pe){var e=Xw.getState().addedRoofId;if(e&&e===c&&$.length>=2&&function(e,t){if(e.length!==t.size)return!0;var l,a=Object(h.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 t=$.map((function(e){return e.id})),l=new Set(t);C((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof)i.id===c&&(i.wallsId=t);else if(i.type===V.Wall&&Z.has(i.id)&&!l.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()}}))}}}),[Z]),Object(r.useEffect)((function(){if($.length>1){var e=Xw.getState().addedRoofId;if(e&&e===c){for(var t=function(e){C((function(t){var l,a=Object(h.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()}}))},l=0;l<$.length;l++)t(l);Xw.getState().setAddedRoofId(null)}}else F(c,!1,!1,!0)}),[$]),qp(l,c,se,ie,ae,w);var ye=function(){if($.length<2)return!1;var e,t=$[0].lz,l=Object(h.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(h.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=bf(Us),Ae=Xw(o.solarRadiationHeatmapMaxValue),Te=Af(wi),Pe=Object(r.useState)([]),He=Object(u.a)(Pe,2),je=He[0],ze=He[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),Me=De[0],Ie=De[1],Ce=Xw(os),Fe=Jp(c,ie,se,xe,It.Pyramid);Object(r.useEffect)((function(){if(be)if(xe){var e=Te(c);if(e){var t=Ww.fetchHeatmapTexture(e,null!==Ae&&void 0!==Ae?Ae:5);if(t){var a=Fe();if(a&&a.length>0&&l){var o,i=new We.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(h.a)(a);try{for(u.s();!(o=u.n()).done;){var f,p=o.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.value.clone().applyEuler(i);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){var A=[];if(Fe()){for(var T=0;T0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var a=Zm.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 We.Vector3(l.leftPoint[0],l.leftPoint[1],o),n=new We.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 We.Vector3(d.rightPoint[0],d.rightPoint[1],d.lz),f=new We.Vector3(s.leftPoint[0],s.leftPoint[1],s.lz);e.push([u,f,ie.clone()])}if(xe){var p,y=[],g=Object(h.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()}Af.getState().setRoofSegmentVerticesWithoutOverhang(c,[y])}else Af.getState().setRoofSegmentVerticesWithoutOverhang(c,e)}));var ke=Xw((function(e){return e.elements.filter((function(e){return e.parentId===c&&e.type===V.Window}))}),qf.a),Oe=Qp(c,l,ie,se),Ye=d===he.Default||d===he.NoTexture?p:"white";return Object(pf.jsxs)("group",{name:"Pyramid Roof Group ".concat(c),children:[Object(pf.jsx)("group",{name:"Pyramid Roof Segments Group ".concat(c),userData:Oe,position:[oe.x,oe.y,ae],onPointerDown:function(e){Rp(e,l.id,c,se,ie)},onPointerMove:function(e){Wp(e,c)},onPointerUp:function(e){Dp(e,t)},onContextMenu:function(e){Mp(e,c)},children:xe?Object(pf.jsx)(ey,{id:c,foundationModel:l,roofType:P,roofSegments:se,center:ie,thickness:w,lineWidth:b,lineColor:T,sideColor:g,color:Ye,textureType:d,heatmap:Me}):Object(pf.jsxs)(pf.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(pf.jsx)("group",{name:"Roof segment ".concat(t),children:Object(pf.jsx)(Xf,{id:c,index:t,foundationModel:l,roofType:P,segment:e,centroid:ie,thickness:w,color:Ye,sideColor:g,texture:D,heatmap:je&&t0&&Object(pf.jsx)(Kf,{points:de,cz:$[0].lz}),W&&!x&&Object(pf.jsx)(Ip,{position:[oe.x,oe.y,ae+w+.15],onPointerDown:function(e){Ce(t.id,e,X.Select),G(!0),Nt.getState().setEnableOrbitController(!1),q.current=!0,Q.current=j,C((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ae+t.thickness}))},onPointerUp:function(){G(!1),Nt.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(pf.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){N.x=e.offsetX/Y.domElement.clientWidth*2-1,N.y=-e.offsetY/Y.domElement.clientHeight*2+1,L.setFromCamera(N,O)}(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);Xw.getState().updateRoofRiseById(c,i,ae+t.thickness)}}},onPointerUp:function(e){Sp(c,Q.current,j),G(!1),Nt.getState().setEnableOrbitController(!0),q.current=!1}})]})},rh=n.a.memo(ih,Fp),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(h.a)(Xw.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(h.a)(Xw.getState().elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===n.id){var f=d.cx,p=d.cz,y=d.lx,g=d.ly,m=d.lz;if(f*=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:Zg,v=Object(u.a)(x,2),b=v[0],A=v[1],T=f+b*y,P=p+m/2+A;if(!Ww.isPointInside(T,P,c))return!1}if(!Ww.isElementInsideWall(new We.Vector3(f,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 We.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(pf.jsx)(Jl.a,{points:i,lineWidth:a,color:o}),h=Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[c[0],c[1]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[c[2],c[3]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[s[2],s[3]],lineWidth:a,color:o})]});return Object(pf.jsxs)(pf.Fragment,{children:[f,!u&&h,Object(pf.jsxs)("group",{position:[0,0,l],children:[f,!u&&h]}),Object(pf.jsx)(Jl.a,{points:[n[0],n[0].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[n[1],n[1].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[d[0],d[0].clone().add(r)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[d[1],d[1].clone().add(r)],lineWidth:a,color:o})]})})),dh=new We.Vector3,uh=new We.Euler,fh=new We.Vector2,hh=new We.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,H=void 0===S?.2:S,j=t.locked,z=t.lineColor,R=void 0===z?"black":z,D=t.lineWidth,W=void 0===D?.2:D,M=t.roofType,I=t.rise,C=void 0===I?c:I,F=t.ceiling,k=void 0!==F&&F;void 0===m&&(m=p?Object(f.a)(p):[0,1]),void 0===w&&(w=y?Object(f.a)(y):[.35,.5]),void 0===x&&(x=g?Object(f.a)(g):[.35,.5]);var O=_f(a),Y=Zm.getWireframetStyle(R,W,O,j),L=Object(u.a)(Y,2);R=L[0],W=L[1];var N=Xw(si),U=Xw(Kc),E=Yp(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 We.Raycaster}),[]),ie=Object(r.useMemo)((function(){return new We.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){N((function(a){var o,i=Object(h.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(f.a)(l);break;case ge.TopLeft:case ge.TopRight:n.topRidgePoint=Object(f.a)(l);break;case ge.BackLeft:case ge.BackRight:n.backRidgePoint=Object(f.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(f.a)(l),newVal:Object(f.a)(a),type:t,undo:function(){de(o.resizedElementId,o.type,o.oldVal)},redo:function(){de(o.resizedElementId,o.type,o.newVal)}};Xw.getState().addUndoable(o)},fe=function(e,t){$(!0),Nt.getState().setEnableOrbitController(!1),dh.set(e.x,e.y,e.z).add(je),l&&t&&uh.set(vt,0,t.relativeAngle,"ZXY")},pe=function(e,t,l){var a=new We.Vector2(e.cx,e.cy),o=Zm.getComposedWallCenter(t),i=Zm.getComposedWallLength(t),r=new We.Vector2(o.x,o.y).rotateAround(fh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new We.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 We.Vector3;var o=Zm.getComposedWallLength(e),i=new We.Euler(0,0,e.relativeAngle),r=new We.Vector3(t*o,0,0),n=He;a&&(n=l*(He-a.lz)+a.lz);var c=Zm.getComposedWallCenter(e);return new We.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(h.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 We.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 We.Vector2(p(-i[0]),y(i[1],a)),new We.Vector2(p(r[0]),l),new We.Vector2(p(n[0]),y(n[1],o)),new We.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 We.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})),h=t[l],p=h.wallsId.reduce((function(e,t){var l=Xw.getState().elements.find((function(e){return e.id===t}));return l?[].concat(Object(f.a)(e),[l.lx+e[e.length-1]]):e}),[0]),y=0;y=w&&H<=x){var j=(H-T)/A,z=xe(d,H);null!==z&&(0===S?P.centerLeft=[j,z]:1===S?P.center=[j,z]:2===S&&(P.centerRight=[j,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=Up(s[0],d),Te=Ep(Ae,C,!0),Pe=Te.highestWallHeight,He=Te.topZ;Xp(t,Pe);var je=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.Vector3;var e=Ae.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Ww.calculatePolygonCentroid(e);return new We.Vector3(t.x,t.y,He)}),[Ae,He]),ze=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,m]),Re=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,m]),De=Object(r.useMemo)((function(){return(new We.Vector3).addVectors(ze,Re).divideScalar(2)}),[ze,Re]),Me=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,w]),Ie=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,w]),Ce=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,x]),Fe=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new We.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(je)}),[Ae,je,x]),ke=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):[]}),[Ae]),Oe=Object(r.useMemo)((function(){return hh.clone().multiplyScalar(H)}),[H]),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)(ke,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),H=[],j=me(Ae,0),z=j.lh,R=j.rh,D=Zm.getDistance(p,y,Me.clone().add(je)),W=Math.min((null!==(e=r.eavesLength)&&void 0!==e?e:0)/D*(Me.clone().add(je).z-z),z),M=Zm.getDistance(p,y,Ie.clone().add(je)),I=Math.min((null!==(t=r.eavesLength)&&void 0!==t?t:0)/M*(Ie.clone().add(je).z-R),R),C=Zm.getIntersectionPoint(v,b,w,x).setZ(z-W).sub(je),F=Zm.getIntersectionPoint(w,x,A,T).setZ(R-I).sub(je),k=Zm.getIntersectionPoint(Me,Ie,v.clone().sub(je),b.clone().sub(je)).setZ(Me.z),O=Zm.getIntersectionPoint(Ie,Me,A.clone().sub(je),T.clone().sub(je)).setZ(Ie.z);H.push(C,F,O,k),H.push(C.clone().add(Oe),F.clone().add(Oe),O.clone().add(Oe),k.clone().add(Oe));var Y=Zm.getComposedWallCenter(r),L=-r.relativeAngle,N=new We.Vector3(Y.x,Y.y).sub(De.clone().setZ(0)).length();o.push({points:H,angle:L,length:N});var U=[],E=Zm.getIntersectionPoint(ze,Re,v.clone().sub(je),b.clone().sub(je)).setZ(ze.z),V=Zm.getIntersectionPoint(ze,Re,A.clone().sub(je),T.clone().sub(je)).setZ(Re.z);U.push(k,O,V,E),U.push(k.clone().add(Oe),O.clone().add(Oe),V.clone().add(Oe),E.clone().add(Oe)),o.push({points:U,angle:L,length:N});var J=-n.relativeAngle,G=me(Ae,2),X=G.lh,B=G.rh,K=Zm.getDistance(g,m,Ce.clone().add(je)),q=Math.min((null!==(l=n.eavesLength)&&void 0!==l?l:0)/K*(Ce.clone().add(je).z-X),X),Q=Zm.getDistance(g,m,Fe.clone().add(je)),Z=Math.min((null!==(a=n.eavesLength)&&void 0!==a?a:0)/Q*(Fe.clone().add(je).z-B),B),_=Zm.getIntersectionPoint(A,T,P,S).setZ(X-q).sub(je),$=Zm.getIntersectionPoint(P,S,v,b).setZ(B-Z).sub(je),ee=Zm.getIntersectionPoint(Ce,Fe,A.clone().sub(je),T.clone().sub(je)).setZ(Fe.z),te=Zm.getIntersectionPoint(Fe,Ce,v.clone().sub(je),b.clone().sub(je)).setZ(Fe.z),le=Zm.getComposedWallCenter(n),ae=new We.Vector3(le.x,le.y).sub(De.clone().setZ(0)).length(),oe=[];oe.push(ee,te,E,V),oe.push(ee.clone().add(Oe),te.clone().add(Oe),E.clone().add(Oe),V.clone().add(Oe)),o.push({points:oe,angle:J,length:ae});var ie=[];return ie.push(_,$,te,ee),ie.push(_.clone().add(Oe),$.clone().add(Oe),te.clone().add(Oe),ee.clone().add(Oe)),o.push({points:ie,angle:J,length:ae}),o}),[Ae,He,H,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 Ne=Bp();Object(r.useEffect)((function(){if(4===(null===Ae||void 0===Ae?void 0:Ae.length)){var e=Xw.getState().addedRoofId;(e&&e===a||!Ne)&&(se?function(e){var t,l=new Set,a=Object(h.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()}N((function(e){var t,a=Object(h.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=He,r.rightRoofHeight=He,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);N((function(t){var l,o=Object(h.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,f=me(e,0),p=f.lh,y=f.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,H=v.centerRight;if(b.roofId=a,b.leftRoofHeight=A,b.rightRoofHeight=T,S){var j=Object(u.a)(S,2),z=j[0],R=j[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),W=D[0],M=D[1];b.centerRoofHeight?(b.centerRoofHeight[0]=W,b.centerRoofHeight[1]=M):b.centerRoofHeight=[W,M]}else b.centerRoofHeight=void 0;if(H){var I=Object(u.a)(H,2),C=I[0],F=I[1];b.centerRightRoofHeight?(b.centerRightRoofHeight[0]=C,b.centerRightRoofHeight[1]=F):b.centerRightRoofHeight=[C,F]}else b.centerRightRoofHeight=void 0}}}}catch(k){o.e(k)}finally{o.f()}}))}(Ae,He,w,m,x),zp(l,a,Ye,je,He,H,se),Xw.getState().setAddedRoofId(null))}}),[Ye]),Kp(l,a,Ye,je,He,H,se);var Ue=Jp(a,je,Ye,se,It.Gambrel);Gp((function(){var e=[];if(!Ae||4!==Ae.length)return e;var t=Ae.map((function(e,t,l){return new We.Vector3(e.leftPoint.x,e.leftPoint.y,me(l,t).lh)})),l=Me.clone().add(je),o=Ie.clone().add(je),i=Ce.clone().add(je),r=Fe.clone().add(je),n=ze.clone().add(je),c=Re.clone().add(je);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?Af.getState().setRoofSegmentVerticesWithoutOverhang(a,[t]):Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ee=Xw((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),qf.a),Ve=Xw(os),Je=bf(Us),Ge=Xw(o.solarRadiationHeatmapMaxValue),Xe=Af(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=Ww.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new We.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(h.a)(o);try{for(u.s();!(i=u.n()).done;){var f,p=i.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.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(pf.jsx)(Kf,{cz:Ae[0].lz,points:Le}),O&&!j&&Object(pf.jsxs)("group",{position:[je.x,je.y,je.z+H],children:[Object(pf.jsx)(Ip,{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,He).add(je),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),Nt.getState().setEnableOrbitController(!1),N((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=He+t.thickness}))},onPointerOver:function(){N((function(e){e.hoveredHandle=ge.TopMid,e.selectedElementHeight=He+t.thickness,e.selectedElementX=De.x,e.selectedElementY=De.y}))}}),!se&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Ip,{position:[ze.x,ze.y,ze.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(m),fe(ze,Ae[3]),q(ge.TopLeft)}}),Object(pf.jsx)(Ip,{position:[Re.x,Re.y,Re.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(m),fe(Re,Ae[1]),q(ge.TopRight)}}),Object(pf.jsx)(Ip,{position:[Me.x,Me.y,Me.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(w),fe(Me,Ae[3]),q(ge.FrontLeft)}}),Object(pf.jsx)(Ip,{position:[Ie.x,Ie.y,Ie.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(w),fe(Ie,Ae[1]),q(ge.FrontRight)}}),Object(pf.jsx)(Ip,{position:[Ce.x,Ce.y,Ce.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(x),fe(Ce,Ae[1]),q(ge.BackLeft)}}),Object(pf.jsx)(Ip,{position:[Fe.x,Fe.y,Fe.z],onPointerDown:function(){ce.current=!0,re.current=Object(f.a)(x),fe(Fe,Ae[3]),q(ge.BackRight)}})]})]}),_&&Object(pf.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)&&Xw.getState().updateRoofRiseById(a,r,n+t.thickness);break;case ge.FrontLeft:if(l&&Ae&&4===Ae.length){var s=Ww.clamp(pe(l,Ae[3],i),m[0]+.05,.45),u=He-Ae[0].lz,f=[s,Ww.clamp((i.z-l.lz-Ae[0].lz)/u,0,1)],h=be(Ae,He,f,m,x);ch(h,d)&&N((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=Ww.clamp(pe(l,Ae[1],i),-.45,-m[0]-.05),y=He-Ae[0].lz,g=[-p,Ww.clamp((i.z-l.lz-Ae[0].lz)/y,0,1)],v=be(Ae,He,g,m,x);ch(v,d)&&N((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=[Ww.clamp(pe(l,Ae[3],i),.05-x[0],w[0]-.05),m[1]],A=be(Ae,He,w,b,x);ch(A,d)&&N((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=[-Ww.clamp(pe(l,Ae[1],i),.05-w[0],x[0]-.05),m[1]],P=be(Ae,He,w,T,x);ch(P,d)&&N((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=Ww.clamp(pe(l,Ae[1],i),.05-m[0],.45),H=He-Ae[2].lz,j=[S,Ww.clamp((i.z-l.lz-Ae[2].lz)/H,0,1)],z=be(Ae,He,w,m,j);ch(z,d)&&N((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(j))}))}break;case ge.BackRight:if(l&&Ae&&4===Ae.length){var R=Ww.clamp(pe(l,Ae[3],i),-.45,m[0]-.05),D=He-Ae[2].lz,W=[-R,Ww.clamp((i.z-l.lz-Ae[2].lz)/D,0,1)],M=be(Ae,He,w,m,W);ch(M,d)&&N((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(W))}))}}}}},onPointerUp:function(){switch(B){case ge.TopMid:Sp(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),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:.5})})]}):null},yh=n.a.memo(ph,Fp),gh=new We.Vector3,mh=new We.Euler,wh=new We.Vector2,xh=new We.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 We.Vector2(t.x,t.y)}),[t]),s=Object(r.useMemo)((function(){return new We.Vector2(l.x,l.y)}),[l]),d=Object(r.useMemo)((function(){return(new We.Vector2).subVectors(s,c).angle()}),[c,s]),u=Object(r.useMemo)((function(){var e=new We.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(pf.jsx)("group",{position:i,children:Object(pf.jsx)(Lt.e,{args:[u,{steps:1,depth:a,bevelEnabled:!1}],position:t,rotation:[vt,0,d,"ZXY"],castShadow:!0,receiveShadow:!0,children:Object(pf.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 We.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 We.Vector3).subVectors(new We.Vector3(h.rightPoint.x,h.rightPoint.y,h.lz),v).normalize(),o=(new We.Vector3).subVectors(new We.Vector3(y.leftPoint.x,y.leftPoint.y,y.lz),b).normalize(),i=t.distanceTo(l),r=(new We.Vector3).subVectors(h.leftPoint,h.rightPoint).length(),n=(new We.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 We.Vector3).subVectors(p,f).normalize().multiplyScalar(null!==(r=h.eavesLength)&&void 0!==r?r:0),x=(new We.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 We.Vector3(-c,0,0),S=new We.Vector3(0,c/2,0);return Object(pf.jsxs)(pf.Fragment,{children:[A.map((function(e,t){return Object(pf.jsx)(n.a.Fragment,{children:i?T?Object(pf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}):Object(pf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d}):Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}),Object(pf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d,offset:P})]})},t)})),Object(pf.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 We.Vector3(0,0,l),c=1===t.length,s=Object(h.a)(t);try{for(s.s();!(i=s.n()).done;){var d=i.value,f=Object(u.a)(d.points,4),p=f[0],y=f[1],g=f[2],m=f[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(pf.jsx)(Jl.a,{points:r,lineWidth:a,color:o}),A=Object(pf.jsx)(Jl.a,{points:[x,v],lineWidth:a,color:o});return Object(pf.jsxs)(pf.Fragment,{children:[b,!w&&!c&&A,Object(pf.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(pf.jsxs)("group",{children:[Object(pf.jsx)(Jl.a,{points:[i,i.clone().add(n)],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[r,r.clone().add(n)],lineWidth:a,color:o}),c&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[s,s.clone().add(n)],lineWidth:a,color:o}),Object(pf.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,H=t.lineWidth,j=void 0===H?.2:H,z=t.roofStructure,R=t.rafterSpacing,D=void 0===R?2:R,W=t.rafterWidth,M=void 0===W?.1:W,I=t.rafterColor,C=void 0===I?"white":I,F=t.glassTint,k=void 0===F?"#73D8FF":F,O=t.opacity,Y=void 0===O?.5:O,L=t.ceiling,N=void 0!==L&&L,U=Xw(si),E=Xw(Kc),J=_f(a),G=Zm.getWireframetStyle(S,j,J,T),B=Object(u.a)(G,2);S=B[0],j=B[1];var q=Object(Se.f)(),Q=q.gl,Z=q.camera,_=Object(r.useMemo)((function(){return new We.Raycaster}),[]),$=Object(r.useMemo)((function(){return new We.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(h.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 We.Vector2(e.cx,e.cy),o=(new We.Vector3).addVectors(t.leftPoint,t.rightPoint).divideScalar(2),i=(new We.Vector3).subVectors(t.leftPoint,t.rightPoint).length(),r=new We.Vector2(o.x,o.y).rotateAround(wh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new We.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 We.Vector3;var a=(new We.Vector3).subVectors(e.leftPoint,e.rightPoint).length(),o=(new We.Vector3).addVectors(e.leftPoint,e.rightPoint).divideScalar(2),i=new We.Euler(0,0,e.relativeAngle),r=new We.Vector3(t*a,0,0),n=l*d+je;return new We.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=Up(n[0],i),He=Ep(Pe,d,!0),je=He.highestWallHeight,ze=He.topZ;Xp(t,je);var Re=Object(r.useMemo)((function(){if(null===Pe||4!==Pe.length)return new We.Vector3;var e=Pe.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Ww.calculatePolygonCentroid(e);return new We.Vector3(t.x,t.y,ze)}),[Pe,ze]),De=Object(r.useMemo)((function(){if(null===Pe)return new We.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]),Me=Object(r.useMemo)((function(){if(null===Pe)return new We.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 We.Vector3((De.x+Me.x)/2,(De.y+Me.y)/2,ze)}),[De,Me]),Ce=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):null}),[Pe]),Fe=Object(r.useMemo)((function(){return xh.clone().multiplyScalar(y)}),[y]),ke=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),H=x.clone().add(w),j=v.clone().add(y),z=b.clone().add(y),R=b.clone().add(m),D=A.clone().add(m),W=we(n,0),M=W.lh,I=W.rh,C=we(n,2),F=C.lh,k=C.rh,O=Zm.getDistance(x,v,A),Y=Math.min((null!==(t=d.eavesLength)&&void 0!==t?t:0)/O*(ze-M),M),L=Zm.getDistance(x,v,b),N=Math.min((null!==(l=d.eavesLength)&&void 0!==l?l:0)/L*(ze-I),I),U=Zm.getDistance(b,A,v),E=Math.min((null!==(a=f.eavesLength)&&void 0!==a?a:0)/U*(ze-I),F),V=Zm.getDistance(b,A,x),J=Math.min((null!==(o=f.eavesLength)&&void 0!==o?o:0)/V*(ze-M),k),G=Zm.getIntersectionPoint(S,H,T,P).setZ(M-Y).sub(Re),X=Zm.getIntersectionPoint(T,P,j,z).setZ(I-N).sub(Re),B=Zm.getIntersectionPoint(j,z,R,D).setZ(ze+E).sub(Re),K=Zm.getIntersectionPoint(R,D,S,H).setZ(ze+J).sub(Re);i.push(G,X,B,K),i.push(G.clone().add(Fe),X.clone().add(Fe),B.clone().add(Fe),K.clone().add(Fe));var q=(new We.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=Zm.getIntersectionPoint(De,Me,ue.clone(),fe.clone()).setZ(De.z).sub(Re),ve=Zm.getIntersectionPoint(De,Me,he.clone(),pe.clone()).setZ(Me.z).sub(Re),be=[],Ae=we(Pe,0),Te=Ae.lh,Se=Ae.rh,He=Zm.getDistance(te.leftPoint,te.rightPoint,De),je=Math.min((null!==(Q=te.eavesLength)&&void 0!==Q?Q:0)/He*(De.z-Te),Te),ke=Zm.getDistance(te.leftPoint,te.rightPoint,Me),Oe=Math.min((null!==(Z=te.eavesLength)&&void 0!==Z?Z:0)/ke*(Me.z-Se),Se),Ye=Zm.getIntersectionPoint(ue,fe,se,de).setZ(Te-je).sub(Re),Le=Zm.getIntersectionPoint(se,de,he,pe).setZ(Se-Oe).sub(Re);be.push(Ye,Le,ve,me),be.push(Ye.clone().add(Fe),Le.clone().add(Fe),ve.clone().add(Fe),me.clone().add(Fe));var Ne=(new We.Vector3).addVectors(te.leftPoint,te.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:be,angle:-te.relativeAngle,length:Ne});var Ue=[],Ee=we(Pe,2),Ve=Ee.lh,Je=Ee.rh,Ge=Zm.getDistance(le.leftPoint,le.rightPoint,Me),Xe=Math.min((null!==(_=le.eavesLength)&&void 0!==_?_:0)/Ge*(Me.z-Ve),Ve),Be=Zm.getDistance(le.leftPoint,le.rightPoint,De),Ke=Math.min((null!==($=le.eavesLength)&&void 0!==$?$:0)/Be*(De.z-Je),Je),qe=Zm.getIntersectionPoint(he,pe,ye,ge).setZ(Ve-Xe).sub(Re),Qe=Zm.getIntersectionPoint(ye,ge,ue,fe).setZ(Je-Ke).sub(Re);Ue.push(qe,Qe,me,ve),Ue.push(qe.clone().add(Fe),Qe.clone().add(Fe),me.clone().add(Fe),ve.clone().add(Fe));var Ze=(new We.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,Me,ze,y]),Oe=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||E(a,!1,!1,!0)}),[Pe]);var Ye=Bp();Object(r.useEffect)((function(){if(4===(null===Pe||void 0===Pe?void 0:Pe.length)){var e=Xw.getState().addedRoofId;(e&&e===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),f=Te(e,t,l,o);U((function(o){var r,n=Object(h.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(f.has(c.id)){var A=f.get(c.id);if(A){var T=c,P=A.left,S=A.right,H=A.center;if(T.roofId=a,T.leftRoofHeight=P,T.rightRoofHeight=S,H){var j=Object(u.a)(H,2),z=j[0],R=j[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),zp(l,a,ke,Re,ze,y),Xw.getState().setAddedRoofId(null))}}),[ke]),Kp(l,a,ke,Re,ze,y);Jp(a,Re,ke,!1,It.Gable),Gp((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 We.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 We.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push([o[0],o[1],Me.clone(),De.clone()]),e.push([o[2],o[3],De.clone(),Me.clone()])}Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}}));var Le=Xw((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),qf.a),Ne=Xw(os),Ue=bf(Us),Ee=Xw(o.solarRadiationHeatmapMaxValue),Ve=Af(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=ke.length;if(e>0){for(var t=[],l=0;l0&&Object(pf.jsx)(Ah,{roofSegments:ke,thickness:y,lineColor:S,lineWidth:z===Ct.Rafter?.1:j})]}),N&&d>0&&Pe[0].lz===Pe[2].lz&&Oe&&Object(pf.jsx)(Kf,{cz:Pe[0].lz,points:Oe}),z===Ct.Rafter&&Pe&&4===Pe.length&&Object(pf.jsx)("group",{onContextMenu:function(e){Mp(e,a)},onPointerDown:function(e){Pp(e,a,i)},children:Object(pf.jsx)(bh,{ridgeLeftPoint:De,ridgeRightPoint:Me,wallArray:Pe,overhang:0,isShed:ce,height:y,spacing:D,color:C,width:M})}),J&&!T&&Object(pf.jsxs)("group",{position:[0,0,y],children:[Object(pf.jsx)(Ip,{position:[Ie.x,Ie.y,Ie.z+.15],onPointerDown:function(e){if(Ne(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),Nt.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(pf.jsx)(Ip,{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 We.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),Nt.getState().setEnableOrbitController(!1)}}),Object(pf.jsx)(Ip,{position:[Me.x,Me.y,Me.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(Me.x,Me.y,ze),l&&Pe&&Pe[1]){var e=(new We.Vector3).subVectors(Me,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),Nt.getState().setEnableOrbitController(!1)}})]}),le&&Object(pf.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-je):r.z-l.lz-.3-je;var v=Te(Pe,je+x,g,m);ch(v,i)&&Xw.getState().updateRoofRiseById(a,x,ze+t.thickness)}}}},onPointerUp:function(){switch(re){case ge.Mid:Sp(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)}};Xw.getState().addUndoable(i)}(a,de.current,ue.current,g[0],m[0])}he.current=!1,ae(!1),ne(ge.Null),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.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,f=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=Xw.getState().world,P=(Xw(Zr),Xw(tn)),S=bf(Us),H=bf(Es),j=Xw(o.heatFluxScaleFactor),z=Xw(o.heatFluxColor),R=Xw(o.heatFluxWidth),D=Af(Ri),W=Af.getState().hourlyHeatExchangeArrayMap,M=Yp(x===Ct.Rafter?he.NoTexture:d),I=Lp(x===Ct.Rafter,b),C=I.transparent,F=I.opacity,k=Object(Se.f)().invalidate,O=Object(r.useRef)(null),Y=Object(r.useRef)(null),L=Object(r.useRef)(null),N=Object(r.useRef)(null),U=Object(r.useRef)(0),E=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(H){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 We.Vector3(0,0,c+.1),d=Object(h.a)(e.values());try{for(d.s();!(t=d.n()).done;){var f=t.value,p=[];p.push(f[0].clone().sub(i).add(s)),p.push(f[1].clone().sub(i).add(s)),o.push(p),(p=[]).push(f[0].clone().sub(i).add(s)),p.push(f[3].clone().sub(i).add(s)),o.push(p),(p=[]).push(f[1].clone().sub(i).add(s)),p.push(f[2].clone().sub(i).add(s)),o.push(p)}}catch(y){d.e(y)}finally{d.f()}return o}}}),[H]),ae=Object(r.useMemo)((function(){var e;if(H&&(!w||!w.notBuilding)){var o=W.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),f=n[t].map((function(e){return e.clone().sub(i).add(new We.Vector3(0,0,d))}));if(f){var p=Ww.getTriangleArea(f[0],f[1],f[2])+Ww.getTriangleArea(f[2],f[3],f[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 Zm.onSegment(g[t],e.cx,a)}))),y&&y.length>0){var m,x=Object(h.a)(y);try{for(x.s();!(m=x.n()).done;){var v=m.value;p-=Ww.getWindowArea(v)}}catch(ne){x.e(ne)}finally{x.f()}}var b=4*(null!==(e=T.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=f[0].clone(),S=f[1].clone(),z=f[2].clone(),R=(new We.Vector3).subVectors(S,A),M=(new We.Vector3).subVectors(z,A),I=(new We.Vector3).subVectors(z,S),C=R.length(),F=(new We.Vector3).crossVectors(M,I).length()/C,k=Math.max(2,Math.round(C/b)),O=Math.max(2,Math.round(F/b));R.normalize(),M.normalize(),I.normalize();var Y=(new We.Vector3).crossVectors(M,I).normalize(),L=R.multiplyScalar(.5*C/k),N=(new We.Vector3).crossVectors(Y,R).normalize().multiplyScalar(.5*F/O),G=A.clone().add(L).add(N);L.multiplyScalar(2),N.multiplyScalar(2);var X=r/p*(null!==j&&void 0!==j?j:_e);U.current=X<0?1:0,E.current=Y.clone().multiplyScalar(.1),J.current=Ww.getEuler(Rt,Y,"YXZ",-Math.sign(X)*vt);for(var B,K=[],q=new We.Vector3,Q=0;Q0){var $,ee=q.x+i.x,te=q.y+i.y,le=Object(h.a)(y);try{for(le.s();!($=le.n()).done;){var ae=$.value,oe=Zm.getRelativeWindowVerticesOnRoof(ae),ie=Ww.getPoints(oe);if(Ww.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}}}}}}),[H,j,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(O.current){var n=O.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 We.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 We.Float32BufferAttribute(h,2))}}if(Y.current){Y.current.geometry=new Ne(a,c,s);var p=te(t,i)&&te(l,o);if(ee(p),x===Ct.Glass&&p){var y=Ww.calculatePolygonCentroid(a.map(Ww.mapVector3ToPoint2)),g=new We.Vector3(y.x,y.y,0),w=.25,v=(new We.Vector3).addVectors(t,g.clone().sub(t).setZ(0).normalize().multiplyScalar(w)),b=(new We.Vector3).addVectors(l,g.clone().sub(l).setZ(0).normalize().multiplyScalar(w)),A=(new We.Vector3).addVectors(o,g.clone().sub(o).normalize().multiplyScalar(w)),T=(new We.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 We.Mesh(new Ne(P)),H=vf.a.subtract(Y.current,S);if(Y.current.geometry=H.geometry,function(e){return Math.abs(e)0&&x===Ct.Rafter||x!==Ct.Rafter)&&Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(Gf,{id:l,index:t,segment:oe,color:ie,sideColor:null!==g&&void 0!==g?g:"white",texture:M,heatmap:f[t],transparent:C,opacity:F,windows:A,centroid:i})}),le&&le.map((function(e,t){return Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:E.current?e[U.current].clone().add(E.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==z&&void 0!==z?z:$e})})]},t)}))]})},Sh=n.a.memo(Th,Fp),Hh=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 We.Vector3(0,0,l),n=0;n3&&void 0!==arguments[3]&&arguments[3];I((function(o){var i,r=Object(h.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(je),l.clone().add(je),a.clone().add(je)),o&&e.push(o.clone().add(je))},be=Object(r.useMemo)((function(){if(null===F||4!==F.length)return new We.Vector2;var e=function(e){var t,l=[],a=Object(h.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}(F),t=Ww.calculatePolygonCentroid(e);return new We.Vector2(t.x,t.y)}),[F]),Ae=Object(r.useMemo)((function(){var e=new We.Vector3,t=new We.Vector3(be.x,be.y,ie),l=M(d[0]);return l&&e.setX(-Z).applyEuler(new We.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,Z]),Te=Object(r.useMemo)((function(){var e=new We.Vector3,t=new We.Vector3(be.x,be.y,ie),l=M(d[0]);return l&&e.setX(te).applyEuler(new We.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,te]),Pe=Object(r.useMemo)((function(){return new We.Vector3(be.x,be.y,ie)}),[be,ie]),He=Object(r.useMemo)((function(){return null===F||4!==F.length?[]:F.map((function(e){return Zm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)}))}),[F]),je=Object(r.useMemo)((function(){return Rh.clone().multiplyScalar(b)}),[b]),ze=Object(r.useMemo)((function(){return null===F||4!==F.length?null:F.map((function(e,t){return{leftPoint:e.leftPoint.clone().add(He[t]),rightPoint:e.rightPoint.clone().add(He[t])}}))}),[F,He]),Re=Object(r.useMemo)((function(){var e=[];if(null===F||4!==F.length||null===ze)return e;for(var t=function(){if(null===F||4!==F.length)return 0;for(var e=F.map((function(e){return e.leftPoint})),t=[Ae,Te,Te,Ae],l=1/0,a=0;a<4;a++){var o,i,r=F[a],n=Zm.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=Zm.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=F[l],i=Zm.getComposedWallHeight(F,l),r=i.lh,n=i.rh,c=Zm.getIntersectionPoint(ze[(l+3)%4].leftPoint,ze[(l+3)%4].rightPoint,ze[l].leftPoint,ze[l].rightPoint).setZ(r-t).sub(Pe),s=Zm.getIntersectionPoint(ze[l].leftPoint,ze[l].rightPoint,ze[(l+1)%4].leftPoint,ze[(l+1)%4].rightPoint).setZ(n-t).sub(Pe),d=(new We.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}),[F,Ae,Te,ie,b]),De=Object(r.useMemo)((function(){return F&&4===F.length?F.map((function(e){return e.leftPoint})):null}),[F]);Object(r.useEffect)((function(){if(null===F||4!==F.length)C(a,!1,!1,!0);else{var e=Xw.getState().addedRoofId;if(e&&e===a){for(var t=function(e){var t=new Set(F[e].wallsId);I((function(e){var l,o=Object(h.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()}}))},l=0;l0){var e=Re.length;if(e>0){for(var t=[],o=0;o0&&l){var d,u=new We.Euler(0,0,l.rotation[2],"ZYX"),f=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(h.a)(s);try{for(m.s();!(d=m.n()).done;){var w,x=d.value,v=Object(h.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(pf.jsx)(Kf,{cz:F[0].lz,points:De}),O&&!A&&Object(pf.jsxs)("group",{position:[0,0,b+.15],children:[Object(pf.jsx)(Ip,{position:[Ae.x,Ae.y,Ae.z],onPointerDown:function(){if(fe.current=!0,U(!0),jh.set(Ae.x,Ae.y,ie),l&&F[0]){var e=Xw.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=F[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Left),Nt.getState().setEnableOrbitController(!1)}}),Object(pf.jsx)(Ip,{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),jh.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),Nt.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(pf.jsx)(Ip,{position:[Te.x,Te.y,Te.z],onPointerDown:function(){if(fe.current=!0,U(!0),jh.set(Te.x,Te.y,ie),l&&F[0]){var e=Xw.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=F[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Right),Nt.getState().setEnableOrbitController(!1)}})]}),N&&Object(pf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:re,args:[1e3,100],visible:!1,position:jh,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=F[0],n=(new We.Vector3).subVectors(r.rightPoint,r.leftPoint).length();switch(G){case ge.Left:var c=Pe.clone().sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),s=i.clone().sub(new We.Vector3(l.cx,l.cy,l.cz)).applyEuler(new We.Euler(0,0,-l.rotation[2])).sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),d=(new We.Vector3).subVectors(s,c).x;_(Ww.clamp(-d,.1-te,n/2-.01));break;case ge.Right:var u=Pe.clone().sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),f=i.clone().sub(new We.Vector3(l.cx,l.cy,l.cz)).applyEuler(new We.Euler(0,0,-l.rotation[2])).sub(jh).applyEuler(new We.Euler(0,0,-zh.z)),h=(new We.Vector3).subVectors(f,u).x;le(Ww.clamp(h,.1-Z,n/2-.01));break;case ge.Mid:var p=Math.max(0,i.z-l.lz-.3-oe);Xw.getState().updateRoofRiseById(a,p,ie+t.thickness)}}}},onPointerUp:function(){switch(G){case ge.Mid:Sp(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)}};Xw.getState().addUndoable(i)}(a,f,p,Z,te)}fe.current=!1,U(!1),B(ge.Null),Nt.getState().setEnableOrbitController(!0)},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:.5})})]})},Wh=n.a.memo(Dh,Fp),Mh=new We.Vector3,Ih=new We.Euler,Ch=new We.Vector3(0,0,1),Fh=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(pf.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(pf.jsxs)(pf.Fragment,{children:[!d&&Object(pf.jsx)(Jl.a,{points:c,lineWidth:a,color:o}),s,Object(pf.jsx)("group",{position:[0,0,l],children:s}),t.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[!d&&Object(pf.jsx)(Jl.a,{points:[e.points[7],e.points[4]],lineWidth:a,color:o}),Object(pf.jsx)(Jl.a,{points:[e.points[4],e.points[0]],lineWidth:a,color:o})]},t)}))]})})),kh=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,H=t.roofType,j=t.foundationId,z=t.ridgeWidth,R=void 0===z?1:z,D=t.rise,W=void 0===D?d:D,M=t.ceiling,I=void 0!==M&&M,C=t.frontRidge,F=t.backRidge,k=Yp(p),O=_f(a),Y=Zm.getWireframetStyle(T,S,O,b),L=Object(u.a)(Y,2);T=L[0],S=L[1];var N=Xw(si),U=Xw(Kc),E=Xw(o.shadowEnabled),J=Xw((function(e){return e.ray})),G=Xw((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)(W),we=Object(r.useRef)(null),xe=Object(r.useRef)(!1),ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=W<.01,Pe=function(e,t){N((function(l){var a,o=Object(h.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()}}))},He=Np(j,a,i),je=He.currentWallArray,ze=He.isLoopRef,Re=Vp(je,W),De=Re.highestWallHeight,Me=Re.topZ;Xp(t,De);var Ie=Object(r.useMemo)((function(){if(je.length<2)return new We.Vector3;var e=function(e){var t,l=[],a=e.length,o=Object(h.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}(je),t=Ww.calculatePolygonCentroid(e);return Number.isNaN(t.x)||Number.isNaN(t.y)?new We.Vector3:new We.Vector3(t.x,t.y,Me)}),[je,Me]),Ce=Object(r.useMemo)((function(){var e=je.map((function(e){var t;return Zm.getWallNormal(e).multiplyScalar(null!==(t=e.eavesLength)&&void 0!==t?t:0)}));if(!ze.current&&0!==e.length){var t=(new We.Vector3).subVectors(new We.Vector3(je[je.length-1].rightPoint[0],je[je.length-1].rightPoint[1]),new We.Vector3(je[0].leftPoint[0],je[0].leftPoint[1])).applyEuler(Wt).normalize().multiplyScalar(.3);e.push(t)}return e}),[je]),Fe=Object(r.useMemo)((function(){var e=je.map((function(e,t){return{leftPoint:new We.Vector3(e.leftPoint[0],e.leftPoint[1]).add(Ce[t]),rightPoint:new We.Vector3(e.rightPoint[0],e.rightPoint[1]).add(Ce[t])}}));return ze.current||0===e.length||e.push({leftPoint:new We.Vector3(je[je.length-1].rightPoint[0],je[je.length-1].rightPoint[1]).add(Ce[Ce.length-1]),rightPoint:new We.Vector3(je[0].leftPoint[0],je[0].leftPoint[1]).add(Ce[Ce.length-1])}),e}),[je,Ce]),ke=Object(r.useMemo)((function(){var e=je.map((function(e,t){var l=new We.Vector3(e.leftPoint[0],e.leftPoint[1]),a=new We.Vector3(e.rightPoint[0],e.rightPoint[1]),o=(new We.Vector3).subVectors(Ie,l).setZ(0).normalize().multiplyScalar(Q),i=(new We.Vector3).subVectors(Ie,a).setZ(0).normalize().multiplyScalar(Q);return l.add(o).setZ(Me),a.add(i).setZ(Me),{leftPoint:l,rightPoint:a}}));return ze.current||0===e.length||e.push({leftPoint:e[e.length-1].rightPoint,rightPoint:e[0].leftPoint}),e}),[je,Ie,Q]),Oe=Object(r.useMemo)((function(){return Ch.clone().multiplyScalar(v)}),[v]),Ye=Object(r.useMemo)((function(){var e=[];if(je.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=Zm.getWallHeight(je,l),r=i.lh,n=i.rh;ze.current||(0===l&&(r=je[0].lz),l===je.length-1&&(n=je[je.length-1].lz));var c=Zm.getIntersectionPoint(Fe[(l+Fe.length-1)%Fe.length].leftPoint,Fe[(l+Fe.length-1)%Fe.length].rightPoint,Fe[l].leftPoint,Fe[l].rightPoint).setZ(r-t).sub(Ie),s=Zm.getIntersectionPoint(Fe[l].leftPoint,Fe[l].rightPoint,Fe[(l+1)%Fe.length].leftPoint,Fe[(l+1)%Fe.length].rightPoint).setZ(n-t).sub(Ie),d=ke[l].leftPoint.clone().sub(Ie),u=ke[l].rightPoint.clone().sub(Ie),f=new We.Vector3(a.cx,a.cy).sub(Ie.clone().setZ(0)).length();o.push(c,s,u,d),o.push(c.clone().add(Oe),s.clone().add(Oe),u.clone().add(Oe),d.clone().add(Oe)),e.push({points:o,angle:-a.relativeAngle,length:f})}}if(!ze.current){var h=Fe.length-1,p=Zm.getIntersectionPoint(Fe[h-1].leftPoint,Fe[h-1].rightPoint,Fe[h].leftPoint,Fe[h].rightPoint).setZ(je[je.length-1].lz-t).sub(Ie),y=Zm.getIntersectionPoint(Fe[h].leftPoint,Fe[h].rightPoint,Fe[0].leftPoint,Fe[0].rightPoint).setZ(je[0].lz-t).sub(Ie),g=ke[h].leftPoint.clone().sub(Ie),m=ke[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 We.Vector3).addVectors(p,y).setZ(0).divideScalar(2).length(),v=[];v.push(p,y,m,g),v.push(p.clone().add(Oe),y.clone().add(Oe),m.clone().add(Oe),g.clone().add(Oe)),e.push({points:v,angle:-w,length:x})}return e}),[je,Me,Q,v]),Le=Object(r.useMemo)((function(){var e=new We.Shape;if(ke.length>0){var t=ke[0].leftPoint.clone().sub(Ie);e.moveTo(t.x,t.y);var l,a=Object(h.a)(ke);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}),[je,ke]),Ne=Object(r.useMemo)((function(){var e=[];if(0===je.length)return e;e.push((new We.Vector3).fromArray(je[0].leftPoint));var t,l=Object(h.a)(je);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new We.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[je]);Object(r.useEffect)((function(){R!==Q&&Z(R)}),[R]),Object(r.useEffect)((function(){if(je.length>1){if(Xw.getState().addedRoofId===a){for(var e=function(e){N((function(t){var l,o=Object(h.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===je[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=Zm.getWallHeight(je,t),i=o.lh,r=o.rh;ze.current||(0===t&&(i=je[0].lz),t===je.length-1&&(r=je[je.length-1].lz));var n=new We.Vector3(l.leftPoint[0],l.leftPoint[1],i),c=new We.Vector3(l.rightPoint[0],l.rightPoint[1],r),s=ke[t].leftPoint.clone(),d=ke[t].rightPoint.clone();e.push([n,c,d,s])}}if(!ze.current){var u=je.length-1,f=je[0],p=je[u],y=new We.Vector3(p.rightPoint[0],p.rightPoint[1],p.lz),g=new We.Vector3(f.leftPoint[0],f.leftPoint[1],f.lz),m=ke[u].leftPoint.clone(),w=ke[u].rightPoint.clone();e.push([y,g,w,m])}var x=ke.map((function(e){return e.leftPoint.clone()}));if(e.push(x),Te){var v,b=[],A=Object(h.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()}Af.getState().setRoofSegmentVerticesWithoutOverhang(a,[b])}else Af.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ee=Xw.getState().world,Ve=Xw(os),Je=bf(Us),Ge=Xw(o.solarRadiationHeatmapMaxValue),Xe=Af(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=bf(Es),st=Xw(o.heatFluxScaleFactor),dt=Xw(o.heatFluxColor),ut=Xw(o.heatFluxWidth),ft=Af(Ri),ht=Af.getState().hourlyHeatExchangeArrayMap,pt=Object(r.useRef)(null),yt=Object(r.useRef)(0),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Lp(),xt=wt.transparent,At=wt.opacity;Object(r.useEffect)((function(){if(Je)if(Te){var e=Xe(a);if(e){var t=Ww.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new We.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(h.a)(o);try{for(u.s();!(i=u.n()).done;){var f,p=i.value,y=Object(h.a)(p);try{for(y.s();!(f=y.n()).done;){var g=f.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(pf.jsx)(Fh,{roofSegments:Ye,thickness:v,lineColor:T,lineWidth:S})]})}),I&&W>0&&Object(pf.jsx)(Kf,{points:Ne,cz:je[0].lz}),O&&!b&&Object(pf.jsxs)("group",{position:[Ie.x,Ie.y,Ie.z+v],children:[Object(pf.jsx)(Ip,{position:[0,0,.3],onPointerDown:function(e){if(Ve(t.id,e,X.Select),xe.current=!0,me.current=W,ie(!0),Mh.set(Ie.x,Ie.y,Me),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),Nt.getState().setEnableOrbitController(!1),N((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=Me+t.thickness}))},onPointerOver:function(){N((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=Me+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),ke.map((function(e,t){var l=e.leftPoint.clone().sub(Ie);return Object(pf.jsx)(Ip,{position:[l.x,l.y,0],onPointerDown:function(){xe.current=!0,ie(!0),Mh.set(l.x,l.y,Me+.15),Ih.set(0,0,0),se(ge.Ridge),pe(t),te(je.reduce((function(e,t){return Math.min(e,new We.Vector3(t.leftPoint[0],t.leftPoint[1],Me).distanceTo(Ie)-1)}),1/0)),Nt.getState().setEnableOrbitController(!1),ye.current=Q}},t)}))]}),oe&&Object(pf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:we,args:[1e3,100],visible:!1,position:Mh,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);Xw.getState().updateRoofRiseById(a,r,Me+t.thickness);break;case ge.Ridge:if(l&&null!==fe){var n=i.clone().applyEuler(new We.Euler(0,0,l.rotation[2])).sub(new We.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(Nh.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&&e.intersections[0].eventObject===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(Xw.getState().groupActionMode?(Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===m}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=m,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(m)})),e.stopPropagation()):Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().isAddingElement()||Xw.getState().selectMe(g,e,X.Select,!0))},children:[Object(pf.jsx)(Lt.e,{name:"Body Extrude Mesh",args:[H,{steps:1,depth:T,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{color:s,map:P})}),Object(pf.jsx)(Jl.a,{position:[v,0,0],points:D,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[-v,0,0],points:D,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[0,0,T],points:R,color:"black",lineWidth:.2}),Object(pf.jsx)(Lt.e,{name:"Copings Extrude Mesh",position:[0,0,T],args:[j,{steps:1,depth:y,bevelEnabled:!1}],children:Object(pf.jsx)("meshStandardMaterial",{color:s})}),Object(pf.jsx)(Jl.a,{position:[0,0,T+y],points:z,color:"black",lineWidth:.2}),Object(pf.jsx)(Jl.a,{position:[0,0,T],points:z,color:"black",lineWidth:.2})]}):null};function hp(e){var t=(e.ly+e.copingsWidth)/2,l=(e.ly-e.copingsWidth)/2;return{innerPoints:pp(e,t),outerPoints:pp(e,l)}}function pp(e,t){var l=e.leftPoint,a=e.rightPoint,o=(new We.Vector3).fromArray(l),i=(new We.Vector3).fromArray(a),r=(new We.Vector3).subVectors(i,o).applyEuler(new We.Euler(0,0,vt)).normalize().clone().multiplyScalar(t);return{leftPoint:o.clone().add(r),rightPoint:i.clone().add(r)}}function yp(e,t){return Math.abs(e[0]-t[0])0&&void 0!==arguments[0]?arguments[0]:.3,l=Xw((function(e){return e.viewState.orthographic})),a=Xw((function(e){return e.viewState.cameraPosition})),o=Xw((function(e){return e.viewState.cameraZoom}));if(l)e=Math.max(t,15/o);else{var i=Xw.getState().viewState.panCenter,r=Object(ep.a)(We.Vector3,Object(f.a)(i)),n=Object(ep.a)(We.Vector3,Object(f.a)(a)),c=n.distanceTo(r);e=Math.max(t,c/100)}return e},xp=function(e,t){var l=Object(r.useMemo)((function(){return new We.TextureLoader}),[]);return Object(r.useMemo)((function(){var a;switch(e){case ue.Default:a=tp;break;case ue.NoTexture:a=Tf;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=Tf}return t===Ee.Stud&&(a=Tf),l.load(a,(function(t){t.wrapS=t.wrapT=We.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])},vp=function(e){var t=Object(r.useRef)(!0);bf((function(e){return e.foundationMovedFlag}));var l=e;if(!t.current){var a=Xw.getState().elements.find((function(t){return t.id===e.id&&t.type===V.Foundation}));a&&(l=a)}return t.current=!1,l},bp=function(){function e(){Object(je.a)(this,e)}return Object(ke.a)(e,null,[{key:"addUndoableMove",value:function(){var e=Xw.getState().selectedElement;if(e){var t=Xw.getState().getElementById(e.id),l=bf.getState().oldParentId,a=bf.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 We.Vector3).fromArray(e.normal),newNormal:(new We.Vector3).fromArray(t.normal),oldRotation:Object(f.a)(e.rotation),newRotation:Object(f.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)}};Xw.getState().addUndoable(r);var n=function(e,t,l,a,o,i,r,n,c){Xw.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(f.a)(c)}else{var u=Object(f.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(f.a)(r)),n&&(d.normal=[n.x,n.y,n.z]),d.type===V.Window)){var h=s.elements.find((function(e){return e.id===l})),p=s.elements.find((function(e){return e.id===a}));if(!h||!p)return;var y=d.lx*p.lx,g=d.lz*p.lz;d.lx=y/h.lx,d.lz=g/h.lz}}}))}}}}},{key:"undoInvalidOperation",value:function(){Xw.getState().set((function(e){if(e.selectedElement)for(var t=0;t0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Xw.getState().set((function(e){if(e.groupActionMode){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===l?i.selected=!0:i.selected=!1}}catch(s){o.e(s)}finally{o.f()}e.groupMasterId=l,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(l)}else{var r,n=Object(h.a)(e.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===t?(c.selected=!0,e.selectedElement=c,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):c.selected=!1}}catch(s){n.e(s)}finally{n.f()}}})))},Sp=function(e,t,l){var a={name:"Resize Roof Rise",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldRise:t,newRise:l,undo:function(){Xw.getState().updateRoofRiseById(a.resizedElementId,a.oldRise,0)},redo:function(){Xw.getState().updateRoofRiseById(a.resizedElementId,a.newRise,0)}};Xw.getState().addUndoable(a)},Hp=function(e,t){var l={lng:Xw.getState().language};return!!Zm.rooftopElementBoundaryCheck(e,t)||(Xw.getState().moveHandleType||Xw.getState().viewState.orthographic?Qh(me.t("message.MoveOutsideBoundaryCancelled",l)):Xw.getState().resizeHandleType?Qh(me.t("message.ResizingOutsideBoundaryCancelled",l)):Xw.getState().rotateHandleType&&Qh(me.t("message.RotationOutsideBoundaryCancelled",l)),!1)},jp=function(e,t,l){var a={lng:Xw.getState().language};return!!Zm.rooftopSPCollisionCheck(e,t,l)||(Xw.getState().moveHandleType||Xw.getState().viewState.orthographic?Qh(me.t("message.MoveCancelledBecauseOfOverlap",a)):Xw.getState().resizeHandleType?Qh(me.t("message.ResizingCancelledBecauseOfOverlap",a)):Xw.getState().rotateHandleType&&Qh(me.t("message.RotationCancelledBecauseOfOverlap",a)),!1)},zp=function(e,t,l,a,o,i,r){null!==e&&Xw.getState().set((function(n){if(null!==e){var c,s=Object(h.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 We.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),p=Zm.computeState(l,u,r),y=p.segmentVertices,g=p.normal,m=p.rotation,w=void 0;w=y?Zm.getRooftopElementZ(y,u,o+i):o+i,g&&m&&void 0!==w&&(d.normal=g.toArray(),d.rotation=Object(f.a)(m),d.cz=w)}else if(d.type===V.Window){var x=new We.Vector3(d.cx,d.cy,d.cz+e.lz).clone().sub(a),v=Zm.computeState(l,x,r),b=v.segmentVertices,A=v.normal,T=v.rotation,P=void 0;P=b?Zm.getRooftopElementZ(b,x,o+i):o+i,A&&T&&void 0!==P&&(d.rotation=Object(f.a)(T),d.cz=P)}else if(d.type===V.Sensor||d.type===V.Light){var S=new We.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),H=Zm.computeState(l,S,r),j=H.segmentVertices,z=H.normal,R=H.rotation,D=void 0;D=j?Zm.getRooftopElementZ(j,S,o+i):o+i,z&&R&&void 0!==D&&(d.normal=z.toArray(),d.rotation=Object(f.a)(R),d.cz=D)}}}catch(W){s.e(W)}finally{s.f()}}}))},Rp=function(e,t,l,a,o){e.intersections[0].eventObject.name!==e.eventObject.name||(Pp(e,l,t),Tp(e,t,l,a,o))},Dp=function(e,t){var l=Xw.getState().selectedElement;if(l&&Zm.isValidOnRoof(l)){var a=Xw.getState().getElementById(l.id);if(a&&Xw.getState().moveHandleType)if(e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")}))[0].eventObject.userData.roofId===t.id&&a.foundationId){var o=Xw.getState().getElementById(a.foundationId);if(o)switch(a.type){case V.SolarPanel:var i=a,r=Zm.getRoofBoundaryVertices(t),n=Zm.getSolarPanelVerticesOnRoof(i,o);Hp(n,r)&&jp(i,o,n)?bp.addUndoableMove():bp.undoInvalidOperation();break;case V.Sensor:case V.Light:bp.addUndoableMove()}}Xw.getState().set((function(e){e.moveHandleType=null}))}},Wp=function(e,t){var l=Xw.getState().getSelectedElement();if(l&&Zm.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(Xw.getState().moveHandleType){var a=e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")||e.eventObject.name.includes(bp.WALL_OUTSIDE_SURFACE_MESH_NAME)}));a[0].eventObject.userData.roofId===t&&Xw.getState().set((function(e){var t,o=Object(h.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 We.Vector3).subVectors(u,new We.Vector3(c.cx,c.cy)).applyEuler(new We.Euler(0,0,-c.rotation[2])),y=p.clone().sub(s),g=Zm.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(f.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),bf.getState().setPrimitiveStore("showWallIntersectionPlaneId",null)}break}}}catch(x){o.e(x)}finally{o.f()}}))}}},Mp=function(e,t){e.intersections.length>0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Xw.getState().set((function(l){l.contextMenuObjectType=V.Roof,l.pastePoint.copy(e.intersections[0].point);var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===t?(i.selected=!0,l.selectedElement=i,l.multiSelectionsMode?l.selectedElementIdSet.has(t)?l.selectedElementIdSet.delete(t):l.selectedElementIdSet.add(t):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t))):i.selected=!1}}catch(r){o.e(r)}finally{o.f()}})))},Ip=function(e){var t=e.position,l=e.onPointerDown,a=e.onPointerUp,o=e.onPointerOver,i=Xw(si),n=wp(),c=Object(Se.f)().gl,s=Object(r.useRef)(!1),d=Object(r.useRef)(!1),f=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&&(f.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(h.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(pf.jsx)(Lt.h,{name:"Roof Handle",ref:p,args:[n],position:t,onPointerMove:function(e){v(e)?(f.current=!1,d.current||(d.current=!0,x(!0))):w("white")},onPointerOut:function(e){f.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:m})})},Cp=function(e){var t=e.roofModel,l=e.foundationModel,a=Xw(Kc),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(pf.jsx)(rh,{roofModel:t,foundationModel:l});case It.Gable:return Object(pf.jsx)(Sh,{roofModel:t,foundationModel:l});case It.Hip:return Object(pf.jsx)(Wh,{roofModel:t,foundationModel:l});case It.Gambrel:return Object(pf.jsx)(yh,{roofModel:t,foundationModel:l});case It.Mansard:return Object(pf.jsx)(Oh,{roofModel:t,foundationModel:l});default:return null}}()};function Fp(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 kp,Op=n.a.memo(Cp,Fp),Yp=function(e){var t=Object(r.useMemo)((function(){var t;switch(e){case he.NoTexture:t=Tf;break;case he.Texture01:t=Pf;break;case he.Texture02:t=Sf;break;case he.Texture03:t=Hf;break;case he.Texture04:t=jf;break;case he.Texture05:t=zf;break;case he.Texture06:t=Rf;break;case he.Texture07:t=Df;break;default:t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC"}return(new We.TextureLoader).load(t,(function(t){switch(t.wrapS=t.wrapT=We.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},Lp=function(e,t){var l=Xw(o.groundImage),a=Xw(o.orthographic),i=l&&a,r=i?.25:1;return{transparent:e||i,opacity:Math.min(void 0!==t?t:1,r)}},Np=function(e,t,l){var a=Xw((function(t){return t.elements.filter((function(t){return t.foundationId===e&&t.type===V.Wall}))}),qf.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(h.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;n&&(!n.roofId||n.roofId===t)&&(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]);n&&(!n.roofId||n.roofId===t)&&(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(d){a.e(d)}finally{a.f()}return[]}),[l,a]),isLoopRef:i}},Up=function(e,t){var l=Xw((function(e){return e.elements.filter((function(e){return e.foundationId===t&&e.type===V.Wall}))}),qf.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 f,p=[],y=Object(h.a)(o);try{for(y.s();!(f=y.n()).done;){var g,m=Object(u.a)(f.value,2),w=m[0],x=m[1],v=0,b=Object(h.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,H=null,j=null,z=0,R=-1,D=Object(h.a)(x);try{for(D.s();!(S=D.n()).done;){var W=S.value,M=a.get(W.leftJoints[0]),I=a.get(W.rightJoints[0]);z=Math.max(z,W.lz),R=Math.max(R,W.eavesLength),M&&M.relativeAngle.toFixed(1)!==w&&(H=W),I&&I.relativeAngle.toFixed(1)!==w&&(j=W)}}catch(C){D.e(C)}finally{D.f()}H&&j&&z>0&&-1!==R&&p.push({leftPoint:(new We.Vector3).fromArray(H.leftPoint),rightPoint:(new We.Vector3).fromArray(j.rightPoint),relativeAngle:H.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])},Ep=function(e,t,l){var a=Object(r.useMemo)((function(){return Zm.getHighestComposedWallHeight(e,l)}),[e]),o=Object(r.useMemo)((function(){return a+t}),[a,t]);return{highestWallHeight:a,topZ:o}},Vp=function(e,t,l){var a=Object(r.useMemo)((function(){return Zm.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}},Jp=function(e,t,l,a,o,i){var n=bf(Lr),c=bf(Nr),s=bf(Ir),d=function(){var r=function(e){return e.clone().add(t)},n=[];if(a)if(o===It.Gambrel)n.push(_p(l).map(r));else{var c,s=[],d=Object(h.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 f,p=Object(h.a)(l);try{for(p.s();!(f=p.n()).done;){var y=f.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 Af.getState().setRoofSegmentVertices(e,n),n};return(n||c||s)&&d(),Object(r.useEffect)((function(){d()}),[l]),d},Gp=function(e){var t=bf(Ir),l=bf(Fr);(t||l)&&e()},Xp=function(e,t){var l=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.ceiling&&void 0!==e.rise&&(e.roofType!==It.Gambrel||void 0!==e.frontRidgePoint&&void 0!==e.backRidgePoint&&void 0!==e.topRidgePoint)||Xw.getState().set((function(l){var a,o=Object(h.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;if(void 0===r.ceiling&&(r.ceiling=!1),void 0===r.rise&&(r.rise=r.lz-t,r.lz=0),r.roofType===It.Gambrel){var n=r;void 0===n.frontRidgePoint&&(n.frontRidgePoint=n.frontRidgeLeftPoint?Object(f.a)(n.frontRidgeLeftPoint):[.35,.5],n.frontRidgeLeftPoint=void 0,n.frontRidgeRightPoint=void 0),void 0===n.backRidgePoint&&(n.backRidgePoint=n.backRidgeLeftPoint?Object(f.a)(n.backRidgeLeftPoint):[-.35,.5],n.backRidgeLeftPoint=void 0,n.backRidgeRightPoint=void 0),void 0===n.topRidgePoint&&(n.topRidgePoint=n.topRidgeLeftPoint?Object(f.a)(n.topRidgeLeftPoint):[0,1],n.topRidgeLeftPoint=void 0,n.topRidgeRightPoint=void 0)}break}}}catch(c){o.e(c)}finally{o.f()}}))}),[l])},Bp=function(){var e=Object(r.useRef)(!0);return!!e.current&&(e.current=!1,!0)},Kp=function(e,t,l,a,o,i,n){var c=Xw((function(e){return e.updateElementOnRoofFlag}));Object(r.useEffect)((function(){c&&(zp(e,t,l,a,o,i,n),Xw.getState().setUpdateElementOnRoofFlag(!1))}),[o,i,c])},qp=function(e,t,l,a,o,i,n){!function(e,t,l,a,o,i,n){var c=Bp();Object(r.useEffect)((function(){c||zp(e,t,l,a,o,i,n)}),[l])}(e,t,l,a,o,i,n),Kp(e,t,l,a,o,i,n)},Qp=function(e,t,l,a){var o=vp(t);return Object(r.useMemo)((function(){return{roofId:e,foundation:o,centroid:l,roofSegments:a}}),[e,l,a,o])},Zp=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()},_p=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},$p=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 We.ExtrudeBufferGeometry(l,{steps:1,depth:a,bevelEnabled:!1}),d.current.updateMatrix(),o.length>0)){for(var f=[],h=0;h0){var n,s=Object(h.a)(C);try{for(s.s();!(n=s.n()).done;){var d=n.value,f=new We.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:Zg,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=Ef(x,v,b,w,f.x,f.y);e.holes.push(A);break;case Yt.Arched:var T=kf(d.lx,d.lz,d.archHeight,f.x,f.y);e.holes.push(T);break;default:var P=new We.Shape,S=d.lx/2,H=d.lz/2;P.moveTo(f.x-S,f.y-H),P.lineTo(f.x+S,f.y-H),P.lineTo(f.x+S,f.y+H),P.lineTo(f.x-S,f.y+H),P.closePath(),e.holes.push(P)}}}catch(j){s.e(j)}finally{s.f()}}return e}),[i,c,C,a]),E=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 We.Vector3(e.cx,e.cy,e.cz).sub(c),r=(new We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"]));switch(e.windowType){case Yt.Polygonal:var n,s=null!==(n=e.polygonTop)&&void 0!==n?n:Zg,d=Object(u.a)(s,2),h=d[0],p=d[1],y=e.lx/2,g=e.lz/2,m=h*e.lx,w=Ef(y,g,m,p),x=new We.Mesh(new We.ExtrudeBufferGeometry([w],{steps:1,depth:e.ly,bevelEnabled:!1})),v=new We.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=kf(e.lx,e.lz,e.archHeight),A=new We.Mesh(new We.ExtrudeBufferGeometry([b],{steps:1,depth:e.ly,bevelEnabled:!1})),T=new We.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 We.Mesh(new We.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&&!M,X=b&&w;return Object(pf.jsxs)(pf.Fragment,{children:[J&&!X?Object(pf.jsx)($p,{uuid:t,simulation:!0,shape:N,holeMeshes:E,thickness:s,castShadow:G,receiveShadow:v,children:Object(pf.jsx)("meshStandardMaterial",{color:g,transparent:M,opacity:I})}):Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{uuid:t,userData:{simulation:!0},name:"Flat roof top shape",position:[0,0,s+.001],receiveShadow:v,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[U]}),X?Object(pf.jsx)("meshBasicMaterial",{map:w,side:We.FrontSide}):Object(pf.jsx)("meshStandardMaterial",{map:L,color:g,transparent:M,opacity:I,side:We.FrontSide})]}),Object(pf.jsx)($p,{shape:N,holeMeshes:E,thickness:s,castShadow:G,receiveShadow:v,children:Object(pf.jsx)("meshStandardMaterial",{color:null!==y&&void 0!==y?y:"white",transparent:M,opacity:I})})]}),Y,Object(pf.jsxs)("group",{position:[0,0,s],children:[Y,k.map((function(e,t){var l=[e.clone().sub(O),e];return Object(pf.jsx)(Jl.a,{points:l,lineWidth:p,color:d},t)}))]}),F&&F.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==P&&void 0!==P?P:$e})})]},t)}))]})},ty=l.p+"static/media/foundation_01.bda6fc00.png",ly=l.p+"static/media/foundation_02.a1240091.png",ay=l.p+"static/media/foundation_03.6be5f733.png",oy=l.p+"static/media/foundation_04.8100e8d2.png",iy=l.p+"static/media/foundation_05.8164fdc8.png",ry=l.p+"static/media/foundation_06.fc1babc0.png",ny=l.p+"static/media/foundation_07.e759a1c6.png",cy=l.p+"static/media/helvetiker_regular.typeface.9a3651b4.fnt",sy=function(e){var t=e.element,l=e.height,a=Xw(Du),i=Xw(Hu),n=Xw(ps),c=Xw($r),s=Xw(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 We.Vector3(u,f,null!==l&&void 0!==l?l:d.lz))}break;case V.Foundation:p(new We.Vector3(e,o,s?.1:0));break;case V.Cuboid:var h=Ww.getWorldDataById(t.id).pos,y=Ww.getWorldDataById(t.parentId).rot;p(new We.Vector3(h.x,h.y,h.z-t.lz/2+.2)),A(y);break;default:p(new We.Vector3(e,o,s?.2:0))}w(Math.max(5,.75*Math.hypot(r,n)))}}),[a,i]);var T=Object(Se.e)(We.FontLoader,cy),P=.05*m,S={font:T,height:0,size:P},H=new Array(25).fill(0),j=s?"#222":"#ccc";return Object(pf.jsx)(pf.Fragment,{children:h&&Object(pf.jsxs)("group",{position:h,rotation:[vt,b,0],name:"Polar Auxiliary",children:[Object(pf.jsx)("polarGridHelper",{args:[m,24,6,120,j,j],userData:{unintersectable:!0}}),Object(pf.jsx)(Lt.g,{args:[.98*m,m,24,1,vt,n],userData:{unintersectable:!0},rotation:[-vt,0,0],children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,color:"yellow"})}),Object(pf.jsx)("group",{rotation:[0,n,0],children:Object(pf.jsx)("mesh",{position:[-.5,0,.9*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:Object(pf.jsx)("textGeometry",{args:["".concat(-Ww.toDegrees(n).toFixed(1),"\xb0"),S]})})}),H.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(pf.jsx)("group",{rotation:[0,l*Math.PI/12,0],children:Object(pf.jsxs)("mesh",{position:[a,0,1.05*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:[Object(pf.jsx)("textGeometry",{args:["".concat(-15*l,"\xb0"),S]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)}))]})})},dy=function(e){var t=e.id,l=e.position,a=e.ratio,o=e.handleType,i=e.hoverHandle,r=e.noHoverHandle,n=Xw(os),c=Xw(Du),s=Xw(Hu)===o||c===o?pt:ht,d=Object(pf.jsx)("meshBasicMaterial",{color:s});return Object(pf.jsxs)("group",{position:l,rotation:[vt,0,0],scale:a,name:o,children:[Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:d}),Object(pf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:d}),Object(pf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:d})]}),Object(pf.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})]})},uy=n.a.memo(dy),fy=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(pf.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})},hy=n.a.memo(fy);!function(e){e.left="Left",e.right="Right",e.loop="Loop",e.null="Null"}(kp||(kp={}));var py,yy=function(e){var t,l=e.element,a=e.verticalLift,i=Xw(Vi),n=Xw(o.orthographic),c=Xw(zu),s=Xw(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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w,-u,x],[-d-w,u,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d-2*w,-u,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w,-u,x],[d+w,u,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d+2*w,-u,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u-w,x],[d,-u-w,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d,-u-2*w,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u+w,x],[d,u+w,x]],color:p,linewidth:1}),Object(pf.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(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d,u+2*w,x]],color:p,linewidth:h}),Object(pf.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(pf.jsxs)(pf.Fragment,{children:[v,A]});case K.LowerRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(pf.jsxs)(pf.Fragment,{children:[v,T]});case K.UpperRight:return Object(pf.jsxs)(pf.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(pf.jsxs)(pf.Fragment,{children:[v,A]});case K.LowerRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(pf.jsxs)(pf.Fragment,{children:[v,T]});case K.UpperRight:return Object(pf.jsxs)(pf.Fragment,{children:[b,T]})}return Object(pf.jsx)(pf.Fragment,{})},gy=1.225,my=273.15,wy=5.67e-8,xy=[.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"}(py||(py={}));var vy,by=1440,Ay=Math.PI/720,Ty=Math.PI/182.5,Py=function(){function e(t,l){Object(je.a)(this,e),this.sunrise=void 0,this.sunset=void 0,this.sunrise=t,this.sunset=l}return Object(ke.a)(e,[{key:"daylight",value:function(){return this.sunset-this.sunrise}}]),e}(),Sy=.5,Hy=.1,jy=23.45/180*Math.PI,zy=720,Ry=function(e){var t=Math.floor((e.getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5);return jy*Math.sin(bt*(284+t)/365.25)},Dy=function(e,t){var l=Math.tan(Ww.toRadians(t))*Math.tan(Ry(e));if(Math.abs(l)>1)return new Py(0,l>0?1440:0);var a=60*Math.acos(-l)/Ww.toRadians(15);return new Py(zy-a,zy+a)},Wy=function(e){return(60*e.getHours()+e.getMinutes()-zy)/zy*Math.PI},My=function(e){return(e/zy-1)*Math.PI},Iy=function(e,t){return Cy(1,Wy(e),Ry(e),Ww.toRadians(t)).normalize()},Cy=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 We.Vector3(e,h,d);return Ww.sphericalToCartesianZ(p),p.x=-p.x,p},Fy=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 py.NONE:return 1;case py.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))},ky=function(e,t,l,a){var o=0,i=l.dot(Rt),r=.5*(1+i);r>0&&(o+=xy[t]*r*a);var n=.5*Math.abs(1-i);return Ww.isZero(n)||(o+=e.albedo*n*a),o},Oy=function(e){var t,l,a,c,s,d,f,h,p,y,g,m,w,x,v,b,A=e.foundation,T=Xw(i.date),P=Xw(i.latitude),S=bf(Wr),H=bf(gs),j=bf(ms),z=bf(Us),R=Xw(o.solarRadiationHeatmapMaxValue),D=Af(wi),W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(),k=A.lx,O=A.ly,Y=A.lz,L=A.solarUpdraftTower,N=.016*(null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:100),U=Object(r.useMemo)((function(){return Iy(new Date(T),P)}),[T,P]),E=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(k,O),n=null!==(l=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==l?l:Math.min(k,O)/2,c=null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(k,O)),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 We.Vector3(s*g,s*m,i)),w.push(new We.Vector3(d*g,d*m,i)),w.push(new We.Vector3(d*g,d*m,r)),w.push(new We.Vector3(u*g,u*m,1.02*r)),w.push(new We.Vector3(f*g,f*m,1.04*r)),w.push(new We.Vector3(h*g,h*m,1.06*r)),o.push({points:w})}return o}),[k,O,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(k,O)/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 We.Vector3(-s,c,a)),n.push(new We.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 We.Vector3(f,-h,a)),u.push(new We.Vector3(f,h,a)),l.push({points:u})}return l}),[k,O,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(Ww.fetchHeatmapTexture(e,null!==R&&void 0!==R?R:5))}}),[z,R]),Object(Se.d)((function(e,t){(S||H&&!j)&&U.z>0&&F.current&&F.current.children.forEach((function(e){"Streamlines"===e.name&&(e.material.uniforms.dashOffset.value-=t*N*10)}))})),Object(pf.jsxs)("group",{children:[Object(pf.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(k,O)),null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(k,O)),null!==(c=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==c?c:Math.max(k,O),16,2,!0],position:[0,0,(null!==(s=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==s?s:Math.max(k,O))/2+Y],rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)),1.6*(null!==(f=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==f?f:Math.max(1,.025*Math.min(k,O))),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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)/2,null!==(g=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==g?g:Math.min(k,O)/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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),Object(pf.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(k,O)/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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:I}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:50,side:We.FrontSide,color:"lightskyblue",transparent:!0,opacity:.75})}),Object(pf.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(k,O)/2,50,0,bt],position:[0,0,.1],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"dimgray"})}),V&&V.map((function(e,t){return Object(pf.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&&E&&Object(pf.jsx)("group",{ref:F,children:E.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 We.Euler(0,0,bt*t/E.length+vt),i=N,r=N;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[N,4*N,4,2],name:"Streamline Inlet Arrow Head",position:[.1*l,.1*a,e.points[0].z],rotation:o,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[N,4*N,4,2],name:"Streamline Inlet Arrow Head",position:[.9*l,.9*a,e.points[0].z],rotation:o,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})})]},t)}))})]})},Yy=n.a.memo(Oy),Ly=l(800),Ny=l.p+"static/media/glow.def60647.png",Uy=function(e){var t,l,a=e.foundation,o=Xw(i.date),n=Xw(i.latitude),c=Object(Ly.a)(Ny),s=Object(r.useMemo)((function(){return Iy(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(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),s.z>0&&Object(pf.jsx)("mesh",{position:[0,0,h+d/2],children:Object(pf.jsx)("sprite",{scale:[g,g,g],children:Object(pf.jsx)("spriteMaterial",{map:c,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})})]})},Ey=n.a.memo(Uy),Vy=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 We.Vector3(0,l*t-f*n/2,d/2+c/2));return e}),[n,c,h,d,f]);return Object(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:We.DoubleSide})}),p&&p.map((function(e,t){return Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})},t)}))]})},Jy=n.a.memo(Vy);!function(e){e.Move="Move",e.ResizeXY="Resize XY",e.ResizeZ="Resize Z",e.RotateUpper="Rotate Upper",e.RotateLower="Rotate Lower",e.Null="Null"}(vy||(vy={}));var Gy,Xy=new We.Vector2,By=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(pf.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(pf.jsx)("meshStandardMaterial",{color:f})})},Ky=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(pf.jsx)(Lt.h,{name:l,args:[c],position:[o,i,n],onPointerOver:function(){return h(pt)},onPointerOut:function(){return h(ht)},children:Object(pf.jsx)("meshStandardMaterial",{color:f})})},qy=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(pf.jsx)("meshStandardMaterial",{color:f})}),[f]);return Object(pf.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(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:p}),Object(pf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:p}),Object(pf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:p})]}),Object(pf.jsx)(Lt.f,{name:l,args:[.35,.35],position:[0,.05,0],rotation:[-vt,0,0],visible:!1})]})},Qy=function(e){var t=e.baseGroupSet,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,b=Object(r.useRef)(null),A=Object(r.useRef)(new We.Vector3),T=Object(r.useRef)(new We.Euler),P=Object(r.useRef)(new We.Vector2),S=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new We.Vector3),C=Object(r.useRef)(!1),F=Object(r.useRef)(new Map),k=Object(r.useRef)(new Map),O=Object(r.useRef)(new Map),Y=Object(r.useRef)(new Map),L=Object(r.useRef)(new Map),N=Object(r.useState)(new We.Vector3(s,d,p)),U=Object(u.a)(N,2),E=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)(vy.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 We.Raycaster}),[]),ve=Object(r.useMemo)((function(){return new We.Vector2}),[]),be=Xw(o.orthographic),Ae=Xw(Zr),Te=Xw(Qr),Pe=Xw(si),He=Xw(Sr);Object(r.useEffect)((function(){se(w)}),[w]),Object(r.useEffect)((function(){J(new We.Vector3(s,d,p)),je(g,m),Z(n)}),[a,i,n]);var je=function(e,t){te(e/2),ie(t/2)},ze=function(e){he(!0),Nt.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(Qf(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(f.a)(p),d.rightPoint=Object(f.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(h.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}))},Me=function(e){Pe((function(t){var l,a=Object(h.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,l){var a=new We.Vector2(E.x,E.y);P.current.set(e,l).rotateAround(Xy,Q).add(a),me(vy.ResizeXY),W.current.clear(),M.current.clear(),H.current.clear(),F.current.clear(),k.current.clear(),z.current.clear(),L.current.clear();var o,i=2*ee,r=2*oe,n=Object(h.a)(Xw.getState().elements);try{for(n.s();!(o=n.n()).done;){var c=o.value;if(Qf(c)&&t.has(c.id)){var s=Ww.getWorldDataById(c.id).pos;W.current.set(c.id,[(s.x-E.x)/i,(s.y-E.y)/r]),M.current.set(c.id,[c.lx/i,c.ly/r]),F.current.set(c.id,[c.cx,c.cy,c.lx,c.ly])}else if(c.foundationId&&t.has(c.foundationId)){var d=Ae(c.foundationId);if(!d)continue;switch(c.type){case V.Wall:var u=c,p=new We.Vector2(u.leftPoint[0]/d.lx,u.leftPoint[1]/d.ly),y=new We.Vector2(u.rightPoint[0]/d.lx,u.rightPoint[1]/d.ly);H.current.set(u.id,[p,y]),k.current.set(u.id,[].concat(Object(f.a)(u.leftPoint),Object(f.a)(u.rightPoint)));break;case V.Window:var g=c;if(g.parentType!==V.Roof)continue;z.current.set(g.id,[g.cx/d.lx,g.cy/d.ly]),L.current.set(g.id,[g.cx,g.cy])}}}}catch(m){n.e(m)}finally{n.f()}},Fe=function(e,l,a){var o=Te(),i=o.x,r=o.y;A.current.set(e,l,a),T.current.set(-vt,0,-Math.atan2(i,r)-Q,"ZXY"),me(vy.ResizeZ),S.current.clear(),O.current.clear(),j.current.clear(),Y.current.clear();var n,c=Object(h.a)(Xw.getState().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.foundationId&&t.has(s.foundationId))if(s.type===V.Wall){S.current.set(s.id,s.lz/ce),O.current.set(s.id,s.lz);var d=s;d.fill===Ue.Partial&&(Y.current.set(d.id,{upperLeft:d.leftTopPartialHeight,upperRight:d.rightTopPartialHeight,lowerLeft:d.leftUnfilledHeight,lowerRight:d.rightUnfilledHeight}),j.current.set(d.id,{upperLeft:d.leftTopPartialHeight/ce,upperRight:d.rightTopPartialHeight/ce,lowerLeft:d.leftUnfilledHeight/ce,lowerRight:d.rightUnfilledHeight/ce}))}else s.type===V.Roof&&(S.current.set(s.id,s.rise/ce),O.current.set(s.id,s.rise));else t.has(s.id)&&(S.current.set(s.id,s.lz/ce),O.current.set(s.id,s.lz))}}catch(u){c.e(u)}finally{c.f()}},ke=wp(),Oe=ke/2,Ye=ce+Oe-ke/2,Le=ee+ke,Ne=oe+ke,Ee=oe+4*ke;return Object(pf.jsxs)("group",{name:"Group Master",position:E,rotation:[0,0,Q],children:[Object(pf.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:Fe(-ee,oe,ce);break;case K.UpperRightTop:Fe(ee,oe,ce);break;case K.LowerLeftTop:Fe(-ee,-oe,ce);break;case K.LowerRightTop:Fe(ee,-oe,ce)}},children:[Object(pf.jsx)(By,{args:[ee,oe,Oe,ke],handleType:K.UpperRight}),Object(pf.jsx)(By,{args:[-ee,oe,Oe,ke],handleType:K.UpperLeft}),Object(pf.jsx)(By,{args:[ee,-oe,Oe,ke],handleType:K.LowerRight}),Object(pf.jsx)(By,{args:[-ee,-oe,Oe,ke],handleType:K.LowerLeft}),!be&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(By,{args:[ee,oe,Ye,ke],handleType:K.UpperRightTop}),Object(pf.jsx)(By,{args:[-ee,oe,Ye,ke],handleType:K.UpperLeftTop}),Object(pf.jsx)(By,{args:[ee,-oe,Ye,ke],handleType:K.LowerRightTop}),Object(pf.jsx)(By,{args:[-ee,-oe,Ye,ke],handleType:K.LowerLeftTop})]})]}),Object(pf.jsxs)("group",{name:"Move Handle Group",onPointerDown:function(e){if(ze(e),me(vy.Move),e.intersections.length>0){var l=e.intersections[0].point.clone().setZ(0);I.current.subVectors(E,l);var a,o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Qf(i)&&t.has(i.id)){var r=new We.Vector3(i.cx,i.cy),n=(new We.Vector3).subVectors(r,l);R.current.set(i.id,n),F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(pf.jsx)(Ky,{args:[0,Ne,Oe,ke],handleType:B.Upper}),Object(pf.jsx)(Ky,{args:[0,-Ne,Oe,ke],handleType:B.Lower}),Object(pf.jsx)(Ky,{args:[Le,0,Oe,ke],handleType:B.Right}),Object(pf.jsx)(Ky,{args:[-Le,0,Oe,ke],handleType:B.Left})]}),Object(pf.jsxs)("group",{name:"Rotate Handle Group",onPointerDown:function(e){if(ze(e),e.object.name===q.Lower?me(vy.RotateLower):e.object.name===q.Upper&&me(vy.RotateUpper),e.intersections.length>0){var l,a=new We.Vector3(E.x,E.y),o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Qf(i)&&t.has(i.id)){var r=new We.Vector3(i.cx,i.cy),n=(new We.Vector3).subVectors(r,a);R.current.set(i.id,n),D.current.set(i.id,i.rotation[2]),F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}t.has(i.parentId)&&F.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(pf.jsx)(qy,{args:[0,Ee,Oe,ke],handleType:q.Upper}),Object(pf.jsx)(qy,{args:[0,-Ee,Oe,ke],handleType:q.Lower})]}),fe&&Object(pf.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 vy.ResizeXY:!function(e){var l=new We.Vector2(e.x,e.y),a=P.current.clone();if(v){var o=(new We.Vector2).subVectors(l,a),i=Math.max(1,o.length()),r=Math.sqrt(Math.pow(i,2)/(Math.pow(x,2)+1)),n=r*x,c=new We.Vector2(r*Math.sign(o.x),n*Math.sign(o.y)).normalize().multiplyScalar(i/2).add(a);J(new We.Vector3(c.x,c.y)),je(r,n),Pe((function(e){var l,a=new Map,o=Object(h.a)(e.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Qf(i)&&t.has(i.id)){var s=W.current.get(i.id),d=M.current.get(i.id);if(s&&d){var f=d[0]*r,p=d[1]*n;if(i.lx=f,i.ly=p,i.parentId!==xt){var y=a.get(i.parentId);if(y){var g=y.pos,m=y.rot,w=new We.Vector3(s[0]*r+c.x,s[1]*n+c.y),x=w.clone().sub(g).applyEuler(new We.Euler(0,0,-m));i.cx=x.x,i.cy=x.y,a.set(i.id,{pos:w.clone(),rot:i.rotation[2]+m})}}else{var v=s[0]*r+c.x,b=s[1]*n+c.y;i.cx=v,i.cy=b,a.set(i.id,{pos:new We.Vector3(v,b),rot:i.rotation[2]})}var A,T=Object(h.a)(e.elements);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(P.foundationId===i.id)switch(P.type){case V.Wall:var S=P,j=H.current.get(S.id);if(!j)continue;var R=Object(u.a)(j,2),D=R[0],I=R[1],C=[D.x*f,D.y*p,i.lz],F=[I.x*f,I.y*p,i.lz];S.cx=(C[0]+F[0])/2,S.cy=(C[1]+F[1])/2,S.lx=Math.hypot(C[0]-F[0]+(C[1]-F[1])),S.relativeAngle=Math.atan2(F[1]-C[1],F[0]-C[0]),S.leftPoint=[].concat(C),S.rightPoint=[].concat(F);break;case V.Window:var k=P;if(k.parentType!==V.Roof)continue;var O=z.current.get(k.id);if(!O)continue;k.cx=O[0]*f,k.cy=O[1]*p}}}catch(Y){T.e(Y)}finally{T.f()}}}}}catch(Y){o.e(Y)}finally{o.f()}}))}else{var s=a.distanceTo(l),d=Math.atan2(l.x-a.x,l.y-a.y)+Q,f=Math.abs(s*Math.sin(d)),p=Math.abs(s*Math.cos(d)),y=(new We.Vector2).addVectors(l,a).multiplyScalar(.5);J(new We.Vector3(y.x,y.y)),je(f,p),Pe((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id))o.lx=f,o.ly=p,o.cx=y.x,o.cy=y.y;else if(o.foundationId&&t.has(o.foundationId))switch(o.type){case V.Wall:var i=o,r=H.current.get(i.id);if(!r)continue;var n=Object(u.a)(r,2),c=n[0],s=n[1],d=[c.x*f,c.y*p,0],g=[s.x*f,s.y*p,0];i.cx=(d[0]+g[0])/2,i.cy=(d[1]+g[1])/2,i.lx=Math.hypot(d[0]-g[0],d[1]-g[1]),i.relativeAngle=Math.atan2(g[1]-d[1],g[0]-d[0]),i.leftPoint=[].concat(d),i.rightPoint=[].concat(g);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]*f,m.cy=w[1]*p}}}catch(x){a.e(x)}finally{a.f()}}))}Xw.getState().updateElementOnRoofFn()}(i);break;case vy.ResizeZ:!function(e){if(!(e.z<.1)){var t=e.z;se(t),Pe((function(e){var l,a=Object(h.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=j.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 vy.RotateLower:case vy.RotateUpper:!function(e){var a=new We.Vector3(E.x,E.y),o=Math.atan2(a.x-e.x,e.y-a.y)+(ge===vy.RotateUpper?0:Math.PI),i=o+(Math.abs(o)>Math.PI?-bt:0),r=new We.Euler(0,0,i),n=D.current.size;Pe((function(e){var o,c=Object(h.a)(e.elements);try{for(c.s();!(o=c.n()).done;){var s=o.value;if(Qf(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 f=d.clone().applyEuler(r);s.cx=a.x+f.x,s.cy=a.y+f.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 vy.Move:J((new We.Vector3).addVectors(i.clone().setZ(0),I.current)),Pe((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(Qf(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 vy.Move:case vy.RotateLower:case vy.RotateUpper:!function(){var e,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;(Qf(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===vy.Move?"Move":"Rotate",r={name:"".concat(i," Foundation Group"),timestamp:Date.now(),oldPositionMap:new Map(F.current),newPositionMap:new Map(l),undo:function(){Me(r.oldPositionMap)},redo:function(){Me(r.newPositionMap)}};He(r)}();break;case vy.ResizeXY:!function(){var e,t=new Map,l=new Map,a=new Map,o=Object(h.a)(Xw.getState().elements);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(Qf(i)&&F.current.has(i.id))t.set(i.id,[i.cx,i.cy,i.lx,i.ly]);else if(k.current.has(i.id)){var r=i;l.set(i.id,[].concat(Object(f.a)(r.leftPoint),Object(f.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(F.current),newFoundationDataMap:new Map(t),oldWallPointsMap:new Map(k.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)}};He(c)}();break;case vy.ResizeZ:!function(){var e,t=new Map,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;if(O.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(O.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)}};He(r)}()}he(!1),Nt.getState().setEnableOrbitController(!0),C.current=!1,me(vy.Null),Ie(null),Pe((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag,e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.updateElementOnRoofFlag=!0}))}}),Object(pf.jsx)("group",{name:"Wireframe Group",position:[0,0,ce/2],children:Object(pf.jsx)(hy,{hx:ee,hy:oe,hz:ce/2,lineColor:"white"})})]})},Zy=n.a.memo(Qy),_y=function(){function e(){Object(je.a)(this,e)}return Object(ke.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(h.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(u){s.e(u)}finally{s.f()}if(e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t)),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(h.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}(),$y=l(124),eg=function(e){var t=bf(Us),l=Xw(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=Af.getState().getHeatmap(e);a&&c(Ww.fetchHeatmapTexture(a,null!==l&&void 0!==l?l:5))}}),[t,l]),n},tg=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?lg(e,o,t,r,i,s,n,c):lg(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=We.RepeatWrapping,p(s.clone())}}),[s,e,t]),h},lg=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(pf.jsxs)("group",{rotation:[-c.x,0,-c.z-n],children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[y.clone().multiplyScalar(.5),s.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:s.clone().multiplyScalar(.75),rotation:[vt+c.x+o.x,0,c.z+o.z+n,"ZXY"],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",rotation:[0,0,-o.y],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),cg=function(e){var t,l,a,o,i,n=e.id;Xw(ki);var c=Xw(Zr),s=Xw(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 We.Vector3(f.cx,f.cy,f.cz),p=new We.Vector3(u.cx*f.lx,u.cy*f.ly,f.lz/2+u.cz+u.lz/2+u.poleHeight).applyEuler(new We.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(pf.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)]})},sg=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,H=void 0===S?[0,0,1]:S,j=e.color,z=void 0===j?"white":j,R=e.frameColor,D=e.backsheetColor,W=e.showLabel,M=void 0!==W&&W,I=e.locked,C=void 0!==I&&I,F=e.parentId,k=e.foundationId,O=e.foundationModel,Y=e.orientation,L=void 0===Y?$.portrait:Y,N=Xw(si),U=Xw(os),E=Xw(Zr),J=bf(Us),G=Xw(o.shadowEnabled),B=Xw(o.solarPanelShininess),Q=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,Z=Xw(Yi),_=Xw(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=Xw.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)(),He=Object(r.useRef)(null),je=Object(r.useRef)(!1),ze=Object(r.useRef)(null),Re=Object(r.useRef)(null),De=Object(r.useRef)(null),Me=Object(r.useRef)(null),Ie=Object(r.useRef)(null),Ce=Object(r.useRef)(null),Fe=Object(r.useMemo)((function(){return new We.Raycaster}),[]),ke=Object(r.useMemo)((function(){return new We.Vector2}),[]),Oe=Object(r.useMemo)((function(){return de?new We.Vector3(c,s,d+ie+x):new We.Vector3(c,s,d+g/2+.02)}),[c,s,d,ie,de,x,_]),Ye=Object(r.useMemo)((function(){return(new We.Euler).fromArray([].concat(Object(f.a)(P),["ZXY"]))}),[P]),Le=Object(r.useMemo)((function(){return de?new We.Euler(m,0,w,"ZXY"):new We.Euler}),[m,w,de]),Ne=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 We.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 We.Vector3(o*l-ae,-oe,g),new We.Vector3(o*l-ae,oe,g)]});for(var i=0;i<=t;i++)Pe.current.push({points:[new We.Vector3(-ae,i*a-oe,g),new We.Vector3(ae,i*a-oe,g)]})}}),[L,n,p,y,g]);var Ue=Math.max(1,(p+y)/16),Ee=st*Ue*2,Ve=dt*Ue*1.5,Je=2*Ue/3,Ge=function(){var e=Xw.getState().elements.find((function(e){return e.id===k&&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,Me.current=m,Ce.current=Object(f.a)(H),Ie.current=Object(f.a)(P),te.current=e),ye(!0),je.current=!0,Nt.getState().setEnableOrbitController(!1)},Xe=function(e){ke.x=e.offsetX/be.domElement.clientWidth*2-1,ke.y=-e.offsetY/be.domElement.clientHeight*2+1,Fe.setFromCamera(ke,Ae)},Be=function(e){if(Xw.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(f.a)(Re.current),oldNor:Object(f.a)(Ce.current),oldPos:Object(f.a)(ze.current),oldRot:Object(f.a)(Ie.current),newDms:[e.lx,e.ly,e.lz],newPos:[e.cx,e.cy,e.cz],newNor:Object(f.a)(e.normal),newRot:Object(f.a)(e.rotation),undo:function(){N((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(f.a)(t.oldPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(t.oldDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(f.a)(t.oldNor),o.rotation=Object(f.a)(t.oldRot);break}}}catch(n){a.e(n)}finally{a.f()}}))},redo:function(){N((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(f.a)(t.newPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(t.newDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(f.a)(t.newNor),o.rotation=Object(f.a)(t.newRot);break}}}catch(n){a.e(n)}finally{a.f()}}))}};Xw.getState().addUndoable(t)}}else if(Xw.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(){Xw.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.oldValue)},redo:function(){Xw.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.newValue)}};Xw.getState().addUndoable(l)}},Ke=Xw((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===F)return a}}catch(o){l.e(o)}finally{l.f()}})),qe=tg(p,y,le,L,R,D),Qe=eg(a);return Ke&&Ke.type===V.Roof&&0===Ke.opacity?null:Object(pf.jsxs)("group",{name:"Solar Panel Group Grandpa "+a,rotation:Ye,position:Oe,children:[Object(pf.jsxs)("group",{name:"Solar Panel Group Dad "+a,rotation:Le,children:[Object(pf.jsxs)(Lt.a,{receiveShadow:G,castShadow:G,uuid:a,ref:Te,args:[p,y,g],name:"Solar Panel",onPointerDown:function(e){2!==e.button&&Xw.getState().objectTypeToAdd===V.None&&U(a,e,X.Select)},onContextMenu:function(e){U(a,e,X.Select),N((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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),J&&Qe?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Qe}):qe?Q||0===B?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:qe,color:z}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:We.FrontSide,map:qe,color:z}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),0===(null===le||void 0===le?void 0:le.bifacialityFactor)||Q||0===x&&0===m?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}):qe?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:We.FrontSide,map:qe,color:z}):null]}),ee&&!C&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(ag,{id:a,handleSize:Ee,parentId:F,foundationId:k}),Object(pf.jsxs)("group",{name:"Resize Handle Group",children:[Object(pf.jsx)(og,{pos:[-ae,0,ie],dms:[g,Ve],handleType:K.Left,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[ae,0,ie],dms:[g,Ve],handleType:K.Right,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[0,-oe,ie],dms:[g,Ve],handleType:K.Lower,initPointerDown:Ge}),Object(pf.jsx)(og,{pos:[0,oe,ie],dms:[g,Ve],handleType:K.Upper,initPointerDown:Ge})]})]}),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:a,position:[0,0,Hy],args:[p,y],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),J&&Qe&&Pe.current&&Pe.current.map((function(e,t){return Object(pf.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(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Rotate Handle Group",rotation:[0,0,Le.z],children:[Object(pf.jsx)(ig,{position:[0,-oe-1,0],ratio:1,handleType:q.Lower,initPointerDown:Ge}),Object(pf.jsx)(ig,{position:[0,oe+1,0],ratio:1,handleType:q.Upper,initPointerDown:Ge})]}),Object(pf.jsx)(rg,{rotationZ:w,tiltAngle:m,handleSize:Je,initPointerDown:Ge,handlePointerMove:function(e,t){if(je.current&&(Xe(e),t.current&&Xw.getState().rotateHandleType===q.Tilt)){var l=Fe.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 We.Vector3);if(r){var n=(new We.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)),Xw.getState().updateSolarPanelTiltAngleById(a,c)}}}}},handlePointerUp:function(){var e=E(a);if(e&&Me.current&&Math.abs(e.tiltAngle-Me.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Me.current,newValue:e.tiltAngle,changedElementId:a,changedElementType:V.SolarPanel,undo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Xw.getState().addUndoable(t)}}})]}),pe&&Object(pf.jsx)(Lt.f,{ref:He,args:[1e3,1e3],visible:!1,onPointerMove:function(e){if(He.current&&je.current&&te.current&&le){Xe(e);var t=Fe.intersectObjects([He.current]);if(t.length>0){var l=t[0].point;if(l.z<.001)return;var o=Xw.getState().rotateHandleType;if(Xw.getState().resizeHandleType){var i=de?w:0,r=Xw.getState().resizeAnchor,n=new We.Vector3(te.current.cx,te.current.cy,te.current.lz),d=(new We.Vector3).subVectors(l,r).applyEuler(new We.Euler(0,0,-P[2]-te.current.rotation[2]-i));N((function(e){var t,l,o,c=Object(h.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,f=Math.abs(d.x),p=Math.max(1,Math.ceil((f-u/2)/u))*u,y=new We.Vector3(Math.sign(d.x)*p/2,0,0).applyEuler(new We.Euler(0,0,P[2]+te.current.rotation[2]+i)),g=(new We.Vector3).addVectors(r,y).sub(n).applyEuler(new We.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 We.Vector3(0,T*Math.sign(d.y)/2,0).applyEuler(new We.Euler(P[0],P[1],P[2]+te.current.rotation[2]+i,"ZXY")),H=(new We.Vector3).addVectors(r,S).sub(n).applyEuler(new We.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=H.x/te.current.lx,s.cy=H.y/te.current.ly,de||(s.cz=H.z-ie))}break}}}catch(j){c.e(j)}finally{c.f()}}))}else if(o===q.Lower||o===q.Upper){var u=te.current.rotation[2],f=new We.Vector2(te.current.cx,te.current.cy),p=new We.Vector2(c,s).rotateAround(Dt,u),y=(new We.Vector2).addVectors(p,f),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);Xw.getState().updateSolarCollectorRelativeAzimuthById(a,v)}}}},onPointerUp:function(){if(je.current){var e=E(F);if(e&&k){var t=E(a),l=te.current;if(t&&l){var o=Zm.getRoofBoundaryVertices(e),i=Zm.getSolarPanelVerticesOnRoof(t,l);Hp(i,o)&&jp(t,l,i)?Be(t):N((function(e){if(ze.current&&null!==De.current&&Ce.current&&Re.current&&Ie.current){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a){var i=Object(f.a)(ze.current);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(f.a)(Re.current);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.relativeAzimuth=De.current,o.normal=Object(f.a)(Ce.current),o.rotation=Object(f.a)(Ie.current);break}}}catch(n){l.e(n)}finally{l.f()}}}))}}Nt.getState().setEnableOrbitController(!0),je.current=!1,ye(!1),N((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,e.updateElementOnRoofFlag=!0})),te.current=null}}}),de&&x>0&&Ne.map((function(e,t){return Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:z})},t)})),Object(pf.jsx)(ng,{drawSunbeam:A,rotation:P,normal:H,relativeEuler:Le,fRotation:null!==(l=null===O||void 0===O?void 0:O.rotation[2])&&void 0!==l?l:0}),(we||M)&&!ee&&Object(pf.jsx)(cg,{id:a})]})},dg=function(e){var t=e.lx,l=e.lz,a=e.parentId,o=e.id,i=e.roofId,n=Xw(Lu);Object(r.useEffect)((function(){n===i&&Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o&&a.type===V.Wall){var i=a;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()}}))}),[n]);return Object(pf.jsx)(Lt.f,{args:[t,l],rotation:[vt,0,0],visible:!1,onPointerDown:function(e){Xw.getState().groupActionMode?(Xw.getState().set((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.selected=o.id===a}}catch(i){l.e(i)}finally{l.f()}e.groupMasterId=a,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(a)})),e.stopPropagation()):function(e){return!(2===e.button||Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().objectTypeToAdd!==V.None||Xw.getState().isAddingElement())}(e)&&(Xw.getState().set((function(e){e.contextMenuObjectType=null})),Xw.getState().selectMe(o,e,X.Select))},onContextMenu:function(e){Xw.getState().selectMe(o,e,X.Select),Xw.getState().set((function(t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})})},ug=n.a.memo(dg),fg=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(pf.jsx)(Lt.h,{name:a,args:[l],position:[0,t,0],onPointerEnter:function(){c(pt)},onPointerOut:function(){c(ft)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},hg=function(e){var t=e.ply,l=e.phz,a=wp();return Object(pf.jsxs)("group",{name:"Move Handle Group",position:[0,0,-l],onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject.parent===e.eventObject&&(Xw.getState().set((function(t){t.moveHandleType=e.object.name})),Nt.getState().setEnableOrbitController(!1))},children:[Object(pf.jsx)(fg,{cy:-a,size:a,type:B.Lower}),Object(pf.jsx)(fg,{cy:t+a,size:a,type:B.Upper})]})},pg=n.a.memo(hg),yg=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=Xw(si),s=Xw(zu),d=Xw(Ou),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(pf.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(pf.jsx)("meshBasicMaterial",{color:g})})})),gg=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=Xw(si),T=Xw(o.orthographic),P=wp(),S=Object(r.useState)(!1),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(new We.Vector3),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(new We.Euler),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(null),Y=Object(r.useRef)(!1),L=Object(r.useRef)([2*n,s,d]),N=Object(r.useRef)(new Map),U=Object(r.useRef)(null),E=Object(r.useRef)(null),J=Object(r.useRef)([]),G=Object(r.useMemo)((function(){if(!a)return null;var e=Xw.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=Xw.getState().cameraDirection,l=Math.atan2(t.x,t.y);M(new We.Vector3(e,0,0)),k(new We.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(h.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 f=l.get(d.id);void 0!==f&&(d.lz=f,d.cz=f/2)}}}catch(p){s.e(p)}finally{s.f()}}))},q=function(){a&&(v.length>0||b.length>0)&&(G===It.Gable||G===It.Gambrel?Xw.getState().elements.forEach((function(e){e.id===v[0]&&(U.current=e.lz),e.id===b[0]&&(E.current=e.lz)})):(N.current.clear(),Xw.getState().elements.forEach((function(e){e.type===V.Wall&&e.roofId===a&&N.current.set(e.id,e.lz)}))))},Q=function(){J.current=Xw.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&&(!Ww.isZero(m-p)||!Ww.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(h.a)(J.current);try{for(n.s();!(r=n.n()).done;){var c=r.value,s=c.cx,d=c.cz,f=c.lx,p=c.ly,y=c.lz;if(s*=e.lx,d*=e.lz,c.type!==V.SolarPanel?(f*=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:Zg,b=Object(u.a)(v,2),A=b[0],T=b[1],P=s+A*f,S=d+y/2+T;if(!Ww.isPointInside(P,S,i))return!1}if(!Ww.isElementInsideWall(new We.Vector3(s,0,d),f,y,i,c.type===V.Door))return!1}}catch(H){n.e(H)}finally{n.f()}}return!0};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Wall Resize Handle Group",onPointerDown:function(e){var t;if(!Xw.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 We.Vector3(2*i,0,0)))}));break;case K.LowerRight:A((function(e){e.resizeAnchor.copy(l.localToWorld(new We.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})),Nt.getState().setEnableOrbitController(!1),Y.current=!0,L.current=[2*n,s,d,p,y]}},children:[Object(pf.jsx)(yg,{x:-i,z:-n,handleType:K.LowerLeft,highLight:x,handleSize:P}),Object(pf.jsx)(yg,{x:i,z:-n,handleType:K.LowerRight,highLight:x,handleSize:P}),!T&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(yg,{x:-i,z:n,handleType:K.UpperLeft,highLight:x,handleSize:P}),Object(pf.jsx)(yg,{x:i,z:n,handleType:K.UpperRight,highLight:x,handleSize:P}),g===Ue.Partial&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(yg,{x:-i,z:-n+s,handleType:K.WallPartialResizeLeft,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:i,z:-n+d,handleType:K.WallPartialResizeRight,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:-i,z:-n+p,handleType:K.WallPartialResizeLeftTop,highLight:x,handleSize:P,partial:!0}),Object(pf.jsx)(yg,{x:i,z:-n+y,handleType:K.WallPartialResizeRightTop,highLight:x,handleSize:P,partial:!0})]})]})]}),j&&Object(pf.jsx)(Lt.f,{ref:O,position:W,rotation:F,args:[1e4,1e4],visible:!1,onPointerMove:function(e){if(0!==e.intersections.length&&Y.current){var o=e.intersections[0].point;switch(Xw.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||E.current){var n,c,u=Math.abs(r-(null!==(n=U.current)&&void 0!==n?n:1/0)),f=Math.abs(r-(null!==(c=E.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(h.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=Ww.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=Ww.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=Ww.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(){Nt.getState().setEnableOrbitController(!0),z(!1),U.current=null,E.current=null,Y.current=!1;var e=new Map;a&&G!==It.Gable&&G!==It.Gambrel&&Xw.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(f.a)(L.current),newHeights:[2*n,s,d,p,y],oldSameBuildingWallsHeightMap:new Map(N.current),newSameBuildingWallsHeightMap:e,undo:function(){B(this.resizedElementId,this.oldHeights,this.oldSameBuildingWallsHeightMap)},redo:function(){B(this.resizedElementId,this.newHeights,this.newSameBuildingWallsHeightMap)}};Xw.getState().addUndoable(l),A((function(e){e.actionState.wallHeight=2*n,e.resizeHandleType=null}))},children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})})]})})),mg=function(e){var t=e.wallModel,l=e.foundationModel;!function(e){var t=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.wallStructure&&void 0!==e.structureSpacing&&void 0!==e.structureWidth&&void 0!==e.structureColor&&void 0!==e.opacity&&void 0!==e.fill&&void 0!==e.leftUnfilledHeight&&void 0!==e.rightUnfilledHeight&&void 0!==e.leftTopPartialHeight&&void 0!==e.rightTopPartialHeight&&void 0!==e.eavesLength&&void 0!==e.parapet||Xw.getState().set((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&"break"===function(){var e=o;if(void 0===e.wallStructure&&(e.wallStructure=Ee.Default),void 0===e.structureSpacing&&(e.structureSpacing=2),void 0===e.structureWidth&&(e.structureWidth=.1),void 0===e.structureColor&&(e.structureColor="white"),void 0===e.opacity&&(e.opacity=.5),void 0===e.fill&&(e.fill=Ue.Full),void 0===e.unfilledHeight&&(e.unfilledHeight=.5),void 0===e.leftUnfilledHeight||void 0===e.rightUnfilledHeight){var l,a=null!==(l=e.unfilledHeight)&&void 0!==l?l:.5;e.leftUnfilledHeight=a,e.rightUnfilledHeight=a}if(void 0!==e.leftTopPartialHeight&&void 0!==e.rightTopPartialHeight||(e.leftTopPartialHeight=e.lz,e.rightTopPartialHeight=e.lz),void 0===e.eavesLength){var i=t.elements.find((function(t){return t.id===e.roofId&&t.type===V.Roof}));e.eavesLength=i&&void 0!==i.overhang?i.overhang:.3}return void 0===e.parapet&&(e.parapet=Object(d.a)({},up)),"break"}())break}}catch(i){a.e(i)}finally{a.f()}}))}),[t])}(t);var a=t.id,o=t.roofId,i=t.cx,n=t.cy,c=t.lx,s=t.ly,u=t.lz,f=t.relativeAngle,p=t.fill,y=t.locked,g=t.leftUnfilledHeight,m=t.rightUnfilledHeight,w=t.leftTopPartialHeight,x=t.rightTopPartialHeight,v=t.leftJoints,b=t.rightJoints,A=_f(a),T=c/2,P=u/2,S=p===Ue.Partial,H=v.length>0?t.leftRoofHeight:u,j=b.length>0?t.rightRoofHeight:u,z=null!==H&&void 0!==H?H:u,R=null!==j&&void 0!==j?j:u,D=S?Math.min(z,w):z,W=S?Math.min(R,x):R,M=0===c;return Object(pf.jsxs)("group",{name:"Wall Group ".concat(a),position:[i,n,P],rotation:[0,0,f],userData:{aabb:!0},children:[p===Ue.Empty?Object(pf.jsx)(ug,Object(d.a)({},t)):Object(pf.jsx)(Qm,{wallModel:t,foundationModel:l}),A&&!y&&Object(pf.jsxs)(pf.Fragment,{children:[c>.5&&Object(pf.jsx)(pg,{ply:s,phz:P}),Object(pf.jsx)(gg,{id:a,parentLz:l.lz,roofId:o,absAngle:f+l.rotation[2],x:T,z:P,leftUnfilledHeight:g,rightUnfilledHeight:m,leftTopPartialResizeHandleHeight:D,rightTopPartialResizeHandleHeight:W,fill:p,wallLeftHeight:z,wallRightHeight:R,highLight:M,leftJoints:v,rightJoints:b})]})]})},wg=function(e,t){return e.wallModel===t.wallModel},xg=n.a.memo(mg,wg),vg="Building Group",bg=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=Xw((function(e){return e.elements.filter(i)}),qf.a);return 0===r.length?null:Object(pf.jsx)("group",{name:vg,position:[0,0,o/2],children:r.map((function(t){switch(t.type){case V.Wall:return Object(pf.jsx)(xg,{wallModel:t,foundationModel:e},t.id);case V.Roof:return Object(pf.jsx)(Op,{roofModel:t,foundationModel:e},t.id);case V.SolarPanel:return Object(pf.jsx)(sg,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(pf.jsx)($g,Object(d.a)(Object(d.a)({},t),{},{cz:t.cz}),t.id);default:return null}}))})},Ag=function(e,t){return e.lx===t.lx&&e.ly===t.ly&&e.lz===t.lz&&e.rotation===t.rotation},Tg=n.a.memo(bg,Ag),Pg="Foundation Group",Sg=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,H=e.lineWidth,j=void 0===H?.2:H,z=e.locked,R=void 0!==z&&z,D=e.showLabel,W=void 0!==D&&D,M=e.textureType,I=void 0===M?se.NoTexture:M,C=e.solarStructure,F=_f(n),k=Xw(Vi),O=Xw(o.orthographic),Y=Xw(Zr),L=Xw(an),N=Xw(si),U=Xw(nn),E=Xw(cn),J=Xw(bn),Q=Xw(Pn),Z=Xw($u),_=Xw(ef),ee=Xw(tf),te=Xw(ic),le=Xw(Bn),ae=Xw(Kn),oe=Xw(ts),ie=Xw(as),re=Xw(Kc),ne=Xw(os),ce=Xw(rs),de=Xw(Ni),ue=Xw(Yu),fe=Xw(Bu),he=Xw(o.shadowEnabled),ye=Xw(o.groundImage),ge=Xw(Iu),we=Xw(Sr),xe=Xw(Mu),ve=Xw(on),be=Xw(Hu),Ae=bf(Us),Te=Xw(o.solarRadiationHeatmapMaxValue),He=Xw(o.solarRadiationHeatmapReflectionOnly),je=Af(wi),ze=Xw(Vu),Re=Zf(e,ze),De=Re.baseGroupSet,Me=Re.childCuboidSet,Ie=Re.groupMasterDimension,Ce=Re.groupMasterPosition,Fe=Re.groupMasterRotation,ke=Object(Se.f)(),Oe=ke.camera,Ye=ke.gl.domElement,Le=Object(r.useState)(!1),Ne=Object(u.a)(Le,2),Ue=Ne[0],Ee=Ne[1],Ve=Object(r.useState)(null),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(!1),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)({show:!1,direction:null,position:null}),_e=Object(u.a)(Ze,2),$e=_e[0],et=_e[1],tt=Object(r.useState)([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]),lt=Object(u.a)(tt,2),at=lt[0],ot=lt[1],it=Object(r.useRef)(null),rt=Object(r.useRef)(!1),nt=Object(r.useRef)(!1),ct=Object(r.useRef)(null),st=Object(r.useRef)(kp.null),dt=Object(r.useRef)(new Map),gt=Object(r.useRef)(null),mt=Object(r.useRef)(),wt=Object(r.useRef)(null),xt=Object(r.useRef)(),Tt=Object(r.useRef)(),Pt=Object(r.useRef)(),St=Object(r.useRef)(),Ht=Object(r.useRef)(),jt=Object(r.useRef)(),zt=Object(r.useRef)(),Wt=Object(r.useRef)(),Mt=Object(r.useRef)(),It=Object(r.useRef)(new We.Vector3),Ct=Object(r.useRef)(new We.Vector3),Ft=Object(r.useRef)(new We.Vector3(1,1,1)),kt=Object(r.useRef)(new We.Vector3(1,1,1)),Ot=Object(r.useRef)(0),Yt=Object(r.useRef)(0),Ut=Object(r.useRef)([]),Et=Object(r.useRef)([]),Vt=Object(r.useRef)([]),Jt=Object(r.useRef)([]),Gt=Object(r.useRef)([]),Xt=Object(r.useRef)([]),Bt=Object(r.useMemo)((function(){return{lng:k}}),[k]),Kt=Object(r.useMemo)((function(){return new We.Vector2}),[]),qt=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Qt=y/2,Zt=m/2,_t=x/2,$t=Object(r.useMemo)((function(){return new We.Vector3(-Qt,-Zt,_t)}),[Qt,Zt,_t]),el=Object(r.useMemo)((function(){return new We.Vector3(-Qt,Zt,_t)}),[Qt,Zt,_t]),tl=Object(r.useMemo)((function(){return new We.Vector3(Qt,-Zt,_t)}),[Qt,Zt,_t]),ll=Object(r.useMemo)((function(){return new We.Vector3(Qt,Zt,_t)}),[Qt,Zt,_t]),al=wp(),ol=al,il=al,rl=4*al,nl=Zt+rl,cl=Object(r.useRef)(!1),sl=Object(r.useRef)(null),dl=Xw(Nu),ul=Xw(Uu),fl=Object(r.useMemo)((function(){return new We.Vector3}),[]);if(wt.current){var hl=-1;switch(wt.current.type){case V.SolarPanel:hl=wt.current.poleHeight;break;case V.ParabolicTrough:var pl=wt.current;hl=pl.poleHeight+pl.lx/2;break;case V.ParabolicDish:var yl=wt.current;hl=yl.poleHeight+yl.lx/2+yl.lx*yl.lx/(4*yl.latusRectum);break;case V.FresnelReflector:var gl=wt.current;hl=gl.poleHeight+gl.lx/2}hl>=0&&fl.set(0,0,(null===e||void 0===e?void 0:e.lz)/2+hl)}Object(r.useEffect)((function(){dt.current.clear();var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Wall&&l.parentId===n&&dt.current.set(l.id,l)}}catch(a){t.e(a)}finally{t.f()}}),[fe]),Object(r.useEffect)((function(){ue&&ue===it.current&&(dt.current.delete(ue),rt.current=!1,nt.current=!1,it.current=null,N((function(e){e.addedWallId===e.deletedWallId&&(e.addedWallId=null),e.deletedWallId=null})),Nt.getState().setEnableOrbitController(!0),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]))}),[ue]),Object(r.useEffect)((function(){if(e&&Ae){var t=je(e.id);Xe(t?Ww.fetchHeatmapTexture(t,null!==Te&&void 0!==Te?Te:5):null)}}),[Ae,Te,He]),Object(r.useEffect)((function(){cl.current&&Xw.getState().getAutoDeletedElements()&&ml()}),[dl,ul]);var ml=Object($y.debounce)((function(){if(sl.current){var e=Xw.getState().getAutoDeletedElements();if(e){var t=sl.current,l=t.wall,a=t.newAngle,o=t.newJoints,i={name:"Move Wall",timestamp:Date.now(),id:l.id,oldPoints:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoints:[Object(f.a)(l.leftPoint),Object(f.a)(l.rightPoint)],oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(o[0]),Object(f.a)(o[1])],oldAngle:Ot.current,newAngle:a,flippedWallSide:st.current,autoDeletedElements:Object(f.a)(e),undo:function(){var e=this;switch(this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var t=Y(this.newJoints[0][0]);t&&Rl(t);break;case kp.right:var l=Y(this.newJoints[1][0]);l&&Dl(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];N((function(t){var l,a,r=Object(h.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(f.a)(s),p.rightPoint=Object(f.a)(d),p.leftJoints=Object(f.a)(o),p.rightJoints=Object(f.a)(i);break}}}catch(y){r.e(y)}finally{r.f()}t.resizeHandleType=null,(l=t.elements).push.apply(l,Object(f.a)(e.autoDeletedElements)),t.deletedRoofId=null,t.autoDeletedChild=null,t.autoDeletedRoof=null})),o[0]!==n[0]&&N((function(t){var l,a=Object(h.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!==kp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&N((function(t){var l,a=Object(h.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!==kp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),st.current=kp.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(N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(i),d.rightJoints=Object(f.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&N((function(t){var a,o=Object(h.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===kp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&N((function(t){var l,o=Object(h.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===kp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var n=Y(this.newJoints[0][0]);n&&Dl(n);break;case kp.right:var c=Y(this.newJoints[1][0]);c&&Rl(c)}var s=new Set(this.autoDeletedElements.map((function(e){return e.id})));N((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)})),st.current=kp.null}};we(i),cl.current=!1,N((function(e){e.autoDeletedRoof=null,e.autoDeletedChild=null}))}}}),100),wl=function(e){Kt.x=e.offsetX/Ye.clientWidth*2-1,Kt.y=-e.offsetY/Ye.clientHeight*2+1,qt.setFromCamera(Kt,Oe)},xl=Object(r.useMemo)((function(){var e;switch(I){case se.Texture01:e=ty;break;case se.Texture02:e=ly;break;case se.Texture03:e=ay;break;case se.Texture04:e=oy;break;case se.Texture05:e=iy;break;case se.Texture06:e=ry;break;case se.Texture07:e=ny;break;default:e=Tf}return(new We.TextureLoader).load(e,(function(e){e.wrapS=e.wrapT=We.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),Tl(e)}))}),[I,y,m]),vl=Object(r.useState)(xl),bl=Object(u.a)(vl,2),Al=bl[0],Tl=bl[1],Pl=Object(r.useCallback)((function(e,t){bf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(N((function(e){e.hoveredHandle=t})),Ww.isMoveHandle(t)?Ye.style.cursor="move":t===q.Lower||t===q.Upper?Ye.style.cursor="grab":Ye.style.cursor=Xw.getState().addedFoundationId?"crosshair":"pointer")}),[]),Sl=Object(r.useCallback)((function(){N((function(e){e.hoveredHandle=null})),Ye.style.cursor=Xw.getState().addedFoundationId?"crosshair":"default"}),[]),Hl=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}},jl=function(e,t){var l=t,a=null,o=null,i=null,r=void 0;if(!Xw.getState().enableFineGrid){var n,c=Object(h.a)(dt.current);try{for(c.s();!(n=c.n()).done;){var s,d,f=Object(u.a)(n.value,2),p=f[0],y=f[1];if(!(p===it.current||wt.current&&p===wt.current.id)){var g=new We.Vector3(y.leftPoint[0],y.leftPoint[1],0),m=new We.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}},zl=function(e){dt.current.clear();var t,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&a.parentId===n&&dt.current.set(a.id,a)}}catch(r){l.e(r)}finally{l.f()}for(var o=dt.current.get(e),i=function(){var t=dt.current.get(o.id);return t?(N((function(e){var l,a=Object(h.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(f.a)(t.rightPoint),i.rightPoint=Object(f.a)(t.leftPoint),i.leftJoints=[t.rightJoints[0]],i.rightJoints=[t.leftJoints[0]];break}}}catch(r){a.e(r)}finally{a.f()}})),(o=dt.current.get(o.leftJoints[0]))&&o.id===e?"break":void 0):"break"};o&&o.leftJoints.length>0;){if("break"===i())break}N((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,Xw.getState().resizeHandleType&&(e.resizeHandleType=Xw.getState().resizeHandleType===K.LowerLeft?K.LowerRight:K.LowerLeft)})),st.current=st.current===kp.null?kp.loop:kp.null},Rl=function(e,t){dt.current.clear();var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&dt.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=dt.current.get(r.id);if(!e)return"break";N((function(t){var l,a=Object(h.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(f.a)(e.rightPoint),i.rightPoint=Object(f.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=dt.current.get(e.leftJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}N((function(e){if(t){var l,a=Object(h.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})),st.current=st.current===kp.null?kp.right:kp.null},Dl=function(e,t){dt.current.clear();var l,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&dt.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=dt.current.get(r.id);if(!e)return"break";N((function(t){var l,a=Object(h.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(f.a)(e.rightPoint),i.rightPoint=Object(f.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=dt.current.get(e.rightJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}N((function(e){if(t){var l,a=Object(h.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})),st.current=st.current===kp.null?kp.left:kp.null},Wl=function(e){var t=void 0;dt.current.clear();var l,a=Object(h.a)(Xw.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&&dt.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=dt.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=dt.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?zl(e):st.current!==kp.null&&(st.current=kp.loop)}return i},Ml=Object(r.useRef)(null),Il=Object(r.useRef)(null),Cl=Object(r.useRef)(!1),Fl=Object(r.useRef)(!1),kl=Object(r.useRef)(!1),Ol=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},Yl=function(e,t){var l,a=null,o=null,i=1/0,r=1/0,n=Object(h.a)(dt.current);try{for(n.s();!(l=n.n()).done;){var c=Object(u.a)(l.value,2),s=(c[0],c[1]);if(null!==wt.current&&s.id!==wt.current.id&&s.id!==t){var d=Math.abs(e.x-s.leftPoint[0]),f=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(h.a)(dt.current);try{for(c.s();!(t=c.n()).done;){var s=Object(u.a)(t.value,2),d=(s[0],s[1]);if(null!==wt.current&&d.id!==wt.current.id&&d.id!==a){var f=Math.abs(e.x-d.leftPoint[0]),p=Math.abs(e.x-d.rightPoint[0]);f<.01&&ft.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,Ww.isSolarCollectorWithinHorizontalSurface(r,e)},Bl=ye?O?.25:.75:1;return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{ref:gt,name:"".concat(Pg," ").concat(n),userData:{aabb:!0},position:[c,s,_t],rotation:[0,0,b[2]],children:[Object(pf.jsxs)(Lt.a,{castShadow:he,receiveShadow:he,uuid:n,userData:{simulation:!0,stand:!0},ref:mt,name:"Foundation",args:[y,m,x],onContextMenu:function(e){N((function(t){(_y.selectMe(t,n,e,X.Select),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===mt.current&&(t.contextMenuObjectType=V.Foundation);t.pasteNormal=Rt}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===mt.current&&Ee(!0))},onPointerDown:function(t){if(2!==t.button){N((function(e){e.contextMenuObjectType=null})),Xw.getState().objectTypeToAdd===V.Window||xe()||ne(n,t,X.Select);var l=L(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Xw.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===n||a)if(Xw.getState().groupActionMode&&Xw.getState().setGroupMasterId(n),Hl(Xw.getState().objectTypeToAdd)){if(e){Qe(!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(){N((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};we(t)}(i),N((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None)}))}}else Nt.getState().selectNone(),Nt.setState((function(e){e.foundationRef=gt}));else if(l&&l.parentId===n&&Hl(l.type))switch(wt.current=l,l.type!==V.Wall||rt.current||(ct.current=Object(f.a)(Xw.getState().elements)),Qe(!0),It.current.set(l.cx,l.cy,l.cz),Ft.current.set(l.lx,l.ly,l.lz),l.type){case V.SolarPanel:case V.ParabolicTrough:case V.FresnelReflector:Ot.current=l.relativeAzimuth;break;case V.Polygon:Ut.current=l.vertices.map((function(e){return Object(d.a)({},e)}));break;case V.Wall:var r=l;Ot.current=r.relativeAngle,Vt.current=[Object(f.a)(r.leftJoints),Object(f.a)(r.rightJoints)],Gt.current=[Object(f.a)(r.leftPoint),Object(f.a)(r.rightPoint)],Ml.current=r.leftJoints[0],Il.current=r.rightJoints[0],dt.current.clear();var c,s=Object(h.a)(Xw.getState().elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;u.type===V.Wall&&u.parentId===n&&dt.current.set(u.id,u)}}catch(T){s.e(T)}finally{s.f()}}if(rt.current&&it.current&&mt.current){var p=qt.intersectObjects([mt.current]);if(0===p.length)return;var y=Ww.wallRelativePosition(p[0].point,e);at[0].position&&(y.setX(at[0].position[0]),y.setY(at[0].position[1]));var g=jl(y,1.5),m=g.id,w=g.point,x=g.side,v=g.jointId;y=function(e,t){return Xw.getState().enableFineGrid?(e=Ww.snapToFineGrid(e),t=null):e=t||Ww.snapToNormalGrid(e),e}(y,w);var b=K.LowerRight;if(m){var A=Y(m);x===pe.Right?N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===it.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=it.current?[it.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})):x!==pe.Left||v||(N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===it.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=it.current?[it.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})),b=K.LowerLeft)}else U(it.current,y.x,y.y);rt.current=!1,nt.current=!0,ee(it.current,[y.x,y.y,y.z]),N((function(t){t.resizeHandleType=b,t.resizeAnchor=Ww.wallAbsolutePosition(y,e)})),Nt.getState().setEnableOrbitController(!1),wt.current=l}}else t.altKey&&ne(n,t,X.Select)},onPointerUp:function(e){if(e.altKey&&2===e.button&&ie&&ie.length>0){N((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(h.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(){N((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(l.pastedElements)),e.selectedElement=l.pastedElements[0]}))}};we(l)}}if(wt.current&&wt.current.parentId===n&&wt.current.type!==V.Tree&&wt.current.type!==V.Flower&&wt.current.type!==V.Human){var a=Y(wt.current.id);if(a){switch(a.type){case V.Wall:var o=a;if(rt.current)N((function(e){e.elements.pop(),e.addedWallId=null,e.actionModeLock&&(e.objectTypeToAdd=V.Wall,_y.selectNone(e))})),it.current&&dt.current.delete(it.current),it.current=null,rt.current=!1,nt.current=!1;else if(nt.current&&it.current&&mt.current)Nt.getState().setEnableOrbitController(!0),N((function(e){e.actionModeLock&&(e.objectTypeToAdd=V.Wall,_y.selectNone(e)),e.addedWallId=null,0===o.lx&&ct.current?(e.elements=Object(f.a)(ct.current),it.current&&dt.current.delete(it.current)):(!function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,flippedWallSide:st.current,undo:function(){var e=t.addedElement;if(re(e.id,!1),(t.flippedWallSide===kp.right||t.flippedWallSide===kp.loop)&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Dl(l)}else if(t.flippedWallSide===kp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Rl(a)}},redo:function(){var e=t.addedElement;if(t.flippedWallSide===kp.right||t.flippedWallSide===kp.loop&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Rl(l)}else if(t.flippedWallSide===kp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Dl(a)}e.rightJoints.length>0&&Z(e.rightJoints[0],[e.id]),e.leftJoints.length>0&&_(e.leftJoints[0],[e.id]),N((function(t){t.elements.push(e),t.selectedElement=e,t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}))}};we(t)}(o),dt.current.set(o.id,o))})),it.current=null,nt.current=!1;else if(Xw.getState().resizeHandleType)o.lx>.45?(dt.current.set(o.id,o),Ct.current.set(o.cx,o.cy,o.cz),kt.current.set(o.lx,o.ly,o.lz),Yt.current=o.relativeAngle,Jt.current=[Object(f.a)(o.leftJoints),Object(f.a)(o.rightJoints)],Xt.current=[Object(f.a)(o.leftPoint),Object(f.a)(o.rightPoint)],function(e){var t=Xw.getState().getAutoDeletedElements(),l={name:"Resize Wall",timestamp:Date.now(),resizedElementId:e.id,resizedElementType:e.type,oldPosition:It.current.clone(),newPosition:Ct.current.clone(),oldDimension:Ft.current.clone(),newDimension:kt.current.clone(),oldAngle:Ot.current,newAngle:Yt.current,oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(Jt.current[0]),Object(f.a)(Jt.current[1])],oldPoint:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoint:[Object(f.a)(Xt.current[0]),Object(f.a)(Xt.current[1])],flippedWallSide:st.current,autoDeletedElement:t?Object(f.a)(t):[],undo:function(){switch(l.flippedWallSide){case kp.right:if(l.newJoints[1]){var e=Y(l.newJoints[1][0]);e&&Dl(e)}break;case kp.left:if(l.newJoints[0]){var t=Y(l.newJoints[0][0]);t&&Rl(t)}break;case kp.loop:if(l.newJoints[0]&&l.newJoints[1])zl(l.resizedElementId);else if(l.newJoints[1]){var a=Y(l.newJoints[1][0]);a&&Dl(a)}else if(l.newJoints[0]){var o=Y(l.newJoints[0][0]);o&&Rl(o)}}N((function(e){var t,a,o=Object(h.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(f.a)(l.oldJoints[0]),r.rightJoints=Object(f.a)(l.oldJoints[1]),r.leftPoint=Object(f.a)(l.oldPoint[0]),r.rightPoint=Object(f.a)(l.oldPoint[1]),l.flippedWallSide){case kp.loop:if(l.oldJoints[0]!==l.newJoints[1]){var n,c=Object(h.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(h.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 kp.left:case kp.right:if(!l.oldJoints[0]&&l.newJoints[1]){var y,g=Object(h.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(h.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===kp.left&&l.oldJoints[0]){var b,A=Object(h.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===kp.right&&l.oldJoints[1]){var P,S=Object(h.a)(e.elements);try{for(S.s();!(P=S.n()).done;){var H=P.value;H.type===V.Wall&&(H.id===l.newJoints[0][0]&&(H.rightJoints=[]),H.id===l.oldJoints[1][0]&&(H.leftJoints=[r.id]))}}catch(I){S.e(I)}finally{S.f()}}break;case kp.null:if(l.oldJoints[0]!==l.newJoints[0]){var j,z=Object(h.a)(e.elements);try{for(z.s();!(j=z.n()).done;){var R=j.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,W=Object(h.a)(e.elements);try{for(W.s();!(D=W.n()).done;){var M=D.value;M.type===V.Wall&&(M.id===l.newJoints[1][0]&&(M.leftJoints=[]),M.id===l.oldJoints[1][0]&&(M.leftJoints=[r.id]))}}catch(I){W.e(I)}finally{W.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}break}}}catch(I){o.e(I)}finally{o.f()}(t=e.elements).push.apply(t,Object(f.a)(l.autoDeletedElement)),e.resizeHandleType=null,e.deletedRoofId=null,e.autoDeletedRoof=null,e.autoDeletedChild=null})),st.current=kp.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(N((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var a,o=Object(h.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 kp.left:r.relativeAngle=(l.newAngle+Math.PI)%bt;var n,c=Object(h.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 kp.right:r.relativeAngle=(l.newAngle+Math.PI)%bt;var d,u=Object(h.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 kp.loop:r.relativeAngle=(l.newAngle+Math.PI)%bt,r.leftJoints=Object(f.a)(l.newJoints[1]),r.rightJoints=Object(f.a)(l.newJoints[0]),r.leftPoint=Object(f.a)(l.newPoint[1]),r.rightPoint=Object(f.a)(l.newPoint[0]);var y,g=Object(h.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 kp.null:if(r.relativeAngle=l.newAngle,r.leftJoints=Object(f.a)(l.newJoints[0]),r.rightJoints=Object(f.a)(l.newJoints[1]),r.leftPoint=Object(f.a)(l.newPoint[0]),r.rightPoint=Object(f.a)(l.newPoint[1]),l.oldJoints[0][0]!==l.newJoints[0][0]){var w,x=Object(h.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(h.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(){N((function(e){e.deletedRoofId=null,e.autoDeletedRoof=null}))})),l.flippedWallSide){case kp.left:var t=Y(l.resizedElementId),a=Y(l.newJoints[1][0]);Dl(t,a);break;case kp.right:var o=Y(l.resizedElementId),i=Y(l.newJoints[0][0]);Rl(o,i);break;case kp.loop:dt.current.clear();var r,c=Object(h.a)(Xw.getState().elements);try{for(c.s();!(r=c.n()).done;){var s=r.value;s.type===V.Wall&&s.parentId===n&&dt.current.set(s.id,s)}}catch(d){c.e(d)}finally{c.f()}zl(l.resizedElementId)}st.current=kp.null}};we(l),N((function(t){t.actionState.wallHeight=e.lz,t.deletedRoofId=null,t.autoDeletedRoof=null,t.autoDeletedChild=[]}))}(o)):N((function(e){ct.current&&(e.elements=Object(f.a)(ct.current),ct.current=null)}));else if(Xw.getState().moveHandleType){var i=o.relativeAngle,r=[],c=[];if(Ml.current)if(o.leftJoints.length>0&&(Ml.current!==o.leftJoints[0]||Ml.current===o.leftJoints[0]&&Cl.current)&&_(o.leftJoints[0],[]),Cl.current)Z(Ml.current,[o.id]),c=[Ml.current];else if(r=[Ml.current],kl.current){Z(Ml.current,[o.id]);var s=Y(Ml.current);s&&Dl(s)}else _(Ml.current,[o.id]);else o.leftJoints.length>0&&o.leftJoints[0]!==Il.current&&(r=[],_(o.leftJoints[0],[]));if(Il.current)if(o.rightJoints.length>0&&(Il.current!==o.rightJoints[0]||Il.current===o.rightJoints[0]&&Cl.current)&&o.rightJoints[0]!==Ml.current&&Z(o.rightJoints[0],[]),Cl.current)_(Il.current,[o.id]),r=[Il.current];else if(c=[Il.current],Fl.current){_(Il.current,[o.id]);var p=Y(Il.current);p&&Rl(p)}else Z(Il.current,[o.id]);else o.rightJoints.length>0&&o.rightJoints[0]!==Ml.current&&(c=[],Z(o.rightJoints[0],[]));N((function(e){var t,l=Object(h.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(Cl.current){i=(n.relativeAngle+Math.PI)%bt,n.relativeAngle=i;var s=[Object(f.a)(n.rightPoint),Object(f.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(f.a)(r),n.rightJoints=Object(f.a)(c);break}}}catch(p){l.e(p)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Wl(o.id),function(e,t,l){if(e.roofId)cl.current=!0,sl.current={wall:e,newAngle:t,newJoints:[Object(f.a)(l[0]),Object(f.a)(l[1])]};else{var a={name:"Move Wall",timestamp:Date.now(),id:e.id,oldPoints:[Object(f.a)(Gt.current[0]),Object(f.a)(Gt.current[1])],newPoints:[Object(f.a)(e.leftPoint),Object(f.a)(e.rightPoint)],oldJoints:[Object(f.a)(Vt.current[0]),Object(f.a)(Vt.current[1])],newJoints:[Object(f.a)(l[0]),Object(f.a)(l[1])],oldAngle:Ot.current,newAngle:t,flippedWallSide:st.current,undo:function(){var e=this;switch(this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var t=Y(this.newJoints[0][0]);t&&Rl(t);break;case kp.right:var l=Y(this.newJoints[1][0]);l&&Dl(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];N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(o),d.rightJoints=Object(f.a)(i);break}}}catch(p){a.e(p)}finally{a.f()}t.resizeHandleType=null})),o[0]!==n[0]&&N((function(t){var l,a=Object(h.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!==kp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&N((function(t){var l,a=Object(h.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!==kp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),st.current=kp.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(N((function(t){var l,a=Object(h.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(f.a)(c),d.rightPoint=Object(f.a)(s),d.leftJoints=Object(f.a)(i),d.rightJoints=Object(f.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&N((function(t){var a,o=Object(h.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===kp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&N((function(t){var l,o=Object(h.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===kp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case kp.loop:zl(this.id);break;case kp.left:var n=Y(this.newJoints[0][0]);n&&Dl(n);break;case kp.right:var c=Y(this.newJoints[1][0]);c&&Rl(c)}N((function(e){e.resizeHandleType=null})),st.current=kp.null}};we(a)}}(o,i,[Object(f.a)(r),Object(f.a)(c)]),Cl.current=!1,kl.current=!1,Fl.current=!1,Ml.current=null,Il.current=null}st.current=kp.null,N((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]);break;case V.Polygon:if(Xw.getState().moveHandleType||Xw.getState().resizeHandleType){Et.current=a.vertices.map((function(e){return Object(d.a)({},e)}));var y={name:Xw.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:Ut.current,newValue:Et.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(Xw.getState().resizeHandleType){if(Ct.current.set(a.cx,a.cy,a.cz),kt.current.set(a.lx,a.ly,a.lz),Ct.current.distanceToSquared(It.current)>At||kt.current.distanceToSquared(Ft.current)>At){var g={name:"Resize",timestamp:Date.now(),resizedElementId:wt.current.id,resizedElementType:wt.current.type,oldCx:It.current.x,oldCy:It.current.y,oldCz:It.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:kt.current.x,newLy:kt.current.y,newLz:kt.current.z,undo:function(){U(g.resizedElementId,g.oldCx,g.oldCy,g.oldCz),E(g.resizedElementId,g.oldLx,g.oldLy,g.oldLz)},redo:function(){U(g.resizedElementId,g.newCx,g.newCy,g.newCz),E(g.resizedElementId,g.newLx,g.newLy,g.newLz)}};we(g)}}else if(Xw.getState().rotateHandleType){if(Ww.isSolarCollector(wt.current)){var m=wt.current;if(Math.abs(Yt.current-Ot.current)>At)if(Gl(m,Yt.current)){N((function(e){e.selectedElementAngle=Yt.current}));var w={name:"Rotate",timestamp:Date.now(),oldValue:Ot.current,newValue:Yt.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,Ot.current)}}else if(Ct.current.set(a.cx,a.cy,a.cz),Ct.current.distanceToSquared(It.current)>At){var x=!0;if(Ww.isSolarCollector(a)&&(x=Jl(a,a.cx,a.cy)),x){var v={name:"Move",timestamp:Date.now(),movedElementId:a.id,movedElementType:a.type,oldCx:It.current.x,oldCy:It.current.y,oldCz:It.current.z,newCx:Ct.current.x,newCy:Ct.current.y,newCz:Ct.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,It.current.x,It.current.y,It.current.z)}}Qe(!1),wt.current=null,N((function(e){e.resizeHandleType=null,e.moveHandleType=null}))}}},onPointerMove:function(t){var l,a;if(e&&(!wt.current||!Ww.isSolarCollector(wt.current))){var o=Xw.getState().objectTypeToAdd;if((wt.current||it.current||o===V.Wall)&&((null===(l=wt.current)||void 0===l?void 0:l.parentId)===n||o!==V.None)){var i=Xw.getState().moveHandleType,r=Xw.getState().resizeHandleType,c=Xw.getState().resizeAnchor;if(wl(t),mt.current){var s=qt.intersectObjects([mt.current]);if(0===s.length)return;var p=s[0].point;if(wt.current&&wt.current.type&&!wt.current.locked&&s.length>0)switch(wt.current.type){case V.Sensor:case V.Light:p=Ww.relativeCoordinates(p.x,p.y,p.z,e),U(wt.current.id,p.x,p.y);break;case V.Polygon:var y=wt.current;if(i===B.Default){p=Ww.relativeCoordinates(p.x,p.y,p.z,e);var g=Ww.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 We.Euler).fromArray(e.rotation.map((function(e){return-e})))),(p=Xw.getState().enableFineGrid?Ww.snapToFineGrid(p):Ww.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=Xw.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(wt.current.id);if(v){p=Ww.wallRelativePosition(p,e);var b=new We.Vector3,A=new We.Euler(0,0,v.relativeAngle);i===B.Lower?b.setY(al):i===B.Upper&&b.setY(-al-v.ly),p.add(b.applyEuler(A));var T=(new We.Vector3).addVectors(p,new We.Vector3(-v.lx/2,0,0).applyEuler(A)),P=(new We.Vector3).addVectors(p,new We.Vector3(v.lx/2,0,0).applyEuler(A)),S=null,H=null,j=!1;Cl.current=!1,kl.current=!1,Fl.current=!1,Ml.current=null,Il.current=null;var z=function(e,t){var l="left"===t?T:P,a=(new We.Vector3).subVectors(e,l);p.add(a),T.add(a),P.add(a)};if(!Xw.getState().enableFineGrid){var R=jl(T,1);R.point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Ml.current=R.id,S=R.side===pe.Left)):Ml.current=null;var D=jl(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||(Il.current=D.id,H=D.side===pe.Right)):Il.current=null,!R.point&&!D.point){var W=Yl(T),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Yl(P),k=Object(u.a)(F,2),O=k[0],L=k[1];if(null!==I||null!==O){var E=(null!==I&&void 0!==I?I:1/0)-T.x,J=(null!==O&&void 0!==O?O:1/0)-P.x,G=Math.min(E,J);T.setX(T.x+G),P.setX(P.x+G),p.setX(p.x+G),(R=jl(T,1)).point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Ml.current=R.id,S=R.side===pe.Left)):Ml.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=jl(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||(Il.current=D.id,H=D.side===pe.Right)):Il.current=null}}var Z=Ul(T,0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Ul(P,1),oe=Object(u.a)(te,2),ie=oe[0],re=oe[1];ot(Object(Pe.a)((function(e){e[0].show=$||ee,e[1].show=ie||re}))),S&&null===H||H&&null===S||S&&H?Cl.current=!0:(S&&!1===H||H&&!1===S)&&(kl.current=S,Fl.current=H),R.point&&D.point&&(R.id===D.id&&R.side===D.side||(T.copy(R.point),P.copy(D.point),j=!0))}N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,o=t.value;if(o.id===(null===(a=wt.current)||void 0===a?void 0:a.id)&&o.type===V.Wall){var i=o;if(j){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=Ww.wallRelativePosition(c,e);p=Ww.wallRelativePosition(p,e);var se,de,ue=null;if(Xw.getState().enableFineGrid)p=Ww.snapToFineGrid(p);else if(null===(se=ue=jl(p,1.5))||void 0===se?void 0:se.point)p=ue.point;else p=Ww.snapToNormalGrid(p),p=Ll(ne,p,r),(null===(de=ue=jl(p,1.5))||void 0===de?void 0:de.point)&&(p=ue.point);var fe=Ol(ne,p,r);Vl(p,fe);var he=p.distanceTo(ne),ye=(new We.Vector3).addVectors(p,ne).divideScalar(2),ge=r===K.LowerLeft?p:ne,me=r===K.LowerLeft?ne:p;N((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===wt.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(wt.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];N((function(e){var t,l=Object(h.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()}}))}Dl(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];N((function(e){var t,l=Object(h.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()}}))}Rl(we,xe)}else r===K.LowerRight&&ue.side===pe.Left&&0===xe.leftJoints.length&&xe.rightJoints[0]!==we.id?N((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(h.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&&N((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(h.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()}}));Wl(we.id)}}}else if(r===K.LowerRight&&we.rightJoints.length>0){var Ae=we.rightJoints[0];N((function(e){var t,l=Object(h.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];N((function(e){var t,l=Object(h.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&&!rt.current){ct.current=Object(f.a)(Xw.getState().elements);var Se=ce(e,p);wt.current=Se,it.current=Se.id,rt.current=!0,Qe(!0),Nt.getState().setEnableOrbitController(!1),N((function(e){e.addedWallId=Se.id,e.objectTypeToAdd=V.None}))}if(it.current&&rt.current){p=Ww.wallRelativePosition(s[0].point,e);var He,je=null;if(Xw.getState().enableFineGrid)p=Ww.snapToFineGrid(p);else if(null===(He=je=jl(p,1.5))||void 0===He?void 0:He.point)p=je.point;else{var ze;p=Ww.snapToNormalGrid(p);var Re=Yl(p),De=Object(u.a)(Re,2),Me=De[0],Ie=De[1];null!==Me&&p.setX(Me),null!==Ie&&p.setY(Ie),(null===(ze=je=jl(p,1.5))||void 0===ze?void 0:ze.point)&&(p=je.point)}var Ce=Ul(p),Fe=Object(u.a)(Ce,2),ke=Fe[0],Oe=Fe[1];ot(Object(Pe.a)((function(e){e[0].show=ke||Oe}))),U(it.current,p.x,p.y)}}}}},onPointerOut:function(){Ee(!1),Qe(!1),wt.current&&rt.current&&(re(wt.current.id,!1),rt.current=!1,N((function(e){e.addedWallId=null,e.objectTypeToAdd=V.Wall})),wt.current=null),et({show:!1,direction:null,position:null}),ot([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}])},onPointerEnter:function(e){wt.current&&Ww.isPlantOrHuman(wt.current)&&(e.intersections[0].object===mt.current&&Qe(!0))},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl}),Ae&&Ge?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",color:"white",map:Ge,transparent:ye,opacity:Bl}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:I===se.NoTexture?T:"white",map:Al,transparent:ye,opacity:Bl}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:Bl})]}),wt.current&&Ww.isSolarCollector(wt.current)&&!wt.current.locked&&Object(pf.jsx)(Lt.f,{ref:xt,name:"Foundation Intersection Plane",position:fl,args:[y,m],visible:!1,onPointerMove:function(t){if(xt.current&&e&&wt.current&&e){if(!Ww.isSolarCollector(wt.current))return;var l=wt.current;wl(t);var a=qt.intersectObjects([xt.current]);if(a.length>0){var o=a[0].point,i=Xw.getState().moveHandleType,r=Xw.getState().rotateHandleType,n=Xw.getState().resizeHandleType;if(i&&e)o=Ww.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 We.Vector2(e.cx,e.cy),f=new We.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,d),h=(new We.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),Yt.current=g}}else if(n){var w=Xw.getState().resizeAnchor,x=new We.Vector2(o.x,o.y),v=new We.Vector2(w.x,w.y),A=x.distanceTo(v),T=l.relativeAzimuth+b[2],P=(new We.Vector2).subVectors(x,v),S=new We.Vector2(c,s);if(l.type===V.SolarPanel){var H=l,j=de(H.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(H.orientation===$.portrait)D=Math.max(1,Math.ceil((D-j.length/2)/j.length))*j.length;else D=Math.max(1,Math.ceil((D-j.width/2)/j.width))*j.width;var W=w.x+z*(D*Math.sin(T))/2,M=w.y-z*(D*Math.cos(T))/2,I=new We.Vector2(W,M),C=(new We.Vector2).subVectors(I,S).rotateAround(Dt,-b[2]),F=C.x/y,k=C.y/m;Xl(l,F,k,l.lx,D)&&(Q(l.id,D),U(l.id,F,k));break;case K.Left:case K.Right:var O=n===K.Left?-1:1,Y=P.angle()-T+(n===K.Left?Math.PI:0),L=A*Math.cos(Y);if(H.orientation===$.portrait)L=Math.max(1,Math.ceil((L-j.width/2)/j.width))*j.width;else L=Math.max(1,Math.ceil((L-j.length/2)/j.length))*j.length;var E=w.x+O*(L*Math.cos(T))/2,G=w.y+O*(L*Math.sin(T))/2,X=new We.Vector2(E,G),B=(new We.Vector2).subVectors(X,S).rotateAround(Dt,-b[2]),Z=B.x/y,_=B.y/m;Xl(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 We.Vector2(ie,re),ce=(new We.Vector2).subVectors(ne,S).rotateAround(Dt,-b[2]),se=ce.x/y,ue=ce.y/m;Xl(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 We.Vector2(ye,ge),we=(new We.Vector2).subVectors(me,S).rotateAround(Dt,-b[2]),xe=we.x/y,ve=we.y/m;Xl(l,xe,ve,pe,l.ly)&&(J(l.id,pe),U(l.id,xe,ve),N((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,He=w.y-Ae*(Pe*Math.cos(T))/2,je=new We.Vector2(Se,He),ze=(new We.Vector2).subVectors(je,S).rotateAround(Dt,-b[2]),Re=ze.x/y,De=ze.y/m;Xl(l,Re,De,l.lx,Pe)&&(Q(l.id,Pe),U(l.id,Re,De));break;case K.Left:case K.Right:var Me=n===K.Left?-1:1,Ie=P.angle()-T+(n===K.Left?Math.PI:0),Ce=A*Math.cos(Ie),Fe=w.x+Me*(Ce*Math.cos(T))/2,ke=w.y+Me*(Ce*Math.sin(T))/2,Oe=new We.Vector2(Fe,ke),Ye=(new We.Vector2).subVectors(Oe,S).rotateAround(Dt,-b[2]),Le=Ye.x/y,Ne=Ye.y/m;Xl(l,Le,Ne,Ce,l.ly)&&(J(l.id,Ce),U(l.id,Le,Ne),N((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 Ee=Math.min(10,A);Xl(l,Ue.cx,Ue.cy,l.lx,Ee)&&(J(l.id,Ee),Q(l.id,Ee),N((function(e){e.actionState.parabolicDishRimDiameter=Ee})))}}}}}},onPointerOut:function(){if(wt.current&&Ww.isSolarCollector(wt.current)){var e=Xw.getState().getElementById(wt.current.id);Xw.getState().moveHandleType&&!Jl(e,e.cx,e.cy)&&U(e.id,It.current.x,It.current.y,It.current.z)}}}),qe&&Object(pf.jsxs)(pf.Fragment,{children:[Xw.getState().rotateHandleType&&wt.current&&Ww.isSolarCollector(wt.current)&&Object(pf.jsx)(sy,{element:wt.current,height:wt.current.poleHeight+_t}),(Xw.getState().moveHandleType||Xw.getState().resizeHandleType||it.current)&&Object(pf.jsx)(yf,{hx:Qt,hy:Zt,hz:_t})]}),F&&Object(pf.jsx)(yy,{element:e,verticalLift:ol}),(!F||ye)&&Object(pf.jsx)(hy,{hx:Qt,hy:Zt,hz:_t,lineColor:ye&&O?"white":S,lineWidth:ye&&O?3*j:j}),F&&R&&Object(pf.jsx)(hy,{hx:Qt,hy:Zt,hz:_t,lineColor:yt,lineWidth:5*j}),$e.show&&Object(pf.jsx)("group",{position:[0,0,_t+.01],children:Object(pf.jsx)(Hg,{hx:Qt,hy:Zt,position:$e.position,direction:$e.direction,color:"black"})}),Object(pf.jsx)("group",{position:[0,0,_t+.01],children:at.map((function(e,t){return e.show?Object(pf.jsx)(Hg,{hx:Qt,hy:Zt,position:e.position,direction:e.direction,color:"yellow"},t):null}))}),F&&!R&&!ze&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.a,{ref:Tt,position:[$t.x,$t.y,0],args:[il,il,1.2*x],name:K.LowerLeft,onPointerDown:function(e){ne(n,e,X.Resize),Tt.current&&N((function(e){var t=Tt.current.localToWorld(new We.Vector3(y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.LowerLeft)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerLeft||Xw.getState().resizeHandleType===K.LowerLeft?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Pt,position:[el.x,el.y,0],args:[il,il,1.2*x],name:K.UpperLeft,onPointerDown:function(e){ne(n,e,X.Resize),Pt.current&&N((function(e){var t=Pt.current.localToWorld(new We.Vector3(y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.UpperLeft)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperLeft||Xw.getState().resizeHandleType===K.UpperLeft?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:St,position:[tl.x,tl.y,0],args:[il,il,1.2*x],name:K.LowerRight,onPointerDown:function(e){ne(n,e,X.Resize),St.current&&N((function(e){var t=St.current.localToWorld(new We.Vector3(-y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.LowerRight)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerRight||Xw.getState().resizeHandleType===K.LowerRight?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Ht,position:[ll.x,ll.y,0],args:[il,il,1.2*x],name:K.UpperRight,onPointerDown:function(e){ne(n,e,X.Resize),Ht.current&&N((function(e){var t=Ht.current.localToWorld(new We.Vector3(-y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){Pl(e,K.UpperRight)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperRight||Xw.getState().resizeHandleType===K.UpperRight?pt:ht})}),!ge&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:jt,args:[ol,6,6,0,Math.PI],position:[0,-Zt-ol,0],name:B.Lower,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Lower)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Lower||Xw.getState().moveHandleType===B.Lower?pt:ft})}),Object(pf.jsx)(Lt.h,{ref:zt,args:[ol,6,6,0,Math.PI],position:[0,Zt+ol,0],name:B.Upper,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Upper)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Upper||Xw.getState().moveHandleType===B.Upper?pt:ft})}),Object(pf.jsx)(Lt.h,{ref:Wt,args:[ol,6,6,0,Math.PI],position:[-Qt-ol,0,0],name:B.Left,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Left)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Left||Xw.getState().moveHandleType===B.Left?pt:ut})}),Object(pf.jsx)(Lt.h,{ref:Mt,args:[ol,6,6,0,Math.PI],position:[Qt+ol,0,0],name:B.Right,onPointerDown:function(e){ne(n,e,X.Move)},onPointerOver:function(e){Pl(e,B.Right)},onPointerOut:Sl,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Right||Xw.getState().moveHandleType===B.Right?pt:ut})}),Object(pf.jsx)(uy,{id:n,position:[0,-nl,0],color:be===q.Lower||Xw.getState().rotateHandleType===q.Lower?pt:ht,ratio:rl,handleType:q.Lower,hoverHandle:Pl,noHoverHandle:Sl}),Object(pf.jsx)(uy,{id:n,position:[0,nl,0],color:be===q.Upper||Xw.getState().rotateHandleType===q.Upper?pt:ht,ratio:rl,handleType:q.Upper,hoverHandle:Pl,noHoverHandle:Sl})]})]}),!ge&&Object(pf.jsxs)(pf.Fragment,{children:[(Ue||W)&&!F&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.FoundationElement",Bt))+(R?" ("+me.t("shared.ElementLocked",Bt)+")":""),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:_t+.2]}),!R&&be===K.LowerLeft&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LL",text:"LL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Qt,-Zt,_t+.2]}),!R&&be===K.UpperLeft&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UL",text:"UL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Qt,Zt,_t+.2]}),!R&&be===K.LowerRight&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LR",text:"LR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Qt,-Zt,_t+.2]}),!R&&be===K.UpperRight&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UR",text:"UR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Qt,Zt,_t+.2]})]}),C===G.FocusPipe&&Object(pf.jsx)(Jy,{foundation:e}),C===G.FocusTower&&Object(pf.jsx)(Ey,{foundation:e}),C===G.UpdraftTower&&Object(pf.jsx)(Yy,{foundation:e}),Object(pf.jsx)(Tg,Object(d.a)({},e))]}),F&&!R&&ze===n&&e&&Ie&&Object(pf.jsx)(Zy,{baseGroupSet:De,childCuboidSet:Me,initalPosition:Ce,initalDimension:Ie,initalRotation:Fe})]})},Hg=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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{points:[[-t,c,0],[t,c,0]],color:i}),Object(pf.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(pf.jsx)(Jl.a,{points:s,color:i})},jg=n.a.memo(Sg),zg="Handles Intersection Plane",Rg=function(e){if(e.intersections.length>0){var t,l=Object(h.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.eventObject.name===zg)return a.point.z<0?null:a.point}}catch(o){l.e(o)}finally{l.f()}}return null},Dg=function(e,t){return(new We.Vector3).subVectors(e,new We.Vector3(t.cx,t.cy,t.lz)).applyEuler(new We.Euler(0,0,-t.rotation[2]))},Wg=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 We.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 We.Vector3(i*p,0,r*y).applyEuler(f),m=(new We.Vector3).addVectors(e,g);if(!Ww.isPointInside(m.x,m.y,h))return!1}return!0},Mg=function(e){switch(e){case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:return!0}return!1},Ig=function(e,t,l){Xw.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(f.a)(l)}}))},Cg=function(e,t,l,a){Xw.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)}}))},Fg=function(e,t){Xw.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Window}));a&&(a.polygonTop=Object(f.a)(t))}))},kg=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 We.Euler).fromArray([].concat(Object(f.a)(e.rotation),["ZXY"])),o=new We.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 We.Vector3(c*i,c*s*r).applyEuler(a).add(o);n.push(d)}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var h,p=null!==(h=e.polygonTop)&&void 0!==h?h:Zg,y=Object(u.a)(p,2),g=y[0],m=y[1],w=new We.Vector3(g*i,m+r).applyEuler(a).add(o);n.push(w)}return n},Og=function(e){var t;if(e.windowType===Yt.Polygonal)return null!==(t=e.polygonTop)&&void 0!==t?t:Zg},Yg=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(pf.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(pf.jsx)("meshBasicMaterial",{color:i})})},Lg=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=Xw((function(e){return e.addedWindowId})),y=Xw(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),H=Object(r.useRef)([]),j=Object(r.useRef)(null),z=Object(r.useRef)(null),R=Object(r.useRef)(null),D=Object(r.useRef)(null),W=Object(r.useRef)(null),M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=o/2,O=i/2,Y=Object(u.a)(n,2),L=Y[0],N=Y[1],U=Object(r.useMemo)((function(){return o*L}),[o,L]),E=Xw(si),J=function(e,t,l){if(!a)return null;var o=Xw.getState().elements.find((function(e){return e.id===a&&e.type===V.Foundation}));if(!o)return null;var i=e.object.localToWorld(new We.Vector3),r=Object(u.a)(c,3),n=r[0],s=r[1],d=r[2],f=(new We.Euler).fromArray([n-vt,s,d+o.rotation[2],"ZXY"]),h=new We.Vector3(t,0,l).applyEuler(f);return(new We.Vector3).addVectors(i,h)},G=function(e){var o,i,r,n,c,s=Object(h.a)(Xw.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(N){s.e(N)}finally{s.f()}var u=Nt.getState().contentRef;if(i&&r&&n&&u&&u.current){var p=r.id,y=u.current.children.find((function(e){return e.name==="".concat(Pg," ").concat(p)}));if(y){var g=y.children.find((function(e){return e.name===vg}));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 M,I=Object(h.a)(Xw.getState().elements);try{for(I.s();!(M=I.n()).done;){var C=M.value;if(C.parentId===l&&C.id!==t){var F=kg(C,r);F&&H.current.push(F)}}}catch(N){I.e(N)}finally{I.f()}var k=P.userData,O=k.centroid,Y=k.roofSegments,L=new We.Vector3(i.cx,i.cy,i.cz+r.lz).clone().sub(O);w.current=e,x.current=r,v.current=n,T.current=Zm.getSegmentIdx(Y,L),A.current=O,b.current=Y,S.current=function(e,t,l){return l===It.Gambrel?_p(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),j.current=[i.cx,i.cy,i.cz],R.current=[i.lx,i.ly,i.lz],z.current=Object(f.a)(i.rotation),D.current=i.archHeight,W.current=null!==(o=i.polygonTop)&&void 0!==o?o:null}}}}}},X=function(){if(R.current&&j.current){var e=Xw.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(f.a)(j.current),newPosition:[e.cx,e.cy,e.cz],oldDimension:Object(f.a)(R.current),newDimension:[e.lx,e.ly,e.lz],oldArchHeight:D.current,newArchHeight:e.archHeight,undo:function(){Cg(this.id,this.oldPosition,this.oldDimension,this.oldArchHeight)},redo:function(){Cg(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=Af.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 We.Euler).fromArray([].concat(Object(f.a)(a),["ZXY"])),c=[],s=-1;s<=1;s+=2)for(var d=-1;d<=1;d+=2){var p=new We.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 We.Vector3(g*i*2,m+r).applyEuler(n).add(e);c.push(w)}var x,v=Object(h.a)(H.current);try{for(v.s();!(x=v.n()).done;){var b,A=x.value,T=Object(h.a)(c);try{for(T.s();!(b=T.n()).done;){var P=b.value;if(Ww.isPointInside(P.x,P.y,A))return!1}}catch(R){T.e(R)}finally{T.f()}var S,j=Object(h.a)(A);try{for(j.s();!(S=j.n()).done;){var z=S.value;if(Ww.isPointInside(z.x,z.y,c))return!1}}catch(R){j.e(R)}finally{j.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 We.Euler).fromArray([s-vt,d,f,"ZXY"]),p=r.map((function(e){return{x:e.x,y:e.y}})),y=(new We.Vector3).addVectors(e,new We.Vector3(a*t,0,n+o).applyEuler(h));return!!Ww.isPointInside(y.x,y.y,p)&&!!Wg(e,t,l,i,r)}(t,l,a,r[0],r[1],o,e)}return Wg(t,l,a,o,e)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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),F(!0),Nt.getState().setEnableOrbitController(!1)}},children:[!g&&Object(pf.jsxs)(pf.Fragment,{children:[s===Yt.Polygonal&&Object(pf.jsx)(mf,{x:U,z:O+N,handleType:K.Upper,scale:[.5,1,1.5]}),Object(pf.jsx)(mf,{x:-k,z:O,handleType:K.UpperLeft}),Object(pf.jsx)(mf,{x:k,z:O,handleType:K.UpperRight}),Object(pf.jsx)(mf,{x:-k,z:-O,handleType:K.LowerLeft}),Object(pf.jsx)(mf,{x:k,z:-O,handleType:K.LowerRight}),s===Yt.Arched&&Object(pf.jsx)(Yg,{z:O})]}),Object(pf.jsx)(xf,{handleType:B.Mid})]}),m&&C&&Object(pf.jsx)(Lt.f,{name:zg,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(h.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!==zg)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 We.Vector3;if(q(o)){var n=Rg(e);if(!n)return;r.copy(n);var s=Dg(r,a);E((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=Og(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=Rg(e);if(!u)return;r.copy(u)}var p=Dg(r,a),y=p.clone().sub(A.current),g=Zm.computeState(b.current,y),m=g.rotation,H=g.segmentVertices,j=g.segmentIdx;H?p.setZ(Zm.getRooftopElementZ(H,y,A.current.z+o.thickness)):p.setZ(A.current.z+o.thickness),E((function(e){var a=Af.getState().getRoofSegmentVertices(l);if(a){var o=a[-1===j?a.length-1:j];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=Og(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(f.a)(m),i&&i.segmentIdx!==T.current&&(T.current=i.segmentIdx))}}}}))}}else if(Mg(w.current)){var z=Q(T.current),R=Rg(e),D=P.current;if(!R||!D||!z)return;var W=Dg(R,a),M=function(e,t,l){var a=(new We.Vector3).subVectors(t,e).applyEuler(new We.Euler(0,0,-l));return{newLx:Math.abs(a.x),newLz:Math.hypot(a.y,a.z),newCenter:(new We.Vector3).addVectors(e,t).divideScalar(2)}}(Dg(D,a),W,c[2]),I=M.newLx,C=M.newLz,F=M.newCenter;Xw.getState().set((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=Og(l),o=_(z,F,I,C,c,a),i=Z(F,I,C,c,a);o&&i&&(l.cx=F.x,l.cy=F.y,l.cz=F.z,l.lx=I,l.lz=Math.max(.001,C))}}))}else if(w.current===K.Upper){var k=Q(T.current),O=Rg(e);if(!O||!k)return;var Y=Dg(O,a);E((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 We.Vector3(l.cx,l.cy,l.cz),r=(new We.Euler).fromArray([].concat(Object(f.a)(l.rotation),["ZXY"])),n=new We.Vector3(-a,-o,0).applyEuler(r).add(i),s=new We.Vector3(a,-o,0).applyEuler(r).add(i),d=(new We.Vector3).subVectors(Y,n),u=(new We.Vector3).subVectors(s,n).normalize(),h=d.clone().projectOnVector(u).applyEuler(new We.Euler(0,0,-l.rotation[2])),p=Ww.clamp((h.x-a)/l.lx,-.5,.5),y=Zm.getDistance(n,s,Y),g=Math.hypot(y,Y.z-n.z),m=[p,Math.max(0,g-l.lz)],w=new We.Vector3(l.cx,l.cy,l.cz),x=l.lx,v=l.lz,b=_(k,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=Rg(e),N=P.current,U=Q(T.current);if(!L||!N||!U)return;var J=Dg(L,a),G=Dg(N,a);E((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 We.Vector3(l.cx,l.cy,l.cz),r=(new We.Euler).fromArray([].concat(Object(f.a)(l.rotation),["ZXY"])),n=new We.Vector3(-a,-o,0).applyEuler(r).add(i),s=new We.Vector3(a,-o,0).applyEuler(r).add(i),d=Zm.getDistance(n,s,J),u=Math.hypot(d,J.z-n.z),h=Math.min(l.archHeight,l.lz,l.lx/2),p=l.lz-h;if(u>p&&u0&&Object(pf.jsx)("group",{position:[0,t,0],children:w(c/20,g)}),f&&d&&w(c/5,m)]})})),Gg=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.shutter,f=e.glassMaterial,h=e.showHeatFluxes,p=e.area,y=e.empty,g=e.interior,m=e.foundation,w=Xw.getState().world,x=Xw(o.heatFluxScaleFactor),v=Xw(o.heatFluxColor),b=Xw(o.heatFluxWidth),A=Xw(o.shadowEnabled),T=Af(Ai),P=Object(r.useRef)(0),S=Object(r.useRef)(),H=Object(u.a)(l,3),j=H[0],z=H[1],R=H[2],D=Object(u.a)(a,3),W=(D[0],D[1]),M=(D[2],Object(r.useMemo)((function(){var e;if(h&&!g&&(!m||!m.notBuilding)){var l=T.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==p){var o=4*(null!==(e=w.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(j/o)),r=Math.max(2,Math.round(R/o)),n=j/i,c=R/r,s=a/p*(null!==x&&void 0!==x?x:_e);P.current=s<0?1:0,S.current=Ww.getEuler(Rt,jt,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0&&e.intersections[0].eventObject.name===_&&!Xw.getState().moveHandleType&&!Xw.getState().resizeHandleType&&!Xw.getState().isAddingElement()&&Xw.getState().objectTypeToAdd===V.None},re=function(e,t){Nt.getState().setEnableOrbitController(!1),te("showWallIntersectionPlaneId",l),$((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new We.Vector3(i,0,c).add(t))}))},ne=Object(r.useMemo)((function(){if(q===V.Roof){var e=Object(u.a)(p,3),t=e[0],l=e[1],a=e[2];return(new We.Euler).fromArray([t-vt,l,a,"ZXY"])}return new We.Euler}),[q,p]),ce=Object(r.useMemo)((function(){return Object(pf.jsx)("meshPhongMaterial",{specular:new We.Color("white"),shininess:null!==le&&void 0!==le?le:lt,color:j,side:We.DoubleSide,opacity:R,transparent:!0})}),[le,j,R]),se=Object(r.useMemo)((function(){return void 0!==G?[s,d,f,G]:[s,d,f]}),[s,d,f,G]),de=Object(r.useMemo)((function(){return q===V.Roof?[i,.05,c]:[i,n,c]}),[i,n,c,q]),ue=Object(r.useMemo)((function(){return{showMullion:b,width:T,spacingX:S,spacingY:S,color:I}}),[b,T,S,I]),fe=Object(r.useMemo)((function(){return{showFrame:F,width:L,color:O,sillWidth:U}}),[F,L,O,U]),he=Object(r.useMemo)((function(){return{lineColor:x,lineWidth:m,selected:ae,locked:y,opacity:R}}),[x,m,ae,y,R]),pe=bf(Es),ye=q===V.Roof?n:0;return Object(pf.jsxs)("group",{name:_,position:[i,ye,c],rotation:ne,onPointerDown:function(e){if(2!==e.button&&!Xw.getState().addedWallId&&(ie(e)&&oe(),function(e){if(e.eventObject.name===_&&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:Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=l,e.oldParentId=l,e.oldFoundationId=a})),$((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:re(t,new We.Vector3(s/2,0,-f/2));break;case K.UpperRight:re(t,new We.Vector3(-s/2,0,-f/2));break;case K.LowerLeft:re(t,new We.Vector3(s/2,0,f/2));break;case K.LowerRight:re(t,new We.Vector3(-s/2,0,f/2));break;case K.Arch:re(t,new We.Vector3(0,0,0));break;case K.Upper:re(t,new We.Vector3(0,0,f/2))}}},onContextMenu:function(e){Xw.getState().addedWallId||ie(e)&&(oe(),$((function(e){e.contextMenuObjectType=V.Window})))},onPointerMove:function(){},children:[function(){switch(J){case Yt.Default:return Object(pf.jsx)(Xg,{id:e.id,dimension:se,position:de,mullionData:ue,frameData:fe,wireframeData:he,shutter:W,glassMaterial:ce,showHeatFluxes:pe,area:Ww.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:ee(e)});case Yt.Arched:return Object(pf.jsx)(Of,{id:e.id,dimension:se,position:de,mullionData:ue,frameData:fe,wireframeData:he,shutter:W,glassMaterial:ce,showHeatFluxes:pe,area:Ww.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:ee(e)});case Yt.Polygonal:return Object(pf.jsx)(Vf,{id:e.id,dimension:se,polygonTop:Z,position:de,glassMaterial:ce,empty:!!e.empty,interior:!!e.interior,wireframeData:he,frameData:fe,shutter:W,showHeatFluxes:pe,area:Ww.getWindowArea(e),foundation:ee(e)})}}(),ae&&Object(pf.jsx)(Bg,{element:e}),ae&&!y&&Object(pf.jsx)(Ng,{id:t,parentId:l,foundationId:a,lx:s,lz:f,polygonTop:Z,rotation:p,windowType:J,parentType:q})]},t)},$g=n.a.memo(_g),em=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=Xw((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],H=2*i,j=[];if(b)o=2,j.push(P,S);else if(h)j.push(P,A,T,S);else if(s)j.push(A,P,S,T,A);else{if(j.push(A,P),x){var z=[x[0]*H,x[1]-r,.001];j.push(z)}if(w){var R=[w[0]*H,w[1]-r,.001];j.push(R)}if(v){var D=[v[0]*H,v[1]-r,.001];j.push(D)}j.push(S,T)}return Object(pf.jsx)(n.a.Fragment,{children:Object(pf.jsx)(Jl.a,{rotation:[vt,0,0],points:j,color:l,lineWidth:o})})}));!function(e){e.Default="Default",e.Arched="Arched"}(Gy||(Gy={}));var tm,lm=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(pf.jsx)(Jl.a,{points:[d,c,s,f],lineWidth:a,color:l})})),am=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=Xw(o.shadowEnabled),s=Object(r.useMemo)((function(){return Object(pf.jsx)("meshStandardMaterial",{color:l})}),[l]),d=.1;return Object(pf.jsxs)("group",{name:"Door frame group",children:[Object(pf.jsx)(Lt.a,{position:[0,0,n/2],args:[i,d,d],castShadow:c,receiveShadow:c,children:s}),Object(pf.jsx)(Lt.a,{position:[-i/2+.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s}),Object(pf.jsx)(Lt.a,{position:[i/2-.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s})]})})),om=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=Xw.getState().world,g=Xw(o.heatFluxScaleFactor),m=Xw(o.heatFluxColor),w=Xw(o.heatFluxWidth),x=Xw(o.shadowEnabled),v=Af(Ai),b=Object(r.useRef)(0),A=Object(r.useRef)(),T=Object(u.a)(l,3),P=T[0],S=(T[1],T[2]),H=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=Ww.getEuler(Rt,jt,"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(H,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*H,.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,H,s]),D=Object(r.useMemo)((function(){return{lineColor:"black",lineWidth:i&&a?.2:.1,opacity:1,selected:a,locked:i}}),[a,i]);return Object(pf.jsxs)("group",{name:"Arched door group",children:[Object(pf.jsx)("mesh",{name:"Arched Door Mesh",rotation:[vt,0,0],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(pf.jsx)("shapeBufferGeometry",{args:[R]})}),s&&Object(pf.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(pf.jsx)("shapeBufferGeometry",{args:[R]}),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})]}),s&&Object(pf.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(pf.jsx)("shapeBufferGeometry",{args:[R]})}),Object(pf.jsx)(Cf,{cy:0,dimension:l,wireframeData:D}),Object(pf.jsx)(Cf,{cy:P,dimension:l,wireframeData:D}),z&&z.map((function(e,t){var l;return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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(pf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[v.current].clone().add(new We.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(pf.jsx)("meshBasicMaterial",{attach:"material",color:null!==m&&void 0!==m?m:$e})})]},t)}))]})})),rm="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",nm=l.p+"static/media/door_01.370d5c48.png",cm=l.p+"static/media/door_02.589dadc7.png",sm=l.p+"static/media/door_03.25d0bf9d.png",dm=l.p+"static/media/door_04.06a40fe3.png",um=l.p+"static/media/door_05.4515bf2c.png",fm=l.p+"static/media/door_06.5a0271c1.png",hm=l.p+"static/media/door_07.b3fa7c12.png",pm=l.p+"static/media/door_08.44d7e7a4.png",ym=l.p+"static/media/door_09.cc418cf3.png",gm=l.p+"static/media/door_10.69a33f87.png",mm=l.p+"static/media/door_11.885157c0.png",wm=l.p+"static/media/door_12.1978a1a1.png",xm=l.p+"static/media/door_13.0e06b1ac.png",vm=l.p+"static/media/door_14.97d8561e.png",bm=l.p+"static/media/door_15.059947bb.png",Am=l.p+"static/media/door_16.c2cd4b21.png",Tm=l.p+"static/media/door_17.6410d727.png",Pm=new We.MeshStandardMaterial({color:"white",side:We.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(pf.jsxs)("group",{name:"Door handle wrapper",children:[Object(pf.jsx)(mf,{x:-i,z:r,handleType:K.UpperLeft}),Object(pf.jsx)(mf,{x:i,z:r,handleType:K.UpperRight}),l===Gy.Arched&&Object(pf.jsx)(Yg,{z:r})]})})),Hm=n.a.memo((function(e){var t=e.dimension,l=Xw(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(pf.jsx)(Lt.f,{name:"Door seal plane",args:e,position:t,rotation:a,material:Pm,receiveShadow:l})};return Object(pf.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])]})})),jm=function(e){!function(e){var t=Xw(Tr);Object(r.useEffect)((function(){void 0!==e.doorType&&void 0!==e.archHeight&&void 0!==e.filled||Xw.getState().set((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Door){var i=o;void 0===i.doorType&&(i.doorType=Gy.Default),void 0===i.archHeight&&(i.archHeight=1),void 0===i.filled&&(i.filled=!0);break}}}catch(r){a.e(r)}finally{a.f()}}))}),[t])}(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,f=e.locked,p=void 0!==f&&f,y=e.color,g=void 0===y?"white":y,m=e.doorType,w=void 0===m?Gy.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,H=void 0===S?"white":S,j="Door Group ".concat(t),z=Xw(si),R=bf(hf),D=Xw(o.windowShininess),W=_f(t),M=function(){z((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.id===t?(o.selected=!0,e.selectedElement=o,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):o.selected=!1}}catch(i){a.e(i)}finally{a.f()}}))},I=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===j&&!Xw.getState().moveHandleType&&!Xw.getState().resizeHandleType&&!Xw.getState().isAddingElement()&&Xw.getState().objectTypeToAdd===V.None},C=function(e,t){Nt.getState().setEnableOrbitController(!1),R("showWallIntersectionPlaneId",l),z((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new We.Vector3(a,0,i).add(t)),l.selectedElement=l.elements.find((function(e){return e.selected}))}))},F=Xw(_r),k=bf(Us),O=bf(Es),Y=Xw(o.solarRadiationHeatmapMaxValue),L=Af(wi),N=Object(r.useState)(null),U=Object(u.a)(N,2),E=U[0],J=U[1];Object(r.useEffect)((function(){if(e&&k){var t=L(e.id);if(t){var l=Ww.fetchHeatmapTexture(t,null!==Y&&void 0!==Y?Y:5);l&&(l.wrapS=We.RepeatWrapping,l.wrapT=We.RepeatWrapping,l.offset.set(-n/2,-s/2),l.center.set(n/2,s/2),l.repeat.set(1/n,1/s),J(l))}}}),[k,Y]);var G=function(e,t,l,a){var o=Object(r.useMemo)((function(){var t;switch(e){case fe.Default:t=rm;break;case fe.NoTexture:t=Tf;break;case fe.Texture01:t=nm;break;case fe.Texture02:t=cm;break;case fe.Texture03:t=sm;break;case fe.Texture04:t=dm;break;case fe.Texture05:t=um;break;case fe.Texture06:t=fm;break;case fe.Texture07:t=hm;break;case fe.Texture08:t=pm;break;case fe.Texture09:t=ym;break;case fe.Texture10:t=gm;break;case fe.Texture11:t=mm;break;case fe.Texture12:t=wm;break;case fe.Texture13:t=xm;break;case fe.Texture14:t=vm;break;case fe.Texture15:t=bm;break;case fe.Texture16:t=Am;break;case fe.Texture17:t=Tm;break;default:t=cm}return(new We.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),X=Object(r.useMemo)((function(){return[n,c,s,v]}),[n,c,s,v]),B=Object(r.useMemo)((function(){return k&&E&&e.filled?new We.MeshBasicMaterial({color:g,map:E,side:We.FrontSide}):A?d===fe.Default||d===fe.NoTexture?P<1?new We.MeshPhongMaterial({specular:"white",shininess:null!==D&&void 0!==D?D:lt,color:g,side:We.FrontSide,opacity:P,transparent:!0}):new We.MeshStandardMaterial({map:G,color:g,side:We.FrontSide}):new We.MeshStandardMaterial({map:G,side:We.FrontSide}):new We.MeshStandardMaterial({opacity:g===wt?.5:0,color:g,transparent:!0,side:We.DoubleSide})}),[k,E,g,d,G,A,P]);return Object(pf.jsxs)("group",{name:j,position:[a,0,i],onPointerDown:function(e){if(2!==e.button&&!Xw.getState().addedWallId&&(I(e)&&M(),function(e){if(e.eventObject.name===j&&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:C(t,new We.Vector3(n/2,0,-s/2));break;case K.UpperRight:C(t,new We.Vector3(-n/2,0,-s/2));break;case K.Arch:C(t,new We.Vector3(0,0,0))}}},onContextMenu:function(e){Xw.getState().addedWallId||I(e)&&(M(),z((function(e){e.contextMenuObjectType=V.Door})))},children:[function(){switch(w){case Gy.Default:return Object(pf.jsx)(om,{id:t,dimension:X,color:g,frameColor:H,selected:W,locked:p,material:B,filled:A,showHeatFluxes:O,area:Ww.getDoorArea(e),foundation:F(e)});case Gy.Arched:return Object(pf.jsx)(im,{id:t,dimension:X,color:g,frameColor:H,selected:W,locked:p,material:B,filled:A,showHeatFluxes:O,area:Ww.getDoorArea(e),foundation:F(e)})}}(),W&&Object(pf.jsx)(Bg,{element:e}),W&&!p&&Object(pf.jsx)(Sm,{dimension:X,doorType:w}),Object(pf.jsx)(Hm,{dimension:X})]})},zm=n.a.memo(jm),Rm=n.a.memo((function(e){var t=e.drawSunbeam,l=e.absRotation,a=e.tiltAngle,o=new We.Vector3(0,0,1),n=Xw(i.date),c=Xw(i.latitude),s=Xw(Kr),d=Math.max(100,10*s),u=Object(r.useMemo)((function(){return Iy(new Date(n),c).applyEuler(new We.Euler(-vt-a,0,-l))}),[n,c,l,a]);return Object(pf.jsx)(pf.Fragment,{children:t&&u.z>0&&Object(pf.jsxs)("group",{children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[u.clone().multiplyScalar(.5),o.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:o.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),Dm=function(e){var t,l,a,o,i,n=e.sp;Xw(ki);var c=Xw(Zr),s=Xw(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 We.Vector3(f.cx,f.cy,f.cz),p=new We.Vector3(u.cx,u.cy,u.cz),y=new We.Vector3(n.cx*u.lx,0,n.cz*u.lz).applyEuler(new We.Euler(0,0,u.relativeAngle)).add(p).applyEuler(new We.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(pf.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)]})},Wm=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=Xw(si);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:d})}),y&&Object(pf.jsxs)(pf.Fragment,{children:[x&&Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide})}),Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,l],[0,0,1.75*l]],rotation:new We.Euler(t,0,0,"ZXY"),lineWidth:1}),T.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,0,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*l],[0,0,2*l]],color:"white",transparent:!0,opacity:.5}),Object(pf.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(pf.jsx)("group",{rotation:new We.Euler(t,0,0,"ZXY"),children:Object(pf.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]})})]})]})},Mm=n.a.memo((function(e){var t=e.tiltAngle,l=e.spCy,a=e.spLy,i=e.lx,n=e.nx,c=Xw(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(pf.jsx)("group",{position:[0,-o,l],rotation:[-s,0,0],children:Object(pf.jsx)(Lt.a,{args:[.05,.05,n],position:[0,0,n/2],castShadow:c,receiveShadow:c,children:Object(pf.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",E(!0)))},onPointerOut:function(e){Y.domElement.style.cursor="default",E(!1)},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),z&&je?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:je}):He?C||0===D?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:He,color:y}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:We.FrontSide,map:He,color:y}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),0===(null===se||void 0===se?void 0:se.bifacialityFactor)||0===S?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}):He?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:We.FrontSide,map:He,color:y}):null]}),z&&je&&oe.current&&oe.current.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),H&&m&&Object(pf.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}),H&&!m&&Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)("group",{name:Im,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===Im){var t=e.object.name;switch(t){case B.Default:Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=w,e.oldParentId=w,e.oldFoundationId=x})),j((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 We.Vector3(d/2,0,0));break;case K.Right:Pe(t,new We.Vector3(-d/2,0,0));break;case K.Lower:Pe(t,new We.Vector3(0,0,f/2));break;case K.Upper:Pe(t,new We.Vector3(0,0,-f/2))}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(Im)){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(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,0),args:[Ae,6,6],name:B.Default,children:Object(pf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(pf.jsx)(Lt.a,{position:[(he.x+ye.x)/2,he.y,he.z],args:[be,be,1.2*h],name:K.Lower,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Lower||I===K.Lower?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[(pe.x+ge.x)/2,pe.y,pe.z],args:[be,be,1.2*h],name:K.Upper,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Upper||I===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[he.x,(he.y+pe.y)/2,he.z],args:[be,be,1.2*h],name:K.Left,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Left||I===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{position:[ye.x,(ye.y+ge.y)/2,ye.z],args:[be,be,1.2*h],name:K.Right,children:Object(pf.jsx)("meshBasicMaterial",{color:Q===K.Right||I===K.Right?pt:ht})})]})}),Object(pf.jsx)(Rm,{drawSunbeam:T,absRotation:P,tiltAngle:S}),(U||A)&&!H&&Object(pf.jsx)(Dm,{sp:me})]}),0!==S&&se&&Object(pf.jsx)(Mm,{tiltAngle:-S,spCy:c-fe,spLy:f,lx:b===$.portrait?se.width:se.length,nx:te})]}),H&&!m&&Object(pf.jsx)("group",{name:Im,position:[n,0,s+fe],rotation:we,children:Object(pf.jsx)(Wm,{tiltAngle:S,handleSize:Te,initPointerDown:function(){re.current=S,ie.current=!0,Nt.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,O)}(e),t.current&&Xw.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 We.Vector3);if(r){var n=(new We.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=Ww.clamp(c,-vt,0),Xw.getState().updateSolarPanelTiltAngleById(l,c)}}}},handlePointerUp:function(){var e=W(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(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Xw.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Xw.getState().addUndoable(t)}Nt.getState().setEnableOrbitController(!0),ie.current=!1}})})]})},Fm=n.a.memo(Cm),km=l.p+"static/media/polygon_08.acf0bf8f.png",Om=l.p+"static/media/polygon_09.26eed538.png",Ym=l.p+"static/media/polygon_10.749fa717.png",Lm=l(840),Nm=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,f=e.normal,p=void 0===f?[0,0,1]:f,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,H=void 0===S?"white":S,j=e.fontStrokeWidth,z=void 0===j?0:j,R=e.fontStrokeColor,D=void 0===R?"black":R,W=e.lineStyle,M=void 0===W?k.Solid:W,I=e.lineColor,C=void 0===I?"black":I,F=e.lineWidth,O=void 0===F?1:F,Y=e.locked,L=void 0!==Y&&Y,N=e.showLabel,U=void 0!==N&&N,E=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=Xw(si),re=Xw(Vi),ne=Xw(os),se=Xw(ns),de=Xw(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],He=Te[1],je=Object(r.useState)(null),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Xw((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E)return a}}catch(o){l.e(o)}finally{l.f()}})),Fe=new We.Vector3,ke=new We.Euler;if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var Oe=Ww.getWorldDataById(Ce.id),Ye=Oe.pos,Le=Oe.rot;Fe.copy(Ye),ke.set(0,0,Le)}var Ne=Ce?Math.max(1,Math.max(Ce.lx,Ce.ly)/24):1,Ue=dt*Ne,Ee=st*Ne,Ve=Object(r.useMemo)((function(){return{lng:re}}),[re]),Je=function(e,t){ie((function(l){var a,o=Object(h.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(h.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(h.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 We.Vector3).fromArray(p);Ww.isUnitVectorX(s)?(n=Ce.lz,c=Ce.ly):Ww.isUnitVectorY(s)?(n=Ce.lx,c=Ce.lz):(n=Ce.lx,c=Ce.ly);var d,u=Object(h.a)(G);try{for(u.s();!(d=u.n()).done;){var f=d.value;e.push({x:f.x*n,y:f.y*c})}}catch(g){u.e(g)}finally{u.f()}}var y=Ww.calculatePolygonCentroid(e);be(y.x),He(y.y)}return e}),[G,Ce,p]),Xe=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var e=Ww.isIdentical(p,Tt);return Fe.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 We.Euler(-vt,0,Math.PI,"ZXY");var e=(new We.Vector3).fromArray(p),t=d[2];return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid&&(t=ke.z),Ww.isSame(e,St)?new We.Euler(0,vt,t,"ZXY"):Ww.isSame(e,Ht)?new We.Euler(0,-vt,t,"ZXY"):Ww.isSame(e,jt)?new We.Euler(-vt,0,t,"ZXY"):Ww.isSame(e,zt)?new We.Euler(vt,0,t,"ZXY"):new We.Euler(0,0,t,"ZXY")}(),Ke=function(){var e,t;if(Ce){if(Ce.type===V.Cuboid){var l=new We.Vector3(Fe.x,Fe.y,Xe),a=(new We.Vector3).fromArray(p),o=!1,i=new We.Vector3;return Ww.isSame(a,St)?(o=!0,i.x=Ce.lx/2+.01):Ww.isSame(a,Ht)?(o=!0,i.x=-Ce.lx/2-.01):Ww.isSame(a,jt)?(o=!0,i.y=Ce.ly/2+.01):Ww.isSame(a,zt)&&(o=!0,i.y=-Ce.ly/2-.01),o&&(i.applyEuler(ke),l.x=Fe.x+i.x,l.y=Fe.y+i.y,l.z=Fe.z+i.z),l}if(Ce.type===V.Wall)return new We.Vector3(0,-.01,0)}return new We.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(h.a)(Ge);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.push(new We.Vector3(a.x,a.y,0))}}catch(o){l.e(o)}finally{l.f()}return t.push(new We.Vector3(Ge[0].x,Ge[0].y,0)),t}),[Ge]),Qe=Object(r.useMemo)((function(){var e=new We.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=ty;break;case ce.Texture02:e=ly;break;case ce.Texture03:e=ay;break;case ce.Texture04:e=oy;break;case ce.Texture05:e=iy;break;case ce.Texture06:e=ry;break;case ce.Texture07:e=ny;break;case ce.Texture08:e=km;break;case ce.Texture09:e=Om;break;case ce.Texture10:e=Ym;break;default:e=Tf}return(new We.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=We.RepeatWrapping,e.repeat.set(1/t.x,1/t.y);var l=(new We.Vector3).fromArray(p);Ww.isSame(l,St)?e.rotation=vt:Ww.isSame(l,Ht)?e.rotation=-vt:Ww.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(pf.jsxs)("group",{name:"Polygon Group "+t,rotation:Be,position:Ke,children:[c&&Object(pf.jsxs)("mesh",{uuid:t,ref:Me,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),ie((function(t){e.intersections.length>0&&(e.intersections[0].object===Me.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===Me.current&&ge(!0))},onPointerOut:function(){ge(!1),fe.style.cursor="default"},children:[Object(pf.jsx)("shapeBufferGeometry",{attach:"geometry",args:[Qe]}),void 0===ee||0===ee?Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:We.DoubleSide,transparent:Q<1,opacity:Q}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:We.FrontSide,specular:new We.Color("white"),shininess:ee,transparent:Q<1,opacity:Q})]}),w&&Object(pf.jsx)(Lm.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:H,strokeWidth:z,strokeColor:D,children:w}),(!_||L&&ue)&&Object(pf.jsx)(Jl.a,{points:qe,color:L&&ue?yt:C,lineWidth:O,dashed:M&&M!==k.Solid,dashSize:M===k.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),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(pf.jsx)(Jl.a,{position:[0,0,.1],points:qe,visible:!1,lineWidth:Math.min(10*O,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),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(pf.jsx)(Lt.h,{ref:Ie,position:[ve,Pe,0],args:[Ee,6,6],name:B.Default,onPointerDown:function(e){ne(t,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=E,e.oldParentId=E,e.oldFoundationId=J})),ie((function(e){e.moveHandleType=B.Default}))},onPointerOver:function(e){Ze(e,B.Default)},onPointerOut:_e,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),ue&&!L&&Ge.map((function(e,l){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.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){ne(t,e,X.Resize),Je(t,l),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=E,e.oldParentId=E,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(pf.jsx)("meshBasicMaterial",{attach:"material",color:Re!==K.Default&&Xw.getState().resizeHandleType!==K.Default||le!==l?ht:pt})}),Object(pf.jsx)("textSprite",{name:"Label "+l,text:""+l,fontSize:20*Ne,fontFace:"Times Roman",textHeight:.2*Ne,position:[e.x,e.y,.2*Ne]})]},"resize-handle-"+l)})),(ye||U)&&!ue&&Object(pf.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*Ne,fontFace:"Times Roman",textHeight:.2*Ne,position:[0,0,a+.2]})]})},Um=function(e){var t=e.wallModel,l=e.notBuilding,a=t.id,i=t.lx,c=t.lz,s=Xw(tn),d=Xw(o.heatFluxScaleFactor),u=Xw(o.heatFluxColor),f=Xw(o.heatFluxWidth),p=Af(Ai),y=bf(Es),g=Object(r.useRef)(0),m=Object(r.useRef)(),w=Object(r.useMemo)((function(){var e;if(y&&!l){var o=p.get(a);if(o){var r=o.reduce((function(e,t){return e+t}),0),n=t.fill===Ue.Partial&&!Ww.isPartialWallFull(t),c=Ww.getWallVertices(t,0),u=n?Ww.getPartialWallVertices(t,0):c,f=Ww.getPolygonArea(c),w=n?Ww.getPolygonArea(u):f;if(0!==w){var x=s(V.Window,a),v=s(V.Door,a);if(x&&x.length>0){var b,A=Object(h.a)(x);try{for(A.s();!(b=A.n()).done;){var T=b.value;w-=Ww.getWindowArea(T,t)}}catch(oe){A.e(oe)}finally{A.f()}}if(v&&v.length>0){var P,S=Object(h.a)(v);try{for(S.s();!(P=S.n()).done;){var H=P.value;w-=H.lx*H.lz*t.lx*t.lz}}catch(oe){S.e(oe)}finally{S.f()}}var j=4*(null!==(e=Xw.getState().world.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),z=Ww.getHighestPointOfWall(t),R=Math.max(2,Math.round(i/j)),D=Math.max(2,Math.round(z/j)),W=i/R,M=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=Ww.getEuler(Rt,jt,"YXZ",Math.sign(C)*vt);for(var F,k=[],O=n?Ww.getPartialWallVertices(t,0):Ww.getWallVertices(t,0),Y=0;Y0){var J,G=Object(h.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&&E=B-q&&U=K-Q&&E0){var Z,_=Object(h.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&&E0?N:S,U=z.length>0?U:S;var Ae=xp(R),Te=_f(m),Pe=Xw(si),He=Xw(an),je=Xw(os),ze=Xw(Sr),Re=Xw(Mu),De=Af(wi),Me=Xw(Kn),Ie=Xw(o.shadowEnabled),Ce=Xw(Lu),Fe=Xw(Nu),ke=Xw(o.solarRadiationHeatmapMaxValue),Oe=bf(hf),Ye=bf(Us),Le=bf((function(e){return e.elementBeingCanceledId})),Ne=bf((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=Xw((function(e){if(t){var l,a=Object(h.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=Xw((function(e){if(l){var t,a=Object(h.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=Xw((function(e){return JSON.stringify(e.elements.filter(o))}));return{elementsOnWall:Object(r.useMemo)((function(){return Xw.getState().elements.filter((function(e){return o(e)&&Ww.isLegalOnWall(e.type)}))}),[c]),leftWall:i,rightWall:n}}(m,j[0],z[0])),tt=et.elementsOnWall,lt=et.leftWall,at=et.rightWall,ot=vp(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]+H:H,At=Ww.getInnerWallOffset(lt,b,T,H,"left"),Tt=Ww.getInnerWallOffset(at,b,T,H,"right"),Pt=Q===Ee.Stud||Q===Ee.Pillar,St=null!==(t=N)&&void 0!==t?t:S,Ht=null!==(l=U)&&void 0!==l?l:S,jt=ne===Ue.Partial,zt=jt?se:0,Rt=jt?fe:0,Dt=jt?Math.min(St,pe):St,Wt=jt?Math.min(Ht,ge):Ht,Mt=jt&&(!Ww.isZero(St-Dt)||!Ww.isZero(Ht-Wt)),It=Ie&&!Pt,Ct=xe.display,Ft=Math.max(Dt,Wt)-xt,kt=Object(r.useMemo)((function(){return new We.Vector2}),[]),Ot=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Ut=Object(r.useMemo)((function(){return new We.MeshStandardMaterial({color:"white",side:We.DoubleSide,transparent:Pt,opacity:ie})}),[Pt,ie]),Et=Object(r.useMemo)((function(){return Ww.getHighestPointOfWall(y)}),[y.lz,y.leftRoofHeight,y.rightRoofHeight,y.centerRoofHeight,y.centerLeftRoofHeight,y.centerRightRoofHeight]),Vt=Object(r.useMemo)((function(){var e=new We.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;jt?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})),f=Object(h.a)(u);try{for(f.s();!(d=f.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===Gy.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(H){f.e(H)}finally{f.f()}}jt?e.lineTo(a+c-r,o-s+fe):e.lineTo(a+c-r,o-s);Mt?(e.lineTo(a+c-r,o-s+Wt),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),E&&e.lineTo(E[0]*t,E[1]-s),J&&e.lineTo(J[0]*t,J[1]-s),N?e.lineTo(a-c+i,N-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 We.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:Zg,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,Wt,tt,N,U,E,J,G]),Jt=Object(r.useMemo)((function(){var e=new We.Shape,t=S,l=S/2;if(jt)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(h.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===Gy.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 f=Math.min(r.archHeight,d,s/2);if(e.lineTo(n-s/2,-l),f>.1){e.lineTo(n-s/2,d/2-l-f);var p=f/2+Math.pow(s,2)/(8*f),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(Mt){var x=Wt-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),E&&e.lineTo(E[0]*b,E[1]-l),J&&e.lineTo(J[0]*b,J[1]-l),N?e.lineTo(-ht+At,N-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 We.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:Zg,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,Wt,At,Tt,tt,L,N,U,E,J,G]),Gt=Object(r.useMemo)((function(){return jt?(Dt+Wt)/2-xt:xt}),[xt,jt,Dt,Wt]),Xt=Object(r.useMemo)((function(){var e=Wt-Dt;return!jt||Math.abs(e)<.01?0:Math.atan2(e,b)}),[b,jt,Dt,Wt]),Bt=Object(r.useMemo)((function(){var e=new We.Shape;if(!jt||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,jt,Xt]),Kt=Object(r.useMemo)((function(){var e=[],t=b/2,l=S/2;return jt?(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})),Mt?(e.push({x:t-Tt,y:-l+Wt}),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}),E&&e.push({x:E[0]*b,y:E[1]-l}),J&&e.push({x:J[0]*b,y:J[1]-l}),N?e.push({x:-t,y:N-l}):e.push({x:-t,y:l})),e}),[b,S,ne,zt,Rt,Dt,Wt,N,U,E,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===Ee.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===Ee.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:k,cx:w,cy:x,hx:ht,hy:pt,angle:H,selected:Te}}),[m,k,w,x,ht,pt,H,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=Ww.wallAbsolutePosition(new We.Vector3(l,a,o),ot).setZ(S/2+ot.lz);return(new We.Vector3).subVectors(e,i).applyEuler(new We.Euler(0,0,-bt))}return new We.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(h.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 f=-1;f<=1;f+=2){var p=t.x+d*l/2,y=t.z+d*f*a/2;if(s.push({x:p,y:y}),Ww.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}),Ww.isPointInside(x,v,c))return ut.current=e,!1}var A,T=Object(h.a)(c);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(Ww.isPointInside(P.x,P.y,s))return ut.current=e,!1}}catch(H){T.e(H)}finally{T.f()}}}}catch(H){r.e(H)}finally{r.f()}return ut.current=null,!0}function al(e,t,l,a,o){return!!Ww.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!!Ww.isPointInside(n,c,function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!jt)return Ww.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),Mt||(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=Xw.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 We.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 We.Vector3(t,e.y,l)}(e)}function sl(e,t){var l=(new We.Vector3).subVectors((new We.Vector3).fromArray(e.leftPoint).setZ(0),(new We.Vector3).fromArray(e.rightPoint).setZ(0)),a=(new We.Vector3).subVectors((new We.Vector3).fromArray(t.rightPoint).setZ(0),(new We.Vector3).fromArray(t.leftPoint).setZ(0)).angleTo(l);return Math.abs(a-Math.PI/2)<.087}function dl(e,t,l,a,o){Xw.getState().set((function(i){var r,n=Object(h.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(f.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(){Xw.getState().removeElementById(e.id,!1)},redo:function(){Xw.getState().set((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement,e.deletedRoofId=null}))}};ze(t)}function hl(){Xw.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(Xw.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(bp.WALL_OUTSIDE_SURFACE_MESH_NAME)||e.eventObject.name.includes(Qg)||e.eventObject.name===Vm}));if(!(a.length>0&&(a[0].eventObject.name===Vm||a[0].eventObject.name.includes(Qg))))return!0}return!1}function gl(e){if(Xw.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===Gy.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 We.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===tm.SettingStartPoint&&Xw.getState().moveHandleType===B.Mid}function bl(){return!(Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Re())}function Al(e,t,l){var a,o;!function(e){kt.x=e.offsetX/$e.domElement.clientWidth*2-1,kt.y=-e.offsetY/$e.domElement.clientHeight*2+1,Ot.setFromCamera(kt,_e)}(e);var i=el(null!==(a=null===(o=(t?Ot.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=bf.getState().oldParentId;if(e.parentId!==t){var l=Xw.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[Gm,Gm]}function Sl(){var e=[];if(E){var t=E[0];if(.5===t&&void 0!==N)return e.push(new We.Vector3(ht,E[1]-xt),new We.Vector3(-ht,N-xt)),e;if(-.5===t&&void 0!==U)return e.push(new We.Vector3(ht,U-xt),new We.Vector3(-ht,E[1]-xt)),e}return void 0!==U?e.push(new We.Vector3(ht,U-xt)):e.push(new We.Vector3(ht,xt)),void 0!==G&&e.push(new We.Vector3(G[0]*b,G[1]-xt)),void 0!==E&&e.push(new We.Vector3(E[0]*b,E[1]-xt)),void 0!==J&&e.push(new We.Vector3(J[0]*b,J[1]-xt)),void 0!==N?e.push(new We.Vector3(-ht,N-xt)):e.push(new We.Vector3(-ht,xt)),e}function Hl(e,t){var l=null===t||void 0===t?void 0:t.ignorePadding,a=(null===t||void 0===t?void 0:t.elementHalfSize)?Object(f.a)(t.elementHalfSize):[0,0],o=l?0:Gm,i=l?0:Gm+At,r=l?0:Gm+Tt,n=Object(u.a)(a,2),c=n[0],s=n[1],d=-ht+c+i,h=ht-c-r,p=-xt+s+o,y=xt-s-o,g=e.clone();if(!Mt&&se===fe&&pe===ge&&(!L||N===U&&void 0===E&&void 0===J&&void 0===G)){var m=jt?se:0,w=S-(jt?Dt:S);return g.setX(Ww.clamp(e.x,d,h)),g.setZ(Ww.clamp(e.z,p+m,y-w)),g}var x=function(e,t,l,a,o){var i=[],r=new We.Vector3(-ht,-xt+zt),n=new We.Vector3(ht,-xt+Rt);if(ml(r,n,e,t,o,!0),i.push({start:new We.Vector3(l,xt),end:new We.Vector3(l,r.y)}),i.push({start:r.clone(),end:n.clone()}),i.push({start:new We.Vector3(a,n.y),end:new We.Vector3(a,xt)}),Mt){var c=new We.Vector3(ht,-xt+Wt),s=new We.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 W=new We.Vector3(-ht,-xt+zt),M=new We.Vector3(ht,-xt+Rt),I=(M.y-W.y)/(M.x-W.x);A=I*T+(-I*W.x+W.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!Ww.isPointInside(t.x,t.y,l)}(x,v)){var F=function(e,t){for(var l=e.getPoints(),a=t,o=1/0,i=0;i0){var r=Ww.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 We.Vector3(e.cx*b,e.cy,e.cz*S+(n-o)/2).z,newArchHeight:r}}function Rl(e){if(vl()){Nt.getState().setEnableOrbitController(!1),Xe(!0);var t=Hl(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=tm.SettingEndPoint}else if(pl(e)){if(Xw.getState().objectTypeToAdd!==V.None)Dl(e.point,!0);else Xw.getState().groupActionMode?(Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===k}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(k)})),e.stopPropagation()):bl()&&Xw.getState().selectMe(m,e,X.Select)}}function Dl(e,t){if(ot&&Xw.getState().objectTypeToAdd){var l=null;switch(Xw.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=Xw.getState().actionState;l=Vl.makeSolarPanel(y,Xw.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 We.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 We.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=Xw.getState().actionState;l=Vl.makeLight(y,2,p.lightDistance,p.lightIntensity,p.lightColor,(f.x-.05)/b,0,(f.z-.05)/S,new We.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.addedRoofId=l.id),e.actionModeLock||(e.objectTypeToAdd=V.None)})))}}function Wl(e,t,l){st.current||(je(m,e,X.Select),Pe((function(a){e.intersections.length>0&&e.intersections[0].object===t&&(a.contextMenuObjectType=V.Wall,l&&a.pastePoint.copy(e.intersections[0].point))})))}function Ml(e){var t=Xw.getState().objectTypeToAdd;vl()||Re()||!pl(e)||t!==V.None?Zm.isTypeRoof(t)&&Rl(e):Xw.getState().groupActionMode?(Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.id===k?a.selected=!0:a.selected=!1}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k})),e.stopPropagation()):bl()&&Xw.getState().selectMe(m,e,X.Select)}function Il(e){0!==e.intersections.length&&e.intersections[0].object===e.eventObject&&(Xw.getState().groupActionMode?Pe((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===k}}catch(o){l.e(o)}finally{l.f()}e.groupMasterId=k,e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(k)})):(function(e){return!(2===e.button||Xw.getState().addedWallId||dt.current||Xw.getState().moveHandleType||Xw.getState().resizeHandleType||Xw.getState().objectTypeToAdd!==V.None||Te||Re())}(e)&&(Pe((function(e){e.contextMenuObjectType=null})),je(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})),je(m,e,X.Select),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=Ww.fetchHeatmapTexture(e,null!==ke&&void 0!==ke?ke:5);if(t){t.wrapS=We.RepeatWrapping,t.wrapT=We.RepeatWrapping;var l=S===Et?0:(1-S/Et)/2;t.offset.set(-b/2,-Et/2-l),t.center.set(b/2,Et/2),t.repeat.set(1/b,1/Et),Qe(t)}}}}),[Ye,ke]),Object(r.useEffect)((function(){L&&(Ce!==L&&(null===Fe||void 0===Fe?void 0:Fe.id)!==L||Xw.getState().set((function(e){var t,l=new Set,a=Object(h.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=Zm.getWallPoints2D(i);tt.forEach((function(a){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 We.Vector3(a.cx*b,0,a.cz*S);Ww.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,Fe]),Object(pf.jsxs)(pf.Fragment,{children:[(ie>0||Q===Ee.Default)&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{name:"Wall Simulation Mesh",uuid:m,userData:{simulation:!0},rotation:[vt,0,0],castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Vt]}),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})]}),Object(pf.jsxs)("mesh",{name:"".concat(bp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(m),ref:it,rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onContextMenu:function(e){Wl(e,it.current,!0)},onPointerMove:function(e){if(function(e,t){var l=e.intersections.filter((function(e){return e.object.name!==Jm}));return l.length>0&&l[0].object.name==="".concat(bp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(t)}(e,m)){var t=Xw.getState().objectTypeToAdd;if((o=t)===V.Window||o===V.Door)!function(e){e&&(ft.current={id:e.id,type:e.type,status:tm.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=Hl(Al(e,it.current).pointerOnGrid);jl(ft.current.id,l)}var a=Xw.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=Hl(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=k,t.selectedElement&&(t.selectedElement.parentId=m,t.selectedElement.foundationId=k),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)}})),Oe("showWallIntersectionPlaneId",m))}else vl()&&Tl(ft.current);var o},onPointerDown:Rl,onPointerUp:function(){ft.current&&ft.current.status===tm.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(pf.jsx)("shapeBufferGeometry",{args:[Vt]}),Ye&&qe?Object(pf.jsx)("meshBasicMaterial",{attach:"material",map:qe,color:"white",opacity:ie,transparent:Pt}):Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:R===ue.Default||R===ue.NoTexture?W:"white",map:Ae,transparent:Pt,opacity:ie})]}),Object(pf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,.05,0],castShadow:It,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)("meshStandardMaterial",{color:"white",side:We.BackSide,transparent:Pt,opacity:ie})]}),Object(pf.jsxs)("mesh",{name:"Inside Wall",ref:rt,position:[0,T,0],rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml,onContextMenu:function(e){Wl(e,rt.current)},children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)(Xm,{transparent:Pt,color:W,opacity:ie})]}),Object(pf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,T-.01,0],receiveShadow:!0,children:[Object(pf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(pf.jsx)("meshStandardMaterial",{color:"white",side:We.FrontSide,transparent:Pt,opacity:ie})]}),(!L||Mt)&&!Ct&&Object(pf.jsx)("mesh",{name:"Top Wall",ref:nt,material:Ut,position:[0,pt,Gt],rotation:[0,-Xt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml,onContextMenu:function(e){Wl(e,nt.current)},children:Object(pf.jsx)("shapeBufferGeometry",{args:[Bt]})}),0===At&&Object(pf.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:Ml}),0===Tt&&Object(pf.jsx)(Lt.f,{args:[Wt-Rt,T],material:Ut,position:[ht-.01,pt,-xt+Rt+(Wt-Rt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Ml}),(Ge||Ne===m)&&(null===(s=Xw.getState().selectedElement)||void 0===s?void 0:s.parentId)===m&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.f,{ref:ct,name:Jm,args:[1e4,1e4],position:[0,T/3,0],rotation:[vt,0,0],onPointerMove:function(e){var t,l=null!==(t=Xw.getState().selectedElement)&&void 0!==t?t:He();if((null===l||void 0===l?void 0:l.parentId)===y.id)if(Xw.getState().moveHandleType){var a=new We.Vector3(-l.lx/2*b,0,l.lz/2*S),o=Al(e,ct.current,a),i=(o.relativePointer,o.pointerOnGrid),r=Pl(l),n=Hl(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:Zg);var p=ll(l.id,n,c,s,h);ut.current=f&&p?null:l.id}jl(l.id,n)}else if(Xw.getState().resizeHandleType){var g=Al(e,ct.current),m=g.relativePointer,w=g.pointerOnGrid,x=Xw.getState().resizeHandleType,v=Xw.getState().resizeAnchor;switch(l.type){case V.Window:var A=l,T=Hl(w,{resizeAnchor:v});if(gl(A)){var P=zl(A,T,v),H=P.newLz,j=P.newCz,z=P.newArchHeight,R=new We.Vector3(A.cx*b,0,j);ll(A.id,R,A.lx*b,H),al(A.id,R,A.lx*b,H),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lz=H/S,t.cz=j/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 We.Vector3(A.cx*b,0,A.cz*S),W=A.lx*b,M=A.lz*S,I=[Ww.clamp((w.x-v.x)/W,-.5,.5),Math.max(0,w.z-v.z)];ll(A.id,D,W,M,I)&&ol(D,W,M,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,F=wl(0,T,v),k=F.dimensionXZ,O=F.positionXZ,Y=new We.Vector3(O.x,0,O.z),L=!0,N=void 0;if(A.windowType===Yt.Polygonal)N=null!==(C=A.polygonTop)&&void 0!==C?C:Zg,L=ol(Y,k.x,k.z,N);ll(A.id,Y,k.x,k.z,N)&&L&&al(A.id,Y,k.x,k.z)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lx=k.x/b,t.lz=k.z/S,t.cx=O.x/b,t.cz=O.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,E=Hl(w,{resizeAnchor:v});if(gl(U)){var J=zl(U,E,v),G=J.newLz,X=J.newCz,B=J.newArchHeight,q=new We.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,E,v),Z=Q.dimensionXZ,_=Q.positionXZ,$=new We.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=(E.z-S/2)/2/S,t.lz=(E.z+S/2)/S,t.color=t.id===ut.current?wt:l.color)}))}break;case V.SolarPanel:var ee=l,te=Km(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 We.Vector3(0,0,m.z-v.z).normalize().multiplyScalar(ie),ne=(new We.Vector3).addVectors(v,re.clone().divideScalar(2));if(!Ww.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 We.Vector3(m.x-v.x,0,0).normalize().multiplyScalar(ce),de=(new We.Vector3).addVectors(v,se.clone().divideScalar(2));if(!Ww.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===tm.SettingEndPoint?(Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null):(Xw.getState().moveHandleType||Xw.getState().resizeHandleType)&&bp.undoInvalidOperation();else if(ft.current){if(ft.current.status===tm.SettingStartPoint)Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null;else if(ft.current.status===tm.SettingEndPoint){var e=Xw.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,_y.selectNone(e))})),fl(t)),ft.current=null}}else Xw.getState().moveHandleType?bp.addUndoableMove():Xw.getState().resizeHandleType&&function(){var e=Xw.getState().selectedElement;if(e){var t=Xw.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(f.a)(e.polygonTop):void 0,newPolygonTop:ul(t)?Object(f.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(f.a)(a.vertices),newValue:Object(f.a)(o.vertices),changedElementId:o.id,changedElementType:o.type,undo:function(){Me(this.changedElementId,this.oldValue)},redo:function(){Me(this.changedElementId,this.newValue)}};ze(i)}}}();Nt.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)}))})),Oe("showWallIntersectionPlaneId",null),ut.current=null,hl()},visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{color:"blue",side:We.DoubleSide})}),Object(pf.jsx)(Lt.f,{name:Vm,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(pf.jsx)($g,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(pf.jsx)(zm,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(pf.jsx)("group",{position:[0,-e.lz/2,0],children:Object(pf.jsx)(Fm,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(pf.jsx)(Nm,Object(d.a)({},e),e.id):null})),Q===Ee.Stud&&function(){var e=null!==E&&void 0!==E?E:[0,(Dt+Wt)/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,Wt-a),s=-Math.atan2(Wt-a,n);return Object(pf.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(h.a)(Xw.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 f=void 0,p=void 0,y=void 0;o&&(f=[-o[0],o[1]]),r&&(p=[-r[0],r[1]]),i&&(y=[-i[0],i[1]]),u=e.getWallPoints2D(d,f,p,y)}if(d.id===l||d.id===a){var g,m=Object(h.a)(Xw.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=Gm;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 Ww.isPointInside(l.x,l.y,d.map(Ww.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}var f=[n,r,i];return Ww.isPointInside(l.x,l.y,f.map(Ww.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}if(c<=s){var h=[n,r,i];return Ww.isPointInside(l.x,l.y,h.map(Ww.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}var p=[n,r,o];return Ww.isPointInside(l.x,l.y,p.map(Ww.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 We.Vector3).crossVectors((new We.Vector3).subVectors(l,a),(new We.Vector3).subVectors(l,o)).normalize()}},{key:"getRotationFromNormal",value:function(e){return Ww.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 We.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 We.Vector3(0,0,1),rotation:[0,0,0]}}},{key:"getOrderedWallArrayOfRoof",value:function(e){var t,l=new Map,a=Object(h.a)(Xw.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=Af.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 We.Vector3(e.cx,e.cy,e.cz),o=new We.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 We.Vector3(e.lx/2*r,(e.lz/2-i)*n*r,0):new We.Vector3(e.lx/2*r,e.lz/2*n*r,0);c.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),c.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(c)}var s=new We.Vector3(0,e.lz/2,0);s.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),s.applyEuler(new We.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 We.Vector3(e.lx/2*d,e.lz/2*u*d,0);f.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),f.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(f)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=new We.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);h.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),h.applyEuler(new We.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(h)}}return l}},{key:"getRelativeWindowVerticesOnRoof",value:function(e){var t=[],l=new We.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 We.Vector3(e.lx/2*o,(e.lz/2-a)*i*o,0):new We.Vector3(e.lx/2*o,e.lz/2*i*o,0);r.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(r)}var n=new We.Vector3(0,e.lz/2,0);n.applyEuler(new We.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 We.Vector3(e.lx/2*c,e.lz/2*s*c,0);d.applyEuler(new We.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 We.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);u.applyEuler(new We.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 We.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz),o=new We.Vector3(t.cx,t.cy,t.lz),i=-1;i<=1;i+=2)for(var r=-1;r<=1;r+=2){var n=new We.Vector3(e.lx/2*i,e.ly/2*r*i,0);0===e.rotation[0]?n.applyEuler(new We.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):n.applyEuler(new We.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),n.applyEuler(new We.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 We.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 We.Vector3(e.lx/2*o,e.ly/2*i*o,0);0===e.rotation[0]?r.applyEuler(new We.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):r.applyEuler(new We.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 We.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 We.Vector3(r*o,r*n*i);c.applyEuler((new We.Euler).fromArray([].concat(Object(f.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:Zg,h=Object(u.a)(d,2),p=h[0],y=h[1],g=new We.Vector3(p*e.lx,e.lz+y).add(a);l.push(g)}return l}},{key:"rooftopElementBoundaryCheck",value:function(e,t){var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!Ww.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(h.a)(Xw.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].eventObject.name===t&&(Xw.getState().set((function(e){e.moveHandleType=t})),Nt.getState().setEnableOrbitController(!1))},onPointerOver:function(e){o(e,t)},onPointerOut:i,children:Object(pf.jsx)("meshBasicMaterial",{color:g})})},uw=function(e){var t=e.handleType,l=e.position,a=e.size,o=e.onPointerOver,i=e.onPointerOut,n=Xw(zu),c=Xw(Hu),s=Object(r.useRef)(),d=Object(u.a)(l,3),f=d[0],h=d[1],p=d[2],y=c===t||n===t?pt:ht;return Object(pf.jsx)(Lt.a,{ref:s,name:t,args:[a,a,a],position:[f,h,p],onPointerDown:function(){if(s.current){var e=s.current.localToWorld(new We.Vector3(2*-f,2*-h,0));Xw.getState().set((function(l){l.resizeAnchor.copy(e),l.resizeHandleType=t})),Nt.getState().setEnableOrbitController(!1)}},onPointerOver:function(e){o(e,t)},onPointerOut:i,children:Object(pf.jsx)("meshBasicMaterial",{color:y})})};!function(e){e.Top="Top",e.NS="NS",e.EW="EW"}($m||($m={}));var fw=function(e){var t=e.id,l=e.args,a=Object(u.a)(l,3),i=a[0],n=a[1],c=a[2],s=Xw(si),d=Xw(Zr),f=Xw(o.orthographic),p=Xw(Fu),y=Object(r.useState)(null),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(Se.f)(),v=x.gl,b=x.raycaster,A=wp(),T=Object(r.useRef)(null),P=Object(r.useRef)(null),S=Object(r.useRef)(null),H=Object(r.useRef)(null),j=Object(r.useRef)(null),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(null),W=Object(r.useMemo)((function(){return[0,Math.min(-1.2*n,-n-.75)-2*A,.08-c]}),[n,c,A]),M=Object(r.useMemo)((function(){return[0,Math.max(1.2*n,n+.75)+2*A,.08-c]}),[n,c,A]),I=null!==m,C=!f,F=!p,k=Object(r.useCallback)((function(e,l){bf.getState().duringCameraInteraction||e.intersections.length>0&&(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)})),Ww.isMoveHandle(l)?v.domElement.style.cursor="move":l===q.Upper||l===q.Lower?v.domElement.style.cursor="grab":v.domElement.style.cursor=Xw.getState().addedCuboidId?"crosshair":"pointer")}),[]),O=Object(r.useCallback)((function(){s((function(e){e.hoveredHandle=null})),v.domElement.style.cursor=Xw.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(pf.jsxs)(pf.Fragment,{children:[I&&Object(pf.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=Xw.getState().resizeHandleType;o?Ww.isTopResizeHandle(o)?function(e){if(null!==T.current){var l=Math.max(1,e.z-T.current);s((function(e){var a,o=Object(h.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]===$m.Top&&(i.cz=l/2)}}}catch(n){o.e(n)}finally{o.f()}}))}}(a):Ww.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));o.cx=p.x;var y=Math.abs(n.x);o.lx=y;var g=new We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),m=o.rotation[2]+f;if(z.current.size>0){var w,x=Object(h.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 We.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),H=P[0],j=P[1];H===$m.Top||H===$m.NS?v.cx=A.x:H===$m.EW&&(v.cx=Math.sign(j)*(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):Ww.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));o.cy=p.y;var y=Math.abs(n.y);o.ly=y;var g=new We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),m=o.rotation[2]+f;if(z.current.size>0){var w,x=Object(h.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 We.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),H=P[0],j=P[1];H===$m.Top?v.cy=A.y:H===$m.NS?v.cy=Math.sign(j)*(y/2):H===$m.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=Xw.getState().resizeAnchor.clone().setZ(0),n=(new We.Vector3).subVectors(i,r).applyEuler(new We.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new We.Vector3).addVectors(i,r).multiplyScalar(.5),s=Ww.getWorldDataById(o.parentId),d=s.pos,f=s.rot,p=(new We.Vector3).subVectors(c,d).applyEuler(new We.Euler(0,0,-f));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 We.Vector3(p.x,p.y,o.cz).applyEuler(new We.Euler(0,0,f)).add(d),w=o.rotation[2]+f;if(z.current.size>0){var x,v=Object(h.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 We.Euler(0,0,-w));if(L(b.type)){var P=R.current.get(b.id);if(P){var H=Object(u.a)(P,2),j=H[0],D=H[1];j===$m.Top?(b.cx=T.x,b.cy=T.y):j===$m.NS?(b.cx=T.x,b.cy=Math.sign(D)*(g/2)):j===$m.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(W){v.e(W)}finally{v.f()}}}}))}(a):Xw.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)+(Xw.getState().rotateHandleType===q.Upper?0:Math.PI),r=Math.abs(i)>Math.PI?-Math.sign(i)*bt:0;H.current&&(i-=H.current),Xw.getState().updateElementRotationById(t,0,0,i+r)}}(a)}}},onPointerUp:function(){w(null),T.current=null,P.current=null,S.current=null,H.current=null,j.current=null}}),Object(pf.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||Xw.getState().addedCuboidId){var l=d(t);if(l&&l.parentId!==xt){w({position:new We.Vector3(0,0,-c),rotation:new We.Euler});var a=Ww.getWorldDataById(l.parentId),o=a.pos,r=a.rot;j.current=o,H.current=r,S.current=r+l.rotation[2];var n=new We.Vector3(l.cx,l.cy,l.cz).applyEuler(new We.Euler(0,0,r)).add(o),s=Xw.getState().elements.filter((function(e){return e.parentId===l.id&&(t=e.type,L(t)||t===V.Cuboid||Ww.isIdentical(e.normal,[0,0,1]));var t}));z.current.clear(),R.current.clear();var u,f=Object(h.a)(s);try{for(f.s();!(u=f.n()).done;){var p=u.value,y=new We.Vector3;L(p.type)?(y.set(p.cx,p.cy,p.cz),Math.abs(p.cz-c)<.01?R.current.set(p.id,[$m.Top,1]):Math.abs(Math.abs(p.cx)-i)<.01?R.current.set(p.id,[$m.EW,Math.sign(p.cx)]):R.current.set(p.id,[$m.NS,Math.sign(p.cy)])):p.type===V.Cuboid?y.set(p.cx,p.cy,p.cz):y.set(p.cx*l.lx,p.cy*l.ly,0),y.applyEuler(new We.Euler(0,0,S.current)).add(n),z.current.set(p.id,y)}}catch(g){f.e(g)}finally{f.f()}}}},children:[Object(pf.jsx)(uw,{handleType:K.UpperLeft,position:[-i,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperRight,position:[i,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerLeft,position:[-i,-n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerRight,position:[i,-n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Left,position:[-i,0,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Right,position:[i,0,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Upper,position:[0,n,0],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.Lower,position:[0,-n,0],size:A,onPointerOver:k,onPointerOut:O})]}),C&&Object(pf.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=Xw.getState().cameraDirection,o=Math.atan2(a.x,a.y)+Y(t);w({position:l.position.clone(),rotation:new We.Euler(-vt,o,0)});var i=l.localToWorld(new We.Vector3);T.current=i.z-2*c;var r=Xw.getState().elements.filter((function(e){return e.parentId===t&&L(e.type)}));R.current.clear();var n,s=Object(h.a)(r);try{for(s.s();!(n=s.n()).done;){var d=n.value;(new We.Vector3).set(d.cx,d.cy,d.cz),Math.abs(d.cz-c)<.01&&R.current.set(d.id,[$m.Top,1])}}catch(u){s.e(u)}finally{s.f()}}},children:[Object(pf.jsx)(uw,{handleType:K.LowerLeftTop,position:[-i,-n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperLeftTop,position:[-i,n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.LowerRightTop,position:[i,-n,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(uw,{handleType:K.UpperRightTop,position:[i,n,c],size:A,onPointerOver:k,onPointerOut:O})]}),F&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(dw,{handleType:B.Lower,position:[0,-n-1.2*A,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Upper,position:[0,n+1.2*A,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Left,position:[-i-1.2*A,0,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Right,position:[i+1.2*A,0,-c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.jsx)(dw,{handleType:B.Top,position:[0,0,c],size:A,onPointerOver:k,onPointerOut:O}),Object(pf.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 We.Vector3(0,0,-c),rotation:new We.Euler(0,0,0)});var l=e.eventObject;P.current=l.localToWorld(new We.Vector3).toArray();var a=d(t);a&&(H.current=Y(a.parentId))}},children:[Object(pf.jsx)(uy,{id:t,handleType:q.Lower,position:W,ratio:4*A,hoverHandle:k,noHoverHandle:O}),Object(pf.jsx)(uy,{id:t,position:M,handleType:q.Upper,ratio:4*A,hoverHandle:k,noHoverHandle:O})]})]})]})},hw=n.a.memo(fw),pw="Handle Group Move & Resize",yw=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=xw(f),P=s/2,S=T?m:0,H=Math.max(1,(c+s)/16),j=2*H/3,z=2*H/3,R=-m/2-d/2,D=Xw(si),W=Xw(tc),M=Xw(Sr),I=Xw(i.date),C=Xw(i.latitude),F=Object(Se.f)(),k=F.gl.domElement,O=F.camera,Y=F.raycaster,L=F.mouse,N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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 We.Vector3(d,u,R+a*x*n))}return e}),[g,y,x,c,s,R]),re=Object(r.useMemo)((function(){return ww(f)}),[f]),ne=Object(r.useMemo)((function(){if(T){if(p===te.NO_TRACKER)return new We.Euler(y,0,g,"ZXY");var e=Iy(oe,C),t=vw(l,re.z)-re.z;switch(p){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var a=Math.hypot(e.x,e.y);return new We.Euler(Math.atan2(a,e.z),0,Math.atan2(e.y,e.x)+vt-t,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new We.Euler(0,Math.atan2(e.x,e.z),-t+(c.1,de=S>0&&T;Object(r.useEffect)((function(){var e=function(){Nt.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?k.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?k.style.cursor="grab":k.style.cursor="pointer"))},fe=function(){J(null),k.style.cursor="default"},he=function(e){return E===e||Xw.getState().rotateHandleType===e?pt:ht};return Object(pf.jsxs)("group",{name:"Solar Panel Group",position:[a,o,S+n],rotation:re,children:[Object(pf.jsx)(gw,{solarPanelModel:e,groupRotation:re,panelRotation:ne}),ce&&Object(pf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,ne.z],children:[Object(pf.jsx)(uy,{id:t,position:[0,-P-j/2,S],color:he(q.Upper),ratio:j,handleType:q.Upper,hoverHandle:ue,noHoverHandle:fe}),Object(pf.jsx)(uy,{id:t,position:[0,P+j/2,S],color:he(q.Lower),ratio:j,handleType:q.Lower,hoverHandle:ue,noHoverHandle:fe})]}),se&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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),E){Nt.getState().setEnableOrbitController(!1),Z.current=!0,_.current=y;var t=Ww.getWorldDataById(l).rot;ee.current=t}D((function(e){e.rotateHandleType=q.Tilt}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:E===q.Tilt||K?pt:ht})}),K&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(){W(l.changedElementId,l.oldValue)},redo:function(){W(l.changedElementId,l.newValue)}};M(l)}},onPointerMove:function(e){if(Z.current&&(Y.setFromCamera(L,O),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 We.Vector3),r=(new We.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));W(t,n*=u),$.current=n}}}}},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,z],[0,0,1.75*z]],rotation:new We.Euler(y,0,ne.z,"ZXY"),lineWidth:1}),ae.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,ne.z,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*z],[0,0,2*z]],color:"white",transparent:!0,opacity:.5}),Object(pf.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(pf.jsx)("group",{rotation:new We.Euler(y,0,ne.z,"ZXY"),children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:b})},t)}))]})},gw=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,H=s.selected,j=s.locked,z=s.showLabel,R=s.label,D=s.pvModelName,W=s.orientation,M=s.frameColor,I=s.backsheetColor,C=s.color,F=s.poleHeight,k=Xw(si),O=Xw(os),Y=Xw(i.date),L=Xw(i.latitude),N=Xw(zu),U=Xw(Vi),E=bf(Us),J=Xw(Yi),G=Xw(o.solarPanelShininess),Q=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,Z=Object(r.useMemo)((function(){return{lng:U}}),[U]),_=xw(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[D];fe&&(m=Math.max(fe.thickness,.02));var he=Object(r.useMemo)((function(){return new Date(Y)}),[Y]),pe=Object(r.useMemo)((function(){return(R||me.t("shared.SolarPanelElement",Z))+(j?" ("+me.t("shared.ElementLocked",Z)+")":"")+(R?"":"\n"+me.t("word.Coordinates",Z)+": ("+w.toFixed(1)+", "+x.toFixed(1)+", "+v.toFixed(1)+") "+me.t("word.MeterAbbreviation",Z))}),[R,j,U,w,x,v]),ye=Object(r.useMemo)((function(){var e=[];if(fe){var t,l;W===$.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 We.Vector3(i*a-ce,-se,m),new We.Vector3(i*a-ce,se,m)]});for(var r=0;r<=l;r++)e.push({points:[new We.Vector3(-ce,r*o-se,m),new We.Vector3(ce,r*o-se,m)]})}return e}),[fe,W,D,y,g,m]),ge=Object(r.useState)(Fe()),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],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(null),Me=Object(Se.f)().gl,Ie=tg(y,g,fe,W,M,I),Ce=eg(h);function Fe(){var e=new We.Euler,t=vw(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),Iy(he,L).applyEuler(e)}function ke(e){return ze===e||N===e?pt:ht}function Oe(e,t){Nt.getState().setEnableOrbitController(!1),k((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(t)}))}return Object(Se.d)((function(){var e=Fe();e.equals(xe)||ve(e)})),Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:"Solar Panel Box Group",rotation:f,children:[Object(pf.jsxs)(Lt.a,{uuid:h,ref:De,args:[y,g,m],position:[0,0,de],onPointerDown:function(e){2!==e.button&&O(h,e,X.Select)},onContextMenu:function(e){O(h,e,X.Select),k((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),Me.domElement.style.cursor="move"))},onPointerOut:function(e){Pe(!1),Me.domElement.style.cursor="default"},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),E&&Ce?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Ce}):Ie?Q||0===G?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:Ie,color:C}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:We.FrontSide,map:Ie,color:C}):Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),0===(null===fe||void 0===fe?void 0:fe.bifacialityFactor)||Q||0===F&&0===A?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Ie?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:We.FrontSide,map:Ie,color:C}):null]}),H&&!j&&Object(pf.jsxs)("group",{name:pw,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===pw){var t=e.object.name;switch(t){case B.Default:Nt.getState().setEnableOrbitController(!1),k((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 We.Vector3(y,0,0));Oe(t,l);break;case K.Right:var a=e.object.localToWorld(new We.Vector3(-y,0,0));Oe(t,a);break;case K.Lower:var o=e.object.localToWorld(new We.Vector3(0,g,0));Oe(t,o);break;case K.Upper:var i=e.object.localToWorld(new We.Vector3(0,-g,0));Oe(t,i)}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(pw)){var t=e.object.name;Re(t),t===B.Top?Me.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?Me.domElement.style.cursor="grab":Me.domElement.style.cursor="pointer"}},onPointerOut:function(){Re(null),Me.domElement.style.cursor="default"},children:[Object(pf.jsx)(Lt.h,{args:[ie,6,6],name:B.Default,children:Object(pf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(pf.jsx)(Lt.a,{position:[0,-se,de],args:ue,name:K.Lower,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Lower)})}),Object(pf.jsx)(Lt.a,{position:[0,se,de],args:ue,name:K.Upper,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Upper)})}),Object(pf.jsx)(Lt.a,{position:[-ce,0,de],args:ue,name:K.Left,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Left)})}),Object(pf.jsx)(Lt.a,{position:[ce,0,de],args:ue,name:K.Right,children:Object(pf.jsx)("meshBasicMaterial",{color:ke(K.Right)})})]}),S&&xe.z>0&&Object(pf.jsx)(mw,{sunDirection:xe}),E&&Ce&&ye.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:h,args:[y,g],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),H&&j&&Object(pf.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||z)&&!H&&Object(pf.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)]})]})},mw=n.a.memo((function(e){var t=e.sunDirection,l=Xw(Kr),a=Object(r.useMemo)((function(){return Math.max(100,10*l)}),[l]);return Object(pf.jsxs)("group",{name:"Sun Beam Group",children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[t.clone().multiplyScalar(.5),Rt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:Rt.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(pf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})}));function ww(e){var t=Object(u.a)(e,3),l=t[0],a=t[1];return 1===t[2]?new We.Euler(0,0,0):0!==l?new We.Euler(vt,0,l*vt,"ZXY"):0!==a?new We.Euler(-a*vt,0,0):new We.Euler}function xw(e){return Math.abs(e[2]-1)<.01}function vw(e,t){return Ww.getWorldDataById(e).rot+t}var bw=n.a.memo(yw),Aw=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,H=e.lineWidth,j=void 0===H?.1:H,z=e.locked,R=void 0!==z&&z,D=e.showLabel,W=void 0!==D&&D,M=e.textureTypes,I=void 0===M?[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]:M,C=e.stackable,F=_f(s),k=Xw(si),O=Xw(Vi),Y=Xw(o.orthographic),L=Xw(Zr),N=Xw(an),U=Xw(rs),E=Xw(Kc),J=Xw(bn),G=Xw(Pn),Q=Xw(nn),Z=Xw(cn),_=Xw(sn),ee=Xw(os),te=Xw(ic),le=Xw(Ni),ae=Xw(o.shadowEnabled),oe=Xw(Sr),ie=Xw(Mu),re=Xw(Kn),ne=Xw(Bn),ce=Xw(on),se=bf(Us),ue=Xw(o.solarRadiationHeatmapMaxValue),fe=Af(wi),he=Xw(o.groundImage),pe=Xw(Vu),ye=Object(Se.f)(),ge=ye.camera,we=ye.gl.domElement,xe=ye.raycaster,ve=ye.mouse,be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useState)(null),Me=Object(u.a)(De,2),Ie=Me[0],Ce=Me[1],Fe=Object(r.useState)(null),ke=Object(u.a)(Fe,2),Oe=ke[0],Ye=ke[1],Le=Object(r.useState)(null),Ne=Object(u.a)(Le,2),Ue=Ne[0],Ee=Ne[1],Ve=Object(r.useState)(!1),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(!1),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],tt=Object(r.useRef)(null),lt=Object(r.useRef)(),at=Object(r.useRef)(null),ot=Object(r.useRef)(Rt),it=Object(r.useRef)(new We.Vector3(0,0,0)),rt=Object(r.useRef)(new We.Euler(0,0,0)),nt=Object(r.useRef)(new We.Vector3(1,1,1)),ct=Object(r.useRef)(new We.Vector3),dt=Object(r.useRef)(new We.Vector3),ut=Object(r.useRef)(new We.Vector3),ft=Object(r.useRef)(new We.Vector3),ht=Object(r.useRef)(new We.Vector3(1,1,1)),pt=Object(r.useRef)(new We.Vector3(1,1,1)),gt=Object(r.useRef)(0),mt=Object(r.useRef)(0),wt=Object(r.useRef)([]),xt=Object(r.useRef)([]),Pt=Object(r.useRef)(),Wt=Object(r.useRef)(new We.Vector3),Mt=Object(r.useRef)(0),It=Object(r.useMemo)((function(){return{lng:O}}),[O]),Ct=m/2,Ft=x/2,kt=b/2,Ot=Object(r.useMemo)((function(){return new We.Vector3}),[]);if(at.current&&at.current.type===V.SolarPanel){var Yt=xw(at.current.normal)?at.current.poleHeight:0;Ot.set(0,0,e.lz/2+Yt)}var Ut=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.CuboidElement",It))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",It)+")":"")+((null===e||void 0===e?void 0:e.label)?"":"\n"+me.t("word.Coordinates",It)+": ("+p.toFixed(1)+", "+y.toFixed(1)+", "+(b/2).toFixed(1)+") "+me.t("word.MeterAbbreviation",It))}),[null===e||void 0===e?void 0:e.label,R,O,p,y,b]);Object(r.useEffect)((function(){var e=function(){at.current=null,Qe(!1),Nt.getState().setEnableOrbitController(!0)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Xw.getState().tempHumanPlant.length>0&&k((function(e){var t;(t=e.elements).push.apply(t,Object(f.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&&Pe(Ww.fetchHeatmapTexture(l,t));var a=fe(e.id+"-south");a&&Re(Ww.fetchHeatmapTexture(a,t));var o=fe(e.id+"-north");o&&Ce(Ww.fetchHeatmapTexture(o,t));var i=fe(e.id+"-west");i&&Ye(Ww.fetchHeatmapTexture(i,t));var r=fe(e.id+"-east");r&&Ee(Ww.fetchHeatmapTexture(r,t,!0))}}),[se,ue]);var Et=function(e){switch(e){case de.Facade01:return ew;case de.Facade02:return tw;case de.Facade03:return lw;case de.Facade04:return aw;case de.Facade05:return ow;case de.Facade06:return iw;case de.Facade07:return rw;case de.Facade08:return nw;case de.Facade09:return cw;case de.Facade10:return sw;default:return Tf}},Vt=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}}},Jt=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[0]):Tf,(function(e){var t=Vt(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=We.RepeatWrapping,Kt(e)}))}),[I[0],x,b]),Gt=Object(r.useState)(Jt),Xt=Object(u.a)(Gt,2),Bt=Xt[0],Kt=Xt[1],qt=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[1]):Tf,(function(e){var t=Vt(I[1]);e.repeat.set(x/t.x,b/t.y),e.rotation=-vt,e.wrapS=e.wrapT=We.RepeatWrapping,$t(e)}))}),[I[1],x,b]),Qt=Object(r.useState)(qt),Zt=Object(u.a)(Qt,2),_t=Zt[0],$t=Zt[1],el=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[2]):Tf,(function(e){var t=Vt(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=We.RepeatWrapping,ol(e)}))}),[I[2],m,b]),tl=Object(r.useState)(el),ll=Object(u.a)(tl,2),al=ll[0],ol=ll[1],il=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[3]):Tf,(function(e){var t=Vt(I[3]);e.repeat.set(m/t.x,b/t.y),e.wrapS=e.wrapT=We.RepeatWrapping,sl(e)}))}),[I[3],m,b]),rl=Object(r.useState)(il),nl=Object(u.a)(rl,2),cl=nl[0],sl=nl[1],dl=Object(r.useMemo)((function(){return(new We.TextureLoader).load(I?Et(I[4]):Tf,(function(e){var t=Vt(I[4]);e.repeat.set(m/t.x,x/t.y),e.wrapS=e.wrapT=We.RepeatWrapping,pl(e)}))}),[I[4],m,x]),ul=Object(r.useState)(dl),fl=Object(u.a)(ul,2),hl=fl[0],pl=fl[1];Object(r.useEffect)((function(){Object(Se.c)()}),Object(f.a)(I));var yl=function(e){ot.current=e;var t=.01;Ww.isSame(ot.current,Rt)?(it.current=new We.Vector3(0,0,kt+t),rt.current=new We.Euler(0,0,0),nt.current.set(Ct,Ft,kt)):Ww.isSame(ot.current,St)?(it.current=new We.Vector3(Ct+t,0,0),rt.current=new We.Euler(0,vt,0),nt.current.set(kt,Ft,Ct)):Ww.isSame(ot.current,Ht)?(it.current=new We.Vector3(-Ct-t,0,0),rt.current=new We.Euler(0,-vt,0),nt.current.set(kt,Ft,Ct)):Ww.isSame(ot.current,zt)?(it.current=new We.Vector3(0,-Ft-t,0),rt.current=new We.Euler(vt,0,0),nt.current.set(Ct,kt,Ft)):Ww.isSame(ot.current,jt)&&(it.current=new We.Vector3(0,Ft+t,0),rt.current=new We.Euler(-vt,0,0),nt.current.set(Ct,kt,Ft))},gl=Math.max(1,Math.max(m,x)/8),ml=st*gl,wl=Ww.isIdentical(null===(t=at.current)||void 0===t?void 0:t.normal,Tt),xl=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",It)),!1):!(Ww.isIdentical(t.normal,Tt)&&!Ww.isSolarCollectorWithinHorizontalSurface(o,e))||(Qh(me.t("message.MoveOutsideBoundaryCancelled",It)),!1)},vl=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,!!Ww.isSolarCollectorWithinHorizontalSurface(r,e)},bl=he?Y?.25:.75:1,Al=[se&&Ue?Ue:Bt,se&&Oe?Oe:_t,se&&Ie?Ie:al,se&&ze?ze:cl,se&&Te?Te:hl,null],Tl=e&&e.faceColors?[0,1,2,3,4,5].map((function(t){return I&&I[t]!==de.NoTexture?se?Object(pf.jsx)("meshBasicMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):se?Object(pf.jsx)("meshBasicMaterial",{side:We.FrontSide,attachArray:"material",color:"white",map:Al[t],transparent:Y&&he,opacity:bl},t):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attachArray:"material",color:e.faceColors?e.faceColors[t]:T,map:Al[t],transparent:Y&&he,opacity:bl},t)})):Object(pf.jsx)("meshStandardMaterial",{side:We.FrontSide,attach:"material",color:T,transparent:Y&&he,opacity:bl}),Pl=Object(r.useMemo)((function(){return[Ct,Ft,kt]}),[Ct,Ft,kt]),Sl=F&&!R&&!pe;return Object(pf.jsxs)("group",{ref:tt,name:"Cuboid Group "+s,userData:{aabb:!0},children:[Object(pf.jsx)(Lt.a,{castShadow:ae,receiveShadow:ae,userData:{simulation:!0,stand:!0,stackable:C},uuid:s,ref:lt,args:[m,x,b],name:"Cuboid "+s,onContextMenu:function(e){ee(s,e,X.Select),k((function(t){t.pastePoint.copy(e.intersections[0].point);var l=e.intersections[0].face;(l&&(t.pasteNormal=l.normal.clone(),Ww.isSame(l.normal,St)?t.selectedSideIndex=0:Ww.isSame(l.normal,Ht)?t.selectedSideIndex=1:Ww.isSame(l.normal,jt)?t.selectedSideIndex=2:Ww.isSame(l.normal,zt)?t.selectedSideIndex=3:Ww.isSame(l.normal,Rt)&&(t.selectedSideIndex=4)),t.clickObjectType=V.Cuboid,e.intersections.length>0)&&(e.intersections[0].object===lt.current&&(t.contextMenuObjectType=V.Cuboid))}))},onPointerDown:function(t){if(2!==t.button){ie()||ee(s,t,X.Select);var l=N(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Xw.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===s||a){if(Xw.getState().groupActionMode){var o=Ww.getBaseId(s);Xw.getState().setGroupMasterId(o)}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}(Xw.getState().objectTypeToAdd)&&e){Qe(!0);var i=function(t){var l,a=t.intersections[0];if(Xw.getState().objectTypeToAdd===V.SolarPanel){var o,i,r,n,c,d,u,f,h=a.point,p=Ww.getWorldDataById(s),y=p.pos,g=p.rot,w=(new We.Vector3).subVectors(h,y).applyEuler(new We.Euler(0,0,-g)),v=Vl.makeSolarPanel(e,Xw.getState().getPvModule(null!==(o=Xw.getState().actionState.solarPanelModelName)&&void 0!==o?o:"SPR-X21-335-BLK"),w.x/m,w.y/x,w.z/b,null!==(i=Xw.getState().actionState.solarPanelOrientation)&&void 0!==i?i:$.landscape,null!==(r=Xw.getState().actionState.solarPanelPoleHeight)&&void 0!==r?r:1,null!==(n=Xw.getState().actionState.solarPanelPoleSpacing)&&void 0!==n?n:3,null!==(c=Xw.getState().actionState.solarPanelTiltAngle)&&void 0!==c?c:0,null!==(d=Xw.getState().actionState.solarPanelRelativeAzimuth)&&void 0!==d?d:0,null===(u=a.face)||void 0===u?void 0:u.normal,[0,0,0],null!==(f=Xw.getState().actionState.solarPanelFrameColor)&&void 0!==f?f:"white");return k((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(i){var r={name:"Add",timestamp:Date.now(),addedElement:i,undo:function(){E(r.addedElement.id,!1)},redo:function(){k((function(e){e.elements.push(r.addedElement),e.selectedElement=r.addedElement}))}};oe(r),k((function(e){e.objectTypeToAdd=V.None}))}}else Nt.getState().selectNone(),Nt.setState((function(e){e.cuboidRef=tt}))}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 n,c=Ww.getWorldDataById(s),u=c.rot,f=c.pos;Wt.current.copy(f),Mt.current=u,at.current=l;var p,y=Object(h.a)(t.intersections);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.object===lt.current){n=g.face;break}}}catch(w){y.e(w)}finally{y.f()}switch(n&&(yl(n.normal),$e&&$e.equals(n.normal)||et(n.normal)),Nt.getState().setEnableOrbitController(!1),ct.current.x=l.cx,ct.current.y=l.cy,ct.current.z=l.cz,ut.current.fromArray(l.normal),ht.current.x=l.lx,ht.current.y=l.ly,ht.current.z=l.lz,l.type){case V.SolarPanel:gt.current=l.relativeAzimuth;break;case V.Polygon:wt.current=l.vertices.map((function(e){return Object(d.a)({},e)}))}}}},onPointerMove:function(t){if(at.current&&e){if(at.current.type===V.SolarPanel&&wl)return;if(at.current.parentId===s&&at.current.type&&!at.current.locked){var l=new We.Vector2(t.offsetX/we.clientWidth*2-1,1-t.offsetY/we.clientHeight*2);if(xe.setFromCamera(l,ge),lt.current){var a=xe.intersectObjects([lt.current]);if(a.length>0){var o=a[0].point,i=a[0].face;if(Xw.getState().moveHandleType){if(i){var r=i.normal;$e&&!$e.equals(r)&&et(r),yl(r),_(at.current.id,r.x,r.y,r.z)}if(o=Ww.relativeCoordinates(o.x,o.y,o.z,e),at.current.type===V.Polygon){var n=at.current;if(Xw.getState().moveHandleType===B.Default){var c,f,h=Ww.calculatePolygonCentroid(wt.current),p=(new We.Vector3).fromArray(n.normal);Ww.isSame(p,St)?(c=-(h.x+o.z),f=o.y-h.y):Ww.isSame(p,Ht)?(c=o.z-h.x,f=o.y-h.y):Ww.isSame(p,jt)?(c=o.x-h.x,f=-(h.y+o.z)):Ww.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=wt.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(at.current.id,o.x,o.y,o.z)}else if(Xw.getState().resizeHandleType)switch(at.current.type){case V.SolarPanel:var g=at.current,w=Km(g),v=Object(u.a)(w,2),A=v[0],T=v[1],P=Xw.getState().resizeAnchor,S=Xw.getState().resizeHandleType;if(S===K.Lower||S===K.Upper){var H=Math.max(1,Math.round(Math.abs(o.z-P.z)/T))*T,j=new We.Vector3(0,0,o.z-P.z).normalize().multiplyScalar(H),z=(new We.Vector3).addVectors(P,j.clone().divideScalar(2));k((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(t.cz=(z.z-Wt.current.z)/b,t.ly=Math.abs(j.z))}))}else if(S===K.Left||S===K.Right){var R=(new We.Vector3).subVectors(o,P).setZ(0),D=Math.max(1,Math.round(R.length()/A))*A,W=R.clone().normalize().multiplyScalar(D),M=(new We.Vector3).addVectors(P,W.clone().divideScalar(2)),I=(new We.Vector3).subVectors(M,Wt.current).applyEuler(new We.Euler(0,0,-Mt.current));k((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=W.length())}))}break;case V.Polygon:if(Xw.getState().resizeHandleType===K.Default){var C,F,O=new We.Vector3(o.x-Wt.current.x,o.y-Wt.current.y,0).applyEuler(new We.Euler(0,0,-Mt.current,"ZXY")),Y=at.current,L=(new We.Vector3).fromArray(Y.normal);Ww.isSame(L,St)?(C=e.lz,F=e.ly,O.x=-o.z+Wt.current.z):Ww.isSame(L,Ht)?(C=e.lz,F=e.ly,O.x=o.z-Wt.current.z):Ww.isSame(L,jt)?(C=e.lx,F=e.lz,O.y=-o.z+Wt.current.z):Ww.isSame(L,zt)?(C=e.lx,F=e.lz,O.y=o.z-Wt.current.z):(C=e.lx,F=e.ly),(O=Xw.getState().enableFineGrid?Ww.snapToFineGrid(O):Ww.snapToNormalGrid(O)).x/=C,O.y/=F,ne(Y.id,Y.selectedIndex,O.x,O.y)}}}}}}},onPointerUp:function(){if(at.current){var t=L(at.current.id);if(t&&t.parentId===s){if(t.type===V.Polygon){if(Xw.getState().moveHandleType||Xw.getState().resizeHandleType){xt.current=t.vertices.map((function(e){return Object(d.a)({},e)}));var l={name:Xw.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:wt.current,newValue:xt.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(Xw.getState().resizeHandleType){if(dt.current.x=t.cx,dt.current.y=t.cy,dt.current.z=t.cz,pt.current.x=t.lx,pt.current.y=t.ly,pt.current.z=t.lz,dt.current.distanceToSquared(ct.current)>At&&pt.current.distanceToSquared(ht.current)>At){var a={name:"Resize",timestamp:Date.now(),resizedElementId:at.current.id,resizedElementType:at.current.type,oldCx:ct.current.x,oldCy:ct.current.y,oldCz:ct.current.z,newCx:dt.current.x,newCy:dt.current.y,newCz:dt.current.z,oldLx:ht.current.x,oldLy:ht.current.y,oldLz:ht.current.z,newLx:pt.current.x,newLy:pt.current.y,newLz:pt.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(Xw.getState().rotateHandleType){if(at.current.type===V.SolarPanel){var o=at.current;if(Math.abs(mt.current-gt.current)>At)if(function(t,l){var a=JSON.parse(JSON.stringify(t));return a.relativeAzimuth=l,ce(a)?(Qh(me.t("message.RotationCancelledBecauseOfOverlap",It)),!1):!!Ww.isSolarCollectorWithinHorizontalSurface(a,e)||(Qh(me.t("message.RotationOutsideBoundaryCancelled",It)),!1)}(o,mt.current)){k((function(e){e.selectedElementAngle=mt.current}));var i={name:"Rotate",timestamp:Date.now(),oldValue:gt.current,newValue:mt.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,gt.current)}}else if(dt.current.x=t.cx,dt.current.y=t.cy,dt.current.z=t.cz,ft.current.fromArray(t.normal),dt.current.distanceToSquared(ct.current)>At){var r=!0;if(t.type===V.SolarPanel&&(r=xl(t,t.cx,t.cy)),r){var n,c={name:"Move",timestamp:Date.now(),movedElementId:at.current.id,movedElementType:null===(n=at.current)||void 0===n?void 0:n.type,oldCx:ct.current.x,oldCy:ct.current.y,oldCz:ct.current.z,oldNormal:ut.current.clone(),newCx:dt.current.x,newCy:dt.current.y,newCz:dt.current.z,newNormal:ft.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,ct.current.x,ct.current.y,ct.current.z)}at.current=null}}},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===lt.current&&Xe(!0))},onPointerOut:function(){if(Xe(!1),at.current)switch(at.current.type){case V.Human:case V.Tree:case V.Flower:Qe(!1);break;case V.SolarPanel:var e=Xw.getState().getElementById(at.current.id);Xw.getState().moveHandleType&&!xl(e,e.cx,e.cy)&&Q(e.id,ct.current.x,ct.current.y,ct.current.z)}},onPointerEnter:function(e){at.current&&Ww.isPlantOrHuman(at.current)&&(e.intersections[0].object===lt.current&&Qe(!0))},children:Tl}),(null===(l=at.current)||void 0===l?void 0:l.type)===V.SolarPanel&&wl&&!at.current.locked&&Object(pf.jsx)(Lt.f,{ref:Pt,name:"Cuboid Intersection Plane",position:Ot,args:[m,x],visible:!1,onPointerMove:function(t){if(Pt.current&&at.current&&e){if(at.current.type!==V.SolarPanel||!wl)return;var l=at.current;if(l.parentId!==s||l.locked)return;xe.setFromCamera(ve,ge);var a=xe.intersectObjects([Pt.current]);if(a.length>0){var o=a[0].point.clone();if(Xw.getState().moveHandleType)o=Ww.relativeCoordinates(o.x,o.y,o.z-l.poleHeight,e),Q(l.id,o.x,o.y,o.z);else if(Xw.getState().rotateHandleType&&Xw.getState().rotateHandleType!==q.Tilt){var i=Mt.current,r=new We.Vector2(Wt.current.x,Wt.current.y),n=new We.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,i),c=(new We.Vector2).addVectors(n,r),d=-i+Math.atan2(-o.x+c.x,o.y-c.y)+(Xw.getState().rotateHandleType===q.Lower?0:Math.PI),u=d+(Math.abs(d)>Math.PI?-Math.sign(d)*bt:0);te(l.id,u),mt.current=u}else if(Xw.getState().resizeHandleType){var f=Xw.getState().resizeAnchor,h=le(l.pvModelName),p=new We.Vector2(o.x,o.y),y=new We.Vector2(f.x,f.y),g=p.distanceTo(y),w=l.relativeAzimuth+Mt.current,v=(new We.Vector2).subVectors(p,y);switch(Xw.getState().resizeHandleType){case K.Lower:case K.Upper:var b=Xw.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,H=new We.Vector2(P,S),j=new We.Vector2(Wt.current.x,Wt.current.y),z=(new We.Vector2).subVectors(H,j).rotateAround(Dt,-Mt.current),R=z.x/m,D=z.y/x;vl(l,R,D,l.lx,T)&&(G(l.id,T),Q(l.id,R,D));break;case K.Left:case K.Right:var W=Xw.getState().resizeHandleType===K.Left?-1:1,M=v.angle()-w+(Xw.getState().resizeHandleType===K.Left?Math.PI:0),I=g*Math.cos(M);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+W*(I*Math.cos(w))/2,F=f.y+W*(I*Math.sin(w))/2,k=new We.Vector2(C,F),O=new We.Vector2(Wt.current.x,Wt.current.y),Y=(new We.Vector2).subVectors(k,O).rotateAround(Dt,-Mt.current),L=Y.x/m,N=Y.y/x;vl(l,L,N,I,l.ly)&&(J(l.id,I),Q(l.id,L,N))}}}}}}),qe&&Object(pf.jsxs)(pf.Fragment,{children:[(Xw.getState().moveHandleType||Xw.getState().resizeHandleType)&&Object(pf.jsx)(yf,{hx:nt.current.x,hy:nt.current.y,hz:nt.current.z,position:it.current,rotation:rt.current}),Xw.getState().rotateHandleType&&at.current&&at.current.type===V.SolarPanel&&Object(pf.jsx)(sy,{element:at.current,height:at.current.poleHeight+kt})]}),F&&Object(pf.jsx)(yy,{element:e,verticalLift:ml}),(!F||he)&&Object(pf.jsx)(hy,{hx:Ct,hy:Ft,hz:kt,lineColor:he&&Y?"white":S,lineWidth:he&&Y?5*j:j}),F&&R&&Object(pf.jsx)(hy,{hx:Ct,hy:Ft,hz:kt,lineColor:yt,lineWidth:5*j}),Sl&&Object(pf.jsx)(hw,{id:s,args:Pl}),(Ge||W)&&!F&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:Ut,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,kt+(null!==(c=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==c?c:.2)]})]})},Tw=n.a.memo(Aw),Pw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,f=e.lx,p=void 0===f?1:f,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,H=void 0===S?"black":S,j=e.lineWidth,z=void 0===j?.1:j,R=e.locked,D=void 0!==R&&R,W=e.showLabel,M=void 0!==W&&W,I=e.parentId,C=e.foundationId,F=(e.light,e.heatFlux,Xw(si)),k=Xw(Vi),O=Xw(o.shadowEnabled),Y=Xw(os),L=_f(n),N=Object(Se.f)().gl.domElement,U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],G=E[1],K=Object(r.useRef)(),q=Object(r.useRef)(),Q=Object(r.useMemo)((function(){return{lng:k}}),[k]),Z=Xw((function(e){var t,l=Object(h.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()}})),_=Xw((function(e){var t,l=Object(h.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,Ww.isZero(v[2]))c=Z.cx+c*Z.lx,s=Z.cy+s*Z.ly;else{var $=new We.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=Ww.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=Ww.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 We.Euler(vt,0,t,"ZXY")}if((null===Z||void 0===Z?void 0:Z.type)===V.Roof)return new We.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 ww(A);var l=(new We.Vector3).fromArray(A);return Ww.isSame(l,St)?new We.Euler(0,vt,v[2],"ZXY"):Ww.isSame(l,Ht)?new We.Euler(0,-vt,v[2],"ZXY"):Ww.isSame(l,jt)?new We.Euler(-vt,0,v[2],"ZXY"):Ww.isSame(l,zt)?new We.Euler(vt,0,v[2],"ZXY"):new We.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,k,c,s,d]);return Object(pf.jsxs)("group",{name:"Sensor Group "+n,rotation:ae,position:[c,s,d+le],children:[Object(pf.jsx)(Lt.a,{receiveShadow:O,uuid:n,ref:K,args:[p,g,w],name:"Sensor",onPointerDown:function(e){2!==e.button&&(Y(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),F((function(e){e.moveHandleType=B.Default})))},onContextMenu:function(e){Y(n,e),F((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),N.style.cursor="move"))},onPointerOut:function(){G(!1),N.style.cursor="default"},children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:(null===e||void 0===e?void 0:e.lit)?pt:P})}),Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Meter",castShadow:!1,receiveShadow:!1,args:[.3*p,.3*g,le,8,1],position:new We.Vector3(0,0,le),rotation:[vt,0,0],children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"black"})}),!L&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:H,lineWidth:z}),L&&D&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*z}),L&&!D&&Object(pf.jsx)(Lt.h,{ref:q,position:new We.Vector3(0,0,0),args:[st,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){Y(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),F((function(e){e.moveHandleType=B.Default}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),(J||M)&&!L&&Object(pf.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)]})]})},Sw=n.a.memo(Pw),Hw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,f=e.lx,p=void 0===f?1:f,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),H=void 0===S?.1:S,j=e.locked,z=void 0!==j&&j,R=e.showLabel,D=void 0!==R&&R,W=e.parentId,M=e.foundationId,I=e.decay,C=void 0===I?2:I,F=e.distance,k=void 0===F?5:F,O=e.intensity,Y=void 0===O?3:O,L=e.inside,N=void 0!==L&&L,U=Xw(si),E=Xw(Vi),J=Xw(o.shadowEnabled),G=Xw(os),K=Xw(Ls).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:E}}),[E]),oe=Xw((function(e){var t,l=Object(h.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()}})),ie=Xw((function(e){var t,l=Object(h.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()}})),re=.1;if(W&&oe)switch(oe.type){case V.Foundation:if(d=oe.cz+oe.lz/2,Ww.isZero(v[2]))c=oe.cx+c*oe.lx,s=oe.cy+s*oe.ly;else{var ne=new We.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=Ww.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=Ww.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 We.Euler(vt,0,t,"ZXY")}if((null===oe||void 0===oe?void 0:oe.type)===V.Roof)return new We.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 ww(A);var l=(new We.Vector3).fromArray(A);return Ww.isSame(l,St)?new We.Euler(0,vt,v[2],"ZXY"):Ww.isSame(l,Ht)?new We.Euler(0,-vt,v[2],"ZXY"):Ww.isSame(l,jt)?new We.Euler(-vt,0,v[2],"ZXY"):Ww.isSame(l,zt)?new We.Euler(vt,0,v[2],"ZXY"):new We.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,E,c,s,d]);return Object(pf.jsxs)("group",{name:"Light Group "+n,rotation:ue,position:[c,s,d],children:[K&&Object(pf.jsx)("pointLight",{color:P,name:"Point Light "+n,position:[0,0,N?-re-de:de],decay:C,distance:k,intensity:Y,castShadow:!0}),Object(pf.jsx)(Lt.d,{receiveShadow:J,userData:{unintersectable:!0},uuid:n,ref:te,position:[0,0,N?-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),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=W,e.oldParentId=W,e.oldFoundationId=M})))},onContextMenu:function(e){G(n,e),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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightgray"})}),Object(pf.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 We.Vector3(0,0,N?-re-de:de),rotation:[vt,0,0],children:K?Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"}):Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),q&&z&&Object(pf.jsx)(hy,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*H}),q&&!z&&Object(pf.jsx)(Lt.h,{ref:le,position:new We.Vector3(0,0,N?-re-de:de),args:[st,6,6,N?Math.PI:0,Math.PI],name:B.Default,onPointerDown:function(e){G(n,e,X.Move),Nt.getState().setEnableOrbitController(!1),bf.setState((function(e){e.showWallIntersectionPlaneId=W,e.oldParentId=W,e.oldFoundationId=M}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),($||D)&&!q&&Object(pf.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,(N?-re:0)+w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},jw=n.a.memo(Hw),zw="Cuboid Wrapper",Rw="Cuboid Stackable Child",Dw=function e(t){var l=t.elements,a=t.cuboidModel,o=a.id,i=a.parentId,r=a.cx,n=a.cy,c=a.lz,s=a.rotation,u=a.locked,f=Xw(Vu),h=Zf(a,f),p=h.baseGroupSet,y=h.childCuboidSet,g=h.groupMasterDimension,m=h.groupMasterPosition,w=h.groupMasterRotation,x=c/2,v=!(i!==xt||u||f!==o||!a||!g);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("group",{name:zw,position:[r,n,x],rotation:[0,0,s[2]],children:[Object(pf.jsx)(Tw,Object(d.a)({},a)),l.map((function(t){if(function(e){return _m(e)&&e.parentId===a.id}(t))return Object(pf.jsx)("group",{name:Rw,position:[0,0,x],children:Object(pf.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(pf.jsx)(bw,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(pf.jsx)(Sw,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(pf.jsx)(jw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);default:return null}}}))]}),v&&Object(pf.jsx)(Zy,{baseGroupSet:p,childCuboidSet:y,initalPosition:m,initalDimension:g,initalRotation:w})]})},Ww=function(){function e(){Object(je.a)(this,e)}return Object(ke.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 We.Quaternion;r.setFromUnitVectors(e,t);var n=new We.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(h.a)(n);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(!f.leftJoints||0===f.leftJoints.length)return D.WALL_DISJOINED;if(!f.rightJoints||0===f.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 We.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 We.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(h.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(h.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(h.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===Gy.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===Gy.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(h.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 We.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(f.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(h.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,Ht)}},{key:"isUnitVectorY",value:function(t){return e.isSame(t,jt)||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(h.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(h.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 We.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 We.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=Xw.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 f,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(h.a)(o);try{for(y.s();!(f=y.n()).done;){var g=f.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 We.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(h.a)(Xw.getState().elements);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(e.isLegalOnWall(f.type)&&f.type!==V.Polygon&&f.parentId===t.parentId&&f.id!==t.id){var p=f.lx/2,y=f.lz/2;l&&f.type===V.SolarPanel&&(p/=l.lx,y=f.ly/2/l.lz);var g=f.cx-p,m=f.cx+p,w=f.cz-y,x=f.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=Xw.getState().getElementById(e.foundationId);if(l){var a=Zm.getSolarPanelVerticesOnRoof(e,l),o=Zm.getRoofBoundaryVertices(t);return Zm.rooftopElementBoundaryCheck(a,o)?Zm.rooftopSPCollisionCheck(e,l,a)?ye.Valid:ye.OverLap:ye.OutsideBoundary}}return ye.Invalid}},{key:"relativeCoordinates",value:function(t,l,a,o){var i=new We.Vector3(t,l,a);if(o.type===V.Wall){var r=new We.Vector3(o.cx,o.cy),n=Xw.getState().getParent(o);if(n){var c=new We.Vector3(n.cx,n.cy);r.applyEuler(new We.Euler(0,0,n.rotation[2])).add(c).setZ(n.lz+o.lz/2),i.sub(r).applyEuler(new We.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 We.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 We.Vector3(n.cx,n.cy,n.cz),i).setZ(n.lz/2+i.lz),d=new We.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 We.Vector3(s.x+d.x+u,s.y+d.y+f,s.z+d.z)}return new We.Vector3(s.x+d.x,s.y+d.y,s.z+d.z)}}if(o.type===V.Roof&&i){var h=new We.Vector3(t*i.lx,l*i.ly,a+i.lz);return h.applyEuler((new We.Euler).fromArray(i.rotation)),h.x+=i.cx,h.y+=i.cy,h}var p=new We.Vector3(t*o.lx,l*o.ly,a*o.lz);return p.applyEuler((new We.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 We.Vector3(e,t,l);return o.applyEuler((new We.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 We.Vector3(e.x-t.cx,e.y-t.cy,e.z-t.cz);return l.applyEuler((new We.Euler).fromArray(t.rotation.map((function(e){return-e})))),l}},{key:"wallAbsolutePosition",value:function(e,t){var l=new We.Vector3(t.cx,t.cy);return(new We.Vector3).addVectors(l,new We.Vector3(e.x,e.y).applyAxisAngle(Rt,t.rotation[2]))}},{key:"wallRelativePosition",value:function(e,t){var l=new We.Vector3(t.cx,t.cy);return(new We.Vector3).subVectors(new We.Vector3(e.x,e.y),l).applyAxisAngle(Rt,-t.rotation[2])}},{key:"getObjectChildById",value:function(t,l){if(t){var a,o=Object(h.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name===zw){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(h.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===Rw){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=Ot.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:Xw.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=Xw.getState().getElementById(l.leftJoints[0])}for(o.reverse(),l=Xw.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=Xw.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?Xw.getState().getElementById(p[0]):null,m=y.length>0?Xw.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}}]),e}();Ww.WATER_TEXTURE=Ww.fetchWaterTexture(100,100),Ww.WHITE_TEXTURE=Ww.fetchWhiteTexture(2,2),Ww.getAllConnectedWalls=function(e){for(var t=Xw.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},Ww.getWorldDataById=function(e){var t=Xw.getState().getElementById(e);if(!t)return{pos:new We.Vector3,rot:0,topZ:0};var l=new We.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=Ww.getWorldDataById(t.parentId),r=i.pos,n=i.rot,c=i.topZ,s=new We.Euler(0,0,n);return{pos:(new We.Vector3).addVectors(l.applyEuler(s),r.clone().setZ(c)),rot:a+n,topZ:o+c}},Ww.isChild=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=Xw.getState().getElementById(t);return!!a&&((!l||!a.locked)&&(a.parentId===e||Ww.isChild(e,a.parentId,l)))},Ww.getBaseId=function(e){var t=Xw.getState().getElementById(e);return t?t.parentId===xt?t.id:Ww.getBaseId(t.parentId):null},Ww.ifNeedListenToAutoDeletion=function(e){if(e.type!==V.Wall)return!1;var t=e;if(!t.roofId)return!1;var l=Xw.getState().getElementById(t.roofId);if(!l)return!1;switch(l.roofType){case It.Hip:case It.Gable:case It.Gambrel:return!0;case It.Pyramid:case It.Mansard:return 0!==l.wallsId.length&&l.wallsId[0]===t.id;default:return!1}};var Mw=function(){function e(){Object(je.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(ke.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}(),Iw=function(){function e(){Object(je.a)(this,e)}return Object(ke.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(f.a)(e.normal),rotation:Object(f.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(f.a)(e.normal),rotation:Object(f.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(f.a)(e.normal),rotation:Object(f.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(f.a)(t.normal),rotation:t.parentId?Object(f.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){Ww.isSame(r,Ht)?u=null!==o&&void 0!==o?o:0:Ww.isSame(r,St)?u=-(null!==o&&void 0!==o?o:0):Ww.isSame(r,zt)?p=null!==o&&void 0!==o?o:0:Ww.isSame(r,jt)&&(p=-(null!==o&&void 0!==o?o:0));var y=r.dot((new We.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}(),Yw=function e(t){Object(je.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=M.DAILY_TOTAL_OUTPUT,this.selectionMethod=C.ROULETTE_WHEEL,this.searchMethod=F.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},Lw=function e(t){Object(je.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=M.DAILY_TOTAL_OUTPUT,this.searchMethod=F.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},Nw=function e(){Object(je.a)(this,e),this[Pe.c]=!0,this.geneticAlgorithmParams=void 0,this.particleSwarmOptimizationParams=void 0,this.geneticAlgorithmParams=new Yw(W.SOLAR_PANEL_TILT_ANGLE),this.particleSwarmOptimizationParams=new Lw(W.SOLAR_PANEL_TILT_ANGLE)},Uw=function e(){Object(je.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},Ew=function e(){Object(je.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},Vw=function e(){Object(je.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.windowMullion=void 0,this.windowMullionWidth=void 0,this.windowMullionSpacing=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=Ee.Default,this.wallStructureSpacing=2,this.wallStructureWidth=.1,this.wallStructureColor="#ffffff",this.wallOpacity=.5,this.wallRValue=2,this.wallVolumetricHeatCapacity=.5,this.wallEavesLength=.3,this.wallParapet=up,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=Gy.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.windowMullion=!0,this.windowMullionWidth=.06,this.windowMullionSpacing=.5,this.windowMullionColor="#ffffff",this.windowFrame=!1,this.windowFrameWidth=.1,this.windowSillWidth=.1,this.windowType=Yt.Default,this.windowArchHeight=1,this.windowShutterLeft=Kg.showLeft,this.windowShutterRight=Kg.showRight,this.windowShutterColor=Kg.color,this.windowShutterWidth=Kg.width,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},Jw=function e(){Object(je.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},Gw=function(){function e(){Object(je.a)(this,e)}return Object(ke.a)(e,null,[{key:"getDefaultHiddenParameters",value:function(e){return e===W.SOLAR_PANEL_ARRAY?["latitude","orientation","poleHeight"]:[]}},{key:"getVariables",value:function(e,t){if(e===W.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===W.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===W.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===W.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===W.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===W.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]=Ww.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]=Ww.calculateCost(a);break;case"totalYearlyYield":l[t]=.001*a.yearlyYield;break;case"meanYearlyYield":l[t]=a.yearlyYield/a.panelCount;break;case"yearlyProfit":l[t]=Ww.calculateProfit(a)}}}]),e}();Object(Pe.b)();var Xw=y()(Object(Ve.a)(Object(Ve.b)((function(e,t){var l=function(t){return e(Object(Pe.a)(t))},a=new Mw,o=a.getElements();return{set:function(e){try{l(e)}catch(t){console.log(t)}},world:a,elements:o,user:{},viewState:new Cw,actionState:new Vw,graphState:new Jw,solarPanelArrayLayoutParams:new kw,solarPanelArrayLayoutConstraints:new Uw,evolutionaryAlgorithmState:new Nw,economicsParams:new Ew,geneticAlgorithmWizardSelectedTab:"1",particleSwarmOptimizationWizardSelectedTab:"1",modelType:R.UNKNOWN,modelAuthor:null,modelLabel:null,modelDescription:null,projectView:!1,projectInfo:{owner:null,title:null,description:null,type:W.SOLAR_PANEL_ARRAY,designs:new Array,ranges:new Array,hiddenParameters:Gw.getDefaultHiddenParameters(W.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 We.Raycaster,mouse:new We.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(f){r.e(f)}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(h.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(Ww.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(h.a)(t().elements);try{for(u.s();!(c=u.n()).done;){var f=c.value;if(f.type===e.type&&f.parentId===e.parentId&&f.id!==e.id){var p=(e.cx-f.cx)*(d?d.lx:1),y=(e.cy-f.cy)*(d?d.ly:1),g=(e.cz-f.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;l.multiSelectionsMode?l.selectedElementIdSet.has(e)?l.selectedElementIdSet.delete(e):l.selectedElementIdSet.add(e):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e));var s,d=Object(h.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===e?(u.selected=!0,l.selectedElement=u,l.selectedElementHeight=u.lz):u.selected=!1}}catch(f){d.e(f)}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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Ww.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.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(h.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(h.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&&Ww.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(h.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(h.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;(n.id!==e||n.locked)&&(n.parentId!==e||_m(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(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.drawSunBeam=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorDrawSunBeamAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.relativeAzimuth=t,l.selectedElementAngle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.relativeAzimuth=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorRelativeAzimuthForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.poleHeight=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.poleHeight=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleHeightForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Ww.isSolarCollector(i)){i.poleRadius=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusAboveFoundation:function(e,t,a){Ww.isSolarCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isSolarCollectorType(e)&&l((function(l){var i,r=Object(h.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&&Ww.isIdentical(n.normal,a):n.parentId===t)&&(n.poleRadius=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleRadiusForAll:function(e,t){Ww.isSolarCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isCspCollector(i)){i.reflectance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceAboveFoundation:function(e,t,a){Ww.isCspCollectorType(e)&&l((function(l){var o,i=Object(h.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){Ww.isCspCollectorType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.absorptance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.opticalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Ww.isParabolicCollector(i)){i.thermalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyAboveFoundation:function(e,t,a){Ww.isParabolaType(e)&&l((function(l){var o,i=Object(h.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){Ww.isParabolaType(e)&&l((function(l){var a,o=Object(h.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(h.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&&t2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0,r=t().elements.filter((function(t){return t.id===e||Ww.isChild(e,t.id)}));return l((function(t){var l,r=Object(h.a)(t.elements);try{var n=function(){var o=l.value;if(o.id===e){if(a)if(o.type===V.Polygon){var r=Ww.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:t.deletedRoofId=o.id,Af.getState().deleteRoofSegmentVertices(e),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(e),i&&(t.autoDeletedRoof=o);break;case V.Wall:var s,u,f,p,y=o,g="",m="";if(y.leftJoints.length>0)g=null!==(s=null===(u=t.getElementById(y.leftJoints[0]))||void 0===u?void 0:u.id)&&void 0!==s?s:"";if(y.rightJoints.length>0)m=null!==(f=null===(p=t.getElementById(y.rightJoints[0]))||void 0===p?void 0:p.id)&&void 0!==f?f:"";var w,x=Object(h.a)(t.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;v.id===g?v.rightJoints=[]:v.id===m&&(v.leftJoints=[])}}catch(b){x.e(b)}finally{x.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(h.a)(t.elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;Ww.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 f,p=Object(h.a)(t.elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;Ww.isChild(e,y.id)&&t.elementsToPaste.push(y)}}catch(x){p.e(x)}finally{p.f()}}else{var g,m=Object(h.a)(t.elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;Ww.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&&!Ww.isChild(e,t.id)||(t.type===V.Roof&&(Af.getState().deleteRoofSegmentVertices(e),Af.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&&(Af.getState().deleteRoofSegmentVertices(e.id),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id)),!1)})):t.elements=t.elements.filter((function(t){return!(!t.locked&&t.type===e)||(t.type===V.Roof&&(Af.getState().deleteRoofSegmentVertices(t.id),Af.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)),!1)}))}))},countElementsByType:function(e,l){var a=0;if(l){var o,i=Object(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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(h.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 Ow,o=Object(h.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+=Ww.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 Ow,i=Object(h.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+=Ww.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(h.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=Ww.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)?Iw.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=l.get(d.id);u&&(n=t().getElementById(r.id)?Iw.clone(u,r,r.cx,r.cy,r.cz,r.type===V.Polygon):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=Ww.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=Ww.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(f.a)(B)),e.push.apply(e,Object(f.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=Iw.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(Ww.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=n}else if(o.type===V.Roof){var c=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));c&&(i.rotation=Object(f.a)(c));for(var s=Zm.getWindowVerticesOnRoof(i),d=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy)),u=Zm.getRoofBoundaryVertices(o);Zm.rooftopElementBoundaryCheck(s,u);){if(d&&Zm.rooftopElementBoundaryCheck(s,d)&&Zm.rooftopWindowCollisionCheck(i.id,s,o.id)){l.elements.push(i),r=!0;break}i.cx+=n/2;var p=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));p&&(i.rotation=Object(f.a)(p)),s=Zm.getWindowVerticesOnRoof(i),d=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy))}}if(!r){i.cx=a.cx-3*n;var y=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));if(y&&(i.rotation=Object(f.a)(y)),o.type===V.Wall){for(;i.cx-n>-.5;)if(o.type===V.Wall){if(Ww.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx-=n}}else if(o.type===V.Roof)for(var g=Zm.getWindowVerticesOnRoof(i),m=Zm.getRoofSegmentBoundary(o.id,new We.Vector3(i.cx,i.cy)),w=Zm.getRoofBoundaryVertices(o);Zm.rooftopElementBoundaryCheck(g,w);){if(m&&Zm.rooftopElementBoundaryCheck(g,m)&&Zm.rooftopWindowCollisionCheck(i.id,g,o.id)){l.elements.push(i),r=!0;break}i.cx-=n;var x=Zm.getRotationOnRoof(o.id,new We.Vector3(i.cx,i.cy));x&&(i.rotation=Object(f.a)(x)),g=Zm.getWindowVerticesOnRoof(i),m=Zm.getRoofSegmentBoundary(o.id,new We.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(Ww.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(Ww.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=Zm.getRoofBoundaryVertices(b),H=i.lx/P.lx/2;for(i.cx+=1.25*H;i.cx+H<.5;){var j=Zm.getSolarPanelVerticesOnRoof(i,P);if(Zm.rooftopElementBoundaryCheck(j,S)&&Zm.rooftopSPCollisionCheck(i,P,j)){l.elements.push(i),r=!0;break}i.cx+=1.25*H}if(!r)for(i.cx=a.cx-1.25*H;i.cx-H>-.5;){var z=Zm.getSolarPanelVerticesOnRoof(i,P);if(Zm.rooftopElementBoundaryCheck(z,S)&&Zm.rooftopSPCollisionCheck(i,P,z)){l.elements.push(i),r=!0;break}i.cx-=1.25*H}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 W=l.getElementById(D);if(W){var M=i.cx,I=i.cy,C=i.cz,F=W.cx-a.cx,k=W.cy-a.cy,O=W.cz-a.cz;i.cx=W.cx+F,i.cy=W.cy+k,i.cz=W.cz+O,l.overlapWithSibling(i)&&(i.cx=a.cx-F,i.cy=a.cy-k,i.cz=a.cz-O,l.overlapWithSibling(i)&&(i.cx=a.cx-2*F,i.cy=a.cy-2*k,i.cz=a.cz-2*O,l.overlapWithSibling(i)&&(i.cx=M-F,i.cy=I-k,i.cz=C-O)))}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&&Ww.isIdentical(i.normal,Tt)?Ww.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 N,U=i,E=Object(h.a)(U.vertices);try{for(E.s();!(N=E.n()).done;){N.value.x+=.1}}catch(ge){E.e(ge)}finally{E.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(h.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(f.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(h.a)(G);try{for(K.s();!(B=K.n()).done;){var q=B.value,Q=X.get(q.parentId);if(Q){var Z=Iw.clone(Q,q,q.cx,q.cy,q.cz,q.type===V.Polygon);Z&&(i.normal&&(Z.normal=Object(f.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(f.a)($)),l.elementsToPaste=Object(f.a)($),e.push.apply(e,Object(f.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(h.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=Iw.clone(i,d,d.cx,d.cy,d.cz,d.type===V.Polygon);if(u&&(i.normal&&(u.normal=Object(f.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(h.a)(l.elements);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.parentId===d.id){var m=Iw.clone(u,g,g.cx,g.cy,g.cz);m&&(d.normal&&(m.normal=Object(f.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(h.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(h.a)(l.elements);try{for(S.s();!(P=S.n()).done;){var H=P.value;if(H.id===T&&H.type===V.Wall){var j=H,z=c.get(j.leftJoints[0]);z&&(v.leftJoints=[z]);var R=c.get(j.rightJoints[0]);if(R&&(v.rightJoints=[R]),j.roofId){var D=c.get(j.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(f.a)(te)),e.push.apply(e,Object(f.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 We.Vector3(1,-1,0).applyEuler(new We.Euler(0,0,le.relativeAngle));if(i.cx+=ae.x,i.cy+=ae.y,1===l.elementsToPaste.length){var oe,ie=new We.Vector3(i.cx,i.cy,0),re=new We.Vector3(i.lx/2,0,0),ne=new We.Vector3(-i.lx/2,0,0),ce=new We.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(h.a)(l.elements);try{for(de.s();!(se=de.n()).done;){var ue=se.value;if(ue.parentId===a.id){var fe=Iw.clone(i,ue,ue.cx,ue.cy,ue.cz,ue.type===V.Polygon);fe&&(i.normal&&(fe.normal=Object(f.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(f.a)(pe)),e.push.apply(e,Object(f.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(h.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(h.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(h.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(f){o.e(f)}finally{o.f()}l((function(t){var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.weatherData[o.city+", "+o.country]=o}}catch(f){a.e(f)}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(h.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(h.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(h.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(h.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=Ww.getDistance(l,e,r[n].longitude,r[n].latitude))0?B>=12||B<=3?ox:B>3&&B<=5?tx:B>5&&B<=9?lx:ax:B>=12||B<=3?lx:B>3&&B<=5?ax:B>5&&B<=9?ox:tx;case N.Lake:return ix;case N.Mountain:return rx;case N.Rural:return nx;default:return Qw}}),[l,w,m]),ne=Object(Ly.a)(re),ce=function(e){var t;if(e.intersections.length>0)if(e.intersections[0].object===j.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,Ww.isPlantOrHuman(z.current)&&($(Z.Vertical),te.set(-vt,0,0,"ZXY")),l.type!==V.Foundation&&l.type!==V.Cuboid&&Nt.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=Nt.getState().contentRef,a=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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 We.Vector3(t.cx,t.cy,t.cz).applyEuler(new We.Euler(0,0,e.rotation[2])).add(M.current);t.cx=s.x,t.cy=s.y,t.cz=0,L.current.set(t.id,new We.Vector3(s.x,s.y,0)),U.current.set(t.id,xt)},ue=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Ww.getObjectChildById(a.current,t),i=Ww.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Ww.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(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&!Ww.isFoundationOrCuboid(i)){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},he=function(e){var t,l=Object(h.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=Nt.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 We.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){Ww.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("mesh",{ref:j,name:"Sky",rotation:[vt,0,0],scale:[1,ie,1],onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===j.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(k.current=t.lz,M.current.set(t.cx,t.cy,t.cz),t.type){case V.Human:E.current=t.parentId;break;case V.Tree:E.current=t.parentId,F.current=t.lx;break;case V.Cuboid:M.current.set(t.cx,t.cy,t.cz),C.current.set(t.lx,t.ly,t.lz),D.current.clear();var l=new We.Vector3(t.cx,t.cy,t.cz),o=d(t.id);if(o.length>0){O.current.clear();var i,r=t.rotation[2],n=Object(h.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 We.Vector3(c.cx,c.cy,c.cz).applyEuler(new We.Euler(0,0,r));s.add(l),D.current.set(c.id,s),O.current.set(c.id,new We.Vector3(c.cx,c.cy,c.cz));break;case V.SolarPanel:case V.Sensor:if(Ww.isIdentical(c.normal,Tt)){var u=new We.Vector3(c.cx*t.lx,c.cy*t.ly,c.cz*t.lz).applyEuler(new We.Euler(0,0,r));u.add(l),D.current.set(c.id,u)}break;case V.Polygon:if(Ww.isIdentical(c.normal,Tt)){var f,p=c,y=[],g=Object(h.a)(p.vertices);try{for(g.s();!(f=g.n()).done;){var m=f.value,w=new We.Vector2(m.x*t.lx,m.y*t.ly).rotateAround(Dt,r);w.add(new We.Vector2(l.x,l.y)),y.push(w)}}catch(x){g.e(x)}finally{g.f()}W.current.set(p.id,y)}}}}catch(x){n.e(x)}finally{n.f()}}}}},children:[Object(pf.jsx)("sphereBufferGeometry",{args:[5e3,16,8,0,bt,0,vt]}),Object(pf.jsx)("meshToonMaterial",{map:ne,side:We.BackSide,opacity:1,color:"skyblue"})]}),z.current&&_!==Z.Sky&&Object(pf.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 We.Vector2;if(l.x=e.offsetX/H.clientWidth*2-1,l.y=-e.offsetY/H.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(Nt.getState().treeRef,e);break;case V.Human:pe(Nt.getState().humanRef,e);break;case V.Cuboid:if(Ww.isTopResizeHandle(g)){a((function(e){var t,l=Object(h.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=Nt.getState().cuboidRef;if(null===r||void 0===r?void 0:r.current){var n,c=Object(h.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(k.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=f(z.current.id);if(l&&!l.locked){var o=null,i=E.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(h.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(Ww.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+M.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(h.a)(r);try{for(c.s();!(n=c.n()).done;){var s=n.value;L.current.set(s.id,new We.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:k.current,newValue:l.lz,oldChildrenPositionsMap:new Map(O.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(h.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(h.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=f(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(h.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(h.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:k.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:F.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=Nt.getState().treeRef)||void 0===e?void 0:e.current;break;case V.Human:o=null===(t=Nt.getState().humanRef)||void 0===t?void 0:t.current}if(o){var T=G.intersectObjects(Ww.fetchIntersectables(P),!1),H=he(T);if(H){var R=H.point;if("Ground"===H.object.name)ye(l.id,xt,R),I.current.set(R.x,R.y,R.z),i=xt;else if(H.object.userData.stand){var D=se(H.object),W=H.object.parent;if(W){var N=(new We.Vector3).subVectors(R,W.position).applyEuler(X);ye(l.id,D,N),I.current.set(N.x,N.y,N.z),i=D}}}}if(Xw.getState().moveHandleType&&Ww.isPlantOrHuman(l)&&(I.current.distanceToSquared(M.current)>At||G.intersectObjects([j.current]).length>0)){var B=!0;if(!Xw.getState().viewState.orthographic&&!(B=I.current.length().02}if(!B||function(){if(Xw.getState().viewState.orthographic)return!1;if(j.current){var e=G.intersectObjects(Ww.fetchIntersectables(P),!1);if(e.length>0){var t,l=Object(h.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([j.current]).length>0}()){v(l.id,M.current.x,M.current.y,M.current.z),o&&Ww.isPlantOrHuman(l)&&o.position.copy(M.current),Ww.isPlantOrHuman(l)&&fe(E.current,l.id);var le=Nt.getState().contentRef;if((null===le||void 0===le?void 0:le.current)&&E.current&&o){if(E.current===xt)le.current.add(o);else{var ae=Ww.getObjectChildById(le.current,E.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:M.current.x,oldCy:M.current.y,oldCz:M.current.z,newCx:I.current.x,newCy:I.current.y,newCz:I.current.z,oldParentId:E.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})),Nt.setState((function(e){e.humanRef=null,e.treeRef=null,e.setEnableOrbitController(!0)}))}},children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide})})]})},sx=n.a.memo(cx),dx=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=Xw(Dr),p=Xw(Kr),y=Xw(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,H=Object(Se.e)(We.FontLoader,cy),j=Math.min(1,Math.max(.5,.01*p)),z={font:H,height:0,size:j},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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[l,-a,R],[l,a,R]],color:P,lineWidth:S}),Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-j,-.6-j,R],children:[Object(pf.jsx)("textGeometry",{args:[(l<10?" ":"")+l,z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-j,-.6-j,R],children:[Object(pf.jsx)("textGeometry",{args:[(l>-10?" ":"")+l,z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.jsx)(n.a.Fragment,{},l)})),Object(pf.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(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,l,R],[a,l,R]],color:P,lineWidth:1.5*S}),Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*j,l-j/2,R],children:[Object(pf.jsx)("textGeometry",{args:[l+"",z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.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(pf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*j,l-j/2,R],children:[Object(pf.jsx)("textGeometry",{args:[l+"",z]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(pf.jsx)(n.a.Fragment,{},l)})),!y&&Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"z axis line",points:[[0,0,0],[0,0,i]],color:"green",lineWidth:l})]})},ux=n.a.memo(dx),fx=l(801),hx=function(e){var t,l,a,i,n,c,s=e.id,d=e.cx,f=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;Xw((function(e){if(T===xt)P=!0;else{var t,l=Object(h.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=Xw(Kc);Object(r.useEffect)((function(){P||S(s,!1)}),[P,s]);var H=Xw(si),j=Xw(Vi),z=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,R=Xw(os),D=Xw(Zr),W=Xw(ju),M=Xw(Hu),I=_f(s),C=Object(Se.f)().gl,F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Nt((function(e){return e.contentRef})),G=Object(r.useRef)(null),K=Object(r.useRef)(null),q=Object(r.useMemo)((function(){return{lng:j}}),[j]),Q=Object(r.useMemo)((function(){return D(s)}),[s]),Z=Object(r.useRef)(!1),_=Xw(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 We.TextureLoader).load(Tl.fetchTextureImage(g),(function(e){v&&(e.wrapS=We.RepeatWrapping,e.repeat.x=-1),ae(e),E(!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)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",q)}),[g,w,j,d,f]);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)?Ww.getObjectChildById(J.current,T):null};Object(Se.d)((function(e){var t=e.camera;if(G.current){var l=Ww.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 We.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){bf.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=Q.lz})),Ww.isMoveHandle(t)?C.domElement.style.cursor="move":C.domElement.style.cursor="pointer")}),[]),ue=Object(r.useCallback)((function(){H((function(e){e.hoveredHandle=null})),C.domElement.style.cursor=Xw.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(pf.jsx)("group",{ref:G,name:"Human Group "+s,userData:{aabb:!0},position:[d,f,null!==p&&void 0!==p?p:0],children:Object(pf.jsxs)("group",{position:[0,.1,ie/2],children:[Object(pf.jsx)(fx.a,{rotation:[vt,0,0],uuid:s,name:g,follow:!1,children:Object(pf.jsx)(Lt.f,{ref:K,renderOrder:3,receiveShadow:!0,name:"Human ".concat(g," plane"),args:[oe,ie],onContextMenu:function(e){R(s,e),H((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),Nt.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(pf.jsx)("meshToonMaterial",{map:le,alphaTest:.5,side:We.DoubleSide})})}),I&&w&&Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})})]}),I&&!w&&Object(pf.jsx)(Lt.h,{position:[0,0,-ie/2],args:[.4,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Nt.setState((function(e){e.humanRef=G})))},onPointerEnter:function(e){de(e,B.Default)},onPointerLeave:ue,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:M===B.Default||W===B.Default?pt:ut})}),O&&!I&&Object(pf.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},px=n.a.memo(hx),yx=l.p+"static/media/apple_spring.0cad3025.png",gx=l.p+"static/media/apple_summer.46de7d87.png",mx=l.p+"static/media/apple_fall.27ba1ce5.png",wx=l.p+"static/media/apple_winter.d23599a6.png",xx=l.p+"static/media/birch_spring.6960e824.png",vx=l.p+"static/media/birch_summer.59ae1138.png",bx=l.p+"static/media/birch_fall.210e663d.png",Ax=l.p+"static/media/birch_winter.c4988403.png",Tx=l.p+"static/media/coconut.d38cdccd.png",Px=l.p+"static/media/dogwood_spring.c53ecf05.png",Sx=l.p+"static/media/dogwood_summer.8f3157af.png",Hx=l.p+"static/media/dogwood_fall.cb8fd9b6.png",jx=l.p+"static/media/dogwood_winter.745583bb.png",zx=l.p+"static/media/elm_spring.a67f6f9c.png",Rx=l.p+"static/media/elm_summer.0e729b1c.png",Dx=l.p+"static/media/elm_fall.720b87ef.png",Wx=l.p+"static/media/elm_winter.49563d13.png",Mx=l.p+"static/media/fan_palm.dd78413a.png",Ix=l.p+"static/media/linden_spring.073d4e74.png",Cx=l.p+"static/media/linden_summer.7a1479da.png",Fx=l.p+"static/media/linden_fall.3e8bb305.png",kx=l.p+"static/media/linden_winter.9af7eb0e.png",Ox=l.p+"static/media/magnolia_spring.8dc3ef2d.png",Yx=l.p+"static/media/magnolia_summer.00567305.png",Lx=l.p+"static/media/magnolia_fall.475b9098.png",Nx=l.p+"static/media/magnolia_winter.8a371c67.png",Ux=l.p+"static/media/maple_spring.e1e24394.png",Ex=l.p+"static/media/maple_summer.7b3e9753.png",Vx=l.p+"static/media/maple_fall.5e8e43bb.png",Jx=l.p+"static/media/maple_winter.37fba60e.png",Gx=l.p+"static/media/oak_spring.3b768daa.png",Xx=l.p+"static/media/oak_summer.54230708.png",Bx=l.p+"static/media/oak_fall.ba997613.png",Kx=l.p+"static/media/oak_winter.02087599.png",qx=l.p+"static/media/pine.80a6a140.png",Qx=l.p+"static/media/spruce.dea2071b.png",Zx=function(){function e(){Object(je.a)(this,e)}return Object(ke.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?wx:gx:t>a&&t<=r?c?yx:mx:t>r&&t<=n?c?gx:wx:c?mx:yx;break;case oe.Birch:i=t>=o||t<=a?c?Ax:vx:t>a&&t<=r?c?xx:bx:t>r&&t<=n?c?vx:Ax:c?bx:xx;break;case oe.Coconut:i=Tx;break;case oe.Dogwood:i=t>=o||t<=a?c?jx:Sx:t>a&&t<=r?c?Px:Hx:t>r&&t<=n?c?Sx:jx:c?Hx:Px;break;case oe.Elm:i=t>=o||t<=a?c?Wx:Rx:t>a&&t<=r?c?zx:Dx:t>r&&t<=n?c?Rx:Wx:c?Dx:zx;break;case oe.FanPalm:i=Mx;break;case oe.Linden:i=t>=o||t<=a?c?kx:Cx:t>a&&t<=r?c?Ix:Fx:t>r&&t<=n?c?Cx:kx:c?Fx:Ix;break;case oe.Magnolia:i=t>=o||t<=a?c?Nx:Yx:t>a&&t<=r?c?Ox:Lx:t>r&&t<=n?c?Yx:Nx:c?Lx:Ox;break;case oe.Maple:i=t>=o||t<=a?c?Jx:Ex:t>a&&t<=r?c?Ux:Vx:t>r&&t<=n?c?Ex:Jx:c?Vx:Ux;break;case oe.Oak:i=t>=o||t<=a?c?Kx:Xx:t>a&&t<=r?c?Gx:Bx:t>r&&t<=n?c?Xx:Kx:c?Bx:Gx;break;case oe.Spruce:i=Qx;break;default:i=qx}return i}}]),e}(),_x=function(e){var t,l,a,n,c,s,d,f,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,H=void 0!==S&&S,j=e.showModel,z=void 0!==j&&j,R=e.showLabel,D=void 0!==R&&R,W=!1;Xw((function(e){if(p===xt)W=!0;else{var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===p){W=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var M=Xw(Kc);Object(r.useEffect)((function(){W||M(y,!1)}),[W]);var I=Xw(si),C=Xw(Vi),F=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,k=Xw(i.date),O=Xw(i.latitude),Y=null!==(l=Xw(i.leafDayOfYear1))&&void 0!==l?l:rt,L=null!==(a=Xw(i.leafDayOfYear2))&&void 0!==a?a:nt,N=Xw(o.shadowEnabled),U=Xw(os),E=Xw(Zr),J=Xw(ju),G=Xw(zu),q=Xw(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=Nt((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 E(y)}),[y]),be=Object(r.useMemo)((function(){return Ww.dayOfYear(new Date(k))}),[k]),Ae=Object(r.useMemo)((function(){return!Zx.isEvergreen(ve?ve.name:oe.Dogwood)&&(O>0?beL:be>=Y&&be<=L)}),[be,Y,L,O,null===ve||void 0===ve?void 0:ve.name]),Te=Object(r.useRef)(!1),Pe=Xw(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 He=Object(r.useMemo)((function(){return(new We.TextureLoader).load(Zx.fetchTextureImage(A,be,O,Y,L),(function(e){P&&(e.wrapS=We.RepeatWrapping,e.repeat.x=-1),De(e),ie(!ae)}))}),[A,be,O,P,Y,L]),je=Object(r.useState)(He),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:Zx.fetchLabel(A,xe))+(H?" ("+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,H,C]),Ie=Object(r.useMemo)((function(){return Zx.fetchTheta(A)}),[A]),Ce=new We.MeshDepthMaterial({depthPacking:We.RGBADepthPacking,map:Re,alphaTest:.1}),Fe=x/2,ke=v/2,Oe=Object(r.useMemo)((function(){return new We.Vector3(0,0,ke)}),[ke]),Ye=Object(r.useMemo)((function(){return new We.Vector3(-Fe,0,0)}),[Fe]),Le=Object(r.useMemo)((function(){return new We.Vector3(Fe,0,0)}),[Fe]),Ne=Object(r.useMemo)((function(){return new We.Vector3(0,-Fe,0)}),[Fe]),Ue=Object(r.useMemo)((function(){return new We.Vector3(0,Fe,0)}),[Fe]),Ee=Object(r.useCallback)((function(e,t){bf.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})),Ww.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=Xw.getState().addedCuboidId?"crosshair":"default"}),[]),Je=function(){return p!==xt&&(null===ne||void 0===ne?void 0:ne.current)?Ww.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=Ww.getWorldDataById(p).rot,a=t.position,o=a.x,i=a.y,r=ce.current.position,n=r.x,c=r.y,s=Xw.getState().sunlightDirection,d=s.x,u=s.y;if(Je()){var f=ce.current.localToWorld(new We.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(pf.jsx)(pf.Fragment,{children:W?Object(pf.jsx)("group",{ref:ce,name:"Tree Group "+y,userData:{aabb:!0},position:[g,m,null!==w&&void 0!==w?w:0],children:Object(pf.jsxs)("group",{position:[0,0,v/2],children:[Object(pf.jsx)(fx.a,{ref:se,uuid:y,name:A,follow:!1,children:Object(pf.jsx)(Lt.f,{args:[x,v],children:Object(pf.jsx)("meshToonMaterial",{map:Re,side:We.DoubleSide,alphaTest:.5})})}),Object(pf.jsx)(fx.a,{ref:de,name:A+" Shadow Billboard",follow:!1,children:Object(pf.jsx)(Lt.f,{castShadow:N,args:[x,v],customDepthMaterial:Ce,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,transparent:!0,opacity:0,depthTest:!1})})}),Zx.isConic(A)?Object(pf.jsx)(Lt.c,{visible:z||F,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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.DoubleSide,transparent:!0,opacity:.75})}):Object(pf.jsx)(Lt.h,{visible:z||F,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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.DoubleSide,transparent:!0,opacity:.75})}),Object(pf.jsx)(fx.a,{ref:fe,name:"Interaction Billboard",visible:!1,position:[0,0,-v/2+.5],children:Object(pf.jsx)(Lt.f,{ref:ue,renderOrder:3,name:A+" plane",args:[x/2,v/3],rotation:[F?vt:0,0,0],onContextMenu:function(e){U(y,e),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),Nt.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&&H&&Object(pf.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&&!H&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,-v/2),args:[Ge,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Nt.setState((function(e){e.treeRef=ce})))},onPointerEnter:function(e){Ee(e,B.Default)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===B.Default||J===B.Default?pt:ut})}),!F&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.a,{ref:he,name:K.Top,args:[Ge,Ge,Ge],position:Oe,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ee(e,K.Top)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Top||G===K.Top?pt:ht})}),Object(pf.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){Ee(e,K.Left)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Left||G===K.Left?pt:ht})}),Object(pf.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){Ee(e,K.Right)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Right||G===K.Right?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ge,name:K.Lower,args:[Ge,Ge,Ge],position:Ne,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ee(e,K.Lower)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Lower||G===K.Lower?pt:ht})}),Object(pf.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){Ee(e,K.Upper)},onPointerLeave:Ve,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Upper||G===K.Upper?pt:ht})})]})]}),($||D)&&!Q&&Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:Me,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!==(f=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==f?f:.4)]})]})}):null})},$x=n.a.memo(_x),ev=l(58),tv=["args","children"];function lv(e){var t=e+"Geometry";return r.forwardRef((function(e,l){var a=e.args,o=e.children,i=Object(ev.a)(e,tv);return Object(pf.jsxs)("mesh",Object(d.a)(Object(d.a)({ref:l},i),{},{children:[Object(pf.jsx)(t,{attach:"geometry",args:a}),o]}))}))}var av,ov,iv,rv,nv,cv=lv("ParabolicCylinder"),sv=lv("Paraboloid"),dv=function(e){var t,l,a,c,s=e.id,d=e.cx,f=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,H=e.relativeAzimuth,j=e.moduleLength,z=e.poleHeight,R=e.poleRadius,D=e.drawSunBeam,W=e.rotation,M=void 0===W?[0,0,0]:W,I=e.color,C=void 0===I?"white":I,F=e.lineColor,k=void 0===F?"black":F,O=e.lineWidth,Y=void 0===O?.5:O,L=e.showLabel,N=void 0!==L&&L,U=e.locked,E=void 0!==U&&U,J=e.parentId,G=Xw(si),Q=Xw(Vi),Z=Xw(i.date),_=Xw(i.latitude),$=Xw(ki),ee=bf(Us),te=Xw(o.solarRadiationHeatmapMaxValue),le=Af(wi),ae=Xw(o.shadowEnabled),oe=Xw(Zr),ie=Xw(os),re=Xw(Kr),ne=Xw(zu),ce=Xw(Ls),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),He=Object(u.a)(Pe,2),je=He[0],ze=He[1],Re=Object(r.useRef)(),De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(!1),Ye=Math.max(100,10*re),Le=16,Ne=ce.z<=0,Ue=Object(r.useMemo)((function(){return{lng:Q}}),[Q]),Ee=y/2,Ve=g/2,Je=w/2,Ge=z+Ee,Xe=Xw((function(e){var t,l=Object(h.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,Ww.isZero(M[2]))d=Xe.cx+d*Xe.lx,f=Xe.cy+f*Xe.ly;else{var Be=new We.Vector3(d*Xe.lx,f*Xe.ly,0);Be.applyAxisAngle(Rt,M[2]),d=Xe.cx+Be.x,f=Xe.cy+Be.y}}var Ke=Ee*Ee/P,qe=.25*P,Qe=new We.Vector3(-Ee,-Ve,Je+Ke),Ze=new We.Vector3(-Ee,Ve,Je+Ke),_e=new We.Vector3(Ee,-Ve,Je+Ke),$e=new We.Vector3(Ee,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(Ww.fetchHeatmapTexture(e,null!==te&&void 0!==te?te:5))}}),[ee,te]),Object(r.useEffect)((function(){Te(Math.max(1,Math.round(g/j)))}),[g,j]),Object(r.useEffect)((function(){var e=function(){Nt.getState().setEnableOrbitController(!0),Oe.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)+", "+f.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ue))}),[null===et||void 0===et?void 0:et.label,E,Q,d,f,p]),lt=Object(r.useMemo)((function(){return new We.Euler(0,0,M[2],"ZXY")}),[M]),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 Iy(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 We.Euler(0,Math.atan2(nt.x,nt.z),0,"ZXY"):new We.Euler(S,0,H,"ZXY")}),[rt,it,S,H]),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 We.Vector3(0,ut,qe).applyEuler(ct),gt=it.clone().multiplyScalar(Ye).applyEuler(new We.Euler(-lt.x,0,-lt.z)),mt=-(Ge+w)/2,wt=Object(r.useMemo)((function(){for(var e=[],t=Math.cos(H)*j,l=Math.sin(H)*j,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&&je?Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:je}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:100*v,side:We.FrontSide,color:"lightskyblue"})}),Object(pf.jsx)(cv,{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.Select),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(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.BackSide,color:"white"})}),xt&&xt.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Rim Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),(0===t||t===xt.length-1||Pt)&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Focal Lines",userData:{unintersectable:!0},points:[e.points[8].clone(),e.points[8].clone().add(new We.Vector3(0,0,qe))],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:Ne?"dimgray":"white"})]},t)})),Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Outline 1",userData:{unintersectable:!0},points:[[-Ee,-Ve,Ke],[-Ee,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),Pt&&Object(pf.jsx)(Jl.a,{name:"Parabolic Trough Outline 2",userData:{unintersectable:!0},points:[[Ee,-Ve,Ke],[Ee,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:k}),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),se&&E&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ee,-Ve,Ke],[-Ee,Ve,Ke],[Ee,Ve,Ke],[Ee,-Ve,Ke],[-Ee,-Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),se&&!E&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Me,position:new We.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){ie(s,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),Fe.current&&G((function(e){var t=Ie.current.localToWorld(new We.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Lower)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Lower||ne===K.Lower?pt:ht})}),Object(pf.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),Fe.current&&G((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Upper)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Upper||ne===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),Fe.current&&G((function(e){var t=Fe.current.localToWorld(new We.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Left)},onPointerOut:function(e){ot()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Left||ne===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),Fe.current&&G((function(e){var t=ke.current.localToWorld(new We.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Right)},onPointerOut:function(e){ot()},children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t):Object(pf.jsx)(n.a.Fragment,{},t)})),D&&it.z>0&&Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[ft,new We.Vector3(-.3*Ee,0,.09*Ke).applyEuler(ct),gt,new We.Vector3(-.6*Ee,0,.36*Ke).applyEuler(ct),ft,new We.Vector3(-.9*Ee,0,.81*Ke).applyEuler(ct),gt,new We.Vector3(0,0,0),ft,new We.Vector3(.3*Ee,0,.09*Ke).applyEuler(ct),gt,new We.Vector3(.6*Ee,0,.36*Ke).applyEuler(ct),ft,new We.Vector3(.9*Ee,0,.81*Ke).applyEuler(ct),gt],name:"Sun Beams",lineWidth:.25,color:"white"}),(he||N)&&!se&&Object(pf.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)]})]})},uv=n.a.memo(dv),fv=function(e){var t,l,a,c,s=e.id,d=e.cx,f=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,H=void 0===S?.1:S,j=e.latusRectum,z=void 0===j?2:j,R=e.tiltAngle,D=e.relativeAzimuth,W=e.poleHeight,M=e.poleRadius,I=void 0===M?.2:M,C=e.drawSunBeam,F=e.rotation,k=void 0===F?[0,0,0]:F,O=e.color,Y=void 0===O?"white":O,L=e.lineColor,N=void 0===L?"black":L,U=e.lineWidth,E=void 0===U?.25:U,G=e.showLabel,Q=void 0!==G&&G,Z=e.locked,_=void 0!==Z&&Z,$=e.parentId,ee=Xw(si),te=Xw(Vi),le=Xw(i.date),ae=Xw(i.latitude),oe=Xw(ki),ie=bf(Us),re=Xw(o.solarRadiationHeatmapMaxValue),ne=Af(wi),ce=Xw(o.shadowEnabled),se=Xw(Zr),de=Xw(os),ue=Xw(Kr),fe=Xw(zu),he=Xw(Ls),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],He=Object(r.useState)(null),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Math.max(100,10*ue),Ne=he.z<=0,Ue=y/2,Ee=g/2,Ve=w/2,Je=W+Ue,Ge=Object(r.useMemo)((function(){return{lng:te}}),[te]),Xe=Xw((function(e){var t,l=Object(h.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,Ww.isZero(k[2]))d=Xe.cx+d*Xe.lx,f=Xe.cy+f*Xe.ly;else{var Be=new We.Vector3(d*Xe.lx,f*Xe.ly,0);Be.applyAxisAngle(Rt,k[2]),d=Xe.cx+Be.x,f=Xe.cy+Be.y}}var Ke=Ue*Ue/z,qe=.25*z,Qe=new We.Vector3(-Ue,-Ee,Ve+Ke),Ze=new We.Vector3(-Ue,Ee,Ve+Ke),_e=new We.Vector3(Ue,-Ee,Ve+Ke),$e=new We.Vector3(Ue,Ee,Ve+Ke),et=Object(r.useMemo)((function(){return se(s)}),[s]),tt=Object(Ly.a)(Ny),lt=P+1;Object(r.useEffect)((function(){if(et&&ie){var e=ne(et.id);e&&Re(Ww.fetchHeatmapTexture(e,null!==re&&void 0!==re?re:5))}}),[ie,re]),Object(r.useEffect)((function(){var e=function(){Nt.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)+", "+f.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ge))}),[null===et||void 0===et?void 0:et.label,_,te,d,f,p]),ot=Object(r.useMemo)((function(){return new We.Euler(0,0,k[2],"ZXY")}),[k]),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 Iy(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 We.Euler(Math.atan2(e,ut.z),0,Math.atan2(ut.y,ut.x)+vt,"ZXY")}return new We.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 We.Vector3(Ue*l,Ue*a,Ke)),i.push(new We.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 We.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 We.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new We.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 We.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new We.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,Ht=nt.clone().multiplyScalar(Le),jt=new We.Vector3(0,0,qe).applyEuler(ft);return Object(pf.jsxs)("group",{name:"Parabolic Dish Group "+s,rotation:ot,position:[d,f,p+Ve],children:[Object(pf.jsxs)("group",{rotation:ft,children:[Object(pf.jsx)(sv,{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.Select),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(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.FrontSide,map:ze}):Object(pf.jsx)("meshPhongMaterial",{attach:"material",specular:new We.Color("white"),shininess:100*v,side:We.FrontSide,color:"lightskyblue"})}),Object(pf.jsx)(sv,{receiveShadow:ce,castShadow:ce,uuid:s+" backside",ref:Me,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.Select),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===Me.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Me.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",side:We.BackSide,color:Y})}),wt&&wt.length>0&&wt.map((function(e,t){return Object(pf.jsx)(n.a.Fragment,{children:Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Wireframe",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:E,color:N})},t)})),Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),nt.z>0&&Object(pf.jsx)("mesh",{position:[0,0,qe-.1],children:Object(pf.jsx)("sprite",{scale:[lt,lt,lt],children:Object(pf.jsx)("spriteMaterial",{map:tt,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})}),(A===J.CentralPole||A===J.CentralPoleWithTripod)&&Object(pf.jsx)(Lt.d,{name:"Parabolic Dish Receiver Pole",uuid:s,args:[H,H,qe,mt?6:2,1],rotation:[vt,0,0],position:[0,0,qe/2],receiveShadow:!1,castShadow:!0,children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),A===J.CentralPoleWithTripod&&xt&&xt.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Tripod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:1,color:Ne?"dimgray":Y}),Object(pf.jsx)(Lt.h,{position:new We.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[H/2,4,4],name:"Parabolic Dish Tripod Joint",children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),A===J.Quadrupod&&At&&At.map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsx)(Jl.a,{name:"Parabolic Dish Quadrupod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:2,color:Ne?"dimgray":Y}),Object(pf.jsx)(Lt.h,{position:new We.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[H/2,4,4],name:"Parabolic Dish Quadrupod Joint",children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),pe&&_&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ue,-Ee,Ke],[-Ue,Ee,Ke],[Ue,Ee,Ke],[Ue,-Ee,Ke],[-Ue,-Ee,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),pe&&!_&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Ie,position:new We.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){de(s,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),ke.current&&ee((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Lower)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||fe===K.Lower?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),ke.current&&ee((function(e){var t=Fe.current.localToWorld(new We.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Upper)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||fe===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),ke.current&&ee((function(e){var t=ke.current.localToWorld(new We.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Left)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||fe===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Oe,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),ke.current&&ee((function(e){var t=Oe.current.localToWorld(new We.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Right)},onPointerOut:function(e){rt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||fe===K.Right?pt:ht})})]})]})]}),Je>0&&Object(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),C&&nt.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-ot.x,0,-ot.z],userData:{unintersectable:!0},points:[jt,new We.Vector3(-.3*Ue,0,.09*Ke).applyEuler(ft),Ht,new We.Vector3(-.6*Ue,0,.36*Ke).applyEuler(ft),jt,new We.Vector3(-.9*Ue,0,.81*Ke).applyEuler(ft),Ht,jt,new We.Vector3(.3*Ue,0,.09*Ke).applyEuler(ft),Ht,new We.Vector3(.6*Ue,0,.36*Ke).applyEuler(ft),jt,new We.Vector3(.9*Ue,0,.81*Ke).applyEuler(ft),Ht],name:"Sun Beams",lineWidth:.25,color:"white"}),(xe||Q)&&!pe&&Object(pf.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(Ee*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},hv=n.a.memo(fv),pv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,f=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,H=e.drawSunBeam,j=e.rotation,z=void 0===j?[0,0,0]:j,R=e.color,D=void 0===R?"white":R,W=e.lineColor,M=void 0===W?"black":W,I=e.lineWidth,C=void 0===I?.5:I,F=e.showLabel,k=void 0!==F&&F,O=e.locked,Y=void 0!==O&&O,L=e.parentId,N=e.receiverId,U=Xw(si),E=Xw(Vi),J=Xw(i.date),Q=Xw(i.latitude),Z=Xw(ki),_=bf(Us),$=Xw(o.solarRadiationHeatmapMaxValue),ee=Af(wi),te=Xw(o.shadowEnabled),le=Xw(Zr),ae=Xw(os),oe=Xw(Kr),ie=Xw(zu),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],He=Object(r.useRef)(),je=Object(r.useRef)(),ze=Object(r.useRef)(),Re=Object(r.useRef)(),De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(!1),Ce=Math.max(100,10*oe),Fe=Object(r.useMemo)((function(){return{lng:E}}),[E]),ke=p/2,Oe=y/2,Ye=m/2,Le=T+ke,Ne=Xw((function(e){var t,l=Object(h.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(Ne)switch(Ne.type){case V.Foundation:if(f=Le+Ye+Ne.lz,Ww.isZero(z[2]))s=Ne.cx+s*Ne.lx,d=Ne.cy+d*Ne.ly;else{var Ue=new We.Vector3(s*Ne.lx,d*Ne.ly,0);Ue.applyAxisAngle(Rt,z[2]),s=Ne.cx+Ue.x,d=Ne.cy+Ue.y}}var Ee=new We.Vector3(-ke,-Oe,Ye),Ve=new We.Vector3(-ke,Oe,Ye),Je=new We.Vector3(ke,-Oe,Ye),Ge=new We.Vector3(ke,Oe,Ye),Xe=Object(r.useMemo)((function(){return le(c)}),[c]);Object(r.useEffect)((function(){if(Xe&&_){var e=ee(Xe.id);e&&Pe(Ww.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(){Nt.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",Fe))+((null===Xe||void 0===Xe?void 0:Xe.locked)?" ("+me.t("shared.ElementLocked",Fe)+")":"")+((null===Xe||void 0===Xe?void 0:Xe.label)?"":"\n"+me.t("word.Coordinates",Fe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",Fe))}),[null===Xe||void 0===Xe?void 0:Xe.label,Y,E,s,d,f]),Ke=Object(r.useMemo)((function(){return new We.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 Iy(new Date(J),Q)}),[J,Q]),_e=null===Ne||void 0===Ne?void 0:Ne.rotation[2],$e=N&&N!==L?le(N):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 We.Vector3((t.cx-s)*(_e?Math.cos(_e):1),(t.cy-d)*(_e?Math.sin(_e):0),t.cz-f+t.lz/2+(null!==(e=t.solarAbsorberPipe.absorberHeight)&&void 0!==e?e:10))}}else if(Ne&&Ne.type===V.Foundation){var l,a=Ne;if(a.solarStructure===G.FocusPipe&&a.solarAbsorberPipe)return new We.Vector3((a.cx-s)*(_e?Math.cos(_e):1),(a.cy-d)*(_e?Math.sin(_e):0),a.cz-f+a.lz/2+(null!==(l=a.solarAbsorberPipe.absorberHeight)&&void 0!==l?l:10))}return null}),[Ne,s,d,f,N,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 We.Vector3),lt=Object(r.useMemo)((function(){if(et&&Ze.z>0){var e=_e?new We.Vector3(Math.sin(_e),Math.cos(_e),0):new We.Vector3(0,1,0);tt.current.set(et.x,et.y,et.z);var t=Ze.z0&&(e.intersections[0].object===He.current&&(t.contextMenuObjectType=V.FresnelReflector))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===He.current&&(ue(!0),ne.style.cursor="move"))},onPointerOut:function(e){ue(!1),ne.style.cursor="default"},children:[Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),_&&Te?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",side:We.FrontSide,map:Te}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("white"),shininess:100*x,side:We.FrontSide,color:"lightskyblue"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:D})]}),it&&it.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Module Line",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:C,color:M},t)})),Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 1",userData:{unintersectable:!0},points:[[-ke,-Oe,Ye],[-ke,Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:M}),Object(pf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 2",userData:{unintersectable:!0},points:[[ke,-Oe,Ye],[ke,Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:M}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),re&&Y&&Object(pf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ke,-Oe,Ye],[-ke,Oe,Ye],[ke,Oe,Ye],[ke,-Oe,Ye],[-ke,-Oe,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),re&&!Y&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:je,position:new We.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){ae(c,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Lt.a,{ref:ze,position:[(Ee.x+Je.x)/2,Ee.y,Ee.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 We.Vector3(0,y,-Ee.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Lower)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Lower||ie===K.Lower?pt:ht})}),Object(pf.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 We.Vector3(0,-y,-Ve.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Upper)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Upper||ie===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:De,position:[Ee.x,(Ee.y+Ve.y)/2,Ee.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 We.Vector3(p,0,-Ee.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Left)},onPointerOut:function(e){Qe()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Left||ie===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Me,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=Me.current.localToWorld(new We.Vector3(-p,0,-Je.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Right)},onPointerOut:function(e){Qe()},children:Object(pf.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(pf.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(pf.jsx)("meshStandardMaterial",{attach:"material",color:D})},t)})),H&&Ze.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-Ke.x,0,-Ke.z],userData:{unintersectable:!0},points:et?[tt.current,new We.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)]:[new We.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(de||k)&&!re&&Object(pf.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(Oe*Math.abs(Math.sin(Xe.tiltAngle))+.1,.2)]})]})},yv=n.a.memo(pv),gv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,f=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,H=e.rotation,j=void 0===H?[0,0,0]:H,z=e.color,R=void 0===z?"white":z,D=(e.lineColor,e.lineWidth,e.showLabel),W=void 0!==D&&D,M=e.locked,I=void 0!==M&&M,C=e.parentId,F=e.towerId,k=Xw(si),O=Xw(Vi),Y=Xw(i.date),L=Xw(i.latitude),N=Xw(ki),U=bf(Us),E=Xw(o.solarRadiationHeatmapMaxValue),J=Af(wi),K=Xw(o.shadowEnabled),q=Xw(Zr),Q=Xw(os),Z=Xw(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:O}}),[O]),he=p/2,pe=y/2,ye=m/2,ge=A+Math.max(he,pe),we=Xw((function(e){var t,l=Object(h.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(f=ge+ye+we.lz,Ww.isZero(j[2]))s=we.cx+s*we.lx,d=we.cy+d*we.ly;else{var xe=new We.Vector3(s*we.lx,d*we.ly,0);xe.applyAxisAngle(Rt,j[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(Ww.fetchHeatmapTexture(e,null!==E&&void 0!==E?E:5))}}),[U,E]),Object(r.useEffect)((function(){var e=function(){Nt.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)+", "+f.toFixed(1)+") "+me.t("word.MeterAbbreviation",fe))}),[null===ve||void 0===ve?void 0:ve.label,I,O,s,d,f]),Ae=Object(r.useMemo)((function(){return new We.Euler(0,0,j[2],"ZXY")}),[j]),Te=Object(r.useMemo)((function(){return Iy(new Date(Y),L)}),[Y,L]),Pe=null===we||void 0===we?void 0:we.rotation[2],He=F&&F!==C?q(F):null,je=Object(r.useMemo)((function(){if(He){if(He.type===V.Foundation){var e,t=He;if(t.solarStructure===G.FocusTower&&t.solarPowerTower)return new We.Vector3(t.cx-s,t.cy-d,t.cz-f+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 We.Vector3(a.cx-s,a.cy-d,a.cz-f+a.lz/2+(null!==(l=a.solarPowerTower.towerHeight)&&void 0!==l?l:20))}return null}),[we,s,d,f,F,null===He||void 0===He?void 0:He.cx,null===He||void 0===He?void 0:He.cy,null===He||void 0===He?void 0:He.cz]),ze=Object(r.useMemo)((function(){if(je&&Te.z>0){var e=je.clone().normalize().add(Te).normalize();Ww.isSame(e,Rt)&&(e=new We.Vector3(-.001,0,1).normalize()),Pe&&e.applyAxisAngle(Rt,-Pe);var t=Math.hypot(e.x,e.y);return new We.Euler(Math.atan2(t,e.z),0,Math.atan2(e.y,e.x)+vt,"ZXY")}return new We.Euler(v,0,b,"ZXY")}),[je,Te,v,b,Pe,null===He||void 0===He?void 0:He.cx,null===He||void 0===He?void 0:He.cy,null===He||void 0===He?void 0:He.cz]),Re=-(ge+m)/2,De=Math.max(1,(p+y)/8),Me=st*De*4;return Object(pf.jsxs)("group",{name:"Heliostat Group "+c,rotation:Ae,position:[s,d,f+ye],children:[Object(pf.jsxs)("group",{rotation:ze,children:[Object(pf.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.Select),k((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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),U&&re?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",side:We.FrontSide,map:re}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("white"),shininess:100*x,side:We.FrontSide,color:"lightskyblue"}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:R})]}),Object(pf.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(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),_&&I&&Object(pf.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(pf.jsx)(Lt.h,{ref:se,position:new We.Vector3(0,0,0),args:[Me,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){Q(c,e,X.Move)},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})})]}),ge>0&&Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[P,P,ge+m,N.length<100?4:2,1],position:new We.Vector3(0,0,Re),rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:R})}),S&&Te.z>0&&Object(pf.jsx)(Jl.a,{rotation:[-Ae.x,0,-Ae.z],userData:{unintersectable:!0},points:je?[je,new We.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)]:[new We.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(le||W)&&!_&&Object(pf.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)]})]})},mv=n.a.memo(gv),wv=function(e){var t,l,a,n,c,s,d=e.id,f=e.pvModelName,p=void 0===f?"SPR-X21-335-BLK":f,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,H=e.poleRadius,j=e.poleSpacing,z=e.drawSunBeam,R=e.rotation,D=void 0===R?[0,0,0]:R,W=e.normal,M=void 0===W?[0,0,1]:W,I=e.color,C=void 0===I?"white":I,F=(e.lineColor,e.lineWidth,e.showLabel),k=void 0!==F&&F,O=e.locked,Y=void 0!==O&&O,L=e.parentId,N=e.orientation,U=void 0===N?$.landscape:N,E=Xw(si),J=Xw(Vi),G=Xw(i.date),Q=Xw(i.latitude),Z=Xw(ki),_=bf(Us),ee=Xw(o.shadowEnabled),le=Xw(o.solarPanelShininess),ae=Xw(Zr),oe=Xw(os),ie=Xw(tc),re=Xw(Kr),ne=Xw(zu),ce=Xw(Du),se=Xw(Sr),de=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,ue=Xw(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],He=Object(r.useState)(),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useRef)(),Me=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Oe=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Object(r.useRef)(0),Ne=Object(r.useRef)(0),Ue=Object(r.useRef)(),Ee=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Ve=Math.max(100,10*re),Je=(new We.Vector3).fromArray(M),Ge=ue[p],Xe=Object(r.useMemo)((function(){return{lng:J}}),[J]),Be=Xw((function(e){var t,l=Object(h.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,Ww.isZero(D[2]))y=Be.cx+y*Be.lx,g=Be.cy+g*Be.ly;else{var Ke=new We.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=Ww.getWorldDataById(Be.id),Qe=qe.pos;qe.rot;if(Ww.isZero(D[2]))y=Qe.x+y*Be.lx,g=Qe.y+g*Be.ly;else{var Ze=new We.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=Ww.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 We.Vector3(-_e,-$e,et),it=new We.Vector3(-_e,$e,et),rt=new We.Vector3(_e,-$e,et),nt=new We.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 We.Vector3(o*l-_e,-$e,v),new We.Vector3(o*l-_e,$e,v)]});for(var i=0;i<=t;i++)Ue.current.push({points:[new We.Vector3(-_e,i*a-$e,v),new We.Vector3(_e,i*a-$e,v)]})}}),[U,p,w,x,v]),Object(r.useEffect)((function(){var e=function(){Nt.getState().setEnableOrbitController(!0),Ye.current=!1,Jt(!1)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Re(Ww.isSame(Je,Rt))}),[M]);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 Ww.isSame(Je,St)?new We.Euler(vt,0,D[2]+vt,"ZXY"):Ww.isSame(Je,Ht)?new We.Euler(vt,0,D[2]-vt,"ZXY"):Ww.isSame(Je,jt)?new We.Euler(vt,0,D[2]+Math.PI,"ZXY"):Ww.isSame(Je,zt)?new We.Euler(vt,0,D[2],"ZXY"):new We.Euler(0,0,D[2],"ZXY")}),[M,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 Iy(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(Ww.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 We.Euler(Math.atan2(e,Tt.z),0,Math.atan2(Tt.y,Tt.x)+vt,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new We.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(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),_&&Xt?Object(pf.jsx)("meshBasicMaterial",{attachArray:"material",map:Xt}):Gt?de||0===le?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",map:Gt,color:C}):Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:We.FrontSide,map:Gt,color:C}):null,0===(null===Ge||void 0===Ge?void 0:Ge.bifacialityFactor)||de||0===S&&0===b?Object(pf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Gt?Object(pf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new We.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:We.FrontSide,map:Gt,color:C}):null]}),_&&Xt&&Ue.current&&Ue.current.map((function(e,t){return Object(pf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(pf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:d,args:[w,x],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide})}),fe&&Y&&Object(pf.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.h,{ref:Me,position:new We.Vector3(0,0,0),args:[Ft,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(pf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(pf.jsxs)("group",{children:[Object(pf.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),Fe.current&&E((function(e){var t=Ie.current.localToWorld(new We.Vector3(0,x,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Lower)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||ne===K.Lower?pt:ht})}),Object(pf.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),Fe.current&&E((function(e){var t=Ce.current.localToWorld(new We.Vector3(0,-x,-it.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Upper)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||ne===K.Upper?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:Fe,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),Fe.current&&E((function(e){var t=Fe.current.localToWorld(new We.Vector3(w,0,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Left)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||ne===K.Left?pt:ht})}),Object(pf.jsx)(Lt.a,{ref:ke,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),Fe.current&&E((function(e){var t=ke.current.localToWorld(new We.Vector3(-w,0,-rt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Right)},onPointerOut:function(e){wt()},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||ne===K.Right?pt:ht})})]})]})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Object(pf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,Pt.z],children:[Object(pf.jsx)(uy,{id:d,position:[0,-$e-kt/2,S],color:Te===q.Upper||ce===q.Upper?pt:ht,ratio:kt,handleType:q.Upper,hoverHandle:mt,noHoverHandle:wt}),Object(pf.jsx)(uy,{id:d,position:[0,$e+kt/2,S],color:Te===q.Lower||ce===q.Lower?pt:ht,ratio:kt,handleType:q.Lower,hoverHandle:mt,noHoverHandle:wt})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Math.abs(S)>.1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.g,{name:q.Tilt,args:[Ot,1.1*Ot,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){Nt.getState().setEnableOrbitController(!1),Ye.current=!0;var t=ae(d);Le.current=t.tiltAngle}E((function(e){e.rotateHandleType=q.Tilt}))},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",side:We.DoubleSide,color:Te===q.Tilt||Vt?pt:ht})}),Vt&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Lt.g,{ref:Oe,name:"Solar panel tilt handle",args:[Ot,2*Ot,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerDown:function(e){},onPointerUp:function(e){if(Math.abs(Ne.current-Le.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Le.current,newValue:Ne.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 We.Vector2;if(t.x=e.offsetX/pe.clientWidth*2-1,t.y=-e.offsetY/pe.clientHeight*2+1,Ee.setFromCamera(t,ye),Oe.current){var l=Ee.intersectObjects([Oe.current]);if(l.length>0){var a=l[0].point,o=Oe.current.parent;if(o){var i=o.position,r=(new We.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),Ne.current=n}}}}}},children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:We.DoubleSide})}),Object(pf.jsx)(Jl.a,{points:[[0,0,Ot],[0,0,1.75*Ot]],rotation:new We.Euler(b,0,Pt.z,"ZXY"),lineWidth:1}),Yt.map((function(e,t){return Object(pf.jsxs)("group",{rotation:new We.Euler(Math.PI/12*t-vt,0,Pt.z,"ZXY"),children:[Object(pf.jsx)(Jl.a,{points:[[0,0,1.8*Ot],[0,0,2*Ot]],color:"white",transparent:!0,opacity:.5}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*Ot,fontFace:"Times Roman",textHeight:.15*Ot,position:[0,0,1.6*Ot]})]},t)})),Object(pf.jsx)("group",{rotation:new We.Euler(b,0,Pt.z,"ZXY"),children:Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(b/Math.PI*180),"\xb0"),fontSize:20*Ot,fontFace:"Times Roman",textHeight:.2*Ot,position:[0,0,.75*Ot]})})]})]}),S>0&&ze&&Mt.map((function(e,t){return Object(pf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[H,H,S+2*(e.z-Wt)+v,ct,1],position:e,rotation:[vt,0,0],children:Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t)})),z&&xt.z>0&&Object(pf.jsxs)("group",{rotation:[-gt.x,0,-gt.z],children:[Object(pf.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(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[xt.clone().multiplyScalar(.5),Dt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Ww.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(pf.jsx)("group",{position:Dt.clone().multiplyScalar(.75),rotation:[vt+gt.x+Pt.x,0,gt.z+Pt.z,w0?eI:e>=M&&e<=I}),[D,M,I,W]),re=Object(r.useRef)(!1),ne=Xw(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 We.TextureLoader).load(El.fetchTextureImage(v,oe),(function(e){A&&(e.wrapS=We.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 El.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){bf.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=le.lz})),Ww.isMoveHandle(t)?q.domElement.style.cursor="move":q.domElement.style.cursor="pointer")}),[]),ye=Object(r.useCallback)((function(){j((function(e){e.hoveredHandle=null})),q.domElement.style.cursor=Xw.getState().addedCuboidId?"crosshair":"default"}),[]),ge=function(){return p!==xt&&(null===Z||void 0===Z?void 0:Z.current)?Ww.getObjectChildById(Z.current,p):null},we=Object(r.useMemo)((function(){return El.fetchSpread(v)}),[v]),xe=Object(r.useMemo)((function(){return El.fetchHeight(v)}),[v]);Object(Se.d)((function(e){var t=e.camera;if(_.current){var l=Ww.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 We.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(pf.jsx)(pf.Fragment,{children:S?Object(pf.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(pf.jsxs)("group",{position:[0,0,xe/2],children:[Object(pf.jsx)(fx.a,{ref:$,uuid:y,name:v,follow:!1,rotation:[vt,0,0],children:Object(pf.jsx)(Lt.f,{args:[we,xe],receiveShadow:!0,children:Object(pf.jsx)("meshToonMaterial",{map:ue,side:We.DoubleSide,alphaTest:.5})})}),Object(pf.jsx)(fx.a,{ref:te,name:"Interaction Billboard",visible:!1,position:[0,0,-xe/2],children:Object(pf.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),j((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),Nt.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(pf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(Lt.h,{position:new We.Vector3(0,0,-xe/2),args:[.30000000000000004,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Nt.setState((function(e){e.flowerRef=_})))},onPointerEnter:function(e){pe(e,B.Default)},onPointerLeave:ye,children:Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:O===B.Default||k===B.Default?pt:ut})})}),N&&!Q&&Object(pf.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!==(f=null===le||void 0===le?void 0:le.labelHeight)&&void 0!==f?f:.4)]})]})}):null})},bv=n.a.memo(vv),Av=l(21),Tv=l(22),Pv=l(841),Sv=l(94),Hv=Tv.a.div(av||(av=Object(Av.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"]))),jv=function(){var e=Xw(si),t=Xw(Gi),l=Xw(Vi),a=bf(ms),i=Xw(o.showDesignInfoPanel),r={lng:l};return Object(pf.jsx)(Hv,{style:{bottom:i?"42px":"6px"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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)})]})})},zv=n.a.memo(jv),Rv=Tv.a.div(ov||(ov=Object(Av.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"]))),Dv=function(){var e=Xw(si),t=Xw(Gi),l=Xw(Vi),a=bf(xs),i=Xw(o.showDesignInfoPanel),r={lng:l};return Object(pf.jsx)(Rv,{style:{bottom:i?"42px":"6px"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.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)})]})})},Wv=n.a.memo(Dv),Mv=l(274),Iv=Object(Tv.a)(Mv.a)(iv||(iv=Object(Av.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"]))),Cv=n.a.memo((function(e){var t=e.initializing,l=bf(ys),a=bf(gs),o=bf(ws),r=bf(ms),n=bf(xs),c=Xw(i.noAnimationForSensorDataCollection),s=Xw(i.noAnimationForSolarPanelSimulation),d=Xw(i.noAnimationForHeatmapSimulation),u=Xw(i.noAnimationForSolarUpdraftTowerSimulation),f=Xw(i.noAnimationForThermalSimulation),h=bf(Gs),p=bf(Bs),y=bf(gu),g=bf(wu),m=bf(Jd),w=bf(Gd),x=bf(Lr),v=bf(Ir),b=bf(Fr),A=Xw.getState().elements;return Object(pf.jsx)(pf.Fragment,{children:(t||l||a||o)&&Object(pf.jsxs)(pf.Fragment,{children:[a&&(!d&&x||!f&&(v||b)||!c&&(y||g)||!u&&(m||w)||!s&&(h||p)||Ww.hasMovingParts(A))&&Object(pf.jsx)(zv,{}),o&&Object(pf.jsx)(Wv,{}),Object(pf.jsx)(Iv,{spinning:!r||!n})]})})})),Fv=function(){if(!bf.getState().waiting)return null;var e=function(){return Object(r.useEffect)((function(){bf.setState((function(e){e.waiting=!1}))})),null};return Object(pf.jsx)(e,{})},kv=function(){var e=Xw(ki),t=Object(r.useRef)(null);return Object(r.useEffect)((function(){t&&Nt.setState((function(e){e.contentRef=t}))}),[]),console.debug(e),Object(pf.jsxs)("group",{ref:t,name:"Content",children:[e.map((function(t){switch(t.type){case V.Foundation:return Object(pf.jsx)(jg,Object(d.a)({},t),t.id);case V.Sensor:var l=t;return l.parentType===V.Cuboid?null:Object(pf.jsx)(Sw,Object(d.a)({},l),t.id);case V.Light:var a=t;return a.parentType===V.Cuboid?null:Object(pf.jsx)(jw,Object(d.a)({},a),t.id);case V.Cuboid:return t.parentId!==xt?null:Object(pf.jsx)(Dw,{elements:e,cuboidModel:t},t.id);case V.Human:return Object(pf.jsx)(px,Object(d.a)({},t),t.id);case V.Tree:return Object(pf.jsx)($x,Object(d.a)({},t),t.id);case V.Flower:return Object(pf.jsx)(bv,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(pf.jsx)(xv,Object(d.a)({},t),t.id)}case V.ParabolicDish:return Object(pf.jsx)(hv,Object(d.a)({},t),t.id);case V.ParabolicTrough:return Object(pf.jsx)(uv,Object(d.a)({},t),t.id);case V.FresnelReflector:return Object(pf.jsx)(yv,Object(d.a)({},t),t.id);case V.Heliostat:return Object(pf.jsx)(mv,Object(d.a)({},t),t.id);case V.Polygon:switch(t.parentType){case V.Wall:return null;default:return Object(pf.jsx)(Nm,Object(d.a)({},t),t.id)}default:if(t.id)return Object(pf.jsx)(n.a.Fragment,{},t.id)}return null})),Object(pf.jsx)(Fv,{})]})},Ov=n.a.memo(kv),Yv=function(){var e=Xw(si),t=Xw(an),l=Xw(en),a=Xw(nn),i=Xw(Un),n=Xw(rs),c=Xw(Zr),s=Xw(bn),p=Xw(jn),y=Xw(Kc),g=Xw(Qr),m=Xw(Ru),w=Xw(Sr),x=Xw(Kn),v=Xw(Br),b=Xw(Vi),A=Xw(ns),T=Xw(ju),P=Xw(zu),S=Xw(Du),H=Xw(Wu),j=Xw(o.shadowEnabled),z=Xw(o.groundColor),R=Xw(o.waterSurface),D=Xw((function(e){return e.world.ground})),W=Xw(Cu),M=Xw(ku),I=bf(Us),C=Xw(Vu),F=Object(Se.f)(),k=F.get,O=F.scene,Y=F.invalidate,L=Object(r.useRef)(),N=Object(r.useRef)(),U=Object(r.useRef)(null),E=Object(r.useRef)(new We.Vector3),J=Object(r.useRef)(new We.Vector3),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 Map),ae=Object(r.useRef)(new We.Vector3(1,1,1)),oe=Object(r.useRef)(new We.Vector3(1,1,1)),ie=Object(r.useRef)([0,0,1]),re=Object(r.useRef)([0,0,1]),ne=Object(r.useRef)(null),ce=Object(r.useRef)(null),se=Object(r.useRef)(new Map),de=Object(r.useRef)(new Map),ue=Object(r.useRef)(new Map),fe=Object(r.useRef)(!1),he=Object(r.useRef)(!1),pe=Object(r.useRef)(!1),ye=Object(r.useRef)(!1),ge=Object(r.useRef)(!1),we=Object(r.useRef)(new Map),xe=Object(r.useRef)(new Map),ve=Object(r.useRef)(new Map),be=Object(r.useRef)(new We.Vector3),Ae=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(){W&&(e((function(e){e.addedFoundationId=null,e.deletedFoundationId=null})),fe.current=!1,he.current=!1)}),[W]),Object(r.useEffect)((function(){M&&(e((function(e){e.addedCuboidId=null,e.deletedCuboidId=null})),pe.current=!1,ye.current=!1)}),[M]);var Te=Object(Se.f)().camera,Pe=Object(r.useMemo)((function(){return new We.Raycaster}),[]),He=Object(r.useMemo)((function(){return new We.Vector2}),[]),je=U.current?Math.cos(U.current.rotation[2]):1,ze=U.current?Math.sin(U.current.rotation[2]):0,Re=Z.Ground,De=Object(r.useMemo)((function(){return new We.Vector3}),[]),Me=Object(r.useMemo)((function(){return new We.Euler}),[]),Ie=Object(r.useMemo)((function(){return new We.Euler}),[]);if(U.current)if(Ww.isPlantOrHuman(U.current)){Re=Z.Vertical;var Ce=Xw.getState().viewState.orthographic?0:-vt,Fe=Te.position,ke=Fe.x,Oe=Fe.y,Ye=-Math.atan2(ke,Oe);Me.set(Ce,0,Ye,"ZXY"),De.set(U.current.cx,U.current.cy,0)}else if(T===B.Top)Re=Z.Horizontal,De.set(U.current.cx,U.current.cy,U.current.lz),Me.set(0,0,0);else if(Ww.isMoveHandle(T)||P===K.Left||P===K.Right||P===K.Lower||P===K.Upper||P===K.LowerLeft||P===K.UpperLeft&&U.current.type!==V.Wall||P===K.LowerRight||P===K.UpperRight&&U.current.type!==V.Wall||S===q.Lower||S===q.Upper)Re=Z.Horizontal,De.set(U.current.cx,U.current.cy,st),Me.set(0,0,0);else if(P){Re=Z.Vertical;var Le=m(U.current,P),Ne=g(),Ue=-Math.atan2(Ne.x,Ne.y);De.set(Le.x,Le.y,0),Me.set(-vt,0,Ue,"ZXY")}var Ee=function(e){He.x=e.offsetX/k().gl.domElement.clientWidth*2-1,He.y=-e.offsetY/k().gl.domElement.clientHeight*2+1,Pe.setFromCamera(He,k().camera)},Ve=function(e){var t,l=Object(h.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},Je=function(t,l){t&&e((function(e){var a,o=Object(h.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()}}))},Ge=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},Xe=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Ww.getObjectChildById(a.current,t),i=Ww.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Ww.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}Y()}}}},Be=function(e,t){if(e&&e.current){var l=Ve(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Nt.getState().contentRef;i&&i.current&&(i.current.add(e.current),Je(xt,Ge(e.current)))}e.current.position.copy(l.point),Y()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),Je(Ge(r),Ge(e.current)));var n=Ww.getWorldDataById(Ge(r)).rot;Ie.set(0,0,-n);var c=(new We.Vector3).subVectors(l.point,r.localToWorld(new We.Vector3)).applyEuler(Ie);e.current.position.copy(c),Y()}}ge.current||(ge.current=!0)}}},Ke=function(t,l,a){e((function(e){var o,i=Object(h.a)(e.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===t){Ww.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()}}))},qe=function(e,t){var l=Nt.getState().contentRef,a=Ww.getObjectChildById(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(h.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=Nt.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 We.Vector3(t.cx,t.cy,t.cz).applyEuler(new We.Euler(0,0,e.rotation[2])).add(E.current);t.cx=s.x,t.cy=s.y,t.cz=0,X.current.set(t.id,new We.Vector3(s.x,s.y,0)),le.current.set(t.id,xt)},Qe=function(t){var a=Xw.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:ae.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:ae.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:ae.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(J.current.set(t.cx,t.cy,t.cz),oe.current.set(t.lx,t.ly,t.lz),te.current.clear(),le.current.clear(),X.current.clear(),_.current.clear(),ee.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(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Ww.isPlantOrHuman(o)&&o.parentId===t.id&&(te.current.set(o.id,t.id),!Ww.isResizingVertical(Xw.getState().resizeHandleType)))if(Math.abs(ae.current.z/2-o.cz)<.01){var i=new We.Vector3(o.cx,o.cy,o.cz).applyEuler(new We.Euler(0,0,t.rotation[2])).add(E.current).sub(J.current).applyEuler(new We.Euler(0,0,-t.rotation[2]));Math.abs(i.x)>Math.abs(oe.current.x/2)+.01||Math.abs(i.y)>Math.abs(oe.current.y/2)+.01?qe(t,o):(o.cx=i.x,o.cy=i.y)}else{var r=new We.Vector3(o.cx,o.cy,o.cz),n=(new We.Vector3).subVectors(J.current,E.current),c=(new We.Vector3).subVectors(r,n);Math.abs(r.x/ae.current.x)>.49?Math.abs(c.y)>t.ly/2+.5?qe(t,o):(o.cx=(r.x>0?t.lx:-t.lx)/2,o.cy=c.y):Math.abs(r.y/ae.current.y)>.49&&(Math.abs(c.x)>t.lx/2+.5?qe(t,o):(o.cx=c.x,o.cy=(r.y>0?t.ly:-t.ly)/2))}}}catch(s){a.e(s)}finally{a.f()}}})),J.current.distanceToSquared(E.current)>At&&oe.current.distanceToSquared(ae.current)>At){if(t.type===V.Foundation||t.type===V.Cuboid){var n=l(t.id);if(n.length>0){var f,y=Object(h.a)(n);try{for(y.s();!(f=y.n()).done;){var g=f.value;if(g.type===V.Polygon)_.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 We.Vector2(m.leftPoint[0],m.leftPoint[1]),b=new We.Vector2(m.rightPoint[0],m.rightPoint[1]);ee.current.set(g.id,[v,b])}X.current.set(g.id,new We.Vector3(g.cx,g.cy,g.cz))}}}catch(z){y.e(z)}finally{y.f()}}if(t.type===V.Foundation){var A=ot(t.id);if(A.length>0){var T,P=Object(h.a)(A);try{for(P.s();!(T=P.n()).done;){var S=T.value,H=new We.Vector3(S.cx,S.cy);X.current.set(S.id,H)}}catch(z){P.e(z)}finally{P.f()}}}}var j=function(){if(U.current){var t={name:"Resize",timestamp:Date.now(),resizedElementId:U.current.id,resizedElementType:U.current.type,oldCx:E.current.x,oldCy:E.current.y,oldCz:E.current.z,newCx:J.current.x,newCy:J.current.y,newCz:J.current.z,oldLx:ae.current.x,oldLy:ae.current.y,oldLz:ae.current.z,newLx:oe.current.x,newLy:oe.current.y,newLz:oe.current.z,oldChildrenPositionsMap:new Map(G.current),newChildrenPositionsMap:new Map(X.current),oldPolygonVerticesMap:new Map(Q.current),newPolygonVerticesMap:new Map(_.current),oldChildrenParentIdMap:new Map(te.current),newChildrenParentIdMap:new Map(le.current),oldWallPointsMap:new Map($.current),newWallPointsMap:new Map(ee.current),undo:function(){if(e((function(e){var l,a=Object(h.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(h.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(h.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,at(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),f=null===(s=t.newChildrenParentIdMap)||void 0===s?void 0:s.get(o);d&&f&&d!==f&&(Xe(d,f,o),Je(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(h.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],f=c(s);(null===f||void 0===f?void 0:f.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}},redo:function(){if(e((function(e){var l,a=Object(h.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(h.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(h.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&&(Xe(s,c,r),Je(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(h.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],f=c(s);(null===f||void 0===f?void 0:f.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}}};return t}}();j&&w(j)}},Ze=function(t){e((function(e){var l,a=Object(h.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()}}))},_e=function(t,l){var o,i,r;if(!t.locked){J.current.set(t.cx,t.cy,t.cz);var n=ne.current,c=null;switch(Ee(l),t.type){case V.Tree:c=null===(o=Nt.getState().treeRef)||void 0===o?void 0:o.current;break;case V.Flower:c=null===(i=Nt.getState().flowerRef)||void 0===i?void 0:i.current;break;case V.Human:c=null===(r=Nt.getState().humanRef)||void 0===r?void 0:r.current}if(c&&ge.current){var s=Pe.intersectObjects(Ww.fetchIntersectables(O),!1),d=Ve(s);if(d){var u=d.point;if("Ground"===d.object.name)Ke(t.id,xt,u),J.current.set(u.x,u.y,u.z),n=xt;else if(d.object.userData.stand){var p=Ge(d.object),y=d.object.parent;if(y){var g=(new We.Vector3).subVectors(u,y.localToWorld(new We.Vector3)).applyEuler(Ie);Ke(t.id,p,g),J.current.set(g.x,g.y,g.z),n=p}}}ge.current=!1}if(J.current.distanceToSquared(E.current)>At||0===Pe.intersectObjects([L.current]).length){var m=!0;if(!Xw.getState().viewState.orthographic&&!(m=J.current.length().02}if(!m||function(){if(Xw.getState().viewState.orthographic)return!1;if(L.current){var e=Pe.intersectObjects(k().scene.children,!0);if(e.length>0){var t,l=Object(h.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===Pe.intersectObjects([L.current]).length}()){a(t.id,E.current.x,E.current.y,E.current.z),c&&Ww.isPlantOrHuman(t)&&c.position.copy(E.current),Ww.isPlantOrHuman(t)&&Je(ne.current,t.id);var S=Nt.getState().contentRef;if((null===S||void 0===S?void 0:S.current)&&ne.current&&c){if(ne.current===xt)S.current.add(c);else{var H=Ww.getObjectChildById(S.current,ne.current);null===H||void 0===H||H.add(c)}Y()}Qh(me.t("message.CannotMoveObjectTooFar",Ae))}else{if(we.current.size>1){ve.current.clear();var j,z=Object(h.a)(Xw.getState().elements);try{for(z.s();!(j=z.n()).done;){var R=j.value;xe.current.has(R.id)&&ve.current.set(R.id,[R.cx,R.cy,R.cz])}}catch(F){z.e(F)}finally{z.f()}var D={name:"Move Foundation Group",timestamp:Date.now(),oldPositionMap:new Map(xe.current),newPositionMap:new Map(ve.current),undo:function(){Ze(D.oldPositionMap)},redo:function(){Ze(D.newPositionMap)}};w(D)}else{var W=t.type===V.Cuboid,M=W?ce.current:ne.current,I=W?t.parentId:n,C={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:E.current.x,oldCy:E.current.y,oldCz:E.current.z,newCx:J.current.x,newCy:J.current.y,newCz:J.current.z,oldRotation:Object(f.a)(ie.current),newRotation:Object(f.a)(t.rotation),oldParentId:M,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(f.a)(C.oldRotation))})),Je(C.oldParentId,C.movedElementId),C.movedElementType&&it(C.movedElementType)&&Xe(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(f.a)(C.newRotation))})),Je(C.newParentId,C.movedElementId),C.movedElementType&&it(C.movedElementType)&&Xe(C.newParentId,C.oldParentId,C.movedElementId)}};w(C)}v()}}}},$e=function(t){if(2!==t.button){if(Nt.setState((function(e){e.setEnableOrbitController(!0)})),U.current){var l=c(U.current.id);if(l)if(he.current)if(fe.current=!1,he.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(ye.current)if(pe.current=!1,ye.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 Xw.getState().resizeHandleType?Qe(l):Xw.getState().rotateHandleType?function(e){re.current=Object(f.a)(e.rotation);var t=(new We.Vector3).fromArray(ie.current);if((new We.Vector3).fromArray(re.current).distanceToSquared(t)>At){var l={name:"Rotate",timestamp:Date.now(),rotatedElementId:e.id,rotatedElementType:e.type,oldRotation:ie.current,newRotation:re.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):Xw.getState().moveHandleType&&_e(l,t),l.type===V.Foundation&&bf.getState().updateFoundationMovedFlag();U.current=null}e((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Nt.setState((function(e){e.humanRef=null,e.treeRef=null,e.flowerRef=null}))}},et=function(e,t){var l=Ww.getWorldDataById(e.id).pos,a=new We.Vector3(l.x,l.y),o=(new We.Vector3).subVectors(a,t);we.current.set(e.id,o),xe.current.set(e.id,[e.cx,e.cy,e.cz])},tt=function e(t,l){var a,o=t.intersections[0].point.clone().setZ(0),i=Object(h.a)(Xw.getState().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!Qf(r)||r.parentId!==xt||r.locked||r.id===l.id||we.current.has(r.id)||Ww.isChild(l.id,r.id)||Ww.isChild(r.id,l.id)||!Ww.areTwoBasesOverlapped(r,l)||(et(r,o),e(t,r)),r.id===l.id&&et(r,o)}}catch(n){i.e(n)}finally{i.f()}},lt=function(e,t){we.current.clear(),xe.current.clear(),t.enableGroupMaster&&Xw.getState().moveHandleType&&tt(e,t)},at=function(e){return e.type===V.SolarPanel&&e.parentType===V.Roof||(e.type===V.Window&&e.parentType===V.Roof||void 0)},ot=function(e){return Xw.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)))}))},it=function(e){return e===V.Human||e===V.Tree||e===V.Flower},rt=function(e,t){if(0===e.tempHumanPlant.length){var l=e.elements.filter((function(e){return it(e.type)&&Ww.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)}))}},nt=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(!we.current.has(a))return Ww.isChild(t,a)?void 0:l}},ct=function(e){return e===V.Foundation||e===V.Cuboid||e===V.Tree||e===V.Flower||e===V.Human},dt=function(e,t,l,a,o){if(e){var i,r=Object(h.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=Ge(n),s=se.current.get(c);if(s)if(Math.abs(ae.current.z/2-n.position.z)<.01){var d=(new We.Vector3).subVectors(s,a).applyEuler(new We.Euler(0,0,-o));n.position.setX(d.x),n.position.setY(d.y)}else{var u=(new We.Vector3).subVectors(s,E.current).applyEuler(new We.Euler(0,0,-o)),f=(new We.Vector3).subVectors(a,E.current),p=(new We.Vector3).subVectors(u,f);Math.abs(u.x/ae.current.x)>.49?(n.position.setX((u.x>0?t:-t)/2),n.position.setY(p.y)):Math.abs(u.y/ae.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()}}},ut=function(t){if(U.current){var a=new We.Vector2(t.x,t.y),o=new We.Vector2(H.x,H.y),i=o.distanceTo(a),r=Math.atan2(a.x-H.x,a.y-H.y)+U.current.rotation[2],n=Math.abs(i*Math.sin(r)),c=Math.abs(i*Math.cos(r)),s=(new We.Vector2).addVectors(a,o).multiplyScalar(.5);switch(e((function(e){if(U.current){var t,a=!1,o=Object(h.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===U.current.id){switch(i.type){case V.Cuboid:case V.Foundation:var r=l(i.id);if(r.length>0&&!C){var d,u=[],f=Object(h.a)(r);try{for(f.s();!(d=f.n()).done;){var p=d.value;if(!Ww.isPlantOrHuman(p)){var y=JSON.parse(JSON.stringify(p));if(u.push(y),Ww.isIdentical(y.normal,Tt))if(p.type===V.Wall){var g=ue.current.get(p.id);if(g){var m=-i.rotation[2],w=g.centerPointAbsPos,x=g.leftPointAbsPos,v=g.rightPointAbsPos,b=(new We.Vector2).subVectors(w,s).rotateAround(Dt,m),A=(new We.Vector2).subVectors(x,s).rotateAround(Dt,m),T=(new We.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=se.current.get(p.id);if(S){var H=-i.rotation[2],j=(new We.Vector2).subVectors(new We.Vector2(S.x,S.y),s).rotateAround(Dt,H);switch(P){case K.Lower:case K.Upper:y.cy=j.y/c;break;case K.Left:case K.Right:y.cx=j.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=j.x/n,y.cy=j.y/c}}}}}}catch(te){f.e(te)}finally{f.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(Ww.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(te){o.e(te)}finally{o.f()}if(a&&!C){var R,D=Object(h.a)(e.elements);try{for(D.s();!(R=D.n()).done;){var W=R.value;if(W.parentId===U.current.id)switch(W.type){case V.Wall:var M=W,I=ue.current.get(W.id);if(I){var F=-U.current.rotation[2],k=I.centerPointAbsPos,O=I.leftPointAbsPos,Y=I.rightPointAbsPos,L=(new We.Vector2).subVectors(k,s).rotateAround(Dt,F),N=(new We.Vector2).subVectors(O,s).rotateAround(Dt,F),E=(new We.Vector2).subVectors(Y,s).rotateAround(Dt,F);switch(P){case K.Lower:case K.Upper:W.cy=L.y;break;case K.Left:case K.Right:W.cx=L.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=L.x,W.cy=L.y}M.leftPoint=[N.x,N.y,0],M.rightPoint=[E.x,E.y,0]}break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:if(Ww.isIdentical(W.normal,Tt)){var J=se.current.get(W.id);if(J){var G=(new We.Vector2).subVectors(new We.Vector2(J.x,J.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=G.y/c;break;case K.Left:case K.Right:W.cx=G.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=G.x/n,W.cy=G.y/c}}}break;case V.Cuboid:var X=se.current.get(W.id);if(X){var B=(new We.Vector2).subVectors(new We.Vector2(X.x,X.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=B.y;break;case K.Left:case K.Right:W.cx=B.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=B.x,W.cy=B.y}}break;case V.Polygon:if(Ww.isIdentical(W.normal,Tt)){var q=W,Q=de.current.get(q.id);Q&&function(){var e=[];Q.forEach((function(t){var l=(new We.Vector2).subVectors(t,s).rotateAround(Dt,-U.current.rotation[2]);e.push({x:l.x/n,y:l.y/c})})),q.vertices=e}()}}if(W.foundationId===U.current.id&&W.type===V.SolarPanel&&W.parentType===V.Roof){var Z=se.current.get(W.id);if(Z){var _=(new We.Vector2).subVectors(new We.Vector2(Z.x,Z.y),s).rotateAround(Dt,-U.current.rotation[2]);switch(P){case K.Lower:case K.Upper:W.cy=_.y/c;break;case K.Left:case K.Right:W.cx=_.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:W.cx=_.x/n,W.cy=_.y/c}}}if(W.foundationId===U.current.id&&W.type===V.Window&&W.parentType===V.Roof){var $=se.current.get(W.id);if($){var ee=(new We.Vector2).subVectors(new We.Vector2($.x,$.y),s).rotateAround(Dt,-U.current.rotation[2]);W.cx=ee.x,W.cy=ee.y}}}}catch(te){D.e(te)}finally{D.f()}}}})),U.current.type){case V.Foundation:var d=Nt.getState().foundationRef;(null===d||void 0===d?void 0:d.current)&&dt(null===d||void 0===d?void 0:d.current,n,c,d.current.position,U.current.rotation[2]);break;case V.Cuboid:var u=Nt.getState().cuboidRef;(null===u||void 0===u?void 0:u.current)&&u.current.parent&&dt(null===u||void 0===u?void 0:u.current,n,c,u.current.parent.position,U.current.rotation[2])}}},ft=function(e){var t=U.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(U.current.id,0,0,o+r)},ht=function(t){if(we.current.size>0)e((function(e){var l,a=Object(h.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Qf(o)&&we.current.has(o.id)){var i=we.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 l,o,i=U.current.lx/2,r=U.current.ly/2;switch(T){case B.Top:a(U.current.id,t.x,t.y);break;case B.Upper:l=t.x+ze*r,o=t.y-je*r,a(U.current.id,l,o);break;case B.Lower:l=t.x-ze*r,o=t.y+je*r,a(U.current.id,l,o);break;case B.Left:l=t.x+je*i,o=t.y+ze*i,a(U.current.id,l,o);break;case B.Right:l=t.x-je*i,o=t.y-ze*i,a(U.current.id,l,o)}}};return Object(pf.jsxs)(pf.Fragment,{children:[U.current&&Re!==Z.Ground&&Object(pf.jsx)(Lt.f,{ref:N,visible:!1,name:"Ground Intersection Plane",rotation:Me,position:De,args:[1e5,1e5],onPointerMove:function(t){var l;if(U.current&&U.current.type&&!U.current.locked&&(Ee(t),N.current&&Re===Z.Vertical&&(l=Pe.intersectObjects([N.current]))&&l.length>0)){var a=l[0].point;switch(U.current.type){case V.Tree:var o=U.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))}Be(Nt.getState().treeRef,t);break;case V.Flower:Be(Nt.getState().flowerRef,t);break;case V.Human:Be(Nt.getState().humanRef,t)}}},children:Object(pf.jsx)("meshStandardMaterial",{side:We.DoubleSide,opacity:.5,transparent:!0})}),Object(pf.jsx)(Lt.f,{receiveShadow:j,ref:L,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===L.current&&e((function(e){_y.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&&L.current)if(fe.current){Ee(a);var o=Pe.intersectObjects([L.current]);o.length>0&&(Nt.getState().setEnableOrbitController(!1),e((function(e){e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(o[0].point)})),fe.current=!1,he.current=!0)}else if(pe.current){Ee(a);var i=Pe.intersectObjects([L.current]);i.length>0&&(Nt.getState().setEnableOrbitController(!1),e((function(e){if(e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(i[0].point),U.current){var t,l=nt(a,null===(t=U.current)||void 0===t?void 0:t.id);if(l){var o=Pe.intersectObjects([l.eventObject]);o.length>0&&e.resizeAnchor.copy(o[0].point)}}})),pe.current=!1,ye.current=!0)}else{if(a.intersections[0].object===L.current){if(e((function(e){e.clickObjectType=V.Ground,e.selectedElement=null,_y.selectNone(e),e.contextMenuObjectType=null,e.groupMasterId=null})),ct(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=t();if(u&&ct(u.type)){if(U.current=u,E.current.set(u.cx,u.cy,u.cz),ae.current.set(u.lx,u.ly,u.lz),ie.current=Object(f.a)(u.rotation),u.type===V.Foundation||u.type===V.Cuboid){var p=l(u.id);if(G.current.clear(),Q.current.clear(),$.current.clear(),p.length>0){var g,m=Object(h.a)(p);try{for(m.s();!(g=m.n()).done;){var x=g.value;if(x.type===V.Polygon)Q.current.set(x.id,x.vertices.map((function(e){return Object(d.a)({},e)})));else{if(x.type===V.Wall){var b=x,T=new We.Vector2(b.leftPoint[0],b.leftPoint[1]),P=new We.Vector2(b.rightPoint[0],b.rightPoint[1]);$.current.set(x.id,[T,P])}G.current.set(x.id,new We.Vector3(x.cx,x.cy,x.cz))}}}catch(Xe){m.e(Xe)}finally{m.f()}}if(u.type===V.Foundation){var S=ot(u.id);if(S.length>0){var H,j=Object(h.a)(S);try{for(j.s();!(H=j.n()).done;){var z=H.value,R=new We.Vector3(z.cx,z.cy);G.current.set(z.id,R)}}catch(Xe){j.e(Xe)}finally{j.f()}}}}switch(u.type){case V.Tree:ne.current=u.parentId,ae.current.set(u.lx,u.ly,u.lz);break;case V.Flower:case V.Human:ne.current=u.parentId;break;case V.Cuboid:if(Qf(u)&&u.parentId===xt&<(a,u),ce.current=u.parentId,Xw.getState().moveHandleType){var W=Ww.getWorldDataById(u.id).rot,M=new We.Euler(0,0,W);switch(Xw.getState().moveHandleType){case B.Right:be.current.set(-u.lx/2,0,0).applyEuler(M);break;case B.Left:be.current.set(u.lx/2,0,0).applyEuler(M);break;case B.Lower:be.current.set(0,u.ly/2,0).applyEuler(M);break;case B.Upper:be.current.set(0,-u.ly/2,0).applyEuler(M);break;default:be.current.set(0,0,0)}}se.current.clear();var I=Ww.getWorldDataById(u.id),C=I.pos,F=I.rot,k=new We.Vector3(C.x,C.y,C.z),O=l(u.id);if(O.length>0){var Y,N=Object(h.a)(O);try{for(N.s();!(Y=N.n()).done;){var J=Y.value;switch(J.type){case V.Cuboid:var X=new We.Vector3(J.cx,J.cy,J.cz).applyEuler(new We.Euler(0,0,F));X.add(k),se.current.set(J.id,X);break;case V.Tree:case V.Flower:case V.Human:var q=new We.Vector3(J.cx,J.cy,J.cz).applyEuler(new We.Euler(0,0,F));q.add(k),se.current.set(J.id,q);break;case V.SolarPanel:case V.Light:case V.Sensor:if(Ww.isIdentical(J.normal,Tt)){var Z=new We.Vector3(J.cx*u.lx,J.cy*u.ly,J.cz*u.lz).applyEuler(new We.Euler(0,0,F));Z.add(k),se.current.set(J.id,Z)}break;case V.Polygon:if(Ww.isIdentical(J.normal,Tt)){var _,ee=J,te=[],le=Object(h.a)(ee.vertices);try{for(le.s();!(_=le.n()).done;){var oe=_.value,re=new We.Vector2(oe.x*u.lx,oe.y*u.ly).rotateAround(Dt,F);re.add(new We.Vector2(k.x,k.y)),te.push(re)}}catch(Xe){le.e(Xe)}finally{le.f()}de.current.set(ee.id,te)}}}}catch(Xe){N.e(Xe)}finally{N.f()}}break;case V.Foundation:Qf(u)&<(a,u),se.current.clear(),de.current.clear(),ue.current.clear();var ge=new We.Vector2(u.cx,u.cy),me=new We.Vector3(u.cx,u.cy,u.cz),we=l(u.id);if(we.length>0){var xe,ve=u.rotation[2],Ae=Object(h.a)(we);try{for(Ae.s();!(xe=Ae.n()).done;){var Te=xe.value;switch(Te.type){case V.Wall:var Se=Te,He=new We.Vector2(Se.cx,Se.cy).rotateAround(Dt,ve);He.add(ge);var je=new We.Vector2(Se.leftPoint[0],Se.leftPoint[1]).rotateAround(Dt,ve);je.add(ge);var ze=new We.Vector2(Se.rightPoint[0],Se.rightPoint[1]).rotateAround(Dt,ve);ze.add(ge),ue.current.set(Se.id,{centerPointAbsPos:He,leftPointAbsPos:je,rightPointAbsPos:ze});break;case V.Tree:case V.Flower:case V.Human:var Re=new We.Vector3(Te.cx,Te.cy,Te.cz).applyEuler(new We.Euler(0,0,ve));Re.add(me),se.current.set(Te.id,Re);break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var De=new We.Vector3(Te.cx*u.lx,Te.cy*u.ly,Te.cz*u.lz).applyEuler(new We.Euler(0,0,ve));De.add(me),se.current.set(Te.id,De);break;case V.Polygon:var Me,Ie=Te,Ce=[],Fe=Object(h.a)(Ie.vertices);try{for(Fe.s();!(Me=Fe.n()).done;){var ke=Me.value,Oe=new We.Vector2(ke.x*u.lx,ke.y*u.ly).rotateAround(Dt,ve);Oe.add(ge),Ce.push(Oe)}}catch(Xe){Fe.e(Xe)}finally{Fe.f()}de.current.set(Ie.id,Ce)}}}catch(Xe){Ae.e(Xe)}finally{Ae.f()}}var Ye=ot(u.id);if(Ye.length>0){var Le,Ne=new We.Euler(0,0,u.rotation[2]),Ue=Object(h.a)(Ye);try{for(Ue.s();!(Le=Ue.n()).done;){var Ve=Le.value;if(Ve.type===V.Window){var Je=new We.Vector3(Ve.cx,Ve.cy).applyEuler(Ne);Je.add(me),se.current.set(Ve.id,Je)}else{var Ge=new We.Vector3(Ve.cx*u.lx,Ve.cy*u.ly).applyEuler(Ne);Ge.add(me),se.current.set(Ve.id,Ge)}}}catch(Xe){Ue.e(Xe)}finally{Ue.f()}}}}}}},onPointerMove:function(t){var l;if(U.current&&U.current.type&&!U.current.locked)switch(Ee(t),U.current.type){case V.Foundation:N.current&&(l=Pe.intersectObjects([N.current])).length>0&&(T?ht(l[0].point):P?ut(l[0].point):S&&ft(l[0].point));break;case V.Cuboid:if(N.current&&Re===Z.Horizontal&&(l=Pe.intersectObjects([N.current])).length>0){var o=l[0].point.clone(),i=nt(t,U.current.id);if(T)if(we.current.size>1)ht(o);else if(i){if(0===(l=Pe.intersectObjects([i.eventObject])).length)return;o.copy(l[0].point).add(be.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=Ww.getWorldDataById(r),i=a.pos,n=a.rot,c=(new We.Vector3).subVectors(o,i);if(c.applyEuler(new We.Euler(0,0,-n)),t.cx=c.x,t.cy=c.y,l.parentId!==r){t.parentId!==r&&rt(e,t.id);var s=Ww.getWorldDataById(l.id).rot;t.rotation[2]=s-n,t.parentId=r}else t.parentId!==r&&(t.parentId!==l.parentId&&rt(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===U.current.id}));if(t&&t.parentId!==xt){t.parentId!==xt&&rt(e,t.id);var l=Ww.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),ht(o);else if(P){var s=c(U.current.id);s&&s.parentId===xt&&ut(o)}}}if(L.current){if(A!==V.None){Ee(t);var d=Pe.intersectObjects([L.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})),U.current=f,fe.current=!0);break;case V.Cuboid:var h=n(D,u);h&&(e((function(e){e.addedCuboidId=h.id,e.objectTypeToAdd=V.None})),U.current=h,pe.current=!0)}}}if(U.current&&(fe.current||pe.current)){Ee(t);var p=Pe.intersectObjects([L.current]);if(0===p.length)return;var y=p[0].point;if(U.current.type===V.Foundation)a(U.current.id,y.x,y.y);else if(U.current.type===V.Cuboid){var g=nt(t,U.current.id);if(g){if(0===(p=Pe.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=U.current)||void 0===t?void 0:t.id)}));if(t){var l=Ww.getWorldDataById(m),a=l.pos,o=l.rot,i=(new We.Vector3).subVectors(y,a);i.applyEuler(new We.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=U.current)||void 0===t?void 0:t.id)}));if(t&&t.parentId!==xt){var l=Ww.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),a(U.current.id,y.x,y.y)}}}},children:I&&!R?Object(pf.jsx)("meshBasicMaterial",{color:z}):Object(pf.jsx)("meshStandardMaterial",{depthTest:!1,color:R?"white":z,map:R?Ww.WATER_TEXTURE:Ww.WHITE_TEXTURE,needsUpdate:!0})})]})},Lv=n.a.memo(Yv),Nv=function(e){var t,l,a,i=e.date,n=e.hourAngle,c=e.declinationAngle,s=e.worldLatitude,f=Xw(Kr),p=Xw(o.showSunAngles),y=null===(t=Xw(o.showAzimuthAngle))||void 0===t||t,g=null===(l=Xw(o.showElevationAngle))||void 0===l||l,m=null===(a=Xw(o.showZenithAngle))||void 0===a||a,w=Object(r.useState)(Ww.toRadians(42)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(Ly.a)(Ny),T=Math.max(2,.2*f),P=Math.max(.4,.025*f),S=Object(Se.e)(We.FontLoader,cy),H=.05*f,j={font:S,height:0,size:H},z=new Array(13).fill(0);Object(r.useEffect)((function(){b(Ww.toRadians(s))}),[s]);var R=Object(r.useMemo)((function(){for(var e=new We.BufferGeometry,t=new We.BufferGeometry,l=[],a=[],o=bt/72,i=0,r=0;rAt&&(c=.05*f+(i%3===0?.2:0),(s=new We.Vector3(f,n,0)).z=.002,a.push(Ww.sphericalToCartesianZ(s)),(s=new We.Vector3(f+c,n,0)).z=.002,a.push(Ww.sphericalToCartesianZ(s))),i++}for(var d=3*l.length,u=new Float32Array(d),h=new Float32Array(d),p=new Float32Array(d),y=0;y-.01&&e.push(n)}return e}),[v,f,c]),C=function(e){for(var t=Ry(e),l=[],a=Dy(e,Ww.toDegrees(v)),o=My(a.sunrise),i=My(a.sunset),r=(i-o)/48,n=o;n-.01&&l.push(c)}return l},F=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,f]),k=Object(r.useMemo)((function(){return Cy(f,n,c,v)}),[v,c,n,f]),O=Object(r.useMemo)((function(){return k.clone().normalize()}),[k]),Y=Object(r.useMemo)((function(){return new We.Vector3(k.x,k.y,0).normalize()}),[k]),L=Object(r.useMemo)((function(){return Math.asin(k.z/k.length())}),[k]),N=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,T,T,0,L,!1,0).getPoints(25),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[L,k]),U=Object(r.useMemo)((function(){return Math.acos(k.z/k.length())}),[k]),E=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,.8*T,.8*T,L,vt,!1,0).getPoints(25),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[U,k]),V=Object(r.useMemo)((function(){var e=Math.acos(k.y/Math.hypot(k.x,k.y));return k.x>0?-e:e}),[k]),J=Object(r.useMemo)((function(){var e,t=new We.EllipseCurve(0,0,1.2*T,1.2*T,vt,vt+V,k.x>0,0).getPoints(50),l=new Array,a=Object(h.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new We.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[V,k]),G=Object(r.useMemo)((function(){for(var e=2*jy/12,t=bt/48,l=new We.BufferGeometry,a=0,o=[],i=[],r=-jy;rMath.PI&&(c=Math.PI),s>jy&&(s=jy);var d=Cy(f,n,r,v),u=Cy(f,c,r,v),h=Cy(f,c,s,v),p=Cy(f,n,s,v);(d.z>=0||u.z>=0||h.z>=0||p.z>=0)&&(o.push(d,u,h,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 We.BufferAttribute(new Uint16Array(i),1)),l}),[v,f]),X=.05*f,B=2+5*X;return Object(pf.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*-H:e>0&&e<7?.8*-H:1.2*-H}(Math.abs(l));return Object(pf.jsx)("group",{rotation:[vt,l*Math.PI/6,0],children:Object(pf.jsxs)("mesh",{position:[a,0,1.1*-f],rotation:[-vt,0,0],children:[Object(pf.jsx)("textGeometry",{args:["".concat(-30*l,"\xb0"),j]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)})),Object(pf.jsxs)("mesh",{rotation:new We.Euler(0,0,0),name:"Heliodon",children:[Object(pf.jsxs)("mesh",{children:[Object(pf.jsx)("bufferGeometry",Object(d.a)({},W)),Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-.7,polygonOffsetUnits:-2})]}),Object(pf.jsxs)("lineSegments",{children:[Object(pf.jsx)("bufferGeometry",Object(d.a)({},M)),Object(pf.jsx)("meshBasicMaterial",{color:0})]}),Object(pf.jsxs)("mesh",{children:[I.length>3&&Object(pf.jsx)(Jl.a,{lineWidth:2,points:I,color:"yellow"}),F.filter((function(e){return e.length>3})).map((function(e,t){return Object(pf.jsx)(Jl.a,{opacity:0===t||6===t?1:.5,lineWidth:0===t||6===t?1:.5,points:e,color:"#999"},t)})),Object(pf.jsx)("mesh",{args:[G],children:Object(pf.jsx)("meshBasicMaterial",{side:We.DoubleSide,color:[1,1,0],transparent:!0,opacity:.5,depthWrite:!1,clippingPlanes:[new We.Plane(jt,0)]})}),Object(pf.jsx)("mesh",{position:k,children:Object(pf.jsx)("sprite",{scale:[B,B,B],children:Object(pf.jsx)("spriteMaterial",{map:A,transparent:!1,color:16777215,blending:We.AdditiveBlending,depthWrite:!1})})}),Object(pf.jsxs)("mesh",{position:k,children:[Object(pf.jsx)("sphereGeometry",{args:[X,10,10]}),Object(pf.jsx)("meshBasicMaterial",{color:"white"})]})]})]}),Object(pf.jsx)(Lt.f,{args:[1e4,1e4],renderOrder:-1,userData:{unintersectable:!0},children:Object(pf.jsx)("meshBasicMaterial",{transparent:!0,opacity:0})}),p&&k.z>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[k.x,k.y,k.z]],name:"Line from origin to sun",lineWidth:.5,color:"white"}),Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[k.x,k.y,0]],name:"Line from origin to sun projection on ground",lineWidth:.5,color:"white"}),Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[k.x,k.y,0],[k.x,k.y,k.z]],name:"Line from sun projection on ground to sun",lineWidth:.5,color:"white"}),g&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:N,position:[0,0,0],rotation:new We.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Elevation Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Elevation Angle",backgroundColor:"indigo",text:Ww.toDegrees(L).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:O.clone().multiplyScalar(T).add(Y.clone().multiplyScalar(T)).multiplyScalar(.65)})]}),m&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:E,position:[0,0,0],rotation:new We.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Zenith Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Zenith Angle",backgroundColor:"navy",text:Ww.toDegrees(U).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:O.clone().multiplyScalar(T).add(Rt.clone().multiplyScalar(T)).multiplyScalar(.57)})]}),y&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:J,position:[0,0,0],color:"white",name:"Azimuth Angle Arc"}),Object(pf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Azimuth Angle",backgroundColor:"firebrick",text:Ww.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(jt.clone().multiplyScalar(T)).multiplyScalar(1.1).add(new We.Vector3(0,0,P/2))})]})]})]})},Uv=n.a.memo(Nv),Ev=function(){var e=Xw(o.heliodon),t=Xw(Kr),l=Xw(i.latitude),a=Xw(i.date),n=Xw(Ns),c=Object(r.useMemo)((function(){return new Date(a)}),[a]),s=Object(r.useMemo)((function(){return[Wy(c),Ry(c)]}),[c]),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(r.useEffect)((function(){n(Cy(t,f,h,Ww.toRadians(l)))}),[l,f,h,t]),Object(pf.jsx)(pf.Fragment,{children:e&&Object(pf.jsx)(Uv,{date:new Date(a),hourAngle:f,declinationAngle:h,worldLatitude:l})})},Vv=n.a.memo(Ev),Jv=l.p+"static/media/ifi-logo.eb360016.png",Gv=l(536),Xv=l.n(Gv),Bv=l(537),Kv=l.n(Bv),qv=l(538),Qv=l.n(qv),Zv=l(539),_v=l.n(Zv),$v=l(540),eb=l.n($v),tb=l(183),lb=l(834),ab=l(214),ob=l(833),ib=l(842),rb=l(296),nb=l(297),cb=l.p+"static/media/magic-lamp.b58f942d.png",sb=(l(217),function(e){var t=e.top,l=e.height,a=e.color,o=Xw(Vi),i=Object(r.useMemo)((function(){return{lng:o}}),[o]),n=t+56+"px",c=t+100+"px",s=t+205+"px";return Object(pf.jsxs)("div",{children:[Object(pf.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(pf.jsx)("h2",{style:{marginTop:"20px",color:a},children:me.t("aboutUs.ProductBroughtToYouBy",i)}),Object(pf.jsxs)("p",{style:{fontSize:"12px",color:a},children:[Object(pf.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(pf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",style:{color:a},children:me.t("aboutUs.PrivacyPolicy",i)})]})]}),Object(pf.jsxs)("div",{children:[Object(pf.jsx)("hr",{style:{position:"absolute",left:"10%",width:"80%",marginTop:n,color:a}}),Object(pf.jsx)("table",{style:{position:"absolute",border:"none",top:c,left:"10%",width:"80%",fontSize:"small",color:a},children:Object(pf.jsx)("tbody",{children:Object(pf.jsxs)("tr",{style:{verticalAlign:"top"},children:[Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Software",i)}),"Charles Xie",Object(pf.jsx)("br",{}),"Xiaotong Ding",Object(pf.jsx)("br",{})]}),Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Content",i)}),"Rundong Jiang",Object(pf.jsx)("br",{}),"Charles Xie",Object(pf.jsx)("br",{})]}),Object(pf.jsxs)("td",{children:[Object(pf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Support",i)}),"Rundong Jiang",Object(pf.jsx)("br",{}),"Charles Xie",Object(pf.jsx)("br",{})]})]})})})]}),Object(pf.jsxs)("div",{style:{position:"absolute",left:"10%",marginRight:"10%",top:s,fontSize:"smaller",textAlign:"justify",color:a},children:[me.t("aboutUs.Translators",i),": ",E.Ukrainian," (Andriy Kashyrskyy), ",E.Spanish," (Alex Barco), ",E.Turkish," (Hasan Bircan)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("aboutUs.Acknowledgment",i),": ",me.t("aboutUs.FundingInformation",i)," ",me.t("aboutUs.Contact",i)]})]})}),db=n.a.memo(sb),ub=Tv.a.div(rv||(rv=Object(Av.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"]))),fb=function(e){var t=e.close,l=Xw(Vi);return Object(pf.jsxs)(ub,{children:[Object(pf.jsx)(db,{top:10,color:"antiquewhite"}),Object(pf.jsx)("div",{style:{position:"absolute",fontSize:"small",color:"antiquewhite",cursor:"pointer",bottom:"10px"},onMouseDown:function(){t()},children:me.t("word.Close",{lng:l})})]})},hb=n.a.memo(fb),pb=l(232),yb=l(231),gb=function(e){var t=e.name,l=Xw(si),a=Xw(Vi),o=Xw(i.cspTimesPerHour),r=Xw(i.cspDaysPerYear),n=Xw(i.cspGridCellSize),c={lng:a},s=tb.a.SubMenu,d=yb.a.Option;return Object(pf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==o&&void 0!==o?o:4,onChange:function(e){l((function(t){t.world.cspTimesPerHour=e}))},children:[Object(pf.jsx)(d,{value:1,children:"1"},1),Object(pf.jsx)(d,{value:2,children:"2"},2),Object(pf.jsx)(d,{value:3,children:"3"},3),Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12),Object(pf.jsx)(d,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},t+"-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==r&&void 0!==r?r:6,onChange:function(e){l((function(t){t.world.cspDaysPerYear=e})),Af.setState((function(e){e.yearlyParabolicTroughYield=[],e.yearlyParabolicDishYield=[],e.yearlyFresnelReflectorYield=[],e.yearlyHeliostatYield=[]}))},children:[Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},t+"-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},t+"-simulation-grid-cell-size")]})},t+"-analysis-options")},mb=function(){var e=Xw(si),t=Xw.getState().elements,l=Xw(Vi),a=Xw(i.timesPerHour),o=Xw(i.daysPerYear),r=Xw(i.pvGridCellSize),n=Xw(i.discretization),c=Xw(i.noAnimationForSolarPanelSimulation),s={lng:l},d=tb.a.SubMenu,u=yb.a.Option;return Object(pf.jsx)(d,{title:me.t("menu.solarPanel.EnergyAnalysisOptions",s),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",s)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(pf.jsx)(u,{value:1,children:"1"},1),Object(pf.jsx)(u,{value:2,children:"2"},2),Object(pf.jsx)(u,{value:3,children:"3"},3),Object(pf.jsx)(u,{value:4,children:"4"},4),Object(pf.jsx)(u,{value:6,children:"6"},6),Object(pf.jsx)(u,{value:12,children:"12"},12),Object(pf.jsx)(u,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",s)})]},"solar-panel-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.daysPerYear=t})),Af.setState((function(e){e.yearlyPvYield=[]}))},children:[Object(pf.jsx)(u,{value:4,children:"4"},4),Object(pf.jsx)(u,{value:6,children:"6"},6),Object(pf.jsx)(u,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",s)})]},"solar-panel-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.PanelDiscretization",s)+":"}),Object(pf.jsxs)(yb.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(pf.jsx)(u,{value:ae.EXACT,children:me.t("menu.solarPanel.Exact",s)},ae.EXACT),Object(pf.jsx)(u,{value:ae.APPROXIMATE,children:me.t("menu.solarPanel.Approximate",s)},ae.APPROXIMATE)]})]},"solar-panel-discretization"),(!n||n===ae.APPROXIMATE)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.EnergyGridCellSize",s)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",s)})]},"solar-panel-simulation-grid-cell-size"),!Ww.hasMovingParts(t)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.solarPanel.SolarPanelSimulationNoAnimation",s)+":"}),Object(pf.jsx)(ib.a,{checked:c,onChange:function(t){e((function(e){e.world.noAnimationForSolarPanelSimulation=t}))}})]},"solar-panel-simulation-no-animation")]})},"solar-panel-energy-analysis-options")},wb=function(){var e=Xw(si),t=Xw.getState().elements,l=Xw(Vi),a=Xw(i.sutTimesPerHour),o=Xw(i.sutDaysPerYear),r=Xw(i.sutGridCellSize),n=Xw(i.noAnimationForSolarUpdraftTowerSimulation),c={lng:l},s=tb.a.SubMenu,d=yb.a.Option;return Object(pf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.sutTimesPerHour=t}))},children:[Object(pf.jsx)(d,{value:1,children:"1"},1),Object(pf.jsx)(d,{value:2,children:"2"},2),Object(pf.jsx)(d,{value:3,children:"3"},3),Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12),Object(pf.jsx)(d,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},"sut-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.sutDaysPerYear=t})),Af.setState((function(e){e.yearlyUpdraftTowerYield=[]}))},children:[Object(pf.jsx)(d,{value:4,children:"4"},4),Object(pf.jsx)(d,{value:6,children:"6"},6),Object(pf.jsx)(d,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},"sut-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},"sut-simulation-grid-cell-size"),!Ww.hasMovingParts(t)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"320px"},children:me.t("menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation",c)+":"}),Object(pf.jsx)(ib.a,{checked:n,onChange:function(t){e((function(e){e.world.noAnimationForSolarUpdraftTowerSimulation=t}))}})]},"solar-updraft-tower-simulation-no-animation")]})},"sut-analysis-options")},xb=function(){var e=Xw(si),t=Xw(Vi),l=Xw(i.timesPerHour),a=Xw(i.daysPerYear),o=Xw(i.solarRadiationHeatmapGridCellSize),r={lng:t},n=tb.a.SubMenu,c=yb.a.Option;return Object(pf.jsx)(n,{title:me.t("menu.building.EnergyAnalysisOptions",r),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",r)+":"}),Object(pf.jsxs)(yb.a,{style:{width:"72px"},value:null!==l&&void 0!==l?l:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(pf.jsx)(c,{value:1,children:"1"},1),Object(pf.jsx)(c,{value:2,children:"2"},2),Object(pf.jsx)(c,{value:3,children:"3"},3),Object(pf.jsx)(c,{value:4,children:"4"},4),Object(pf.jsx)(c,{value:6,children:"6"},6),Object(pf.jsx)(c,{value:12,children:"12"},12),Object(pf.jsx)(c,{value:30,children:"30"},30)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",r)})]},"building-energy-simulation-sampling-frequency"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsxs)(yb.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(pf.jsx)(c,{value:4,children:"4"},4),Object(pf.jsx)(c,{value:6,children:"6"},6),Object(pf.jsx)(c,{value:12,children:"12"},12)]}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",r)})]},"building-energy-simulation-sampling-days"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.building.EnergyGridCellSize",r)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",r)})]},"building-energy-simulation-grid-cell-size")]})},"building-energy-analysis-options")},vb=l(421),bb=l(422),Ab=l(423),Tb=l(424),Pb=l(425),Sb=l(426),Hb=l(427),jb=l(428),zb=l(429),Rb=l(430),Db=l(431),Wb=l(432),Mb=l(433),Ib=l(434),Cb=l(435),Fb=l(436),kb=l(437),Ob=l(438),Yb=l(439),Lb=l(440),Nb=l(441),Ub=l(442),Eb=l(443),Vb=l(444),Jb=l(445),Gb=l(446),Xb=l(447),Bb=l(448),Kb=l(449),qb=l(450),Qb=l(451),Zb=l(452),_b=l(453),$b=l(454),eA=l(455),tA=l(456),lA=l(457),aA=l(458),oA=l(459),iA=l(460),rA=l(461),nA=l(462),cA=l(463),sA=l(464),dA=l(465),uA=l(466),fA=l(467),hA=l(468),pA=l(469),yA=l(470),gA=l(471),mA=l(472),wA=l(473),xA=l(474),vA=l(475),bA=l(476),AA=l(477),TA=l(478),PA=l(479),SA=l(480),HA=l(481),jA=l(482),zA=l(483),RA=l(484),DA=l(485),WA=l(486),MA=l(487),IA=l(488),CA=l(489),FA=l(490),kA=l(491),OA=l(492),YA=l(493),LA=l(494),NA=l(495),UA=l(496),EA=l(497),VA=l(498),JA=l(499),GA=l(500),XA=l(501),BA=l(502),KA=l(503),qA=l(504),QA=l(505),ZA=l(506),_A=l(507),$A=l(508),eT=l(509),tT=l(510),lT=l(511),aT=l(512),oT=l(513),iT=l(514),rT=l(515),nT=l(516),cT=l(517),sT=l(518),dT=l(519),uT=l(520),fT=l(521),hT=l(522),pT=l(523),yT=l(524),gT=l(525),mT=l(526),wT=l(527),xT=l(528),vT=l(529),bT=l(530),AT=l(531),TT=l(532),PT=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"}(nv||(nv={}));var ST,HT,jT,zT=function(e,t,l){if(0===t(V.Foundation))return{status:nv.NO_BUILDING};var a,o=!1,i=!1,r=void 0,n=Object(h.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=Ww.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:nv.AT_LEAST_ONE_BAD_NO_GOOD,buildingCompletion:r}:i&&o?{status:nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD}:{status:nv.OK}},RT=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))},DT=function(e,t,l,a){return t<0&&e.low>=l-a||t>0&&e.high<=l+a?0:t},WT=function(e,t,l,a,o,i){if(l===U.Sinusoidal)return.5*(e+t)-.5*(e-t)*Math.cos(Ay*(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)},MT=function(e,t,l){var a,o,i,r=e.getFullYear(),n=e.getMonth(),c=e.getDate(),s=Ww.daysOfMonth(n,r)/2;if(c11&&(o=0),i=(c-s)/(s+Ww.daysOfMonth(o,r)/2)}return{low:t[a]+(t[o]-t[a])*i,high:l[a]+(l[o]-l[a])*i}},IT=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(Ty/(2*o));return e>0?n-h*Math.exp(-p)*Math.cos(Ty*(t-30)-p):n-h*Math.exp(-p)*Math.cos(Math.PI+Ty*(t-30)-p)}(e,t,a,o,n,c)-Math.exp(-c*Math.sqrt(Ay/(2*n)))*r*Math.cos(Ay*(l-(i-720)-120))},CT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYFzg7lwVNoAAABpJJREFUWIWtV21sU9cZfs69vv5KHAdj4+XLJAKGi8pgi1IJUIJokWNA0G1CVTa1g1E2IiHG5wgpSJaqddI0gaam0BA0sR8U2mraj0xNCZB0a2EJCYkDjkNHK1U0iRKUYDv+ur6fZz+CjW2cNB59fh2d8973ec57znnOuQTfM44cOVKuStJPALgEQfjy/ba29+aLJ/MNHj1w4AUQUiOo6v33Wlr6QZ4NP3z48DIqCOtERakDpRtUVXVyHMeAUoAQSLK8o/XChX/mJcDj8ZimJyc/UlXVpdfrWVEUUepw2E6ePDnddPDg0oSi1MiStElR1Q2gdJVOp+MAQJZlyLKMSCSCxv37ocgy/trWFlhaVrbmnTNnxnJxaXJ1WiwWXWhqaouoqojH4yCEYPzbb99t3Lu3KhyPr+U4Tq/RaEBkGbKiIJFIpL6dmZnB9ldfRW1dHQDg/siI5YvPP78CoDYXF5vd0dzcvGR6etotCMIOSimT7NdqNKsJw5SrqqpJzlRV1aelJASRcBgvrVuH3+zbl+pf6XTC7/M5KioqdL7h4a55Bezbs+d3VFH+IUvSLxRZZtLHFEXJIEwHIQTRaBRVy5bhyLFj0GieFlan06GsvBwDfX21NdXVfQNe79c5BZw4caJY4Pl2hhCzJEk5ieYiT/A8zMXFON7cDLPZ/EyM1WYDx3G4099fv93l+uCL3t5Iciw1y9D09CGDXl8k5kEOAJIkgWFZHDh0CDabbc4499atWL9hg/WbsbHL6f0sAHg8Hls8Frssy7KeUrpgclVVwfM8Gvfvx5q1a78z/oez+6GyqrKSu+fzdQNPKhCYmjqq12rNc63xXIhEInitoQHr1q9fULzZbMYbu3fDqNef3Lt7twsAWI/HY4rMzHwoK4oun9nH43G4t2zBaw0NeYm22WxQVBUjfr97y7ZtFzWPxsePmwoLTdFYLGUkhJBZhyIEJM39km1JklBSWorajRsRDodRVFS0YAH+4WH8+7PPYLfbbaHHj/+sYVlWpECvJEnLrVartchshiiKs0eOUkiyDKqqoMk2pbNtScIf3n4blZWVOOXxLFhANBLB2Pj4N1UOx++1BsN4auCn27dfutrRQdOhqiqVJImKokgFQaCxWIxGo1EaiURoMBikVzs66NGDB2k+uNPfTxt27hxM8qZbMZO9CQkhGaai1WozxhdZLCBMhl8BACilSPA8+EQCsWgUi61WGI3G1BjLMCn/SRdA9Ho9Hj58iE/a21FaVoYXVq3CSqcTPM9Do9GA47gMIlmWc5Z5xO/HuZYWAEA4HMaxpqanx/TJLZlLADiOw0wohOvXroGqKja98gpWOp34+MoVDA4MoNzhQHFxMTa9/DKWr1iRkxwAeJ5HIBBAQUHB7MzSCLPPWYYASilYlkVhYSEAQK/XAwAEQcDk5CRCoRCCwSDsdvu8AhiGAcdxYFkWTPYSUZrxBsh5HedKqNVqYTAYIMvyM3shH6hZXpMhjxACWZYRj8fnvPmeF0l/ySlAFEX8oKQE1TU1IISA53kAs0vzfYECcy9BIpGA3W7HW6dOYWxsDLFYLPVRNBoFwzDPX5n5TgHLPn2flJeXp9o/37kTSysrcdfrxZDXC1EUn09EGlICWJY1Jp6UPBtWqxX1bjfq3W6MjY5mmFO+IAwDAqR2cSqTZfHinu6urh2PAwFsdrngcDhyJiivqMiLkFKacsFbN2/iX11dMBiNqRdyquaDXu/NH1dXX/2v32/t7+tzBgMB2JYsgclkmjP56Ogovrx/H676+oz+iYkJ9Pb0zHoBw8BYUIDrnZ34pL39UTAUeme509nU1dWVyKgAALS2tt4G8LN9b7658dqnn751u7fXVVtXh02bN8/73MoGx3EpUyswGtHZ0RFUKT1rKy199/Tp01Ppsc88ywFgwOt9eM/vv7Rm9erbPp/PMXjnzlI+HkdJSQn0BsN3VuDe0BC+evAArEYTpcBZY1HR661tbe09PT3xbK6cApIYHBr62uf3/231iy/67nq9VXeHhsoEQUBpaSm0Oh0mJibgHx6Gy+0GAHz14AE+unwZ3TduSDqdrs1kNO4609LyYW/aKzgb8/4bZmPPrl2/FBKJpgqH40dbt22DrCi43tmJ3zY2ovvGDfzn1i1VEMVL1kWL/vSXc+dGFpIzLwEA0N3dzV66ePHXKnB8scWyIumY4ZmZvxeZTH88e+GCN598eQtIwuPxsIFHj37FctxLvCi+f/78+Xv/T57/AZ0qJoUasIdnAAAAAElFTkSuQmCC",FT="data:image/png;base64,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",kT="data:image/png;base64,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",OT="data:image/png;base64,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",YT="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",LT="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",NT="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",UT="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=",ET="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",VT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA45JREFUeNq81z1oFGkcx/Hv8zIz7tutOFlzd8REK1FJ4REECxUtRLRIuQTERhDBxkotDKuFBtu8EHE8sRKEJCvxSCRoY5HWQsHGUo1YKHrxBRb3b/HcZrO4u5nZhBt4YIedmd/nefvPLoVCgSSH1hprLcZ4GJO6DuYOoOLea4zBWksQBIRhCJ0AtLaAKQ0PI5OTCBDFQWwIQCkN6NKFC4iIa+Pj8RAbAgDVEJ4EsRGApuFxEesFlC5ebB0eB7EeQKzwtRCdAhKFr0ZoTQTY9QBKw8PJw2vt1q0VhOkEULp0qX3A/fvIuXPIq1etrxkbQ5RyiCSAX8KXllzRmZxEpqaQN28QYxBAjh1rD60jtIkDaDrnxSJy6BCyd68LPXsWOXoUCQLk2rW1p8MhVATGtAM0HfaJCWT7duT5c6S/3wEAuXEDefky/ppwCB0p5ZlmgJZzPj2NHD+O7N5dD1cK2bIF+fYt2cIcHUWUMpG1genqCiEMC2suuA8fkIEBF+z7yOCgw5w/j1SryXdHDbF5c5cll+u6fvly+xtOnqz3fMcON/QDA8jXr51v0Zs3kXw+f0d7nv2ju7t9JXrxAnbtgsFBeP0apqfhzBlIpej42LYNlKr8Tk9Pn6eUjkZHW2v7+5H9+5F375BsFjl8GLl3D3n4sLPeP3iApNPM+X4mT19fL1p7RinbFPHjhxv2ffvc+ciIm4qnTx1gaqp+baUSLzyTYQ7IZTIZ6O3txfM8jAmMUioaG2u84e1bV3BOn3bnBw4gYegWpggyO+sQp04he/a4HdMqvFyuhwM0AILAB4xRSjcgnjxxPV5YQJ49c5+vXKl///kzcuJEfZGC2x3tel5bBw0A3/cxxqCUNUqxgrh61T10aQk5eBBJp5GPH+sFKpdrDK/ViMVF5Pv31uE1gMnn8ywvL6OUQkTQWkm1Wp179Ig/e3r4a+dOd/HQECwuQrEIR47A48cwMgJBAN3dsHUrFAquhSEsLIC18P49DA0x/+ULReDf1QDf938dAWtXXt9Ga6K7d5vP56dProeVSvMmgszMNO952ylYBQCwWhNNTCTfarOzSC7HPPBbq1oQB8B/P6ui8fH44eUykkoxD2TbFaO4gESIuOFJAbEQ5TKyaVO88E4AbREuXMUO7xTQFDEzUwvX2SQvpE4BK4jbt937IJXS82CyWmv+LwCA0lr/nU77/yjlZ92/5uSAnwMAiEe8AH0apNkAAAAASUVORK5CYII=",JT="data:image/png;base64,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",GT=l(563),XT=l(802),BT=l(803),KT=l(32),qT=l.n(KT),QT=l(534),ZT=l.n(QT),_T=yb.a.Option,$T=function(e){var t,l,a,o=e.setDialogVisible,i=Xw(si),n=Xw(Gi),c=Xw(Vi),s=Object(r.useState)(Xw.getState().modelType),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(null!==(t=Xw.getState().modelAuthor)&&void 0!==t?t:ZT()()),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(null!==(l=null!==(a=Xw.getState().modelLabel)&&void 0!==a?a:Xw.getState().cloudFile)&&void 0!==l?l:null),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Xw.getState().modelDescription),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],D=j[1],W=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(null),k=Object(r.useRef)(null),O=GT.a.TextArea,Y={lng:c};Object(r.useEffect)((function(){var e;null===(e=k.current)||void 0===e||e.focus()}),[]);return Object(pf.jsxs)(lb.a,{width:560,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){o(!1)},children:me.t("word.Cancel",Y)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:k,onClick:function(){bf.setState((function(e){e.publishOnModelsMapFlag=!0})),i((function(e){e.modelType=f,e.modelAuthor=g,e.modelLabel=v,e.modelDescription=P})),bf.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(pf.jsx)(qT.a,{disabled:!z,bounds:I,onStart:function(e,t){return function(e,t){if(F.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=F.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(pf.jsx)("div",{ref:F,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:me.t("shared.ModelType",Y)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:f,onChange:function(e){h(e)},children:[Object(pf.jsxs)(_T,{value:R.UNKNOWN,children:[Object(pf.jsx)("img",{alt:"Building",width:24,src:JT,style:{marginRight:"8px"}}),me.t("word.Unknown",Y)]},R.UNKNOWN),Object(pf.jsxs)(_T,{value:R.UNDER_CONSTRUCTION,children:[Object(pf.jsx)("img",{alt:"Building",width:24,src:VT,style:{marginRight:"8px"}}),me.t("word.UnderConstruction",Y)]},R.UNDER_CONSTRUCTION),Object(pf.jsxs)(_T,{value:R.RESIDENTIAL_BUILDING,children:[Object(pf.jsx)("img",{alt:"Residential Building",width:24,src:CT,style:{marginRight:"8px"}}),me.t("word.ResidentialBuilding",Y)]},R.RESIDENTIAL_BUILDING),Object(pf.jsxs)(_T,{value:R.COMMERCIAL_BUILDING,children:[Object(pf.jsx)("img",{alt:"Commercial Building",width:24,src:FT,style:{marginRight:"8px"}}),me.t("word.CommercialBuilding",Y)]},R.COMMERCIAL_BUILDING),Object(pf.jsxs)(_T,{value:R.SCHOOL_BUILDING,children:[Object(pf.jsx)("img",{alt:"School Building",width:24,src:kT,style:{marginRight:"8px"}}),me.t("word.SchoolBuilding",Y)]},R.SCHOOL_BUILDING),Object(pf.jsxs)(_T,{value:R.TOURIST_ATTRACTION,children:[Object(pf.jsx)("img",{alt:"Tourist Attraction",width:24,src:OT,style:{marginRight:"8px"}}),me.t("word.TouristAttraction",Y)]},R.TOURIST_ATTRACTION),Object(pf.jsxs)(_T,{value:R.PHOTOVOLTAIC,children:[Object(pf.jsx)("img",{alt:"Photovoltaic",width:24,src:YT,style:{marginRight:"8px"}}),me.t("word.Photovoltaic",Y)]},R.PHOTOVOLTAIC),Object(pf.jsxs)(_T,{value:R.PARABOLIC_DISH,children:[Object(pf.jsx)("img",{alt:"Parabolic Dish",width:24,src:LT,style:{marginRight:"8px"}}),me.t("shared.ParabolicDishElement",Y)]},R.PARABOLIC_DISH),Object(pf.jsxs)(_T,{value:R.PARABOLIC_TROUGH,children:[Object(pf.jsx)("img",{alt:"Parabolic Trough",width:24,src:NT,style:{marginRight:"8px"}}),me.t("shared.ParabolicTroughElement",Y)]},R.PARABOLIC_TROUGH),Object(pf.jsxs)(_T,{value:R.FRESNEL_REFLECTOR,children:[Object(pf.jsx)("img",{alt:"Fresnel Reflector",width:24,src:UT,style:{marginRight:"8px"}}),me.t("shared.FresnelReflectorElement",Y)]},R.FRESNEL_REFLECTOR),Object(pf.jsxs)(_T,{value:R.SOLAR_POWER_TOWER,children:[Object(pf.jsx)("img",{alt:"Heliostat",width:24,src:ET,style:{marginRight:"8px"}}),me.t("shared.HeliostatElement",Y)]},R.SOLAR_POWER_TOWER)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Publisher",Y),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:30,style:{width:"100%"},value:null!==g&&void 0!==g?g:"",onChange:function(e){m(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Label",Y),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:50,style:{width:"100%"},value:null!==v&&void 0!==v?v:"",onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){b(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",Y),":",Object(pf.jsx)("br",{}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",Y),": 200)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(O,{rows:5,maxLength:200,style:{width:"100%"},value:null!==P&&void 0!==P?P:"",onChange:function(e){S(e.target.value)}})})]})]})},eP=n.a.memo($T),tP=yb.a.Option,lP=function(e){var t,l=e.saveAs,a=e.setDialogVisible,o=Xw(si),i=Xw(Gi),n=Xw(Vi),c=Object(r.useState)(null!==(t=Xw.getState().projectInfo.type)&&void 0!==t?t:W.SOLAR_PANEL_ARRAY),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(Xw.getState().projectInfo.title),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(Xw.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}),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useRef)(null),D=GT.a.TextArea,M={lng:n};return Object(pf.jsxs)(lb.a,{width:560,visible:!0,title:Object(pf.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",M)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",M)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:function(){bf.setState((function(e){l?e.saveProjectFlag=!0:e.createProjectFlag=!0})),bf.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",M)},"OK")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!T,bounds:j,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(pf.jsx)("div",{ref:R,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:me.t("projectPanel.ProjectType",M)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(yb.a,{disabled:l,style:{width:"100%"},value:d,onChange:function(e){f(e)},children:Object(pf.jsx)(tP,{value:W.SOLAR_PANEL_ARRAY,children:me.t("projectPanel.SolarPanelArray",M)},W.SOLAR_PANEL_ARRAY)})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Title",M),":"]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(GT.a,{maxLength:50,style:{width:"100%"},value:null!==y&&void 0!==y?y:"",onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){g(e.target.value)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",M),":",Object(pf.jsx)("br",{}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",M),": 200)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:Object(pf.jsx)(D,{rows:5,maxLength:200,style:{width:"100%"},value:null!==x&&void 0!==x?x:"",onChange:function(e){v(e.target.value)}})})]})]})},aP=n.a.memo(lP),oP=l(34),iP=(l(336),l(337),function(){var e=Object(Nh.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:Xw.getState().language},e.next=3,oP.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)}}()),rP=function(e,t,l){var a={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:oP.a.firestore.FieldValue.arrayUnion(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},nP=function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))},cP=function(e,t,l){var a={timestamp:Date.now(),title:t,thumbnail:l};switch(e){case W.SOLAR_PANEL_ARRAY:var o=Xw.getState().world.latitude,i=Ww.countAllSolarPanels(),r=Ww.countAllSolarPanelDailyYields(),n=Ww.countAllSolarPanelYearlyYields(),c=Xw.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),Xw.getState().solarPanelArrayLayoutParams);break;case W.SOLAR_PANEL_TILT_ANGLE:}return a},sP=function(e,t){if(!t)return null;var l,a=[],o=Object(h.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value,r=Object(d.a)({},i);r.title=dP(e,i.title),r.timestamp=Date.now(),a.push(r)}}catch(n){o.e(n)}finally{o.f()}return a},dP=function(e,t){var l=t.lastIndexOf(" ");return e+t.substring(l)},uP=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()},fP=function(e,t,l,a){var o={lng:Xw.getState().language};oP.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&&oP.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)}))},hP=function(e,t,l,a,o){var i={lng:Xw.getState().language};return Xw.getState().undoManager.clear(),bf.setState((function(e){e.waiting=!0})),oP.a.firestore().collection("users").doc(e).collection(l?"designs":"files").doc(t).get().then((function(l){var r=l.data();if(r?Xw.getState().importContent(r,t):(Kh(me.t("message.CloudFileNotFound",i)+": "+t),Xw.getState().set((function(e){e.cloudFile=void 0})),bf.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),bf.setState((function(e){e.waiting=!1}))}))},pP=tb.a.SubMenu,yP={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},gP=Tv.a.div(ST||(ST=Object(Av.a)(["\n width: 100px;\n"]))),mP=Tv.a.img(HT||(HT=Object(Av.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"]))),wP=Tv.a.div(jT||(jT=Object(Av.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"]))),xP=function(e){var t=e.viewOnly,l=e.set2DView,a=e.resetView,n=e.zoomView,c=e.setNavigationView,s=e.canvas,p=Xw(si),y=bf(hf),g=Xw(ls),m=Xw(Bc),w=Xw(Kc),x=Xw(Hr),v=Xw(us),b=Xw(ss),A=Xw(tn),T=Xw(ds),P=Xw(is),S=Xw(Sr),H=bf(Ki),j=Xw.getState().loggable,z=Xw.getState().language,R=Xw.getState().floatingWindowOpacity,W=Xw.getState().undoManager,M=Xw(i.timesPerHour),I=Xw(i.solarPanelVisibilityGridCellSize),C=Xw(i.solarRadiationHeatmapGridCellSize),F=Xw(o.solarRadiationHeatmapMaxValue),k=Xw.getState().viewState.navigationView,O=Xw.getState().viewState.orthographic,Y=Xw.getState().viewState.autoRotate,L=Xw.getState().viewState.showSiteInfoPanel,N=Xw.getState().viewState.showDesignInfoPanel,U=Xw.getState().viewState.showInstructionPanel,J=Xw.getState().viewState.showMapPanel,X=Xw.getState().viewState.showWeatherPanel,B=Xw.getState().viewState.showDiurnalTemperaturePanel,K=bf.getState().showEconomicsPanel,q=bf.getState().showNavigationPanel,Q=Xw.getState().viewState.showStickyNotePanel,Z=Xw.getState().viewState.showHeliodonPanel,_=Xw.getState().viewState.shadowEnabled,$=Xw.getState().viewState.solarPanelShininess,ee=bf.getState().changed,te=Xw.getState().cloudFile,le=Xw.getState().user,ae=Xw.getState().viewState.axes,oe=Xw.getState().elementsToPaste,ie=bf.getState().runDynamicSimulation,re=bf.getState().runStaticSimulation,ne=Xw(i.noAnimationForHeatmapSimulation),ce=Xw(i.noAnimationForSensorDataCollection),se=Xw(o.solarRadiationHeatmapReflectionOnly),de=Xw.getState().elements,ue=Xw.getState().viewState.cameraPosition,fe=Xw.getState().viewState.panCenter,he=Xw.getState().selectedElement,pe=Xw.getState().projectInfo,ye=Xw.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],He=Object(r.useState)(!1),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De=Object(r.useState)(!1),We=Object(u.a)(De,2),Me=We[0],Ie=We[1],Ce=Object(r.useState)(!1),Fe=Object(u.a)(Ce,2),ke=Fe[0],Oe=Fe[1],Ye=Object(r.useMemo)((function(){return{lng:z}}),[z]),Le=Object(r.useMemo)((function(){return Ww.isMac()}),[]),Ne=Object(r.useMemo)((function(){var e=Ww.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=vb;break;case"insolation_and_climate":t=bb;break;case"solar_radiation_to_box":t=Ab;break;case"sun_beam_at_center":t=Tb;break;case"thermal_vs_building_envelope":t=PT;break;case"effect_house_size":t=pT;break;case"effect_house_orientation":t=yT;break;case"effect_wall_roof_insulation":t=gT;break;case"effect_roof_color":t=mT;break;case"effect_eaves_overhang_length":t=wT;break;case"effect_window_shgc":t=xT;break;case"effect_thermostat_setpoint":t=vT;break;case"effect_solar_panels":t=bT;break;case"effect_ground_temperature":t=AT;break;case"effect_trees":t=TT;break;case"office_building_01":t=uA;break;case"hotel_01":t=fA;break;case"spanish_style_hotel":t=hA;break;case"apartment_building_01":t=pA;break;case"white_house":t=sA;break;case"bilim_mersin_turkiye":t=dA;break;case"south_burlington_high_school":t=yA;break;case"mescalero_apache_school":t=gA;break;case"heatmap_01":t=mA;break;case"vegetative_buffer_01":t=HA;break;case"solar_canopy_form_factors":t=CA;break;case"solar_canopy_over_bleachers":t=FA;break;case"solar_bus_stop":t=kA;break;case"solar_facade_tesla":t=LA;break;case"solar_canopy_over_garage":t=YA;break;case"bipv_01":t=OA;break;case"floatovoltaics":t=NA;break;case"agrivoltaics":t=UA;break;case"effect_tilt_angle_solar_panel":t=jA;break;case"effect_azimuth_solar_panel":t=zA;break;case"effect_azimuth_parabolic_trough":t=RA;break;case"effect_latus_rectum_parabolic_trough":t=DA;break;case"parabolic_dish_focus_sunlight":t=GA;break;case"effect_orientation_solar_panel":t=WA;break;case"solar_panel_types":t=Pb;break;case"vertical_bifacial_solar_panels":t=Sb;break;case"compare_monofacial_bifacial_solar_panels":t=Hb;break;case"why_solar_array":t=MA;break;case"solar_panel_array_auto_layout":t=IA;break;case"inter_row_spacing":t=EA;break;case"rooftop_solar_panels":t=jb;break;case"solar_panels_over_canal":t=Ib;break;case"solar_noise_barrier":t=Mb;break;case"rainbow_swash_solar_farm":t=zb;break;case"mickey_mouse_solar_farm":t=Rb;break;case"solar_farm_hsat_array":t=Db;break;case"solar_farm_aadat_array":t=Wb;break;case"solar_trackers":t=Cb;break;case"nevada_solar_one_parabolic_troughs":t=JA;break;case"tooele_parabolic_dish_array":t=XA;break;case"ps10_solar_power_tower":t=VA;break;case"linear_fresnel_reflectors":t=BA;break;case"linear_fresnel_reflectors_two_absorbers":t=KA;break;case"effect_absorber_pipe_height":t=qA;break;case"effect_azimuth_fresnel_reflector":t=QA;break;case"cosine_efficiency_heliostats":t=ZA;break;case"shadowing_blocking_heliostats":t=_A;break;case"effect_solar_power_tower_height":t=$A;break;case"solar_power_tower":t=eT;break;case"solar_updraft_tower":t=rT;break;case"solar_updraft_tower_city":t=nT;break;case"cape_cod_with_shed_dormer":t=kb;break;case"mansard_roof_with_dormers":t=Ob;break;case"t_shaped_house":t=Yb;break;case"all_roof_types":t=Fb;break;case"a_frame_house":t=$b;break;case"half_timbered_house":t=eA;break;case"dutch_gable_roof":t=_b;break;case"combination_roof_vs_bonnet_roof":t=tA;break;case"butterfly_roof_house":t=lA;break;case"gable_roof_vs_hip_roof":t=aA;break;case"gable_and_valley_roof":t=oA;break;case"clerestory_roof":t=iA;break;case"monitor_roof":t=rA;break;case"colonial_vs_saltbox":t=nA;break;case"gambrel_roof_vs_mansard_roof":t=cA;break;case"colonial_house":t=Qb;break;case"dutch_colonial_house":t=Zb;break;case"cape_cod_with_garage":t=Lb;break;case"greenhouse":t=wA;break;case"solarium":t=Gb;break;case"pavilion":t=xA;break;case"octagonal_pagoda":t=vA;break;case"ocean_front":t=bA;break;case"mosque_01":t=Xb;break;case"church_01":t=Bb;break;case"cathedral_01":t=Kb;break;case"cathedral_02":t=qb;break;case"adobe_taos_house":t=Nb;break;case"egyptian_pyramids":t=AA;break;case"mayan_pyramid":t=TA;break;case"si_o_se_pol":t=PA;break;case"stacked_cuboids":t=SA;break;case"barn_house":t=Vb;break;case"ranch_house":t=Ub;break;case"bonnet_house":t=Eb;break;case"modern_house_01":t=Jb;break;case"solar_radiation_predicted_vs_measured":t=tT;break;case"bestest_case_600":t=lT;break;case"bestest_case_610":t=aT;break;case"bestest_case_620":t=oT;break;case"bestest_case_630":t=iT;break;case"tucson_sundt_station":t=cT;break;case"ai_tilt_angle_one_row":t=sT;break;case"ai_tilt_angles_multiple_rows":t=dT;break;case"ai_solar_farm_design":t=uT;break;case"ai_solar_farm_design_block":t=fT;break;case"ai_fitchburg_solar_farm":t=hT}return t}(e.key);l&&(bf.setState((function(e){e.openModelsMap=!1})),!t&&ee?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",Ye),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){return Je(l)},onCancel:function(){bf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)},okText:me.t("word.Yes",Ye),cancelText:me.t("word.No",Ye)}):(bf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)),j&&p((function(t){t.actionInfo={name:"Open Example: "+e.key,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Ee=function(e){p((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,l){var a="QWecNcxhyvP6j6sBN11hBsfZDau1";e&&(iP(a,e,Ee).then((function(){hP(a,e+" "+l,!0,!0,t).then((function(){}))})),bf.setState((function(e){e.openModelsMap=!1})),j&&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})),bf.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=Xw.getState().countAllElementsByType(),Ze=Object(pf.jsxs)(tb.a,{triggerSubMenuAction:"click",children:[!H&&Object(pf.jsxs)(pP,{title:me.t("menu.fileSubMenu",Ye),children:[!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){W.clear(),p((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,window.history.pushState({},document.title,Ge),j&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.CreateNewFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+F)"]})]},"create-new-file"),!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){W.clear(),p((function(e){e.openLocalFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.cloudFile=void 0,window.history.pushState({},document.title,Ge),j&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.OpenLocalFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+O)"]}),"..."]},"open-local-file"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.saveLocalFileDialogVisible=!0})),j&&p((function(e){e.actionInfo={name:"Save as Local File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveAsLocalFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+S)"]}),"..."]},"save-local-file"),le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),j&&p((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.OpenCloudFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+O)"]}),"..."]},"open-cloud-file"),le.uid&&te&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.getState().setSaveCloudFileFlag(!0),j&&p((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveCloudFile",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+S)"]})]},"save-cloud-file"),le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){p((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0,j&&(e.actionInfo={name:"Save as Cloud File",timestamp:(new Date).getTime()})}))},children:[me.t("menu.file.SaveAsCloudFile",Ye),"..."]},"save-as-cloud-file"),!t&&Object(pf.jsxs)(tb.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(pf.jsx)(tb.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")),j&&p((function(e){e.actionInfo={name:"Take Screenshot",timestamp:(new Date).getTime()}})),bf.setState((function(e){e.openModelsMap=!1})))},children:me.t("menu.file.TakeScreenshot",Ye)},"screenshot")]},"file"),!H&&!t&&le.uid&&Object(pf.jsxs)(pP,{title:me.t("menu.projectSubMenu",Ye),children:[Object(pf.jsxs)(tb.a.Item,{onClick:function(){le.uid?(Re(!0),bf.setState((function(e){e.openModelsMap=!1})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){le.uid?(bf.setState((function(e){e.showProjectsFlag=!0,e.openModelsMap=!1})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){Ie(!0),bf.setState((function(e){e.openModelsMap=!1})),j&&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||W.hasUndo()||W.hasRedo())&&!H&&Object(pf.jsxs)(pP,{title:me.t("menu.editSubMenu",Ye),children:[he&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){he&&(m(he.id),j&&p((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:he.id,elementType:he.type}})))},children:[me.t("word.Copy",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+C)"]})]},"copy"),he&&Object(pf.jsxs)(tb.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(Ww.ifNeedListenToAutoDeletion(e[0]))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(h.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(f){o.e(f)}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(h.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(f){d.e(f)}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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+X)"]})]},"cut"),Be&&Object(pf.jsxs)(tb.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(h.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(f.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0]}))}};S(t)}}},children:[me.t("word.Paste",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+V)"]})]},"paste"),W.hasUndo()&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(W.hasUndo()){var e=W.undo();e&&Kh(me.t("menu.edit.Undo",Ye)+": "+e,qe),j&&p((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Undo",Ye)+": "+W.getLastUndoName(),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Z)"]})]},"undo"),W.hasRedo()&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(W.hasRedo()){var e=W.redo();e&&Kh(me.t("menu.edit.Redo",Ye)+": "+e,qe),j&&p((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Redo",Ye)+": "+W.getLastRedoName(),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Y)"]})]},"redo")]},"edit"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.viewSubMenu",Ye),children:[!O&&!Xe&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){var e={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(f.a)(ue),oldPanCenter:Object(f.a)(fe),undo:function(){var t=Nt.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(f.a)(e.oldCameraPosition),l.panCenter=Object(f.a)(e.oldPanCenter)})))},redo:function(){a()}};S(e),a(),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.orthographic=!1}))},style:{paddingLeft:"36px"},children:[me.t("menu.view.ResetView",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Ne,")"]})]},"reset-view"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(1.1)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomOut",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+])"]})]},"zoom-out-view"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(.9)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomIn",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+[)"]})]},"zoom-in-view"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:k,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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Q)"]})]})},"navigation-view-check-box"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:O,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(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+B)"]})]})},"orthographic-check-box"),!O&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsxs)(ab.a,{checked:Y,onChange:function(){if(!O){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Y,undo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=!e.checked}))},redo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=e.checked}))}};S(e),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.autoRotate=!e.viewState.autoRotate}))}},children:[me.t("menu.view.AutoRotate",Ye),Object(pf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+M)"]})]})},"auto-rotate-check-box"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.settingsSubMenu",Ye),children:[!Z&&Object(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.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(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showEconomicsPanel=!0})),j&&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(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showNavigationPanel=!0})),j&&p((function(e){e.actionInfo={name:"Open Navigation Panel",timestamp:(new Date).getTime()}}))},children:[me.t("navigationPanel.NavigationParameters",Ye),"..."]},"navigation-panel-menu-item")]},"settings"),!H&&Object(pf.jsxs)(pP,{title:me.t("menu.view.accessoriesSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:N,onChange:function(){var e={name:"Show Design Information",timestamp:Date.now(),checked:!N,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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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"),!H&&Ke.gotSome()&&Object(pf.jsxs)(pP,{title:me.t("menu.analysisSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.physicsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:!ne||Ww.hasMovingParts(de)?function(){ie||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runDynamicSimulation",!ie),j&&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),j&&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(pf.jsx)(pP,{title:me.t("menu.physics.SolarRadiationHeatmapOptions",Ye),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapGridCellSize",Ye)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-radiation-heatmap-grid-cell-size"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapMaxValue",Ye)+":"}),Object(pf.jsx)(ob.a,{min:.5,max:50,step:.5,style:{width:60},precision:1,value:null!==F&&void 0!==F?F:5,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapMaxValue=e}))}})]},"solar-radiation-heatmap-max-value"),Ww.hasHeliostatOrFresnelReflectors(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.ReflectionHeatmap",Ye)+":"}),Object(pf.jsx)(ib.a,{checked:se,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapReflectionOnly=e}))}})]},"solar-radiation-heatmap-reflection-only"),!Ww.hasMovingParts(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapNoAnimation",Ye)+":"}),Object(pf.jsx)(ib.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(pf.jsxs)(pP,{title:me.t("menu.sensorSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){j&&p((function(e){e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(tb.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){j&&p((function(e){e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(pP,{title:me.t("word.Options",Ye),children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",Ye)+":"}),Object(pf.jsx)(ob.a,{min:1,max:60,step:1,style:{width:60},precision:0,value:M,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){p((function(t){t.world.timesPerHour=e}))}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",Ye)})]},"sensor-simulation-sampling-frequency"),!Ww.hasMovingParts(de)&&Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"280px"},children:me.t("menu.sensor.SensorSimulationNoAnimation",Ye)+":"}),Object(pf.jsx)(ib.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(pf.jsxs)(pP,{title:me.t("menu.buildingSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){var e=zT(de,b,A);if(e.status!==nv.NO_BUILDING)if(e.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),j&&p((function(e){e.actionInfo={name:"Analyze Daily Building Energy",timestamp:(new Date).getTime()}})),bf.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(pf.jsx)(tb.a.Item,{onClick:function(){var e=zT(de,b,A);if(e.status!==nv.NO_BUILDING)if(e.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),bf.setState((function(e){e.runYearlyThermalSimulation=!0,e.simulationInProgress=!0})),j&&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(pf.jsx)(xb,{})]},"buildings"),Ke.solarPanelCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.solarPanelSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(mb,{}),Object(pf.jsx)(tb.a.Item,{onClick:function(){0!==v()?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){bf.setState((function(e){e.runSolarPanelVisibilityAnalysis=!e.runSolarPanelVisibilityAnalysis,e.simulationInProgress=!0})),j&&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(pf.jsx)(pP,{title:me.t("menu.solarPanel.VisibilityAnalysisOptions",Ye),children:Object(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{paddingRight:"10px"},children:me.t("menu.solarPanel.VisibilityGridCellSize",Ye)+":"}),Object(pf.jsx)(ob.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(pf.jsx)(Pv.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(pf.jsxs)(pP,{title:me.t("menu.parabolicTroughSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"parabolic-trough"})]},"parabolic-trough"),Ke.parabolicDishCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.parabolicDishSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"parabolic-dish"})]},"parabolic-dish"),Ke.fresnelReflectorCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.fresnelReflectorSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"fresnel-reflector"})]},"fresnel-reflector"),Ke.heliostatCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.heliostatSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Heliostats",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Heliostats",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(gb,{name:"heliostat"})]},"heliostat"),Ke.solarUpdraftTowerCount>0&&Object(pf.jsxs)(pP,{title:me.t("menu.solarUpdraftTowerSubMenu",Ye),children:[Object(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Daily Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(tb.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),j&&(e.actionInfo={name:"Run Yearly Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.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(pf.jsx)(wb,{})]},"solar-updraft-tower")]},"analysis"),Object(pf.jsxs)(pP,{title:me.t("menu.tutorialsSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.solarEnergyScienceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SunAngles",Ye)},"sun_angles"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.InsolationAndClimate",Ye)},"insolation_and_climate"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SolarRadiationToBox",Ye)},"solar_radiation_to_box"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SunBeamAndHeliodon",Ye)},"sun_beam_at_center")]},"solar-energy-science"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingScienceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope",Ye)},"thermal_vs_building_envelope"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy",Ye)},"effect_house_size"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy",Ye)},"effect_house_orientation"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy",Ye)},"effect_wall_roof_insulation"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy",Ye)},"effect_roof_color"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy",Ye)},"effect_eaves_overhang_length"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy",Ye)},"effect_window_shgc"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy",Ye)},"effect_thermostat_setpoint"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy",Ye)},"effect_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy",Ye)},"effect_ground_temperature"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy",Ye)},"effect_trees")]},"building-science"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingDesignSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer",Ye)},"cape_cod_with_shed_dormer"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MansardRoofWithDormers",Ye)},"mansard_roof_with_dormers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableRoofVsHipRoof",Ye)},"gable_roof_vs_hip_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ColonialVsSaltbox",Ye)},"colonial_vs_saltbox"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GambrelRoofVsMansardRoof",Ye)},"gambrel_roof_vs_mansard_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof",Ye)},"combination_roof_vs_bonnet_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.DutchGableRoof",Ye)},"dutch_gable_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableAndValleyRoof",Ye)},"gable_and_valley_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ClerestoryRoof",Ye)},"clerestory_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MonitorRoof",Ye)},"monitor_roof"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AFrameHouse",Ye)},"a_frame_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.HalfTimberedHouse",Ye)},"half_timbered_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AllBasicRoofTypes",Ye)},"all_roof_types")]},"building-design"),Object(pf.jsxs)(pP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel",Ye)},"effect_tilt_angle_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel",Ye)},"effect_azimuth_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelTypes",Ye)},"solar_panel_types"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels",Ye)},"vertical_bifacial_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels",Ye)},"compare_monofacial_bifacial_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarTrackers",Ye)},"solar_trackers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels",Ye)},"why_solar_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray",Ye)},"inter_row_spacing"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels",Ye)},"effect_orientation_solar_panel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout",Ye)},"solar_panel_array_auto_layout"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RooftopSolarPanels",Ye)},"rooftop_solar_panels"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyFormFactors",Ye)},"solar_canopy_form_factors"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics",Ye)},"bipv_01")]},"photovoltaic-solar-power"),Object(pf.jsxs)(pP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish",Ye)},"parabolic_dish_focus_sunlight"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough",Ye)},"effect_azimuth_parabolic_trough"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough",Ye)},"effect_latus_rectum_parabolic_trough"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectors",Ye)},"linear_fresnel_reflectors"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors",Ye)},"effect_absorber_pipe_height"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors",Ye)},"effect_azimuth_fresnel_reflector"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers",Ye)},"linear_fresnel_reflectors_two_absorbers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.SolarPowerTower",Ye)},"solar_power_tower"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats",Ye)},"cosine_efficiency_heliostats"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats",Ye)},"shadowing_blocking_heliostats"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight",Ye)},"effect_solar_power_tower_height")]},"concentrated-solar-power"),Object(pf.jsx)(pP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower",Ye)},"solar_updraft_tower")},"other-types-of-solar-power"),Object(pf.jsxs)(pP,{title:me.t("menu.generativeDesignSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,48)},children:me.t("menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle",Ye)},"Tilt Angle"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,50)},children:me.t("menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle",Ye)},"Bifacial Tilt Angle"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces",Ye)},"Latitude"),Object(pf.jsx)(tb.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.SimpleSolarFarmParetoFront",Ye)},"Pareto Front")]},"generative-design")]},"tutorials"),Object(pf.jsxs)(pP,{title:me.t("menu.examplesSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.solarEnergySubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.VegetativeBuffer",Ye)},"vegetative_buffer_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverBleachers",Ye)},"solar_canopy_over_bleachers"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverGarage",Ye)},"solar_canopy_over_garage"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarBusStop",Ye)},"solar_bus_stop"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarFacadeTesla",Ye)},"solar_facade_tesla"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Floatovoltaics",Ye)},"floatovoltaics"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Agrivoltaics",Ye)},"agrivoltaics"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA",Ye)},"rainbow_swash_solar_farm"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL",Ye)},"mickey_mouse_solar_farm"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA",Ye)},"solar_panels_over_canal"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA",Ye)},"solar_noise_barrier"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.HSATSolarTrackersRaleighNC",Ye)},"solar_farm_hsat_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.AADATSolarTrackersLancasterCA",Ye)},"solar_farm_aadat_array")]},"photovoltaic-solar-power-examples"),Object(pf.jsxs)(pP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray",Ye)},"nevada_solar_one_parabolic_troughs"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TooeleParabolicDishArray",Ye)},"tooele_parabolic_dish_array"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TucsonLinearFresnelReflectors",Ye)},"tucson_sundt_station"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.PS10SolarPowerTower",Ye)},"ps10_solar_power_tower")]},"concentrated-solar-power-examples"),Object(pf.jsx)(pP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarUpdraftTowerInCity",Ye)},"solar_updraft_tower_city")},"other-types-of-solar-power-examples")]},"solar-energy"),Object(pf.jsxs)(pP,{title:me.t("menu.builtEnvironmentSubMenu",Ye),children:[Object(pf.jsxs)(pP,{title:me.t("menu.residentialBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ColonialHouse",Ye)},"colonial_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.DutchColonialHouse",Ye)},"dutch_colonial_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.TShapedHouse",Ye)},"t_shaped_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.CapeCodHouseWithGarage",Ye)},"cape_cod_with_garage"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Solarium",Ye)},"solarium"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ButterflyRoofHouse",Ye)},"butterfly_roof_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.AdobeTaosHouse",Ye)},"adobe_taos_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.RanchHouse",Ye)},"ranch_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BonnetHouse",Ye)},"bonnet_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BarnStyleHouse",Ye)},"barn_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ModernHouse",Ye)},"modern_house_01")]},"residential_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.commercialBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.WhiteHouse",Ye)},"white_house"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.BilimMersinTurkiye",Ye)},"bilim_mersin_turkiye"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.SpanishStyleHotel",Ye)},"spanish_style_hotel"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.ApartmentBuilding",Ye)},"apartment_building_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.OfficeBuilding",Ye)},"office_building_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.Hotel",Ye)},"hotel_01")]},"commercial_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.otherBuildingsSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Greenhouse",Ye)},"greenhouse"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Church1",Ye)},"church_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral1",Ye)},"cathedral_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral2",Ye)},"cathedral_02"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Mosque1",Ye)},"mosque_01"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Pavilion",Ye)},"pavilion"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OctagonalPagoda",Ye)},"octagonal_pagoda"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OceanFront",Ye)},"ocean_front"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.EgyptianPyramids",Ye)},"egyptian_pyramids"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.MayanPyramid",Ye)},"mayan_pyramid"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.SiOSePol",Ye)},"si_o_se_pol"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.StackedCuboids",Ye)},"stacked_cuboids")]},"other_buildings"),Object(pf.jsxs)(pP,{title:me.t("menu.buildingComplexesSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont",Ye)},"south_burlington_high_school"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico",Ye)},"mescalero_apache_school")]},"building_complexes"),Object(pf.jsx)(pP,{title:me.t("menu.urbanPlanningSubMenu",Ye),children:Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.urbanPlanningExamples.Heatmap1",Ye)},"heatmap_01")},"urban_planning")]},"built-environment"),Object(pf.jsxs)(pP,{title:me.t("menu.artificialIntelligenceSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow",Ye)},"ai_tilt_angle_one_row"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows",Ye)},"ai_tilt_angles_multiple_rows"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign",Ye)},"ai_solar_farm_design"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock",Ye)},"ai_solar_farm_design_block"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign",Ye)},"ai_fitchburg_solar_farm")]},"artificial-intelligence"),Object(pf.jsxs)(pP,{title:me.t("menu.benchmarksSubMenu",Ye),children:[Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.SolarRadiationPredictionVsMeasurement",Ye)},"solar_radiation_predicted_vs_measured"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase600",Ye)},"bestest_case_600"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase610",Ye)},"bestest_case_610"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase620",Ye)},"bestest_case_620"),Object(pf.jsx)(tb.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase630",Ye)},"bestest_case_630")]},"benchmarks")]},"examples"),Object(pf.jsxs)(pP,{title:me.t("menu.publicSubMenu",Ye),children:[le.uid&&!t&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showModelsGallery=!0,e.leaderboardFlag=!0,e.openModelsMap=!1}))},children:[me.t("menu.ModelsGallery",Ye),"..."]},"my-models"),!H&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.openModelsMap=!0,e.showModelsGallery=!1})),j&&p((function(e){e.actionInfo={name:"Open Models Map",timestamp:(new Date).getTime()}}))},children:[me.t("menu.ModelsMap",Ye),"..."]},"models-map")]},"public"),Object(pf.jsx)(pP,{title:me.t("menu.languageSubMenu",Ye),children:Object(pf.jsxs)(rb.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=Xv.a;break;case"zh_tw":t.locale=Kv.a;break;case"es":t.locale=Qv.a;break;case"tr":t.locale=_v.a;break;case"ua":t.locale=eb.a;break;default:t.locale=xe.a}}))},children:[Object(pf.jsx)(rb.a,{style:yP,value:"en",children:E.English}),Object(pf.jsx)(rb.a,{style:yP,value:"es",children:E.Spanish}),Object(pf.jsx)(rb.a,{style:yP,value:"zh_cn",children:E.ChineseSimplified}),Object(pf.jsx)(rb.a,{style:yP,value:"zh_tw",children:E.ChineseTraditional}),Object(pf.jsx)(rb.a,{style:yP,value:"tr",children:E.Turkish}),Object(pf.jsx)(rb.a,{style:yP,value:"ua",children:E.Ukrainian})]})},"language"),Object(pf.jsxs)(tb.a.Item,{onClick:function(){be(!0)},children:[me.t("menu.AboutUs",Ye),"..."]},"about")]});return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(nb.a,{overlay:Ze,trigger:["click"],onVisibleChange:function(e){e&&Oe(!ke)},children:Object(pf.jsxs)(gP,{children:[Object(pf.jsx)(mP,{src:cb,title:me.t("tooltip.clickToOpenMenu",Ye)}),Object(pf.jsx)(wP,{children:Object(pf.jsx)("span",{style:{fontSize:"10px",alignContent:"center",cursor:"pointer"},children:me.t("menu.mainMenu",Ye)})})]})}),ve&&Object(pf.jsx)(hb,{close:function(){return be(!1)}}),Pe&&Object(pf.jsx)(eP,{setDialogVisible:Se}),ze&&Object(pf.jsx)(aP,{saveAs:!1,setDialogVisible:Re}),Me&&Object(pf.jsx)(aP,{saveAs:!0,setDialogVisible:Ie})]})},vP=n.a.memo(xP),bP=l(541),AP=l.n(bP),TP=function(){var e={lng:Xw(Vi)};return Object(pf.jsx)(AP.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)})},PP=.7/Math.cos(Ww.toRadians(42.2845513)),SP=function(){var e,t,l=Xw(si),a=Xw(i.latitude),n=Xw(i.longitude),c=Xw(o.mapZoom),s=Xw(o.mapType),d=Object(r.useRef)(),u=Object(Ly.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=PP*Math.cos(Ww.toRadians(a))*t;return u?Object(pf.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){_y.selectNone(t),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Ground,t.contextMenuObjectType=V.Ground,t.pasteNormal=Rt})))},children:[Object(pf.jsx)("planeBufferGeometry",{args:[100,100]}),Object(pf.jsx)("meshStandardMaterial",{attach:"material",depthTest:!1,side:We.DoubleSide,map:u,opacity:1})]}):Object(pf.jsx)(pf.Fragment,{})},HP=n.a.memo(SP),jP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),r=Xw(ts),n=Xw(as),c=Xw(Kc),s=Xw(Sr),u=Ww.isMac();return Object(pf.jsxs)(tb.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(h.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(f.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0],e.updateElementOnRoofFlag=!0}))}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Paste",{lng:i}),Object(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",u?"\u2318":"Ctrl","+V)"]})]},a)},zP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),r=Xw(Bc),n=Xw(ln),c=Xw(Gi),s=Ww.isMac();return Object(pf.jsxs)(tb.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(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",s?"\u2318":"Ctrl","+C)"]})]},a)},RP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Xw(si),i=Xw(Vi),n=Xw(Kc),c=Xw(ln),s=Xw(Sr),d=Ww.isMac(),u=Object(r.useMemo)((function(){return{lng:i}}),[i]);return Object(pf.jsxs)(tb.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(Ww.ifNeedListenToAutoDeletion(e[0]))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(h.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(f){o.e(f)}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(h.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(f){d.e(f)}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(pf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",d?"\u2318":"Ctrl","+X)"]})]},a)},DP=function(e){var t=e.keyName,l=Xw(Vi),a=Xw(hn),o=Xw(Sr),i=Xw((function(e){return e.elements.find((function(t){return e.selectedElementIdSet.has(t.id)}))})),r=function(e){i&&a(i.id,e)};return Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)},WP=l(45),MP=l.n(WP),IP=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}},CP=function(e){var t=Xw(Sr),l=Xw(gn);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)}}},FP=function(e,t){var l=Xw(yn),a=Xw(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)}}},kP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},OP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},YP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},LP=function(e){var t=Xw(si),l=Xw(Sr),a=function(l){t((function(t){var a,o=Object(h.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)}}},NP=function(e){return Xw((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}))}))},UP=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)}]},EP=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=Xw(Ci),f=Xw(Fi),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(pf.jsx)(lb.a,{width:t,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return b(!0)},onMouseOut:function(){return b(!1)},children:[l,P&&Object(pf.jsx)("span",{style:{color:"red",fontWeight:"bold"},children:a})]}),footer:[Object(pf.jsx)(Sv.a,{onClick:o,children:me.t("word.Apply",h)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){c?c():(i(),f())},children:me.t("word.Cancel",h)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:T,children:me.t("word.OK",h)},"OK")],onCancel:i,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:A,children:e})})},children:s})},VP=l(60),JP=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(Rn),i=Xw(Zr),n=Xw(Mn),c=Xw(Sr),s=Xw(Vn),d=Xw(Ci),f=NP(V.Foundation),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e){if(f&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&e!==a.color)return!0}}catch(o){l.e(o)}finally{l.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}(e)){switch(s){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation)l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#808080")}}catch(v){r.e(v)}finally{r.f()}var g={name:"Set Color for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.a)(g.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(v){t.e(v)}finally{t.f()}},redo:function(){n(V.Foundation,g.newValue)}};c(g),n(V.Foundation,e),d(Xw.getState().applyCount+1);break;default:var m=i(f.id),w=m?m.color:f.color,x={name:"Set Color of Selected Foundation",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){o(x.changedElementId,x.oldValue)},redo:function(){o(x.changedElementId,x.newValue)}};c(x),o(f.id,e),d(Xw.getState().applyCount+1)}a((function(t){t.actionState.foundationColor=e}))}};return Object(pf.jsx)(EP,{width:600,title:me.t("word.Color",w),onApply:function(){x(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},GP=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ki),i=Xw(Zr),n=Xw(mn),c=Xw(bn),s=Xw(Tn),f=Xw(Kn),p=Xw(en),y=Xw(nn),g=Xw(Sr),m=Xw(Vn),w=Xw(si),x=Xw(Ii),v=Xw(Ci),b=Xw(Fi),A=NP(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],H=P[1],j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(new Map),F=Object(r.useRef)(!1),k=Object(r.useRef)(),O={lng:a},Y=function(e){return!function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var i=a,r=p(i.id);if(r.length>0&&!Ww.doesNewSizeContainAllChildren(i,r,e,i.ly))return!1}}}catch(c){l.e(c)}finally{l.f()}break;default:var n=p(A.id);if(n.length>0)return Ww.doesNewSizeContainAllChildren(A,n,e,A.ly)}return!0}}(e)},L=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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},N=function(e,t,l){if(e){var a,o=Object(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,D.current.set(i.id,new We.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(W.current.clear(),C.current.clear(),l.length>0){var o,i=Object(h.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 We.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);W.current.set(r.id,s),R.current.set(r.id,new We.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new We.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),M.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 We.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(h.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=W.current.get(b.id);if(A){var T=new We.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),D.current.set(b.id,new We.Vector3(T,b.cy))}break;case V.Polygon:var P=C.current.get(b.id);if(P){var S,H=[],z=Object(h.a)(P);try{for(z.s();!(S=z.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/t,O=F.y/e.ly;H.push({x:k,y:O})}}catch(J){z.e(J)}finally{z.f()}f(b.id,H),I.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(D.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var Y=Nt.getState().contentRef,U=L(null===Y||void 0===Y?void 0:Y.current,e.id);N(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,E),D.current.set(b.id,new We.Vector3(E,b.cy,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},E=function(e,t,l){if(e&&t){var a=Nt.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(h.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){if(A&&function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.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(Math.abs(i.lx-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(k.current=void 0,F.current=Y(e),F.current)k.current=e,H(l);else switch(R.current.clear(),D.current.clear(),M.current.clear(),I.current.clear(),m){case _.AllObjectsOfThisType:var a,r=new Map,n=Object(h.a)(o);try{for(n.s();!(a=n.n()).done;){var d=a.value;d.type===V.Foundation&&r.set(d.id,d.lx)}}catch(S){n.e(S)}finally{n.f()}var p,w=Object(h.a)(o);try{for(w.s();!(p=w.n()).done;){var b=p.value;b.type===V.Foundation&&U(b,e)}}catch(S){w.e(S)}finally{w.f()}var T={name:"Set Length for All Foundations",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(z.current),undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(T.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=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),w=null===(s=T.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);m&&w&&m!==w&&(E(m,w,p),J(m,p))}}catch(S){r.e(S)}finally{r.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(h.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];f(A,P)}}catch(S){v.e(S)}finally{v.f()}}},redo:function(){if(s(V.Foundation,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(h.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&&(E(c,n,i),J(c,i))}}catch(S){t.e(S)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var d,p=Object(h.a)(T.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}}};g(T),v(x+1);break;default:U(A,e);var P={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(M.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(c(A.id,P.oldSize),P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(E(n,s,i),J(n,i))}}catch(S){t.e(S)}finally{t.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var d,p=Object(h.a)(P.oldChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}},redo:function(){if(c(A.id,P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(E(s,n,i),J(s,i))}}catch(S){t.e(S)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var d,p=Object(h.a)(P.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];f(m,w)}}catch(S){p.e(S)}finally{p.f()}}}};g(P),v(x+1)}}},X=function(){l(!1)},B=F.current?": "+me.t("message.NotApplicableToSelectedAction",O)+(void 0!==k.current?" ("+k.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",O),rejectedMessage:B,onApply:function(){G(S)},onClose:X,onClickCancel:function(){X(),b()},onClickOk:function(){G(S),F.current||(l(!1),v(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:S,onChange:H}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [0.1, 1000] ",me.t("word.MeterAbbreviation",O)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",O)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:m,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",O)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",O)})]})})})]})})},XP=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(nn),n=Xw(wn),c=Xw(Pn),s=Xw(Hn),f=Xw(Kn),p=Xw(en),y=Xw(Sr),g=Xw(Vn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(g){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation){var i=o,r=p(i.id);if(r.length>0&&!Ww.doesNewSizeContainAllChildren(i,r,i.lx,e))return!1}}}catch(c){l.e(c)}finally{l.f()}break;default:var n=p(b.id);if(n.length>0)return Ww.doesNewSizeContainAllChildren(b,n,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.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 We.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);D.current.set(r.id,s),z.current.set(r.id,new We.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new We.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),W.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 We.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(h.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;n(b.id,T),R.current.set(b.id,new We.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/e.lx,O=F.y/t;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}f(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(b.cz,E,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(z.current.clear(),R.current.clear(),W.current.clear(),M.current.clear(),g){case _.AllObjectsOfThisType:var r,n=new Map,d=Object(h.a)(a);try{for(d.s();!(r=d.n()).done;){var p=r.value;p.type===V.Foundation&&n.set(p.id,p.ly)}}catch(D){d.e(D)}finally{d.f()}var m,v=Object(h.a)(a);try{for(v.s();!(m=v.n()).done;){var A=m.value;A.type===V.Foundation&&N(A,e)}}catch(D){v.e(D)}finally{v.f()}var T={name:"Set Width for All Foundations",timestamp:Date.now(),oldSizes:n,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(D){t.e(D)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var r,n=Object(h.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),E(m,y))}}catch(D){n.e(D)}finally{n.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(h.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];f(A,P)}}catch(D){v.e(D)}finally{v.f()}}},redo:function(){if(s(V.Foundation,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(T.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=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);c&&d&&c!==d&&(U(d,c,r),E(d,r))}}catch(D){t.e(D)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(T.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}}};y(T),x(w+1);break;default:N(b,e);var P={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(c(b.id,P.oldSize),P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(s,d,r),E(s,r))}}catch(D){t.e(D)}finally{t.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(P.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}},redo:function(){if(c(b.id,P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=P.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(d,s,r),E(d,r))}}catch(D){t.e(D)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(h.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];f(m,w)}}catch(D){y.e(D)}finally{y.f()}}}};y(P),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",k),rejectedMessage:X,onApply:function(){J(P)},onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},onClose:G,children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 1000] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:g,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",k)})]})})})]})})},BP=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(nn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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()}}))},H=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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},j=function(e,t,l){if(e){var a,o=Object(h.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=Nt.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 We.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new We.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,A.current.set(l.id,new We.Vector3(c.x,c.y,0)),v.current.set(l.id,xt)}},z=function(e,t){a((function(l){var a,o=Object(h.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 We.Vector3(i.cx,i.cy,i.cz)),Ww.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Nt.getState().contentRef,c=H(null===n||void 0===n?void 0:n.current,e.id);j(c,e,i)}else i.cz=r,A.current.set(i.id,new We.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},R=function(e,t,l){if(e&&t){var a=Nt.getState().contentRef,o=H(null===a||void 0===a?void 0:a.current,t),i=H(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=H(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(h.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()}}))},W=function(e){if(p&&function(e){if(p){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(Math.abs(i.lz-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&l.set(y.id,y.lz)}}catch(M){r.e(M)}finally{r.f()}var g,m=Object(h.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;w.type===V.Foundation&&z(w,e)}}catch(M){m.e(M)}finally{m.f()}var T={name:"Set Height for All 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(){var e,t=Object(h.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];P(a,o)}}catch(M){t.e(M)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(T.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,d=Object(u.a)(i.value,2),f=d[0],p=d[1];s(f,p.x,p.y,p.z);var y=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(f),g=null===(c=T.newChildrenParentIdMap)||void 0===c?void 0:c.get(f);y&&g&&y!==g&&(R(y,g,f),D(y,f))}}catch(M){r.e(M)}finally{r.f()}}},redo:function(){var e=T.newValue;if(S(V.Foundation,e),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(h.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(M){l.e(M)}finally{l.f()}}}};n(T),S(V.Foundation,e),f(d+1);break;default:var H=i(p.id),j=H?H.lz:p.lz;z(p,e),P(p.id,e);var W={name:"Set Foundation Height",timestamp:Date.now(),oldValue:j,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(W.changedElementId,W.oldValue),W.oldChildrenPositionsMap&&W.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(W.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=W.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=W.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(M){t.e(M)}finally{t.f()}}},redo:function(){if(P(W.changedElementId,W.newValue),W.newChildrenPositionsMap&&W.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(W.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=W.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=W.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(c,n,i),D(c,i))}}catch(M){t.e(M)}finally{t.f()}}}};n(W),f(d+1)}a((function(t){t.actionState.foundationHeight=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",T),onApply:function(){W(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:10,style:{width:120},step:.1,precision:2,value:m,onChange:function(e){w(e)}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 10] ",me.t("word.MeterAbbreviation",T)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",T)})]})})})]})})},KP=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Un),n=Xw(En),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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){if(p&&function(e){if(p){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked){var i=o;if(Math.abs(-i.rotation[2]-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&l.set(y.id,-y.rotation[2])}}catch(v){r.e(v)}finally{r.f()}var g={name:"Set Azimuth for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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];i(a,0,0,-o)}}catch(v){t.e(v)}finally{t.f()}},redo:function(){n(V.Foundation,0,0,-g.newValue)}};c(g),n(V.Foundation,0,0,-e),f(d+1);break;default:var m=o(p.id),w=m?-m.rotation[2]:-p.rotation[2],x={name:"Set Foundation Azimuth",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(x.changedElementId,0,0,-x.oldValue)},redo:function(){i(x.changedElementId,0,0,-x.newValue)}};c(x),i(p.id,0,0,-e),f(d+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("word.Azimuth",x),onApply:function(){v(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Ww.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},qP="data:image/png;base64,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",QP="data:image/png;base64,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",ZP=l.p+"static/media/foundation_03_menu.1a0820a4.png",_P=l.p+"static/media/foundation_04_menu.cfdf351d.png",$P=l.p+"static/media/foundation_05_menu.7f382511.png",eS="data:image/png;base64,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",tS=l.p+"static/media/foundation_07_menu.cf056d65.png",lS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:se.NoTexture),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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(h.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){if(f&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&e!==a.textureType)return!0}}catch(i){l.e(i)}finally{l.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation)l.set(y.id,null!==(p=y.textureType)&&void 0!==p?p:se.NoTexture)}}catch(A){r.e(A)}finally{r.f()}var g={name:"Set Texture for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(A){t.e(A)}finally{t.f()}},redo:function(){b(g.newValue)}};n(g),b(e),d(s+1);break;default:var m=i(f.id),w=m?m.textureType:f.textureType,x={name:"Set Texture of Selected Foundation",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(x.changedElementId,x.oldValue)},redo:function(){v(x.changedElementId,x.newValue)}};n(x),v(f.id,e),d(s+1)}a((function(t){t.actionState.foundationTexture=e}))}};return Object(pf.jsx)(EP,{width:500,title:me.t("word.Texture",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(pf.jsxs)(x,{value:se.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:se.Texture01,children:[Object(pf.jsx)("img",{alt:se.Texture01,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture01",w)]},se.Texture01),Object(pf.jsxs)(x,{value:se.Texture02,children:[Object(pf.jsx)("img",{alt:se.Texture02,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture02",w)]},se.Texture02),Object(pf.jsxs)(x,{value:se.Texture03,children:[Object(pf.jsx)("img",{alt:se.Texture03,src:ZP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture03",w)]},se.Texture03),Object(pf.jsxs)(x,{value:se.Texture04,children:[Object(pf.jsx)("img",{alt:se.Texture04,src:_P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture04",w)]},se.Texture04),Object(pf.jsxs)(x,{value:se.Texture05,children:[Object(pf.jsx)("img",{alt:se.Texture05,src:$P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture05",w)]},se.Texture05),Object(pf.jsxs)(x,{value:se.Texture06,children:[Object(pf.jsx)("img",{alt:se.Texture06,src:eS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture06",w)]},se.Texture06),Object(pf.jsxs)(x,{value:se.Texture07,children:[Object(pf.jsx)("img",{alt:se.Texture07,src:tS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture07",w)]},se.Texture07)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},aS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberHeight||Math.abs(i.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberHeight)&&void 0!==m?m:10)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Height for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberHeight)&&void 0!==t?t:10:null!==(l=p.absorberHeight)&&void 0!==l?l:10;v(f.id,e);var P={name:"Set Absorber Height on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberHeight",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:50,style:{width:120},step:.5,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 50] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},oS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberAbsorptance||Math.abs(i.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberAbsorptance)&&void 0!==m?m:.95)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Pipe Absorptance for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberAbsorptance)&&void 0!==t?t:.95:null!==(l=p.absorberAbsorptance)&&void 0!==l?l:.95;v(f.id,e);var P={name:"Set Absorber Pipe Absorptance on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},iS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(i.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.absorberOpticalEfficiency)&&void 0!==l?l:.7;v(f.id,e);var P={name:"Set Absorber Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},rS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(i.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==m?m:.3)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.absorberThermalEfficiency)&&void 0!==l?l:.3;v(f.id,e);var P={name:"Set Absorber Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},nS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.apertureWidth||Math.abs(i.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.apertureWidth)&&void 0!==m?m:.6)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Aperture Width for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.apertureWidth)&&void 0!==t?t:.6:null!==(l=p.apertureWidth)&&void 0!==l?l:.6;v(f.id,e);var P={name:"Set Absorber Aperture Width on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:2,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, 2] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},cS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.poleNumber||i.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.poleNumber)&&void 0!==m?m:5)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Absorber Pipe Pole Number for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarAbsorberPipe?null!==(t=A.solarAbsorberPipe.poleNumber)&&void 0!==t?t:5:null!==(l=p.poleNumber)&&void 0!==l?l:5;v(f.id,e);var P={name:"Set Absorber Pipe Pole Number on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:1,max:100,style:{width:120},step:1,precision:0,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},sS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(S){a.e(S)}finally{a.f()}var m={name:"Set Solar Chimney Height for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){T(m.newValue)}};d(m),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var w,x,v=s(g.id),b=v&&v.solarUpdraftTower?null!==(w=v.solarUpdraftTower.chimneyHeight)&&void 0!==w?w:Math.max(v.lx,v.ly):null!==(x=g.solarUpdraftTower.chimneyHeight)&&void 0!==x?x:Math.max(g.lx,g.ly);A(g.id,e);var P={name:"Set Solar Chimney Height on Foundation",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(P.changedElementId,P.oldValue)},redo:function(){A(P.changedElementId,P.newValue)}};d(P),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},dS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(S){a.e(S)}finally{a.f()}var m={name:"Set Solar Chimney Radius for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){T(m.newValue)}};d(m),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var w,x,v=s(g.id),b=v&&v.solarUpdraftTower?null!==(w=v.solarUpdraftTower.chimneyRadius)&&void 0!==w?w:Math.max(1,.025*Math.min(v.lx,v.ly)):null!==(x=g.solarUpdraftTower.chimneyRadius)&&void 0!==x?x:Math.max(1,.025*Math.min(g.lx,g.ly));A(g.id,e);var P={name:"Set Solar Chimney Radius on Foundation",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(P.changedElementId,P.oldValue)},redo:function(){A(P.changedElementId,P.newValue)}};d(P),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:10,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [0.1, 10] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},uS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(ki),s=Xw(Zr),d=Xw(Sr),f=Xw(Vn),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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){if(g&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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(f){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var n={name:"Set Solar Collector Radius for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){T(n.newValue)}};d(n),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var m,w,x=s(g.id),v=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorRadius)&&void 0!==m?m:Math.max(10,.5*Math.min(x.lx,x.ly)):null!==(w=g.solarUpdraftTower.collectorRadius)&&void 0!==w?w:Math.max(10,.5*Math.min(g.lx,g.ly));A(g.id,e);var b={name:"Set Solar Collector Radius on Foundation",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(b.changedElementId,b.oldValue)},redo:function(){A(b.changedElementId,b.newValue)}};d(b),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",b),onApply:function(){P(x)},onClose:function(){i(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},fS=function(e){var t,l,a,o=e.setDialogVisible,i=Xw(si),n=(Xw(Vi),Xw(ki)),c=Xw(Zr),s=Xw(Sr),d=Xw(Vn),f=(Xw(Jn),Xw(Ii)),p=Xw(Ci),y=(Xw(Fi),NP(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(h.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(h.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){if(y&&function(e){switch(d){case _.AllObjectsOfThisType:var t,l=Object(h.a)(n);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(i){l.e(i)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(n);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Height for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){A(g.newValue)}};s(g),A(e),p(f+1);break;default:if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower){var m,w,x=c(y.id),v=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorHeight)&&void 0!==m?m:Math.max(3,10*x.lz):null!==(w=y.solarUpdraftTower.collectorHeight)&&void 0!==w?w:Math.max(3,10*y.lz);b(y.id,e);var T={name:"Set Solar Collector Height on Foundation",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(T.changedElementId,T.oldValue)},redo:function(){b(T.changedElementId,T.newValue)}};s(T),p(f+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",v),onApply:function(){T(w)},onClose:function(){o(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:20,style:{width:120},step:1,precision:1,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, 20] ",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",v)})]})})})]})})},hS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerHeight||Math.abs(i.solarPowerTower.towerHeight-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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(S){y.e(S)}finally{y.f()}var x={name:"Set Tower Height for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.towerHeight)&&void 0!==t?t:20:null!==(l=p.towerHeight)&&void 0!==l?l:20;v(f.id,e);var P={name:"Set Tower Height on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerHeight",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:10,max:500,style:{width:120},step:1,precision:1,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [10, 500] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},pS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerRadius||Math.abs(i.solarPowerTower.towerRadius-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.towerRadius)&&void 0!==m?m:1)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Tower Radius for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.towerRadius)&&void 0!==t?t:1:null!==(l=p.towerRadius)&&void 0!==l?l:1;v(f.id,e);var P={name:"Set Tower Radius on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerRadius",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.5,max:10,style:{width:120},step:.5,precision:1,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.5, 10] ",me.t("word.MeterAbbreviation",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},yS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverAbsorptance||Math.abs(i.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverAbsorptance)&&void 0!==m?m:.95)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Absorptance for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverAbsorptance)&&void 0!==t?t:.95:null!==(l=p.receiverAbsorptance)&&void 0!==l?l:.95;v(f.id,e);var P={name:"Set Receiver Absorptance on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverAbsorptance",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},gS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverOpticalEfficiency||Math.abs(i.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.receiverOpticalEfficiency)&&void 0!==l?l:.7;v(f.id,e);var P={name:"Set Receiver Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},mS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Vn),s=Xw(Ii),d=Xw(Ci),f=NP(V.Foundation),p=null===f||void 0===f?void 0:f.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(h.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(h.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){var t,l;if(f&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverThermalEfficiency||Math.abs(i.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var a,r=new Map,y=Object(h.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.receiverThermalEfficiency)&&void 0!==m?m:.3)}}}catch(S){y.e(S)}finally{y.f()}var x={name:"Set Receiver Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(S){t.e(S)}finally{t.f()}},redo:function(){b(x.newValue)}};n(x),b(e),d(s+1);break;default:var A=i(f.id),T=A&&A.solarPowerTower?null!==(t=A.solarPowerTower.receiverThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.receiverThermalEfficiency)&&void 0!==l?l:.3;v(f.id,e);var P={name:"Set Receiver Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(P.changedElementId,P.oldValue)},redo:function(){v(P.changedElementId,P.newValue)}};n(P),d(s+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:8,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},wS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Transmissivity for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorTransmissivity)&&void 0!==m?m:.9:null!==(w=p.solarUpdraftTower.collectorTransmissivity)&&void 0!==w?w:.9;v(p.id,e);var T={name:"Set Solar Collector Transmissivity on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},xS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Chimney Discharge Coefficient for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.dischargeCoefficient)&&void 0!==m?m:.65:null!==(w=p.solarUpdraftTower.dischargeCoefficient)&&void 0!==w?w:.65;v(p.id,e);var T={name:"Set Solar Chimney Discharge Coefficient on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.65,max:.7,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.65, 0.70]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},vS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Updraft Tower Turbine Efficiency for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.turbineEfficiency)&&void 0!==m?m:.3:null!==(w=p.solarUpdraftTower.turbineEfficiency)&&void 0!==w?w:.3;v(p.id,e);var T={name:"Set Solar Updraft Tower Turbine Efficiency on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.2,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.2, 1.0]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},bS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Sr),s=Xw(Vn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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(h.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){if(p&&function(e){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){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(r){l.e(r)}finally{l.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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation){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(P){a.e(P)}finally{a.f()}var g={name:"Set Solar Collector Emissivity for All Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(P){t.e(P)}finally{t.f()}},redo:function(){b(g.newValue)}};c(g),b(e),f(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var m,w,x=n(p.id),A=x&&x.solarUpdraftTower?null!==(m=x.solarUpdraftTower.collectorEmissivity)&&void 0!==m?m:.95:null!==(w=p.solarUpdraftTower.collectorEmissivity)&&void 0!==w?w:.95;v(p.id,e);var T={name:"Set Solar Collector Emissivity on Foundation",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(T.changedElementId,T.oldValue)},redo:function(){v(T.changedElementId,T.newValue)}};c(T),f(d+1)}}};return Object(pf.jsx)(EP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",x),onApply:function(){A(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},AS=yb.a.Option,TS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(Gi),n=Xw(Vi),c=bf(Er),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=Xw(sf).geneticAlgorithmParams,P=Object(r.useRef)(T.selectionMethod),S=Object(r.useRef)(T.searchMethod),H=Object(r.useRef)(Math.min(T.objectiveFunctionType,M.YEARLY_TOTAL_OUTPUT)),j=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),k=Object(r.useRef)(null!==(l=T.crossoverRate)&&void 0!==l?l:.5),O=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 N={lng:n},U=function(){c||Kh(me.t("message.EvolutionStarted",N)),o((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=W.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=H.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=P.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=S.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=j.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=D.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=k.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=R.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=O.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=Y.current})),setTimeout((function(){bf.setState((function(e){e.runEvolution=!e.runEvolution})),o((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=W.SOLAR_PANEL_TILT_ANGLE,i&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return m(!0)},onMouseOut:function(){return m(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",N)+": ",me.t("optimizationMenu.GeneticAlgorithmSettings",N)]}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",N)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:L,onClick:function(){U(),a(!1)},children:me.t("word.Run",N)},"Run")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:A,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",N)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(AS,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",N)},M.YEARLY_TOTAL_OUTPUT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:P.current,style:{width:"100%"},value:P.current,onChange:function(e){P.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",N)},C.ROULETTE_WHEEL),Object(pf.jsx)(AS,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",N)},C.TOURNAMENT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:10,max:100,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:j.current,step:1,onChange:function(e){j.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:D.current,step:.01,onChange:function(e){D.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",N)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:R.current,step:.01,onChange:function(e){R.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",N)+" [0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:O.current,step:.001,onChange:function(e){O.current=e,h(!f)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",N)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:S.current,style:{width:"100%"},value:S.current,onChange:function(e){S.current=e,h(!f)},children:[Object(pf.jsx)(AS,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",N)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(AS,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",N)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),S.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",N)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Y.current,step:.01,onChange:function(e){Y.current=e,h(!f)}})})]})]})})},PS=yb.a.Option,SS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Xw(si),c=Xw(Gi),s=Xw(Vi),d=bf(Er),f=Xw(sf).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),H=Object(r.useRef)(Math.min(f.objectiveFunctionType,M.YEARLY_TOTAL_OUTPUT)),j=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),k=Object(r.useRef)(null!==(a=f.cognitiveCoefficient)&&void 0!==a?a:.1),O=Object(r.useRef)(null!==(o=f.socialCoefficient)&&void 0!==o?o:.1),Y=Object(r.useRef)(f.convergenceThreshold),L=Object(r.useRef)(f.localSearchRadius),N=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=N.current)||void 0===e||e.focus()}),[]);var U={lng:s},E=function(){d||Kh(me.t("message.EvolutionStarted",U)),n((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=H.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=j.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=R.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=k.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=O.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(){bf.setState((function(e){e.runEvolution=!e.runEvolution})),n((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.SOLAR_PANEL_TILT_ANGLE,c&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){i(!1)},children:me.t("word.Cancel",U)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:N,onClick:function(){E(),i(!1)},children:me.t("word.Run",U)},"Run")],onCancel:function(){i(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:S,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,g(!y)},children:[Object(pf.jsx)(PS,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",U)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(PS,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",U)},M.YEARLY_TOTAL_OUTPUT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:O.current,step:.01,onChange:function(e){O.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",U)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:C.current,step:.01,onChange:function(e){C.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",U)+" [0.001, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:D.current,step:.001,onChange:function(e){D.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",U)+" [0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Y.current,step:.001,onChange:function(e){Y.current=e,g(!y)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",U)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,g(!y)},children:[Object(pf.jsx)(PS,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",U)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(PS,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",U)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),j.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",U)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:L.current,step:.01,onChange:function(e){L.current=e,g(!y)}})})]})]})})},HS=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ki),i=Xw(ln),n=Xw(Sr),c=Xw(Vn),s=Xw(Jn),d=Xw(Ii),f=Xw(Ci),p=Xw(Fi),y=Xw(Zr),g=Xw(si),m=Xw((function(e){if(i){var t,l=Object(h.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)(Ww.toRValueInUS(v)),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useRef)(null),F={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 k=function(e,t){g((function(l){var a,o=Object(h.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()}}))},O=function(e){if(m&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.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(h.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(h.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];k(o,i)}}catch(r){l.e(r)}finally{l.f()}}(l.oldValues)},redo:function(){!function(e,t){var l,a=Object(h.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;k(o,t)}}catch(i){a.e(i)}finally{a.f()}}(l.oldValues,l.newValue)}};n(l),f(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(){k(s.changedElementId,s.oldValue)},redo:function(){k(s.changedElementId,s.newValue)}};n(s),k(m.id,e),f(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(){O(v),l(!1),f(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:[me.t("word.RValue",F)+" ","(",me.t("word.ThermalResistance",F),")"]}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){O(v)},children:me.t("word.Apply",F)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){Y(),p()},children:me.t("word.Cancel",F)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:L,children:me.t("word.OK",F)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!z,bounds:M,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(pf.jsx)("div",{ref:C,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",F),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",F),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisGroundFloor",F)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllGroundFloors",F)})]})})})]})})})},jS=n.a.memo((function(){var e,t,l,a,o,i,n,c,s,d,p=Xw(si),y=Xw(ki),g=Xw(Sr),m=Xw(fs),w=Xw($c),x=Xw(es),v=Xw(hn),b=Xw(un),A=Xw(rs),T=Xw(Kc),P=Xw(Ci),S=Xw(Vi),H=Xw(as),j=NP(V.Foundation),z=Object(r.useState)(!1),R=Object(u.a)(z,2),W=R[0],M=R[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useState)(!1),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],X=E[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],He=Pe[1],je=Object(r.useState)(!1),ze=Object(u.a)(je,2),Re=ze[0],De=ze[1],Me=Object(r.useState)(!1),Ie=Object(u.a)(Me,2),Ce=Ie[0],Fe=Ie[1],ke=Object(r.useState)(!1),Oe=Object(u.a)(ke,2),Ye=Oe[0],Le=Oe[1],Ne=Object(r.useState)(!1),Ue=Object(u.a)(Ne,2),Ee=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],Ht=Object(r.useState)(!1),jt=Object(u.a)(Ht,2),zt=jt[0],Dt=jt[1],Wt=Object(r.useState)(!1),Mt=Object(u.a)(Wt,2),It=Mt[0],Ct=Mt[1],Ft=Object(r.useState)(!1),kt=Object(u.a)(Ft,2),Ot=kt[0],Yt=kt[1],Lt=IP(j),Nt=Lt.labelText,Ut=Lt.setLabelText,Et=CP(j),Vt=FP(j,Nt),Jt=OP(j),Gt=kP(j),Xt=YP(j),Bt=LP(j);Object(r.useEffect)((function(){var e;j&&Zt(null===(e=j.hvacSystem)||void 0===e?void 0:e.id)}),[j]);var Kt=Object(r.useState)(null===j||void 0===j||null===(e=j.hvacSystem)||void 0===e?void 0:e.id),qt=Object(u.a)(Kt,2),Qt=qt[0],Zt=qt[1];if(!j)return null;var _t=null!==(t=null===j||void 0===j?void 0:j.solarStructure)&&void 0!==t?t:G.None,$t=j?m(j.id,!0):new Ow,el=j?m(j.id,!1):new Ow,tl={lng:S},ll=!(null===j||void 0===j?void 0:j.locked),al=function(e,t){p((function(l){var a,o=Object(h.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(h.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(h.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(h.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=j.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(j.id,o.oldValue)},redo:function(){rl(j.id,o.newValue)}};g(o),rl(j.id,a)},cl=!j.notBuilding&&Ww.getBuildingCompletionStatus(j,y)===D.COMPLETE,sl=function(){p((function(e){var t,l=Object(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===j.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(h.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===j.id){a.notBuilding=!a.notBuilding;break}}}catch(o){l.e(o)}finally{l.f()}}))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[function(){if(H&&H.length>0){var e=H[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(pf.jsx)(jP,{keyName:"foundation-paste"}),Object(pf.jsx)(zP,{keyName:"foundation-copy"}),ll&&Object(pf.jsx)(RP,{keyName:"foundation-cut"}),Object(pf.jsx)(DP,{keyName:"foundation-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:j.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:j.id,selectedElementType:j.type,undo:function(){return sl()},redo:function(){return sl()}};g(t),sl()},children:me.t("foundationMenu.GroupMaster",{lng:S})})},"group-master"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!j.notBuilding,onChange:function(e){var t={name:"Building",timestamp:Date.now(),checked:e.target.checked,selectedElementId:j.id,selectedElementType:j.type,undo:function(){return dl()},redo:function(){return dl()}};g(t),dl()},children:me.t("word.Building",{lng:S})})},"building"),$t.gotSome()&&Object(pf.jsxs)(MP.a,{title:me.t("word.Elements",tl),style:{paddingLeft:"24px"},children:[el.gotSome()&&Object(pf.jsx)(tb.a.Item,{onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==j.id&&a.id!==j.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(j.id,!0);var o={name:"Lock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(h.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(j.id,!0)}};g(o)},children:me.t("foundationMenu.LockAllElementsOnThisFoundation",tl)},"lock-all-offsprings"),Object(pf.jsx)(tb.a.Item,{onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==j.id&&a.id!==j.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(j.id,!1);var o={name:"Unlock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(h.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(j.id,!1)}};g(o)},children:me.t("foundationMenu.UnlockAllElementsOnThisFoundation",tl)},"unlock-all-offsprings"),el.wallCount>0&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation",tl)+" ("+el.wallCount+" "+me.t("foundationMenu.Walls",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=new Set;Xw.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==j.id&&t.foundationId!==j.id||e.add(t.id)}));var t=Xw.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:j.id,removedElements:l,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(a.removedElements)),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))},redo:function(){var e=new Set;Xw.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation",tl)+" ("+el.windowCount+" "+me.t("foundationMenu.Windows",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Window&&e.foundationId===j.id}));x(j.id,V.Window);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Windows on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation",tl)+" ("+el.doorCount+" "+me.t("foundationMenu.Doors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Door&&e.foundationId===j.id}));x(j.id,V.Door);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Doors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation",tl)+" ("+el.sensorCount+" "+me.t("foundationMenu.Sensors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.foundationId===j.id}));x(j.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation",tl)+" ("+(el.insideLightCount+el.outsideLightCount)+" "+me.t("foundationMenu.Lights",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Light&&e.foundationId===j.id}));x(j.id,V.Light);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Lights on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation",tl)+" ("+el.solarPanelModuleCount+" "+me.t("foundationMenu.SolarPanels",tl)+", "+el.solarPanelCount+" "+me.t("foundationMenu.Racks",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.foundationId===j.id}));x(j.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation",tl)+" ("+el.parabolicTroughCount+" "+me.t("foundationMenu.ParabolicTroughs",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicTrough&&e.foundationId===j.id}));w(j.id,V.ParabolicTrough);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Troughs on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation",tl)+" ("+el.parabolicDishCount+" "+me.t("foundationMenu.ParabolicDishes",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicDish&&e.foundationId===j.id}));w(j.id,V.ParabolicDish);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Dishes on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation",tl)+" ("+el.fresnelReflectorCount+" "+me.t("foundationMenu.FresnelReflectors",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.FresnelReflector&&e.foundationId===j.id}));w(j.id,V.FresnelReflector);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Fresnel Reflectors on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation",tl)+" ("+el.heliostatCount+" "+me.t("foundationMenu.Heliostats",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Heliostat&&e.foundationId===j.id}));w(j.id,V.Heliostat);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Heliostats on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation",tl)+" ("+el.polygonCount+" "+me.t("foundationMenu.Polygons",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.foundationId===j.id}));w(j.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation",tl)+" ("+el.humanCount+" "+me.t("foundationMenu.Humans",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===j.id}));w(j.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation",tl)+" ("+el.treeCount+" "+me.t("foundationMenu.Trees",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===j.id}));w(j.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation",tl)+" ("+el.flowerCount+" "+me.t("foundationMenu.Flowers",tl)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(j){var e=Xw.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===j.id}));w(j.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Foundation",timestamp:Date.now(),parentId:j.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(f.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&&(!j.textureType||j.textureType===se.NoTexture)&&Object(pf.jsxs)(pf.Fragment,{children:[W&&Object(pf.jsx)(JP,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),M(!0)},children:[me.t("word.Color",tl)," ..."]},"foundation-color")]}),ll&&Object(pf.jsxs)(pf.Fragment,{children:[F&&Object(pf.jsx)(lS,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),k(!0)},children:[me.t("word.Texture",tl)," ..."]},"foundation-texture"),J&&Object(pf.jsx)(GP,{setDialogVisible:X}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),X(!0)},children:[me.t("word.Length",tl)," ..."]},"foundation-length"),L&&Object(pf.jsx)(XP,{setDialogVisible:N}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),N(!0)},children:[me.t("word.Width",tl)," ..."]},"foundation-width"),q&&Object(pf.jsx)(BP,{setDialogVisible:Q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Q(!0)},children:[me.t("word.Height",tl)," ..."]},"foundation-height"),$&&Object(pf.jsx)(KP,{setDialogVisible:ee}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ee(!0)},children:[me.t("word.Azimuth",tl)," ..."]},"foundation-azimuth"),cl&&ae&&Object(pf.jsx)(HS,{setDialogVisible:oe}),cl&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),oe(!0)},children:[me.t("foundationMenu.GroundFloorRValue",tl)," ..."]},"ground-floor-r-value")]}),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(j){p((function(e){e.objectTypeToAdd=V.Polygon}));var e=A(j,new We.Vector3(j.cx,j.cy,j.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"),!j.notBuilding&&$t.wallCount>0&&Object(pf.jsx)(MP.a,{title:me.t("word.BuildingHVACSystem",tl),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"18px",marginTop:10},children:[Object(pf.jsx)(Pv.b,{style:{width:"40px",paddingLeft:"0px",textAlign:"left"},children:"ID:"}),Object(pf.jsx)(GT.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(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{style:{width:"160px"},children:me.t("word.ThermostatSetpoint",tl)+":"}),Object(pf.jsx)(ob.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(l=null===(a=j.hvacSystem)||void 0===a?void 0:a.thermostatSetpoint)&&void 0!==l?l:20,onChange:function(e){var t,l,a=null!==(t=null===(l=j.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(j.id,i.oldValue)},redo:function(){ol(j.id,i.newValue)}};g(i),ol(j.id,o)}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"thermostat-temperature"),Object(pf.jsxs)(tb.a.Item,{children:[Object(pf.jsx)(Pv.b,{title:me.t("word.TemperatureToleranceThresholdExplanation",tl),style:{width:"160px"},children:me.t("word.TemperatureToleranceThreshold",tl)+":"}),Object(pf.jsx)(ob.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(o=null===(i=j.hvacSystem)||void 0===i?void 0:i.temperatureThreshold)&&void 0!==o?o:3,onChange:function(e){var t,l,a=null!==(t=null===(l=j.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(j.id,i.oldValue)},redo:function(){il(j.id,i.newValue)}};g(i),il(j.id,o)}}),Object(pf.jsx)(Pv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"tolerance-threshold")]})},"building-hvac-system"),ll&&Object(pf.jsx)(MP.a,{title:me.t("foundationMenu.SolarStructure",tl),style:{paddingLeft:"24px"},children:Object(pf.jsx)(rb.a.Group,{value:_t,style:{paddingLeft:"12px"},onChange:function(e){if(j){var t=j.solarStructure,l=e.target.value,a={name:"Select Solar Structure for Selected Foundation",timestamp:Date.now(),oldValue:t,newValue:l,changedElementId:j.id,changedElementType:j.type,undo:function(){al(a.changedElementId,a.oldValue)},redo:function(){al(a.changedElementId,a.newValue)}};g(a),al(j.id,l)}},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:G.None,children:me.t("word.None",tl)}),Object(pf.jsx)(rb.a,{value:G.FocusPipe,children:me.t("solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors",tl)}),Object(pf.jsx)(rb.a,{value:G.FocusTower,children:me.t("solarPowerTowerMenu.ReceiverTowerForHeliostats",tl)}),Object(pf.jsx)(rb.a,{value:G.UpdraftTower,children:me.t("solarUpdraftTowerMenu.SolarUpdraftTower",tl)})]})})},"select-solar-structure"),ll&&j.solarStructure===G.FocusPipe&&Object(pf.jsxs)(MP.a,{title:me.t("solarAbsorberPipeMenu.AbsorberPipePhysicalProperties",tl),style:{paddingLeft:"24px"},children:[ne&&Object(pf.jsx)(aS,{setDialogVisible:ce}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ce(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberHeight",tl)," ..."]},"solar-absorber-pipe-height"),fe&&Object(pf.jsx)(nS,{setDialogVisible:he}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),he(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",tl)," ..."]},"solar-absorber-pipe-aperture-width"),ge&&Object(pf.jsx)(cS,{setDialogVisible:we}),Object(pf.jsxs)(tb.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(pf.jsx)(oS,{setDialogVisible:Ae}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ae(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",tl)," ..."]},"solar-absorber-pipe-absorptance"),Se&&Object(pf.jsx)(iS,{setDialogVisible:He}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),He(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",tl)," ..."]},"solar-absorber-optical-efficiency"),Re&&Object(pf.jsx)(rS,{setDialogVisible:De}),Object(pf.jsxs)(tb.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&&j.solarStructure===G.FocusTower&&Object(pf.jsxs)(MP.a,{title:me.t("solarPowerTowerMenu.ReceiverTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[Ce&&Object(pf.jsx)(hS,{setDialogVisible:Fe}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Fe(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerHeight",tl)," ..."]},"solar-power-tower-height"),Ye&&Object(pf.jsx)(pS,{setDialogVisible:Le}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Le(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerRadius",tl)," ..."]},"solar-power-tower-radius"),Ee&&Object(pf.jsx)(yS,{setDialogVisible:Ve}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ve(!0)},children:[me.t("solarPowerTowerMenu.ReceiverAbsorptance",tl)," ..."]},"solar-power-tower-receiver-absorptance"),Xe&&Object(pf.jsx)(gS,{setDialogVisible:Be}),Object(pf.jsxs)(tb.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(pf.jsx)(mS,{setDialogVisible:Ze}),Object(pf.jsxs)(tb.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&&j.solarStructure===G.UpdraftTower&&Object(pf.jsxs)(MP.a,{title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[et&&Object(pf.jsx)(sS,{setDialogVisible:tt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),tt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",tl)," ..."]},"solar-updraft-tower-chimney-height"),ot&&Object(pf.jsx)(dS,{setDialogVisible:it}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),it(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",tl)," ..."]},"solar-updraft-tower-chimney-radius"),ct&&Object(pf.jsx)(fS,{setDialogVisible:st}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),st(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",tl)," ..."]},"solar-updraft-tower-collector-height"),ft&&Object(pf.jsx)(uS,{setDialogVisible:ht}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ht(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",tl)," ..."]},"solar-updraft-tower-collector-radius"),gt&&Object(pf.jsx)(wS,{setDialogVisible:mt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),mt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",tl)," ..."]},"solar-updraft-tower-collector-transmissivity"),vt&&Object(pf.jsx)(bS,{setDialogVisible:bt}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),bt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",tl)," ..."]},"solar-updraft-tower-collector-emissivity"),Pt&&Object(pf.jsx)(xS,{setDialogVisible:St}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),St(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",tl)," ..."]},"solar-updraft-tower-discharge-coefficient"),zt&&Object(pf.jsx)(vS,{setDialogVisible:Dt}),Object(pf.jsxs)(tb.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(pf.jsxs)(MP.a,{title:me.t("optimizationMenu.Optimization",tl),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(MP.a,{title:me.t("optimizationMenu.GeneticAlgorithm",tl),children:el.solarPanelCount>0&&Object(pf.jsxs)(pf.Fragment,{children:[It&&Object(pf.jsx)(TS,{setDialogVisible:Ct}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){Ct(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-ga-optimizer")]})},"genetic-algorithms"),Object(pf.jsx)(MP.a,{title:me.t("optimizationMenu.ParticleSwarmOptimization",tl),children:el.solarPanelCount>0&&Object(pf.jsxs)(pf.Fragment,{children:[Ot&&Object(pf.jsx)(SS,{setDialogVisible:Yt}),Object(pf.jsxs)(tb.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",tl),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===j||void 0===j?void 0:j.showLabel),onChange:Et,children:me.t("labelSubMenu.KeepShowingLabel",tl)})},"foundation-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",tl)+":",value:Nt,onChange:function(e){return Ut(e.target.value)},onPressEnter:Vt,onBlur:Vt})},"foundation-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelHeight",tl)+":",min:j.lz/2+.2,max:100,step:1,precision:1,value:null!==(n=j.labelHeight)&&void 0!==n?n:j.lz/2+.2,onChange:function(e){return Bt(e)}})},"foundation-label-height"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",tl)+":",min:10,max:100,step:1,precision:0,value:null!==(c=j.labelFontSize)&&void 0!==c?c:20,onChange:function(e){return Gt(e)}})},"foundation-label-font-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelSize",tl)+":",min:.2,max:5,step:.1,precision:1,value:null!==(s=j.labelSize)&&void 0!==s?s:.2,onChange:function(e){return Jt(e)}})},"foundation-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelColor",tl)+":",value:null!==(d=j.labelColor)&&void 0!==d?d:"#ffffff",onChange:function(e){return Xt(e.target.value)}})},"foundation-label-color")]})]},"foundation-label")]})})),zS=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Sr),c=Xw(qn),s=Xw(Qn),d=Xw(rn),p=Xw(Ii),y=Xw(Ci),g=NP(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 H=function(e,t,l){o((function(a){var o,i=Object(h.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()}}))},j=function(e,t){o((function(l){var a,o=Object(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked){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(s){l.e(s)}finally{l.f()}break;case _.OnlyThisObject:if(g.faceColors){for(var n=0;n<4;n++)if(e!==g.faceColors[n])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 _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Cuboid){var s=r;if(s.faceColors)l.set(r.id,Object(f.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(W){a.e(W)}finally{a.f()}var x={name:"Set Color for All Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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 R=g.faceColors?g.faceColors[d]:g.color,D={name:"Set Color for Selected Side of Cuboid",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:g.id,changedElementType:g.type,changedSideIndex:d,undo:function(){void 0!==D.changedSideIndex&&H(D.changedSideIndex,D.changedElementId,D.oldValue)},redo:function(){void 0!==D.changedSideIndex&&H(D.changedSideIndex,D.changedElementId,D.newValue)}};n(D),H(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)}},W=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(pf.jsx)(EP,{width:600,title:me.t("word.Color",S),onApply:function(){D(x),a(!1),y(0)},onClose:function(){R(),a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.a,{color:null!==x&&void 0!==x?x:W,onChangeComplete:function(e){v(e.hex),P(!T)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value),P(!T)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",S)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",S)})]})})})]})})},RS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(en),n=Xw(mn),c=Xw(bn),s=Xw(Kn),f=Xw(nn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid){var r=o,n=i(r.id);if(n.length>0&&!Ww.doesNewSizeContainAllChildren(r,n,e,r.ly))return!1}}}catch(s){l.e(s)}finally{l.f()}break;default:var c=i(b.id);if(c.length>0)return Ww.doesNewSizeContainAllChildren(b,c,e,b.ly)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.a)(l);try{for(r.s();!(o=r.n()).done;){var u=o.value;if(Ww.isIdentical(u.normal,Tt))switch(u.type){case V.SolarPanel:case V.Sensor:var f=new We.Vector2(u.cx*e.lx,u.cy*e.ly).rotateAround(Dt,a);D.current.set(u.id,f),z.current.set(u.id,new We.Vector3(u.cx,u.cy));break;case V.Polygon:var p,y=u,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new We.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),W.current.set(u.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Ww.isPlantOrHuman(u)&&z.current.set(u.id,new We.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(h.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Ww.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),R.current.set(b.id,new We.Vector3(T,b.cy))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/t,O=F.y/e.ly;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}s(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}}if(Ww.isPlantOrHuman(b))if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(E,b.cy,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisTypeOnSurface:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&o.parentId===(null===b||void 0===b?void 0:b.parentId)&&!o.locked){var i=o;if(Math.abs(i.lx-e)>At)return!0}}}catch(r){l.e(r)}finally{l.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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(y){case _.AllObjectsOfThisTypeOnSurface:var i,r=new Map,n=Object(h.a)(a);try{for(n.s();!(i=n.n()).done;){var d=i.value;d.type!==V.Cuboid||d.parentId!==b.parentId||d.locked||(r.set(d.id,d.lx),N(d,e))}}catch(v){n.e(v)}finally{n.f()}var g={name:"Set Length for All Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(v){t.e(v)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(h.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];f(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),E(w,y))}}catch(v){r.e(v)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var b,A=Object(h.a)(g.oldChildrenVerticesMap.entries());try{for(A.s();!(b=A.n()).done;){var T=Object(u.a)(b.value,2),P=T[0],S=T[1];s(P,S)}}catch(v){A.e(v)}finally{A.f()}}},redo:function(){if(function(e){var t,l=Object(h.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)||N(o,e)}}catch(v){l.e(v)}finally{l.f()}}(g.newSize),g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(g.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];f(r,n.x,n.y,n.z);var c=null===(l=g.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=g.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(U(d,c,r),E(d,r))}}catch(v){t.e(v)}finally{t.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(g.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:N(b,e);var m={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(c(b.id,m.oldSize),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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];f(i,r.x,r.y,r.z);var n=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(n,d,i),E(n,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.oldChildrenVerticesMap&&m.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}},redo:function(){if(c(b.id,m.newSize),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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];f(i,r.x,r.y,r.z);var n=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(d,n,i),E(d,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.newChildrenVerticesMap&&m.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];s(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(m),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",k),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 500] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",k)})]})})})]})})},DS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(en),n=Xw(nn),c=Xw(wn),s=Xw(Pn),f=Xw(Kn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(si),w=Xw(Ii),x=Xw(Ci),v=Xw(Fi),b=NP(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],H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),F=Object(r.useRef)(),k=$f(),O=function(e){return!function(e){if(b){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid){var r=o,n=i(r.id);if(n.length>0&&!Ww.doesNewSizeContainAllChildren(r,n,r.lx,e))return!1}}}catch(s){l.e(s)}finally{l.f()}break;default:var c=i(b.id);if(c.length>0)return Ww.doesNewSizeContainAllChildren(b,c,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(h.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(h.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=Nt.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(h.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 We.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new We.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new We.Vector3(r.x,r.y,0)),j.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},N=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(h.a)(l);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(Ww.isIdentical(n.normal,Tt))switch(n.type){case V.SolarPanel:case V.Sensor:var u=new We.Vector2(n.cx*e.lx,n.cy*e.ly).rotateAround(Dt,a);D.current.set(n.id,u),z.current.set(n.id,new We.Vector3(n.cx,n.cy));break;case V.Polygon:var p,y=n,g=[],m=Object(h.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new We.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),W.current.set(n.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Ww.isPlantOrHuman(n)&&z.current.set(n.id,new We.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(h.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Ww.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 We.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;c(b.id,T),R.current.set(b.id,new We.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,j=[],C=Object(h.a)(P);try{for(C.s();!(S=C.n()).done;){var F=S.value.rotateAround(Dt,-a),k=F.x/e.lx,O=F.y/t;j.push({x:k,y:O})}}catch(J){C.e(J)}finally{C.f()}f(b.id,j),M.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}}if(Ww.isPlantOrHuman(b))if(R.current.set(b.id,new We.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var N=Nt.getState().contentRef,U=Y(null===N||void 0===N?void 0:N.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,E),R.current.set(b.id,new We.Vector3(b.cz,E,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Nt.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)()}}},E=function(e,t){e&&m((function(l){var a,o=Object(h.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 _.AllObjectsOfThisTypeOnSurface:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&o.parentId===(null===b||void 0===b?void 0:b.parentId)&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(r){l.e(r)}finally{l.f()}break;case _.AllObjectsOfThisType: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(F.current=void 0,C.current=O(e),C.current)F.current=e,S(l);else switch(z.current.clear(),R.current.clear(),W.current.clear(),M.current.clear(),y){case _.AllObjectsOfThisTypeOnSurface:var i,r=new Map,c=Object(h.a)(a);try{for(c.s();!(i=c.n()).done;){var d=i.value;d.type!==V.Cuboid||d.parentId!==b.parentId||d.locked||(r.set(d.id,d.ly),N(d,e))}}catch(v){c.e(v)}finally{c.f()}var g={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(h.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(v){t.e(v)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(h.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),E(w,y))}}catch(v){r.e(v)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var b,A=Object(h.a)(g.oldChildrenVerticesMap.entries());try{for(A.s();!(b=A.n()).done;){var T=Object(u.a)(b.value,2),P=T[0],S=T[1];f(P,S)}}catch(v){A.e(v)}finally{A.f()}}},redo:function(){if(function(e){var t,l=Object(h.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)||N(o,e)}}catch(v){l.e(v)}finally{l.f()}}(g.newSize),g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(g.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=g.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=g.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(U(d,s,r),E(d,r))}}catch(v){t.e(v)}finally{t.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(g.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:N(b,e);var m={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(W.current),newChildrenVerticesMap:new Map(M.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(s(b.id,m.oldSize),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(c,d,i),E(c,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.oldChildrenVerticesMap&&m.oldChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}},redo:function(){if(s(b.id,m.newSize),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(h.a)(m.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=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=m.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(d,c,i),E(d,i))}}catch(v){t.e(v)}finally{t.f()}}if(m.newChildrenVerticesMap&&m.newChildrenVerticesMap.size>0){var p,y=Object(h.a)(m.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),w=g[0],x=g[1];f(w,x)}}catch(v){y.e(v)}finally{y.f()}}}};p(m),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",k),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 500] ",me.t("word.MeterAbbreviation",k)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",k)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",k)})]})})})]})})},WS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw($r),n=Xw(Zr),c=Xw(jn),s=Xw(xn),d=Xw(zn),f=Xw(vn),p=Xw(Sr),y=Xw(qn),g=Xw(Qn),m=Xw(nn),w=Xw(Ii),x=Xw(Ci),v=NP(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),H=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=$f(),D=function(e,t){c(e,t),s(e,t/2)},W=function(e){if(v){var t=i(v);if(t){var l,a=Object(h.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()}}}},M=function(e){if(v){var t=Ww.getBaseId(v.id);if(t){var l,a=Object(h.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type!==V.Cuboid||i.locked||Ww.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(h.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(h.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=Nt.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 We.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new We.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,z.current.set(l.id,new We.Vector3(c.x,c.y,0)),H.current.set(l.id,xt)}},F=function(e,t){a((function(l){var a,o=Object(h.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),j.current.set(i.id,new We.Vector3(i.cx,i.cy,i.cz)),Ww.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Nt.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 We.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},k=function(e,t,l){if(e&&t){var a=Nt.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)()}}},O=function(e,t){e&&a((function(l){var a,o=Object(h.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){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r=Ww.getBaseId(null===v||void 0===v?void 0:v.id);if(r&&r!==xt){var n,c=Object(h.a)(o);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Cuboid&&s.parentId&&s.parentId!==xt&&!s.locked){var d=s;if(r===Ww.getBaseId(d.id)&&Math.abs(d.lz-e)>At)return!0}}}catch(m){c.e(m)}finally{c.f()}}break;case _.AllObjectsOfThisTypeOnSurface:var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.Cuboid&&p.parentId!==xt&&p.parentId===(null===v||void 0===v?void 0:v.parentId)&&!p.locked){var g=p;if(Math.abs(g.lz-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,i=Object(h.a)(o);try{for(i.s();!(t=i.n()).done;){var r=t.value;r.type===V.Cuboid&&(l.set(r.id,r.lz),F(r,e))}}catch(J){i.e(J)}finally{i.f()}var c={name:"Set Height for All Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(c.oldChildrenPositionsMap&&c.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(c.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,s,d=Object(u.a)(i.value,2),f=d[0],p=d[1];m(f,p.x,p.y,p.z);var y=null===(n=c.oldChildrenParentIdMap)||void 0===n?void 0:n.get(f),g=null===(s=c.newChildrenParentIdMap)||void 0===s?void 0:s.get(f);y&&g&&y!==g&&(k(y,g,f),O(y,f))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=c.newValue;if(d(V.Cuboid,e),f(V.Cuboid,e/2),c.newChildrenPositionsMap&&c.newChildrenPositionsMap.size>0){var t,l=Object(h.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),p=null===(o=c.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&p&&s!==p&&(k(p,s,r),O(p,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(c),d(V.Cuboid,e),f(V.Cuboid,e/2),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:var s,g=new Map,b=Ww.getBaseId(v.id),A=Object(h.a)(o);try{for(A.s();!(s=A.n()).done;){var T=s.value;T.type===V.Cuboid&&Ww.getBaseId(T.id)===b&&(g.set(T.id,T.lz),F(T,e))}}catch(J){A.e(J)}finally{A.f()}var P={name:"Set Height for All Cuboids Above Same Base",timestamp:Date.now(),oldValues:g,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],f=s[1];m(d,f.x,f.y,f.z);var p=null===(n=P.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=P.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(k(p,y,d),O(p,d))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=P.newValue;if(M(e),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var t,l=Object(h.a)(P.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=P.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(k(s,c,r),O(s,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(P),M(e),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var R,I=new Map,C=Object(h.a)(o);try{for(C.s();!(R=C.n()).done;){var Y=R.value;Y.type===V.Cuboid&&Y.parentId===v.parentId&&(I.set(Y.id,Y.lz),F(Y,e))}}catch(J){C.e(J)}finally{C.f()}var L={name:"Set Height for All Cuboids on Same Surface",timestamp:Date.now(),oldValues:I,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(h.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];D(a,o)}}catch(J){t.e(J)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(h.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],f=s[1];m(d,f.x,f.y,f.z);var p=null===(n=L.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=L.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(k(p,y,d),O(p,d))}}catch(J){r.e(J)}finally{r.f()}}},redo:function(){var e=L.newValue;if(W(e),L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var t,l=Object(h.a)(L.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=L.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=L.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(k(s,c,r),O(s,r))}}catch(J){l.e(J)}finally{l.f()}}}};p(L),W(e),x(w+1);break;default:var N=n(v.id),U=N?N.lz:v.lz;F(v,e),D(v.id,e);var E={name:"Set Cuboid Width",timestamp:Date.now(),oldValue:U,newValue:e,oldChildrenPositionsMap:new Map(j.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(H.current),changedElementId:v.id,changedElementType:v.type,undo:function(){if(D(E.changedElementId,E.oldValue),E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var e,t=Object(h.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];m(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&&(k(n,c,i),O(n,i))}}catch(J){t.e(J)}finally{t.f()}}},redo:function(){if(D(E.changedElementId,E.newValue),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var e,t=Object(h.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];m(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&&(k(c,n,i),O(c,i))}}catch(J){t.e(J)}finally{t.f()}}}};p(E),x(w+1)}a((function(t){t.actionState.cuboidHeight=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",R),onApply:function(){Y(T)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",R),": [0.1, 1000] ",me.t("word.MeterAbbreviation",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",R)}),(null===v||void 0===v?void 0:v.parentId)!==xt&&Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("cuboidMenu.AllCuboidsAboveSameBase",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",R)})]})})})]})})},MS=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Un),n=Xw(Sr),c=Xw(qn),s=Xw(Qn),d=Xw(Ii),f=Xw(Ci),p=NP(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(h.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){if(p&&function(e){var t;switch(c){case _.AllObjectsOfThisTypeOnSurface:var l,o=Object(h.a)(a);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Cuboid&&i.parentId===(null===p||void 0===p?void 0:p.parentId)&&!i.locked){var r=i;if(Math.abs(-r.rotation[2]-e)>At)return!0}}}catch(n){o.e(n)}finally{o.f()}break;case _.AllObjectsOfThisType: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 _.AllObjectsOfThisTypeOnSurface:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type!==V.Cuboid||s.parentId!==p.parentId||s.locked||l.set(s.id,-s.rotation[2])}}catch(x){r.e(x)}finally{r.f()}var y={name:"Set Azimuth for All Cuboids on Surface",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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];i(a,0,0,-o)}}catch(x){t.e(x)}finally{t.f()}},redo:function(){v(y.newValue)}};n(y),v(e),f(d+1);break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:var g=o(p.id),m=g?-g.rotation[2]:-p.rotation[2],w={name:"Set Cuboid Azimuth",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(w.changedElementId,0,0,-w.oldValue)},redo:function(){i(w.changedElementId,0,0,-w.newValue)}};n(w),i(p.id,0,0,-e),f(d+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Azimuth",x),onApply:function(){b(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Ww.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",x)})]})})})]})})},IS=l.p+"static/media/building_facade_05_menu.8fe3496b.png",CS=l.p+"static/media/building_facade_06_menu.4342d26b.png",FS=l.p+"static/media/building_facade_10_menu.de5158c9.png",kS=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(ki),o=Xw(Sr),i=Xw(qn),n=Xw(Qn),c=Xw(rn),s=Xw(Ii),d=Xw(Ci),p=NP(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=yb.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(h.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(h.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){l((function(t){var l,a=Object(h.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()}}))},P=function(e){if(p&&function(e){if(p){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked){var r=o;if(r.textureTypes)for(var n=0;n<4;n++)if(e!==r.textureTypes[n])return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.OnlyThisObject:if(p.textureTypes)for(var s=0;s<4;s++)if(e!==p.textureTypes[s])return!0;break;default:if(c>=0&&p.textureTypes&&e!==p.textureTypes[c])return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,r=new Map,n=Object(h.a)(a);try{for(n.s();!(t=n.n()).done;){var y=t.value;if(y.type===V.Cuboid){var g=y;r.set(y.id,g.textureTypes?Object(f.a)(g.textureTypes):void 0)}}}catch(S){n.e(S)}finally{n.f()}var m={name:"Set Texture for All Cuboids",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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 v=p.textureTypes?p.textureTypes[c]:de.NoTexture,P={name:"Set Texture for Selected Side of Cuboid",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:p.id,changedElementType:p.type,changedSideIndex:c,undo:function(){void 0!==P.changedSideIndex&&b(P.changedSideIndex,P.changedElementId,P.oldValue)},redo:function(){void 0!==P.changedSideIndex&&b(P.changedSideIndex,P.changedElementId,P.newValue)}};o(P),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(pf.jsx)(EP,{width:600,title:me.t("word.Texture",x),onApply:function(){P(m)},onClose:function(){(null===p||void 0===p?void 0:p.textureTypes)&&c>=0&&w(p.textureTypes[c]),t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(pf.jsxs)(v,{value:de.NoTexture,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade01,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade02,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade03,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade04,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade05,children:[Object(pf.jsx)("img",{alt:de.Facade05,src:IS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture05",x)]},de.Facade05),Object(pf.jsxs)(v,{value:de.Facade06,children:[Object(pf.jsx)("img",{alt:de.Facade06,src:CS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture06",x)]},de.Facade06),Object(pf.jsxs)(v,{value:de.Facade07,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade08,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade09,children:[Object(pf.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(pf.jsxs)(v,{value:de.Facade10,children:[Object(pf.jsx)("img",{alt:de.Facade10,src:FS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture10",x)]},de.Facade10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){n(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",x)})]})})})]})})},OS=n.a.memo((function(){var e,t,l,a,o=Xw(si),i=Xw(Vi),n=Xw(Sr),c=Xw(fs),s=Xw($c),d=Xw(Qn),p=Xw(rs),y=Xw(Kc),g=Xw(Ci),m=Xw(rn),w=Xw(as),x=NP(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),H=S[0],j=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)(!1),U=Object(u.a)(N,2),E=U[0],J=U[1],G=IP(x),X=G.labelText,B=G.setLabelText,K=CP(x),q=FP(x,X),Q=kP(x),Z=OP(x),$=YP(x),ee=LP(x);if(!x)return null;var te=x?c(x.id,!1):new Ow,le=!(null===x||void 0===x?void 0:x.locked),ae={lng:i},oe=function(){o((function(e){var t,l=Object(h.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(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"cuboid-paste"}),Object(pf.jsx)(zP,{keyName:"cuboid-copy"}),le&&Object(pf.jsx)(RP,{keyName:"cuboid-cut"}),Object(pf.jsx)(DP,{keyName:"cuboid-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:x.stackable,onChange:function(e){o((function(e){var t,l=Object(h.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(pf.jsxs)(MP.a,{title:me.t("word.Clear",ae),style:{paddingLeft:"24px"},children:[te.sensorCount>0&&Object(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid",ae)+" ("+te.sensorCount+" "+me.t("cuboidMenu.Sensors",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid",ae)+" ("+te.solarPanelModuleCount+" "+me.t("cuboidMenu.SolarPanels",ae)+", "+te.solarPanelCount+" "+me.t("cuboidMenu.Racks",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid",ae)+" ("+te.polygonCount+" "+me.t("cuboidMenu.Polygons",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid",ae)+" ("+te.humanCount+" "+me.t("cuboidMenu.Humans",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid",ae)+" ("+te.treeCount+" "+me.t("cuboidMenu.Trees",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid",ae)+" ("+te.flowerCount+" "+me.t("cuboidMenu.Flowers",ae)+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){if(x){var e=Xw.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(f.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(pf.jsxs)(pf.Fragment,{children:[A&&Object(pf.jsx)(zS,{setDialogVisible:T}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),T(!0)},children:[me.t("word.Color",ae)," ..."]},"cuboid-color")]}),le&&Object(pf.jsxs)(pf.Fragment,{children:[H&&Object(pf.jsx)(kS,{setDialogVisible:j}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),j(!0)},children:[me.t("word.Texture",ae)," ..."]},"cuboid-texture"),C&&Object(pf.jsx)(RS,{setDialogVisible:F}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),F(!0)},children:[me.t("word.Length",ae)," ..."]},"cuboid-length"),D&&Object(pf.jsx)(DS,{setDialogVisible:W}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),W(!0)},children:[me.t("word.Width",ae)," ..."]},"cuboid-width"),Y&&Object(pf.jsx)(WS,{setDialogVisible:L}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),L(!0)},children:[me.t("word.Height",ae)," ..."]},"cuboid-height"),E&&Object(pf.jsx)(MS,{setDialogVisible:J}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Xw.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),J(!0)},children:[me.t("word.Azimuth",ae)," ..."]},"cuboid-azimuth")]}),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(x){o((function(e){e.objectTypeToAdd=V.Polygon}));var e,t=Ww.getWorldDataById(x.id).pos;switch(m){case 0:e=St;break;case 1:e=Ht;break;case 2:e=jt;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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===x||void 0===x?void 0:x.showLabel),onChange:K,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"cuboid-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})})),YS=n.a.memo((function(){var e,t,l,a=Xw(si),r=Xw(ki),n=Xw(qc),c=Xw(hn),s=Xw(dn),d=Xw(Sr),p=Xw(i.latitude),y=null!==(e=Xw(i.leafDayOfYear1))&&void 0!==e?e:rt,g=null!==(t=Xw(i.leafDayOfYear2))&&void 0!==t?t:nt,m=null!==(l=Xw(i.monthlyIrradianceLosses))&&void 0!==l?l:new Array(12).fill(.05),w=Xw((function(e){return e.world.ground.albedo})),x=Xw(o.groundColor),v=Xw(o.groundImage),b=Xw(o.waterSurface),A=Xw(Vi),T=Xw(as),P={lng:A},S=Xw.getState().countAllElementsByType(!0),H=S.treeCount,j=S.flowerCount,z=S.humanCount,R=S.foundationCount,D=S.cuboidCount,W=S.solarPanelCount,M=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}))},F=function(e){a((function(t){t.viewState.groundColor=e}))},k=function(e){a((function(t){t.world.ground.albedo=e}))},O=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(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"ground-paste"}),z>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllPeople",P)+" ("+z+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Human)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedPeople",P)," (",z,")"]},"ground-remove-all-humans"),H>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllTrees",P)+" ("+H+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Tree)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedTrees",P)," (",H,")"]},"ground-remove-all-trees"),j>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFlowers",P)+" ("+j+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Flower)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFlowers",P)," (",j,")"]},"ground-remove-all-flowers"),W>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllSolarPanels",P)+" ("+W+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.SolarPanel)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedSolarPanels",P)," (",W,")"]},"ground-remove-all-solar-panels"),R>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFoundations",P)+" ("+R+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Foundation)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFoundations",P)," (",R,")"]},"ground-remove-all-foundations"),D>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){lb.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllCuboids",P)+" ("+D+")?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var e=Xw.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(f.a)(l.removedElements))}))},redo:function(){n(V.Cuboid)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedCuboids",P)," (",D,")"]},"ground-remove-all-cuboids"),M&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.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(h.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"),!M&&r.length>0&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(h.a)(Xw.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(h.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(MP.a,{title:me.t("word.Color",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsx)(VP.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(){F(a.oldValue)},redo:function(){F(a.newValue)}};d(a),F(l)}})},"ground-color"),Object(pf.jsx)(MP.a,{title:me.t("groundMenu.Vegetation",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(MP.a,{title:me.t("groundMenu.MonthlyIrradianceLoss",{lng:A}),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(0,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(1,e)}})]},"irradiance-loss-jan"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(2,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(3,e)}})]},"irradiance-loss-mar"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(4,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(5,e)}})]},"irradiance-loss-may"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(6,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(7,e)}})]},"irradiance-loss-jul"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(8,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(9,e)}})]},"irradiance-loss-sep"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(10,e)}}),Object(pf.jsx)(ob.a,{addonBefore:Object(pf.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){O(11,e)}})]},"irradiance-loss-nov")]})},"monthly-irradiance-loss"),Object(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"60px"},children:[me.t("groundMenu.Albedo",P),":"]}),Object(pf.jsx)(ob.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(){k(a.oldValue)},redo:function(){k(a.newValue)}};d(a),k(l)}}})]},"ground-albedo")})]})})),LS=yb.a.Option,NS=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.humanName=e})),s(!c)}}},children:[Object(pf.jsxs)(LS,{value:ne.Jack,children:[Object(pf.jsx)("img",{alt:ne.Jack,src:Et,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jack",d)]},ne.Jack),Object(pf.jsxs)(LS,{value:ne.Jacob,children:[Object(pf.jsx)("img",{alt:ne.Jacob,src:Vt,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jacob",d)]},ne.Jacob),Object(pf.jsxs)(LS,{value:ne.Jacqueline,children:[Object(pf.jsx)("img",{alt:ne.Jacqueline,src:Jt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jacqueline",d)]},ne.Jacqueline),Object(pf.jsxs)(LS,{value:ne.Jaah,children:[Object(pf.jsx)("img",{alt:ne.Jaah,src:Ut,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaah",d)]},ne.Jaah),Object(pf.jsxs)(LS,{value:ne.Jade,children:[Object(pf.jsx)("img",{alt:ne.Jade,src:Gt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jade",d)]},ne.Jade),Object(pf.jsxs)(LS,{value:ne.Jamelia,children:[Object(pf.jsx)("img",{alt:ne.Jamelia,src:Xt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jamelia",d)]},ne.Jamelia),Object(pf.jsxs)(LS,{value:ne.James,children:[Object(pf.jsx)("img",{alt:ne.James,src:Bt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.James",d)]},ne.James),Object(pf.jsxs)(LS,{value:ne.Jane,children:[Object(pf.jsx)("img",{alt:ne.Jane,src:Kt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jane",d)]},ne.Jane),Object(pf.jsxs)(LS,{value:ne.Jaya,children:[Object(pf.jsx)("img",{alt:ne.Jaya,src:qt,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaya",d)]},ne.Jaya),Object(pf.jsxs)(LS,{value:ne.Jaye,children:[Object(pf.jsx)("img",{alt:ne.Jaye,src:Qt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jaye",d)]},ne.Jaye),Object(pf.jsxs)(LS,{value:ne.Jeanette,children:[Object(pf.jsx)("img",{alt:ne.Jeanette,src:Zt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jeanette",d)]},ne.Jeanette),Object(pf.jsxs)(LS,{value:ne.Jedi,children:[Object(pf.jsx)("img",{alt:ne.Jedi,src:_t,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jedi",d)]},ne.Jedi),Object(pf.jsxs)(LS,{value:ne.Jeff,children:[Object(pf.jsx)("img",{alt:ne.Jeff,src:$t,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jeff",d)]},ne.Jeff),Object(pf.jsxs)(LS,{value:ne.Jena,children:[Object(pf.jsx)("img",{alt:ne.Jena,src:el,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jena",d)]},ne.Jena),Object(pf.jsxs)(LS,{value:ne.Jennifer,children:[Object(pf.jsx)("img",{alt:ne.Jennifer,src:tl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jennifer",d)]},ne.Jennifer),Object(pf.jsxs)(LS,{value:ne.Jess,children:[Object(pf.jsx)("img",{alt:ne.Jess,src:ll,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jess",d)]},ne.Jess),Object(pf.jsxs)(LS,{value:ne.Jett,children:[Object(pf.jsx)("img",{alt:ne.Jett,src:al,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jett",d)]},ne.Jett),Object(pf.jsxs)(LS,{value:ne.Jill,children:[Object(pf.jsx)("img",{alt:ne.Jill,src:ol,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jill",d)]},ne.Jill),Object(pf.jsxs)(LS,{value:ne.Jiya,children:[Object(pf.jsx)("img",{alt:ne.Jiya,src:il,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jiya",d)]},ne.Jiya),Object(pf.jsxs)(LS,{value:ne.Joan,children:[Object(pf.jsx)("img",{alt:ne.Joan,src:rl,height:20,style:{paddingRight:"8px"}})," ",me.t("people.Joan",d)]},ne.Joan),Object(pf.jsxs)(LS,{value:ne.Jocelyn,children:[Object(pf.jsx)("img",{alt:ne.Jocelyn,src:nl,height:20,style:{paddingRight:"23px"}})," ",me.t("people.Jocelyn",d)]},ne.Jocelyn),Object(pf.jsxs)(LS,{value:ne.Joel,children:[Object(pf.jsx)("img",{alt:ne.Joel,src:cl,height:20,style:{paddingRight:"7px"}})," ",me.t("people.Joel",d)]},ne.Joel),Object(pf.jsxs)(LS,{value:ne.Joey,children:[Object(pf.jsx)("img",{alt:ne.Joey,src:sl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joey",d)]},ne.Joey),Object(pf.jsxs)(LS,{value:ne.John,children:[Object(pf.jsx)("img",{alt:ne.John,src:dl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.John",d)]},ne.John),Object(pf.jsxs)(LS,{value:ne.Jonathon,children:[Object(pf.jsx)("img",{alt:ne.Jonathon,src:ul,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jonathon",d)]},ne.Jonathon),Object(pf.jsxs)(LS,{value:ne.Jose,children:[Object(pf.jsx)("img",{alt:ne.Jose,src:fl,height:20,style:{paddingRight:"5px"}})," ",me.t("people.Jose",d)]},ne.Jose),Object(pf.jsxs)(LS,{value:ne.Joseph,children:[Object(pf.jsx)("img",{alt:ne.Joseph,src:hl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joseph",d)]},ne.Joseph),Object(pf.jsxs)(LS,{value:ne.Joshua,children:[Object(pf.jsx)("img",{alt:ne.Joshua,src:pl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joshua",d)]},ne.Joshua),Object(pf.jsxs)(LS,{value:ne.Judd,children:[Object(pf.jsx)("img",{alt:ne.Judd,src:yl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judd",d)]},ne.Judd),Object(pf.jsxs)(LS,{value:ne.Judy,children:[Object(pf.jsx)("img",{alt:ne.Judy,src:gl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judy",d)]},ne.Judy),Object(pf.jsxs)(LS,{value:ne.Julia,children:[Object(pf.jsx)("img",{alt:ne.Julia,src:ml,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Julia",d)]},ne.Julia),Object(pf.jsxs)(LS,{value:ne.Julio,children:[Object(pf.jsx)("img",{alt:ne.Julio,src:wl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Julio",d)]},ne.Julio),Object(pf.jsxs)(LS,{value:ne.Jumapili,children:[Object(pf.jsx)("img",{alt:ne.Jumapili,src:xl,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jumapili",d)]},ne.Jumapili),Object(pf.jsxs)(LS,{value:ne.June,children:[Object(pf.jsx)("img",{alt:ne.June,src:vl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.June",d)]},ne.June),Object(pf.jsxs)(LS,{value:ne.Juro,children:[Object(pf.jsx)("img",{alt:ne.Juro,src:bl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Juro",d)]},ne.Juro),Object(pf.jsxs)(LS,{value:ne.Justin,children:[Object(pf.jsx)("img",{alt:ne.Justin,src:Al,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Justin",d)]},ne.Justin)]})},US=l(305),ES=n.a.memo((function(){var e,t=Xw(si),l=Xw(Sr),a=Xw($r),i=Xw(is),n=Xw(Vi),c=null!==(e=Xw(o.orthographic))&&void 0!==e&&e,s=NP(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(h.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(h.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(US.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=Ww.absoluteHumanOrTreeCoordinates(e,l,o,r);e=n.x,l=n.y,o=n.z}var c=Xw.getState().cameraDirection.clone().normalize().multiplyScalar(.5);e+=c.x,l+=c.y;var d=Object(f.a)(Xw.getState().viewState.cameraPosition);new US.b(d).to([e,l,o],1e3).easing(US.a.Quadratic.In).onUpdate((function(e){!function(e,l,a){var o=Nt.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"human-copy"}),m&&Object(pf.jsx)(RP,{keyName:"human-cut"}),Object(pf.jsx)(DP,{keyName:"human-lock"}),m&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{onClick:function(){g(!y),b.current=!0},style:{paddingLeft:"36px"},children:me.t("peopleMenu.ViewFromThisPerson",{lng:n})},"human-move-view"),m&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"120px"},children:[me.t("peopleMenu.ChangePerson",{lng:n}),": "]}),Object(pf.jsx)(NS,{},"humans")]},"human-change-person")})]}):null})),VS=yb.a.Option,JS=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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=El.fetchSpread(l),r.lz=El.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.flowerType=e})),s(!c)}}},children:[Object(pf.jsxs)(VS,{value:ie.WhiteFlower,children:[Object(pf.jsx)("img",{alt:ie.WhiteFlower,src:Nl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.WhiteFlower",d)]},ie.WhiteFlower),Object(pf.jsxs)(VS,{value:ie.YellowFlower,children:[Object(pf.jsx)("img",{alt:ie.YellowFlower,src:Ul,height:20,style:{paddingRight:"16px"}})," ",me.t("flower.YellowFlower",d)]},ie.YellowFlower),Object(pf.jsxs)(VS,{value:ie.Hibiscus,children:[Object(pf.jsx)("img",{alt:ie.Hibiscus,src:Wl,height:20,style:{paddingRight:"19px"}})," ",me.t("flower.Hibiscus",d)]},ie.Hibiscus),Object(pf.jsxs)(VS,{value:ie.Hydrangea,children:[Object(pf.jsx)("img",{alt:ie.Hydrangea,src:Ml,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hydrangea",d)]},ie.Hydrangea),Object(pf.jsxs)(VS,{value:ie.Spirea,children:[Object(pf.jsx)("img",{alt:ie.Spirea,src:kl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Spirea",d)]},ie.Spirea),Object(pf.jsxs)(VS,{value:ie.Hosta,children:[Object(pf.jsx)("img",{alt:ie.Hosta,src:Il,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hosta",d)]},ie.Hosta),Object(pf.jsxs)(VS,{value:ie.Peony,children:[Object(pf.jsx)("img",{alt:ie.Peony,src:Cl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.Peony",d)]},ie.Peony),Object(pf.jsxs)(VS,{value:ie.Boxwood,children:[Object(pf.jsx)("img",{alt:ie.Boxwood,src:Hl,height:20,style:{paddingRight:"23px"}})," ",me.t("flower.Boxwood",d)]},ie.Boxwood),Object(pf.jsxs)(VS,{value:ie.TallBush,children:[Object(pf.jsx)("img",{alt:ie.TallBush,src:Yl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.TallBush",d)]},ie.TallBush),Object(pf.jsxs)(VS,{value:ie.CactusCombo1,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo1,src:jl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo1",d)]},ie.CactusCombo1),Object(pf.jsxs)(VS,{value:ie.CactusCombo2,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo2,src:zl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo2",d)]},ie.CactusCombo2),Object(pf.jsxs)(VS,{value:ie.CactusCombo3,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo3,src:Rl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo3",d)]},ie.CactusCombo3),Object(pf.jsxs)(VS,{value:ie.CactusCombo4,children:[Object(pf.jsx)("img",{alt:ie.CactusCombo4,src:Dl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo4",d)]},ie.CactusCombo4),Object(pf.jsxs)(VS,{value:ie.RedRose,children:[Object(pf.jsx)("img",{alt:ie.RedRose,src:Fl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.RedRose",d)]},ie.RedRose),Object(pf.jsxs)(VS,{value:ie.Bellflower,children:[Object(pf.jsx)("img",{alt:ie.Bellflower,src:Sl,height:20,style:{paddingRight:"20px"}})," ",me.t("flower.Bellflower",d)]},ie.Bellflower),Object(pf.jsxs)(VS,{value:ie.Sunflower,children:[Object(pf.jsx)("img",{alt:ie.Sunflower,src:Ol,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.Sunflower",d)]},ie.Sunflower),Object(pf.jsxs)(VS,{value:ie.Tulip,children:[Object(pf.jsx)("img",{alt:ie.Tulip,src:Ll,height:20,style:{paddingRight:"24px"}})," ",me.t("flower.Tulip",d)]},ie.Tulip)]})},GS=function(){var e=NP(V.Flower),t=Xw(si),l=Xw(Vi),a=Xw(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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"flower-copy"}),i&&Object(pf.jsx)(RP,{keyName:"flower-cut"}),Object(pf.jsx)(DP,{keyName:"flower-lock"}),i&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a,{children:Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("flowerMenu.Type",o),": "]}),Object(pf.jsx)(JS,{},"flowers")]},"flower-change-type")})]})},XS=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(In),s=Xw(Cn),d=Xw(Fn),f=Xw(kn),p=Xw(Sr),y=Xw(Gn),g=Xw(Xn),m=Xw(Ii),w=Xw(Ci),x=NP(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){if(x&&function(e){if(x){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.lineColor)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===x.parentId&&Ww.isIdentical(n.normal,x.normal)&&!n.locked&&n.lineColor!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!d.locked&&d.lineColor!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==(null===x||void 0===x?void 0:x.lineColor))return!0}return!1}}(e))switch(y){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon)l.set(g.id,null!==(r=g.lineColor)&&void 0!==r?r:"black")}}catch(k){a.e(k)}finally{a.f()}var v={name:"Set Line Color for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){f(V.Polygon,v.newValue)}};p(v),f(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var b,A=new Map,T=Object(h.a)(o);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.parentId===x.parentId&&Ww.isIdentical(S.normal,x.normal))A.set(S.id,null!==(P=S.lineColor)&&void 0!==P?P:"gray")}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Line Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:A,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&s(V.Polygon,H.groupId,H.normal,H.newValue)}};p(H),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===x.foundationId)z.set(W.id,null!==(D=W.lineColor)&&void 0!==D?D:"black")}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Line Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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];c(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&d(V.Polygon,M.groupId,M.newValue)}};p(M),d(V.Polygon,x.foundationId,e),w(m+1)}break;default:var I=i(x.id),C=I?I.lineColor:x.lineColor,F={name:"Set Line Color of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(F.changedElementId,F.oldValue)},redo:function(){c(F.changedElementId,F.newValue)}};p(F),c(x.id,e),w(m+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.LineColor",P),onApply:function(){S(A)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},BS=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Rn),s=Xw(Dn),d=Xw(Wn),f=Xw(Mn),p=Xw(Sr),y=Xw(Gn),g=Xw(Xn),m=Xw(Ii),w=Xw(Ci),x=NP(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){if(x&&function(e){if(x){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.color)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.foundationId===x.foundationId&&!n.locked&&n.color!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(h.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===x.parentId&&Ww.isIdentical(d.normal,x.normal)&&!d.locked&&d.color!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==x.color)return!0}return!1}}(e))switch(y){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon)l.set(g.id,null!==(r=g.color)&&void 0!==r?r:"gray")}}catch(k){a.e(k)}finally{a.f()}var v={name:"Set Fill Color for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){f(V.Polygon,v.newValue)}};p(v),f(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var b,A=new Map,T=Object(h.a)(o);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.foundationId===x.foundationId)A.set(S.id,null!==(P=S.color)&&void 0!==P?P:"gray")}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Fill Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&d(V.Polygon,H.groupId,H.newValue)}};p(H),d(V.Polygon,x.foundationId,e),w(m+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.parentId===x.parentId&&Ww.isIdentical(W.normal,x.normal))z.set(W.id,null!==(D=W.color)&&void 0!==D?D:"gray")}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Fill Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:z,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(h.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];c(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&s(V.Polygon,M.groupId,M.normal,M.newValue)}};p(M),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;default:var I=i(x.id),C=I?I.color:x.color,F={name:"Set Fill Color of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(F.changedElementId,F.oldValue)},redo:function(){c(F.changedElementId,F.newValue)}};p(F),c(x.id,e),w(m+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.FillColor",P),onApply:function(){S(A)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},KS=l.p+"static/media/polygon_08_menu.e9d3ae98.png",qS=l.p+"static/media/polygon_10_menu.e1254bdd.png",QS=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Gn),d=Xw(Xn),f=Xw(Ii),p=Xw(Ci),y=NP(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=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Ww.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(h.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.textureType)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===y.parentId&&Ww.isIdentical(n.normal,y.normal)&&!n.locked&&n.textureType!==e)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(h.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.foundationId===y.foundationId&&!u.locked&&u.textureType!==e)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.textureType))return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon)l.set(d.id,null!==(r=d.textureType)&&void 0!==r?r:ce.NoTexture)}}catch(k){a.e(k)}finally{a.f()}var g={name:"Set Texture for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S(g.newValue)}};c(g),S(e),p(f+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon&&b.parentId===y.parentId&&Ww.isIdentical(b.normal,y.normal))w.set(b.id,null!==(v=b.textureType)&&void 0!==v?v:ce.NoTexture)}}catch(k){x.e(k)}finally{x.f()}var H={name:"Set Texture for All Polygons on Same Surface",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&T(H.groupId,H.normal,H.newValue)}};c(H),T(y.parentId,y.normal,e),p(f+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===y.foundationId)z.set(W.id,null!==(D=W.textureType)&&void 0!==D?D:ce.NoTexture)}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Texture for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&P(M.groupId,M.newValue)}};c(M),P(y.foundationId,e),p(f+1)}break;default:var I=i(y.id),C=I?I.textureType:y.textureType,F={name:"Set Texture of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(F.changedElementId,F.oldValue)},redo:function(){A(F.changedElementId,F.newValue)}};c(F),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:500,title:me.t("polygonMenu.FillTexture",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsxs)(b,{value:ce.NoTexture,children:[Object(pf.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(pf.jsxs)(b,{value:ce.Texture01,children:[Object(pf.jsx)("img",{alt:ce.Texture01,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture01",v)]},ce.Texture01),Object(pf.jsxs)(b,{value:ce.Texture02,children:[Object(pf.jsx)("img",{alt:ce.Texture02,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture02",v)]},ce.Texture02),Object(pf.jsxs)(b,{value:ce.Texture03,children:[Object(pf.jsx)("img",{alt:ce.Texture03,src:ZP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture03",v)]},ce.Texture03),Object(pf.jsxs)(b,{value:ce.Texture04,children:[Object(pf.jsx)("img",{alt:ce.Texture04,src:_P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture04",v)]},ce.Texture04),Object(pf.jsxs)(b,{value:ce.Texture05,children:[Object(pf.jsx)("img",{alt:ce.Texture05,src:$P,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture05",v)]},ce.Texture05),Object(pf.jsxs)(b,{value:ce.Texture06,children:[Object(pf.jsx)("img",{alt:ce.Texture06,src:eS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture06",v)]},ce.Texture06),Object(pf.jsxs)(b,{value:ce.Texture07,children:[Object(pf.jsx)("img",{alt:ce.Texture07,src:tS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture07",v)]},ce.Texture07),Object(pf.jsxs)(b,{value:ce.Texture08,children:[Object(pf.jsx)("img",{alt:ce.Texture08,src:KS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture08",v)]},ce.Texture08),Object(pf.jsxs)(b,{value:ce.Texture09,children:[Object(pf.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(pf.jsxs)(b,{value:ce.Texture10,children:[Object(pf.jsx)("img",{alt:ce.Texture10,src:qS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture10",v)]},ce.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},ZS=function(){function e(){Object(je.a)(this,e)}return Object(ke.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=Ww.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=Ww.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y}));x.x=v.x=T+w;var S=Ww.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y})),H=Math.max(P.length,S.length)/2;if(H>0)for(var j=0;j0)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}(),_S=function(){function e(){Object(je.a)(this,e)}return Object(ke.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,f=[],p=!Ww.isZero(t.rotation[2]),y=[],g=Object(h.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(je){g.e(je)}finally{g.f()}var w=p?Ww.rotatePolygon(y,t.cx,t.cy,t.rotation[2]):y,x=Ww.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},H={x:x.maxX(),y:0},j=0;j<=T;j++){var z=P+j*r;S.y=H.y=z-b;var R=Ww.polygonIntersections(S,H,w).sort((function(e,t){return e.x-t.x}));S.y=H.y=z+b;var D=Ww.polygonIntersections(S,H,w).sort((function(e,t){return e.x-t.x})),W=Math.max(R.length,D.length)/2;if(W>0)for(var M=0;M0){var q=Ww.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,Ww.changeOrientation(Q,l,a),f.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=Ww.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y}));le.x=ae.x=ie+b;var ne=Ww.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=Ww.relativeCoordinates(ie,(Ae+Te)/2,0,t),He=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);He.referenceId=e.id,Ww.changeOrientation(He,l,a),f.push(He)}}}return f}}]),e}(),$S=yb.a.Option,eH=function(e){var t,l=e.setDialogVisible,o=Xw(si),i=Xw(Vi),n=Xw(ki),c=Xw.getState().solarPanelArrayLayoutParams,s=Xw(an),d=Xw($r),f=Xw(Yi),p=Xw(Ni),y=Xw(pn),g=Xw(Zc),m=Xw(_c),w=Xw(Qc),x=Xw(Sr),v=Xw(Ii),b=Xw(Ci),A=Xw(Fi),T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)({left:0,top:0,bottom:0,right:0}),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useRef)(null),N=Object(r.useRef)(!0),U=Object(r.useRef)(null),E=Object(r.useRef)(null),J=Object(r.useRef)(!1),G=Object(r.useRef)(Xw(a.pvModelName)),X=Object(r.useRef)(Xw(a.rowAxis)),B=Object(r.useRef)(Xw(a.orientation)),K=Object(r.useRef)(Xw(a.tiltAngle)),q=Object(r.useRef)(Xw(a.rowWidth)),Q=Object(r.useRef)(Xw(a.interRowSpacing)),Z=Object(r.useRef)(null!==(t=Xw(a.margin))&&void 0!==t?t:0),_=Object(r.useRef)(Xw(a.poleHeight)),te=Object(r.useRef)(Xw(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=E.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?_S.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current):ZS.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(h.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:Xw.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(h.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(h.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)}}N.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(){N.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.referenceId!==e.id&&Ww.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(pf.jsxs)(pf.Fragment,{children:[R&&Object(pf.jsx)(lb.a,{width:400,visible:R,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){D(!1)},children:me.t("word.Cancel",le)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:E,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(pf.jsxs)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{disabled:!N.current,onClick:function(){ce(),J.current=!1},children:me.t("word.Apply",le)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){l(!1),A(),N.current=!0,J.current=!1},children:me.t("word.Cancel",le)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:U,onClick:function(){N.current?(ce(),J.current=!0):l(!1)},children:me.t("word.OK",le)},"OK")],onCancel:function(){l(!1),N.current=!0},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!I,bounds:O,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(pf.jsx)("div",{ref:L,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayModel",le)+" ("+Object.keys(f).length+" "+me.t("word.Options",le)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(yb.a,{defaultValue:"Custom",style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,N.current=!0,H(!S)},children:Object.keys(f).map((function(e){return Object(pf.jsx)($S,{value:e,children:e+(f[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",le)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowAxis",le)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,N.current=!0,H(!S)},children:[Object(pf.jsx)($S,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",le)},ee.leftRight),Object(pf.jsx)($S,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",le)},ee.upDown),Object(pf.jsx)($S,{value:ee.eastWest,children:me.t("polygonMenu.SolarPanelArrayEastWestRowAxis",le)},ee.eastWest),Object(pf.jsx)($S,{value:ee.northSouth,children:me.t("polygonMenu.SolarPanelArrayNorthSouthRowAxis",le)},ee.northSouth)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayOrientation",le)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,N.current=!0,H(!S)},children:[Object(pf.jsx)($S,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",le)},$.portrait),Object(pf.jsx)($S,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",le)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayTiltAngle",le)+" ([-90\xb0, 90\xb0]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:-90,max:90,style:{width:"100%"},precision:2,value:parseFloat(Ww.toDegrees(K.current).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){K.current=Ww.toRadians(e),N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowWidth",le)+" ([1-100] "+me.t("solarPanelMenu.Panels",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.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,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayInterRowSpacing",le)+" ([1, 20] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:1,max:20,style:{width:"100%"},precision:2,value:Q.current,step:.5,onChange:function(e){Q.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayMargin",le)+" ([0, 5] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:"100%"},precision:1,value:Z.current,step:.1,onChange:function(e){Z.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleHeight",le)+" ([0, 10] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:0,max:10,style:{width:"100%"},precision:2,value:_.current,step:.1,onChange:function(e){_.current=e,N.current=!0,H(!S)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleSpacing",le)+" ([2, 50] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{min:2,max:50,style:{width:"100%"},precision:2,value:te.current,step:.5,onChange:function(e){te.current=e,N.current=!0,H(!S)}})})]})]})]})},tH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Gn),d=Xw(Xn),f=Xw(Ii),p=Xw(Ci),y=NP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.lineStyle)&&void 0!==t?t:k.Solid),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Ww.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(h.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&e!==a.lineStyle)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===y.parentId&&Ww.isIdentical(n.normal,y.normal)&&!n.locked&&e!==n.lineStyle)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(h.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&e!==u.lineStyle)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.lineStyle))return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon)l.set(d.id,null!==(r=d.lineStyle)&&void 0!==r?r:k.Solid)}}catch(O){a.e(O)}finally{a.f()}var g={name:"Set Line Style for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){S(g.newValue)}};c(g),S(e),p(f+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon&&b.parentId===y.parentId&&Ww.isIdentical(b.normal,y.normal))w.set(b.id,null!==(v=b.lineStyle)&&void 0!==v?v:k.Solid)}}catch(O){x.e(O)}finally{x.f()}var H={name:"Set Line Style for All Polygons on Same Surface",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){H.groupId&&T(H.groupId,H.normal,H.newValue)}};c(H),T(y.parentId,y.normal,e),p(f+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var j,z=new Map,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===y.foundationId)z.set(W.id,null!==(D=W.lineStyle)&&void 0!==D?D:k.Solid)}}catch(O){R.e(O)}finally{R.f()}var M={name:"Set Line Style for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){M.groupId&&P(M.groupId,M.newValue)}};c(M),P(y.foundationId,e),p(f+1)}break;default:var I=i(y.id),C=I?I.lineStyle:y.lineStyle,F={name:"Set Line Style of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(F.changedElementId,F.oldValue)},redo:function(){A(F.changedElementId,F.newValue)}};c(F),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:600,title:me.t("polygonMenu.LineStyle",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"200px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsxs)(b,{value:k.Solid,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px solid dimGray"},children:" "}),me.t("polygonMenu.SolidLine",v)]},k.Solid),Object(pf.jsxs)(b,{value:k.Dashed,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dashed dimGray"},children:" "}),me.t("polygonMenu.DashedLine",v)]},k.Dashed),Object(pf.jsxs)(b,{value:k.Dotted,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dotted dimGray"},children:" "}),me.t("polygonMenu.DottedLine",v)]},k.Dotted)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},lH=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw($r),n=Xw(On),c=Xw(Yn),s=Xw(Ln),d=Xw(Nn),f=Xw(Sr),p=Xw(Gn),y=Xw(Xn),g=Xw(Ii),m=Xw(Ci),w=NP(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=yb.a.Option,S=function(e){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Polygon&&!o.locked&&e!==o.lineWidth)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var i,r=Object(h.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.parentId===w.parentId&&Ww.isIdentical(n.normal,w.normal)&&!n.locked&&n.lineWidth!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!d.locked&&d.lineWidth!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if(e!==(null===w||void 0===w?void 0:w.lineWidth))return!0}return!1}}(e))switch(p){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var y,x=t.value;if(x.type===V.Polygon)l.set(x.id,null!==(y=x.lineWidth)&&void 0!==y?y:1)}}catch(k){r.e(k)}finally{r.f()}var v={name:"Set Line Width for All Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){d(V.Polygon,v.newValue)}};f(v),d(V.Polygon,e),m(g+1);break;case _.AllObjectsOfThisTypeOnSurface:if(i(w)){var b,A=new Map,T=Object(h.a)(a);try{for(T.s();!(b=T.n()).done;){var P,S=b.value;if(S.type===V.Polygon&&S.parentId===w.parentId&&Ww.isIdentical(S.normal,w.normal))A.set(S.id,null!==(P=S.lineWidth)&&void 0!==P?P:1)}}catch(k){T.e(k)}finally{T.f()}var H={name:"Set Line Width for All Polygons on Same Surface",timestamp:Date.now(),oldValues:A,newValue:e,groupId:w.parentId,normal:w.normal,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){H.groupId&&c(V.Polygon,H.groupId,H.normal,H.newValue)}};f(H),c(V.Polygon,w.parentId,w.normal,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,z=new Map,R=Object(h.a)(a);try{for(R.s();!(j=R.n()).done;){var D,W=j.value;if(W.type===V.Polygon&&W.foundationId===w.foundationId)z.set(W.id,null!==(D=W.lineWidth)&&void 0!==D?D:1)}}catch(k){R.e(k)}finally{R.f()}var M={name:"Set Line Width for All Polygons Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];n(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&s(V.Polygon,M.groupId,M.newValue)}};f(M),s(V.Polygon,w.foundationId,e),m(g+1)}break;default:var I=o(w.id),C=I?I.lineWidth:w.lineWidth,F={name:"Set Line Width of Selected Polygon",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(F.changedElementId,F.oldValue)},redo:function(){n(F.changedElementId,F.newValue)}};f(F),n(w.id,e),m(g+1)}};return Object(pf.jsx)(EP,{width:560,title:me.t("polygonMenu.LineWidth",T),onApply:function(){S(b),l(!1),m(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"200px"},value:b,onChange:function(e){return A(e)},children:[Object(pf.jsx)(P,{value:O.One,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"1px solid dimGray"}})},O.One),Object(pf.jsx)(P,{value:O.Two,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"2px solid dimGray"}})},O.Two),Object(pf.jsx)(P,{value:O.Three,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"3px solid dimGray"}})},O.Three),Object(pf.jsx)(P,{value:O.Four,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"4px solid dimGray"}})},O.Four),Object(pf.jsx)(P,{value:O.Five,children:Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"5px solid dimGray"}})},O.Five)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",T)})]})})})]})})},aH=l(830),oH=l(831),iH=yb.a.Option,rH=aH.a.TabPane,nH=function(e){var t,l,a,o,i,n,c,s,d,f,h=e.setDialogVisible,p=Xw(si),y=Xw(Gi),g=Xw(Vi),m=bf(Er),w=Xw(Yi),x=Xw(ln),v=Xw($r),b=Xw(tn),A=Xw(sf).geneticAlgorithmParams,T=Xw(df),P=Xw(uf),S=Xw(af),H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)(!1),k=Object(u.a)(D,2),O=k[0],Y=k[1],L=Object(r.useState)({left:0,top:0,bottom:0,right:0}),N=Object(u.a)(L,2),U=N[0],E=N[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=W.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 Uw),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(){bf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){h(!1)},children:me.t("word.Cancel",de)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!O,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();E({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(pf.jsx)("div",{ref:J,children:e})})},children:Object(pf.jsxs)(aH.a,{defaultActiveKey:P,type:"card",onChange:function(e){p((function(t){t.geneticAlgorithmWizardSelectedTab=e}))},children:[Object(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Parameters",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:G.current,style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",de)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(iH,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",de)},M.YEARLY_TOTAL_OUTPUT),Object(pf.jsx)(iH,{value:M.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",de)},M.DAILY_AVERAGE_OUTPUT),Object(pf.jsx)(iH,{value:M.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",de)},M.YEARLY_AVERAGE_OUTPUT),Object(pf.jsx)(iH,{value:M.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",de)},M.DAILY_PROFIT),Object(pf.jsx)(iH,{value:M.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",de)},M.YEARLY_PROFIT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",de)},C.ROULETTE_WHEEL),Object(pf.jsx)(iH,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",de)},C.TOURNAMENT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",de)+" [10, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",de)+" [5, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",de)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Q.current,step:.01,onChange:function(e){Q.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",de)+" (0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:te.current,step:.001,onChange:function(e){te.current=e,R(!z)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",de)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(iH,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",de)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",de)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Variables",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.a,{range:!0,onChange:function(e){ae.current=Ww.toRadians(e[0]),oe.current=Ww.toRadians(e[1]),R(!z)},min:-90,max:90,defaultValue:[Ww.toDegrees(ae.current),Ww.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(rH,{tab:me.t("optimizationMenu.Constants",de),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",de)+" ("+Object.keys(w).length+" "+me.t("word.Options",de)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(yb.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(pf.jsx)(iH,{value:e,children:e+(w[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",de)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ue.current,onChange:function(e){ue.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",de)},ee.leftRight),Object(pf.jsx)(iH,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",de)},ee.upDown)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,R(!z)},children:[Object(pf.jsx)(iH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",de)},$.portrait),Object(pf.jsx)(iH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",de)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",de)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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")]})})})},cH=n.a.memo(nH),sH=yb.a.Option,dH=aH.a.TabPane,uH=function(e){var t,l,a,o,i,n,c,s,d,f,h,p,y=e.setDialogVisible,g=Xw(si),m=Xw(Gi),w=Xw(Vi),x=bf(Er),v=Xw(Yi),b=Xw(ln),A=Xw($r),T=Xw(tn),P=Xw(sf).particleSwarmOptimizationParams,S=Xw(df),H=Xw(ff),j=Xw(af),z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],C=R[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)({left:0,top:0,bottom:0,right:0}),U=Object(u.a)(N,2),E=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)(j.electricitySellingPrice),Ae=Object(r.useRef)(j.operationalCostPerUnit);Object(r.useEffect)((function(){be.current=j.electricitySellingPrice}),[j.electricitySellingPrice]),Object(r.useEffect)((function(){Ae.current=j.operationalCostPerUnit}),[j.operationalCostPerUnit]);var Te=function(){x||Kh(me.t("message.EvolutionStarted",ue)),g((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=W.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 Uw),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(){bf.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){y(!1)},children:me.t("word.Cancel",ue)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!Y,bounds:E,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(pf.jsx)("div",{ref:G,children:e})})},children:Object(pf.jsxs)(aH.a,{defaultActiveKey:H,type:"card",onChange:function(e){g((function(t){t.particleSwarmOptimizationWizardSelectedTab=e}))},children:[Object(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Parameters",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:M.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",ue)},M.DAILY_TOTAL_OUTPUT),Object(pf.jsx)(sH,{value:M.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",ue)},M.YEARLY_TOTAL_OUTPUT),Object(pf.jsx)(sH,{value:M.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",ue)},M.DAILY_AVERAGE_OUTPUT),Object(pf.jsx)(sH,{value:M.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",ue)},M.YEARLY_AVERAGE_OUTPUT),Object(pf.jsx)(sH,{value:M.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",ue)},M.DAILY_PROFIT),Object(pf.jsx)(sH,{value:M.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",ue)},M.YEARLY_PROFIT)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",ue)+" [10, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",ue)+" [5, 100]:"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:te.current,step:.01,onChange:function(e){te.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",ue)+" [0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",ue)+" [0.001, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Q.current,step:.001,onChange:function(e){Q.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",ue)+" (0, 0.1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:le.current,step:.001,onChange:function(e){le.current=e,C(!D)}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:F.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",ue)},F.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(pf.jsx)(sH,{value:F.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",ue)},F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",ue)+" ([0, 1]: "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(ob.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(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Variables",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.a,{range:!0,onChange:function(e){oe.current=Ww.toRadians(e[0]),ie.current=Ww.toRadians(e[1]),C(!D)},min:-90,max:90,defaultValue:[Ww.toDegrees(oe.current),Ww.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(dH,{tab:me.t("optimizationMenu.Constants",ue),children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",ue)+" ("+Object.keys(v).length+" "+me.t("word.Options",ue)+"):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(yb.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(pf.jsx)(sH,{value:e,children:e+(v[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",ue)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:fe.current,onChange:function(e){fe.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",ue)},ee.leftRight),Object(pf.jsx)(sH,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",ue)},ee.upDown)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ge.current,onChange:function(e){ge.current=e,C(!D)},children:[Object(pf.jsx)(sH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",ue)},$.portrait),Object(pf.jsx)(sH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",ue)},$.landscape)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",ue)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:12,children:Object(pf.jsx)(oH.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")]})})})},fH=n.a.memo(uH),hH=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(Gn),i=Xw(Xn),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Polygon),p=Object(r.useState)(void 0!==(null===f||void 0===f?void 0:f.opacity)?f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(o){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Polygon&&e!==i.opacity&&!i.locked)return!0}}catch(p){a.e(p)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Polygon&&c.foundationId===f.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s,d=Object(h.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Polygon&&u.parentId===f.parentId&&Ww.isIdentical(u.normal,f.normal)&&e!==u.opacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.opacity))return!0}return!1}}(e))switch(o){case _.AllObjectsOfThisType:var t,i=new Map,r=Object(h.a)(l);try{for(r.s();!(t=r.n()).done;){var d=t.value;if(d.type===V.Polygon&&!d.locked){var u=d;i.set(d.id,u.opacity),x(u.id,e)}}}catch(I){r.e(I)}finally{r.f()}var p={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(l);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.Polygon&&w.foundationId===f.foundationId&&!w.locked){var A=w;g.set(w.id,A.opacity),x(A.id,e)}}}catch(I){m.e(I)}finally{m.f()}var T={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};a(T),c(n+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(f.parentId){var P,S=new Map,H=Object(h.a)(l);try{for(H.s();!(P=H.n()).done;){var j=P.value;if(j.type===V.Polygon&&j.parentId===f.parentId&&Ww.isIdentical(j.normal,f.normal)&&!j.locked){var z=j;S.set(j.id,z.opacity),x(z.id,e)}}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:f.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};a(R),c(n+1)}break;default:if(f){var D=s(f.id),W=void 0!==D.opacity?D.opacity:void 0!==f.opacity?f.opacity:1,M={name:"Set Polygon Opacity",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(M.changedElementId,M.oldValue)},redo:function(){x(M.changedElementId,M.newValue)}};a(M),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("polygonMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return i(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",w)})]})})})]})})},pH=n.a.memo((function(){var e,t,l,a,o,i,n,c,s=Xw(si),d=Xw(Vi),f=Xw(Sr),p=Xw(as),y=Xw(Ci),g=NP(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"),H=Object(u.a)(S,2),j=H[0],z=H[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),W=D[0],M=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),F=C[0],k=C[1],O=Object(r.useState)(null!==(i=null===g||void 0===g?void 0:g.fontStrokeColor)&&void 0!==i?i:"black"),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(null!==(n=null===g||void 0===g?void 0:g.fontStrokeWidth)&&void 0!==n?n:0),E=Object(u.a)(U,2),J=E[0],G=E[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],He=Object(r.useState)(!1),je=Object(u.a)(He,2),ze=je[0],Re=je[1],De={lng:d},We=Xw((function(e){var t,l=Object(h.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"),M(null!==(a=g.fontOutlineColor)&&void 0!==a?a:"white"),k(null!==(o=g.fontOutlineWidth)&&void 0!==o?o:0),N(null!==(i=g.fontStrokeColor)&&void 0!==i?i:"black"),G(null!==(r=g.fontStrokeWidth)&&void 0!==r?r:0))}),[g]),!g||!We)return null;var Me=!(null===g||void 0===g?void 0:g.locked),Ie=function(e,t){s((function(l){var a,o=Object(h.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(h.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()}}))},Fe=function(e,t){s((function(l){var a,o=Object(h.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()}}))},ke=function(e,t){s((function(l){var a,o=Object(h.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()}}))},Oe=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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()}}))},Ne=function(e,t){s((function(l){var a,o=Object(h.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(h.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()}}))},Ee=function(e,t){s((function(l){var a,o=Object(h.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(){ke(g.id,t.oldValue)},redo:function(){ke(g.id,t.newValue)}};f(t),ke(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(){Oe(g.id,t.oldValue)},redo:function(){Oe(g.id,t.newValue)}};f(t),Oe(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:j,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ye(g.id,t.oldValue)},redo:function(){Ye(g.id,t.newValue)}};f(t),Ye(g.id,j)}},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:F,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Le(g.id,t.oldValue)},redo:function(){Le(g.id,t.newValue)}};f(t),Le(g.id,F)}},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:W,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ne(g.id,t.oldValue)},redo:function(){Ne(g.id,t.newValue)}};f(t),Ne(g.id,W)}},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)}};f(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(){Ee(g.id,t.oldValue)},redo:function(){Ee(g.id,t.newValue)}};f(t),Ee(g.id,L)}};return Object(pf.jsxs)(tb.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(pf.jsx)(jP,{keyName:"polygon-paste"}),Object(pf.jsx)(zP,{keyName:"polygon-copy"}),Me&&Object(pf.jsx)(RP,{keyName:"polygon-cut"}),((null===We||void 0===We?void 0:We.type)===V.Foundation||(null===We||void 0===We?void 0:We.type)===V.Cuboid)&&Object(pf.jsxs)(MP.a,{title:me.t("polygonMenu.Layout",De),style:{paddingLeft:"24px"},children:[ve&&Object(pf.jsx)(eH,{setDialogVisible:be}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){y(0),be(!0)},style:{paddingLeft:"36px"},children:[me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",De)," ..."]},"solar-panel-layout"),Object(pf.jsxs)(MP.a,{title:me.t("polygonMenu.SolarPanelArrayLayoutGenerativeDesign",De),style:{paddingLeft:"24px"},children:[Pe&&Object(pf.jsx)(cH,{setDialogVisible:Se}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){y(0),Se(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.GeneticAlgorithm",De)," ..."]},"solar-panel-layout-ga"),ze&&Object(pf.jsx)(fH,{setDialogVisible:Re}),Object(pf.jsxs)(tb.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(pf.jsx)(DP,{keyName:"polygon-lock"}),Me&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)}};f(t),Ie(g.id,e.target.checked)}},children:me.t("polygonMenu.Filled",De)})},"polygon-filled"),Me&&g.filled&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){Fe(g.id,l.checked?0:100)},redo:function(){Fe(g.id,l.checked?100:0)}};f(l),Fe(g.id,e.target.checked?100:0)}},children:me.t("polygonMenu.Shiny",De)})},"polygon-shiny"),Me&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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)}};f(t),Ce(g.id,e.target.checked)}},children:me.t("polygonMenu.NoOutline",De)})},"polygon-no-outline"),Me&&Object(pf.jsxs)(pf.Fragment,{children:[K&&Object(pf.jsx)(XS,{setDialogVisible:q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),q(!0)},children:[me.t("polygonMenu.LineColor",De)," ..."]},"polygon-line-color"),_&&Object(pf.jsx)(tH,{setDialogVisible:$}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),$(!0)},children:[me.t("polygonMenu.LineStyle",De)," ..."]},"polygon-line-style"),le&&Object(pf.jsx)(lH,{setDialogVisible:ae}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ae(!0)},children:[me.t("polygonMenu.LineWidth",De)," ..."]},"polygon-line-width")]}),Me&&g.filled&&(!g.textureType||g.textureType===ce.NoTexture)&&Object(pf.jsxs)(pf.Fragment,{children:[re&&Object(pf.jsx)(BS,{setDialogVisible:ne}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ne(!0)},children:[me.t("polygonMenu.FillColor",De)," ..."]},"polygon-fill-color")]}),Me&&g.filled&&Object(pf.jsxs)(pf.Fragment,{children:[ue&&Object(pf.jsx)(QS,{setDialogVisible:fe}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),fe(!0)},children:[me.t("polygonMenu.FillTexture",De)," ..."]},"polygon-texture")]}),Me&&g.filled&&Object(pf.jsxs)(pf.Fragment,{children:[ye&&Object(pf.jsx)(hH,{setDialogVisible:ge}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ge(!0)},children:[me.t("polygonMenu.Opacity",De)," ..."]},"polygon-opacity")]}),Me&&Object(pf.jsx)(MP.a,{title:me.t("polygonMenu.TextBox",De),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("word.Text",De)+":",value:x,onChange:function(e){return v(e.target.value)},onPressEnter:Ve,onBlur:Ve})},"polygon-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("word.FontColor",De)+":",value:j,onChange:function(e){return z(e.target.value)},onPressEnter:Ge,onBlur:Ge})},"polygon-font-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("polygonMenu.FontOutlineColor",De)+":",value:W,onChange:function(e){return M(e.target.value)},onPressEnter:Be,onBlur:Be})},"polygon-font-outline-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("polygonMenu.FontOutlineWidth",De)+":",min:0,max:1,step:.01,precision:2,value:F,onChange:function(e){return k(e)},onPressEnter:Xe,onBlur:Xe})},"polygon-font-outline-width"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("polygonMenu.FontStrokeColor",De)+":",value:L,onChange:function(e){return N(e.target.value)},onPressEnter:qe,onBlur:qe})},"polygon-font-stroke-color"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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")]})})),yH=n.a.memo((function(){var e=Xw(si),t=Xw(Vi),l=NP(V.Polygon),a=Xw(Kn),o=Xw(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(h.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(h.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(pf.jsx)(tb.a.Item,{onClick:function(){r(Q.Delete)},children:me.t("polygonMenu.DeleteVertex",i)},"polygon-vertex-delete")]})})),gH=n.a.memo((function(){var e=Xw(Vi),t=NP(V.Sensor),l=IP(t),a=l.labelText,o=l.setLabelText,i=CP(t),r=FP(t,a);if(!t)return null;var n={lng:e};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"sensor-copy"}),Object(pf.jsx)(RP,{keyName:"sensor-cut"}),Object(pf.jsx)(DP,{keyName:"sensor-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===t||void 0===t?void 0:t.showLabel),onChange:i,children:me.t("labelSubMenu.KeepShowingLabel",n)})},"sensor-show-label"),Object(pf.jsx)(tb.a,{children:Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",n)+":",value:a,onChange:function(e){return o(e.target.value)},onPressEnter:r,onBlur:r})},"sensor-label-text")})]})})),mH=n.a.memo((function(){var e,t,l,a=Xw(si),o=Xw(Vi),i=Xw(Sr),n=Xw($r),c=Xw(Gc),s=NP(V.Light),d=Object(r.useState)(null!==(e=null===s||void 0===s?void 0:s.intensity)&&void 0!==e?e:3),f=Object(u.a)(d,2),p=f[0],y=f[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),H=S[0],j=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(h.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()}}))},W=function(e,t){a((function(l){var a,o=Object(h.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()}}))},M=function(e,t){a((function(l){var a,o=Object(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"light-copy"}),Object(pf.jsx)(RP,{keyName:"light-cut"}),Object(pf.jsx)(DP,{keyName:"light-lock"}),R&&(R.type===V.Roof||R.type===V.Wall)&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:H,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),j(t)}},children:me.t("lightMenu.Inside",z)})},"light-inside"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"80px"},children:[me.t("lightMenu.Intensity",z),":"]}),Object(pf.jsx)(ob.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(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(s.id,e),y(e),a((function(t){t.actionState.lightIntensity=e}))}}(e)}})]},"light-intensity"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"80px"},children:[me.t("lightMenu.MaximumDistance",z),":"]}),Object(pf.jsx)(ob.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(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(s.id,e),x(e),a((function(t){t.actionState.lightDistance=e}))}}(e)}})]},"light-distance")]}),Object(pf.jsx)(MP.a,{title:me.t("word.Color",{lng:o}),style:{paddingLeft:"24px"},children:Object(pf.jsx)(VP.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")]})})),wH=function(){var e,t,l,a,n,c,s,d,u=Xw(si),f=Xw(Vi),h=Xw(Sr),p=Xw.getState().world,y=Xw(o.axes),g=Xw(o.theme),m=null===(e=Xw(o.showAzimuthAngle))||void 0===e||e,w=null===(t=Xw(o.showElevationAngle))||void 0===t||t,x=null===(l=Xw(o.showZenithAngle))||void 0===l||l,v=null!==(a=Xw(o.directLightIntensity))&&void 0!==a?a:1,b=null!==(n=Xw(o.ambientLightIntensity))&&void 0!==n?n:.1,A=null!==(c=Xw(i.airAttenuationCoefficient))&&void 0!==c?c:.01,T=null!==(s=Xw(i.airConvectiveCoefficient))&&void 0!==s?s:5,P=null!==(d=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==d?d:900,S={lng:f},H=Object(r.useMemo)((function(){return Dy(new Date(p.date),p.latitude)}),[p.date,p.latitude]),j={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}))},W=function(e){u((function(t){t.viewState.showElevationAngle=e}))},M=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}))},F=function(e){u((function(t){t.world.airAttenuationCoefficient=e}))},k=function(e){u((function(t){t.world.airConvectiveCoefficient=e}))},O=function(e){u((function(t){t.world.highestTemperatureTimeInMinutes=e}))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(MP.a,{title:me.t("skyMenu.Theme",S),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(pf.jsx)(rb.a,{style:j,value:N.Default,children:me.t("skyMenu.ThemeDefault",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Desert,children:me.t("skyMenu.ThemeDesert",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Dune,children:me.t("skyMenu.ThemeDune",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Forest,children:me.t("skyMenu.ThemeForest",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Grassland,children:me.t("skyMenu.ThemeGrassland",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Hill,children:me.t("skyMenu.ThemeHill",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Lake,children:me.t("skyMenu.ThemeLake",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Mountain,children:me.t("skyMenu.ThemeMountain",S)}),Object(pf.jsx)(rb.a,{style:j,value:N.Rural,children:me.t("skyMenu.ThemeRural",S)})]})},"theme"),Object(pf.jsx)(MP.a,{title:me.t("skyMenu.SelectSunAnglesToShow",S),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){W(a.oldValue)},redo:function(){W(a.newValue)}};h(a),W(l)},children:me.t("skyMenu.ShowElevationAngle",S)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){M(a.oldValue)},redo:function(){M(a.newValue)}};h(a),M(l)},children:me.t("skyMenu.ShowZenithAngle",S)})})]})},"sun-angles"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.DirectLightBrightnessAtNoon",S)+" [0.1-2]:"}),Object(pf.jsx)(ob.a,{min:.1,max:2,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(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.AmbientLightBrightnessAtNoon",S)+" [0.01-1]:"}),Object(pf.jsx)(ob.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(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.SunlightAttenuationCoefficientInAir",S)+":"}),Object(pf.jsx)(ob.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(){F(a.oldValue)},redo:function(){F(a.newValue)}};h(a),F(l)}}})]},"air-attenuation-coefficient"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.ConvectiveCoefficientOfAir",S)+" [W/(m\xb2\xd7K)]:"}),Object(pf.jsx)(ob.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(){k(a.oldValue)},redo:function(){k(a.newValue)}};h(a),k(l)}}})]},"air-convective-coefficient"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsx)(Pv.b,{style:{width:"270px"},children:me.t("skyMenu.HighestTemperatureTimeInMinutes",S)+":"}),Object(pf.jsx)(ob.a,{min:720,max:H.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(){O(a.oldValue)},redo:function(){O(a.newValue)}};h(a),O(l)}}})]},"highest-temperature-time-in-minutes")]})]})},xH=function e(){Object(je.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",H)+")":"")},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.PanelSize",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(yb.a,{disabled:!0,style:{width:"100%"},value:P,onChange:function(e){},children:xH.instance.nominalStrings.map((function(e){return Object(pf.jsx)(bH,{value:e,children:e},e)}))})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.CellType",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{disabled:!0,style:{width:"100%"},value:j.cellType,onChange:function(e){},children:[Object(pf.jsx)(bH,{value:"Monocrystalline",children:me.t("pvModelPanel.Monocrystalline",H)},"Monocrystalline"),Object(pf.jsx)(bH,{value:"Polycrystalline",children:me.t("pvModelPanel.Polycrystalline",H)},"Polycrystalline"),Object(pf.jsx)(bH,{value:"Thin Film",children:me.t("pvModelPanel.ThinFilm",H)},"Thin Film")]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.BifacialityFactor",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:2,value:j.bifacialityFactor,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("word.Color",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsxs)(yb.a,{disabled:!0,style:{width:"100%"},value:j.color,onChange:function(e){},children:[Object(pf.jsx)(bH,{value:"Black",children:me.t("pvModelPanel.Black",H)},"Black"),Object(pf.jsx)(bH,{value:"Blue",children:me.t("pvModelPanel.Blue",H)},"Blue")]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.SolarCellEfficiency",H)+" (%):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:2,value:100*j.efficiency,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.NominalOperatingCellTemperature",H)+" (\xb0C):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(ob.a,{disabled:!0,style:{width:"100%"},precision:1,value:j.noct,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.TemperatureCoefficientOfPmax",H)+" (%/\xb0C):"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(GT.a,{disabled:!0,style:{width:"100%"},value:j.pmaxTC,onChange:function(e){}})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:3,children:me.t("word.ApplyTo",H)+":"}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:21,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})]})},TH=yb.a.Option,PH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ni),c=Xw($r),s=Xw(cn),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){a((function(l){var a,o=Object(h.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()}}))},j=function(e,t){a((function(l){var a,o=Object(h.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(h.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&&Ww.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(h.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){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)}H(w.id,e)}},W=function(e,t){return!function(e,t){var l=c(e);if(l){if(l.type===V.Cuboid&&!Ww.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?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},M=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.orientation!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.SolarPanel&&n.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!n.locked&&n.orientation!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s=c(w);if(s)if(s.type===V.Cuboid){var d,u=Object(h.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.SolarPanel&&p.parentId===w.parentId&&Ww.isIdentical(p.normal,w.normal)&&!p.locked&&p.orientation!==e)return!0}}catch(x){u.e(x)}finally{u.f()}}else{var y,g=Object(h.a)(o);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.SolarPanel&&m.parentId===w.parentId&&!m.locked&&m.orientation!==e)return!0}}catch(x){g.e(x)}finally{g.f()}}break;default:if((null===w||void 0===w?void 0:w.orientation)!==e)return!0}return!1}}(e)){switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&W(r,e)){T.current=!0;break}}}catch(ie){l.e(ie)}finally{l.f()}if(T.current)P.current=e,A(w.orientation);else{var n,s=new Map,p=Object(h.a)(o);try{for(p.s();!(n=p.n()).done;){var m=n.value;m.type===V.SolarPanel&&s.set(m.id,m.orientation)}}catch(ie){p.e(ie)}finally{p.f()}var x={name:"Set Orientation for All Solar Panels",timestamp:Date.now(),oldValues:s,newValue:e,undo:function(){var e,t=Object(h.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];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){R(x.newValue)}};d(x),R(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var v,b=Object(h.a)(o);try{for(b.s();!(v=b.n()).done;){var S=v.value;if(S.type===V.SolarPanel&&S.foundationId===w.foundationId&&W(S,e)){T.current=!0;break}}}catch(ie){b.e(ie)}finally{b.f()}if(T.current)P.current=e,A(w.orientation);else{var M,I=new Map,C=Object(h.a)(o);try{for(C.s();!(M=C.n()).done;){var F=M.value;F.type===V.SolarPanel&&F.foundationId===w.foundationId&&I.set(F.id,F.orientation)}}catch(ie){C.e(ie)}finally{C.f()}var k={name:"Set Orientation for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:I,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){k.groupId&&j(k.groupId,k.newValue)}};d(k),j(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var O=c(w);if(O){if(T.current=!1,O.type===V.Cuboid){var Y,L=Object(h.a)(o);try{for(L.s();!(Y=L.n()).done;){var N=Y.value;if(N.type===V.SolarPanel&&N.parentId===w.parentId&&Ww.isIdentical(N.normal,w.normal)&&W(N,e)){T.current=!0;break}}}catch(ie){L.e(ie)}finally{L.f()}}else{var U,E=Object(h.a)(o);try{for(E.s();!(U=E.n()).done;){var J=U.value;if(J.type===V.SolarPanel&&J.parentId===w.parentId&&W(J,e)){T.current=!0;break}}}catch(ie){E.e(ie)}finally{E.f()}}if(T.current)P.current=e,A(w.orientation);else{var G=new Map,X=O.type===V.Cuboid;if(X){var B,K=Object(h.a)(o);try{for(K.s();!(B=K.n()).done;){var q=B.value;q.type===V.SolarPanel&&q.parentId===w.parentId&&Ww.isIdentical(q.normal,w.normal)&&G.set(q.id,q.orientation)}}catch(ie){K.e(ie)}finally{K.f()}}else{var Q,Z=Object(h.a)(o);try{for(Z.s();!(Q=Z.n()).done;){var $=Q.value;$.type===V.SolarPanel&&$.parentId===w.parentId&&G.set($.id,$.orientation)}}catch(ie){Z.e(ie)}finally{Z.f()}}var ee=X?w.normal:void 0,te={name:"Set Orientation for All Solar Panels on Surface",timestamp:Date.now(),oldValues:G,newValue:e,groupId:w.parentId,normal:ee,undo:function(){var e,t=Object(h.a)(te.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];H(a,o)}}catch(ie){t.e(ie)}finally{t.f()}},redo:function(){te.groupId&&z(te.groupId,te.normal,te.newValue)}};d(te),z(w.parentId,ee,e),g(y+1)}}break;default:var le=i(w.id),ae=le?le.orientation:w.orientation;if(T.current=W(w,e),T.current)P.current=e,A(ae);else{var oe={name:"Set Orientation of Selected Solar Panel",timestamp:Date.now(),oldValue:ae,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(oe.oldValue)},redo:function(){D(oe.newValue)}};d(oe),D(e),g(y+1)}}a((function(t){t.actionState.solarPanelOrientation=e}))}},I=function(){w&&(A(w.orientation),T.current=!1,l(!1))},C=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(P.current?" ("+(P.current===$.portrait?me.t("solarPanelMenu.Portrait",S):me.t("solarPanelMenu.Landscape",S))+")":""):"";return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.Orientation",S),rejectedMessage:C,onApply:function(){M(b)},onClose:I,onClickCancel:function(){I(),m()},onClickOk:function(){M(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:b,onChange:function(e){return A(e)},children:[Object(pf.jsx)(TH,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",S)},$.portrait),Object(pf.jsx)(TH,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",S)},$.landscape)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",S)})]})})})]})})},SH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Ni),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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],H=P[1],j=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");H(w.orientation===$.portrait?t.width:t.length)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLx(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t,l){o((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.lx=Ww.panelizeLx(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(h.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=Ww.panelizeLx(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){return!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.lx=t,l.type===V.Wall?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.lx-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.lx-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.lx-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.lx-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&C(a,e)){j.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(j.current)z.current=e,A(w.lx);else{var o,r=new Map,c=Object(h.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&r.set(p.id,p.lx)}}catch(ae){c.e(ae)}finally{c.f()}var m={name:"Set Length for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){I(m.newValue)}};d(m),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){j.current=!1;var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.foundationId===w.foundationId&&C(b,e)){j.current=!0;break}}}catch(ae){v.e(ae)}finally{v.f()}if(j.current)z.current=e,A(w.lx);else{var T,P=new Map,S=Object(h.a)(i);try{for(S.s();!(T=S.n()).done;){var H=T.value;H.type===V.SolarPanel&&H.foundationId===w.foundationId&&P.set(H.id,H.lx)}}catch(ae){S.e(ae)}finally{S.f()}var R={name:"Set Length for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:P,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){R.groupId&&W(R.groupId,R.newValue)}};d(R),W(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=s(w);if(F){if(j.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(i);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===w.parentId&&Ww.isIdentical(Y.normal,w.normal)&&C(Y,e)){j.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(i);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===w.parentId&&C(U,e)){j.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(j.current)z.current=e,A(w.lx);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(i);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===w.parentId&&Ww.isIdentical(B.normal,w.normal)&&E.set(B.id,B.lx)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===w.parentId&&E.set(Q.id,Q.lx)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?w.normal:void 0,$={name:"Set Length for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.parentId,normal:Z,undo:function(){var e,t=Object(h.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];D(a,o)}}catch(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&M($.groupId,$.normal,$.newValue)}};d($),M(w.parentId,Z,e),g(y+1)}}break;default:var ee=n(w.id),te=ee?ee.lx:w.lx;if(j.current=C(w,e),j.current)z.current=e,A(te);else{var le={name:"Set Solar Panel Array Length",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(le.changedElementId,le.oldValue)},redo:function(){D(le.changedElementId,le.newValue)}};d(le),D(w.id,e),g(y+1)}}},k=function(){j.current=!1,a(!1)},O=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Length",R),rejectedMessage:O,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),j.current||(a(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsWide",R),Object(pf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},HH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(Ni),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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],H=P[1],j=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");H(w.orientation===$.portrait?t.length:t.width),A(w.ly)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLy(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t){o((function(l){var a,o=Object(h.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=Ww.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t,l){o((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.ly=Ww.panelizeLy(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(h.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=Ww.panelizeLy(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=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&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.ly=t,l.type===V.Wall?Ww.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.ly-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.ly-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.ly-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.ly-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&C(a,e)){j.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(j.current)z.current=e,A(w.ly);else{var o,r=new Map,c=Object(h.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&r.set(p.id,p.ly)}}catch(ae){c.e(ae)}finally{c.f()}var m={name:"Set Width for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){I(m.newValue)}};d(m),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){j.current=!1;var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.foundationId===w.foundationId&&C(b,e)){j.current=!0;break}}}catch(ae){v.e(ae)}finally{v.f()}if(j.current)z.current=e,A(w.ly);else{var T,P=new Map,S=Object(h.a)(i);try{for(S.s();!(T=S.n()).done;){var H=T.value;H.type===V.SolarPanel&&H.foundationId===w.foundationId&&P.set(H.id,H.ly)}}catch(ae){S.e(ae)}finally{S.f()}var R={name:"Set Width for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:P,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){R.groupId&&W(R.groupId,R.newValue)}};d(R),W(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=s(w);if(F){if(j.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(i);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===w.parentId&&Ww.isIdentical(Y.normal,w.normal)&&C(Y,e)){j.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(i);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===w.parentId&&C(U,e)){j.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(j.current)z.current=e,A(w.ly);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(i);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===w.parentId&&Ww.isIdentical(B.normal,w.normal)&&E.set(B.id,B.ly)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===w.parentId&&E.set(Q.id,Q.ly)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?w.normal:void 0,$={name:"Set Width for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.parentId,normal:Z,undo:function(){var e,t=Object(h.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];D(a,o)}}catch(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&M($.groupId,$.normal,$.newValue)}};d($),M(w.parentId,Z,e),g(y+1)}}break;default:var ee=n(w.id),te=ee?ee.ly:w.ly;if(j.current=C(w,e),j.current)z.current=e,A(te);else{var le={name:"Set Solar Panel Array Width",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(le.changedElementId,le.oldValue)},redo:function(){D(le.changedElementId,le.newValue)}};d(le),D(w.id,e),g(y+1)}}},k=function(){j.current=!1,a(!1)},O=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",R),rejectedMessage:O,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),j.current||(a(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsLong",R),Object(pf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},jH=function(e){var t,l=e.setDialogVisible,a=e.isOnWall,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(tc),s=Xw($r),d=Xw(Sr),f=Xw(Zn),p=Xw(_n),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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)(),H=$f(),j=function(e,t,l){o((function(a){var o,i=Object(h.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(h.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&&Ww.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(h.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){if(a&&(e=-e),w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var o=a;if(Math.abs(o.tiltAngle-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var d=c;if(Math.abs(d.tiltAngle-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u=s(w);if(u)if(u.type===V.Cuboid){var p,y=Object(h.a)(i);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.SolarPanel&&g.parentId===w.parentId&&Ww.isIdentical(g.normal,w.normal)&&!g.locked){var m=g;if(Math.abs(m.tiltAngle-e)>At)return!0}}}catch(T){y.e(T)}finally{y.f()}}else{var x,v=Object(h.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked){var A=b;if(Math.abs(A.tiltAngle-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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,f){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&.5*r.ly*Math.abs(Math.sin(e))>r.poleHeight){P.current=!0;break}}}catch(oe){l.e(oe)}finally{l.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var p,m=new Map,x=Object(h.a)(i);try{for(x.s();!(p=x.n()).done;){var v=p.value;v.type===V.SolarPanel&&m.set(v.id,v.tiltAngle)}}catch(oe){x.e(oe)}finally{x.f()}var b={name:"Set Tilt Angle for All Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}b.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){R(b.newValue,!a)}};d(b),R(e,!a),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){P.current=!1;var A,H=Object(h.a)(i);try{for(H.s();!(A=H.n()).done;){var D=A.value;if(D.type===V.SolarPanel&&D.foundationId===w.foundationId&&D.parentType!==V.Wall&&.5*D.ly*Math.abs(Math.sin(e))>D.poleHeight){P.current=!0;break}}}catch(oe){H.e(oe)}finally{H.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var W,M=new Map,I=Object(h.a)(i);try{for(I.s();!(W=I.n()).done;){var C=W.value;C.type===V.SolarPanel&&C.foundationId===w.foundationId&&M.set(C.id,C.tiltAngle)}}catch(oe){I.e(oe)}finally{I.f()}var F={name:"Set Tilt Angle for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}F.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){F.groupId&&j(F.groupId,F.newValue,!a)}};d(F),j(w.foundationId,e,!a),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var k=s(w);if(k){P.current=!1;var O=k.type===V.Cuboid;if(O){var Y,L=Object(h.a)(i);try{for(L.s();!(Y=L.n()).done;){var N=Y.value;if(N.type===V.SolarPanel&&N.parentId===w.parentId&&Ww.isIdentical(N.normal,w.normal)&&.5*N.ly*Math.abs(Math.sin(e))>N.poleHeight){P.current=!0;break}}}catch(oe){L.e(oe)}finally{L.f()}}else if(w.parentType===V.Wall)P.current=!1;else{var U,E=Object(h.a)(i);try{for(E.s();!(U=E.n()).done;){var J=U.value;if(J.type===V.SolarPanel&&J.parentId===w.parentId&&.5*J.ly*Math.abs(Math.sin(e))>J.poleHeight){P.current=!0;break}}}catch(oe){E.e(oe)}finally{E.f()}}if(P.current)S.current=e,T(w.tiltAngle);else{var G=new Map;if(O){var X,B=Object(h.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;K.type===V.SolarPanel&&K.parentId===w.parentId&&Ww.isIdentical(K.normal,w.normal)&&G.set(K.id,K.tiltAngle)}}catch(oe){B.e(oe)}finally{B.f()}}else{var q,Q=Object(h.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;Z.type===V.SolarPanel&&Z.parentId===w.parentId&&G.set(Z.id,Z.tiltAngle)}}catch(oe){Q.e(oe)}finally{Q.f()}}var $=O?w.normal:void 0,ee={name:"Set Tilt Angle for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:G,newValue:e,groupId:w.parentId,normal:$,undo:function(){var e,t=Object(h.a)(ee.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(oe){t.e(oe)}finally{t.f()}ee.oldValues.size%2===0&&Xw.getState().set((function(e){}))},redo:function(){ee.groupId&&z(ee.groupId,ee.normal,ee.newValue)}};d(ee),z(w.parentId,$,e),g(y+1)}}break;default:var te=n(w.id),le=te?te.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(le);else{var ae={name:"Set Solar Panel Array Tilt Angle",timestamp:Date.now(),oldValue:le,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){c(ae.changedElementId,ae.oldValue)},redo:function(){c(ae.changedElementId,ae.newValue)}};d(ae),c(w.id,e),g(y+1)}}o((function(t){t.actionState.solarPanelTiltAngle=e}))}},W=function(){P.current=!1,l(!1)},M=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+Ww.toDegrees(S.current).toFixed(1)+"\xb0)":null):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.TiltAngle",H),rejectedMessage:M,onApply:function(){D(A)},onClose:W,onClickCancel:function(){W(),m()},onClickOk:function(){D(A),P.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:a?0:-90,max:90,style:{width:120},precision:2,value:parseFloat(Ww.toDegrees(A).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){T(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [",a?"0\xb0":"-90\xb0",", 90\xb0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.SouthFacingIsPositive",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},zH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(ic),c=Xw(rc),s=Xw(nc),d=Xw(cc),f=Xw($r),p=Xw(Sr),y=Xw(Zn),g=Xw(_n),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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],H=P[1],j=$f(),z=function(e,t){return!function(e,t){var l=f(e);if(l){if(l.type===V.Cuboid&&!Ww.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.relativeAzimuth=-t,l.type===V.Roof?Ww.checkElementOnRoofState(a,l)===ye.Valid:Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.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){var i=a;if(Math.abs(-i.relativeAzimuth-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.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&&c.parentType!==V.Wall){var s=c;if(Math.abs(-s.relativeAzimuth-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(null===v||void 0===v?void 0:v.parentId){var d=f(v);if(d)if(d.type===V.Cuboid){var u,p=Object(h.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Ww.isIdentical(g.normal,v.normal)&&!g.locked){var m=g;if(Math.abs(-m.relativeAzimuth-e)>At)return!0}}}catch(T){p.e(T)}finally{p.f()}}else{var w,x=Object(h.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.relativeAzimuth-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.relativeAzimuth)-e)>At)return!0}return!1}}(e)){switch(A.current=void 0,y){case _.AllObjectsOfThisType:b.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&z(r,e)){b.current=!0;break}}}catch(oe){l.e(oe)}finally{l.f()}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var g,x=new Map,T=Object(h.a)(o);try{for(T.s();!(g=T.n()).done;){var P=g.value;P.type===V.SolarPanel&&P.parentType!==V.Wall&&x.set(P.id,-P.relativeAzimuth)}}catch(oe){T.e(oe)}finally{T.f()}var S={name:"Set Relative Azimuth for All Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}},redo:function(){d(V.SolarPanel,-S.newValue)}};p(S),d(V.SolarPanel,-e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){b.current=!1;var j,R=Object(h.a)(o);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.SolarPanel&&D.foundationId===v.foundationId&&D.parentType!==V.Wall&&z(D,e)){b.current=!0;break}}}catch(oe){R.e(oe)}finally{R.f()}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var W,M=new Map,I=Object(h.a)(o);try{for(I.s();!(W=I.n()).done;){var C=W.value;C.type===V.SolarPanel&&C.foundationId===v.foundationId&&C.parentType!==V.Wall&&M.set(C.id,-C.relativeAzimuth)}}catch(oe){I.e(oe)}finally{I.f()}var F={name:"Set Relative Azimuth for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(oe){t.e(oe)}finally{t.f()}},redo:function(){F.groupId&&s(V.SolarPanel,F.groupId,-F.newValue)}};p(F),s(V.SolarPanel,v.foundationId,-e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:if(v.parentId){var k=f(v);if(k){if(b.current=!1,k.type===V.Cuboid){var O,Y=Object(h.a)(o);try{for(Y.s();!(O=Y.n()).done;){var L=O.value;if(L.type===V.SolarPanel&&L.parentId===v.parentId&&Ww.isIdentical(L.normal,v.normal)&&z(L,e)){b.current=!0;break}}}catch(oe){Y.e(oe)}finally{Y.f()}}else{var N,U=Object(h.a)(o);try{for(U.s();!(N=U.n()).done;){var E=N.value;if(E.type===V.SolarPanel&&E.parentId===v.parentId&&z(E,e)){b.current=!0;break}}}catch(oe){U.e(oe)}finally{U.f()}}if(b.current)A.current=e,H(-v.relativeAzimuth);else{var J=new Map,G=k.type===V.Cuboid;if(G){var X,B=Object(h.a)(o);try{for(B.s();!(X=B.n()).done;){var K=X.value;K.type===V.SolarPanel&&K.parentId===v.parentId&&Ww.isIdentical(K.normal,v.normal)&&J.set(K.id,-K.relativeAzimuth)}}catch(oe){B.e(oe)}finally{B.f()}}else{var q,Q=Object(h.a)(o);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;Z.type===V.SolarPanel&&Z.parentId===v.parentId&&J.set(Z.id,-Z.relativeAzimuth)}}catch(oe){Q.e(oe)}finally{Q.f()}}var $=G?v.normal:void 0,ee={name:"Set Relative Azimuth for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:J,newValue:e,groupId:v.parentId,normal:$,undo:function(){var e,t=Object(h.a)(ee.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(oe){t.e(oe)}finally{t.f()}},redo:function(){ee.groupId&&c(V.SolarPanel,ee.groupId,ee.normal,-ee.newValue)}};p(ee),c(V.SolarPanel,v.parentId,$,-e),w(m+1)}}}break;default:var te=i(v.id),le=te?-te.relativeAzimuth:-v.relativeAzimuth;if(b.current=z(v,e),b.current)A.current=e,H(le);else{var ae={name:"Set Solar Panel Array Relative Azimuth",timestamp:Date.now(),oldValue:le,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(ae.changedElementId,-ae.oldValue)},redo:function(){n(ae.changedElementId,-ae.newValue)}};p(ae),n(v.id,-e),w(m+1)}}a((function(t){t.actionState.solarPanelRelativeAzimuth=-e}))}},D=function(){b.current=!1,l(!1)},W=b.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==A.current?" ("+Ww.toDegrees(A.current).toFixed(1)+"\xb0)":null):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarCollectorMenu.RelativeAzimuth",j),rejectedMessage:W,onApply:function(){R(S)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(S),b.current||(l(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:-180,max:180,style:{width:120},precision:2,step:1,value:parseFloat(Ww.toDegrees(S).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){H(Ww.toRadians(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [-180\xb0, 180\xb0]",Object(pf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",j),Object(pf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",j)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},RH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=NP(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=yb.a.Option,A=function(e,t){a((function(l){var a,o=Object(h.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(h.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(h.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&&Ww.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(h.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()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.trackerType!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.SolarPanel&&c.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!c.locked&&c.trackerType!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d=n(y);if(d)if(d.type===V.Cuboid){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.SolarPanel&&p.parentId===y.parentId&&Ww.isIdentical(p.normal,y.normal)&&!p.locked&&p.trackerType!==e)return!0}}catch(x){f.e(x)}finally{f.f()}}else{var g,m=Object(h.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.SolarPanel&&w.parentId===y.parentId&&!w.locked&&w.trackerType!==e)return!0}}catch(x){m.e(x)}finally{m.f()}}break;default:if((null===y||void 0===y?void 0:y.trackerType)!==e)return!0}return!1}}(e))switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;r.type===V.SolarPanel&&l.set(r.id,r.trackerType)}}catch(L){a.e(L)}finally{a.f()}var d={name:"Set Tracker Type for All Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){S(d.newValue)}};c(d),S(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.SolarPanel&&x.foundationId===y.foundationId&&m.set(x.id,x.trackerType)}}catch(L){w.e(L)}finally{w.f()}var v={name:"Set Tracker Type for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){v.groupId&&T(v.groupId,v.newValue)}};c(v),T(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var b=n(y);if(b){var H=new Map,j=b.type===V.Cuboid;if(j){var z,R=Object(h.a)(o);try{for(R.s();!(z=R.n()).done;){var D=z.value;D.type===V.SolarPanel&&D.parentId===y.parentId&&Ww.isIdentical(D.normal,y.normal)&&H.set(D.id,D.trackerType)}}catch(L){R.e(L)}finally{R.f()}}else{var W,M=Object(h.a)(o);try{for(M.s();!(W=M.n()).done;){var I=W.value;I.type===V.SolarPanel&&I.parentId===y.parentId&&H.set(I.id,I.trackerType)}}catch(L){M.e(L)}finally{M.f()}}var C=j?y.normal:void 0,F={name:"Set Tracker Type for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:H,newValue:e,groupId:y.parentId,normal:C,undo:function(){var e,t=Object(h.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];A(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){F.groupId&&P(F.groupId,F.normal,F.newValue)}};c(F),P(y.parentId,C,e),p(f+1)}break;default:var k=i(y.id),O=k?k.trackerType:y.trackerType,Y={name:"Set Solar Panel Array Tracker Type",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(Y.changedElementId,Y.oldValue)},redo:function(){A(Y.changedElementId,Y.newValue)}};c(Y),A(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.Tracker",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsxs)(yb.a,{style:{width:"120px"},value:w,onChange:function(e){return x(e)},children:[Object(pf.jsx)(b,{value:te.NO_TRACKER,title:me.t("solarPanelMenu.NoTracker",v),children:me.t("word.None",v)},"NONE"),Object(pf.jsx)(b,{value:te.HORIZONTAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.HorizontalSingleAxisTracker",v),children:"HSAT"},"HSAT"),Object(pf.jsx)(b,{value:te.VERTICAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.VerticalSingleAxisTracker",v),children:"VSAT"},"VSAT"),Object(pf.jsx)(b,{value:te.ALTAZIMUTH_DUAL_AXIS_TRACKER,title:me.t("solarPanelMenu.AltazimuthDualAxisTracker",v),children:"AADAT"},"AADAT")]}),Object(pf.jsx)("div",{style:{paddingTop:"20px",paddingRight:"10px",textAlign:"left",fontSize:"11px"},children:me.t("solarPanelMenu.SolarTrackerFollowsSun",v)})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},DH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(dc),s=Xw(uc),d=Xw(fc),f=Xw($r),p=Xw(Sr),y=Xw(Zn),g=Xw(_n),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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),H=Object(r.useRef)(),j=$f(),z=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){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(h.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=f(v);if(d)if(d.type===V.Cuboid){var u,p=Object(h.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Ww.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(h.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(H.current=void 0,y){case _.AllObjectsOfThisType:S.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){S.current=!0;break}}}catch(ae){l.e(ae)}finally{l.f()}if(S.current)H.current=e,P(v.poleHeight);else{var g,x=new Map,b=Object(h.a)(o);try{for(b.s();!(g=b.n()).done;){var A=g.value;A.type===V.SolarPanel&&x.set(A.id,A.poleHeight)}}catch(ae){b.e(ae)}finally{b.f()}var T={name:"Set Pole Height for All Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){d(V.SolarPanel,T.newValue)}};p(T),d(V.SolarPanel,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var j,z=Object(h.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.SolarPanel&&R.foundationId===v.foundationId&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){S.current=!0;break}}}catch(ae){z.e(ae)}finally{z.f()}if(S.current)H.current=e,P(v.poleHeight);else{var D,W=new Map,M=Object(h.a)(o);try{for(M.s();!(D=M.n()).done;){var I=D.value;I.type===V.SolarPanel&&I.foundationId===v.foundationId&&W.set(I.id,I.poleHeight)}}catch(ae){M.e(ae)}finally{M.f()}var C={name:"Set Pole Height for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:W,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){C.groupId&&s(V.SolarPanel,C.groupId,C.newValue)}};p(C),s(V.SolarPanel,v.foundationId,e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var F=f(v);if(F){if(S.current=!1,F.type===V.Cuboid){var k,O=Object(h.a)(o);try{for(O.s();!(k=O.n()).done;){var Y=k.value;if(Y.type===V.SolarPanel&&Y.parentId===v.parentId&&Ww.isIdentical(Y.normal,v.normal)&&.5*Y.ly*Math.abs(Math.sin(Y.tiltAngle))>e){S.current=!0;break}}}catch(ae){O.e(ae)}finally{O.f()}}else{var L,N=Object(h.a)(o);try{for(N.s();!(L=N.n()).done;){var U=L.value;if(U.type===V.SolarPanel&&U.parentId===v.parentId&&.5*U.ly*Math.abs(Math.sin(U.tiltAngle))>e){S.current=!0;break}}}catch(ae){N.e(ae)}finally{N.f()}}if(S.current)H.current=e,P(v.poleHeight);else{var E=new Map,J=F.type===V.Cuboid;if(J){var G,X=Object(h.a)(o);try{for(X.s();!(G=X.n()).done;){var B=G.value;B.type===V.SolarPanel&&B.parentId===v.parentId&&Ww.isIdentical(B.normal,v.normal)&&E.set(B.id,B.poleHeight)}}catch(ae){X.e(ae)}finally{X.f()}}else{var K,q=Object(h.a)(o);try{for(q.s();!(K=q.n()).done;){var Q=K.value;Q.type===V.SolarPanel&&Q.parentId===v.parentId&&E.set(Q.id,Q.poleHeight)}}catch(ae){q.e(ae)}finally{q.f()}}var Z=J?v.normal:void 0,$={name:"Set Pole Height for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:E,newValue:e,groupId:v.parentId,normal:Z,undo:function(){var e,t=Object(h.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(ae){t.e(ae)}finally{t.f()}},redo:function(){$.groupId&&c(V.SolarPanel,$.groupId,$.normal,$.newValue)}};p($),c(V.SolarPanel,v.parentId,Z,e),w(m+1)}}break;default:var ee=i(v.id),te=ee?ee.poleHeight:v.poleHeight;if(S.current=.5*v.ly*Math.abs(Math.sin(v.tiltAngle))>e,S.current)H.current=e,P(te);else{var le={name:"Set Solar Panel Array Pole Height",timestamp:Date.now(),oldValue:te,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(le.changedElementId,le.oldValue)},redo:function(){n(le.changedElementId,le.newValue)}};p(le),n(v.id,e),w(m+1)}}a((function(t){t.actionState.solarPanelPoleHeight=e}))}},R=function(){S.current=!1,l(!1)},D=S.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==H.current?" ("+H.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:550,title:me.t("solarCollectorMenu.PoleHeight",j),rejectedMessage:D,onApply:function(){z(T)},onClose:R,onClickCancel:function(){R(),x()},onClickOk:function(){z(T),S.current||(l(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:10,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 10] ",me.t("word.MeterAbbreviation",j)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},WH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=NP(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(h.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(h.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(h.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&&Ww.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(h.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){if(y&&function(e){if(y){switch(s){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked){var i=a;if(Math.abs(i.poleSpacing-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,c=Object(h.a)(o);try{for(c.s();!(r=c.n()).done;){var d=r.value;if(d.type===V.SolarPanel&&d.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!d.locked){var u=d;if(Math.abs(u.poleSpacing-e)>At)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeOnSurface:var f=n(y);if(f)if(f.type===V.Cuboid){var p,g=Object(h.a)(o);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(m.type===V.SolarPanel&&m.parentId===y.parentId&&Ww.isIdentical(m.normal,y.normal)&&!m.locked){var w=m;if(Math.abs(w.poleSpacing-e)>At)return!0}}}catch(T){g.e(T)}finally{g.f()}}else{var x,v=Object(h.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){var A=b;if(Math.abs(A.poleSpacing-e)>At)return!0}}}catch(T){v.e(T)}finally{v.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var d=t.value;d.type===V.SolarPanel&&l.set(d.id,d.poleSpacing)}}catch(N){r.e(N)}finally{r.f()}var g={name:"Set Pole Spacing for All Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){P(g.newValue)}};c(g),P(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;v.type===V.SolarPanel&&v.foundationId===y.foundationId&&w.set(v.id,v.poleSpacing)}}catch(N){x.e(N)}finally{x.f()}var S={name:"Set Pole Spacing for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(N){t.e(N)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};c(S),A(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var H=n(y);if(H){var j=new Map,z=H.type===V.Cuboid;if(z){var R,D=Object(h.a)(o);try{for(D.s();!(R=D.n()).done;){var W=R.value;W.type===V.SolarPanel&&W.parentId===y.parentId&&Ww.isIdentical(W.normal,y.normal)&&j.set(W.id,W.poleSpacing)}}catch(N){D.e(N)}finally{D.f()}}else{var M,I=Object(h.a)(o);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type===V.SolarPanel&&C.parentId===y.parentId&&j.set(C.id,C.poleSpacing)}}catch(N){I.e(N)}finally{I.f()}}var F=z?y.normal:void 0,k={name:"Set Pole Spacing for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:j,newValue:e,groupId:y.parentId,normal:F,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(N){t.e(N)}finally{t.f()}},redo:function(){k.groupId&&T(k.groupId,k.normal,k.newValue)}};c(k),T(y.parentId,F,e),p(f+1)}break;default:var O=i(y.id),Y=O?O.poleSpacing:y.poleSpacing,L={name:"Set Solar Panel Array Pole Spacing",timestamp:Date.now(),oldValue:Y,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(L.changedElementId,L.oldValue)},redo:function(){b(L.changedElementId,L.newValue)}};c(L),b(y.id,e),p(f+1)}a((function(t){t.actionState.solarPanelPoleSpacing=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.PoleSpacing",v),onApply:function(){S(w),l(!1),p(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:1,style:{width:120},precision:2,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [1, 10] ",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},MH=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw($r),s=Xw(Sr),d=Xw(Zn),f=Xw(_n),p=Xw(Ii),y=Xw(Ci),g=NP(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(h.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(h.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(h.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&&Ww.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(h.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()}}))},H=function(e){if(g&&function(e){if(g){switch(d){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.frameColor!==e)return!0}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.SolarPanel&&n.foundationId===(null===g||void 0===g?void 0:g.foundationId)&&!n.locked&&n.frameColor!==e)return!0}}catch(x){r.e(x)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var s=c(g);if(s)if(s.type===V.Cuboid){var u,f=Object(h.a)(i);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.SolarPanel&&p.parentId===g.parentId&&Ww.isIdentical(p.normal,g.normal)&&!p.locked&&p.frameColor!==e)return!0}}catch(x){f.e(x)}finally{f.f()}}else{var y,m=Object(h.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.SolarPanel&&w.parentId===g.parentId&&!w.locked&&w.frameColor!==e)return!0}}catch(x){m.e(x)}finally{m.f()}}break;default:if((null===g||void 0===g?void 0:g.frameColor)!==e)return!0}return!1}}(e)){switch(d){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var r,f=t.value;if(f.type===V.SolarPanel)l.set(f.id,null!==(r=f.frameColor)&&void 0!==r?r:"white")}}catch(G){a.e(G)}finally{a.f()}var m={name:"Set Frame Color for All Solar Panels",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){S(m.newValue)}};s(m),S(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var w,x=new Map,v=Object(h.a)(i);try{for(v.s();!(w=v.n()).done;){var b,H=w.value;if(H.type===V.SolarPanel&&H.foundationId===g.foundationId)x.set(H.id,null!==(b=H.frameColor)&&void 0!==b?b:"white")}}catch(G){v.e(G)}finally{v.f()}var j={name:"Set Frame Color for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:g.foundationId,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){j.groupId&&T(j.groupId,j.newValue)}};s(j),T(g.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var z=c(g);if(z){var R=new Map,D=z.type===V.Cuboid;if(D){var W,M=Object(h.a)(i);try{for(M.s();!(W=M.n()).done;){var I,C=W.value;if(C.type===V.SolarPanel&&C.parentId===g.parentId&&Ww.isIdentical(C.normal,g.normal))R.set(C.id,null!==(I=C.frameColor)&&void 0!==I?I:"white")}}catch(G){M.e(G)}finally{M.f()}}else{var F,k=Object(h.a)(i);try{for(k.s();!(F=k.n()).done;){var O,Y=F.value;if(Y.type===V.SolarPanel&&Y.parentId===g.parentId)R.set(Y.id,null!==(O=Y.frameColor)&&void 0!==O?O:"white")}}catch(G){k.e(G)}finally{k.f()}}var L=D?g.normal:void 0,N={name:"Set Frame Color for All Solar Panels on Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:g.parentId,normal:L,undo:function(){var e,t=Object(h.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(G){t.e(G)}finally{t.f()}},redo:function(){N.groupId&&P(N.groupId,N.normal,N.newValue)}};s(N),P(g.parentId,L,e),y(p+1)}break;default:var U=n(g.id),E=U?U.frameColor:g.frameColor,J={name:"Set Frame Color of Selected Solar Panel",timestamp:Date.now(),oldValue:E,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(g.id,J.oldValue)},redo:function(){A(g.id,J.newValue)}};s(J),A(g.id,e),y(p+1)}o((function(t){t.actionState.solarPanelFrameColor=e}))}};return Object(pf.jsx)(EP,{width:680,title:me.t("solarPanelMenu.FrameColor",b),onApply:function(){H(x)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:10,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){f(e.target.value)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",b)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",b)})]})})})]})})},IH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw($r),c=Xw(Sr),s=Xw(Zn),d=Xw(_n),f=Xw(Ii),p=Xw(Ci),y=Xw((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(h.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(h.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(h.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&&Ww.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(h.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){var t,l;if(y&&function(e){var t;switch(s){case _.AllObjectsOfThisType:var l,a=Object(h.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;if(i.type===V.SolarPanel&&!i.locked){var r,c=i;if(Math.abs((null!==(r=c.inverterEfficiency)&&void 0!==r?r:.95)-e)>At)return!0}}}catch(z){a.e(z)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(h.a)(o);try{for(u.s();!(d=u.n()).done;){var f=d.value;if(f.type===V.SolarPanel&&f.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!f.locked){var p,g=f;if(Math.abs((null!==(p=g.inverterEfficiency)&&void 0!==p?p:.95)-e)>At)return!0}}}catch(z){u.e(z)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=n(y);if(m)if(m.type===V.Cuboid){var w,x=Object(h.a)(o);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.SolarPanel&&v.parentId===y.parentId&&Ww.isIdentical(v.normal,y.normal)&&!v.locked){var b,A=v;if(Math.abs((null!==(b=A.inverterEfficiency)&&void 0!==b?b:.95)-e)>At)return!0}}}catch(z){x.e(z)}finally{x.f()}}else{var T,P=Object(h.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 H,j=S;if(Math.abs((null!==(H=j.inverterEfficiency)&&void 0!==H?H:.95)-e)>At)return!0}}}catch(z){P.e(z)}finally{P.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 _.AllObjectsOfThisType:var a,r=new Map,d=Object(h.a)(o);try{for(d.s();!(a=d.n()).done;){var g,m=a.value;if(m.type===V.SolarPanel)r.set(m.id,null!==(g=m.inverterEfficiency)&&void 0!==g?g:.95)}}catch(X){d.e(X)}finally{d.f()}var w={name:"Set Inverter Efficiency for All Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(X){t.e(X)}finally{t.f()}},redo:function(){P(w.newValue)}};c(w),P(e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var x,v=new Map,S=Object(h.a)(o);try{for(S.s();!(x=S.n()).done;){var H,j=x.value;if(j.type===V.SolarPanel&&j.foundationId===y.foundationId)v.set(j.id,null!==(H=j.inverterEfficiency)&&void 0!==H?H:.95)}}catch(X){S.e(X)}finally{S.f()}var z={name:"Set Inverter Efficiency for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){z.groupId&&A(z.groupId,z.newValue)}};c(z),A(y.foundationId,e),p(f+1)}break;case _.AllObjectsOfThisTypeOnSurface:var R=n(y);if(R){var D=new Map,W=R.type===V.Cuboid;if(W){var M,I=Object(h.a)(o);try{for(I.s();!(M=I.n()).done;){var C,F=M.value;if(F.type===V.SolarPanel&&F.parentId===y.parentId&&Ww.isIdentical(F.normal,y.normal))D.set(F.id,null!==(C=F.inverterEfficiency)&&void 0!==C?C:.95)}}catch(X){I.e(X)}finally{I.f()}}else{var k,O=Object(h.a)(o);try{for(O.s();!(k=O.n()).done;){var Y,L=k.value;if(L.type===V.SolarPanel&&L.parentId===y.parentId)D.set(L.id,null!==(Y=L.inverterEfficiency)&&void 0!==Y?Y:.95)}}catch(X){O.e(X)}finally{O.f()}}var N=W?y.normal:void 0,U={name:"Set Inverter Efficiency for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:D,newValue:e,groupId:y.parentId,normal:N,undo:function(){var e,t=Object(h.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];b(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&T(U.groupId,U.normal,U.newValue)}};c(U),T(y.parentId,N,e),p(f+1)}break;default:var E=i(y.id),J=E?null!==(t=E.inverterEfficiency)&&void 0!==t?t:.95:null!==(l=y.inverterEfficiency)&&void 0!==l?l:.95,G={name:"Set Solar Panel Array Inverter Efficiency",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(G.changedElementId,G.oldValue)},redo:function(){b(G.changedElementId,G.newValue)}};c(G),b(y.id,e),p(f+1)}};return Object(pf.jsx)(EP,{width:550,title:me.t("solarPanelMenu.InverterEfficiency",v),onApply:function(){S(w)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.5,max:1,step:.01,style:{width:120},precision:2,value:w,onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[0.5, 1.0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.InverterEfficiencyExplained",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},CH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(Vi),i=Xw(ki),n=Xw(Zr),c=Xw($r),s=Xw(Sr),d=Xw(Zn),f=Xw(_n),p=Xw(Ii),y=Xw(Ci),g=Xw(Fi),m=Xw((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],H=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useRef)(null),W=Object(r.useRef)(null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1),M={lng:o};Object(r.useEffect)((function(){var e;m&&(W.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1)}),[m.dcToAcRatio]);var I=function(e,t){a((function(l){var a,o=Object(h.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(h.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()}}))},F=function(e,t,l){a((function(a){var o,i=Object(h.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&&Ww.isIdentical(r.normal,t):r.parentId===e)&&(r.dcToAcRatio=l)}}}catch(n){i.e(n)}finally{i.f()}}))},k=function(e){a((function(t){var l,a=Object(h.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()}}))},O=function(e){var t,l;if(m&&function(e){var t;switch(d){case _.AllObjectsOfThisType:var l,a=Object(h.a)(i);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var r,n=o;if(Math.abs((null!==(r=n.dcToAcRatio)&&void 0!==r?r:1)-e)>At)return!0}}}catch(z){a.e(z)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(h.a)(i);try{for(u.s();!(s=u.n()).done;){var f=s.value;if(f.type===V.SolarPanel&&f.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!f.locked){var p,y=f;if(Math.abs((null!==(p=y.dcToAcRatio)&&void 0!==p?p:1)-e)>At)return!0}}}catch(z){u.e(z)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var g=c(m);if(g)if(g.type===V.Cuboid){var w,x=Object(h.a)(i);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.SolarPanel&&v.parentId===m.parentId&&Ww.isIdentical(v.normal,m.normal)&&!v.locked){var b,A=v;if(Math.abs((null!==(b=A.dcToAcRatio)&&void 0!==b?b:1)-e)>At)return!0}}}catch(z){x.e(z)}finally{x.f()}}else{var T,P=Object(h.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===m.parentId&&!S.locked){var H,j=S;if(Math.abs((null!==(H=j.dcToAcRatio)&&void 0!==H?H:1)-e)>At)return!0}}}catch(z){P.e(z)}finally{P.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 _.AllObjectsOfThisType:var a,o=new Map,r=Object(h.a)(i);try{for(r.s();!(a=r.n()).done;){var f,g=a.value;if(g.type===V.SolarPanel)o.set(g.id,null!==(f=g.dcToAcRatio)&&void 0!==f?f:1)}}catch(K){r.e(K)}finally{r.f()}var w={name:"Set DC-AC Ratio for All Solar Panel Arrays",timestamp:Date.now(),oldValues:o,newValue:e,undo:function(){var e,t=Object(h.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(K){t.e(K)}finally{t.f()}},redo:function(){k(w.newValue)}};s(w),k(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,A=new Map,T=Object(h.a)(i);try{for(T.s();!(x=T.n()).done;){var P,S=x.value;if(S.type===V.SolarPanel&&S.foundationId===m.foundationId)A.set(S.id,null!==(P=S.dcToAcRatio)&&void 0!==P?P:1)}}catch(K){T.e(K)}finally{T.f()}var H={name:"Set DC-AC Ratio for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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];I(a,o)}}catch(K){t.e(K)}finally{t.f()}},redo:function(){H.groupId&&C(H.groupId,H.newValue)}};s(H),C(m.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var j=c(m);if(j){var z=new Map,R=j.type===V.Cuboid;if(R){var D,W=Object(h.a)(i);try{for(W.s();!(D=W.n()).done;){var M,O=D.value;if(O.type===V.SolarPanel&&O.parentId===m.parentId&&Ww.isIdentical(O.normal,m.normal))z.set(O.id,null!==(M=O.dcToAcRatio)&&void 0!==M?M:1)}}catch(K){W.e(K)}finally{W.f()}}else{var Y,L=Object(h.a)(i);try{for(L.s();!(Y=L.n()).done;){var N,U=Y.value;if(U.type===V.SolarPanel&&U.parentId===m.parentId)z.set(U.id,null!==(N=U.dcToAcRatio)&&void 0!==N?N:1)}}catch(K){L.e(K)}finally{L.f()}}var E=R?m.normal:void 0,J={name:"Set DC-AC Ratio for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:z,newValue:e,groupId:m.parentId,normal:E,undo:function(){var e,t=Object(h.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(K){t.e(K)}finally{t.f()}},redo:function(){J.groupId&&F(J.groupId,J.normal,J.newValue)}};s(J),F(m.parentId,E,e),y(p+1)}break;default:var G=n(m.id),X=G?null!==(t=G.dcToAcRatio)&&void 0!==t?t:1:null!==(l=m.dcToAcRatio)&&void 0!==l?l:1,B={name:"Set Solar Panel Array DC-AC Ratio",timestamp:Date.now(),oldValue:X,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){I(B.changedElementId,B.oldValue)},redo:function(){I(B.changedElementId,B.newValue)}};s(B),I(m.id,e),y(p+1)}b(!v)}},Y=function(){var e;W.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1,l(!1)},L=function(){O(W.current),l(!1),y(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return S(!0)},onMouseOut:function(){return S(!1)},children:me.t("solarPanelMenu.DcToAcSizeRatio",M)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){O(W.current)},children:me.t("word.Apply",M)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){Y(),g()},children:me.t("word.Cancel",M)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:L,children:me.t("word.OK",M)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:D,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:2,step:.01,style:{width:120},precision:2,value:W.current,onChange:function(e){W.current=e,b(!v)},onPressEnter:L}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[1.0, 2.0]",Object(pf.jsx)("br",{}),me.t("solarPanelMenu.DcToAcSizeRatioExplained",M)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){f(e.target.value),b(!v)},value:d,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",M)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",M)})]})})})]})})})},FH=n.a.memo((function(){var e,t,l,a,o=Xw(lc),i=Xw(Sr),n=Xw(Ci),c=Xw(Vi),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[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=IP(s),ce=ne.labelText,se=ne.setLabelText,de=CP(s),ue=FP(s,ce),fe=YP(s),he=OP(s),pe=kP(s),ye=LP(s);if(!s)return null;var ge={lng:c},we=(new We.Vector3).fromArray(s.normal),xe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"solar-panel-copy",paddingLeft:"36px"}),xe&&Object(pf.jsx)(RP,{keyName:"solar-panel-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"solar-panel-lock"}),s&&xe&&Object(pf.jsxs)(pf.Fragment,{children:[h&&Object(pf.jsx)(AH,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),p(!0)},style:{paddingLeft:"36px"},children:[me.t("solarPanelMenu.ChangePvModel",ge)," (",s.pvModelName,") ..."]},"solar-panel-change"),m&&Object(pf.jsx)(PH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px",width:"150px"},onClick:function(){n(0),w(!0)},children:[me.t("solarPanelMenu.Orientation",ge)," ..."]},"solar-panel-orientation"),S&&Object(pf.jsx)(SH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),H(!0)},children:[me.t("word.Length",ge)," ..."]},"solar-panel-length"),b&&Object(pf.jsx)(HH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),A(!0)},children:[me.t("word.Width",ge)," ..."]},"solar-panel-width"),R&&Object(pf.jsx)(IH,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),D(!0)},children:[me.t("solarPanelMenu.InverterEfficiency",ge)," ..."]},"solar-panel-inverter-efficiency"),I&&Object(pf.jsx)(CH,{setDialogVisible:C}),Object(pf.jsxs)(tb.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(pf.jsx)(pf.Fragment,{children:Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle")}),O&&Object(pf.jsx)(jH,{setDialogVisible:Y,isOnWall:s.parentType===V.Wall}),we&&Ww.isSame(we,Rt)&&Object(pf.jsxs)(pf.Fragment,{children:[s.trackerType===te.NO_TRACKER&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle"),U&&Object(pf.jsx)(zH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),E(!0)},children:[me.t("solarCollectorMenu.RelativeAzimuth",ge)," ..."]},"solar-panel-relative-azimuth"),s.parentType!==V.Roof&&Object(pf.jsxs)(pf.Fragment,{children:[X&&Object(pf.jsx)(RH,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),B(!0)},children:[me.t("solarPanelMenu.Tracker",ge)," ..."]},"solar-panel-tracker")]})]}),xe&&Object(pf.jsxs)(pf.Fragment,{children:[ie&&Object(pf.jsx)(MH,{setDialogVisible:re}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),re(!0)},children:[me.t("solarPanelMenu.FrameColor",ge)," ..."]},"solar-panel-frame-color")]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("solarCollectorMenu.Pole",ge),style:{paddingLeft:"24px"},children:[Q&&Object(pf.jsx)(DH,{setDialogVisible:Z}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),Z(!0)},children:[me.t("solarCollectorMenu.PoleHeight",ge)," ..."]},"solar-panel-pole-height"),ee&&Object(pf.jsx)(WH,{setDialogVisible:le}),Object(pf.jsxs)(tb.a.Item,{onClick:function(){n(0),le(!0)},children:[me.t("solarPanelMenu.PoleSpacing",ge)," ..."]},"solar-panel-pole-spacing")]},"solar-panel-pole"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ge),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:de,children:me.t("labelSubMenu.KeepShowingLabel",ge)})},"solar-panel-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",ge)+":",value:ce,onChange:function(e){return se(e.target.value)},onPressEnter:ue})},"solar-panel-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),kH=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Pn),n=Xw(Sn),c=Xw(Hn),s=Xw($r),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},j=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.ParabolicTrough&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!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===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&H(r,e)){T.current=!0;break}}}catch(k){l.e(k)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(h.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.ParabolicTrough&&p.set(x.id,x.ly)}}catch(k){m.e(k)}finally{m.f()}var v={name:"Set Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){c(V.ParabolicTrough,v.newValue)}};d(v),c(V.ParabolicTrough,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var b,S=Object(h.a)(a);try{for(S.s();!(b=S.n()).done;){var j=b.value;if(j.type===V.ParabolicTrough&&j.foundationId===w.foundationId&&H(j,e)){T.current=!0;break}}}catch(k){S.e(k)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var z,R=new Map,D=Object(h.a)(a);try{for(D.s();!(z=D.n()).done;){var W=z.value;W.type===V.ParabolicTrough&&W.foundationId===w.foundationId&&R.set(W.id,W.ly)}}catch(k){D.e(k)}finally{D.f()}var M={name:"Set Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];i(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&n(V.ParabolicTrough,M.groupId,M.newValue)}};d(M),n(V.ParabolicTrough,w.foundationId,e),g(y+1)}}break;default:var I=o(w.id),C=I?I.ly:w.ly;if(T.current=H(w,e),T.current)P.current=e,A(C);else{var F={name:"Set Parabolic Trough Length",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(F.changedElementId,F.oldValue)},redo:function(){i(F.changedElementId,F.newValue)}};d(F),i(w.id,e),g(y+1)}}},z=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.ParabolicTrough)return null;var R=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",S),rejectedMessage:R,onApply:function(){j(b)},onClose:z,onClickCancel:function(){z(),m()},onClickOk:function(){j(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("parabolicTroughMenu.ModulesLong",S),Object(pf.jsx)("br",{}),me.t("word.Maximum",S),": 100 ",me.t("parabolicTroughMenu.Modules",S)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",S)})]})})})]})})},OH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughWidth=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},YH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicTrough&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicTrough&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Parabolic Troughs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,A.newValue)}};f(A),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},LH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Lc),c=Xw(Nc),s=Xw(Uc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.latusRectum)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Latus Rectum for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.latusRectum);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.latusRectum)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Latus Rectum for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.latusRectum:x.latusRectum;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Latus Rectum",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughLatusRectum=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},NH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ec),c=Xw(Vc),s=Xw(Jc),d=Xw($r),f=Xw(Sr),p=Xw(zc),y=Xw(Rc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&y.set(v.id,v.moduleLength)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Module Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,b.newValue)}};f(b),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicTrough&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.moduleLength);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicTrough&&M.foundationId===x.foundationId&&D.set(M.id,M.moduleLength)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Module Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicTrough,I.groupId,I.newValue)}};f(I),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.moduleLength:x.moduleLength;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Trough Module Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughModuleLength=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",H)})]})})})]})})},UH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Parabolic Trough Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},EH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(xc),c=Xw(vc),s=Xw(bc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.absorptance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Absorptance for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.absorptance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Absorptance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.absorptance:m.absorptance,H={name:"Set Parabolic Trough Absorptance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},VH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ac),c=Xw(Tc),s=Xw(Pc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.opticalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Optical Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.opticalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Optical Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.opticalEfficiency:m.opticalEfficiency,H={name:"Set Parabolic Trough Optical Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},JH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sc),c=Xw(Hc),s=Xw(jc),d=Xw(Sr),f=Xw(zc),p=Xw(Rc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&l.set(p.id,p.thermalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Thermal Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,w.newValue)}};d(w),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&A.foundationId===m.foundationId&&v.set(A.id,A.thermalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Thermal Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicTrough,T.groupId,T.newValue)}};d(T),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.thermalEfficiency:m.thermalEfficiency,H={name:"Set Parabolic Trough Thermal Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},GH=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(lc),n=Xw(Sr),c=Xw(Ci),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=IP(s),q=K.labelText,Q=K.setLabelText,Z=CP(s),_=FP(s,q),$=OP(s),ee=kP(s),te=YP(s),le=LP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"parabolic-trough-copy",paddingLeft:"36px"}),oe&&Object(pf.jsx)(RP,{keyName:"parabolic-trough-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"parabolic-trough-lock"}),s&&oe&&Object(pf.jsxs)(pf.Fragment,{children:[S&&Object(pf.jsx)(kH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),H(!0)},children:[me.t("word.Length",ae)," ..."]},"parabolic-trough-length"),b&&Object(pf.jsx)(OH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("word.Width",ae)," ..."]},"parabolic-trough-width"),h&&Object(pf.jsx)(NH,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicTroughMenu.ModuleLength",ae)," ..."]},"parabolic-trough-module-length"),m&&Object(pf.jsx)(LH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicTroughMenu.LatusRectum",ae)," ..."]},"parabolic-trough-latus-rectum"),R&&Object(pf.jsx)(YH,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-trough-pole-height"),I&&Object(pf.jsx)(UH,{setDialogVisible:C}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-trough-reflectance"),O&&Object(pf.jsx)(EH,{setDialogVisible:Y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-trough-absorptance"),U&&Object(pf.jsx)(VH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),E(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-trough-optical-efficiency"),X&&Object(pf.jsx)(JH,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-trough-thermal-efficiency"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-trough-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.Label",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-trough-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),XH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(Pn),s=Xw(An),d=Xw(Sn),f=Xw(Tn),p=Xw(Hn),y=Xw($r),g=Xw(Sr),m=Xw(Oc),w=Xw(Yc),x=Xw(Ii),v=Xw(Ci),b=Xw(Fi),A=NP(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],H=P[1],j=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,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},W=function(e){if(A&&function(e){if(A){switch(m){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===A||void 0===A?void 0:A.foundationId)&&!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)){switch(z.current=void 0,m){case _.AllObjectsOfThisType:j.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&D(r,e)){j.current=!0;break}}}catch(N){l.e(N)}finally{l.f()}if(j.current)z.current=e,H(A.lx);else{var y,w=new Map,b=Object(h.a)(o);try{for(b.s();!(y=b.n()).done;){var T=y.value;T.type===V.ParabolicDish&&w.set(T.id,T.lx)}}catch(N){b.e(N)}finally{b.f()}var P={name:"Set Diameter for All Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){f(V.ParabolicDish,P.newValue),p(V.ParabolicDish,P.newValue)}};g(P),f(V.ParabolicDish,e),p(V.ParabolicDish,e),v(x+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(A.foundationId){j.current=!1;var S,R=Object(h.a)(o);try{for(R.s();!(S=R.n()).done;){var W=S.value;if(W.type===V.ParabolicDish&&W.foundationId===A.foundationId&&D(W,e)){j.current=!0;break}}}catch(N){R.e(N)}finally{R.f()}if(j.current)z.current=e,H(A.lx);else{var M,I=new Map,C=Object(h.a)(o);try{for(C.s();!(M=C.n()).done;){var F=M.value;F.type===V.ParabolicDish&&F.foundationId===A.foundationId&&I.set(F.id,F.lx)}}catch(N){C.e(N)}finally{C.f()}var k={name:"Set Diameter for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:I,newValue:e,groupId:A.foundationId,undo:function(){var e,t=Object(h.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(N){t.e(N)}finally{t.f()}},redo:function(){k.groupId&&(s(V.ParabolicDish,k.groupId,k.newValue),d(V.ParabolicDish,k.groupId,k.newValue))}};g(k),s(V.ParabolicDish,A.foundationId,e),d(V.ParabolicDish,A.foundationId,e),v(x+1)}}break;default:var O=i(A.id),Y=O?O.lx:A.lx;if(j.current=D(A,e),j.current)z.current=e,H(Y);else{var L={name:"Set Parabolic Dish Diameter",timestamp:Date.now(),oldValue:Y,newValue:e,changedElementId:A.id,changedElementType:A.type,undo:function(){n(L.changedElementId,L.oldValue),c(L.changedElementId,L.oldValue)},redo:function(){n(L.changedElementId,L.newValue),c(L.changedElementId,L.newValue)}};g(L),n(A.id,e),c(A.id,e),v(x+1)}}a((function(t){t.actionState.parabolicDishRimDiameter=e}))}},M=function(){j.current=!1,l(!1)};if((null===A||void 0===A?void 0:A.type)!==V.ParabolicDish)return null;var I=j.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.RimDiameter",R),rejectedMessage:I,onApply:function(){W(S)},onClose:M,onClickCancel:function(){M(),b()},onClickOk:function(){W(S),j.current||(l(!1),v(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:S,onChange:H}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",R),": 1 ",me.t("word.MeterAbbreviation",R),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",R),": 10 ",me.t("word.MeterAbbreviation",R)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){w(e.target.value)},value:m,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",R)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",R)})]})})})]})})},BH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicDish&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicDish,A.newValue)}};f(A),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.ParabolicDish&&z.foundationId===x.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicDish&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicDish,I.groupId,I.newValue)}};f(I),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Dish Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.ExtraPoleHeightInAdditionToRadius",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",H)})]})})})]})})},KH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Lc),c=Xw(Nc),s=Xw(Uc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicDish&&y.set(v.id,v.latusRectum)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Latus Rectum for All Parabolic Dishes",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.ParabolicDish,b.newValue)}};f(b),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.ParabolicDish&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.latusRectum);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.ParabolicDish&&M.foundationId===x.foundationId&&D.set(M.id,M.latusRectum)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Latus Rectum for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.ParabolicDish,I.groupId,I.newValue)}};f(I),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.latusRectum:x.latusRectum;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Parabolic Dish Latus Rectum",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishLatusRectum=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("parabolicDishMenu.LatusRectum",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",H)})]})})})]})})},qH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Parabolic Dish Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},QH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(xc),c=Xw(vc),s=Xw(bc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.absorptance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Absorptance for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.absorptance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Absorptance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.absorptance:m.absorptance,H={name:"Set Parabolic Dish Absorptance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},ZH=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ac),c=Xw(Tc),s=Xw(Pc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.opticalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Optical Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.opticalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Optical Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.opticalEfficiency:m.opticalEfficiency,H={name:"Set Parabolic Dish Optical Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){T(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},_H=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sc),c=Xw(Hc),s=Xw(jc),d=Xw(Sr),f=Xw(Oc),p=Xw(Yc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&l.set(p.id,p.thermalEfficiency)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Thermal Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.ParabolicDish,w.newValue)}};d(w),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&A.foundationId===m.foundationId&&v.set(A.id,A.thermalEfficiency)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Thermal Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.ParabolicDish,T.groupId,T.newValue)}};d(T),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.thermalEfficiency:m.thermalEfficiency,H={name:"Set Parabolic Dish Thermal Efficiency",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},$H=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Sr),c=Xw(Oc),s=Xw(Yc),d=Xw(Ii),f=Xw(Ci),p=NP(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=yb.a.Option,b=function(e,t){a((function(l){var a,o=Object(h.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(h.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(h.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){if(p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&a.structureType!==e)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.ParabolicDish&&n.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!n.locked&&n.structureType!==e)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if((null===p||void 0===p?void 0:p.structureType)!==e)return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.ParabolicDish&&l.set(s.id,s.structureType)}}catch(j){r.e(j)}finally{r.f()}var y={name:"Set Structure Type for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T(y.newValue)}};n(y),T(e),f(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.ParabolicDish&&x.foundationId===p.foundationId&&m.set(x.id,x.structureType)}}catch(j){w.e(j)}finally{w.f()}var v={name:"Set Structure Type for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){v.groupId&&A(v.groupId,v.newValue)}};n(v),A(p.foundationId,e),f(d+1)}break;default:var P=i(p.id),S=P?P.structureType:p.structureType,H={name:"Set Parabolic Dish Structure Type",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(H.changedElementId,H.oldValue)},redo:function(){b(H.changedElementId,H.newValue)}};n(H),b(p.id,e),f(d+1)}a((function(t){t.actionState.parabolicDishReceiverStructure=e}))}};return(null===p||void 0===p?void 0:p.type)!==V.ParabolicDish?null:Object(pf.jsx)(EP,{width:640,title:me.t("parabolicDishMenu.ReceiverStructure",x),onApply:function(){P(m)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsxs)(yb.a,{value:m,onChange:function(e){return w(e)},children:[Object(pf.jsx)(v,{value:J.CentralPole,children:me.t("parabolicDishMenu.CentralPole",x)},J.CentralPole),Object(pf.jsx)(v,{value:J.CentralPoleWithTripod,children:me.t("parabolicDishMenu.CentralPoleWithTripod",x)},J.CentralPoleWithTripod),Object(pf.jsx)(v,{value:J.Quadrupod,children:me.t("parabolicDishMenu.Quadrupod",x)},J.Quadrupod)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",x)})]})})})]})})},ej=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(hc),c=Xw(pc),s=Xw(yc),d=Xw($r),f=Xw(Sr),p=Xw(Oc),y=Xw(Yc),g=Xw(Ii),m=Xw(Ci),w=NP(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){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.parentId===w.parentId&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.ParabolicDish&&l.set(y.id,y.poleRadius)}}catch(z){r.e(z)}finally{r.f()}var x={name:"Set Pole Radius for All Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){s(V.ParabolicDish,x.newValue)}};f(x),s(V.ParabolicDish,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var v,b=new Map,A=Object(h.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.ParabolicDish&&T.foundationId===w.foundationId&&b.set(T.id,T.poleRadius)}}catch(z){A.e(z)}finally{A.f()}var P={name:"Set Pole Radius for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:b,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){P.groupId&&c(V.ParabolicDish,P.groupId,P.newValue)}};f(P),c(V.ParabolicDish,w.foundationId,e),m(g+1)}break;default:var S=i(w.id),H=S?S.poleRadius:w.poleRadius,j={name:"Set Parabolic Dish Pole Radius",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(j.changedElementId,j.oldValue)},redo:function(){n(j.changedElementId,j.newValue)}};f(j),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(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){P(b)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",T)})]})})})]})})},tj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(lc),n=Xw(Sr),c=Xw(Ci),s=NP(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],H=P[1],j=Object(r.useState)(!1),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(!1),N=Object(u.a)(L,2),U=N[0],E=N[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=IP(s),q=K.labelText,Q=K.setLabelText,Z=CP(s),_=FP(s,q),$=OP(s),ee=kP(s),te=YP(s),le=LP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"parabolic-dish-copy",paddingLeft:"36px"}),oe&&Object(pf.jsx)(RP,{keyName:"parabolic-dish-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"parabolic-dish-lock"}),s&&oe&&Object(pf.jsxs)(pf.Fragment,{children:[b&&Object(pf.jsx)(XH,{setDialogVisible:A}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("parabolicDishMenu.RimDiameter",ae)," ..."]},"parabolic-dish-radius"),m&&Object(pf.jsx)(KH,{setDialogVisible:w}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicDishMenu.LatusRectum",ae)," ..."]},"parabolic-dish-latus-rectum"),h&&Object(pf.jsx)($H,{setDialogVisible:p}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicDishMenu.ReceiverStructure",ae)," ..."]},"parabolic-dish-structure-type"),S&&Object(pf.jsx)(BH,{setDialogVisible:H}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),H(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-dish-pole-height"),R&&Object(pf.jsx)(ej,{setDialogVisible:D}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.PoleRadius",ae)," ..."]},"parabolic-dish-pole-radius"),I&&Object(pf.jsx)(qH,{setDialogVisible:C}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-dish-reflectance"),O&&Object(pf.jsx)(QH,{setDialogVisible:Y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-dish-absorptance"),U&&Object(pf.jsx)(ZH,{setDialogVisible:E}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),E(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-dish-optical-efficiency"),X&&Object(pf.jsx)(_H,{setDialogVisible:B}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-dish-thermal-efficiency"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-dish-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-dish-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),lj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Zr),i=Xw(Pn),n=Xw(Sn),c=Xw(Hn),s=Xw($r),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=Xw(Fi),w=NP(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(),H=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},j=function(e){if(w&&function(e){if(w){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!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===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,f){case _.AllObjectsOfThisType:T.current=!1;var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&H(r,e)){T.current=!0;break}}}catch(k){l.e(k)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(h.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.FresnelReflector&&p.set(x.id,x.ly)}}catch(k){m.e(k)}finally{m.f()}var v={name:"Set Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){c(V.FresnelReflector,v.newValue)}};d(v),c(V.FresnelReflector,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var b,S=Object(h.a)(a);try{for(S.s();!(b=S.n()).done;){var j=b.value;if(j.type===V.FresnelReflector&&j.foundationId===w.foundationId&&H(j,e)){T.current=!0;break}}}catch(k){S.e(k)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var z,R=new Map,D=Object(h.a)(a);try{for(D.s();!(z=D.n()).done;){var W=z.value;W.type===V.FresnelReflector&&W.foundationId===w.foundationId&&R.set(W.id,W.ly)}}catch(k){D.e(k)}finally{D.f()}var M={name:"Set Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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];i(a,o)}}catch(k){t.e(k)}finally{t.f()}},redo:function(){M.groupId&&n(V.FresnelReflector,M.groupId,M.newValue)}};d(M),n(V.FresnelReflector,w.foundationId,e),g(y+1)}}break;default:var I=o(w.id),C=I?I.ly:w.ly;if(T.current=H(w,e),T.current)P.current=e,A(C);else{var F={name:"Set Fresnel Reflector Length",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(F.changedElementId,F.oldValue)},redo:function(){i(F.changedElementId,F.newValue)}};d(F),i(w.id,e),g(y+1)}}},z=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.FresnelReflector)return null;var R=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",S),rejectedMessage:R,onApply:function(){j(b)},onClose:z,onClickCancel:function(){z(),m()},onClickOk:function(){j(b),T.current||(l(!1),g(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("fresnelReflectorMenu.ModulesLong",S),Object(pf.jsx)("br",{}),me.t("word.Maximum",S),": 200 ",me.t("fresnelReflectorMenu.Modules",S)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",S)})]})})})]})})},aj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=(Xw(Vi),Xw(ki)),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(Dc),y=Xw(Wc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.FresnelReflector,b.newValue)}};f(b),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.FresnelReflector&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.FresnelReflector,I.groupId,I.newValue)}};f(I),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Fresnel Reflector Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorWidth=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",H)})]})})})]})})},oj=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Zr),c=Xw(sc),s=Xw(uc),d=Xw(fc),f=Xw($r),p=Xw(Sr),y=Xw(Dc),g=Xw(Wc),m=Xw(Ii),w=Xw(Ci),x=Xw(Fi),v=NP(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),H=Object(r.useRef)(),j=Object(r.useRef)(null!==(l=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==l?l:1),z=$f(),R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var o=a;if(Math.abs(o.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&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(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(f(v)){var d,u=Object(h.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.parentId===v.parentId&&!p.locked){var g=p;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){u.e(m)}finally{u.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(H.current=void 0,y){case _.AllObjectsOfThisType:S.current=!1;var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&.5*a.ly*Math.abs(Math.sin(a.tiltAngle))>e){S.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(S.current)H.current=e,j.current=v.poleHeight;else{var r,g=new Map,x=Object(h.a)(i);try{for(x.s();!(r=x.n()).done;){var b=r.value;b.type===V.FresnelReflector&&g.set(b.id,b.poleHeight)}}catch(O){x.e(O)}finally{x.f()}var A={name:"Set Pole Height for All Fresnel Reflectors",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){d(V.FresnelReflector,A.newValue)}};p(A),d(V.FresnelReflector,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var T,P=Object(h.a)(i);try{for(P.s();!(T=P.n()).done;){var z=T.value;if(z.type===V.FresnelReflector&&z.foundationId===v.foundationId&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){S.current=!0;break}}}catch(O){P.e(O)}finally{P.f()}if(S.current)H.current=e,j.current=v.poleHeight;else{var R,D=new Map,W=Object(h.a)(i);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===v.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&s(V.FresnelReflector,I.groupId,I.newValue)}};p(I),s(V.FresnelReflector,v.foundationId,e),w(m+1)}}break;default:var C=n(v.id),F=C?C.poleHeight:v.poleHeight;if(S.current=.5*v.lx*Math.abs(Math.sin(v.tiltAngle))>e,S.current)H.current=e,j.current=F;else{var k={name:"Set Fresnel Reflector Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){c(k.changedElementId,k.oldValue)},redo:function(){c(k.changedElementId,k.newValue)}};p(k),c(v.id,e),w(m+1)}}o((function(t){t.actionState.fresnelReflectorPoleHeight=e}))}},D=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!==H.current?" ("+H.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",z),rejectedMessage:W,onApply:function(){R(T)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(T),S.current||(a(!1),w(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",z),": [0, 5] ",me.t("word.MeterAbbreviation",z)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",z)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",z)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",z)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",z)})]})})})]})})},ij=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Ec),c=Xw(Vc),s=Xw(Jc),d=Xw($r),f=Xw(Sr),p=Xw(Dc),y=Xw(Wc),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(d){n.e(d)}finally{n.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&y.set(v.id,v.moduleLength)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Module Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.FresnelReflector,b.newValue)}};f(b),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.FresnelReflector&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.moduleLength);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.FresnelReflector&&M.foundationId===x.foundationId&&D.set(M.id,M.moduleLength)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Module Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.FresnelReflector,I.groupId,I.newValue)}};f(I),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.moduleLength:x.moduleLength;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Fresnel Reflector Module Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorModuleLength=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("fresnelReflectorMenu.ModuleLength",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 10 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",H)})]})})})]})})},rj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.FresnelReflector,w.newValue)}};d(w),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.FresnelReflector,T.groupId,T.newValue)}};d(T),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Fresnel Reflector Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,value:v,step:.01,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},nj=yb.a.Option,cj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Cc),c=Xw(Fc),s=Xw(kc),d=Xw(Sr),f=Xw(Dc),p=Xw(Wc),y=Xw(Ii),g=Xw(Ci),m=NP(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(h.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){if(m&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&a.receiverId!==e)return!0}}catch(c){l.e(c)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&n.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!n.locked&&n.receiverId!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===m||void 0===m?void 0:m.receiverId)!==e)return!0}return!1}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&l.set(p.id,p.receiverId)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Receiver for All Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.FresnelReflector,w.newValue)}};d(w),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&A.foundationId===m.foundationId&&v.set(A.id,A.receiverId)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Receiver for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.FresnelReflector,T.groupId,T.newValue)}};d(T),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.receiverId:m.receiverId,H={name:"Set Receiver for Fresnel Reflector",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:640,title:me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",A),onApply:function(){v&&P(v)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsx)(yb.a,{style:{width:"160px"},value:v,onChange:function(e){b(e)},children:T.map((function(e,t){return Object(pf.jsx)(nj,{value:e,children:me.t("fresnelReflectorMenu.AbsorberPipe",A)+" "+(t+1)},t)}))})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},sj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Zr),o=Xw(lc),i=Xw(ac),n=Xw(oc),c=Xw(Sr),s=Xw(Dc),d=Xw(Wc),f=Xw(Ii),p=Xw(Ci),y=NP(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){if(y&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&o.drawSunBeam!==e)return!0}}catch(c){a.e(c)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&n.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllObjectsOfThisType:var t,r=new Map,d=Object(h.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.FresnelReflector&&r.set(g.id,g.drawSunBeam)}}catch(H){d.e(H)}finally{d.f()}var m={name:"Draw Sun Beam for All Fresnel Reflectors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(H){t.e(H)}finally{t.f()}},redo:function(){n(V.FresnelReflector,m.newValue)}};c(m),n(V.FresnelReflector,e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var w,x=new Map,v=Object(h.a)(l);try{for(v.s();!(w=v.n()).done;){var b=w.value;b.type===V.FresnelReflector&&b.foundationId===y.foundationId&&x.set(b.id,b.drawSunBeam)}}catch(H){v.e(H)}finally{v.f()}var A={name:"Draw Sun Beam for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.a)(A.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(){A.groupId&&i(V.FresnelReflector,A.groupId,A.newValue)}};c(A),i(V.FresnelReflector,y.foundationId,e),p(f+1)}break;default:var T=a(y.id),P=T?T.drawSunBeam:y.drawSunBeam,S={name:"Draw Sun Beam for Fresnel Reflector",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(S.changedElementId,S.oldValue)},redo:function(){o(S.changedElementId,S.newValue)}};c(S),o(y.id,e),p(f+1)}};return(null===y||void 0===y?void 0:y.type)!==V.FresnelReflector?null:Object(pf.jsx)(EP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){b(w)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:4,children:Object(pf.jsx)(ib.a,{checked:w,onChange:function(e){x(e)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",v)})]})})})]})})},dj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(Ci),n=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=IP(n),Y=O.labelText,L=O.setLabelText,N=CP(n),U=FP(n,Y),E=OP(n),J=kP(n),G=YP(n),X=LP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"fresnel-reflector-copy",paddingLeft:"36px"}),K&&Object(pf.jsx)(RP,{keyName:"fresnel-reflector-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"fresnel-reflector-lock"}),n&&K&&Object(pf.jsxs)(pf.Fragment,{children:[W&&Object(pf.jsx)(cj,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),M(!0)},children:[me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",B)," ..."]},"fresnel-reflector-receiver"),x&&Object(pf.jsx)(lj,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("word.Length",B)," ..."]},"fresnel-reflector-length"),y&&Object(pf.jsx)(aj,{setDialogVisible:g}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Width",B)," ..."]},"fresnel-reflector-width"),d&&Object(pf.jsx)(ij,{setDialogVisible:f}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("fresnelReflectorMenu.ModuleLength",B)," ..."]},"fresnel-reflector-module-length"),T&&Object(pf.jsx)(oj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"fresnel-reflector-pole-height"),j&&Object(pf.jsx)(rj,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"fresnel-reflector-reflectance"),F&&Object(pf.jsx)(sj,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),k(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"fresnel-reflector-draw-sun-beam"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:N,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"fresnel-reflector-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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 E(e)}})},"fresnel-reflector-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),uj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Pn),c=Xw(Sn),s=Xw(Hn),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.ly)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.ly);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&y.set(v.id,v.ly)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Width for All Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,b.newValue)}};f(b),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.ly);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.ly)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Width for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.ly:x.ly;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Heliostat Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatWidth=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Width",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},fj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(bn),c=Xw(An),s=Xw(Tn),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Ww.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!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===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&j(r,e)){P.current=!0;break}}}catch(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(h.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&y.set(v.id,v.lx)}}catch(O){w.e(O)}finally{w.f()}var b={name:"Set Length for All Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,b.newValue)}};f(b),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var A,H=Object(h.a)(o);try{for(H.s();!(A=H.n()).done;){var z=A.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&j(z,e)){P.current=!0;break}}}catch(O){H.e(O)}finally{H.f()}if(P.current)S.current=e,T(x.lx);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.lx)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Length for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.lx:x.lx;if(P.current=j(x,e),P.current)S.current=e,T(F);else{var k={name:"Set Heliostat Length",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatLength=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",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("word.Length",H),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",H),": 1 ",me.t("word.MeterAbbreviation",H),Object(pf.jsx)("br",{}),me.t("word.MaximumValue",H),": 20 ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},hj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(sc),c=Xw(uc),s=Xw(fc),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=Xw(Fi),x=NP(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)(),H=$f(),j=function(e){if(x&&function(e){if(x){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.parentId===x.parentId&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:P.current=!1;var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.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(O){l.e(O)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(h.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.Heliostat&&w.set(b.id,b.poleHeight)}}catch(O){v.e(O)}finally{v.f()}var A={name:"Set Pole Height for All Heliostats",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){s(V.Heliostat,A.newValue)}};f(A),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var H,j=Object(h.a)(o);try{for(j.s();!(H=j.n()).done;){var z=H.value;if(z.type===V.Heliostat&&z.foundationId===x.foundationId&&.5*Math.max(z.lx,z.ly)*Math.abs(Math.sin(z.tiltAngle))>e){P.current=!0;break}}}catch(O){j.e(O)}finally{j.f()}if(P.current)S.current=e,T(x.poleHeight);else{var R,D=new Map,W=Object(h.a)(o);try{for(W.s();!(R=W.n()).done;){var M=R.value;M.type===V.Heliostat&&M.foundationId===x.foundationId&&D.set(M.id,M.poleHeight)}}catch(O){W.e(O)}finally{W.f()}var I={name:"Set Pole Height for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(h.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(O){t.e(O)}finally{t.f()}},redo:function(){I.groupId&&c(V.Heliostat,I.groupId,I.newValue)}};f(I),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var C=i(x.id),F=C?C.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(F);else{var k={name:"Set Heliostat Pole Height",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(k.changedElementId,k.oldValue)},redo:function(){n(k.changedElementId,k.newValue)}};f(k),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatPoleHeight=e}))}},z=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var R=P.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",H),rejectedMessage:R,onApply:function(){j(A)},onClose:z,onClickCancel:function(){z(),w()},onClickOk:function(){j(A),P.current||(l(!1),m(0))},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 5] ",me.t("word.MeterAbbreviation",H)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",H)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",H)})]})})})]})})},pj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(gc),c=Xw(mc),s=Xw(wc),d=Xw(Sr),f=Xw(Mc),p=Xw(Ic),y=Xw(Ii),g=Xw(Ci),m=NP(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){if(m&&function(e){if(m){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&l.set(p.id,p.reflectance)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Reflectance for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.Heliostat,w.newValue)}};d(w),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&A.foundationId===m.foundationId&&v.set(A.id,A.reflectance)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Reflectance for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.Heliostat,T.groupId,T.newValue)}};d(T),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.reflectance:m.reflectance,H={name:"Set Heliostat Reflectance",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){T(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},yj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Zr),o=Xw(lc),i=Xw(ac),n=Xw(oc),c=Xw(Sr),s=Xw(Mc),d=Xw(Ic),f=Xw(Ii),p=Xw(Ci),y=NP(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){if(y&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Heliostat&&!o.locked&&o.drawSunBeam!==e)return!0}}catch(c){a.e(c)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&n.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllObjectsOfThisType:var t,r=new Map,d=Object(h.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.Heliostat&&r.set(g.id,g.drawSunBeam)}}catch(H){d.e(H)}finally{d.f()}var m={name:"Draw Sun Beam for All Heliostats",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(h.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(H){t.e(H)}finally{t.f()}},redo:function(){n(V.Heliostat,m.newValue)}};c(m),n(V.Heliostat,e),p(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var w,x=new Map,v=Object(h.a)(l);try{for(v.s();!(w=v.n()).done;){var b=w.value;b.type===V.Heliostat&&b.foundationId===y.foundationId&&x.set(b.id,b.drawSunBeam)}}catch(H){v.e(H)}finally{v.f()}var A={name:"Draw Sun Beam for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:x,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(h.a)(A.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(){A.groupId&&i(V.Heliostat,A.groupId,A.newValue)}};c(A),i(V.Heliostat,y.foundationId,e),p(f+1)}break;default:var T=a(y.id),P=T?T.drawSunBeam:y.drawSunBeam,S={name:"Draw Sun Beam for Heliostat",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(S.changedElementId,S.oldValue)},redo:function(){o(S.changedElementId,S.newValue)}};c(S),o(y.id,e),p(f+1)}};return(null===y||void 0===y?void 0:y.type)!==V.Heliostat?null:Object(pf.jsx)(EP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){b(w)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:4,children:Object(pf.jsx)(ib.a,{checked:w,onChange:x})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",v)})]})})})]})})},gj=yb.a.Option,mj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(Cc),c=Xw(Fc),s=Xw(kc),d=Xw(Sr),f=Xw(Mc),p=Xw(Ic),y=Xw(Ii),g=Xw(Ci),m=NP(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(h.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){if(m&&function(e){switch(f){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&a.towerId!==e)return!0}}catch(c){l.e(c)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&n.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!n.locked&&n.towerId!==e)return!0}}catch(c){r.e(c)}finally{r.f()}break;default:if((null===m||void 0===m?void 0:m.towerId)!==e)return!0}return!1}(e)){switch(f){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&l.set(p.id,p.towerId)}}catch(j){r.e(j)}finally{r.f()}var w={name:"Set Tower for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){s(V.Heliostat,w.newValue)}};d(w),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var x,v=new Map,b=Object(h.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&A.foundationId===m.foundationId&&v.set(A.id,A.towerId)}}catch(j){b.e(j)}finally{b.f()}var T={name:"Set Tower for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:v,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(h.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(j){t.e(j)}finally{t.f()}},redo:function(){T.groupId&&c(V.Heliostat,T.groupId,T.newValue)}};d(T),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var P=i(m.id),S=P?P.towerId:m.towerId,H={name:"Set Tower for Heliostat",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(H.changedElementId,H.oldValue)},redo:function(){n(H.changedElementId,H.newValue)}};d(H),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(pf.jsx)(EP,{width:600,title:me.t("heliostatMenu.SelectTowerToReflectSunlightTo",A),onApply:function(){v&&P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(yb.a,{style:{width:"120px"},value:v,onChange:b,children:T.map((function(e,t){return Object(pf.jsx)(gj,{value:e,children:me.t("heliostatMenu.Tower",A)+" "+(t+1)},t)}))})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){p(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},wj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Zr),n=Xw(hc),c=Xw(pc),s=Xw(yc),d=Xw($r),f=Xw(Sr),p=Xw(Mc),y=Xw(Ic),g=Xw(Ii),m=Xw(Ci),w=NP(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){if(w&&function(e){if(w){switch(p){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&c.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var u,f=Object(h.a)(o);try{for(f.s();!(u=f.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.parentId===w.parentId&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(m){f.e(m)}finally{f.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 _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Heliostat&&l.set(y.id,y.poleRadius)}}catch(z){r.e(z)}finally{r.f()}var x={name:"Set Pole Radius for All Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){s(V.Heliostat,x.newValue)}};f(x),s(V.Heliostat,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var v,b=new Map,A=Object(h.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.Heliostat&&T.foundationId===w.foundationId&&b.set(T.id,T.poleRadius)}}catch(z){A.e(z)}finally{A.f()}var P={name:"Set Pole Radius for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:b,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(h.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(z){t.e(z)}finally{t.f()}},redo:function(){P.groupId&&c(V.Heliostat,P.groupId,P.newValue)}};f(P),c(V.Heliostat,w.foundationId,e),m(g+1)}break;default:var S=i(w.id),H=S?S.poleRadius:w.poleRadius,j={name:"Set Heliostat Pole Radius",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(j.changedElementId,j.oldValue)},redo:function(){n(j.changedElementId,j.newValue)}};f(j),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(pf.jsx)(EP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){P(b)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",T)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",T)})]})})})]})})},xj=n.a.memo((function(){var e,t,l,a,o=Xw(Vi),i=Xw(Ci),n=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=IP(n),Y=O.labelText,L=O.setLabelText,N=CP(n),U=FP(n,Y),E=OP(n),J=kP(n),G=YP(n),X=LP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"heliostat-copy",paddingLeft:"36px"}),K&&Object(pf.jsx)(RP,{keyName:"heliostat-cut",paddingLeft:"36px"}),Object(pf.jsx)(DP,{keyName:"heliostat-lock"}),n&&K&&Object(pf.jsxs)(pf.Fragment,{children:[F&&Object(pf.jsx)(mj,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),k(!0)},children:[me.t("heliostatMenu.SelectTowerToReflectSunlightTo",B)," ..."]},"heliostat-tower"),y&&Object(pf.jsx)(fj,{setDialogVisible:g}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Length",B)," ..."]},"heliostat-length"),d&&Object(pf.jsx)(uj,{setDialogVisible:f}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("word.Width",B)," ..."]},"heliostat-width"),x&&Object(pf.jsx)(hj,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"heliostat-pole-height"),T&&Object(pf.jsx)(wj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.PoleRadius",B)," ..."]},"heliostat-pole-radius"),j&&Object(pf.jsx)(pj,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"heliostat-reflectance"),W&&Object(pf.jsx)(yj,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),M(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"heliostat-draw-sun-beam"),Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:N,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"heliostat-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.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 E(e)}})},"heliostat-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.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")]})]})})),vj=yb.a.Option,bj=function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(Sr),o=Xw.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},f=function(e,l){t((function(t){var a,o=Object(h.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(pf.jsxs)(yb.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(){f(i.changedElementId,i.oldValue)},redo:function(){f(i.changedElementId,i.newValue)}};a(i),f(o.id,e),t((function(t){t.actionState.treeType=e})),s(!c)}}},children:[Object(pf.jsxs)(vj,{value:oe.Apple,children:[Object(pf.jsx)("img",{alt:oe.Apple,src:gx,height:20,style:{paddingRight:"8px"}})," ",me.t("tree.Apple",d)]},oe.Apple),Object(pf.jsxs)(vj,{value:oe.Birch,children:[Object(pf.jsx)("img",{alt:oe.Birch,src:vx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Birch",d)]},oe.Birch),Object(pf.jsxs)(vj,{value:oe.Coconut,children:[Object(pf.jsx)("img",{alt:oe.Coconut,src:Tx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Coconut",d)]},oe.Coconut),Object(pf.jsxs)(vj,{value:oe.Dogwood,children:[Object(pf.jsx)("img",{alt:oe.Dogwood,src:Sx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Dogwood",d)]},oe.Dogwood),Object(pf.jsxs)(vj,{value:oe.Elm,children:[Object(pf.jsx)("img",{alt:oe.Elm,src:Rx,height:20,style:{paddingRight:"20px"}}),me.t("tree.Elm",d)]},oe.Elm),Object(pf.jsxs)(vj,{value:oe.FanPalm,children:[Object(pf.jsx)("img",{alt:oe.FanPalm,src:Mx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.FanPalm",d)]},oe.FanPalm),Object(pf.jsxs)(vj,{value:oe.Linden,children:[Object(pf.jsx)("img",{alt:oe.Linden,src:Cx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Linden",d)]},oe.Linden),Object(pf.jsxs)(vj,{value:oe.Magnolia,children:[Object(pf.jsx)("img",{alt:oe.Magnolia,src:Yx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Magnolia",d)]},oe.Magnolia),Object(pf.jsxs)(vj,{value:oe.Maple,children:[Object(pf.jsx)("img",{alt:oe.Maple,src:Ex,height:20,style:{paddingRight:"12px"}})," ",me.t("tree.Maple",d)]},oe.Maple),Object(pf.jsxs)(vj,{value:oe.Oak,children:[Object(pf.jsx)("img",{alt:oe.Oak,src:Xx,height:20,style:{paddingRight:"17px"}}),me.t("tree.Oak",d)]},oe.Oak),Object(pf.jsxs)(vj,{value:oe.Pine,children:[Object(pf.jsx)("img",{alt:oe.Pine,src:qx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Pine",d)]},oe.Pine),Object(pf.jsxs)(vj,{value:oe.Spruce,children:[Object(pf.jsx)("img",{alt:oe.Spruce,src:Qx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Spruce",d)]},oe.Spruce)]})},Aj=n.a.memo((function(){var e,t,l,a,o,i,n=Xw(si),c=Xw(Vi),s=Xw(bn),d=Xw(jn),f=NP(V.Tree),p=Xw(Sr),y=Object(r.useState)(null!==(e=null===f||void 0===f?void 0:f.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===f||void 0===f?void 0:f.lz)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=IP(f),P=T.labelText,S=T.setLabelText,H=CP(f),j=FP(f,P),z=OP(f),R=kP(f),D=YP(f),W=LP(f);if(!f)return null;var M={lng:c},I=!(null===f||void 0===f?void 0:f.locked),C=function(e,t){n((function(l){var a,o=Object(h.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()}}))},F=function(e,t){n((function(l){var a,o=Object(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"tree-copy"}),I&&Object(pf.jsx)(RP,{keyName:"tree-cut"}),Object(pf.jsx)(DP,{keyName:"tree-lock"}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:(null===f||void 0===f?void 0:f.showModel)&&(null===f||void 0===f?void 0:f.type)===V.Tree,onChange:function(e){return function(e){if(f){var t={name:"Show Tree Model",timestamp:Date.now(),checked:e,selectedElementId:f.id,selectedElementType:V.Tree,undo:function(){C(f.id,!t.checked)},redo:function(){C(f.id,t.checked)}};p(t),C(f.id,e)}}(e.target.checked)},children:me.t("treeMenu.ShowModel",M)})},"tree-show-model"),I&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:f.flip,onChange:function(e){var t=e.target.checked,l={name:"Flip Tree",timestamp:Date.now(),checked:t,selectedElementId:f.id,selectedElementType:V.Tree,undo:function(){F(f.id,!l.checked)},redo:function(){F(f.id,l.checked)}};p(l),F(f.id,t)},children:me.t("treeMenu.Flip",{lng:c})})},"tree-flip"),I&&Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("treeMenu.Type",M),": "]}),Object(pf.jsx)(bj,{},"trees")]},"tree-change-type"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("treeMenu.Spread",M)+" ("+me.t("word.MeterAbbreviation",M)+")",":"]}),Object(pf.jsx)(ob.a,{style:{width:"160px"},min:1,max:50,step:1,precision:1,value:m,onChange:function(e){return function(e){if(f&&e&&e!==m){var t={name:"Set Tree Spread",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){s(t.changedElementId,t.oldValue)},redo:function(){s(t.changedElementId,t.newValue)}};p(t),s(f.id,e),w(e),n((function(t){t.actionState.treeSpread=e}))}}(e)}})]},"tree-spread"),Object(pf.jsxs)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(pf.jsxs)(Pv.b,{style:{width:"100px"},children:[me.t("word.Height",M)+" ("+me.t("word.MeterAbbreviation",M)+")",":"]}),Object(pf.jsx)(ob.a,{style:{width:"160px"},min:1,max:30,step:1,precision:1,value:b,onChange:function(e){return function(e){if(f&&e&&e!==b){var t={name:"Set Tree Height",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){d(t.changedElementId,t.oldValue)},redo:function(){d(t.changedElementId,t.newValue)}};p(t),d(f.id,e),A(e),n((function(t){t.actionState.treeHeight=e}))}}(e)}})]},"tree-height")]}),I&&Object(pf.jsxs)(MP.a,{title:me.t("labelSubMenu.Label",M),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!(null===f||void 0===f?void 0:f.showLabel),onChange:H,children:me.t("labelSubMenu.KeepShowingLabel",M)})},"tree-show-label"),Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelText",M)+":",value:P,onChange:function(e){return S(e.target.value)},onPressEnter:j,onBlur:j})},"tree-label-text"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelHeight",M)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=f.labelHeight)&&void 0!==l?l:.2,onChange:function(e){return W(e)}})},"tree-label-height"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",M)+":",min:10,max:100,step:1,precision:0,value:null!==(a=f.labelFontSize)&&void 0!==a?a:20,onChange:function(e){return R(e)}})},"tree-label-font-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(ob.a,{addonBefore:me.t("labelSubMenu.LabelSize",M)+":",min:.2,max:5,step:.1,precision:1,value:null!==(o=f.labelSize)&&void 0!==o?o:.2,onChange:function(e){return z(e)}})},"tree-label-size"),Object(pf.jsx)(tb.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(pf.jsx)(GT.a,{addonBefore:me.t("labelSubMenu.LabelColor",M)+":",value:null!==(i=f.labelColor)&&void 0!==i?i:"#ffffff",onChange:function(e){return D(e.target.value)}})},"tree-label-color")]})]},"tree-label")]})})),Tj=l(804),Pj="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=",Sj="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC",Hj=l.p+"static/media/wall_03_menu.39f5c56a.png",jj="data:image/png;base64,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",zj=l.p+"static/media/wall_05_menu.c887c64e.png",Rj=l.p+"static/media/wall_06_menu.3dc4a0c2.png",Dj="data:image/png;base64,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",Wj="data:image/png;base64,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",Mj=l.p+"static/media/wall_09_menu.5124ae81.png",Ij=l.p+"static/media/wall_10_menu.a934991d.png",Cj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Ku),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=$f(),p=NP(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=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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=Ww.getAllConnectedWalls(p);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(p&&function(e){if(p){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.textureType&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===p.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(y){r.e(y)}finally{r.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(p),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var f=s.value;if(e!==f.textureType&&!f.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.textureType))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var f,y=t.value;if(y.type===V.Wall&&!y.locked)l.set(y.id,null!==(f=y.textureType)&&void 0!==f?f:ue.Default)}}catch(k){r.e(k)}finally{r.f()}var g={name:"Set Texture for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){T(g.newValue)}};i(g),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var P=m.value;P.type!==V.Wall||P.foundationId!==p.foundationId||P.locked||w.set(P.id,P.textureType)}}catch(k){x.e(k)}finally{x.f()}var S={name:"Set Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};i(S),A(p.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(p){var H,j=Ww.getAllConnectedWalls(p),z=new Map,R=Object(h.a)(j);try{for(R.s();!(H=R.n()).done;){var D=H.value;z.set(D.id,D.textureType)}}catch(k){R.e(k)}finally{R.f()}var W={name:"Set Texture for All Connected Walls",timestamp:Date.now(),oldValues:z,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){b(W.newValue)}};i(W),b(e),s(c+1)}break;default:if(p){var M,I=d(p.id),C=null!==(M=null===I||void 0===I?void 0:I.textureType)&&void 0!==M?M:p.textureType,F={name:"Set Texture of Selected Wall",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(F.changedElementId,F.oldValue)},redo:function(){v(F.changedElementId,F.newValue)}};i(F),v(p.id,e),s(c+1)}}a((function(t){t.actionState.wallTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",f),onApply:function(){P(m)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(pf.jsxs)(x,{value:ue.NoTexture,children:[Object(pf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",f)]},ue.NoTexture),Object(pf.jsxs)(x,{value:ue.Default,children:[Object(pf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",f)]},ue.Default),Object(pf.jsxs)(x,{value:ue.Texture01,children:[Object(pf.jsx)("img",{alt:ue.Texture01,src:Pj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",f)]},ue.Texture01),Object(pf.jsxs)(x,{value:ue.Texture02,children:[Object(pf.jsx)("img",{alt:ue.Texture02,src:Sj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",f)]},ue.Texture02),Object(pf.jsxs)(x,{value:ue.Texture03,children:[Object(pf.jsx)("img",{alt:ue.Texture03,src:Hj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",f)]},ue.Texture03),Object(pf.jsxs)(x,{value:ue.Texture04,children:[Object(pf.jsx)("img",{alt:ue.Texture04,src:jj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",f)]},ue.Texture04),Object(pf.jsxs)(x,{value:ue.Texture05,children:[Object(pf.jsx)("img",{alt:ue.Texture05,src:zj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",f)]},ue.Texture05),Object(pf.jsxs)(x,{value:ue.Texture06,children:[Object(pf.jsx)("img",{alt:ue.Texture06,src:Rj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",f)]},ue.Texture06),Object(pf.jsxs)(x,{value:ue.Texture07,children:[Object(pf.jsx)("img",{alt:ue.Texture07,src:Dj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",f)]},ue.Texture07),Object(pf.jsxs)(x,{value:ue.Texture08,children:[Object(pf.jsx)("img",{alt:ue.Texture08,src:Wj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",f)]},ue.Texture08),Object(pf.jsxs)(x,{value:ue.Texture09,children:[Object(pf.jsx)("img",{alt:ue.Texture09,src:Mj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",f)]},ue.Texture09),Object(pf.jsxs)(x,{value:ue.Texture10,children:[Object(pf.jsx)("img",{alt:ue.Texture10,src:Ij,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",f)]},ue.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},Fj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=$f(),p=UP(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(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.color&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.color&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.color&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.color))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.color)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1);break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.color)&&void 0!==F?F:d.color)&&void 0!==C?C:"#ffffff",Y={name:"Set Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.Color",f),onApply:function(){A(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},kj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=UP(null!==(t=null===d||void 0===d?void 0:d.structureColor)&&void 0!==t?t:"#ffffff"),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){a((function(l){var a,o=Object(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.structureColor&&!a.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.structureColor&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.structureColor&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.structureColor))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.structureColor)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Structure Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.structureColor)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Structure Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Structure Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1)}break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.structureColor)&&void 0!==F?F:d.structureColor)&&void 0!==C?C:"#ffffff",Y={name:"Set Structure Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallStructureColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.StructureColor",m),onApply:function(){A(y)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:y,onChangeComplete:g})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",m)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",m)})]})})})]})})},Oj=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=Xw(ki),d=Xw(Sr),f=Xw(Ku),p=Xw(Ii),y=Xw(Ci),g=Xw(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(h.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=Ww.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(h.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(h.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(h.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(h.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){if(t&&function(e){switch(f){case _.AllObjectsOfThisType:var l,o=Object(h.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i[a]&&!i.locked)return!0}}catch(g){o.e(g)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===t.foundationId&&e!==c[a]&&!c.locked)return!0}}catch(g){n.e(g)}finally{n.f()}break;case _.AllConnectedObjects:var d,u=Ww.getAllConnectedWalls(t),p=Object(h.a)(u);try{for(p.s();!(d=p.n()).done;){var y=d.value;if(e!==y[a]&&!y.locked)return!0}}catch(g){p.e(g)}finally{p.f()}break;default:if(e!==t[a])return!0}return!1}(e))switch(f){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&i.set(n.id,n[a])}}catch(I){r.e(I)}finally{r.f()}var c={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){T(c.newValue)}};d(c),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var g,m=new Map,w=Object(h.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&x.foundationId===t.foundationId&&m.set(x.id,x[a])}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(h.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];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P.groupId&&A(P.groupId,P.newValue)}};d(P),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var S,H=Ww.getAllConnectedWalls(t),j=new Map,z=Object(h.a)(H);try{for(z.s();!(S=z.n()).done;){var R=S.value;j.set(R.id,R[a])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:j,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){b(D.newValue)}};d(D),b(e),y(p+1)}break;default:if(t){var W=t[a],M={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};d(M),v(t.id,e),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){P(m.current)},onClose:function(){m.current=t[a],c()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Yj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.rValue&&!o.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.rValue&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.rValue&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(L){r.e(L)}finally{r.f()}var g={name:"Set R-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(null===f||void 0===f?void 0:f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Wall&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(L){x.e(L)}finally{x.f()}var H={name:"Set R-Value for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.AllConnectedObjects:if(f){var j,z=Ww.getAllConnectedWalls(f),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W=j.value;if(!W.locked){var M,I=W;R.set(W.id,null!==(M=I.rValue)&&void 0!==M?M:2),T(I.id,e)}}}catch(L){D.e(L)}finally{D.f()}var C={name:"Set R-Value for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){P(C.oldValues)},redo:function(){S(C.oldValues,C.newValue)}};o(C),c(n+1)}break;default:if(f){var F,k,O=null!==(F=null!==(k=s(f.id).rValue)&&void 0!==k?k:f.rValue)&&void 0!==F?F:2,Y={name:"Set Wall R-Value",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(Y.changedElementId,Y.oldValue)},redo:function(){T(Y.changedElementId,Y.newValue)}};o(Y),T(f.id,e),c(n+1)}}d((function(t){t.actionState.wallRValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.RValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){H(g)},onClose:function(){var e;m(null!==(e=null===f||void 0===f?void 0:f.rValue)&&void 0!==e?e:2),l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",A)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",A)})]})})})]})})},Lj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.volumetricHeatCapacity&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.volumetricHeatCapacity)&&void 0!==p?p:.5),x(y.id,e)}}}catch(L){r.e(L)}finally{r.f()}var g={name:"Set Volumetric Heat Capacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(null===f||void 0===f?void 0:f.foundationId){var m,w=new Map,A=Object(h.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;if(T.type===V.Wall&&T.foundationId===f.foundationId&&!T.locked){var P,S=T;w.set(T.id,null!==(P=S.volumetricHeatCapacity)&&void 0!==P?P:.5),x(S.id,e)}}}catch(L){A.e(L)}finally{A.f()}var H={name:"Set Volumetric Heat Capacity for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){v(H.oldValues)},redo:function(){b(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.AllConnectedObjects:if(f){var j,z=Ww.getAllConnectedWalls(f),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W=j.value;if(!W.locked){var M,I=W;R.set(W.id,null!==(M=I.volumetricHeatCapacity)&&void 0!==M?M:.5),x(I.id,e)}}}catch(L){D.e(L)}finally{D.f()}var C={name:"Set Volumetric Heat Capacity for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){v(C.oldValues)},redo:function(){b(C.oldValues,C.newValue)}};o(C),c(n+1)}break;default:if(f){var F,k,O=null!==(F=null!==(k=s(f.id).volumetricHeatCapacity)&&void 0!==k?k:f.volumetricHeatCapacity)&&void 0!==F?F:.5,Y={name:"Set Volumetric Heat Capacity of Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};o(Y),x(f.id,e),c(n+1)}}d((function(t){t.actionState.wallVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Nj=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=Xw(ki),d=Xw(Sr),f=Xw(Ku),p=Xw(Ii),y=Xw(Ci),g=Xw(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(h.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=Ww.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(h.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(h.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(h.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(h.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){if(t&&function(e){switch(f){case _.AllObjectsOfThisType:var l,o=Object(h.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)return!0}}catch(g){o.e(g)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===t.foundationId&&e!==c.parapet[a]&&!c.locked)return!0}}catch(g){n.e(g)}finally{n.f()}break;case _.AllConnectedObjects:var d,u=Ww.getAllConnectedWalls(t),p=Object(h.a)(u);try{for(p.s();!(d=p.n()).done;){var y=d.value;if(e!==y.parapet[a]&&!y.locked)return!0}}catch(g){p.e(g)}finally{p.f()}break;default:if(e!==t.parapet[a])return!0}return!1}(e))switch(f){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&i.set(n.id,n.parapet[a])}}catch(I){r.e(I)}finally{r.f()}var c={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){T(c.newValue)}};d(c),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var g,m=new Map,w=Object(h.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&x.foundationId===t.foundationId&&m.set(x.id,x.parapet[a])}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(h.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];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P.groupId&&A(P.groupId,P.newValue)}};d(P),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var S,H=Ww.getAllConnectedWalls(t),j=new Map,z=Object(h.a)(H);try{for(z.s();!(S=z.n()).done;){var R=S.value;j.set(R.id,R.parapet[a])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:j,newValue:e,undo:function(){var e,t=Object(h.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(I){t.e(I)}finally{t.f()}},redo:function(){b(D.newValue)}};d(D),b(e),y(p+1)}break;default:if(t){var W=t.parapet[a],M={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};d(M),v(t.id,e),y(p+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){P(m.current)},onClose:function(){c()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:f,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},Uj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),r=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Wall),f=$f(),p=UP(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(h.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=Ww.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(d&&function(e){if(d){switch(r){case _.AllObjectsOfThisType:var t,l=Object(h.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)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,n=Object(h.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===d.foundationId&&e!==c.parapet.color&&!c.locked)return!0}}catch(y){n.e(y)}finally{n.f()}break;case _.AllConnectedObjects:var s,u=Ww.getAllConnectedWalls(d),f=Object(h.a)(u);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(e!==p.parapet.color&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.parapet.color))return!0}return!1}}(e)){switch(r){case _.AllObjectsOfThisType:var t,l=new Map,f=Object(h.a)(o);try{for(f.s();!(t=f.n()).done;){var p,y=t.value;if(y.type===V.Wall)l.set(y.id,null!==(p=y.parapet.color)&&void 0!==p?p:"#ffffff")}}catch(L){f.e(L)}finally{f.f()}var g={name:"Set Parapet Color for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){b(g.newValue)}};i(g),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var m,A=new Map,T=Object(h.a)(o);try{for(T.s();!(m=T.n()).done;){var P,S=m.value;if(S.type===V.Wall&&S.foundationId===d.foundationId)A.set(S.id,null!==(P=S.parapet.color)&&void 0!==P?P:"#ffffff")}}catch(L){T.e(L)}finally{T.f()}var H={name:"Set Parapet Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:A,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){H.groupId&&v(H.groupId,H.newValue)}};i(H),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var j,z=Ww.getAllConnectedWalls(d),R=new Map,D=Object(h.a)(z);try{for(D.s();!(j=D.n()).done;){var W,M=j.value;R.set(M.id,null!==(W=M.color)&&void 0!==W?W:"#ffffff")}}catch(L){D.e(L)}finally{D.f()}var I={name:"Set Parapet Color for All Connected Walls",timestamp:Date.now(),oldValues:R,newValue:e,undo:function(){var e,t=Object(h.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(L){t.e(L)}finally{t.f()}},redo:function(){x(I.newValue)}};i(I),x(e),c(n+1)}break;default:if(d){var C,F,k=s(d.id),O=null!==(C=null!==(F=null===k||void 0===k?void 0:k.parapet.color)&&void 0!==F?F:d.parapet.color)&&void 0!==C?C:"#ffffff",Y={name:"Set Parapet Color of Selected Wall",timestamp:Date.now(),oldValue:O,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(Y.changedElementId,Y.oldValue)},redo:function(){w(Y.changedElementId,Y.newValue)}};i(Y),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallParapet.color=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("wallMenu.ParapetColor",f),onApply:function(){A(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:r,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",f)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",f)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",f)})]})})})]})})},Ej=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Ku),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Wall),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.parapet.textureType)&&void 0!==t?t:ue.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){a((function(l){var a,o=Object(h.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(f){var t=Ww.getAllConnectedWalls(f);0!==t.length&&a((function(l){var a,o=Object(h.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(h.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(h.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(h.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){if(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.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)return!0}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&c.foundationId===f.foundationId&&e!==c.parapet.textureType&&!c.locked)return!0}}catch(y){r.e(y)}finally{r.f()}break;case _.AllConnectedObjects:var s,d=Ww.getAllConnectedWalls(f),u=Object(h.a)(d);try{for(u.s();!(s=u.n()).done;){var p=s.value;if(e!==p.parapet.textureType&&!p.locked)return!0}}catch(y){u.e(y)}finally{u.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.parapet.textureType))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Wall&&!y.locked)l.set(y.id,null!==(p=y.parapet.textureType)&&void 0!==p?p:ue.Default)}}catch(k){r.e(k)}finally{r.f()}var g={name:"Set Parapet Texture for All Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){T(g.newValue)}};i(g),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(o);try{for(x.s();!(m=x.n()).done;){var P=m.value;P.type!==V.Wall||P.foundationId!==f.foundationId||P.locked||w.set(P.id,P.parapet.textureType)}}catch(k){x.e(k)}finally{x.f()}var S={name:"Set Parapet Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){S.groupId&&A(S.groupId,S.newValue)}};i(S),A(f.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(f){var H,j=Ww.getAllConnectedWalls(f),z=new Map,R=Object(h.a)(j);try{for(R.s();!(H=R.n()).done;){var D=H.value;z.set(D.id,D.parapet.textureType)}}catch(k){R.e(k)}finally{R.f()}var W={name:"Set Parapet Texture for All Connected Walls",timestamp:Date.now(),oldValues:z,newValue:e,undo:function(){var e,t=Object(h.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(k){t.e(k)}finally{t.f()}},redo:function(){b(W.newValue)}};i(W),b(e),s(c+1)}break;default:if(f){var M,I=d(f.id),C=null!==(M=null===I||void 0===I?void 0:I.parapet.textureType)&&void 0!==M?M:f.parapet.textureType,F={name:"Set Parapet Texture of Selected Wall",timestamp:Date.now(),oldValue:C,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(F.changedElementId,F.oldValue)},redo:function(){v(F.changedElementId,F.newValue)}};i(F),v(f.id,e),s(c+1)}}a((function(t){t.actionState.wallParapet.textureType=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){P(g)},onClose:function(){l()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(pf.jsxs)(x,{value:ue.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:ue.Default,children:[Object(pf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",w)]},ue.Default),Object(pf.jsxs)(x,{value:ue.Texture01,children:[Object(pf.jsx)("img",{alt:ue.Texture01,src:Pj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",w)]},ue.Texture01),Object(pf.jsxs)(x,{value:ue.Texture02,children:[Object(pf.jsx)("img",{alt:ue.Texture02,src:Sj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",w)]},ue.Texture02),Object(pf.jsxs)(x,{value:ue.Texture03,children:[Object(pf.jsx)("img",{alt:ue.Texture03,src:Hj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",w)]},ue.Texture03),Object(pf.jsxs)(x,{value:ue.Texture04,children:[Object(pf.jsx)("img",{alt:ue.Texture04,src:jj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",w)]},ue.Texture04),Object(pf.jsxs)(x,{value:ue.Texture05,children:[Object(pf.jsx)("img",{alt:ue.Texture05,src:zj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",w)]},ue.Texture05),Object(pf.jsxs)(x,{value:ue.Texture06,children:[Object(pf.jsx)("img",{alt:ue.Texture06,src:Rj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",w)]},ue.Texture06),Object(pf.jsxs)(x,{value:ue.Texture07,children:[Object(pf.jsx)("img",{alt:ue.Texture07,src:Dj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",w)]},ue.Texture07),Object(pf.jsxs)(x,{value:ue.Texture08,children:[Object(pf.jsx)("img",{alt:ue.Texture08,src:Wj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",w)]},ue.Texture08),Object(pf.jsxs)(x,{value:ue.Texture09,children:[Object(pf.jsx)("img",{alt:ue.Texture09,src:Mj,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",w)]},ue.Texture09),Object(pf.jsxs)(x,{value:ue.Texture10,children:[Object(pf.jsx)("img",{alt:ue.Texture10,src:Ij,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",w)]},ue.Texture10)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWallActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(pf.jsx)(rb.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"}(vH||(vH={}));var Vj,Jj={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"}},Gj={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"}},Xj={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},Bj=n.a.memo((function(){var e=Xw(Vi),t=Xw(si),l=Xw(Ci),a=Xw(fs),o=Xw($c),i=Xw(Sr),n=Xw(hn),c=Xw(fn),s=Xw(Xc),d=Xw(Gc),p=Xw(Kc),y=Xw(_r),g=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[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)}))},W=function(e,l){t((function(t){var a,o=Object(h.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!==Ee.Stud&&l!==Ee.Pillar||(r.opacity=0);break}}}catch(n){o.e(n)}finally{o.f()}}))},M=function(e,l){t((function(t){var a,o=Object(h.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(h.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(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),v(e)},children:[me.t("wallMenu.".concat(e),R)," ..."]},"wall-".concat(e))},F=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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:a(r,l),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){!function(e){if(g){var l=Xw.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(f.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"))},k=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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"))},O=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(pf.jsx)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[function(){var e=Xw.getState().elementsToPaste;if(e&&e.length>0){var t=e[0];if(Ww.isLegalOnWall(t.type))return!0}return!1}()?Object(pf.jsx)(jP,{keyName:"wall-paste"}):null,Object(pf.jsx)(zP,{keyName:"wall-copy"}),!g||g.locked?null:Object(pf.jsx)(RP,{keyName:"wall-cut"}),Object(pf.jsx)(DP,{keyName:"wall-lock"}),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[function(){switch(x){case vH.Height:case vH.Opacity:case vH.Thickness:case vH.StructureSpacing:case vH.StructureWidth:case vH.EavesLength:var e=Jj[x];return e?Object(pf.jsx)(Oj,{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 vH.ParapetHeight:case vH.CopingsHeight:case vH.CopingsWidth:var t=Gj[x];return t?Object(pf.jsx)(Nj,{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 vH.Color:return Object(pf.jsx)(Fj,{setDialogVisible:function(){return v(null)}});case vH.StructureColor:return Object(pf.jsx)(kj,{setDialogVisible:function(){return v(null)}});case vH.ParapetColor:return Object(pf.jsx)(Uj,{setDialogVisible:function(){return v(null)}});case vH.Texture:return Object(pf.jsx)(Cj,{setDialogVisible:function(){return v(null)}});case vH.ParapetTexture:return Object(pf.jsx)(Ej,{setDialogVisible:function(){return v(null)}})}}(),function(){var e=g?a(g.id,!0):new Ow;if(e.gotSome()&&Xw.getState().contextMenuObjectType){var t=g?a(g.id,!1):new Ow;return Object(pf.jsxs)(MP.a,{title:me.t("word.Elements",R),style:{paddingLeft:"24px"},children:[F(V.Window,t.windowCount),F(V.Door,t.doorCount),F(V.SolarPanel,t.solarPanelCount),F(V.Sensor,t.sensorCount),F(V.Light,t.insideLightCount+t.outsideLightCount),F(V.Polygon,t.polygonCount),k(V.Window,t.windowCount),O(V.Window,e.windowCount),k(V.SolarPanel,t.solarPanelCount),O(V.SolarPanel,e.solarPanelCount),k(V.Sensor,t.sensorCount),O(V.Sensor,e.sensorCount),Y(e.outsideLightCount,!0),Y(e.insideLightCount,!1),k(V.Polygon,t.polygonCount),O(V.Polygon,e.polygonCount)]},"lock-unlock-clear-on-wall")}return null}(),g?Object(pf.jsxs)(MP.a,{title:me.t("wallMenu.Parapet",R),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),C(vH.ParapetColor),C(vH.ParapetTexture),C(vH.ParapetHeight),C(vH.CopingsHeight),C(vH.CopingsWidth)]},"wall-parapet"):null,function(){var e;return g?Object(pf.jsx)(MP.a,{title:me.t("wallMenu.WallStructure",R),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.a.Group,{value:null!==(e=g.wallStructure)&&void 0!==e?e:Ee.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(){W(l.changedElementId,l.oldValue)},redo:function(){W(l.changedElementId,l.newValue)}};i(l),W(g.id,e.target.value),t((function(t){t.actionState.wallStructure=e.target.value,t.actionState.wallStructure!==Ee.Stud&&t.actionState.wallStructure!==Ee.Pillar||(t.actionState.wallOpacity=0)}))},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Default,children:me.t("wallMenu.DefaultStructure",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Stud,children:me.t("wallMenu.StudStructure",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ee.Pillar,children:me.t("wallMenu.PillarStructure",R)})]})},"wall-structure"):null}(),(null===g||void 0===g?void 0:g.wallStructure)===Ee.Stud||(null===g||void 0===g?void 0:g.wallStructure)===Ee.Pillar?Object(pf.jsxs)(pf.Fragment,{children:[C(vH.StructureSpacing),C(vH.StructureWidth),C(vH.StructureColor),C(vH.Opacity)]}):null,Object(pf.jsx)(tb.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=Ww.wallAbsolutePosition(new We.Vector3(a,o,i),l).setZ(t.lz/2+l.lz);return(new We.Vector3).subVectors(e,n).applyEuler(new We.Euler(0,0,-r))}return new We.Vector3}(Xw.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 We.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(pf.jsxs)(MP.a,{title:me.t("wallMenu.Fill",R),style:{paddingLeft:"24px"},children:[Object(pf.jsxs)(rb.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(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(g.id,e.target.value)},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Full,children:me.t("wallMenu.Full",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Partial,children:me.t("wallMenu.Partial",R)}),Object(pf.jsx)(rb.a,{style:Xj,value:Ue.Empty,children:me.t("wallMenu.Empty",R)})]}),g.fill!==Ue.Full&&Object(pf.jsx)("div",{style:{paddingLeft:"10px",paddingTop:"10px"},children:Object(pf.jsx)(ab.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(vH.Thickness),C(vH.Height),C(vH.EavesLength),T&&Object(pf.jsx)(Yj,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),P(!0)},children:[me.t("word.RValue",R)," ..."]},"wall-r-value"),j&&Object(pf.jsx)(Lj,{setDialogVisible:z}),Object(pf.jsxs)(tb.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)===Ee.Default?C(vH.Texture):null,!((null===g||void 0===g?void 0:g.wallStructure)===Ee.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(vH.Color)]})]})})),Kj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(si),d=Xw(Zr),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:fe.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.textureType&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.textureType&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked)l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:fe.Default)}}catch(M){r.e(M)}finally{r.f()}var y={name:"Set Texture for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Door||x.foundationId!==f.foundationId||x.locked||m.set(x.id,x.textureType)}}catch(M){w.e(M)}finally{w.f()}var T={name:"Set Texture for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){A(T.oldValues)},redo:function(){T.groupId&&b(T.oldValues,T.newValue)}};o(T),b(m,e),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var P,S=new Map,H=Object(h.a)(Xw.getState().elements);try{for(H.s();!(P=H.n()).done;){var j=P.value;j.type!==V.Door||j.parentId!==f.parentId||j.locked||S.set(j.id,j.textureType)}}catch(M){H.e(M)}finally{H.f()}var z={name:"Set Texture for All Doors On the Same Wall",timestamp:Date.now(),oldValues:S,newValue:e,groupId:f.parentId,undo:function(){A(z.oldValues)},redo:function(){z.groupId&&b(z.oldValues,z.newValue)}};o(z),b(S,e),c(n+1)}break;default:if(f){var R=d(f.id),D=R?R.textureType:f.textureType,W={name:"Set Texture of Selected Door",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};o(W),v(f.id,e),c(n+1)}}s((function(t){t.actionState.doorTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(pf.jsxs)(x,{value:fe.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:fe.Default,children:[Object(pf.jsx)("img",{alt:fe.Default,src:rm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.TextureDefault",w)]},fe.Default),Object(pf.jsxs)(x,{value:fe.Texture01,children:[Object(pf.jsx)("img",{alt:fe.Texture01,src:nm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture01",w)]},fe.Texture01),Object(pf.jsxs)(x,{value:fe.Texture02,children:[Object(pf.jsx)("img",{alt:fe.Texture02,src:cm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture02",w)]},fe.Texture02),Object(pf.jsxs)(x,{value:fe.Texture03,children:[Object(pf.jsx)("img",{alt:fe.Texture03,src:sm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture03",w)]},fe.Texture03),Object(pf.jsxs)(x,{value:fe.Texture04,children:[Object(pf.jsx)("img",{alt:fe.Texture04,src:dm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture04",w)]},fe.Texture04),Object(pf.jsxs)(x,{value:fe.Texture05,children:[Object(pf.jsx)("img",{alt:fe.Texture05,src:um,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture05",w)]},fe.Texture05),Object(pf.jsxs)(x,{value:fe.Texture06,children:[Object(pf.jsx)("img",{alt:fe.Texture06,src:fm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture06",w)]},fe.Texture06),Object(pf.jsxs)(x,{value:fe.Texture07,children:[Object(pf.jsx)("img",{alt:fe.Texture07,src:hm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture07",w)]},fe.Texture07),Object(pf.jsxs)(x,{value:fe.Texture08,children:[Object(pf.jsx)("img",{alt:fe.Texture08,src:pm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture08",w)]},fe.Texture08),Object(pf.jsxs)(x,{value:fe.Texture09,children:[Object(pf.jsx)("img",{alt:fe.Texture09,src:ym,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture09",w)]},fe.Texture09),Object(pf.jsxs)(x,{value:fe.Texture10,children:[Object(pf.jsx)("img",{alt:fe.Texture10,src:gm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture10",w)]},fe.Texture10),Object(pf.jsxs)(x,{value:fe.Texture11,children:[Object(pf.jsx)("img",{alt:fe.Texture11,src:mm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture11",w)]},fe.Texture11),Object(pf.jsxs)(x,{value:fe.Texture12,children:[Object(pf.jsx)("img",{alt:fe.Texture12,src:wm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture12",w)]},fe.Texture12),Object(pf.jsxs)(x,{value:fe.Texture13,children:[Object(pf.jsx)("img",{alt:fe.Texture13,src:xm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture13",w)]},fe.Texture13),Object(pf.jsxs)(x,{value:fe.Texture14,children:[Object(pf.jsx)("img",{alt:fe.Texture14,src:vm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture14",w)]},fe.Texture14),Object(pf.jsxs)(x,{value:fe.Texture15,children:[Object(pf.jsx)("img",{alt:fe.Texture15,src:bm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture15",w)]},fe.Texture15),Object(pf.jsxs)(x,{value:fe.Texture16,children:[Object(pf.jsx)("img",{alt:fe.Texture16,src:Am,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture16",w)]},fe.Texture16),Object(pf.jsxs)(x,{value:fe.Texture17,children:[Object(pf.jsx)("img",{alt:fe.Texture17,src:Tm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture17",w)]},fe.Texture17)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},qj=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(Zu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&e!==a.color&&!a.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Door&&c.foundationId===(null===f||void 0===f?void 0:f.foundationId)&&e!==c.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===f||void 0===f?void 0:f.parentId)&&e!==u.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(Xw.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked)l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(F){r.e(F)}finally{r.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Door&&T.foundationId===f.foundationId&&!f.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(F){w.e(F)}finally{w.f()}var P={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){b(P.oldValues)},redo:function(){P.groupId&&v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1)}break;case _.OnlyThisSide:if(f.parentId){var S,H=new Map,j=Object(h.a)(Xw.getState().elements);try{for(j.s();!(S=j.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.parentId===f.parentId&&!f.locked)H.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(F){j.e(F)}finally{j.f()}var D={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:f.parentId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(H,e),s(c+1)}break;default:if(f){var W,M=d(f.id),I=null!==(W=M?M.color:f.color)&&void 0!==W?W:"#ffffff",C={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};i(C),x(f.id,e),s(c+1)}}a((function(t){t.actionState.doorColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("word.Color",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},Qj=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.uValue)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.uValue&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.uValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.uValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.uValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){P(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){P(y.oldValues)},redo:function(){S(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).uValue)&&void 0!==m?m:f.uValue)&&void 0!==g?g:1,x={name:"Set Door U-Value",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(x.changedElementId,x.oldValue)},redo:function(){T(x.changedElementId,x.newValue)}};o(x),T(f.id,e),c(n+1)}}d((function(t){t.actionState.doorUValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toUValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toUValueInUS(.01),max:Ww.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(Ww.toUValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toUValueInUS(.01).toFixed(3),", ",Ww.toUValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",A)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",A)})]})})})]})})},Zj=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(Zu),i=Xw(Ii),n=Xw(Ci),c=Xw(Zr),s=Xw(si),d=Xw($r),f=NP(V.Door),p=Object(r.useMemo)((function(){var e=f?f.lx:1,t=f?d(f):null;return t?e*t.lx:e}),[null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(o){case _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Door&&!i.locked){var r=d(i);if(r&&e!==i.lx*r.lx)return!0}}}catch(x){a.e(x)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(l);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&s.foundationId===f.foundationId&&!s.locked){var u=d(s);if(u&&e!==s.lx*u.lx)return!0}}}catch(x){c.e(x)}finally{c.f()}break;case _.OnlyThisSide:var p,y=Object(h.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===f.parentId&&!g.locked){var m=d(g);if(m&&e!==g.lx*m.lx)return!0}}}catch(x){y.e(x)}finally{y.f()}break;default:var w=d(f);if(w&&e!==f.lx*w.lx)return!0}return!1}}(e))switch(o){case _.AllObjectsOfThisType:var t=new Map;s((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var u=new Map;s((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:u,newValue:e,groupId:f.foundationId,undo:function(){b(p.oldValues)},redo:function(){A(p.oldValues,p.newValue)}};a(p),n(i+1)}break;case _.OnlyThisSide:if(f.parentId){var y=new Map;s((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:y,newValue:e,groupId:f.parentId,undo:function(){b(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};a(g),n(i+1)}break;default:if(f){var m,w,x=c(f.id),T=f?d(x):null,P=(null!==(m=null!==(w=x.lx)&&void 0!==w?w:f.lx)&&void 0!==m?m:.1)*(T?T.lx:1),S={name:"Set Door Width",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(S.changedElementId,S.oldValue)},redo:function(){v(S.changedElementId,S.newValue)}};a(S),v(f.id,e),n(i+1)}}},P=f?d(f):null,S=P&&f?2*P.lx*Math.min(Math.abs(.5-f.cx),Math.abs(-.5-f.cx)):100;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Width",x),onApply:function(){T(m)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},_j=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=Xw($r),p=NP(V.Door),y=Object(r.useMemo)((function(){var e=p?p.lz:1,t=p?f(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(h.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=f(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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&!o.locked){var r=f(o);if(r&&e!==o.lz*r.lz)return!0}}}catch(x){l.e(x)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&s.foundationId===p.foundationId&&!s.locked){var d=f(s);if(d&&e!==s.lz*d.lz)return!0}}}catch(x){c.e(x)}finally{c.f()}break;case _.OnlyThisSide:var u,y=Object(h.a)(a);try{for(y.s();!(u=y.n()).done;){var g=u.value;if(g.type===V.Door&&g.parentId===p.parentId&&!g.locked){var m=f(g);if(m&&e!==g.lz*m.lz)return!0}}}catch(x){y.e(x)}finally{y.f()}break;default:var w=f(p);if(w&&e!==p.lz*w.lz)return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){var r=i,n=r?f(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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var r=new Map;d((function(t){var l,a=Object(h.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,n=i?f(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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:p.foundationId,undo:function(){A(u.oldValues)},redo:function(){T(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(p.parentId){var y=new Map;d((function(t){var l,a=Object(h.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?f(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 On the Same Wall",timestamp:Date.now(),oldValues:y,newValue:e,groupId:p.parentId,undo:function(){A(g.oldValues)},redo:function(){T(g.oldValues,g.newValue)}};o(g),c(n+1)}break;default:if(p){var m,w,x=s(p.id),v=p?f(x):null,P=(null!==(m=null!==(w=x.lz)&&void 0!==w?w:p.lz)&&void 0!==m?m:.2)*(v?v.lz:1),S={name:"Set Door Height",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(S.changedElementId,S.oldValue)},redo:function(){b(S.changedElementId,S.newValue)}};o(S),b(p.id,e),c(n+1)}}},S=p?f(p):null,H=null!==(t=null===S||void 0===S?void 0:S.lz)&&void 0!==t?t:20;return Object(pf.jsx)(EP,{width:550,title:me.t("word.Height",v),onApply:function(){P(w)},onClose:function(){x(y),l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.a,{min:.1,max:H,style:{width:120},step:.1,precision:2,value:w,formatter:function(e){return Number(e).toFixed(2)},onChange:x}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, ",H.toFixed(1),"]",me.t("word.MeterAbbreviation",v)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",v)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",v)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",v)})]})})})]})})},$j=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===(null===f||void 0===f?void 0:f.foundationId)&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===f||void 0===f?void 0:f.parentId)&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).volumetricHeatCapacity)&&void 0!==m?m:f.volumetricHeatCapacity)&&void 0!==g?g:.5,A={name:"Set Volumetric Heat Capacity of Door",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(f.id,e),c(n+1)}}d((function(t){t.actionState.doorVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},ez=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Zu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Door),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.opacity&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&c.foundationId===f.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===f.parentId&&e!==u.opacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.opacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.opacity)&&void 0!==r?r:1),n.opacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var p=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===f.parentId&&!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 On the Same Wall",timestamp:Date.now(),oldValues:p,newValue:e,groupId:f.parentId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(f){var g,m,w=null!==(g=null!==(m=s(f.id).opacity)&&void 0!==m?m:f.opacity)&&void 0!==g?g:1,A={name:"Set Opacity of Door",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(f.id,e),c(n+1)}}d((function(t){t.actionState.doorOpacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("wallMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},tz=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),n=Xw(Sr),c=Xw(Zu),s=Xw(Ii),d=Xw(Ci),f=Xw(Zr),p=NP(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(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&!a.locked&&e!==a.frameColor)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Door&&n.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!n.locked&&e!==n.frameColor)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.parentId===(null===p||void 0===p?void 0:p.parentId)&&!u.locked&&e!==u.frameColor)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.frameColor))return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(Xw.getState().elements);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Door&&!u.locked)l.set(u.id,null!==(r=u.frameColor)&&void 0!==r?r:"#ffffff")}}catch(F){a.e(F)}finally{a.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(Xw.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&T.foundationId===p.foundationId&&!p.locked)m.set(T.id,null!==(x=T.frameColor)&&void 0!==x?x:"#ffffff")}}catch(F){w.e(F)}finally{w.f()}var P={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){A(P.oldValues)},redo:function(){P.groupId&&b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1)}break;case _.OnlyThisSide:if(p.parentId){var S,H=new Map,j=Object(h.a)(Xw.getState().elements);try{for(j.s();!(S=j.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.parentId===p.parentId&&!p.locked)H.set(R.id,null!==(z=R.frameColor)&&void 0!==z?z:"#ffffff")}}catch(F){j.e(F)}finally{j.f()}var D={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:p.parentId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(H,e),d(s+1)}break;default:if(p){var W,M=f(p.id),I=null!==(W=M?M.frameColor:p.frameColor)&&void 0!==W?W:"#ffffff",C={name:"Set Color of Selected Door",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)}}o((function(t){t.actionState.doorColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("doorMenu.FrameColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setDoorActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},lz=n.a.memo((function(){var e=NP(V.Door),t=Xw(Vi),l=Xw(Ci),a=Xw(Sr),o=Xw(si),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[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),H=S[0],j=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!1),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!1),O=Object(u.a)(k,2),Y=O[0],L=O[1];if(!e)return null;var N={lng:t},U="36px",E=function(e,t){o((function(l){var a,o=Object(h.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(h.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(h.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(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"door-copy"}),!e.locked&&Object(pf.jsx)(RP,{keyName:"door-cut"}),Object(pf.jsx)(DP,{keyName:"door-lock"}),!e.locked&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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",N)})},"door-filled"),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"10px"},children:Object(pf.jsx)(ab.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",N)})}),e?Object(pf.jsx)(MP.a,{title:me.t("doorMenu.DoorType",N),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(){E(l.changedElementId,l.oldValue)},redo:function(){E(l.changedElementId,l.newValue)}};a(l),E(e.id,t.target.value),o((function(e){e.actionState.doorType=t.target.value}))},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Gy.Default,children:me.t("doorMenu.Default",N)}),Object(pf.jsx)(rb.a,{style:Xj,value:Gy.Arched,children:me.t("doorMenu.Arched",N)})]})},"door-type"):null,A&&Object(pf.jsx)(Zj,{setDialogVisible:T}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),T(!0)},children:[me.t("word.Width",N)," ..."]},"door-width"),H&&Object(pf.jsx)(_j,{setDialogVisible:j}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),j(!0)},children:[me.t("word.Height",N)," ..."]},"door-height"),e.filled&&Object(pf.jsxs)(pf.Fragment,{children:[D&&Object(pf.jsx)(Qj,{setDialogVisible:W}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),W(!0)},children:[me.t("word.UValue",N)," ..."]},"door-u-value"),Y&&Object(pf.jsx)($j,{setDialogVisible:L}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),L(!0)},children:[me.t("word.VolumetricHeatCapacity",N)," ..."]},"door-heat-capacity"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),s(!0)},children:[me.t("word.Texture",N)," ..."]},"door-texture"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),y(!0)},children:[me.t("word.Color",N)," ..."]},"door-color"),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),x(!0)},children:[me.t("doorMenu.FrameColor",N)," ..."]},"door-frame-color"),(e.textureType===fe.Default||e.textureType===fe.NoTexture)&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),F(!0)},children:[me.t("wallMenu.Opacity",N)," ..."]},"door-opacity")]})]}),c&&Object(pf.jsx)(Kj,{setDialogVisible:s}),p&&Object(pf.jsx)(qj,{setDialogVisible:y}),w&&Object(pf.jsx)(tz,{setDialogVisible:x}),C&&Object(pf.jsx)(ez,{setDialogVisible:F})]})})),az=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(ki),r=Xw(Sr),n=Xw(Qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Window),p=UP(null!==(t=null===f||void 0===f||null===(l=f.shutter)||void 0===l?void 0:l.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){o((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){if(!i.locked){var r=i;r.shutter&&(r.shutter.color=t)}break}}}catch(n){o.e(n)}finally{o.f()}}))},v=function(e,t){var l,a=Object(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Window&&e!==a.shutter.color&&!a.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var o,r=Object(h.a)(i);try{for(r.s();!(o=r.n()).done;){var c=o.value;if(c.type===V.Window&&c.foundationId===f.foundationId&&e!==c.shutter.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===f.parentId&&e!==u.shutter.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.shutter.color))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(i);try{for(a.s();!(t=a.n()).done;){var u,p,y=t.value;if(y.type===V.Window&&!y.locked)l.set(y.id,null!==(u=null===(p=y.shutter)||void 0===p?void 0:p.color)&&void 0!==u?u:"#808080")}}catch(O){a.e(O)}finally{a.f()}var g={name:"Set Shutter Color for All Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(g.oldValues)},redo:function(){v(g.oldValues,g.newValue)}};r(g),v(l,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,A=Object(h.a)(i);try{for(A.s();!(m=A.n()).done;){var T,P,S=m.value;if(S.type===V.Window&&S.foundationId===f.foundationId&&!f.locked)w.set(S.id,null!==(T=null===(P=S.shutter)||void 0===P?void 0:P.color)&&void 0!==T?T:"#808080")}}catch(O){A.e(O)}finally{A.f()}var H={name:"Set Shutter Color for All Windows Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){b(H.oldValues)},redo:function(){H.groupId&&v(H.oldValues,H.newValue)}};r(H),v(w,e),s(c+1)}break;case _.OnlyThisSide:if(f.parentId){var j,z=new Map,R=Object(h.a)(i);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.Window&&D.parentId===f.parentId&&!D.locked){var W=D;W.shutter&&z.set(D.id,W.shutter.color)}}}catch(O){R.e(O)}finally{R.f()}var M={name:"Set Shutter Color for All Windows On the Same Wall",timestamp:Date.now(),oldValues:z,newValue:e,groupId:f.parentId,undo:function(){b(M.oldValues)},redo:function(){v(M.oldValues,M.newValue)}};r(M),v(z,e),s(c+1)}break;default:if(f){var I,C=d(f.id),F=null!==(I=C?C.tint:f.tint)&&void 0!==I?I:"#808080",k={name:"Set Shutter Color of Selected window",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(k.changedElementId,k.oldValue)},redo:function(){x(k.changedElementId,k.newValue)}};r(k),x(f.id,e),s(c+1)}}o((function(t){t.actionState.windowShutterColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("windowMenu.ShutterColor",w),onApply:function(){A(g)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},oz=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(Sr),n=Xw(Qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=Xw(si),p=NP(V.Window),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.shutter)||void 0===l?void 0:l.width)&&void 0!==t?t:.5),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){f((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){var r=i;r.shutter&&(r.shutter.width=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){var t,l=Object(h.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(h.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(p&&function(e){if(p){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Window&&e!==a.shutter.width&&!a.locked)return!0}}catch(f){l.e(f)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Window&&c.foundationId===p.foundationId&&e!==c.shutter.width&&!c.locked)return!0}}catch(f){r.e(f)}finally{r.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===p.parentId&&e!==u.shutter.width&&!u.locked)return!0}}catch(f){d.e(f)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.shutter.width))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Window&&!r.locked){var u=r;u.shutter&&(l.set(r.id,u.shutter.width),v(u.id,e))}}}catch(O){a.e(O)}finally{a.f()}var y={name:"Set Shutter Width for All Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){A(y.oldValues,y.newValue)}};i(y),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;if(x.type===V.Window&&x.foundationId===p.foundationId&&!x.locked){var T=x;T.shutter&&(m.set(x.id,T.shutter.width),v(T.id,e))}}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Shutter Width for All Windows Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){b(P.oldValues)},redo:function(){A(P.oldValues,P.newValue)}};i(P),s(c+1)}break;case _.OnlyThisSide:if(p.parentId){var S,H=new Map,j=Object(h.a)(o);try{for(j.s();!(S=j.n()).done;){var z=S.value;if(z.type===V.Window&&z.parentId===p.parentId&&!z.locked){var R=z;R.shutter&&(H.set(z.id,R.shutter.width),v(R.id,e))}}}catch(O){j.e(O)}finally{j.f()}var D={name:"Set Shutter Width for All Windows On the Same Wall",timestamp:Date.now(),oldValues:H,newValue:e,groupId:p.parentId,undo:function(){b(D.oldValues)},redo:function(){A(D.oldValues,D.newValue)}};i(D),s(c+1)}break;default:if(p){var W,M,I,C,F=null!==(W=null!==(M=null===(I=d(p.id).shutter)||void 0===I?void 0:I.width)&&void 0!==M?M:null===(C=p.shutter)||void 0===C?void 0:C.width)&&void 0!==W?W:.5,k={name:"Set Window Shutter Width",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(k.changedElementId,k.oldValue)},redo:function(){v(k.changedElementId,k.newValue)}};i(k),v(p.id,e),s(c+1)}}f((function(t){t.actionState.windowShutterWidth=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("windowMenu.ShutterWidth",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.a,{min:0,max:.5,style:{width:120},step:.01,precision:2,value:m,formatter:function(e){return Number(e).toFixed(2)},onChange:w}),Object(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 0.5]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",x)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",x)})]})})})]})})};!function(e){e.left="left",e.right="right",e.both="both"}(Vj||(Vj={}));var iz,rz=function(e){var t,l,a,o,i=e.windowId,n=Xw(si),c=Xw(Vi),s=Xw(Ci),d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[1],g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v={lng:c},b=Xw((function(e){var t,l=Object(h.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()}return null})),A=function(e,t){Xw.getState().set((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(r.id===i){var n=r;if(n.shutter)switch(t){case Vj.left:n.shutter.showLeft=e;break;case Vj.right:n.shutter.showRight=e;break;case Vj.both:n.shutter.showLeft=e,n.shutter.showRight=e}break}}}catch(c){o.e(c)}finally{o.f()}}))},T=function(e,t){var l,a,o,r,n=null===b||void 0===b||null===(l=b.shutter)||void 0===l?void 0:l.showLeft,c=null===b||void 0===b||null===(a=b.shutter)||void 0===a?void 0:a.showRight;t===Vj.left?n=e:(t===Vj.right||(n=e),c=e);var s=function(e,t){Xw.getState().set((function(l){var a,o=Object(h.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){var r=Object(u.a)(t,2),n=r[0],c=r[1],s=i;s.shutter&&(s.shutter.showLeft=n,s.shutter.showRight=c);break}}}catch(d){o.e(d)}finally{o.f()}}))},d={name:"".concat(t," shutter"),timestamp:Date.now(),selectedElementId:i,selectedElementType:V.Window,oldShow:[null===b||void 0===b||null===(o=b.shutter)||void 0===o?void 0:o.showLeft,null===b||void 0===b||null===(r=b.shutter)||void 0===r?void 0:r.showRight],newShow:[n,c],undo:function(){s(this.selectedElementId,this.oldShow)},redo:function(){s(this.selectedElementId,this.newShow)}};Xw.getState().addUndoable(d)};return Object(pf.jsx)(pf.Fragment,{children:(null===b||void 0===b?void 0:b.type)===V.Window&&Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Shutter",v),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&(null===b||void 0===b||null===(t=b.shutter)||void 0===t?void 0:t.showLeft),onChange:function(e){var t=e.target.checked;T(t,Vj.left),A(t,Vj.left),n((function(e){e.actionState.windowShutterLeft=t}))},children:me.t("windowMenu.LeftShutter",{lng:c})})},"left-shutter"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&(null===b||void 0===b||null===(l=b.shutter)||void 0===l?void 0:l.showRight),onChange:function(e){var t=e.target.checked;T(t,Vj.right),A(t,Vj.right),n((function(e){e.actionState.windowShutterRight=t}))},children:me.t("windowMenu.RightShutter",{lng:c})})},"right-shutter"),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:!!b&&((null===b||void 0===b||null===(a=b.shutter)||void 0===a?void 0:a.showLeft)&&(null===b||void 0===b||null===(o=b.shutter)||void 0===o?void 0:o.showRight)),onChange:function(e){var t=e.target.checked;T(t,Vj.both),A(t,Vj.both),n((function(e){e.actionState.windowShutterLeft=t,e.actionState.windowShutterRight=t}))},children:me.t("windowMenu.BothShutters",{lng:c})})},"both-shutters"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),p&&Object(pf.jsx)(az,{setDialogVisible:y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){s(0),y(!0)},children:[me.t("windowMenu.ShutterColor",v)," ..."]},"shutter-color"),w&&Object(pf.jsx)(oz,{setDialogVisible:x}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){s(0),x(!0)},children:[me.t("windowMenu.ShutterWidth",v)," ..."]},"shutter-width")]},"window-shutter")})},nz=function(e){var t,l=e.window,a=e.dataType,o=e.attributeKey,i=e.setDialogVisible,r=Xw(ki),n=Xw(si),c=Xw(Sr),s=Xw(Qu),d=Xw(Ii),f=Xw(Ci),p=UP(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(h.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(h.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(h.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(h.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){var t,l=Object(h.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()}},P=function(e){if(l&&function(e){switch(s){case _.AllObjectsOfThisType:var t,a=Object(h.a)(r);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Window&&e!==i[o]&&!i.locked)return!0}}catch(y){a.e(y)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var n,c=Object(h.a)(r);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&d.foundationId===l.foundationId&&e!==d[o]&&!d.locked)return!0}}catch(y){c.e(y)}finally{c.f()}break;case _.OnlyThisSide:var u,f=Object(h.a)(r);try{for(f.s();!(u=f.n()).done;){var p=u.value;if(p.type===V.Window&&p.parentId===l.parentId&&e!==p[o]&&!p.locked)return!0}}catch(y){f.e(y)}finally{f.f()}break;default:if(e!==l[o])return!0}return!1}(e)){switch(s){case _.AllObjectsOfThisType:var t,i=new Map,u=Object(h.a)(r);try{for(u.s();!(t=u.n()).done;){var p=t.value;p.type!==V.Window||p.locked||i.set(p.id,p[o])}}catch(I){u.e(I)}finally{u.f()}var y={name:"Set ".concat(a," for All Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){T(y.oldValues)},redo:function(){A(y.newValue)}};c(y),A(e),f(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(l.foundationId){var g,m=new Map,w=Object(h.a)(r);try{for(w.s();!(g=w.n()).done;){var P=g.value;P.type!==V.Window||P.foundationId!==l.foundationId||l.locked||m.set(P.id,P[o])}}catch(I){w.e(I)}finally{w.f()}var S={name:"Set ".concat(a," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:m,newValue:e,groupId:l.foundationId,undo:function(){T(S.oldValues)},redo:function(){b(S.groupId,S.newValue)}};c(S),b(l.foundationId,e),f(d+1)}break;case _.OnlyThisSide:if(l.parentId){var H,j=new Map,z=Object(h.a)(r);try{for(z.s();!(H=z.n()).done;){var R=H.value;R.type!==V.Window||R.parentId!==l.parentId||R.locked||j.set(R.id,R[o])}}catch(I){z.e(I)}finally{z.f()}var D={name:"Set ".concat(a," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:j,newValue:e,groupId:l.parentId,undo:function(){T(D.oldValues)},redo:function(){v(l.parentId,D.newValue)}};c(D),v(l.parentId,e),f(d+1)}break;default:if(l){var W=l[o],M={name:"Set ".concat(a," of Selected window"),timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:l.id,changedElementType:l.type,undo:function(){x(M.changedElementId,M.oldValue)},redo:function(){x(M.changedElementId,M.newValue)}};c(M),x(l.id,e),f(d+1)}}n((function(t){switch(a){case iz.Tint:t.actionState.windowTint=e;break;case iz.MullionColor:t.actionState.windowMullionColor=e;break;case iz.Color:t.actionState.windowColor=e}}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("windowMenu.".concat(a),w),onApply:function(){l[o]!==g&&P(g)},onClose:function(){i()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:null!==g&&void 0!==g?g:"#73D8FF",onChangeComplete:m})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},cz=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,f=Xw(ki),p=Xw(Sr),y=Xw(Qu),g=Xw(Ii),m=Xw(Ci),w=Xw(si),x=Xw($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(),H=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]},j=function(e,t){w((function(l){var o,i=Object(h.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||H(r,a,t);break}}}catch(n){i.e(n)}finally{i.f()}}))},z=function(e,t){e&&w((function(l){var o,i=Object(h.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||H(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){e&&w((function(l){var o,i=Object(h.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||H(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},D=function(e){w((function(t){var l,o=Object(h.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||H(i,a,e)}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e){var t,l=Object(h.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];j(o,i)}}catch(r){l.e(r)}finally{l.f()}},M=function(e){if(t&&function(e){switch(y){case _.AllObjectsOfThisType:var l,o=Object(h.a)(f);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&!i.locked){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(T){o.e(T)}finally{o.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(h.a)(f);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Window&&d.foundationId===t.foundationId&&!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(T){s.e(T)}finally{s.f()}break;case _.OnlyThisSide:var g,m=Object(h.a)(f);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.Window&&w.parentId===t.parentId&&!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(T){m.e(T)}finally{m.f()}break;default:var A=x(t);if(A&&t.parentType!==V.Roof){if("lx"===a){if(e!==t[a]*A.lx)return!0}else if("lz"===a){if(e!==t[a]*A.lz)return!0}else if(e!==t[a])return!0}else if(e!==t[a])return!0}return!1}(e)){switch(y){case _.AllObjectsOfThisType:var o,i=new Map,r=Object(h.a)(f);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Window&&!n.locked){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(G){r.e(G)}finally{r.f()}var u={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){W(u.oldValues)},redo:function(){D(u.newValue)}};p(u),D(e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var v,b=new Map,A=Object(h.a)(f);try{for(A.s();!(v=A.n()).done;){var T=v.value;if(T.type===V.Window&&T.foundationId===t.foundationId&&!T.locked){var P=T,S=x(P),H=P[a];S&&P.parentType!==V.Roof&&("lx"===a?H*=S.lx:"lz"===a&&(H*=S.lz)),b.set(T.id,H)}}}catch(G){A.e(G)}finally{A.f()}var M={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:b,newValue:e,groupId:t.foundationId,undo:function(){W(M.oldValues)},redo:function(){R(t.foundationId,M.newValue)}};p(M),R(t.foundationId,e),m(g+1)}break;case _.OnlyThisSide:if(t.parentId){var I,C=new Map,F=Object(h.a)(f);try{for(F.s();!(I=F.n()).done;){var k=I.value;if(k.type===V.Window&&k.parentId===t.parentId&&!k.locked){var O=k,Y=x(O),L=O[a];Y&&O.parentType!==V.Roof&&("lx"===a?L*=Y.lx:"lz"===a&&(L*=Y.lz)),C.set(k.id,L)}}}catch(G){F.e(G)}finally{F.f()}var N={name:"Set ".concat(l," for All Windows On the Same Parent"),timestamp:Date.now(),oldValues:C,newValue:e,groupId:t.parentId,undo:function(){W(N.oldValues)},redo:function(){z(t.parentId,N.newValue)}};p(N),z(t.parentId,e),m(g+1)}break;default:if(t){var U=t[a],E=x(t);E&&t.parentType!==V.Roof&&("lx"===a?U*=E.lx:"lz"===a&&(U*=E.lz));var J={name:"Set Window ".concat(l),timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){j(J.changedElementId,J.oldValue)},redo:function(){j(J.changedElementId,J.newValue)}};p(J),j(t.id,e),m(g+1)}}w((function(t){switch(l){case iz.Width:t.actionState.windowWidth=e;break;case iz.Height:t.actionState.windowHeight=e;break;case iz.Opacity:t.actionState.windowOpacity=e;break;case iz.FrameWidth:t.actionState.windowFrameWidth=e;break;case iz.SillWidth:t.actionState.windowSillWidth=e;break;case iz.MullionSpacing:t.actionState.windowMullionSpacing=e;break;case iz.MullionWidth:t.actionState.windowMullionWidth=e}}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("windowMenu.".concat(l),S),onApply:function(){M(T)},onClose:function(){d()},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.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(pf.jsx)("br",{}),Object(pf.jsx)("br",{})," ",c]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:n}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:y,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",S)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",S)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",S)})]})})})]})})},sz=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Window),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.uValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Window&&e!==o.uValue&&!o.locked)return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Window&&c.foundationId===f.foundationId&&e!==c.uValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.OnlyThisSide:var s,d=Object(h.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.parentId===f.parentId&&e!==u.uValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.uValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Window&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.uValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(Y){r.e(Y)}finally{r.f()}var g={name:"Set U-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Window&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.uValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(Y){x.e(Y)}finally{x.f()}var H={name:"Set U-Value for All Windows Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;case _.OnlyThisSide:if(f.parentId){var j,z=new Map,R=Object(h.a)(a);try{for(R.s();!(j=R.n()).done;){var D=j.value;if(D.type===V.Window&&D.parentId===f.parentId&&!D.locked){var W,M=D;z.set(D.id,null!==(W=M.uValue)&&void 0!==W?W:2),T(M.id,e)}}}catch(Y){R.e(Y)}finally{R.f()}var I={name:"Set U-Value for All Windows On the Same Wall",timestamp:Date.now(),oldValues:z,newValue:e,groupId:f.parentId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;default:if(f){var C,F,k=null!==(C=null!==(F=s(f.id).uValue)&&void 0!==F?F:f.uValue)&&void 0!==C?C:2,O={name:"Set Window U-Value",timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(O.changedElementId,O.oldValue)},redo:function(){T(O.changedElementId,O.newValue)}};o(O),T(f.id,e),c(n+1)}}d((function(t){t.actionState.windowUValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toUValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toUValueInUS(.01),max:Ww.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(Ww.toUValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toUValueInUS(.01).toFixed(3),", ",Ww.toUValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setWindowActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",A)}),Object(pf.jsx)(rb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",A)})]})})})]})})};!function(e){e.Color="Color",e.Tint="Tint",e.Opacity="Opacity",e.MullionWidth="MullionWidth",e.MullionSpacing="MullionSpacing",e.MullionColor="MullionColor",e.FrameWidth="FrameWidth",e.SillWidth="SillWidth",e.Width="Width",e.Height="Height"}(iz||(iz={}));var dz,uz,fz,hz,pz,yz,gz,mz,wz,xz,vz,bz,Az,Tz,Pz,Sz,Hz,jz,zz,Rz,Dz,Wz,Mz,Iz,Cz,Fz,kz,Oz,Yz,Lz,Nz,Uz={Tint:{attributeKey:"tint"},Color:{attributeKey:"color"},MullionColor:{attributeKey:"mullionColor"}},Ez={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},MullionWidth:{attributeKey:"mullionWidth",range:[0,.2],step:.1,unit:"word.MeterAbbreviation",digit:1},MullionSpacing:{attributeKey:"mullionSpacing",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}},Vz=n.a.memo((function(){var e=Xw(si),t=Xw(Vi),l=Xw(Sr),a=Xw(Ci),o=Xw($r),i=Object(r.useState)(null),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),f=Object(u.a)(d,2),p=f[0],y=f[1],g=NP(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(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Window&&i.id===t){i.mullion=l,e.selectedElement=i;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(t,l){e((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Window&&i.id===t){i.windowType=l,e.selectedElement=i;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(t,l){e((function(e){var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.frame=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(t,l){e((function(e){var a,o=Object(h.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()}}))},T=function(t,l){e((function(e){var a,o=Object(h.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()}}))},P=function(e){return Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),s(e)},children:[me.t("windowMenu.".concat(e),m)," ..."]},"window-".concat(e))};return Object(pf.jsxs)(tb.a.ItemGroup,{children:[Object(pf.jsx)(zP,{keyName:"window-copy"}),!g||g.locked?null:Object(pf.jsx)(RP,{keyName:"window-cut"}),Object(pf.jsx)(DP,{keyName:"window-lock"}),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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(){A(g.id,!o.checked)},redo:function(){A(g.id,o.checked)}};l(o),A(g.id,a),e((function(e){e.actionState.windowEmpty=a}))},children:me.t("windowMenu.Empty",m)})},"window-empty"),Object(pf.jsx)(tb.a.Item,{style:{paddingLeft:"10px"},children:Object(pf.jsx)(ab.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(){T(g.id,!o.checked)},redo:function(){T(g.id,o.checked)}};l(o),T(g.id,a),e((function(e){e.actionState.windowInterior=a}))},children:me.t("windowMenu.Interior",m)})}),P(iz.Width),P(iz.Height),P(iz.Opacity),P(iz.Tint),p&&Object(pf.jsx)(sz,{setDialogVisible:y}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),y(!0)},children:[me.t("word.UValue",m)," ..."]},"window-u-value"),function(){var e;return g?Object(pf.jsx)(MP.a,{title:me.t("windowMenu.WindowType",m),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.a.Group,{value:null!==(e=g.windowType)&&void 0!==e?e:Yt.Default,style:{height:"75px"},onChange:function(e){var t={name:"Select Window Type",timestamp:Date.now(),oldValue:g.windowType,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){v(t.changedElementId,t.oldValue)},redo:function(){v(t.changedElementId,t.newValue)}};l(t),v(g.id,e.target.value)},children:[Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Default,children:me.t("windowMenu.Default",m)}),Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Arched,children:me.t("windowMenu.Arched",m)}),Object(pf.jsx)(rb.a,{style:Xj,value:Yt.Polygonal,children:me.t("windowMenu.Polygonal",m)})]})},"window-type"):null}(),g?Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Mullion",m),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:g.mullion,onChange:function(t){var a=t.target.checked,o={name:"Mullion",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.windowMullion=a}))},children:me.t("windowMenu.Mullion",{lng:t})})},"mullion"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),P(iz.MullionWidth),P(iz.MullionSpacing),P(iz.MullionColor)]},"window-mullion"):null,g?Object(pf.jsxs)(MP.a,{title:me.t("windowMenu.Frame",m),style:{paddingLeft:"24px"},children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:g.frame,onChange:function(t){var a=t.target.checked,o={name:"Frame",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){b(g.id,!o.checked)},redo:function(){b(g.id,o.checked)}};l(o),b(g.id,a),e((function(e){e.actionState.windowFrame=a}))},children:me.t("windowMenu.Frame",{lng:t})})},"frame"),Object(pf.jsx)(Tj.a,{plain:!0,style:{margin:"6px"}}),P(iz.FrameWidth),P(iz.SillWidth),P(iz.Color)]},"window-frame"):null,Object(pf.jsx)(rz,{windowId:g.id}),function(){switch(c){case iz.Tint:case iz.MullionColor:case iz.Color:var e=Uz[c];return e?Object(pf.jsx)(nz,{window:g,dataType:c,attributeKey:e.attributeKey,setDialogVisible:function(){return s(null)}}):null;case iz.Opacity:case iz.Width:case iz.Height:case iz.MullionSpacing:case iz.MullionWidth:case iz.SillWidth:case iz.FrameWidth:var t,l=Ez[c];return c===iz.Width?l.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===iz.Height&&(l.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lz*Math.min(Math.abs(.5-g.cz),Math.abs(-.5-g.cz)):100),l?Object(pf.jsx)(cz,{windowModel:g,dataType:c,attributeKey:l.attributeKey,range:l.range,step:l.step,setDialogVisible:function(){return s(null)},unit:l.unit?me.t(l.unit,m):void 0,note:l.note?me.t(l.note,m):void 0,digit:null!==(t=l.digit)&&void 0!==t?t:0}):null}}()]})]})})),Jz=l.p+"static/media/roof_01_menu.1418beb1.png",Gz=l.p+"static/media/roof_02_menu.055d6e06.png",Xz=l.p+"static/media/roof_03_menu.1d45e089.png",Bz=l.p+"static/media/roof_04_menu.20dee2dd.png",Kz=l.p+"static/media/roof_05_menu.34757ec1.png",qz=l.p+"static/media/roof_06_menu.0fce42da.png",Qz=l.p+"static/media/roof_07_menu.d0b809f8.png",Zz=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(si),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.textureType)&&void 0!==t?t:he.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=yb.a.Option,v=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.textureType&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.textureType&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.textureType))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);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.textureType)&&void 0!==u?u:he.Default)}}catch(j){r.e(j)}finally{r.f()}var y={name:"Set Texture for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(a);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Roof||x.foundationId!==f.foundationId||x.locked||m.set(x.id,x.textureType)}}catch(j){w.e(j)}finally{w.f()}var T={name:"Set Texture for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){A(T.oldValues)},redo:function(){T.groupId&&b(T.oldValues,T.newValue)}};o(T),b(m,e),c(n+1)}break;default:if(f){var P=d(f.id),S=P?P.textureType:f.textureType,H={name:"Set Texture of Selected Roof",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){v(H.changedElementId,H.oldValue)},redo:function(){v(H.changedElementId,H.newValue)}};o(H),v(f.id,e),c(n+1)}}s((function(t){t.actionState.roofTexture=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:9,children:Object(pf.jsxs)(yb.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(pf.jsxs)(x,{value:he.NoTexture,children:[Object(pf.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(pf.jsxs)(x,{value:he.Default,children:[Object(pf.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(pf.jsxs)(x,{value:he.Texture01,children:[Object(pf.jsx)("img",{alt:he.Texture01,src:Jz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture01",w)]},he.Texture01),Object(pf.jsxs)(x,{value:he.Texture02,children:[Object(pf.jsx)("img",{alt:he.Texture02,src:Gz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture02",w)]},he.Texture02),Object(pf.jsxs)(x,{value:he.Texture03,children:[Object(pf.jsx)("img",{alt:he.Texture03,src:Xz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture03",w)]},he.Texture03),Object(pf.jsxs)(x,{value:he.Texture04,children:[Object(pf.jsx)("img",{alt:he.Texture04,src:Bz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture04",w)]},he.Texture04),Object(pf.jsxs)(x,{value:he.Texture05,children:[Object(pf.jsx)("img",{alt:he.Texture05,src:Kz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture05",w)]},he.Texture05),Object(pf.jsxs)(x,{value:he.Texture06,children:[Object(pf.jsx)("img",{alt:he.Texture06,src:qz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture06",w)]},he.Texture06),Object(pf.jsxs)(x,{value:he.Texture07,children:[Object(pf.jsx)("img",{alt:he.Texture07,src:Qz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture07",w)]},he.Texture07)]})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},_z=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.color&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.color&&!c.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.color))return!0}return!1}}(e)){switch(n){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.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(R){r.e(R)}finally{r.f()}var y={name:"Set Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Roof&&T.foundationId===f.foundationId&&!f.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){b(P.oldValues)},redo:function(){P.groupId&&v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1)}break;default:if(f){var S,H=d(f.id),j=null!==(S=H?H.color:f.color)&&void 0!==S?S:"#ffffff",z={name:"Set Color of Selected Roof",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(z.changedElementId,z.oldValue)},redo:function(){x(z.changedElementId,z.newValue)}};i(z),x(f.id,e),s(c+1)}}a((function(t){t.actionState.roofColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},$z=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.thickness&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.thickness&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.thickness))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked){var p=u;l.set(u.id,p.thickness),x(p.id,e)}}}catch(R){r.e(R)}finally{r.f()}var y={name:"Set Thickness for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var g,m=new Map,w=Object(h.a)(a);try{for(w.s();!(g=w.n()).done;){var A=g.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked){var T=A;m.set(A.id,T.thickness),x(T.id,e)}}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Thickness for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:f.foundationId,undo:function(){v(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),c(n+1)}break;default:if(f){var S,H,j=null!==(S=null!==(H=s(f.id).thickness)&&void 0!==H?H:f.thickness)&&void 0!==S?S:.4,z={name:"Set Roof Thickness",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(z.changedElementId,z.oldValue)},redo:function(){x(z.changedElementId,z.newValue)}};o(z),x(f.id,e),c(n+1)}}d((function(t){t.actionState.roofThickness=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.Thickness",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.05, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},eR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterSpacing&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterSpacing&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterSpacing))return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(d=u.rafterSpacing)&&void 0!==d?d:1),x(u.id,e)}}catch(z){r.e(z)}finally{r.f()}var p={name:"Set Rafter Spacing for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked)g.set(A.id,null!==(w=A.rafterSpacing)&&void 0!==w?w:1),x(A.id,e)}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Spacing for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1)}break;default:if(f){var P,S,H=null!==(P=null!==(S=s(f.id).rafterSpacing)&&void 0!==S?S:f.rafterSpacing)&&void 0!==P?P:1,j={name:"Set Roof Rafter Spacing",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};o(j),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.RafterSpacing",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.1, 100] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},tR=function(e){var t=e.setDialogVisible,l=Xw(ki),a=Xw(Sr),o=Xw(qu),i=Xw(Ii),n=Xw(Ci),c=Xw(Zr),s=Xw(si),d=NP(V.Roof),f=Object(r.useState)(void 0!==(null===d||void 0===d?void 0:d.opacity)?d.opacity:.5),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){s((function(l){var a,o=Object(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,a=Object(h.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Roof&&e!==i.opacity&&!i.locked)return!0}}catch(s){a.e(s)}finally{a.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===d.foundationId&&e!==c.opacity&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.opacity))return!0}return!1}}(e)){switch(o){case _.AllObjectsOfThisType:var t,r=new Map,u=Object(h.a)(l);try{for(u.s();!(t=u.n()).done;){var f=t.value;if(f.type===V.Roof&&!f.locked){var p=f;r.set(f.id,p.opacity),w(p.id,e)}}}catch(z){u.e(z)}finally{u.f()}var y={name:"Set Opacity for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var g,m=new Map,b=Object(h.a)(l);try{for(b.s();!(g=b.n()).done;){var A=g.value;if(A.type===V.Roof&&A.foundationId===d.foundationId&&!A.locked){var T=A;m.set(A.id,T.opacity),w(T.id,e)}}}catch(z){b.e(z)}finally{b.f()}var P={name:"Set Opacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:d.foundationId,undo:function(){x(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};a(P),n(i+1)}break;default:if(d){var S=c(d.id),H=void 0!==S.opacity?S.opacity:void 0!==d.opacity?d.opacity:.5,j={name:"Set Roof Opacity",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(j.changedElementId,j.oldValue)},redo:function(){w(j.changedElementId,j.newValue)}};a(j),w(d.id,e),n(i+1)}}s((function(t){t.actionState.roofGlassOpacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.Opacity",m),onApply:function(){b(y)},onClose:function(){t(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 1]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:o,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},lR=function(e){var t,l,a=e.setDialogVisible,o=Xw(si),i=Xw(Vi),n=Xw(ln),c=Xw(Sr),s=Xw(qu),d=Xw(_u),f=Xw(Ii),p=Xw(Ci),y=Xw(Fi),g=Xw(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}),H=Object(u.a)(S,2),j=H[0],z=H[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 W={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 M=function(e,t){o((function(l){var a,o=Object(h.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(h.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;M(o,t)}}catch(i){a.e(i)}finally{a.f()}},C=function(e){var t,l=Object(h.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];M(o,i)}}catch(r){l.e(r)}finally{l.f()}},F=function(e){if(n)switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(Xw.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(f+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(n.foundationId){var d,u=new Map,y=Object(h.a)(Xw.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(f+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(){M(T.changedElementId,T.oldValue)},redo:function(){M(T.changedElementId,T.newValue)}};c(T),M(n.id,e),p(f+1)}}},k=function(){(null===n||void 0===n?void 0:n.glassTint)&&v(n.glassTint),a(!1)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:640,visible:!0,title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t("roofMenu.GlassTint",W)}),footer:[Object(pf.jsx)(Sv.a,{onClick:function(){F(x)},children:me.t("word.Apply",W)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){k(),y()},children:me.t("word.Cancel",W)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",ref:D,onClick:function(){var e=g(n.id);e&&e.glassTint!==x&&F(x),a(!1),p(0)},children:me.t("word.OK",W)},"OK")],onCancel:k,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!T,bounds:j,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(pf.jsx)("div",{ref:R,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return d(e.target.value)},value:s,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",W)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",W)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",W)})]})})})]})})})},aR=function(e){var t,l=e.setDialogVisible,a=Xw(si),o=Xw(ki),i=Xw(Sr),n=Xw(qu),c=Xw(Ii),s=Xw(Ci),d=Xw(Zr),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(n){case _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.rafterColor&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterColor&&!c.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterColor))return!0}return!1}}(e))switch(n){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(r=u.rafterColor)&&void 0!==r?r:"#ffffff")}}catch(z){a.e(z)}finally{a.f()}var p={name:"Set Rafter Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(o);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!f.locked)g.set(A.id,null!==(w=A.rafterColor)&&void 0!==w?w:"#ffffff")}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){b(T.oldValues)},redo:function(){T.groupId&&v(T.oldValues,T.newValue)}};i(T),v(g,e),s(c+1)}break;default:if(f){var P,S=d(f.id),H=null!==(P=S?S.rafterColor:f.rafterColor)&&void 0!==P?P:"#ffffff",j={name:"Set Rafter Color of Selected Roof",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};i(j),x(f.id,e),s(c+1)}}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},oR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterWidth&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rafterWidth&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rafterWidth))return!0}return!1}}(e))switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(d=u.rafterWidth)&&void 0!==d?d:.1),x(u.id,e)}}catch(z){r.e(z)}finally{r.f()}var p={name:"Set Rafter Width for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var y,g=new Map,m=Object(h.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&A.foundationId===f.foundationId&&!A.locked)g.set(A.id,null!==(w=A.rafterWidth)&&void 0!==w?w:.1),x(A.id,e)}}catch(z){m.e(z)}finally{m.f()}var T={name:"Set Rafter Width for All Roofs Above Foundation",timestamp:Date.now(),oldValues:g,newValue:e,groupId:f.foundationId,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1)}break;default:if(f){var P,S,H=null!==(P=null!==(S=s(f.id).rafterWidth)&&void 0!==S?S:f.rafterWidth)&&void 0!==P?P:.1,j={name:"Set Roof Rafter Width",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(j.changedElementId,j.oldValue)},redo:function(){x(j.changedElementId,j.newValue)}};o(j),x(f.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.RafterWidth",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.01, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},iR=function(e){var t,l,a=e.setDialogVisible,o=Xw(ki),i=Xw(si),n=Xw(Sr),c=Xw(qu),s=Xw(Ii),d=Xw(Ci),f=Xw(Zr),p=NP(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(h.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(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.sideColor&&!a.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var i,r=Object(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Roof&&n.foundationId===p.foundationId&&e!==n.sideColor&&!n.locked)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.sideColor))return!0}return!1}}(e)){switch(c){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(h.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked)l.set(u.id,null!==(r=u.sideColor)&&void 0!==r?r:"#ffffff")}}catch(R){a.e(R)}finally{a.f()}var y={name:"Set Side Color for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var g,m=new Map,w=Object(h.a)(o);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&T.foundationId===p.foundationId&&!p.locked)m.set(T.id,null!==(x=T.sideColor)&&void 0!==x?x:"#ffffff")}}catch(R){w.e(R)}finally{w.f()}var P={name:"Set Side Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.foundationId,undo:function(){A(P.oldValues)},redo:function(){P.groupId&&b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1)}break;default:if(p){var S,H=f(p.id),j=null!==(S=H?H.sideColor:p.sideColor)&&void 0!==S?S:"#ffffff",z={name:"Set Side Color of Selected Roof",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(z.changedElementId,z.oldValue)},redo:function(){v(z.changedElementId,z.newValue)}};n(z),v(p.id,e),d(s+1)}}i((function(t){t.actionState.roofSideColor=e}))}};return Object(pf.jsx)(EP,{width:640,title:me.t("roofMenu.RoofSideColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:11,children:Object(pf.jsx)(VP.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(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:c,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",x)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",x)})]})})})]})})},rR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Ww.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(h.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(h.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(h.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()}},H=function(e){if(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rValue&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.rValue&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.rValue))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(W){r.e(W)}finally{r.f()}var g={name:"Set R-Value for All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var m,w=new Map,x=Object(h.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Roof&&v.foundationId===f.foundationId&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(W){x.e(W)}finally{x.f()}var H={name:"Set R-Value for All Roofs Above Foundation",timestamp:Date.now(),oldValues:w,newValue:e,groupId:f.foundationId,undo:function(){P(H.oldValues)},redo:function(){S(H.oldValues,H.newValue)}};o(H),c(n+1)}break;default:if(f){var j,z,R=null!==(j=null!==(z=s(f.id).rValue)&&void 0!==z?z:f.rValue)&&void 0!==j?j:2,D={name:"Set Roof R-Value",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){T(D.changedElementId,D.oldValue)},redo:function(){T(D.changedElementId,D.newValue)}};o(D),T(f.id,e),c(n+1)}}d((function(t){t.actionState.roofRValue=e}))}};return Object(pf.jsx)(EP,{width:550,title:"".concat(me.t("roofMenu.RoofRValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){H(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))}}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",A)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",A)})]})})})]})})},nR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(qu),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=NP(V.Roof),f=Object(r.useState)(null!==(t=null===d||void 0===d?void 0:d.rise)&&void 0!==t?t:0),p=Object(u.a)(f,2),y=p[0],g=p[1],m=$f(),w=function(e,t){Xw.getState().updateRoofRiseById(e,t),Xw.getState().set((function(e){e.updateElementOnRoofFlag=!0}))},x=function(e){var t,l=Object(h.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(h.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 _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rise&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===d.foundationId&&e!==c.rise&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.rise))return!0}return!1}}(e))switch(console.log("get",Xw.getState().roofActionScope),Xw.getState().roofActionScope){case _.AllObjectsOfThisType:var t,l=new Map,r=Object(h.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(j){r.e(j)}finally{r.f()}var f={name:"Set Rise for All Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(f.oldValues)},redo:function(){v(f.oldValues,f.newValue)}};o(f),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var p,y=new Map,g=Object(h.a)(a);try{for(g.s();!(p=g.n()).done;){var m=p.value;m.type!==V.Roof||m.foundationId!==d.foundationId||m.locked||(y.set(m.id,m.rise),w(m.id,e))}}catch(j){g.e(j)}finally{g.f()}var b={name:"Set Rise for All Roofs Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:d.foundationId,undo:function(){x(b.oldValues)},redo:function(){v(b.oldValues,b.newValue)}};o(b),c(n+1)}break;default:if(d){var A,T,P=s(d.id),S=null!==(A=null!==(T=null===P||void 0===P?void 0:P.rise)&&void 0!==T?T:null===d||void 0===d?void 0:d.rise)&&void 0!==A?A:0,H={name:"Set Roof Rise",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(H.changedElementId,H.oldValue)},redo:function(){w(H.changedElementId,H.newValue)}};o(H),w(d.id,e),c(n+1)}}};return Object(pf.jsx)(EP,{width:550,title:me.t("roofMenu.Rise",m),onApply:function(){b(y)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:6,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 200] ",me.t("word.MeterAbbreviation",m)]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",m)}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},cR=function(e){var t,l=e.setDialogVisible,a=Xw(ki),o=Xw(Sr),i=Xw(Ku),n=Xw(Ii),c=Xw(Ci),s=Xw(Zr),d=Xw(si),f=NP(V.Roof),p=Object(r.useState)(null!==(t=null===f||void 0===f?void 0:f.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(h.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(h.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(h.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(f&&function(e){if(f){switch(i){case _.AllObjectsOfThisType:var t,l=Object(h.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.volumetricHeatCapacity&&!o.locked)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(h.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&c.foundationId===f.foundationId&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(s){n.e(s)}finally{n.f()}break;default:if(e!==(null===f||void 0===f?void 0:f.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(h.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.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 All 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 _.AllObjectsOfThisTypeAboveFoundation:if(f.foundationId){var r=new Map;d((function(t){var l,a=Object(h.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&o.foundationId===f.foundationId&&!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 Above Foundation",timestamp:Date.now(),oldValues:r,newValue:e,groupId:f.foundationId,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1)}break;default:if(f){var p,y,g=null!==(p=null!==(y=s(f.id).volumetricHeatCapacity)&&void 0!==y?y:f.volumetricHeatCapacity)&&void 0!==p?p:.5,m={name:"Set Volumetric Heat Capacity of Roof",timestamp:Date.now(),oldValue:g,newValue:e,changedElementId:f.id,changedElementType:f.type,undo:function(){x(m.changedElementId,m.oldValue)},redo:function(){x(m.changedElementId,m.newValue)}};o(m),x(f.id,e),c(n+1)}}d((function(t){t.actionState.roofVolumetricHeatCapacity=e}))}};return Object(pf.jsx)(EP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(pf.jsx)("br",{}),Object(pf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return Xw.getState().setRoofActionScope(e.target.value)},value:i,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},sR=function(e){var t,l=e.setDialogVisible,a=Xw(Vi),o=Xw(ln),i=Xw(Sr),n=Xw(qu),c=Xw(_u),s=Xw(Ii),d=Xw(Ci),f=Xw(Fi),p=Xw(Zr),y=Xw(si),g=Xw((function(e){if(o){var t,l=Object(h.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)(Ww.toRValueInUS(x)),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),W=D[0],M=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 F=function(e,t){y((function(l){var a,o=Object(h.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()}}))},k=function(e){var t,l=Object(h.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()}},O=function(e,t){var l,a=Object(h.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()}},Y=function(e){if(g){switch(n){case _.AllObjectsOfThisType:var t=new Map;y((function(l){var a,o=Object(h.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(){k(l.oldValues)},redo:function(){O(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(h.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(){k(o.oldValues)},redo:function(){O(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,f={name:"Set Ceiling R-Value",timestamp:Date.now(),oldValue:u,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){F(f.changedElementId,f.oldValue)},redo:function(){F(f.changedElementId,f.newValue)}};i(f),F(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)},N=function(){Y(x),l(!1),d(0)};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{width:550,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){Y(x)},children:me.t("word.Apply",C)},"Apply"),Object(pf.jsx)(Sv.a,{onClick:function(){L(),f()},children:me.t("word.Cancel",C)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:N,children:me.t("word.OK",C)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!j,bounds:W,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();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(pf.jsx)("div",{ref:I,children:e})})},children:Object(pf.jsxs)(XT.a,{gutter:6,children:[Object(pf.jsxs)(BT.a,{className:"gutter-row",span:7,children:[Object(pf.jsx)(ob.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(Ww.toRValueInUS(e))},onPressEnter:N}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [0.01, 100]",Object(pf.jsx)("br",{}),me.t("word.SIUnit",C),": m\xb2\xb7\u2103/W"]}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{min:Ww.toRValueInUS(.01),max:Ww.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(Ww.toRValueInSI(e))},onPressEnter:N}),Object(pf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [",Ww.toRValueInUS(.01).toFixed(3),", ",Ww.toRValueInUS(100).toFixed(1),"]",Object(pf.jsx)("br",{}),me.t("word.USUnit",C),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(pf.jsx)(BT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(pf.jsx)(rb.a.Group,{onChange:function(e){return c(e.target.value)},value:n,children:Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(rb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisCeiling",C)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllCeilingsAboveFoundation",C)}),Object(pf.jsx)(rb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllCeilings",C)})]})})})]})})})},dR=n.a.memo((function(){var e,t=Xw(si),l=Xw(Vi),a=Xw(lf),o=Xw(fs),i=Xw($c),n=Xw(hn),c=Xw(fn),s=Xw(Xc),d=Xw(Gc),p=Xw(Ci),y=Xw(Sr),g=NP(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),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useState)(!1),Y=Object(u.a)(O,2),L=Y[0],N=Y[1],U=Object(r.useState)(!1),E=Object(u.a)(U,2),J=E[0],G=E[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(pf.jsxs)(tb.a.Item,{onClick:function(){lb.a.confirm({title:a(o,l),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){!function(e){if(g){var l=Xw.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(f.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsx)(tb.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(h.a)(Xw.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(h.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(pf.jsxs)(tb.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(h.a)(Xw.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(h.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){Xw.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(pf.jsxs)(tb.a.ItemGroup,{children:[function(){var e=Xw.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(pf.jsx)(jP,{keyName:"roof-paste"}),Object(pf.jsx)(DP,{keyName:"roof-lock"}),g.rise>0&&Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.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 Ow;if(e.gotSome()&&Xw.getState().contextMenuObjectType){var t=g?o(g.id,!1):new Ow;return Object(pf.jsxs)(MP.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(pf.jsx)(MP.a,{title:me.t("roofMenu.RoofStructure",we),style:{paddingLeft:"24px"},children:Object(pf.jsxs)(rb.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(pf.jsx)(rb.a,{style:ve,value:Ct.Default,children:me.t("roofMenu.DefaultStructure",we)}),Object(pf.jsx)(rb.a,{style:ve,value:Ct.Rafter,children:me.t("roofMenu.RafterStructure",we)}),Object(pf.jsx)(rb.a,{style:ve,value:Ct.Glass,children:me.t("roofMenu.GlassStructure",we)})]})},"roof-structure"),!g.locked&&Object(pf.jsxs)(pf.Fragment,{children:[(g.roofStructure===Ct.Rafter||g.roofStructure===Ct.Glass)&&Object(pf.jsxs)(pf.Fragment,{children:[le&&Object(pf.jsx)(tR,{setDialogVisible:ae}),Object(pf.jsxs)(tb.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(pf.jsxs)(pf.Fragment,{children:[j&&Object(pf.jsx)(aR,{setDialogVisible:z}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),z(!0)},children:[me.t("roofMenu.RafterColor",we)," ..."]},"roof-rafter-color"),x&&Object(pf.jsx)(eR,{setDialogVisible:v}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),v(!0)},children:[me.t("roofMenu.RafterSpacing",we)," ..."]},"roof-rafter-spacing"),T&&Object(pf.jsx)(oR,{setDialogVisible:P}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),P(!0)},children:[me.t("roofMenu.RafterWidth",we)," ..."]},"roof-rafter-width")]}),F&&Object(pf.jsx)($z,{setDialogVisible:k}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),k(!0)},children:[me.t(g.roofStructure===Ct.Rafter?"roofMenu.RafterThickness":"word.Thickness",we)," ","..."]},"roof-thickness"),g.roofStructure===Ct.Glass&&g.roofType===It.Gable&&Object(pf.jsxs)(pf.Fragment,{children:[_&&Object(pf.jsx)(lR,{setDialogVisible:$}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),$(!0)},children:[me.t("roofMenu.GlassTint",we)," ..."]},"roof-glass-tint-selection")]}),W&&Object(pf.jsx)(nR,{setDialogVisible:M}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),M(!0)},children:[me.t("roofMenu.Rise",we)," ..."]},"roof-rise"),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(pf.jsxs)(pf.Fragment,{children:[re&&Object(pf.jsx)(rR,{setDialogVisible:ne}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ne(!0)},children:[me.t("roofMenu.RoofRValue",we)," ..."]},"roof-r-value"),g.ceiling&&de&&Object(pf.jsx)(sR,{setDialogVisible:ue}),g.ceiling&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ue(!0)},children:[me.t("roofMenu.CeilingRValue",we)," ..."]},"ceiling-r-value"),ye&&Object(pf.jsx)(cR,{setDialogVisible:ge}),Object(pf.jsxs)(tb.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(pf.jsxs)(pf.Fragment,{children:[L&&Object(pf.jsx)(Zz,{setDialogVisible:N}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),N(!0)},children:[me.t("word.Texture",we)," ..."]},"roof-texture")]}),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(pf.jsxs)(pf.Fragment,{children:[J&&Object(pf.jsx)(_z,{setDialogVisible:G}),(g.textureType===he.NoTexture||g.textureType===he.Default)&&Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),G(!0)},children:[me.t("roofMenu.RoofColor",we)," ..."]},"roof-color"),K&&Object(pf.jsx)(iR,{setDialogVisible:q}),Object(pf.jsxs)(tb.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),q(!0)},children:[me.t("roofMenu.RoofSideColor",we)," ..."]},"roof-side-color")]})]})]})})),uR=function(e){var t=e.children,l=Xw(vs);return Object(pf.jsx)(nb.a,{trigger:["contextMenu"],overlay:function(){switch(l){case V.Ground:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(YS,{})});case V.Sky:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(wH,{})});case V.Foundation:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(jS,{})});case V.Cuboid:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(OS,{})});case V.Polygon:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(pH,{})});case V.PolygonVertex:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(yH,{})});case V.SolarPanel:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(FH,{})});case V.ParabolicTrough:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(GH,{})});case V.ParabolicDish:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(tj,{})});case V.FresnelReflector:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(dj,{})});case V.Heliostat:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(xj,{})});case V.Sensor:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(gH,{})});case V.Light:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(mH,{})});case V.Human:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(ES,{})});case V.Tree:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Aj,{})});case V.Flower:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(GS,{})});case V.Wall:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Bj,{})});case V.Window:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(Vz,{})});case V.Roof:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(dR,{})});case V.Door:return Object(pf.jsx)(tb.a,{triggerSubMenuAction:"click",children:Object(pf.jsx)(lz,{})});default:return Object(pf.jsx)(pf.Fragment,{})}}(),children:t},"canvas-context-menu")},fR=n.a.memo(uR),hR=l(49),pR=(l(725),l(829)),yR=l(832),gR=l(845),mR=l(846),wR="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",xR="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=",vR="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==",bR=pR.a.Column,AR=Tv.a.div(dz||(dz=Object(Av.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: 99;\n"]))),TR=Tv.a.div(uz||(uz=Object(Av.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"]))),PR=Tv.a.div(fz||(fz=Object(Av.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=e.cloudFileArray,l=e.openCloudFile,a=e.deleteCloudFile,o=e.renameCloudFile,i=Xw(Vi),c=n.a.useRef(null),s=Object(r.useRef)(null),d=s.current?s.current.clientWidth+40:680,p=s.current?s.current.clientHeight+100:600,y=Object(r.useState)({x:0,y:0}),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],H=P[1],j=Object(r.useState)({left:0,top:0,bottom:0,right:0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useState)(),N=Object(u.a)(L,2),U=N[0],E=N[1],V=Object(r.useRef)(null),J=Object(r.useRef)(Object(f.a)(t)),G=Object(r.useState)(!1),X=Object(u.a)(G,2),B=X[0],K=X[1],q=GT.a.Search,Q={lng:i};Object(r.useEffect)((function(){var e=function(){w({x:Math.max(0,d-window.innerWidth),y:Math.min(0,window.innerHeight-p)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(J.current=Object(f.a)(t),K(!B))}),[t]);var Z=function(){bf.setState((function(e){e.showCloudFilePanel=!1}))},_=function(){U&&I&&O&&(o(U,I,O),Y(void 0)),A(!1)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(lb.a,{title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return H(!0)},onMouseOut:function(){return H(!1)},children:me.t("word.Rename",Q)}),visible:b,onOk:_,onCancel:function(){A(!1),Y(void 0)},modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!S,bounds:R,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();D({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(pf.jsx)("div",{ref:V,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",style:{width:"100%"},children:[Object(pf.jsx)(GT.a,{placeholder:"Title",value:O||I,onPressEnter:_,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){Y(e.target.value)}}),Object(pf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",Q)+": "+me.t("cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks",Q),"."]})]})}),Object(pf.jsx)(qT.a,{nodeRef:c,handle:".handle",bounds:"parent",axis:"both",position:m,onDrag:function(e,t){w({x:Math.max(t.x,d-window.innerWidth),y:Math.min(t.y,window.innerHeight-p)})},onStop:function(e,t){},children:Object(pf.jsx)(AR,{ref:c,children:Object(pf.jsxs)(TR,{ref:s,children:[Object(pf.jsxs)(PR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("cloudFilePanel.MyCloudFiles",Q)+" ("+J.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){Z()},onTouchStart:function(){Z()},children:me.t("word.Close",Q)})]}),Object(pf.jsx)("span",{style:{direction:"ltr"},children:Object(pf.jsx)(q,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("cloudFilePanel.SearchByTitle",Q),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){J.current=[];var l,a=Object(h.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()))&&J.current.push(i)}}catch(r){a.e(r)}finally{a.f()}K(!B)}}})}),Object(pf.jsxs)(pR.a,{size:"small",style:{width:"100%",direction:"ltr"},dataSource:J.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(pf.jsx)(bR,{title:me.t("word.Title",Q),dataIndex:"title",width:"58%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",cursor:"pointer"},title:me.t("word.Open",Q),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(pf.jsx)(bR,{title:me.t("word.Time",Q),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(pf.jsx)(yR.a.Text,{style:{fontSize:"12px"},children:e})}},"time"),Object(pf.jsx)(bR,{width:"17%",title:me.t("word.Action",Q),render:function(e,t){return Object(pf.jsxs)(Pv.b,{size:"middle",children:[Object(pf.jsx)("img",{title:me.t("word.Delete",Q),alt:"Delete",src:xR,onClick:function(){!function(e,t){lb.a.confirm({title:me.t("cloudFilePanel.DoYouReallyWantToDelete",Q)+' "'+t+'"?',content:Object(pf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",Q)+": "+me.t("message.ThisCannotBeUndone",Q)]}),icon:Object(pf.jsx)(mR.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(pf.jsx)("img",{title:me.t("word.Rename",Q),alt:"Rename",src:wR,onClick:function(){C(t.title),E(t.userid),A(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("cloudFilePanel.GenerateLink",Q),alt:"Link",src:vR,onClick:function(){var e=Ge+"?client=web&userid="+t.userid+"&title="+encodeURIComponent(t.title);Zh(e),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",Q)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},HR=n.a.memo(SR),jR=pR.a.Column,zR=Tv.a.div(hz||(hz=Object(Av.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"]))),RR=Tv.a.div(pz||(pz=Object(Av.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"]))),DR=Tv.a.div(yz||(yz=Object(Av.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.likesArray,l=e.openCloudFile,a=Xw(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(){bf.setState((function(e){e.showLikesPanel=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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(pf.jsx)(zR,{ref:o,children:Object(pf.jsxs)(RR,{ref:i,children:[Object(pf.jsxs)(DR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("cloudFilePanel.MyLikes",y)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){g()},onTouchStart:function(){g()},children:me.t("word.Close",y)})]}),Object(pf.jsx)(pR.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(pf.jsx)(jR,{title:me.t("word.Title",y),render:function(e,t){return Object(pf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){var e=t,a=e.lastIndexOf(", ");a>=0&&(bf.setState((function(e){e.openModelsMap=!1})),l(e.substring(a+2),e.substring(0,a)))},children:t.substring(0,t.lastIndexOf(", "))},t)}},"title")})]})})})})},MR=n.a.memo(WR),IR=pR.a.Column,CR=Tv.a.div(gz||(gz=Object(Av.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"]))),FR=Tv.a.div(mz||(mz=Object(Av.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"]))),kR=Tv.a.div(wz||(wz=Object(Av.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"]))),OR=function(e){var t=e.publishedModels,l=e.openCloudFile,a=Xw(Vi),o=Xw(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(){bf.setState((function(e){e.showPublishedModelsPanel=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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(pf.jsx)(CR,{ref:i,children:Object(pf.jsxs)(FR,{ref:c,children:[Object(pf.jsxs)(kR,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("modelsMap.MyPublishedModels",g)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){m()},onTouchStart:function(){m()},children:me.t("word.Close",g)})]}),Object(pf.jsx)(pR.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(pf.jsx)(IR,{title:me.t("word.Title",g),render:function(e,t){return Object(pf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){o.uid&&(bf.setState((function(e){e.openModelsMap=!1})),l(o.uid,t))},children:t},t)}},"title")})]})})})})},YR=n.a.memo(OR),LR=(lb.a.confirm,yb.a.Option),NR=Tv.a.div(xz||(xz=Object(Av.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"]))),UR=Tv.a.div(vz||(vz=Object(Av.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"]))),ER=Tv.a.div(bz||(bz=Object(Av.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,l,a,o,i,c,s,d,f,h=e.openCloudFile,p=Xw(si),y=bf(hf),g=Xw(Vi),m=Xw(di),w=bf(ui),x=bf(Rs),v=bf(Ds),b=n.a.useRef(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null!==(t=m.schoolID)&&void 0!==t?t:H.UNKNOWN),P=Object(r.useRef)(null!==(l=m.classID)&&void 0!==l?l:j.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),W=D[0],M=D[1],I={lng:g};Object(r.useEffect)((function(){var e=function(){M({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(){bf.setState((function(e){e.showAccountSettingsPanel=!1}))},F=m&&m.email&&m.email.endsWith("intofuture.org");return Object(pf.jsxs)(pf.Fragment,{children:[x&&Object(pf.jsx)(MR,{likesArray:null!==(a=m.likes)&&void 0!==a?a:[],openCloudFile:h}),v&&Object(pf.jsx)(YR,{publishedModels:null!==(o=m.published)&&void 0!==o?o:[],openCloudFile:h}),Object(pf.jsx)(qT.a,{nodeRef:b,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){},children:Object(pf.jsx)(NR,{ref:b,children:Object(pf.jsxs)(UR,{ref:A,children:[Object(pf.jsxs)(ER,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("accountSettingsPanel.MyAccountSettings",I)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){C()},onTouchStart:function(){C()},children:me.t("word.Close",I)})]}),Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,onClick:function(){m.uid&&(Zh(m.uid),Bh(me.t("accountSettingsPanel.IDInClipBoard",I)))},children:Object(pf.jsx)(Sv.a,{title:me.t("accountSettingsPanel.ClickToCopyMyID",I),style:{cursor:"copy",borderRadius:"8px"},children:me.t("accountSettingsPanel.MyID",I)})}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:m.uid})]}),!1,Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.SchoolID",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.jsxs)(yb.a,{style:{width:"90%"},value:T.current,onChange:function(e){T.current=e,p((function(t){t.user.schoolID=e}))},children:[Object(pf.jsx)(LR,{value:H.UNKNOWN,children:H.UNKNOWN},H.UNKNOWN),Object(pf.jsx)(LR,{value:H.SCHOOL1,children:H.SCHOOL1},H.SCHOOL1),Object(pf.jsx)(LR,{value:H.SCHOOL2,children:H.SCHOOL2},H.SCHOOL2),Object(pf.jsx)(LR,{value:H.SCHOOL3,children:H.SCHOOL3},H.SCHOOL3),Object(pf.jsx)(LR,{value:H.SCHOOL4,children:H.SCHOOL4},H.SCHOOL4),Object(pf.jsx)(LR,{value:H.SCHOOL5,children:H.SCHOOL5},H.SCHOOL5)]})})]}),Object(pf.jsxs)(XT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.ClassID",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.jsxs)(yb.a,{style:{width:"90%"},value:P.current,onChange:function(e){P.current=e,p((function(t){t.user.classID=e}))},children:[Object(pf.jsx)(LR,{value:j.UNKNOWN,children:j.UNKNOWN},j.UNKNOWN),Object(pf.jsx)(LR,{value:j.CLASS1,children:j.CLASS1},j.CLASS1),Object(pf.jsx)(LR,{value:j.CLASS2,children:j.CLASS2},j.CLASS2),Object(pf.jsx)(LR,{value:j.CLASS3,children:j.CLASS3},j.CLASS3),Object(pf.jsx)(LR,{value:j.CLASS4,children:j.CLASS4},j.CLASS4),Object(pf.jsx)(LR,{value:j.CLASS5,children:j.CLASS5},j.CLASS5),Object(pf.jsx)(LR,{value:j.CLASS6,children:j.CLASS6},j.CLASS6),Object(pf.jsx)(LR,{value:j.CLASS7,children:j.CLASS7},j.CLASS7),Object(pf.jsx)(LR,{value:j.CLASS8,children:j.CLASS8},j.CLASS8),Object(pf.jsx)(LR,{value:j.CLASS9,children:j.CLASS9},j.CLASS9)]})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.AllPublished",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.PublishedUnderAliases",I)}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:18,children:Object(pf.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(Ww.getLatLngKey(e.latitude,e.longitude));if(i){var r,n=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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=Xw.getState().modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(h.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(Ww.getLatLngKey(e.latitude,e.longitude));if(a){var o,i=Object(h.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(pf.jsx)(GR.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(W){var e=W.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(W){var e=W.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(W){var e=W.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(W){var e=W.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(pf.jsxs)(pf.Fragment,{children:[j&&_.current.map((function(e,t){var l=.2*T;return Object(pf.jsx)(GR.c,{icon:{path:google.maps.SymbolPath.CIRCLE,strokeColor:"red",strokeWeight:l+2,scale:l},position:e},t)})),F&&F.size&&L&&Object(pf.jsx)(GR.b,{position:{lat:L.lat(),lng:L.lng()},children:Object(pf.jsxs)("div",{style:{border:"2px solid gainsboro",maxHeight:"400px",overflowY:"auto"},onMouseLeave:function(){k(null),N(null)},children:[F.size>1?Object(pf.jsxs)("div",{style:{background:"#dddddd",textAlign:"left",borderBottom:"1px solid gainsboro",paddingBottom:"4px",marginBottom:"4px"},children:[V?Object(pf.jsx)(QR.a,{title:me.t("modelsMap.SortFromNewestToOldest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!1)}}):Object(pf.jsx)(ZR.a,{title:me.t("modelsMap.SortFromOldestToNewest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!0)}}),Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:[F.size," ",me.t("modelsMap.ModelsFoundOnThisSite",$)]}),L&&Object(pf.jsxs)("span",{style:{fontSize:"10px"},children:["\xa0\u2014"," ",me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"]})]}):"",Object(f.a)(F.keys()).sort((function(e,t){var l,a,o=F.get(e),i=F.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=F.get(e);return a?Object(pf.jsxs)("div",{style:{padding:(null===F||void 0===F?void 0:F.size)>1?"5px 5px 20px 5px":"5px",background:t%2===0?"white":"#eeeeee"},children:[0===t&&Object(pf.jsxs)("div",{style:{fontSize:"12px",display:"block",paddingBottom:"6px"},children:[a.countryCode&&Object(pf.jsx)(tD.a,{countryCode:a.countryCode,style:{marginRight:"6px",width:"20px"},svg:!0}),null!==(l=a.address)&&void 0!==l?l:"Unknown",1===F.size&&Object(pf.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(pf.jsx)(qR.a,{style:{background:ce(a)?"#FEF9EC":t%2===0?"white":"#eeeeee",width:"400px"},bordered:!1,ghost:!0,defaultActiveKey:["0"],children:Object(pf.jsx)(lD,{header:Object(pf.jsxs)(pf.Fragment,{children:[a.label,ce(a)&&Object(pf.jsx)(_R.a,{style:{marginLeft:"8px"}})]}),style:{fontSize:"12px"},children:Object(pf.jsx)("div",{style:{fontSize:"10px",display:"block",textAlign:"left"},children:Object(pf.jsxs)(Pv.b,{align:"start",children:[a.thumbnailUrl&&Object(pf.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(pf.jsxs)("div",{children:[a.description&&""!==a.description.trim()?a.description:"","\xa0\u2014\xa0 By"," ",Object(pf.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(pf.jsx)(eD.a,{date:new Date(a.timeCreated)})]})]})})},t)}),Object(pf.jsxs)("div",{style:{marginTop:"10px",fontSize:"11px"},children:[te&&Object(pf.jsx)(pf.Fragment,{children:ce(a)?Object(pf.jsx)($R.a,{style:{cursor:"pointer"},title:me.t("word.Unpin",$),onClick:function(){return se(a,!1)}}):Object(pf.jsx)(_R.a,{style:{cursor:"pointer"},title:me.t("word.Pin",$),onClick:function(){return se(a,!0)}})}),Object(pf.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(pf.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(pf.jsx)("img",{alt:"Delete",onClick:function(){return e=a,void lb.a.confirm({title:me.t("message.DoYouWantToDeleteModelFromMap",$),icon:Object(pf.jsx)(pb.a,{}),onOk:function(){s(e,(function(){m((function(t){if(t.modelSites){var l=t.modelSites.get(Ww.getLatLngKey(e.latitude,e.longitude));if(l){var a,o,i,r=void 0,n=Object(h.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(f){n.e(f)}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)))}}})),k(null),N(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:xR,height:ee,width:ee}),g.uid?Object(pf.jsx)(pf.Fragment,{children:g.likes&&g.likes.includes(Ww.getModelKey(a))?Object(pf.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(pf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Like",$),src:KR,height:ee,width:ee})}):Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)("img",{alt:"Like",style:{marginLeft:"10px",opacity:.5},title:me.t("word.MustLogInToLike",$),src:KR,height:ee,width:ee})}),"\xa0\xa0\xa0",re(a),Object(pf.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(pf.jsx)(GR.d,{children:function(e){return Object(pf.jsx)("div",{children:Object(f.a)(z.keys()).map((function(t,l){var a=z.get(t);if(!a||!a.size)return null;var o=Object(f.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=aD(i);return Object(pf.jsx)(GR.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=F,Z.current=l,k(a);var o=t.split(", ");N(new google.maps.LatLng(Number.parseFloat(o[0]),Number.parseFloat(o[1])))},onMouseOut:function(e){F===q.current&&(k(null),N(null))}},l)}))})}})]})})},iD=n.a.memo(oD),rD=l(853),nD=l(854),cD=l(844),sD=l(838),dD=l(851),uD=l(852),fD=function(e){var t=e.author,l=e.models,a=e.closeCallback,o=e.openCloudFile,i=Xw(di),n=Xw(Vi),c=Xw(si),s=Xw($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],H=GT.a.Search,j=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(h.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(pf.jsx)(sD.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",j))+" (0)",placement:"bottom",visible:!0,height:"150px",onClose:function(){a()},children:Object(pf.jsx)(XR.a,{image:XR.a.PRESENTED_IMAGE_SIMPLE,style:{color:R?"lightgray":"dimgray"}})}):Object(pf.jsx)(sD.a,{extra:Object(pf.jsxs)(Pv.b,{children:[P?Object(pf.jsx)(dD.a,{title:me.t("modelsMap.SortFromNewestToOldest",j),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!1)}}):Object(pf.jsx)(uD.a,{title:me.t("modelsMap.SortFromOldestToNewest",j),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!0)}}),Object(pf.jsx)(H,{title:me.t("modelsMap.SearchByLabel",j),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(l){d.current.clear();var t,a=Object(h.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",j))+" ("+z+")",placement:"bottom",visible:!0,height:"164px",onClose:function(){b(void 0),a()},children:Object(pf.jsx)("table",{children:Object(pf.jsx)("tbody",{children:Object(pf.jsx)("tr",{children:Object(f.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(pf.jsx)("td",{children:Object(pf.jsxs)("div",{style:{display:"block",marginTop:"4px"},children:[Object(pf.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(pf.jsxs)("div",{children:[Object(pf.jsx)("img",{alt:a.type,src:aD(a),style:{position:"relative",left:"8px",bottom:"28px",width:"16px",height:"16px"}}),Object(pf.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}))})})})})},hD=n.a.memo(fD),pD=["places"],yD=Tv.a.div(Az||(Az=Object(Av.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"]))),gD=function(e){var t,l,a=e.openCloudFile,o=e.deleteModelFromMap,i=e.likeModelFromMap,n=e.pinModelFromMap,c=Xw(di),s=Xw(Vi),d=Xw(si),p=Xw(Sr),y=Xw($i),g=Xw(qi),m=void 0!==g?g:42.2844063,w=Xw(Qi),x=void 0!==w?w:-71.3488548,v=null!==(t=Xw.getState().modelsMapAddress)&&void 0!==t?t:Xe,b=bf(er),A=bf(yr),T=Xw(or),P=Xw(ir),S=Xw(rr),H=Object(r.useRef)(S?new Map(S):new Map),j=Object(r.useState)(),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(!1),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(),k=Object(r.useRef)(),O=Object(r.useMemo)((function(){return{lng:s}}),[s]),Y=GT.a.Search;Object(r.useEffect)((function(){H.current=S?new Map(S):new Map,R&&(F.current=S.get(R)),C(!I)}),[S,R]);var L=Object(GR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:pD}),N=L.isLoaded,U=L.loadError,E=function(){bf.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(h.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(pf.jsxs)(yD,{onKeyDown:function(e){"Escape"===e.key&&E()},children:[N&&Object(pf.jsx)(Pv.b,{children:Object(pf.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(pf.jsx)(GR.e,{onLoad:function(e){k.current=e},onPlacesChanged:function(){var e,t=null===(e=k.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(pf.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"}})})})}),N?Object(pf.jsx)(iD,{selectAuthor:function(e){D(e),bf.setState((function(t){t.showLeaderboard||(t.leaderboardFlag=!0),e&&(F.current=H.current.get(e))}))},closeMap:E,openModel:a,deleteModel:o,likeModel:i,pinModel:n}):Object(pf.jsx)(Iv,{}),U&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})}),Object(pf.jsxs)(pf.Fragment,{children:[R&&Object(pf.jsx)(hD,{author:R,models:F.current,closeCallback:function(){D(void 0),F.current=void 0}}),A&&!R&&Object(pf.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(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(Y,{title:me.t("modelsMap.SearchByPublisher",O),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(S){H.current.clear();var t,l=Object(h.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())&&H.current.set(o,i)}}catch(r){l.e(r)}finally{l.f()}C(!I)}}}),0===H.current.size?Object(pf.jsx)(XR.a,{image:XR.a.PRESENTED_IMAGE_SIMPLE}):Object(pf.jsx)("table",{children:Object(pf.jsx)("tbody",{children:Object(f.a)(H.current.keys()).sort((function(e,t){var l=H.current.get(e),a=H.current.get(t);return(a?a.size:0)-(l?l.size:0)})).map((function(e,t){if(t>50)return null;var l=H.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(pf.jsxs)("tr",{style:{width:"180px"},children:[Object(pf.jsx)("td",{style:{width:"150px"},children:Object(pf.jsx)(BR.a,{icon:Object(pf.jsx)(rD.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(pf.jsx)("td",{children:null===l||void 0===l?void 0:l.size})]},t)}))})})]})}),Object(pf.jsx)(Pv.b,{children:Object(pf.jsxs)("div",{title:me.t("modelsMap.TotalNumberOfUserPublishedModels",O)+": "+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(){bf.setState((function(e){e.showLeaderboard||(e.leaderboardFlag=!0),e.showLeaderboard=!e.showLeaderboard}))},children:[A?Object(pf.jsx)(nD.a,{title:me.t("word.Close",O),style:{marginRight:"8px"}}):Object(pf.jsx)(cD.a,{title:me.t("word.Open",O),style:{marginRight:"8px"}}),me.t("word.Leaderboard",O)]})}),T&&Object(pf.jsx)(Pv.b,{children:Object(pf.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",O)+": ",T.countryCode&&Object(pf.jsx)(tD.a,{countryCode:T.countryCode,style:{marginLeft:"2px",marginRight:"4px",width:"20px"},svg:!0}),T.title+", by "+T.author]})}),Object(pf.jsx)(Pv.b,{children:Object(pf.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(){E()},children:me.t("word.Close",O)})}),V&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)(ab.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(){bf.setState((function(e){e.modelsMapWeatherStations=!e.modelsMapWeatherStations}))},children:b?Object(pf.jsx)("span",{title:me.t("mapPanel.WeatherStationsNote",O),children:me.t("mapPanel.WeatherStations",O)}):Object(pf.jsx)("span",{children:me.t("mapPanel.WeatherStations",O)})})})]})]})},mD=n.a.memo(gD),wD=l(839),xD=l(570),vD="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==",bD="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=",AD="data:image/png;base64,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",TD="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",PD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC",SD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==",HD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC",jD="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=",zD="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=",RD="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",DD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goYERIAtsSMegAABplJREFUWIXFl1tsHFcdxv/nzHV3dnZnzjlzWW+99qatsSiEGkJBIQSiEEyltkpDiqBcKiokhCK1QqilVUxwWlooUpUq5Yk8tA9tJaRUqC0S9BZogdJyCcRBVSCoSRxj2bu+7tqzl7n8eUiceteJbUpaPmledub7/77znaNZDcD/WdLlGjQ0NEROnjjxpUw6XXC8bOuW0tXB0YmJZC0fuRxwIdguAngvApxBhCwg7iAAo5KkfGeyUjm8mvd/aiCfFx/SNP0xCrCFSMpeSaLHIMFtSOA3VCKPxEnyo0xKLwX1xvOXmvGOGujq6rLDZuMBRNhCCTkgqeRoGEZ7CZAeKtHhycnpXwIAFItFqx7UnsYEaDpj3jw6OjrXOYv+t3BH2HeGrfrvkCRziqbtjiG5KgrjpyjQ1ypTsx9bggMAjI6OzlWmZrcDwaPBYu2vrmt/tHPeurfA8/j1uq4/AQQsRdHvJEmsRFH8CCWkIqv6VyfLlV9fyhvUGy+YRmY8iZODRsaYC4L68aV7a26B7/vvi6PWQ4joESoPExI3ME72I6F1VdXvHR8f/9t6F+E4/BAgfkOS1a0TExO/XTVAf79lzFTovgTgsxIhh2RNfqXRaN1FADZKVH5gslJ5er1g12U3YQTfR8C/y5SOtJLkhpmZ2W0AlzgDrsu/MD0lvQiElGSF3o+IcrMRPikBOfnJrZ/etF6453nXOJz9IolhGCS8f2pm9raJqemHKQXP88TWFQbf9z8smHVEcAsdwWddYf9KCPtlzqyoUCh8cL0r7unpyXHODzrc/ocn2HcRsT2YYHsEt59vayCfd3ZGYfMvCeImCaQ74gRvRiJ/c2pqdjuVyOP1erBrPXAh2J5gcf51SpN0yqBbJ6dmHiKkfae1dOYQIvRcIcQGAgBQLBbVYLF6lAJ9KkHYQQkZSZvm906fPl0FAHBd9/1JHD6jp4wPjI2NNS8G9oXYEUF8HwESECrfUy6X/7RqUGYPA5A+CgDQWFy4mwA9VZ6eefDKq/XrAaBRq83/WQg23N/fr5TL5TcB4K2wGXy9c1BBiCuFsA9HkDxMKTlYmZrZvhbcddmtQGAnpXAcfN9PcW6fzefzfW2DC/wqIezDnLNjjsM+XygUrhPcem3p/sDAQMoV7Iec2/90uL2/WCyqq0EBAHry+Y873H5BcAu7PO8WAAAiBBsmSZKrzMx9+6JVCXsHIO6nIM3FmAxIsvLFOG75lJB9COSYLKv3TExMjK4GzufzBUxa+5rN6PZ6vSGrqgJc5DaeOvXv4yC4NeoK9uBa6X2Hf4uz3CnOrIoj2BHXZZ9ay7N7924l7zl3cWZNGkYaCSEIAJg1M9jbW9gEAACO4/Q4gr3kCPZGt+9/ZrWBhULhGkfYb64FPrdqZyfn7FjWzKAsSwgAF67lAWilUjmTNsxHwzC8rlYPXvQEf7K3t/08LAkRxwFgoa+vL3MpcLGr61rX5c826s2f12q1jdXaQhJF8fJHEkIIICYywPn3AEXMtFohzM1X41oQ3FqbD/6Y95z7SqWSudy5eXN2AQCgWq2yTnCpVHJ8zzmwUF/8Q622eOPsXDVptcILDAAASZLANA2qyNIJSUqNvW0uFr9spFMXKqKUopkxUHD7ZJcnvrYcJAT7ve/7H1nWCvie2MO5dTZjpJFS2lb3+Ss20inkzJr2fb53YGAg1Z7+7QDxcpOiyGjlTHQcduQK3/8EAIDD2XNCnHuPF3x/0BHsjVzWRFmWO/0IAJGuaWhbudhz+ePd3d29nc3JnT8sEw3DCObma7GuaduiVPyqy/lPgKBMKG5xXXZb0AhuD+oNaDZbyfmql+pOFEWm6XRK0lTlFVVT9o2NTb4KML0CIgMAEMSlIBf7d5QazSYAIVQy6B1xFIeE0M81mk0IgnonGCRKIW2kqKaqb6ma8oPx8fJjqyzyXIAEYFbTVAijCFqtcGlomwghEIZRtbawqAAATZJE6nguSadTVNfUmqrIj7p+5scjI2fmV4O3zS/4/i4h2EjWzKAkSSv2M5VKYS5rVgGgBR0HTFNVtK0c+i7/WU+P379e6AoNDg6qec+5mzOrbBjpthDLAjSXwLIsYy5rosP564WCP/iOwZ0qlfxuz+E/ZXYu0nUNASDWdf1CA5RSzBhp5Nw+63tiz9DQ0GX5wFkh3/c3uw57KWtm0DQzmM1marquoW3n6r7nHNiwYYN4V8ArgzhfEcz+F2cWOpw9U+zquvY9AS9XsVi0urvzW95z8Lut/wD5YYsvG5lA0wAAAABJRU5ErkJggg==",WD="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",MD="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",ID="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==",CD="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==",FD="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",kD="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=",OD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=",YD="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",LD="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=",ND=function(e){var t=Object.assign({},e);return Object(pf.jsx)("div",{style:{verticalAlign:"top",display:"inline-block",marginTop:"4px",marginRight:"8px"},children:t.children})},UD=function(){var e=Xw(si),t=bf(hf),l=Xw(Gi),a=Xw.getState().elements,n=Xw(Vi),c=Xw(is),s=Xw(cs),d=Xw(o.showHeliodonPanel),p=Xw(i.noAnimationForHeatmapSimulation),y=bf(Us),g=Xw(zr),m=Xw(ns),w=Xw(Iu),x=Xw(Fu),v=Xw(Ou),b=Xw(Gu),A=Xw(Xu),T=Xw(Sr),P=bf(Lr),S=bf(Nr),H=Xw(Eu),j=Object(r.useState)(V.Foundation),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(V.Wall),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useState)(V.SolarPanel),k=Object(u.a)(F,2),O=k[0],Y=k[1],L=Object(r.useMemo)((function(){return{lng:n}}),[n]),N="invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)",U="invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)",E=function(){e((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.actionModeLock=!1}))},J=function(t){e((function(e){e.objectTypeToAdd=t,e.groupActionMode=!1,e.groupMasterId=null,e.actionModeLock=!1})),Nt.getState().setEnableOrbitController(!1),c()},G=function(e,t,l,a){var o=e.charAt(0).toLowerCase()+e.slice(1).replace(/\s+/g,"");return Object(pf.jsxs)(tb.a.Item,{style:{userSelect:"none"},onClick:function(){l(e),J(e)},children:[Object(pf.jsx)("img",{alt:e,src:t,height:36,width:36,style:{filter:N,verticalAlign:"middle",marginRight:"10px"}}),me.t("toolbar.SwitchToAdding".concat(null!==a&&void 0!==a?a:e.replaceAll(" ","")),L)]},"add-".concat(o,"-menu-item"))},X=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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{title:me.t("toolbar.Add".concat(null!==o&&void 0!==o?o:t.replaceAll(" ","")),L)+(i?"\n"+(s?me.t("toolbar.ClickToUnlockThisModeForNextAction",L):me.t("toolbar.DoubleClickToLockThisModeForNextAction",L)):""),alt:t,src:l,height:36,width:36,style:{filter:m===t||a?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){J(t)},onDoubleClick:function(){i&&e((function(e){e.actionModeLock=!0}))}}),(m===t||a)&&i&&s&&Object(pf.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:m===t||a?U:N,verticalAlign:"top"}})]})},B=function(e){return Object(pf.jsx)(nb.a,{overlay:e,trigger:["click"],children:Object(pf.jsx)("span",{title:me.t("toolbar.ClickForMoreButtons",L),style:{cursor:"pointer",verticalAlign:"middle",fontSize:"10px",marginLeft:"4px",width:"10px",height:"36px",color:"#666666",fontWeight:"bold"},children:"\u25bc"})})},K=Object(pf.jsxs)(tb.a,{children:[G(V.Foundation,vD,D),G(V.Cuboid,bD,D),G(V.Tree,MD,D),G(V.Flower,ID,D),G(V.Human,CD,D,"People")]}),q=Object(pf.jsxs)(tb.a,{children:[G(V.Wall,PD,C),G(V.Window,SD,C),G(V.Door,HD,C),G(V.PyramidRoof,jD,C),G(V.HipRoof,zD,C),G(V.GableRoof,WD,C),G(V.GambrelRoof,RD,C),G(V.MansardRoof,DD,C)]}),Q=Object(pf.jsxs)(tb.a,{children:[G(V.SolarPanel,TD,Y),G(V.ParabolicTrough,FD,Y),G(V.ParabolicDish,kD,Y),G(V.FresnelReflector,OD,Y),G(V.Heliostat,YD,Y),G(V.Sensor,AD,Y),G(V.Light,LD,Y)]});return Object(pf.jsxs)("div",{children:[Object(pf.jsx)(ND,{children:Object(pf.jsx)("img",{title:me.t("toolbar.Select",L),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:m!==V.None||w||x||v||b||A||H?N:U,cursor:"pointer",verticalAlign:"middle"},onClick:E})}),Object(pf.jsx)(ND,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ManipulateGroup",L),alt:"Group",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==",height:36,width:36,style:{filter:H?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){e((function(e){if(e.groupActionMode)e.groupMasterId=null;else{if(e.selectedElement)if(Qf(e.selectedElement))e.groupMasterId=Ww.getBaseId(e.selectedElement.id);else{var t,l=Ww.getBaseId(null!==(t=e.selectedElement.foundationId)&&void 0!==t?t:e.selectedElement.parentId);e.groupMasterId=l;var a,o=Object(h.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.selected=i.id===l}}catch(c){o.e(c)}finally{o.f()}e.selectedElementIdSet.clear(),l&&e.selectedElementIdSet.add(l)}else{var r,n=Object(h.a)(e.elements);try{for(n.s();!(r=n.n()).done;){r.value.selected=!1}}catch(c){n.e(c)}finally{n.f()}e.selectedElementIdSet.clear()}e.objectTypeToAdd=V.None}e.groupActionMode=!e.groupActionMode}))}})}),Object(pf.jsxs)(ND,{children:[function(e){switch(e){case V.Foundation:return X(e,vD,Xw.getState().addedFoundationId);case V.Cuboid:return X(e,bD,Xw.getState().addedCuboidId);case V.Tree:return X(e,MD);case V.Flower:return X(e,ID);case V.Human:return X(e,CD,void 0,"People")}}(R),B(K)]}),Object(pf.jsxs)(ND,{children:[function(e){switch(e){case V.Wall:return X(e,PD,Xw.getState().addedWallId);case V.Window:return X(e,SD,Xw.getState().addedWindowId);case V.Door:return X(e,HD,Xw.getState().addedDoorId);case V.PyramidRoof:return X(V.PyramidRoof,jD);case V.HipRoof:return X(V.HipRoof,zD);case V.GableRoof:return X(V.GableRoof,WD);case V.GambrelRoof:return X(V.GambrelRoof,RD);case V.MansardRoof:return X(V.MansardRoof,DD)}}(I),B(q)]}),Object(pf.jsxs)(ND,{children:[function(e){switch(e){case V.SolarPanel:return X(e,TD);case V.ParabolicTrough:return X(e,FD);case V.ParabolicDish:return X(e,kD);case V.FresnelReflector:return X(e,OD);case V.Heliostat:return X(e,YD);case V.Sensor:return X(e,AD);case V.WindTurbine:return X(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 X(e,LD)}}(O),B(Q)]}),Object(pf.jsx)(ND,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ClearScene",L),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(){lb.a.confirm({title:me.t("toolbar.DoYouReallyWantToClearContent",L)+"?",icon:Object(pf.jsx)(pb.a,{}),onOk:function(){var t=JSON.parse(JSON.stringify(Xw.getState().elements));g();var l={name:"Clear Scene",timestamp:Date.now(),removedElements:t,undo:function(){e((function(e){var t;(t=e.elements).push.apply(t,Object(f.a)(l.removedElements))}))},redo:function(){g()}};T(l)}}),E()}})}),Object(pf.jsx)(ND,{children:Object(pf.jsx)("img",{title:me.t("toolbar.SpatialAnalysisOfEnergy",L),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:y?U:N,cursor:"pointer",verticalAlign:"middle"},onClick:function(){y?bf.setState((function(e){e.showSolarRadiationHeatmap=!1,e.showHeatFluxes=!1})):!p||Ww.hasMovingParts(a)?(P||Kh(me.t("message.SimulationStarted",L)),setTimeout((function(){c(),t("runDynamicSimulation",!P),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()})}))}),100)):(S||Kh(me.t("message.SimulationStarted",L)),setTimeout((function(){c(),t("runStaticSimulation",!S),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()})}))}),100))}})}),Object(pf.jsx)(ND,{children:Object(pf.jsx)("img",{title:me.t("toolbar.ShowSunAndTimeSettings",L),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?U:N,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}))}};T(t),e((function(e){e.viewState.showHeliodonPanel=!e.viewState.showHeliodonPanel}))}})})]})},ED=n.a.memo(UD),VD=Tv.a.div(Tz||(Tz=Object(Av.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=Xw(Vi),o=Xw(di),i=bf(Ki),n=Object(r.useMemo)((function(){return{lng:a}}),[a]),c=Object(pf.jsxs)(tb.a,{triggerSubMenuAction:"click",children:[Object(pf.jsx)(tb.a.Item,{onClick:function(){bf.setState((function(e){e.showAccountSettingsPanel=!0}))},children:me.t("avatarMenu.AccountSettings",n)},"account"),Object(pf.jsx)(tb.a.Item,{onClick:l,children:me.t("avatarMenu.SignOut",n)},"signOut")]});return Object(pf.jsx)(VD,{children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[!i&&Object(pf.jsx)(ED,{}),Object(pf.jsx)("div",{style:{verticalAlign:"top"},children:o.displayName?Object(pf.jsx)(nb.a,{overlay:c,trigger:["click"],children:Object(pf.jsx)("a",{className:"ant-dropdown-link",onClick:function(e){return e.preventDefault()},title:me.t("tooltip.clickToAccessCloudTools",n),children:Object(pf.jsx)(wD.a,{size:32,src:o.photoURL,alt:o.displayName})})}):Object(pf.jsx)(xD.a,{title:Object(pf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("avatarMenu.PrivacyStatementTitle",n)}),content:Object(pf.jsxs)("div",{style:{width:"280px",fontSize:"12px"},children:[me.t("avatarMenu.PrivacyStatement",n),Object(pf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",children:me.t("aboutUs.PrivacyPolicy",n)}),"."]}),children:Object(pf.jsx)(Sv.a,{type:"primary",onClick:t,children:me.t("avatarMenu.SignIn",n)})})})]})})},GD=n.a.memo(JD),XD=function(e){var t=e.saveToCloud,l=e.isLoading,a=e.setTitle,o=e.getTitle,i=e.setTitleDialogVisible,n=e.isTitleDialogVisible,c=Xw(si),s=Xw(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(pf.jsx)(lb.a,{width:500,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:A,children:me.t("word.Cancel",v)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:b,disabled:!o(),children:me.t("word.OK",v)},"OK")],confirmLoading:l(),onCancel:A,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:x,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[Object(pf.jsxs)("span",{children:[me.t("word.Title",v),":"]}),Object(pf.jsx)(GT.a,{style:{width:"400px"},placeholder:"Title",value:o(),onPressEnter:b,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){a(e.target.value)}})]})})},BD=n.a.memo(XD),KD=pR.a.Column,qD=Tv.a.div(Pz||(Pz=Object(Av.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: 99;\n"]))),QD=Tv.a.div(Sz||(Sz=Object(Av.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"]))),ZD=Tv.a.div(Hz||(Hz=Object(Av.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"]))),_D=function(e){var t=e.projects,l=e.setProjectState,a=e.deleteProject,o=e.renameProject,i=Xw(Vi),c=Xw(di),s=n.a.useRef(null),d=Object(r.useRef)(null),p=d.current?d.current.clientWidth+40:680,y=d.current?d.current.clientHeight+100:600,g=Object(r.useState)({x:0,y:0}),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),H=S[0],j=S[1],z=Object(r.useState)({left:0,top:0,bottom:0,right:0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useRef)(null),U=Object(r.useRef)(Object(f.a)(t)),E=Object(r.useState)(!1),V=Object(u.a)(E,2),J=V[0],G=V[1],X=GT.a.Search,B=Object(r.useMemo)((function(){return{lng:i}}),[i]);Object(r.useEffect)((function(){var e=function(){x({x:Math.max(0,p-window.innerWidth),y:Math.min(0,window.innerHeight-y)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(U.current=Object(f.a)(t),G(!J))}),[t]);var K=function(){bf.setState((function(e){e.showProjectListPanel=!1}))},q=function(){C&&Y&&(o(C,Y),L(void 0),G(!J)),T(!1)};return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(lb.a,{title:Object(pf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return j(!0)},onMouseOut:function(){return j(!1)},children:me.t("word.Rename",B)}),visible:A,onOk:q,onCancel:function(){T(!1),L(void 0)},modalRender:function(e){return Object(pf.jsx)(qT.a,{disabled:!H,bounds:D,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();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(pf.jsx)("div",{ref:N,children:e})})},children:Object(pf.jsxs)(Pv.b,{direction:"vertical",style:{width:"100%"},children:[Object(pf.jsx)(GT.a,{placeholder:"Title",value:Y||C,onPressEnter:q,onKeyDown:function(e){if(!Mt.test(e.key))return e.preventDefault(),!1},onChange:function(e){L(e.target.value)}}),Object(pf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",B)+": "+me.t("projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks",B),"."]})]})}),Object(pf.jsx)(qT.a,{nodeRef:s,handle:".handle",bounds:"parent",axis:"both",position:w,onDrag:function(e,t){x({x:Math.max(t.x,p-window.innerWidth),y:Math.min(t.y,window.innerHeight-y)})},onStop:function(e,t){},children:Object(pf.jsx)(qD,{ref:s,children:Object(pf.jsxs)(QD,{ref:d,children:[Object(pf.jsxs)(ZD,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("projectListPanel.MyProjects",B)+" ("+U.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){K()},onTouchStart:function(){K()},children:me.t("word.Close",B)})]}),Object(pf.jsx)("span",{style:{direction:"ltr"},children:Object(pf.jsx)(X,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("projectListPanel.SearchByTitle",B),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){U.current=[];var l,a=Object(h.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()))&&U.current.push(i)}}catch(r){a.e(r)}finally{a.f()}G(!J)}}})}),Object(pf.jsxs)(pR.a,{size:"small",style:{width:"100%",direction:"ltr",verticalAlign:"top"},dataSource:U.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(pf.jsx)(KD,{title:me.t("word.Type",B),dataIndex:"type",width:"25%",render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})}},"type"),Object(pf.jsx)(KD,{title:me.t("word.Title",B),dataIndex:"title",width:"33%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",cursor:"pointer",verticalAlign:"top"},title:me.t("word.Open",B),children:e})},onCell:function(e){return{onClick:function(){var t=window.getSelection();t&&t.toString().length>0||l(e)}}}},"title"),Object(pf.jsx)(KD,{title:me.t("word.Time",B),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e){return Object(pf.jsx)(yR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})}},"time"),Object(pf.jsx)(KD,{width:"17%",title:me.t("word.Action",B),render:function(e,t){return Object(pf.jsxs)(Pv.b,{size:"middle",style:{verticalAlign:"top"},children:[Object(pf.jsx)("img",{title:me.t("word.Delete",B),alt:"Delete",src:xR,onClick:function(){var e;e=t.title,lb.a.confirm({title:me.t("projectListPanel.DoYouReallyWantToDeleteProject",B)+' "'+e+'"?',content:Object(pf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(pf.jsx)(gR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",B)+": "+me.t("message.ThisCannotBeUndone",B)]}),icon:Object(pf.jsx)(mR.a,{}),onOk:function(){a(e)}})},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("word.Rename",B),alt:"Rename",src:wR,onClick:function(){F(t.title),T(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(pf.jsx)("img",{title:me.t("projectListPanel.GenerateProjectLink",B),alt:"Link",src:vR,onClick:function(){var e=Ge+"?client=web&userid="+c.uid+"&project="+encodeURIComponent(t.title);Zh(e),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",B)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},$D=n.a.memo(_D),eW=function(e,t,l){Object(r.useEffect)((function(){e&&(t(),l())}),[e])},tW=function(e){var t=e.viewOnly,l=void 0!==t&&t,a=e.canvas,o=Xw(si),n=bf(hf),c=Xw(Vi),s=Xw(di),p=Xw(i.latitude),y=Xw(i.longitude),g=Xw(i.address),m=Xw(i.countryCode),w=Xw(jr),v=bf(Ts),b=bf(Hs),A=bf(js),T=bf(zs),P=bf(Ki),R=Xw(ar),D=bf(nr),M=bf(hr),I=bf(pr),C=bf(gr),F=bf(mr),k=Xw(tr),O=Xw(lr),Y=Xw(Hr),L=Xw(Rr),N=bf(Di),U=Xw(wr),E=Xw(rr),J=bf(cr),G=bf(sr),X=bf(dr),B=bf(ur),K=bf(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)(),He=Object(r.useRef)(),je=Object(r.useRef)(!0),ze=Object(r.useMemo)((function(){return{lng:c}}),[c]);Object(r.useEffect)((function(){var e=0===oP.a.apps.length;return 1===oP.a.apps.length&&oP.a.apps[0].name===S.LOG_DATA&&(e=!0),e?oP.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"}):oP.a.app(),oP.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:Gw.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(He.current=new Map,s.aliases&&s.aliases.length>0){var e,t=Object(h.a)(s.aliases);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l!==s.displayName){var a=E.get(l);a&&(He.current=new Map([].concat(Object(f.a)(He.current),Object(f.a)(a))))}}}catch(i){t.e(i)}finally{t.f()}}if(s.displayName){var o=E.get(s.displayName);o&&(He.current=new Map([].concat(Object(f.a)(He.current),Object(f.a)(o))))}}),[E,s.displayName,s.aliases]),eW(D,(function(){R&&(Je(R,!1,!1),xe(R))}),(function(){return n("saveCloudFileFlag",!1)})),eW(M,(function(){Ie().then((function(){Ce().then((function(){}))}))}),(function(){return n("modelsMapFlag",!1)})),eW(I,(function(){Fe().then((function(){Ce().then((function(){}))}))}),(function(){return n("leaderboardFlag",!1)})),eW(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:Xw.getState().modelType,author:null!==(t=Xw.getState().modelAuthor)&&void 0!==t?t:s.displayName,userid:s.uid,title:we,label:Xw.getState().modelLabel,description:Xw.getState().modelDescription,timeCreated:Date.now()},i=Ww.getModelKey(l),r=oP.a.firestore().collection("models");if(r){var n=oP.a.storage().ref();if(a)Ww.resizeCanvas(a,200).toBlob((function(e){if(e){var t=n.child("images/"+i+".png").put(e,{contentType:"image/png"});t.on(oP.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(Ww.getLatLngKey(p,y));n.get().then((function(e){if(e.exists){var t=e.data();t&&t[i]?n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.UpdatedOnModelsMap",ze)+".")})):n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))}else n.set(Object(hR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))})).catch((function(e){Qh(me.t("message.CannotPublishModelOnMap",ze)+": "+e)})),oP.a.firestore().collection("board").doc("people").update(Object(hR.a)({},(null!==(t=a.author)&&void 0!==t?t:"Anonymous")+"."+Ww.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(Ww.getModelKey(a),a)}}))})),oP.a.firestore().collection("board").doc("info").set({latestModel:a},{merge:!0}).then((function(){}))}))}))}}))}oP.a.firestore().collection("users").doc(s.uid).update(Xw.getState().modelAuthor===s.displayName?{published:oP.a.firestore.FieldValue.arrayUnion(we)}:{published:oP.a.firestore.FieldValue.arrayUnion(we),aliases:oP.a.firestore.FieldValue.arrayUnion(Xw.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)})),eW(J,(function(){if(!s||!s.uid)return;var e=bf.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)+".");Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(f){i.e(f)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r,n,c=null!==(r=bf.getState().projectType)&&void 0!==r?r:W.SOLAR_PANEL_ARRAY,d=null!==(n=bf.getState().projectDescription)&&void 0!==n?n:null,u=(new Date).getTime();oP.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:Gw.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=Gw.getDefaultHiddenParameters(t.projectInfo.type)}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ne(!1).then((function(){le(!te)})),_(!1)}))}}))}),(function(){return n("createProjectFlag",!1)})),eW(G,(function(){if(!s||!s.uid)return;var e=bf.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)+".");Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.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=Xw.getState().projectInfo.designs;if(r){var n,c,d,f,p,y,g,m,w=bf.getState().projectType,x=bf.getState().projectDescription,v=Xw.getState().projectInfo.owner,A=(new Date).getTime(),T=Xw.getState().projectInfo.counter,P=null!==(n=Xw.getState().projectInfo.dataColoring)&&void 0!==n?n:null,S=null!==(c=Xw.getState().projectInfo.selectedProperty)&&void 0!==c?c:null,H=!!Xw.getState().projectInfo.sortDescending,j=null!==(d=Xw.getState().projectInfo.xAxisNameScatteredPlot)&&void 0!==d?d:"rowWidth",z=null!==(f=Xw.getState().projectInfo.yAxisNameScatteredPlot)&&void 0!==f?f:"rowWidth",R=null!==(p=Xw.getState().projectInfo.dotSizeScatteredPlot)&&void 0!==p?p:5,D=null!==(y=Xw.getState().projectInfo.thumbnailWidth)&&void 0!==y?y:200,W=null!==(g=sP(t,r))&&void 0!==g?g:[],M=Object(h.a)(r.entries());try{for(M.s();!(m=M.n()).done;){var I=Object(u.a)(m.value,2),C=I[0],F=I[1];fP(F.title,W[C].title,v,s.uid)}}catch(J){M.e(J)}finally{M.f()}var k=Xw.getState().projectImages;if(k&&k.size>0){var O,Y,L=Object(h.a)(r.entries());try{for(L.s();!(Y=L.n()).done;){var N=Object(u.a)(Y.value,2),U=N[0],E=N[1],V=k.get(E.title);V&&(W[U].thumbnail=uP(V))}}catch(J){L.e(J)}finally{L.f()}oP.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:H,xAxisNameScatteredPlot:j,yAxisNameScatteredPlot:z,dotSizeScatteredPlot:R,thumbnailWidth:D,designs:W,ranges:null!==(O=Xw.getState().projectInfo.ranges)&&void 0!==O?O:null,hiddenParameters:Xw.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=W}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ne(!1).then((function(){le(!te)})),_(!1)}))}}}}))}),(function(){return n("saveProjectFlag",!1)})),eW(B,(function(){Ue(!0)}),(function(){return n("showProjectsFlag",!1)})),eW(K,(function(){Ue(!1),le(!te)}),(function(){return n("updateProjectsFlag",!1)})),eW(F,(function(){if(!s.uid)return;Qe().then((function(){bf.setState((function(e){e.showCloudFilePanel=!0}))}))}),(function(){return n("listCloudFilesFlag",!1)})),eW(X,(function(){var e=Xw.getState().projectInfo.owner;if(s.uid!==e)Kh(me.t("message.CannotAddDesignToProjectOwnedByOthers",ze));else{var t=Xw.getState().projectInfo.title;if(t){var l,i,r;_(!0);var n=null!==(l=Xw.getState().projectInfo.type)&&void 0!==l?l:W.SOLAR_PANEL_ARRAY,c=null!==(i=Xw.getState().projectInfo.thumbnailWidth)&&void 0!==i?i:200,d=null!==(r=Xw.getState().projectInfo.counter)&&void 0!==r?r:0;!function(e,t,l,i){if(!s.uid||!a)return;var r=Ww.resizeCanvas(a,i).toDataURL(),n=cP(e,l,r);oP.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).update({designs:oP.a.firestore.FieldValue.arrayUnion(n),counter:oP.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(k)}),[O]),Object(r.useEffect)((function(){xe(null!==R&&void 0!==R?R:"My Aladdin File")}),[R]),Object(r.useEffect)((function(){je.current?je.current=!1:Me(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),iP(t,a,Ee).finally((function(){_(!1)})),l&&Ve(t,l)):l&&qe(t,l)}else o((function(e){e.cloudFile=void 0}))},We=function(){var e=Object(Nh.a)(Lh.a.mark((function e(t){var l,a,i,r,n,c,s,d,u,f,p;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return l=oP.a.firestore(),a=!1,i=!1,r=0,n=H.UNKNOWN,c=j.UNKNOWN,s=[],d=[],u=[],e.next=11,l.collection("users").get().then((function(e){r=e.size;var l,o=Object(h.a)(e.docs);try{for(o.s();!(l=o.n()).done;){var f=l.value;if(f.id===t.uid){var p=f.data();return a=!!p.signFile,i=!!p.noLogging,n=p.schoolID?p.schoolID:H.UNKNOWN,c=p.classID?p.classID:j.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})),bf.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!==(f=t.schoolID)&&void 0!==f?f:H.UNKNOWN,classID:null!==(p=t.classID)&&void 0!==p?p:j.UNKNOWN,since:x()(new Date).format("MM/DD/YYYY hh:mm A"),os:Ww.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)}}(),Me=function(e){var t,l;e.uid&&oP.a.firestore().collection("users").doc(e.uid).update({signFile:!!e.signFile,schoolID:null!==(t=e.schoolID)&&void 0!==t?t:H.UNKNOWN,classID:null!==(l=e.classID)&&void 0!==l?l:j.UNKNOWN}).then((function(){Kh(me.t("message.YourAccountSettingsWereSaved",ze))})).catch((function(e){Qh(me.t("message.CannotSaveYourAccountSettings",ze)+": "+e)}))},Ie=function(){var e=Object(Nh.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,oP.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(Nh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,oP.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(Ww.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)}}(),Fe=function(){var e=Object(Nh.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,oP.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)}}(),ke=function(e,t){var l;s&&s.uid&&(oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e),oP.a.firestore.FieldValue.delete())).then((function(){Bh(me.t("message.ModelDeletedFromMap",ze)),t&&t()})).catch((function(e){Qh(me.t("message.CannotDeleteModelFromMap",ze)+": "+e)})),oP.a.firestore().collection("board").doc("people").update(Object(hR.a)({},(null!==(l=e.author)&&void 0!==l?l:"Anonymous")+"."+Ww.getModelKey(e),oP.a.firestore.FieldValue.delete())).then((function(){o((function(t){t.peopleModels&&(t.peopleModels.delete(Ww.getModelKey(e)),bf.setState((function(e){e.leaderboardFlag=!0})))}))})),oP.a.firestore().collection("users").doc(s.uid).update({published:oP.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)}}))})))},Oe=function(e,t,l){if(s&&s.uid){var a=Ww.getModelKey(e);oP.a.firestore().collection("users").doc(s.uid).update(t?{likes:oP.a.firestore.FieldValue.arrayUnion(a)}:{likes:oP.a.firestore.FieldValue.arrayRemove(a)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}));var o=a+".likeCount";oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(t?Object(hR.a)({},o,oP.a.firestore.FieldValue.increment(1)):Object(hR.a)({},o,oP.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&&oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e)+".pinned",t)).then((function(){l&&l()})).catch((function(e){}))},Le=function(e){s&&s.uid&&oP.a.firestore().collection("models").doc(Ww.getLatLngKey(e.latitude,e.longitude)).update(Object(hR.a)({},Ww.getModelKey(e)+".clickCount",oP.a.firestore.FieldValue.increment(1))).then((function(){})).catch((function(e){}))},Ne=function(){var e=Object(Nh.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,oP.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:Gw.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&&Ne(!e).then((function(){e&&bf.setState((function(e){e.showProjectListPanel=!0})),pe(!he)}))},Ee=function(e){o((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,t){e&&t&&(_(!0),hP(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(h.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?lb.a.confirm({title:me.t("message.CloudFileWithTitleExistsDoYouWantToOverwrite",ze),icon:Object(pf.jsx)(mR.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=oP.a.firestore().collection("users").doc(s.uid);a&&(U&&bf.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})),bf.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){N?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(pf.jsx)(pb.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){N?lb.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(pf.jsx)(pb.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),hP(e,t,!1,a,l).finally((function(){_(!1)})))},Qe=function(){var e=Object(Nh.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,oP.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(pf.jsx)(pf.Fragment,{children:P&&Object(pf.jsx)(mD,{openCloudFile:Ke,deleteModelFromMap:ke,likeModelFromMap:Oe,pinModelFromMap:Ye})}):Object(pf.jsxs)(pf.Fragment,{children:[Z&&Object(pf.jsx)(Iv,{}),Object(pf.jsx)(BD,{saveToCloud:Je,isLoading:function(){return Z},setTitle:xe,getTitle:function(){return we},setTitleDialogVisible:Te,isTitleDialogVisible:function(){return Ae}}),Object(pf.jsx)(GD,{signIn:function(){var e=new oP.a.auth.GoogleAuthProvider;oP.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,We(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,e.groupMasterId=null}))},signOut:function(){oP.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})),bf.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(pf.jsx)(HR,{cloudFileArray:ie,openCloudFile:Be,deleteCloudFile:function(e,t){oP.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=oP.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(h.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(f.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(pf.jsx)($D,{projects:se,setProjectState:Ee,deleteProject:function(e){s.uid&&oP.a.firestore().collection("users").doc(s.uid).collection("projects").doc(e).delete().then((function(){if(Se.current&&s.uid){var t,l=Object(h.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(h.a)(a.designs);try{var n=function(){var e=i.value;o((function(t){e.title===t.cloudFile&&(t.cloudFile=void 0)})),oP.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=Gw.getDefaultHiddenParameters(t.projectInfo.type),t.designProjectType=null,t.projectView=!1)}))})).catch((function(e){Qh(me.t("message.CannotDeleteProject",ze)+": "+e)}))},renameProject:function(e,t){Ne(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(h.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=oP.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,f,p=null!==(c=sP(t,a.designs))&&void 0!==c?c:[],y=Object(h.a)(a.designs.entries());try{for(y.s();!(f=y.n()).done;){var g=Object(u.a)(f.value,2),m=g[0],w=g[1];fP(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(h.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(pf.jsx)(hD,{author:void 0,models:He.current,openCloudFile:Be,closeCallback:function(){n("showModelsGallery",!1),He.current=void 0}}),T&&Object(pf.jsx)(JR,{openCloudFile:qe}),P&&Object(pf.jsx)(mD,{openCloudFile:Ke,deleteModelFromMap:ke,likeModelFromMap:Oe,pinModelFromMap:Ye})]})},lW=n.a.memo(tW),aW=(l(728),function(){var e,t,l=Xw(Xi),a=Xw(Bi),o=Xw(di),i=Xw(ar),n=Object(r.useRef)(!0),c=Object(r.useRef)(!0),s=Object(r.useRef)(),d=null!==(e=o.schoolID)&&void 0!==e?e:H.UNKNOWN,u=null!==(t=o.classID)&&void 0!==t?t:j.UNKNOWN;return Object(r.useEffect)((function(){var e,t=void 0,l=Object(h.a)(oP.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=oP.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=oP.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(pf.jsx)(pf.Fragment,{})}),oW=n.a.memo(aW),iW=function(){var e=Xw(o.directLightIntensity),t=Xw(o.ambientLightIntensity),l=Xw(Ls),a=Xw(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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("ambientLight",{intensity:.1+(s?(null!==t&&void 0!==t?t:.1)*d:0),name:"Ambient Light"}),Object(pf.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})]})},rW=n.a.memo(iW),nW=function(e){var t=e.element,l=Xw(qr),a=Xw(zu),o=Xw(Hu),i=Xw(Ru),n=t.type===V.Roof,c="lightGray",s=Object(Se.e)(We.FontLoader,cy),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 We.Euler(vt,0,e,"ZXY")}),[l.x,l.y]);if(!a&&!o)return null;var p=function(){var e=t.lz;return n&&(e=Xw.getState().selectedElementHeight),Math.ceil(e)+1}(),y=function(){var e=t.lz;return n&&(e=t.rise),e.toFixed(1)+" m"}(),g=n?Xw.getState().selectedElementHeight+1:t.lz-.175,m=new Array(p+1).fill(0);return Object(pf.jsxs)("group",{position:f,rotation:h,name:"Vertical Ruler",children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[0,p,0]],color:c}),Object(pf.jsxs)("mesh",{position:[-1.5,g,0],userData:{unintersectable:!0},children:[Object(pf.jsx)("textGeometry",{args:[y,u]}),Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})]}),m.map((function(e,t){var l=.2+(t%5===0?.05:0),a=Object(pf.jsx)("textGeometry",{args:["".concat(t),d]});return Object(pf.jsxs)("group",{children:[Object(pf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,t,0],[l,t,0]],lineWidth:.5,color:c}),!n&&Object(pf.jsxs)("mesh",{position:[.4,t-.125,0],userData:{unintersectable:!0},children:[a,Object(pf.jsx)("meshBasicMaterial",{attach:"material",color:c})]})]},t)}))]})},cW=function(){var e=Xw(ju),t=Xw(Du),l=Xw(zu),a=Xw(Hu),i=Xw(o.groundImage),n=Xw(Kr),c=Xw(Fu),s=Xw(Iu),d=Xw((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=Ww.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,H=function(e){return Ww.isTopResizeHandle(e)||(null===d||void 0===d?void 0:d.type)===V.Wall&&Ww.isTopResizeHandleOfWall(e)||(null===d||void 0===d?void 0:d.type)===V.Roof&&Ww.isRiseHandleOfRoof(e)}(null!==l&&void 0!==l?l:a);return d?Object(pf.jsxs)(pf.Fragment,{children:[((p||e||Ww.isMoveHandle(a))&&!i&&P()||c||s)&&Object(pf.jsx)("gridHelper",{rotation:[vt,0,0],name:"Grid",args:[w,A,"gray","#444444"]}),(t||S)&&d&&P()&&Object(pf.jsx)(sy,{element:d}),H&&Object(pf.jsx)(nW,{element:d})]}):null},sW="black",dW="white",uW=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&&Nt.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=sW,e.stroke(),e.beginPath(),e.arc(p,p,d,0,2*Math.PI),e.lineWidth=u,e.strokeStyle=sW,e.stroke(),e.lineWidth=f,e.beginPath(),e.moveTo(p,p-t),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=dW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p-t),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=dW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=dW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=dW,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=sW,e.stroke(),e.fill(),e.font=c,e.fillStyle=dW,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=sW,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(pf.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},fW=n.a.memo(uW),hW=l(344),pW=l.n(hW),yW=n.a.memo((function(){var e,t,l=Xw(si),a=Xw(ef),o=Xw($u),i=Xw(Sr),n=Object(r.useRef)(!1),c=Object(r.useRef)(!1);Xw(Nu),Xw(Uu),Object(r.useEffect)((function(){Nt.setState((function(e){e.listenToAutoDeletionByDeleteRef=n,e.listenToAutoDeletionByCutRef=c}))}),[]);var s=Object($y.debounce)((function(){var e,t,r=bf.getState().selectedElementId;if(r){var n=Xw.getState().getAutoDeletedElements();if(n){var c=Xw.getState().deletedElements,s=Xw.getState().elementsToPaste,d=null===(e=Nt.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current,u=null===(t=Nt.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current,h=[],p="";d?(Nt.getState().setListenToAutoDeletionByCut(!1),h=[].concat(Object(f.a)(s),Object(f.a)(n)),p="Cut"):u&&(Nt.getState().setListenToAutoDeletionByDelete(!1),h=[].concat(Object(f.a)(c),Object(f.a)(n)),p="Delete");var y={name:p,timestamp:Date.now(),deletedElements:Object(f.a)(h),selectedElementId:r,undo:function(){var e=y.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===y.selectedElementId}));if(t){if(t.type===V.Wall){var i=t;i.leftJoints.length>0&&a(i.leftJoints[0],[i.id]),i.rightJoints.length>0&&o(i.rightJoints[0],[i.id])}l((function(t){var l;(l=t.elements).push.apply(l,Object(f.a)(e)),t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag,t.deletedRoofId=null,t.autoDeletedRoof=null,t.autoDeletedChild=null}))}}},redo:function(){if(0!==y.deletedElements.length){var e=new Set(y.deletedElements.map((function(e){return e.id})));l((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var l=y.deletedElements.find((function(e){return e.type===V.Roof}));l&&(t.deletedRoofId=l.id)}))}}};i(y),l((function(e){e.deletedRoofId=null,e.autoDeletedRoof=null,e.autoDeletedChild=null})),bf.getState().setPrimitiveStore("selectedElementId",null)}}}),50);return((null===(e=Nt.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current)||(null===(t=Nt.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current))&&Xw.getState().getAutoDeletedElements()&&s(),null})),gW=["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"],mW=function(e){var t,l=e.canvas,a=e.set2DView,i=e.setNavigationView,n=e.resetView,c=e.zoomView,s=Xw(si),d=Xw(Gi),u=Xw(is),p=Xw(Vi),y=Xw(Pr),g=Xw(Sr),m=null!==(t=Xw(o.orthographic))&&void 0!==t&&t,w=Xw(an),x=Xw(Zr),v=Xw(Bc),b=Xw(Kc),A=Xw(ls),T=Xw($r),P=Xw(mn),S=Xw(wn),H=Xw($u),j=Xw(ef),z=Xw(As),R=Xw(on),D=Xw(Vu),W=.1,M=Object(r.useMemo)((function(){return{lng:p}}),[p]),I=function(e,t){return l&&(l.style.cursor="default"),b(e,t)},C=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=Zm.getRoofBoundaryVertices(o),n=Zm.getSolarPanelVerticesOnRoof(a,i);if(!Hp(n,r)||!jp(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&&!Ww.isSolarCollectorWithinHorizontalSurface(a,c))return Qh(me.t("message.MoveOutsideBoundaryCancelled",M)),!1}return!0},F=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,D===t.id&&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-W/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=C(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=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Xw.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&P(y.id,y.cx+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=W,D===t.id&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=W;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=W);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+W/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=W/r.lx)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=C(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=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Xw.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx+c.displacement)}};g(c),P(t.id,t.cx+l)}}}else{var d=W*e,u={name:"Move All Right",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.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=W,D===t.id&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=W;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=W);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+W/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=W/r.ly)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=C(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=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy+c.displacement)}};g(c),S(t.id,t.cy+l)}}}else{var d=W*e,u={name:"Move All Up",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},Y=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,D===t.id&&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-W/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=C(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=Xw.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Xw.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.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(h.a)(Xw.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Ww.isFoundationOrCuboid(l)||Ww.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var f,p=Object(h.a)(Xw.getState().elements);try{for(p.s();!(f=p.n()).done;){var y=f.value;(Ww.isFoundationOrCuboid(y)||Ww.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},L=function(e){Xw.getState().set((function(t){t.multiSelectionsMode=e}))},N=function(e){var t=w();switch(e){case"left":F(1);break;case"shift+left":F(.2);break;case"ctrl+shift+left":case"meta+shift+left":F(5);break;case"right":k(1);break;case"shift+right":k(.2);break;case"ctrl+shift+right":case"meta+shift+right":k(5);break;case"down":Y(1);break;case"shift+down":Y(.2);break;case"ctrl+shift+down":case"meta+shift+down":Y(5);break;case"up":O(1);break;case"shift+up":O(.2);break;case"ctrl+shift+up":case"meta+shift+up":O(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),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=I(t.id,!0);if(0===l.length)break;if(Ww.ifNeedListenToAutoDeletion(t))Nt.getState().setListenToAutoDeletionByCut(!0),bf.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(f.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(h.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&&I(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(h.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(f.a)(p.pastedElements)),e.selectedElement=p.pastedElements[0]}))}};g(p)}break;case"ctrl+alt+h":case"ctrl+home":if(!m){var x=Xw.getState().viewState.cameraPosition,T=Xw.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(f.a)(x),oldPanCenter:Object(f.a)(T),undo:function(){var e=Nt.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(f.a)(P.oldCameraPosition),t.panCenter=Object(f.a)(P.oldPanCenter)})))},redo:function(){n()}};g(P),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,e.viewState.orthographic=!1})),n()}}break;case"f2":case"ctrl+b":case"meta+b":!function(){if(!Xw.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:!Xw.getState().viewState.navigationView,undo:function(){i(!e.checked)},redo:function(){i(e.checked)}};g(e),i(!Xw.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:!Xw.getState().viewState.autoRotate,undo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=!e.checked}))},redo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.groupMasterId=null,t.viewState.autoRotate=e.checked}))}};g(e),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.groupMasterId=null,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,e.groupMasterId=null,window.history.pushState({},document.title,Ge),d&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.openModelsMap=!1}));break;case"ctrl+s":case"meta+s":bf.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":bf.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":bf.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":if(!t)break;if(t.locked)Kh(me.t("message.ThisElementIsLocked",M));else{var S=I(t.id,!1);if(0===S.length)break;if(Ww.ifNeedListenToAutoDeletion(t))Nt.getState().setListenToAutoDeletionByDelete(!0),bf.getState().setPrimitiveStore("selectedElementId",t.id);else{var R={name:"Delete",timestamp:Date.now(),deletedElements:S,selectedElementId:t.id,undo:function(){var e=R.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===R.selectedElementId}));if(t&&(s((function(l){var a;(a=l.elements).push.apply(a,Object(f.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,l.deletedRoofId=null})),t.type===V.Wall)){var l=t;l.leftJoints.length>0&&j(l.leftJoints[0],[l.id]),l.rightJoints.length>0&&H(l.rightJoints[0],[l.id])}}},redo:function(){var e=R.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===R.selectedElementId}));t&&I(t.id,!1)}}};g(R)}}break;case"ctrl+z":case"meta+z":if(y.hasUndo()){var W=y.undo();D===(null===t||void 0===t?void 0:t.id)&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),W&&Kh(me.t("menu.edit.Undo",M)+": "+W,qe),d&&s((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}break;case"ctrl+y":case"meta+y":if(y.hasRedo()){var C=y.redo();C&&Kh(me.t("menu.edit.Redo",M)+": "+C,qe),D===(null===t||void 0===t?void 0:t.id)&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),d&&s((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}break;case"shift":Xw.getState().viewState.navigationView&&bf.setState((function(e){e.navigationMoveSpeed=5*Xw.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=5*Xw.getState().minimumNavigationTurnSpeed})),z(!0);break;case"esc":var N=Xw.getState().addedFoundationId,U=Xw.getState().addedCuboidId,E=Xw.getState().addedWallId,J=Xw.getState().addedWindowId,G=Xw.getState().addedDoorId;N?b(N,!1):U?b(U,!1):E?b(E,!1):J?(b(J,!1),bf.getState().setPrimitiveStore("elementBeingCanceledId",J)):G&&(b(G,!1),bf.getState().setPrimitiveStore("elementBeingCanceledId",G)),s((function(e){e.objectTypeToAdd=V.None,e.actionModeLock=!1,e.moveHandleType=null,e.resizeHandleType=null,e.groupMasterId=null,e.groupActionMode=!1})),Nt.getState().setEnableOrbitController(!0),u();break;case"ctrl":L(!0)}};Object(r.useEffect)((function(){return function(){U.current=null}}),[]);var U=Object(r.useRef)(null);return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(pW.a,{handleKeys:gW,handleEventType:"keydown",onKeyEvent:function(e,t){t.preventDefault(),U.current!==e&&(U.current=e,N(e))}}),Object(pf.jsx)(pW.a,{handleKeys:gW,handleEventType:"keyup",onKeyEvent:function(e,t){t.preventDefault(),U.current=null,function(e){switch(e){case"shift":Xw.getState().viewState.navigationView&&bf.setState((function(e){e.navigationMoveSpeed=Xw.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=Xw.getState().minimumNavigationTurnSpeed})),z(!1);break;case"ctrl+o":case"meta+o":Xw.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":L(!1)}}(e)}}),Object(pf.jsx)(yW,{})]})},wW=n.a.memo(mW),xW=function(){var e=Xw(si),t=Xw(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(h.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 We.Vector3,g=new We.Vector3,m=Object(h.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(h.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(pf.jsx)(pf.Fragment,{})},vW=n.a.memo(xW),bW=l(805),AW=l(806),TW=function(e){var t=(new We.Vector3).subVectors(e.localToWorld(new We.Vector3(0,0,1e3)),e.position);return 0===t.x&&0===t.y&&e.getWorldDirection(t),t},PW=function(e){var t=document.getElementById("compassCanvas");if(t){var l=TW(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&&!bf.getState().isCameraUnderGround?bf.getState().setPrimitiveStore("isCameraUnderGround",!0):!o&&bf.getState().isCameraUnderGround&&bf.getState().setPrimitiveStore("isCameraUnderGround",!1)}},SW=function(){var e=Xw(si),t=Xw(o.orthographic),l=Xw(o.enableRotate),a=Xw(o.autoRotate),i=Xw(Tr),n=Xw(Kr),c=Xw(o.cameraPosition),s=Xw(o.cameraZoom),d=Xw(o.navigationView),u=bf(gi),f=bf(mi),h=d&&!t,p=Math.hypot(c[0],c[1],c[2]),y=(t?50*s:10*p)*n,g=Object(r.useMemo)((function(){return new We.Vector3(-y,-y,0)}),[y]),m=Object(r.useMemo)((function(){return new We.Vector3(y,y,y/2)}),[y]),w=Object(Se.f)(),x=w.gl,v=w.invalidate,b=w.get,A=w.set,T=(w.camera,Object(r.useMemo)((function(){var e=b().camera;return e.up.set(0,0,1),e}),[])),P=Object(r.useMemo)((function(){return x.domElement}),[]),S=Object(r.useRef)(null),H=Object(r.useRef)(null),j=Object(r.useRef)(null);Object(r.useEffect)((function(){Xw.getState().viewState.cameraPosition2D[2]<100&&e((function(e){e.viewState.cameraPosition2D[2]=150}))}),[]),Object(r.useEffect)((function(){S&&S.current&&Nt.setState((function(e){e.orbitControlsRef=S}))}),[]),Object(r.useEffect)((function(){S.current&&(S.current.addEventListener("change",z),S.current.addEventListener("start",R),S.current.addEventListener("end",D));var e=S.current;return function(){e&&(e.removeEventListener("change",z),e.removeEventListener("start",R),e.removeEventListener("end",D))}}),[]),Object(r.useEffect)((function(){var e=Xw.getState().viewState;if(S.current){if(H.current){var l,a,o=W(null!==(l=e.cameraPosition)&&void 0!==l?l:[0,0,20]),i=W(null!==(a=e.panCenter)&&void 0!==a?a:[0,0,0]);H.current.position.copy(o),H.current.lookAt(i),H.current.zoom=1,t||(S.current.object=H.current,S.current.target.copy(i))}if(j.current){var r,n,c=W(null!==(r=e.cameraPosition2D)&&void 0!==r?r:[0,0,1e3]).setZ(1e3),s=W(null!==(n=e.panCenter2D)&&void 0!==n?n:[0,0,0]);j.current.position.copy(c),j.current.rotation.set(0,0,0),j.current.lookAt(s),j.current.zoom=e.cameraZoom,t&&(S.current.object=j.current,S.current.target.copy(s))}S.current.update()}PW(b().camera)}),[i]),Object(r.useEffect)((function(){if(j.current&&H.current&&S.current){var e,l,a=Xw.getState().viewState,o=S.current,i=j.current,r=H.current;if(t)i.rotation.set(0,0,0),o.object=i,o.target.copy(W(null!==(e=a.panCenter2D)&&void 0!==e?e:[0,0,0])),A({camera:i});else o.object=r,o.target.copy(W(null!==(l=a.panCenter)&&void 0!==l?l:[0,0,0])),A({camera:r});PW(b().camera)}}),[t]),Object(r.useEffect)((function(){t&&S.current&&(j.current&&(j.current.zoom=s,S.current.object=j.current),z(),S.current.update())}),[s]);var z=function(){v(),Xw.getState().viewState.orthographic||(PW(b().camera),S.current&&S.current.target.clamp(g,m))},R=function(){bf.setState((function(e){e.duringCameraInteraction=!0}))},D=function(){bf.setState((function(e){e.duringCameraInteraction=!1})),e((function(e){if(S.current){var t=e.viewState,l=b().camera,a=l.position,o=S.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]):(t.cameraPosition=[a.x,a.y,a.z],t.panCenter=[o.x,o.y,o.z],e.cameraDirection=TW(l))}}))},W=function(e){return e&&Array.isArray(e)?new We.Vector3(e[0],e[1],e[2]):e&&null!==e.x?new We.Vector3(e.x,e.y,e.z):new We.Vector3(0,0,5)};Object(Se.d)((function(e){a&&S.current&&S.current.update()}));var M=Nt((function(e){return e.compassRef}));return Object(r.useEffect)((function(){PW(b().camera)}),[M]),Object(r.useEffect)((function(){S.current&&(h?S.current.listenToKeyEvents(window):S.current.removeKeyEvents())}),[h]),Object(r.useEffect)((function(){if(S.current)if(h){var e=b().camera;e.position.z=3,e.lookAt(0,0,2)}else S.current.update()}),[h]),Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(bW.a,{ref:H,fov:45,far:ct,up:[0,0,1]}),Object(pf.jsx)(AW.a,{ref:j,up:[0,0,1]}),Object(pf.jsx)("myOrbitControls",{ref:S,args:[T,P],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})]})},HW=n.a.memo(SW),jW=l(807),zW=l(808),RW=l(809),DW=l(810),WW=l(811),MW=l(812),IW=l(813),CW=l(814),FW=l(815),kW=l(816),OW=l(817),YW=l(818),LW=Tv.a.div(jz||(jz=Object(Av.a)(["\n display: flex;\n flex-direction: column;\n z-index: 999;\n"]))),NW=function(e){var t=e.style,l=e.size,a=e.margin,o=e.round,i=e.handleShareWindowClose,r=Xw(di),n=Xw(Vi),c=Xw(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(pf.jsxs)(LW,{style:t,children:[Object(pf.jsx)(jW.a,{url:h,title:u,via:f,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(zW.a,{size:l,round:o})}),Object(pf.jsx)(RW.a,{url:h,quote:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(DW.a,{size:l,round:o})}),Object(pf.jsx)(WW.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(MW.a,{size:l,round:o})}),Object(pf.jsx)(IW.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(CW.a,{size:l,round:o})}),Object(pf.jsx)(FW.a,{url:h,title:u,summary:f,source:me.t("name.IFI",d),style:{paddingRight:a},onShareWindowClose:i,children:Object(pf.jsx)(kW.a,{size:l,round:o})}),Object(pf.jsx)(OW.a,{url:h,title:u,onShareWindowClose:i,children:Object(pf.jsx)(YW.a,{size:l,round:o})})]})},UW=n.a.memo(NW),EW=function(){function e(t,l,a){if(Object(je.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(f){r.e(f)}finally{r.f()}var c=null;do{o=Math.random()*t,i=0;var s,d=Object(h.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(f){d.e(f)}finally{d.f()}}while(null===c);return a&&c?new VW(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 VW(this.survivors[o],this.survivors[i])}},{key:"mutate",value:function(e){if(!Ww.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}(),GW=function(){function e(t,l,a,o,i,r,n,c,s,d){Object(je.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=F.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 JW(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}(),XW=function(){function e(){Object(je.a)(this,e)}return Object(ke.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}(),BW=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 f;Object(je.a)(this,l),(f=t.call(this,a,o,i,r,e.length,n,c,s,d)).solarPanels=void 0,f.solarPanels=e;var p,y=f.population.individuals[0],g=Object(h.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),f.searchMethod===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var b=1;b1;)T=XW.gaussian()*f.localSearchRadius+v;A.setGene(w,T)}f.geneNames[w]="Tilt Angle ("+x.id+")"}}catch(P){g.e(P)}finally{g.f()}return f}return Object(ke.a)(l,[{key:"applyFittest",value:function(){var e=this.population.getFittest();if(e){for(var t=0;t0&&(T.current=Object(f.a)(j.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(bf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);j.current.length=0;var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;j.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(h.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 BW(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,H.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&&(H.current=P.current.evolveIndividual(S.current%w.populationSize,function(){var e=0;switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:var t,l=Af.getState().dailyPvYield,a=Object(h.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(f){a.e(f)}finally{a.f()}break;case M.YEARLY_TOTAL_OUTPUT:var n,c=Af.getState().yearlyPvYield,s=Object(h.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(f){s.e(f)}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(H.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"+(H.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:BW.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){bf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.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 M.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1);break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}var t,l=Object(h.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(h.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&&bf.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(pf.jsx)(pf.Fragment,{})},qW=n.a.memo(KW),QW=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(je.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 H=n[0];if(n.length>1){var j=S.population.individuals[0],z=S.maximumTiltAngle===S.minimumTiltAngle?0:(H.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);j.setGene(0,z);var R=n[1],D=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(H.cx-R.cx)*S.foundation.lx:Math.abs(H.cy-R.cy)*S.foundation.ly,W=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(D-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);W<0?W=0:W>1&&(W=1),j.setGene(1,W);var M=c?c.rowsPerRack:Math.max(1,Math.round(H.ly/(H.orientation===$.portrait?e.length:e.width))),I=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(M-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);I<0?I=0:I>1&&(I=1),j.setGene(2,I)}}return S}return Object(ke.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Ww.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:return"kWh";case M.YEARLY_PROFIT:case M.DAILY_PROFIT:return"dollars"}return null}},{key:"individualToString",value:function(e){var t="F("+Ww.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=ZS.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(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Ww.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),F.current.length>0&&(C.current=Object(f.a)(F.current),N(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){j.current=s,s?(cancelAnimationFrame(S.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",k))):(bf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&O){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),H.current=!1;var n=p(V.SolarPanel,O.id);F.current.length=0;var c,s=Object(h.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;F.current.push(JSON.parse(JSON.stringify(d)))}}catch(y){s.e(y)}finally{s.f()}z.current=new QW(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,F.current,P,u,O,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(f.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:var l,a=Af.getState().dailyPvYield,i=Object(h.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 M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:var c,s=Af.getState().yearlyPvYield,d=Object(h.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var f in u)u.hasOwnProperty(f)&&"Total"===f&&(t+=u[f])}}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 M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case M.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case M.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&&!j.current){if(D.current||z.current.outsideGenerationCounter>=b.maximumGenerations){if(cancelAnimationFrame(S.current),H.current=!0,C.current.length>0&&v(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),N(!0),Kh(me.t("message.EvolutionCompleted",k)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",k):me.t("message.MaximumNumberOfGenerationsHasBeenReached",k))),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)),N(!1)}),100)}},N=function(e){bf.setState((function(t){switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(f.a)(C.current))})),e&&bf.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(pf.jsx)(pf.Fragment,{})},_W=n.a.memo(ZW),$W=function(){function e(t,l){Object(je.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}(),tM=function(){function e(t,l,a,o,i,r,n,c,s){Object(je.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=F.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.swarm=new eM(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}(),lM=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 f;Object(je.a)(this,l),(f=t.call(this,a,o,i,r,n,e.length,c,s,d)).solarPanels=void 0,f.solarPanels=e;var p,y=f.swarm.particles[0],g=Object(h.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,f.searchMethod===F.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var v=1;v1;)A=XW.gaussian()*f.localSearchRadius+x;b.position[w]=A}}}catch(T){g.e(T)}finally{g.f()}return f}return Object(ke.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(f.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(f.a)(j.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(bf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);j.current.length=0;var l,a=Object(h.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;j.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(h.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 lM(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,H.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&&(H.current=P.current.updateParticle(S.current%w.swarmSize,function(){var e=0;switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:var t,l=Af.getState().dailyPvYield,a=Object(h.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(f){a.e(f)}finally{a.f()}break;case M.YEARLY_TOTAL_OUTPUT:var n,c=Af.getState().yearlyPvYield,s=Object(h.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(f){s.e(f)}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(H.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"+(H.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:lM.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){bf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}var t,l=Object(h.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(h.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&&bf.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(pf.jsx)(pf.Fragment,{})},oM=n.a.memo(aM),iM=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(je.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 H=n[0];if(n.length>1){var j=S.swarm.particles[0];j.position[0]=S.maximumTiltAngle===S.minimumTiltAngle?0:(H.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);var z=n[1],R=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(H.cx-z.cx)*S.foundation.lx:Math.abs(H.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),j.position[1]=D;var W=c?c.rowsPerRack:Math.max(1,Math.round(H.ly/(H.orientation===$.portrait?e.length:e.width))),M=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(W-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);M<0?M=0:M>1&&(M=1),j.position[2]=M}}return S}return Object(ke.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Ww.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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:return"kWh";case M.YEARLY_PROFIT:case M.DAILY_PROFIT:return"dollars"}return null}},{key:"particleToString",value:function(e,t){var l="F("+Ww.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=ZS.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(h.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Ww.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(f.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),F.current.length>0&&(C.current=Object(f.a)(F.current),N(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){j.current=s,s?(cancelAnimationFrame(S.current),bf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",k))):(bf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&O){bf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),H.current=!1;var n=p(V.SolarPanel,O.id);F.current.length=0;var c,s=Object(h.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;F.current.push(JSON.parse(JSON.stringify(d)))}}catch(f){s.e(f)}finally{s.f()}z.current=new iM(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,F.current,P,u,O,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 M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:var l,a=Af.getState().dailyPvYield,i=Object(h.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 M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:var c,s=Af.getState().yearlyPvYield,d=Object(h.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var f in u)u.hasOwnProperty(f)&&"Total"===f&&(t+=u[f])}}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 M.DAILY_AVERAGE_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case M.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case M.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&&!j.current){if(D.current||z.current.outsideStepCounter>=b.maximumSteps){if(cancelAnimationFrame(S.current),H.current=!0,C.current.length>0&&g(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),N(!0),Kh(me.t("message.EvolutionCompleted",k)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",k):me.t("message.MaximumNumberOfStepsHasBeenReached",k))),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)),N(!1)}),100)}},N=function(e){bf.setState((function(t){switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case M.DAILY_TOTAL_OUTPUT:case M.DAILY_AVERAGE_OUTPUT:case M.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case M.YEARLY_TOTAL_OUTPUT:case M.YEARLY_AVERAGE_OUTPUT:case M.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(f.a)(C.current))})),e&&bf.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(pf.jsx)(pf.Fragment,{})},nM=n.a.memo(rM),cM=function(){var e=Xw(ns),t=Xw(Iu),l=Xw(Fu);return Object(Se.f)().gl.domElement.style.cursor=e!==V.None||l||t?"crosshair":"default",null},sM=n.a.memo(cM),dM=function(e){var t=e.width,l=void 0===t?400:t,a=e.height,n=void 0===a?400:a,c=Xw(si),s=Xw(Sr),d=Xw(i.latitude),f=Xw(i.longitude),p=Xw(o.mapZoom),y=Xw(o.mapTilt),g=Xw(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,f);(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(h.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($y.throttle)((function(){if(x){var e=x.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==d||l!==f){T();var a={name:"Set Location",timestamp:Date.now(),oldLatitude:d,newLatitude:t,oldLongitude:f,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($y.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(pf.jsx)(GR.a,{mapContainerStyle:{border:"1px solid",width:l+"px",height:n+"px"},mapTypeId:g,center:{lat:d,lng:f},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}))}}}})},uM=n.a.memo(dM),fM=["places"],hM=Tv.a.div(zz||(zz=Object(Av.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"]))),pM=Tv.a.div(Rz||(Rz=Object(Av.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"]))),yM=Tv.a.div(Dz||(Dz=Object(Av.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"]))),gM=function(){var e=Xw(Vi),t=Xw(si),l=Xw(Sr),a=Xw(i.address),c=Xw(i.latitude),s=Xw(i.longitude),d=Xw(o.mapPanelX),f=Xw(o.mapPanelY),p=Xw(o.groundImage),y=Xw(o.mapZoom),g=Xw(Ei),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(f)?0:Math.min(f,window.innerHeight-b)}),T=Object(u.a)(A,2),P=T[0],S=T[1],H=Object(r.useState)(!1),j=Object(u.a)(H,2),z=j[0],R=j[1],D={lng:e};Object(r.useEffect)((function(){var e=function(){S({x:Math.min(d,window.innerWidth-v),y:Math.min(f,window.innerHeight-b)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var W=Object(GR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:fM}),M=W.isLoaded,I=W.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(pf.jsx)(qT.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(pf.jsx)(hM,{ref:m,style:{zIndex:"mapPanel"===g?Ke:10},children:Object(pf.jsxs)(pM,{ref:x,children:[Object(pf.jsxs)(yM,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("word.Location",D)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){C()},onMouseDown:function(){C()},children:me.t("word.Close",D)})]}),Object(pf.jsxs)(Pv.b,{direction:"vertical",children:[Object(pf.jsx)(Pv.b,{style:{paddingTop:"10px"},align:"center",size:20,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",children:[Object(pf.jsx)(Pv.b,{children:me.t("mapPanel.ImageOnGround",D)+":"}),Object(pf.jsx)(ib.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}))}})]})}),M&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:Object(pf.jsx)(GR.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(h.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(pf.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"}})})})}),M?Object(pf.jsx)(Pv.b,{children:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(uM,{width:400,height:400}),Object(pf.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(pf.jsx)(Iv,{}),I&&Object(pf.jsx)(Pv.b,{children:Object(pf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})})]})]})})})},mM=n.a.memo(gM),wM=l(348),xM=l(819),vM=l(68),bM=l.n(vM),AM=Tv.a.div(Wz||(Wz=Object(Av.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"]))),TM=Tv.a.div(Mz||(Mz=Object(Av.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"]))),PM=Tv.a.div(Iz||(Iz=Object(Av.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"]))),SM=function(){var e=Xw(Vi),t=Xw(si),l=Xw(Sr),a=Xw(i.date),c=Xw(i.latitude),s=Xw(i.address),d=bf(Wr),f=Xw(Mr),h=bf(Lr),p=Xw(o.showSunAngles),y=Xw(o.heliodon),g=Xw(o.heliodonPanelX),m=Xw(o.heliodonPanelY),w=Xw(Ei),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)}),H=Object(u.a)(S,2),j=H[0],z=H[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useMemo)((function(){return new Date(a)}),[a]),C=Object(r.useMemo)((function(){return Dy(I,c)}),[I,c]),F={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(k),function(){cancelAnimationFrame(v.current)}}),[d]),Object(r.useEffect)((function(){d&&0===C.sunset&&(cancelAnimationFrame(v.current),bf.setState((function(e){e.animateSun=!1})))}),[C.sunset]);var k=function e(){var t=Xw.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=Dy(I,Xw.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),O(I,!1),b.current=l}}else cancelAnimationFrame(v.current)},O=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($y.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})),M(!W)},redo:function(){t((function(e){e.world.latitude=a.newLatitude,e.world.address=a.newAddress})),M(!W)}};l(a),t((function(t){t.world.latitude=e,t.world.address=""}))}),500,{leading:!1,trailing:!0}));return Object(pf.jsx)(qT.a,{nodeRef:x,handle:".handle",bounds:"parent",axis:"both",position:j,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(pf.jsx)(AM,{ref:x,style:{zIndex:"heliodonPanel"===w?Ke:11},children:Object(pf.jsxs)(TM,{ref:A,children:[Object(pf.jsxs)(PM,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("heliodonPanel.SunAndTimeSettings",F)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Y()},onMouseDown:function(){Y()},children:me.t("word.Close",F)})]}),Object(pf.jsxs)(Pv.b,{style:{padding:"20px"},align:"baseline",size:20,children:[Object(pf.jsxs)("div",{children:[me.t("menu.settings.Heliodon",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)("div",{children:[Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.SunAngles",F)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("div",{children:[me.t("word.Animate",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.a,{checked:d,onChange:function(e){var t={name:"Animate Heliodon",timestamp:Date.now(),checked:!d,undo:function(){bf.setState((function(e){e.animateSun=!t.checked}))},redo:function(){bf.setState((function(e){e.animateSun=t.checked}))}};l(t),bf.setState((function(t){t.animateSun=e}))}})]}),d&&Object(pf.jsxs)("div",{children:[Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.TwentyFourHours",F)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ib.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(pf.jsxs)("div",{children:[me.t("word.Date",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(wM.a,{disabled:h,value:bM()(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(pf.jsxs)("div",{children:[me.t("word.Time",F),Object(pf.jsx)("br",{}),Object(pf.jsx)(xM.a,{disabled:h,value:bM()(I,"HH:mm"),format:"HH:mm",onChange:function(e){e&&(null===O||void 0===O||O(e.toDate(),!0))}})]}),!h&&Object(pf.jsxs)("div",{children:[me.t("word.Latitude",F),": ",c.toFixed(2),"\xb0",Object(pf.jsx)(oH.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})]})]})]})})})},HM=n.a.memo(SM),jM=l(285),zM=l(822),RM=l(823),DM=l(239),WM=l(824),MM=l(554),IM=l(135),CM=l(125),FM=l(136),kM=l(234),OM=["title","titleId"];function YM(){return(YM=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 NM(e,t){var l=e.title,a=e.titleId,o=LM(e,OM);return r.createElement("svg",YM({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,Cz||(Cz=r.createElement("defs",null,r.createElement("style",{type:"text/css"}))),Fz||(Fz=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})),kz||(kz=r.createElement("path",{d:"M347.505182 165.510915h552.305182v139.99559H347.505182z","p-id":5969})),Oz||(Oz=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})),Yz||(Yz=r.createElement("path",{d:"M347.505182 442.115105h552.305182v139.99559H347.505182z","p-id":5971})),Lz||(Lz=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})),Nz||(Nz=r.createElement("path",{d:"M347.505182 718.719294h552.305182v139.99559H347.505182z","p-id":5973})))}var UM,EM,VM=r.forwardRef(NM),JM=(l.p,Object(Tv.a)(VM)(UM||(UM=Object(Av.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"])))),GM=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.changeHorizontalGrid,o=e.changeVerticalGrid,i={lng:Xw(Vi)},n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===a||void 0===a||a(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",i)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===o||void 0===o||o(!l)},children:me.t("menu.graph.ShowVerticalGridLines",i)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:f,placement:"bottomRight",visible:s,onVisibleChange:function(e){d(e)},children:Object(pf.jsx)(JM,{style:{right:"32px"},onClick:function(e){e.stopPropagation()}})})})},XM=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],H=P[1],j=Object(r.useState)(!0),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[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 F=Object(r.useMemo)((function(){for(var e=[],l=0;l1&&Object(pf.jsx)(kM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})}),Object(pf.jsx)(GM,{horizontalGrid:S,verticalGrid:R,changeHorizontalGrid:function(e){H(e)},changeVerticalGrid:function(e){D(e)}})]})})})},BM=l(290),KM=l(291),qM=l(825),QM=l(826),ZM=["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"}(EM||(EM={}));var _M,$M,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,HI,jI,zI,RI,DI,WI,MI,II,CI,FI,kI,OI,YI,LI,NI,UI,EI,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=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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.jsx)("circle",{cx:"0",cy:"0",r:"3",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);return t&&l&&i>0&&i%d===0?Object(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.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},HC=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 EM.UP:f="-4,2.5,4,2.5,0,-3.5";break;case EM.LEFT:f="2.5,4,2.5,-4,-3.5,0";break;case EM.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(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.jsx)("polygon",{points:f,style:{opacity:a,stroke:o,fill:null!==d&&void 0!==d?d:"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);return t&&l&&i>0&&i%d===0?Object(pf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(pf.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},zC=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(pf.jsx)("svg",{x:t-100*u,y:l-100*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(pf.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},RC=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(pf.jsx)("svg",{x:t-150*u,y:l-150*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(pf.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},DC=function(e,t,l,a,o){switch(e){case"circle":return Object(pf.jsx)(PC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"square":return Object(pf.jsx)(SC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"triangle up":return Object(pf.jsx)(HC,{scale:1.1*t,numberOfSymbols:l,direction:EM.UP,opacity:a,fillColor:o});case"triangle down":return Object(pf.jsx)(HC,{scale:1.1*t,numberOfSymbols:l,direction:EM.DOWN,opacity:a,fillColor:o});case"triangle right":return Object(pf.jsx)(HC,{scale:1.1*t,numberOfSymbols:l,direction:EM.RIGHT,opacity:a,fillColor:o});case"triangle left":return Object(pf.jsx)(HC,{scale:1.1*t,numberOfSymbols:l,direction:EM.LEFT,opacity:a,fillColor:o});case"star":return Object(pf.jsx)(zC,{scale:1.25*t,numberOfSymbols:l,opacity:a,fillColor:o});case"diamond":return Object(pf.jsx)(jC,{scale:1.1*t,numberOfSymbols:l,opacity:a,fillColor:o});case"hexagon":return Object(pf.jsx)(RC,{scale:1.3*t,numberOfSymbols:l,opacity:a,fillColor:o})}},WC=Object(Tv.a)(VM)(_M||(_M=Object(Av.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"]))),MC=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:Xw(Vi)},h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.LineWidth",f)+":",Object(pf.jsx)(oH.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*o,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",f)+":",Object(pf.jsx)(oH.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*i,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",f)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",f)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:m,placement:"bottomRight",visible:y,onVisibleChange:function(e){g(e)},children:Object(pf.jsx)(WC,{style:{right:a>1?"25px":"32px"},onClick:function(e){e.stopPropagation()}})})})},IC=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,H=Object(r.useState)(0),j=Object(u.a)(H,2),z=j[0],R=j[1],D=Object(r.useState)(!0),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useState)(!0),F=Object(u.a)(C,2),k=F[0],O=F[1],N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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,E]),$=function(e){},ee=function(e){V(e.dataKey)},te=function(e){V(null)};return Object(pf.jsx)(pf.Fragment,{children:i&&Object(pf.jsx)("div",{id:"line-graph-"+d+"-"+f,style:{width:"100%",height:"".concat(c,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(pf.jsx)(zM.a,{width:"100%",height:"100%",children:a===Y.Area?Object(pf.jsxs)(qM.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(DM.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(pf.jsx)(WM.a,{vertical:k,horizontal:M,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(MM.a,{x:b,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(IM.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(pf.jsx)(CM.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(FM.a,{domain:[g,w],fontSize:"10px",children:Object(pf.jsx)(CM.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(pf.jsx)(kM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]}):Object(pf.jsxs)(QM.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(DM.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(pf.jsx)(WM.a,{vertical:k,horizontal:M,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(MM.a,{x:b,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(IM.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(pf.jsx)(CM.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(FM.a,{domain:[g,w],fontSize:"10px",children:Object(pf.jsx)(CM.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(pf.jsx)(kM.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]})}),Object(pf.jsx)(MC,{lineCount:z,symbolSize:Q,lineWidth:X,horizontalGrid:M,verticalGrid:k,changeHorizontalGrid:function(e){I(e)},changeVerticalGrid:function(e){O(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)}})]})})})},CC=Tv.a.div($M||($M=Object(Av.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"]))),FC=Tv.a.div(eI||(eI=Object(Av.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"]))),kC=Tv.a.div(tI||(tI=Object(Av.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"]))),OC=function(e){var t,l=e.city,a=e.graphs,c=Xw(Vi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=Xw(Sr),h=new Date(Xw(i.date)),p=Xw(Is),y=Xw(o.weatherPanelRect),g=Xw(Ei),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],H={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 Ft(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 j=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",H),me.t("word.Temperature",H),me.t("weatherPanel.SunshineHours",H)],D=["NA","\xb0C","\xb0C",me.t("word.Hour",H)],W=it[h.getMonth()],M=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(pf.jsx)(qT.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 Ft(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(pf.jsx)(CC,{ref:m,style:{zIndex:"weatherPanel"===g?Ke:10},children:Object(pf.jsxs)(FC,{ref:w,style:{opacity:s,width:(y?y.width:500)+"px",height:(y?y.height:500)+"px"},children:[Object(pf.jsxs)(kC,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("word.Weather",H)+": "+((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(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){M()},onMouseDown:function(){M()},children:me.t("word.Close",H)})]}),Object(pf.jsx)(pf.Fragment,{children:a.map((function(e){return e===L.SunshineHours?Object(pf.jsx)(XM,{type:e,dataSource:z[e],height:j,dataKeyAxisX:"Month",labelX:me.t("word.Month",H),labelY:R[e],unitY:D[e],yMin:0,fractionDigits:1,referenceX:W,color:"#FFD700"},e):Object(pf.jsx)(IC,{chartType:Y.Line,type:e,dataSource:z[e],height:j,dataKeyAxisX:"Month",labelX:me.t("word.Month",H),labelY:R[e],unitY:D[e],fractionDigits:1,referenceX:W},e)}))})]})})})},YC=n.a.memo(OC),LC=l(855),NC=l(856),UC=l(857),EC=l(858),VC=["Daylight","Clearness"],JC=Tv.a.div(lI||(lI=Object(Av.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"]))),GC=Tv.a.div(aI||(aI=Object(Av.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"]))),XC=Tv.a.div(oI||(oI=Object(Av.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"]))),BC=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=new Date(Xw(i.date)),h=Af(Au),p=Af(Pu),y=Xw(o.yearlyLightSensorPanelRect),g=Xw(ss),m=Xw(o.yearlyLightSensorPanelShowDaylight),w=Xw(o.yearlyLightSensorPanelShowClearness),x=Xw(Ei),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)(),H=P.current?P.current.clientWidth+40:y?y.width+40:640,j=P.current?P.current.clientHeight+100:y?y.height+100:600,z=Object(r.useState)({x:y?Math.max(y.x,H-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=n.a.useRef(null),I={lng:a},C=it[f.getMonth()];Object(r.useEffect)((function(){W({x:Math.max(null===y||void 0===y?void 0:y.x,H-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-j)})}),[y,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===y||void 0===y?void 0:y.x,H-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-j)})};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 Ft(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,H,j]);var F=function(){d((function(e){e.viewState.showYearlyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Yearly Light Sensor Graph",timestamp:(new Date).getTime()})}))},k=me.t("word.Month",I),O=me.t("word.Radiation",I),N=!h||!h[0]||0===Object.keys(h[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:M,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ft(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="yearlyLightSensorPanel"}))},children:Object(pf.jsx)(JC,{ref:M,style:{zIndex:"yearlyLightSensorPanel"===x?Ke:9},children:Object(pf.jsxs)(GC,{ref:P,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:500)+"px"},children:[Object(pf.jsxs)(XC,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",I)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",I)+" "+l+" | "+f.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){F()},onMouseDown:function(){F()},children:me.t("word.Close",I)})]}),m&&Object(pf.jsx)(IC,{type:L.DaylightData,chartType:Y.Area,dataSource:h.map((function(e){return{Month:e.Month,Daylight:e.Daylight}})),height:100,dataKeyAxisX:"Month",labelX:k,labelY:me.t("word.Daylight",I),unitY:me.t("word.Hour",I),yMin:0,curveType:"linear",fractionDigits:1,referenceX:C}),w&&Object(pf.jsx)(XM,{type:L.ClearnessData,dataSource:h.map((function(e){return{Month:e.Month,Clearness:e.Clearness}})),height:100,dataKeyAxisX:"Month",labelX:k,labelY:me.t("yearlyLightSensorPanel.SkyClearness",I),unitY:"%",yMin:0,yMax:100,fractionDigits:1,referenceX:C,color:"#66CDAA"}),A&&Object(pf.jsx)(IC,{type:L.YearlyRadiationSensorData,chartType:Y.Line,dataSource:h.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,VC)})),labels:p,height:100,dataKeyAxisX:"Month",labelX:k,labelY:O,unitY:"kWh/m\xb2/"+me.t("word.Day",I),yMin:0,curveType:"linear",fractionDigits:2,referenceX:C}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",padding:"10px",direction:"ltr"},children:[Object(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.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(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.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(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(ib.a,{title:me.t("yearlyLightSensorPanel.ShowAverageDailySolarRadiation",I),checked:A,onChange:function(e){T(e)}}),me.t("word.Radiation",I)]}),Object(pf.jsxs)(Pv.b,{children:[Object(pf.jsx)(Sv.a,{type:"default",icon:N?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(N?"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()})})),bf.setState((function(e){e.runYearlyLightSensor=!0,e.pauseYearlyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",I))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",I),onClick:function(){_h("line-graph-"+k+"-"+O,"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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})]})})})},KC=n.a.memo(BC),qC=Tv.a.div(iI||(iI=Object(Av.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"]))),QC=Tv.a.div(rI||(rI=Object(Av.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"]))),ZC=Tv.a.div(nI||(nI=Object(Av.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"]))),_C=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=new Date(Xw(i.date)),h=Af(Pu),p=Af(vu),y=Xw(o.dailyLightSensorPanelRect),g=Xw(ss),m=Xw(Ei),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],H=P[1],j={lng:a};Object(r.useEffect)((function(){H({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(){H({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 Ft(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",j),D=me.t("word.Radiation",j),W=!p||!p[0]||0===Object.keys(p[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){H({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 Ft(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(pf.jsx)(qC,{ref:w,style:{zIndex:"dailyLightSensorPanel"===m?Ke:9},children:Object(pf.jsxs)(QC,{ref:x,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:360)+"px"},children:[Object(pf.jsxs)(ZC,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",j)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",j)+" "+l+" | "+bM()(f).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",j)})]}),Object(pf.jsx)(IC,{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(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(pf.jsx)(Sv.a,{type:"default",icon:W?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(W?"word.Run":"word.Update",j),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",j)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailyLightSensor=!0,e.pauseDailyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",j))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("line-graph-"+R+"-"+D,"daily-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),p&&p.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",j),onClick:function(){$h(p,"daily-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",j)),c&&d((function(e){e.actionInfo={name:"Export Daily Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},$C=n.a.memo(_C),eF=Tv.a.div(cI||(cI=Object(Av.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"]))),tF=Tv.a.div(sI||(sI=Object(Av.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"]))),lF=Tv.a.div(dI||(dI=Object(Av.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"]))),aF=GT.a.TextArea,oF=function(){var e,t=Xw(Vi),l=Xw(Sr),a=null!==(e=Xw(Ui))&&void 0!==e?e:Qe,i=Xw(si),c=Xw(Oi),s=Xw(o.stickyNotePanelRect),d=Xw(Ei),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 Ft(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 H=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(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(qT.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 Ft(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(pf.jsx)(eF,{ref:f,style:{zIndex:"stickyNotePanel"===d?Ke:12},children:Object(pf.jsxs)(tF,{ref:h,style:{opacity:a,width:(s?s.width:400)+"px",height:(s?s.height:300)+"px"},children:[Object(pf.jsxs)(lF,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("menu.view.accessories.Note",S)}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){H()},onTouchStart:function(){H()},children:me.t("word.Close",S)})]}),Object(pf.jsx)(aF,{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}))}})]})})})})},iF=n.a.memo(oF),rF=Tv.a.div(uI||(uI=Object(Av.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"]))),nF=Tv.a.div(fI||(fI=Object(Av.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"]))),cF=function(){var e,t,l=Xw(Vi),a=Xw(Ls),i=null!==(e=Xw(o.orthographic))&&void 0!==e&&e,r=null!==(t=Xw(o.navigationView))&&void 0!==t&&t,n={lng:l},c=a.y>0?"navajowhite":"antiquewhite",s=Ww.isMac();return Object(pf.jsx)(rF,{children:Object(pf.jsxs)(nF,{style:{color:c,fontSize:"9px"},children:[!i&&Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Rotate",n)}),": ",me.t("instructionPanel.DragMouse",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Zoom",n)}),":"," ",me.t(s?"instructionPanel.MouseWheelOrKeysMac":"instructionPanel.MouseWheelOrKeys",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Pan",n)}),":"," ",me.t(s?"instructionPanel.HoldMetaDragMouse":"instructionPanel.HoldCtrlDragMouse",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t(i?"instructionPanel.Exit2DMode":"instructionPanel.Enter2DMode",n)}),":"," ",me.t("word.Press",n)," ",s?"\u2318":"Ctrl","+B"]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t(r?"instructionPanel.DisableNavigation":"instructionPanel.EnableNavigation",n)}),": ",me.t("word.Press",n)," ",s?"\u2318":"Ctrl","+U"]}),r&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Move",n)}),": ",me.t("instructionPanel.MoveInstruction",n)]}),Object(pf.jsxs)("span",{children:[Object(pf.jsx)("b",{children:me.t("instructionPanel.Turn",n)}),": ",me.t("instructionPanel.TurnInstruction",n)]})]})]})})},sF=n.a.memo(cF),dF=l(859),uF=["Daylight","Clearness"],fF=Tv.a.div(hI||(hI=Object(Av.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=Tv.a.div(pI||(pI=Object(Av.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=Tv.a.div(yI||(yI=Object(Av.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=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.daysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(ed),w=Xw(td),x=Af(ad),v=Xw(ss),b=Xw(o.yearlyPvYieldPanelRect),A=bf(Er),T=Xw.getState().economicsParams,P=bf(gs),S=Xw(Ei),H=n.a.useRef(null),j=Object(r.useRef)(null),z=j.current?j.current.clientWidth+40:640,R=j.current?j.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}),W=Object(u.a)(D,2),M=W[0],I=W[1],C=Object(r.useState)(0),F=Object(u.a)(C,2),k=F[0],O=F[1],N=Object(r.useRef)(new Map),U=Object(r.useRef)(),E=it[g.getMonth()],J={lng:c},G=v(V.SolarPanel);Object(r.useEffect)((function(){var e=0;N.current.clear();var t,l=Object(h.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],N.current.set(o,(null!==(i=N.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(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),j.current&&(U.current||(U.current=new ResizeObserver((function(){p((function(e){j.current&&(e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.width=j.current.offsetWidth,e.viewState.yearlyPvYieldPanelRect.height=j.current.offsetHeight)}))}))),U.current.observe(j.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=Ww.countAllSolarPanels(),Q=12/y,Z=k*Q,_=q*T.operationalCostPerUnit*365,$=Z*T.electricitySellingPrice,ee=$-_,te=!m||!m[0]||0===Object.keys(m[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:H,handle:".handle",bounds:"parent",axis:"both",position:M,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 Ft(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(pf.jsx)(fF,{ref:H,style:{zIndex:"yearlyPvYieldPanel"===S?Ke:9},children:Object(pf.jsxs)(hF,{ref:j,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(pF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelYearlyYield",J)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",J)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){X()},onMouseDown:function(){X()},children:me.t("word.Close",J)})]}),Object(pf.jsx)(IC,{type:L.YearlyPvYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,uF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:B,labelY:K,unitY:me.t("word.kWh",J),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!P&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&G>1&&N.current.size>0?Object(pf.jsx)(xD.a,{title:me.t("shared.OutputBreakdown",J),content:Object(f.a)(N.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*Q).toFixed(2)})]}),t===N.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",J)})}):Object(pf.jsxs)(pf.Fragment,{children:[Z>0&&Object(pf.jsx)(Pv.b,{children:me.t("solarPanelYieldPanel.YearlyTotal",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)}),Z>0&&Object(pf.jsx)(xD.a,{title:me.t("shared.MoreResults",J),content:Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",J)+": "}),Object(pf.jsx)(BT.a,{span:10,children:q})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:[(Z/q).toFixed(2)," kWh"]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",_.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",J)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",$.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",J)+": "}),Object(pf.jsx)(BT.a,{span:10,children:(ee>0?"$":"-$")+Math.abs(ee).toFixed(2)})]})]}),children:Object(pf.jsx)(Sv.a,{type:"default",children:me.t("shared.MoreResults",J)})})]}),!A&&Object(pf.jsxs)(pf.Fragment,{children:[G>1&&Object(pf.jsx)(ib.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",J),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:te?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})]})})})},gF=n.a.memo(yF),mF=Tv.a.div(gI||(gI=Object(Av.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=Tv.a.div(mI||(mI=Object(Av.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=Tv.a.div(wI||(wI=Object(Av.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=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(Zs),m=Xw(_s),w=Xw(o.dailyPvYieldPanelRect),x=Af(ad),v=bf(Er),b=Xw.getState().economicsParams,A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=S.current?S.current.offsetWidth+40:w?w.width+40:640,j=S.current?S.current.offsetHeight+100:w?w.height+100:500,z=Object(r.useState)({x:w?Math.max(w.x,H-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useRef)(new Map),O=Object(r.useRef)(),N={lng:a};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(h.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],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)}),[g]),Object(r.useEffect)((function(){W({x:Math.max(null===w||void 0===w?void 0:w.x,H-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===w||void 0===w?void 0:w.x,H-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),S.current&&(O.current||(O.current=new ResizeObserver((function(){d((function(e){S.current&&(e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.width=S.current.offsetWidth,e.viewState.dailyPvYieldPanelRect.height=S.current.offsetHeight)}))}))),O.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=O.current)||void 0===t||t.disconnect()}}),[w,H,j]);var U=function(){d((function(e){e.viewState.showDailyPvYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.SolarPanel);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1)}))}),[E,m]);var J=me.t("word.Hour",N),G=me.t("solarPanelYieldPanel.YieldPerHour",N),X=Ww.countAllSolarPanels(),B=X*b.operationalCostPerUnit,K=C*b.electricitySellingPrice,q=K-B,Q=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ft(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.dailyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyPvYieldPanel"}))},children:Object(pf.jsx)(mF,{ref:P,style:{zIndex:"dailyPvYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(wF,{ref:S,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(xF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelDailyYield",N)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",N)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){U()},onMouseDown:function(){U()},children:me.t("word.Close",N)})]}),Object(pf.jsx)(IC,{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",N),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&k.current.size>0?Object(pf.jsx)(xD.a,{title:me.t("shared.OutputBreakdown",N),content:Object(f.a)(k.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===k.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",N)+": "+C.toFixed(3)+" "+me.t("word.kWh",N)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",N)})}):Object(pf.jsxs)(pf.Fragment,{children:[C>0&&Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("solarPanelYieldPanel.DailyTotal",N)+": "+C.toFixed(3)+" "+me.t("word.kWh",N)}),C>0&&Object(pf.jsx)(xD.a,{title:me.t("shared.MoreResults",N),content:Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",N)+": "}),Object(pf.jsx)(BT.a,{span:10,children:X})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:[(C/X).toFixed(2)," kWh"]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",B.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",N)+": "}),Object(pf.jsxs)(BT.a,{span:10,children:["$",K.toFixed(2)]})]}),Object(pf.jsxs)(XT.a,{style:{width:"200px"},children:[Object(pf.jsx)(BT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",N)+": "}),Object(pf.jsx)(BT.a,{span:10,children:(q>0?"$":"-$")+Math.abs(q).toFixed(2)})]})]}),children:Object(pf.jsx)(Sv.a,{type:"default",children:me.t("shared.MoreResults",N)})})]}),!v&&Object(pf.jsxs)(pf.Fragment,{children:[E>1&&Object(pf.jsx)(ib.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",N),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",N)),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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Q?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(Q?"word.Run":"word.Update",N),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",N)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",N),onClick:function(){_h("line-graph-"+J+"-"+G,"daily-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",N)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",N),onClick:function(){$h(g,"daily-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",N)),c&&d((function(e){e.actionInfo={name:"Export Solar Panel Daily Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},bF=n.a.memo(vF),AF=Tv.a.div(xI||(xI=Object(Av.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"]))),TF=Tv.a.div(vI||(vI=Object(Av.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)"})),PF=function(){var e,t=Xw(ki),l=Xw(ss),a=Xw(hs),o=Xw($r),i=Xw(Vi),r=Xw(Ls),n=Xw(Kr),c=Xw(Ss),s=Xw((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=Ww.countAllChildSolarPanels(h.id),u=Ww.countAllChildSolarPanelDailyYields(h.id))}else d=Ww.countAllChildSolarPanels(s.id),u=Ww.countAllChildSolarPanelDailyYields(s.id),f=Ww.countAllChildElementsByType(s.id,V.Heliostat);else d=Ww.countAllSolarPanels(),u=Ww.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&&Ww.getBuildingCompletionStatus(s,t)===D.COMPLETE;return Object(pf.jsx)(AF,{children:Object(pf.jsx)(TF,{projectView:c,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:g,fontSize:"10px"},children:[d>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{alt:"Solar panel count",title:me.t("designInfoPanel.NumberOfSelectedSolarPanels",p),src:TD,height:24,width:36,style:{paddingLeft:"10px",cursor:"pointer",filter:"invert(100%) "}}),Object(pf.jsx)("span",{children:d})]}),f>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("img",{alt:"Heliostat count",title:me.t("designInfoPanel.NumberOfSelectedHeliostats",p),src:YD,height:24,width:36,style:{paddingLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",filter:"invert(100%) "}}),Object(pf.jsx)("span",{children:f})]}),u>0&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("span",{children:u.toFixed(1)+" "+me.t("word.kWh",p)})]}),!s&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsx)("span",{children:2*n+" "+me.t("word.MeterAbbreviation",p)})]}),w&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.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(pf.jsxs)("span",{children:[Ww.getBuildingArea(s,t).toFixed(2)+" "+me.t("word.MeterAbbreviation",p),Object(pf.jsx)("sup",{children:"2"})]})]})]})})})},SF=n.a.memo(PF),HF=Tv.a.div(bI||(bI=Object(Av.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"]))),jF=Tv.a.div(AI||(AI=Object(Av.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)"})),zF=function(e){var t,l=e.city,a=Xw(Vi),o=Xw(i.date),n=Xw(i.address),c=Xw(i.latitude),s=Xw(i.longitude),d=Xw(i.diurnalTemperatureModel),f=Xw(Ws),h=Xw(Ls),p=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,y=Xw(Ss),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),H=h.y>0,j={lng:a};Object(r.useEffect)((function(){if(l){var e=f[l];if(e){var t=MT(S,e.lowestTemperatures,e.highestTemperatures);v(t);var a=WT(t.high,t.low,d,p,z,Ww.minutesIntoDay(S));P(a)}}}),[l,o]);var z=Object(r.useMemo)((function(){return Dy(S,c)}),[o,c]),R=H?"navajowhite":"antiquewhite",D=H?"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(pf.jsx)(HF,{children:Object(pf.jsx)(jF,{projectView:y,children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:R,fontSize:"10px"},children:[Object(pf.jsx)("img",{title:me.t("word.Location",j),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(pf.jsx)("img",{title:me.t("word.Date",j),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(pf.jsx)("img",{title:me.t("word.Temperature",j),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",j)+":"+w.low.toFixed(1)+"\xb0C, "+me.t("siteInfoPanel.High",j)+": "+w.high.toFixed(1)+"\xb0C)":""]})})})},RF=n.a.memo(zF),DF=Tv.a.div(TI||(TI=Object(Av.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"]))),WF=Tv.a.div(PI||(PI=Object(Av.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"]))),MF=function(){var e=Xw(si),t=Xw(Vi),l=Xw(o.solarRadiationHeatmapMaxValue),a=Xw(o.showSiteInfoPanel),i=Xw(o.heatFluxScaleFactor),r=bf(Es),n={lng:t};return Object(pf.jsx)(DF,{style:{top:a?"110px":"80px"},children:Object(pf.jsx)(WF,{style:{width:r?"300px":"160px",left:r?"calc(100vw / 2 - 150px)":"calc(100vw / 2 - 80px)"},children:Object(pf.jsxs)(Pv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[me.t("visualizationControlPanel.ColorContrast",n)+":",Object(pf.jsx)(ob.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(pf.jsxs)(pf.Fragment,{children:[me.t("visualizationControlPanel.FluxScale",n)+":",Object(pf.jsx)(ob.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}))}})]})]})})})},IF=n.a.memo(MF),CF=pR.a.Column,FF=Tv.a.div(SI||(SI=Object(Av.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"]))),kF=Tv.a.div(HI||(HI=Object(Av.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"]))),OF=Tv.a.div(jI||(jI=Object(Av.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(){var e=Xw(Vi),t=Xw(Gi),l=Xw(si),a=new Date(Xw(i.date)),c=Xw(o.visibilityResultsPanelRect),s=Af(Js),d=Xw(us),f=Xw(Ei),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],H={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 Ft(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,H),vantage:"("+l.position.x.toFixed(1)+", "+l.position.y.toFixed(1)+", "+l.position.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",H),total:a.toFixed(2),itemized:i>1?o.substring(0,o.length-2):"---"})})),S(e)}}),[s,e]);var j=function(){l((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!1,t&&(e.actionInfo={name:"Close Visibility Results Panel",timestamp:(new Date).getTime()})}))};return Object(pf.jsx)(qT.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 Ft(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(pf.jsx)(FF,{ref:h,style:{zIndex:"visibilityResultsPanel"===f?Ke:8},children:Object(pf.jsxs)(kF,{ref:p,style:{width:(c?c.width:600)+"px",height:(c?c.height:470)+"px"},children:[Object(pf.jsxs)(OF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:me.t("visibilityPanel.SolarPanelVisibility",H)+" \u2014 "+bM()(a).format("h:mm A MM/DD")}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){j()},onMouseDown:function(){j()},children:me.t("word.Close",H)})]}),Object(pf.jsxs)(pR.a,{id:"visibility-results-table",style:{width:"100%",direction:"ltr"},dataSource:P,pagination:{defaultPageSize:5,showSizeChanger:!0,pageSizeOptions:["5","10","50"]},children:[Object(pf.jsx)(CF,{title:me.t("visibilityPanel.Observer",H),dataIndex:"observer"},"observer"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.VantagePoint",H),dataIndex:"vantage"},"vantage"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.TotalVisibility",H),dataIndex:"total"},"total"),Object(pf.jsx)(CF,{title:me.t("visibilityPanel.ItemizedVisibilityByFields",H),dataIndex:"itemized"},"itemized")]}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(NC.a,{}),title:me.t("word.Update",H),onClick:function(){0!==d()?(Kh(me.t("message.SimulationStarted",H)),setTimeout((function(){bf.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",H))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("visibility-results-table","visibility-results",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H))}))}})]})]})})})},LF=n.a.memo(YF),NF=["Daylight","Clearness"],UF=Tv.a.div(zI||(zI=Object(Av.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"]))),EF=Tv.a.div(RI||(RI=Object(Av.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"]))),VF=Tv.a.div(DI||(DI=Object(Av.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=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(yd),w=Xw(gd),x=Af(wd),v=Xw(ss),b=Xw(o.yearlyParabolicTroughYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicTroughYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicTroughYieldPanel"}))},children:Object(pf.jsx)(UF,{ref:P,style:{zIndex:"yearlyParabolicTroughYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(EF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(VF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(IC,{type:L.YearlyParabolicTroughYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,NF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("parabolicTroughYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},GF=n.a.memo(JF),XF=Tv.a.div(WI||(WI=Object(Av.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"]))),BF=Tv.a.div(MI||(MI=Object(Av.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=Tv.a.div(II||(II=Object(Av.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(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(fd),m=Xw(hd),w=Xw(o.dailyParabolicTroughYieldPanelRect),x=Af(wd),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyParabolicTroughYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Trough Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.ParabolicTrough);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("parabolicTroughYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"}))},children:Object(pf.jsx)(XF,{ref:A,style:{zIndex:"dailyParabolicTroughYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(BF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(KF,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(IC,{type:L.DailyParabolicTroughYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("parabolicTroughYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},QF=n.a.memo(qF),ZF=Tv.a.div(CI||(CI=Object(Av.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"]))),_F=Tv.a.div(FI||(FI=Object(Av.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=Tv.a.div(kI||(kI=Object(Av.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=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(cu),m=Xw(su),w=Xw(o.dailyParabolicDishYieldPanelRect),x=Af(pu),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyParabolicDishYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Dish Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.ParabolicDish);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("parabolicDishYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicDishYieldPanel"}))},children:Object(pf.jsx)(ZF,{ref:A,style:{zIndex:"dailyParabolicDishYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(_F,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)($F,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(IC,{type:L.DailyParabolicDishYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("parabolicDishYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},tk=n.a.memo(ek),lk=["Daylight","Clearness"],ak=Tv.a.div(OI||(OI=Object(Av.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"]))),ok=Tv.a.div(YI||(YI=Object(Av.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=Tv.a.div(LI||(LI=Object(Av.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(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(uu),w=Xw(fu),x=Af(pu),v=Xw(ss),b=Xw(o.yearlyParabolicDishYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicDishYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicDishYieldPanel"}))},children:Object(pf.jsx)(ak,{ref:P,style:{zIndex:"yearlyParabolicDishYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(ok,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(ik,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(IC,{type:L.YearlyParabolicDishYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,lk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("parabolicDishYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},nk=n.a.memo(rk),ck=Tv.a.div(NI||(NI=Object(Av.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"]))),sk=Tv.a.div(UI||(UI=Object(Av.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"]))),dk=Tv.a.div(EI||(EI=Object(Av.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"]))),uk=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(Pd),m=Xw(Sd),w=Xw(o.dailyFresnelReflectorYieldPanelRect),x=Af(Dd),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyFresnelReflectorYieldPanel=!1,c&&(e.actionInfo={name:"Close Fresnel Reflector Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.FresnelReflector);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("fresnelReflectorYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"}))},children:Object(pf.jsx)(ck,{ref:A,style:{zIndex:"dailyFresnelReflectorYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(sk,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(dk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(IC,{type:L.DailyFresnelReflectorYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("fresnelReflectorYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-fresnel-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},fk=n.a.memo(uk),hk=["Daylight","Clearness"],pk=Tv.a.div(VI||(VI=Object(Av.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"]))),yk=Tv.a.div(JI||(JI=Object(Av.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"]))),gk=Tv.a.div(GI||(GI=Object(Av.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"]))),mk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(jd),w=Xw(zd),x=Af(Dd),v=Xw(ss),b=Xw(o.yearlyFresnelReflectorYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyFresnelReflectorYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyFresnelReflectorYieldPanel"}))},children:Object(pf.jsx)(pk,{ref:P,style:{zIndex:"yearlyFresnelReflectorYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(yk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(gk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(IC,{type:L.YearlyFresnelReflectorYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,hk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("fresnelReflectorYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},wk=n.a.memo(mk),xk=Tv.a.div(XI||(XI=Object(Av.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"]))),vk=Tv.a.div(BI||(BI=Object(Av.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"]))),bk=Tv.a.div(KI||(KI=Object(Av.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"]))),Ak=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ss),g=Af(kd),m=Xw(Od),w=Xw(o.dailyHeliostatYieldPanelRect),x=Af(Ed),v=bf(gs),b=Xw(Ei),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,H=T.current?T.current.clientHeight+100:w?w.height+100:500,j=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(0),M=Object(u.a)(W,2),I=M[0],C=M[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(h.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()}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-H)})}),[w,S,H]),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-H)})};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 Ft(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,H]);var O=function(){d((function(e){e.viewState.showDailyHeliostatYieldPanel=!1,c&&(e.actionInfo={name:"Close Heliostat Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.Heliostat);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1)}))}),[N,m]);var U=me.t("word.Hour",k),E=me.t("heliostatYieldPanel.YieldPerHour",k),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.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-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ft(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-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyHeliostatYieldPanel"}))},children:Object(pf.jsx)(xk,{ref:A,style:{zIndex:"dailyHeliostatYieldPanel"===b?Ke:9},children:Object(pf.jsxs)(vk,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(pf.jsxs)(bk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatDailyYield",k)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(IC,{type:L.DailyHeliostatYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:E,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(F.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+I.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("heliostatYieldPanel.DailyTotal",k),":",I.toFixed(2)," ",me.t("word.kWh",k)]}),N>1&&Object(pf.jsx)(ib.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",k),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",k)),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()})})),bf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:J?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(J?"word.Run":"word.Update",k),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Heliostats",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",k))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+U+"-"+E,"daily-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},Tk=n.a.memo(Ak),Pk=["Daylight","Clearness"],Sk=Tv.a.div(qI||(qI=Object(Av.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"]))),Hk=Tv.a.div(QI||(QI=Object(Av.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"]))),jk=Tv.a.div(ZI||(ZI=Object(Av.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"]))),zk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af(Ld),w=Xw(Nd),x=Af(Ed),v=Xw(ss),b=Xw(o.yearlyHeliostatYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyHeliostatYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyHeliostatYieldPanel"}))},children:Object(pf.jsx)(Sk,{ref:P,style:{zIndex:"yearlyHeliostatYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(Hk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(jk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(IC,{type:L.YearlyHeliostatYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,Pk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&O.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("heliostatYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(pf.jsx)(ib.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",U),checkedChildren:Object(pf.jsx)(dF.a,{}),unCheckedChildren:Object(pf.jsx)(dF.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()})})),bf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},Rk=n.a.memo(zk),Dk=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,H=void 0===S?12:S,j=Object(r.useState)(0),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useState)(null),M=Object(u.a)(W,2),I=M[0],C=M[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 F=Object(r.useMemo)((function(){var e,t=[];t.push(Object(pf.jsx)(KM.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=DC(ZM[2*l+1],1,H,o=null===I||I===a?1:.25),t.push(Object(pf.jsx)(KM.a,{yAxisId:"right",type:b,name:a,dataKey:a,stroke:Be[2*l+1],opacity:o,strokeWidth:2,dot:H>0&&(i||e),isAnimationActive:!1},"right-"+l))}return t}),[b,R,2,H,1,I]);return Object(pf.jsx)(pf.Fragment,{children:t&&Object(pf.jsx)("div",{id:"biaxial-line-graph-"+o+"-"+i+"-"+n,style:{width:"100%",height:"".concat(l,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(pf.jsx)(zM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(QM.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(DM.a,{formatter:function(e){return e.toFixed(P)}}),Object(pf.jsx)(WM.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(MM.a,{yAxisId:"left",x:A,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(IM.a,{dataKey:null!==a&&void 0!==a?a:o,fontSize:"10px",children:Object(pf.jsx)(CM.a,{value:o+(c?" ("+c+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(FM.a,{domain:[h,y],yAxisId:"left",fontSize:"10px",children:Object(pf.jsx)(CM.a,{dx:-15,value:i+(s?" ("+s+")":""),offset:0,angle:-90,position:"center"})}),Object(pf.jsx)(FM.a,{domain:[m,x],yAxisId:"right",orientation:"right",fontSize:"10px",children:Object(pf.jsx)(CM.a,{dx:15,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),F,R>1&&Object(pf.jsx)(kM.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})})})})})},Wk=Tv.a.div(_I||(_I=Object(Av.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"]))),Mk=Tv.a.div($I||($I=Object(Av.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=Tv.a.div(eC||(eC=Object(Av.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"]))),Ck=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),p=new Date(Xw(i.date)),y=Xw(ds),g=Af(qd),m=Af(Kd),w=Xw(Qd),x=Xw(o.dailyUpdraftTowerYieldPanelRect),v=Af(lu),b=bf(gs),A=Xw(Ei),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),H=P.current?P.current.clientWidth+40:x?x.width+40:680,j=P.current?P.current.clientHeight+100:x?x.height+100:650,z=Object(r.useState)({x:x?Math.max(x.x,H-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useRef)(new Map),O={lng:a};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(h.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],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)}),[g]),Object(r.useEffect)((function(){W({x:Math.max(null===x||void 0===x?void 0:x.x,H-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-j)})}),[x,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===x||void 0===x?void 0:x.x,H-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-j)})};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 Ft(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,H,j]);var N=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 E=me.t("word.Hour",O),V=me.t("updraftTowerYieldPanel.YieldPerHour",O),J=me.t("updraftTowerYieldPanel.ChimneyAirTemperature",O),X=me.t("updraftTowerYieldPanel.ChimneyWindSpeed",O),B=!g||!g[0]||0===Object.keys(g[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ft(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.dailyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"}))},children:Object(pf.jsx)(Wk,{ref:T,style:{zIndex:"dailySolarUpdraftTowerYieldPanel"===A?Ke:9},children:Object(pf.jsxs)(Mk,{ref:P,style:{opacity:s,width:(x?x.width:640)+"px",height:(x?x.height:550)+"px"},children:[Object(pf.jsxs)(Ik,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerDailyYield",O)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",O)+" "+l+" | "+bM()(p).format("MM/DD")})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",O)})]}),Object(pf.jsx)(IC,{type:L.DailyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:g,labels:v,height:100,dataKeyAxisX:"Hour",labelX:E,labelY:V,unitY:me.t("word.kWh",O),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),Object(pf.jsx)(Dk,{dataSource:m,height:100,dataKeyAxisX:"Hour",labelX:E,labelY1:J,labelY2:X,unitY1:"\xb0C",unitY2:me.t("word.MeterPerSecond",O),yMin1:0,yMin2:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!b&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[U>1&&k.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(k.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:e[1].toFixed(3)})]}),t===k.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",O)+": "+C.toFixed(3)+" "+me.t("word.kWh",O)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",O)})}):Object(pf.jsxs)(Pv.b,{style:{cursor:"default"},children:[me.t("updraftTowerYieldPanel.DailyTotal",O),":",C.toFixed(2)," ",me.t("word.kWh",O)]}),Object(pf.jsx)(Sv.a,{type:"default",icon:B?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(B?"word.Run":"word.Update",O),onClick:function(){0!==U?(Kh(me.t("message.SimulationStarted",O)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!0,e.pauseDailySimulationForUpdraftTower=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",O))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",O),onClick:function(){_h("line-graph-"+E+"-"+V,"daily-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",O)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",O),onClick:function(){$h(g,"daily-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",O)),c&&d((function(e){e.actionInfo={name:"Export Daily Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},Fk=n.a.memo(Ck),kk=Tv.a.div(tC||(tC=Object(Av.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"]))),Ok=Tv.a.div(lC||(lC=Object(Av.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"]))),Yk=Tv.a.div(aC||(aC=Object(Av.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"]))),Lk=function(e){var t,l,a,c=e.city,s=Xw(Vi),d=Xw(Sr),f=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,h=Xw(si),p=new Date(Xw(i.date)),y=Xw(i.latitude),g=Xw(i.ground),m=null!==(l=Xw(i.diurnalTemperatureModel))&&void 0!==l?l:U.Sinusoidal,w=null!==(a=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==a?a:900,v=Xw(Is),b=Xw(o.diurnalTemperaturePanelRect),A=Xw(Ei),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),H=P.current?P.current.clientWidth+40:b?b.width+40:640,j=P.current?P.current.clientHeight+100:b?b.height+100:500,z=Object(r.useState)({x:b?Math.min(b.x,window.innerWidth-H):0,y:b?Math.min(b.y,window.innerHeight-j):0}),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(m),I=Object(u.a)(M,2),C=I[0],F=I[1],k={lng:s};Object(r.useEffect)((function(){W({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-H),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-j)})}),[b,H,j]),Object(r.useEffect)((function(){var e=function(){W({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-H),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-j)})};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 Ft(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,H,j]);var O=Object(r.useMemo)((function(){var e=[];if(c){var t=v(c);if(t)for(var l=Dy(p,y),a=0;a<24;a++){var o;p.setHours(a);var i=MT(p,t.lowestTemperatures,t.highestTemperatures),r=Ww.minutesIntoDay(p);e.push({Hour:a,Sinusoidal:WT(i.high,i.low,U.Sinusoidal,w,l,r),PartonLogan:WT(i.high,i.low,U.PartonLogan,w,l,r),Ground:IT(y,Ww.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()]),N=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(pf.jsx)(qT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){W({x:Math.min(t.x,window.innerWidth-H),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){h((function(e){e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ft(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.x=Math.min(t.x,window.innerWidth-H),e.viewState.diurnalTemperaturePanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){h((function(e){e.selectedFloatingWindow="diurnalTemperaturePanel"}))},children:Object(pf.jsx)(kk,{ref:T,style:{zIndex:"diurnalTemperaturePanel"===A?Ke:10},children:Object(pf.jsxs)(Ok,{ref:P,style:{opacity:f,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(Yk,{className:"handle",children:[Object(pf.jsx)("span",{children:me.t("menu.settings.DiurnalTemperature",k)+": "+c+" | "+x()(p).format("MM/DD")}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",k)})]}),Object(pf.jsx)(IC,{chartType:Y.Line,type:L.HourlyTemperatures,selectedIndex:C-U.Sinusoidal,dataSource:O,height:100,dataKeyAxisX:"Hour",labelX:me.t("word.Hour",k),labelY:me.t("word.Temperature",k),unitY:"\xb0C",fractionDigits:1,referenceX:p.getHours()}),Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center"},children:[Object(pf.jsx)(Pv.b,{children:me.t("diurnalTemperaturePanel.SelectAirTemperatureModel",k)}),Object(pf.jsxs)(rb.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(){F(a.oldValue),h((function(e){e.world.diurnalTemperatureModel=a.oldValue}))},redo:function(){F(a.newValue),h((function(e){e.world.diurnalTemperatureModel=a.newValue}))}};d(a),F(l),h((function(e){e.world.diurnalTemperatureModel=l}))},value:C,children:[Object(pf.jsx)(rb.a,{value:U.Sinusoidal,children:me.t("diurnalTemperaturePanel.Sinusoidal",k)}),Object(pf.jsx)(rb.a,{value:U.PartonLogan,children:"Parton-Logan"})]})]})]})})})},Nk=n.a.memo(Lk),Uk=["Daylight","Clearness"],Ek=Tv.a.div(oC||(oC=Object(Av.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"]))),Vk=Tv.a.div(iC||(iC=Object(Av.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"]))),Jk=Tv.a.div(rC||(rC=Object(Av.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"]))),Gk=function(e){var t,l,a=e.city,c=Xw(Vi),s=Xw(Gi),d=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,p=Xw(si),y=null!==(l=Xw(i.sutDaysPerYear))&&void 0!==l?l:6,g=new Date(Xw(i.date)),m=Af($d),w=Xw(eu),x=Af(lu),v=Xw(ds),b=Xw(o.yearlyUpdraftTowerYieldPanelRect),A=bf(gs),T=Xw(Ei),P=n.a.useRef(null),S=Object(r.useRef)(null),H=Object(r.useRef)(),j=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,j-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),W=D[0],M=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),F=C[0],k=C[1],O=Object(r.useRef)(new Map),N=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(h.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],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()}k(e)}),[m]),Object(r.useEffect)((function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,j,z]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===b||void 0===b?void 0:b.x,j-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(H.current||(H.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyUpdraftTowerYieldPanelRect.height=S.current.offsetHeight)}))}))),H.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=H.current)||void 0===t||t.disconnect()}}),[b,j,z]);var E=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(pf.jsx)(qT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ft(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"}))},children:Object(pf.jsx)(Ek,{ref:P,style:{zIndex:"yearlySolarUpdraftTowerYieldPanel"===T?Ke:9},children:Object(pf.jsxs)(Vk,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(pf.jsxs)(Jk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerYearlyYield",U)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",U)})]}),Object(pf.jsx)(IC,{type:L.YearlyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(ev.a)(e,Uk)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:J,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!A&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[V>1&&O.current.size>0?Object(pf.jsx)(xD.a,{title:Object(f.a)(O.current.entries()).map((function(e,t){return Object(pf.jsxs)(n.a.Fragment,{children:[Object(pf.jsxs)(XT.a,{style:{textAlign:"right"},children:[Object(pf.jsx)(BT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(pf.jsx)(BT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===O.current.size-1&&Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)("hr",{}),Object(pf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(F*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(pf.jsxs)(Pv.b,{children:[me.t("updraftTowerYieldPanel.YearlyTotal",U),":",(F*B).toFixed(2)," ",me.t("word.kWh",U)]}),Object(pf.jsx)(Sv.a,{type:"default",icon:K?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.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()})})),bf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0,e.pauseYearlySimulationForUpdraftTower=!1}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",U))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},Xk=n.a.memo(Gk),Bk=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,H=Xw(df),j=Object(r.useState)(null),z=Object(u.a)(j,2),R=z[0],D=z[1],W=Object(r.useRef)([]),M=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;W.current.length=0;for(var s=0;s0&&(f||e),isAnimationActive:!1},"left-"+s)),W.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=DC(ZM[s],1,i,p);r.push(Object(pf.jsx)(KM.a,{yAxisId:"right",type:A,name:h,dataKey:h,stroke:Be[s],opacity:p,strokeWidth:2,dot:i>0&&(y||e),isAnimationActive:!1},"right")),W.current.push({id:h,type:"line",value:h,color:Be[n]})}else{var g=Math.floor((s-a)/c),m="Individual"+(s+1),w=DC(ZM[g],.5,i,.5,Be[g]);r.push(Object(pf.jsx)(KM.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(pf.jsx)(pf.Fragment,{children:t&&Object(pf.jsx)("div",{id:"biaxial-line-graph-"+i+"-"+n+"-"+c,style:{width:"100%",height:"".concat(a,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(pf.jsx)(zM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(QM.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(DM.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?Ww.toDegrees(e.value*(H.maximumTiltAngle-H.minimumTiltAngle)+H.minimumTiltAngle).toFixed(S)+"\xb0":"Inter-Row Spacing"===e.name?(e.value*(H.maximumInterRowSpacing-H.minimumInterRowSpacing)+H.minimumInterRowSpacing).toFixed(S)+"m":"Rack Width"===e.name?Math.floor(e.value*(H.maximumRowsPerRack-H.minimumRowsPerRack)+H.minimumRowsPerRack)+" panels":"Objective"===e.name?e.value.toFixed(S)+" "+f:e.value.toFixed(S),Object(pf.jsxs)("div",{children:[e.name,": ",l]},e.name))})):null}}),Object(pf.jsx)(WM.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(MM.a,{yAxisId:"left",x:T,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(IM.a,{dataKey:null!==o&&void 0!==o?o:i,style:{fontSize:"10px"},children:Object(pf.jsx)(CM.a,{value:i+(s?" ("+s+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(FM.a,{domain:[p,g],yAxisId:"left",style:{fontSize:"10px"},children:Object(pf.jsx)(CM.a,{dx:-20,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),Object(pf.jsx)(FM.a,{domain:[w,v],yAxisId:"right",orientation:"right",style:{fontSize:"10px"},children:Object(pf.jsx)(CM.a,{dx:30,value:c+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),M,Object(pf.jsx)(kM.a,{payload:W.current,iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){D(null)},onMouseEnter:function(e){D(e.id)}})]})})})})})},Kk=Tv.a.div(nC||(nC=Object(Av.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"]))),qk=Tv.a.div(cC||(cC=Object(Av.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"]))),Qk=Tv.a.div(sC||(sC=Object(Av.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"]))),Zk=function(){var e,t=Xw(Vi),l=Xw(Gi),a=null!==(e=Xw(Ui))&&void 0!==e?e:Qe,i=Xw(si),c=Xw(of),s=Xw(nf),d=Xw(o.evolutionPanelRect),f=Xw(ln),h=Xw(Gr),p=Xw.getState().evolutionaryAlgorithmState,y=bf(gs),g=bf(ws),m=Xw(Ei),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],H=P[1],j=Object(r.useMemo)((function(){return{lng:t}}),[t]);Object(r.useEffect)((function(){H({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(){H({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 Ft(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",j)}),[h,j]),C=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_TILT_ANGLE?me.t("solarPanelMenu.TiltAngle",j):me.t("optimizationMenu.NormalizedVariables",j)}),[R.problem,j]),F=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_TILT_ANGLE?"\xb0":""}),[R.problem]),k=Object(r.useMemo)((function(){return R.problem!==W.SOLAR_PANEL_ARRAY||R.objectiveFunctionType!==M.DAILY_PROFIT&&R.objectiveFunctionType!==M.YEARLY_PROFIT?me.t("word.kWh",j):me.t("word.dollar",j)}),[R.problem,R.objectiveFunctionType,j]),O=Object(r.useMemo)((function(){switch(R.objectiveFunctionType){case M.DAILY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionDailyProfit",j);case M.YEARLY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",j);case M.DAILY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",j);case M.YEARLY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",j);case M.DAILY_TOTAL_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",j)}return me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",j)}),[R.objectiveFunctionType,j]),Y=Object(r.useMemo)((function(){return!!f&&(R.problem===W.SOLAR_PANEL_TILT_ANGLE?f.type===V.Foundation:R.problem===W.SOLAR_PANEL_ARRAY&&f.type===V.Polygon)}),[R.problem,f]),L=Object(r.useMemo)((function(){return R.problem===W.SOLAR_PANEL_ARRAY?me.t("optimizationMenu.ClickTargetPolygonToActivate",j):me.t("optimizationMenu.ClickTargetFoundationToActivate",j)}),[R.problem,j]),N=Object(r.useMemo)((function(){var e="";return R.problem===W.SOLAR_PANEL_TILT_ANGLE&&(e+=me.t("optimizationMenu.SolarPanelTiltAngleOptimization",j)),R.problem===W.SOLAR_PANEL_ARRAY&&(e+=me.t("optimizationMenu.SolarPanelArrayLayout",j)),e+=": ",e+=h===I.GENETIC_ALGORITHM?me.t("optimizationMenu.GeneticAlgorithm",j):me.t("optimizationMenu.ParticleSwarmOptimization",j)}),[R.problem,h,j]);return Object(pf.jsx)(qT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){H({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 Ft(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(pf.jsx)(Kk,{ref:w,style:{zIndex:"solarPanelOptimizationResult"===m?Ke:9},children:Object(pf.jsxs)(qk,{ref:x,style:{opacity:a,width:(d?d.width:640)+"px",height:(d?d.height:400)+"px"},children:[Object(pf.jsxs)(Qk,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsx)("span",{children:N}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",j)})]}),Object(pf.jsx)(Bk,{dataSource:c,labels:s,height:100,dataKeyAxisX:"Step",labelX:D,labelY1:C,labelY2:O,unitY1:F,unitY2:k,curveType:"linear",fractionDigits:2}),!y&&!g&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Y&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(uD.a,{}),title:me.t("word.Run",j),onClick:function(){Kh(me.t("message.EvolutionStarted",j)),setTimeout((function(){bf.setState((function(e){e.runEvolution=!0,e.pauseEvolution=!1,e.evolutionInProgress=!0})),l&&i((function(e){var t;R.problem===W.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===W.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(pf.jsx)("span",{children:L}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("biaxial-line-graph-"+D+"-"+C+"-"+O,"solar-panel-tilt-angle-evolution",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j))}))}})]})]})})})},_k=n.a.memo(Zk),$k=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(Vi),o=Xw(af),i=Xw(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(pf.jsxs)(lb.a,{width:500,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",P)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.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(pf.jsx)("div",{ref:v,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.ElectricitySellingPrice",P)+" ([0.1, 1]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.OperationalCostPerUnit",P)+" ([0.1, 1]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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)}})})]})]})},eO=n.a.memo($k),tO=function(e,t,l){var a=Xw.getState().elements,o=Xw(_r),i=Xw(Zr),n=bf(bi),c=Af(Ai),s=Af(Pi),d=Af(Hi),u=[],f=[],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=MT(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(h.a)(a);try{for(v.s();!(m=v.n()).done;){var b=m.value;if(Ww.onBuildingEnvelope(b)){var A=c.get(b.id);if(A){var T=b.type===V.Foundation?b:o(b);if(T&&!T.notBuilding&&Ww.getBuildingCompletionStatus(T,a)===D.COMPLETE){var P,S,H,j=x.get(T.id);if(!j)j=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,j),(null===(H=T.hvacSystem)||void 0===H?void 0:H.id)?T.hvacSystem.id&&T.hvacSystem.id.length>0&&!f.includes(T.hvacSystem.id)&&f.push(T.hvacSystem.id):T.label&&T.label.length>0&&!f.includes(T.label)&&f.push(T.label);b.type===V.Foundation?j.geothermal+=A[n]:A[n]<0?j.heater+=A[n]:j.ac+=A[n]}}}}}catch(Se){v.e(Se)}finally{v.f()}var z,R=Object(h.a)(a);try{for(R.s();!(z=R.n()).done;){var W=z.value;if(W.type===V.Foundation){var M=W;if(!M.notBuilding&&Ww.getBuildingCompletionStatus(M,a)!==D.COMPLETE)continue;var I=x.get(W.id);if(I){var C=s.get(W.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 F=d.get(W.id);F&&(I.solarPanel+=F[n])}}}}}catch(Se){R.e(Se)}finally{R.f()}if(x.size>1){var k,O=1,Y=Object(h.a)(x.keys());try{for(Y.s();!(k=Y.n()).done;){var L=k.value;w.Hour=n;var N=x.get(L);if(N){var U=i(L);if(U&&U.type===V.Foundation){var E=U;if(!E.notBuilding&&Ww.getBuildingCompletionStatus(E,a)===D.COMPLETE){var J,G,X,B,K,q,Q=null!==(J=null===(G=E.hvacSystem)||void 0===G?void 0:G.thermostatSetpoint)&&void 0!==J?J:20,Z=null!==(X=null===(B=E.hvacSystem)||void 0===B?void 0:B.temperatureThreshold)&&void 0!==X?X:3,_=null!==(K=null===(q=E.hvacSystem)||void 0===q?void 0:q.id)&&void 0!==K?K:N.label&&""!==N.label?N.label:O.toString();_===O.toString()&&O++;var $=Math.abs(DT(r,N.heater,Q,Z)),ee=DT(r,N.ac,Q,Z);$>0?($-=N.geothermal)<0&&($=0):ee>0&&(ee+=N.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!==N.solarPanel){var ae="Solar "+_;w[ae]?w[ae]=w[ae]-N.solarPanel:w[ae]=-N.solarPanel}var oe,ie,re="Net "+_;if(w[re])w[re]=w[re]+$+ee-(null!==(oe=N.solarPanel)&&void 0!==oe?oe:0);else w[re]=$+ee-(null!==(ie=N.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+=N.solarPanel,g.current.set(_,ne))}}}}}catch(Se){Y.e(Se)}finally{Y.f()}}else{var ce,se=Object(h.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&&Ww.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(DT(r,ue.heater,xe,ve)),Ae=DT(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:f}},lO=l(827),aO=Object(Tv.a)(VM)(dC||(dC=Object(Av.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"]))),oO=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:Xw(Vi)},p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.LineWidth",h)+":",Object(pf.jsx)(oH.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*a,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",h)+":",Object(pf.jsx)(oH.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*o,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.BarCategoryGap",h)+":",Object(pf.jsx)(oH.a,{min:0,max:20,tooltipVisible:!1,defaultValue:i,onChange:function(e){null===f||void 0===f||f(e)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",h)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",h)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:w,placement:"bottomRight",visible:g,onVisibleChange:function(e){m(e)},children:Object(pf.jsx)(aO,{style:{right:"25px"},onClick:function(e){e.stopPropagation()}})})})},iO=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),H=S[0],j=S[1],z=Object(r.useState)(),R=Object(u.a)(z,2),D=R[0],W=R[1],M=Object(r.useState)(!0),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)(!0),O=Object(u.a)(k,2),Y=O[0],L=O[1],N=Object(r.useState)(null),U=Object(u.a)(N,2),E=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(H!==t&&j(t),1===t&&l[0])for(var o in l[0])if(o.startsWith("Heater")){W(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(pf.jsx)(jM.a,{name:n,dataKey:n,stroke:i,fill:"#FA8072",opacity:null===E||E===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l)),n=H>1?o[r*l+1]:D?"AC "+D:"AC",t.push(Object(pf.jsx)(jM.a,{name:n,dataKey:n,stroke:i,fill:"#00BFFF",opacity:null===E||E===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+1)),a&&(n=H>1?o[r*l+2]:D?"Solar "+D:"Solar",t.push(Object(pf.jsx)(jM.a,{name:n,dataKey:n,stroke:i,fill:"#3CB371",opacity:null===E||E===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=DC(ZM[s],Q,T,null===E||E===d?1:.25);0===s&&(e=u),t.push(Object(pf.jsx)(KM.a,{type:w,name:d,dataKey:d,stroke:Be[s],opacity:null===E||E===d?1:.25,strokeWidth:X,dot:T>0&&(u||e),isAnimationActive:!1},s*l+c))}return t}),[t,w,o,H,D,X,T,Q,E]);return Object(pf.jsx)(pf.Fragment,{children:l&&Object(pf.jsx)("div",{id:"line-graph-"+c+"-"+s,style:{width:"100%",height:"".concat(i,"%"),position:"relative",direction:"ltr"},children:Object(pf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(pf.jsx)(zM.a,{width:"100%",height:"100%",children:Object(pf.jsxs)(lO.a,{data:l,stackOffset:"sign",barGap:0,barCategoryGap:ee,onMouseDown:function(e){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(pf.jsx)(DM.a,{formatter:function(e){return e.toFixed(b)+" "+f}}),Object(pf.jsx)(WM.a,{vertical:Y,horizontal:C,stroke:"rgba(128, 128, 128, 0.3)"}),Object(pf.jsx)(MM.a,{x:x,stroke:"orange",strokeWidth:2}),Object(pf.jsx)(IM.a,{dataKey:null!==n&&void 0!==n?n:c,fontSize:"10px",children:Object(pf.jsx)(CM.a,{value:c+(d?" ("+d+")":""),offset:0,position:"bottom"})}),Object(pf.jsx)(FM.a,{domain:[p,g],fontSize:"10px",children:Object(pf.jsx)(CM.a,{dx:-15,value:s+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),le,Object(pf.jsx)(MM.a,{y:0,stroke:"#888"}),H>0&&Object(pf.jsx)(kM.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){V(null)},onMouseEnter:function(e){V(e.dataKey)}})]})}),Object(pf.jsx)(oO,{symbolSize:Q,lineWidth:X,barCategoryGap:ee,horizontalGrid:C,verticalGrid:Y,changeHorizontalGrid:function(e){F(e)},changeVerticalGrid:function(e){L(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)},changeBarCategoryGap:function(e){te(e)}})]})})})},rO=Tv.a.div(uC||(uC=Object(Av.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"]))),nO=Tv.a.div(fC||(fC=Object(Av.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"]))),cO=Tv.a.div(hC||(hC=Object(Av.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"]))),sO=function(e){var t,l=e.city,a=Xw(Vi),c=Xw(Gi),s=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,d=Xw(si),f=Xw(is),p=Xw(Is),y=new Date(Xw(i.date)),g=Xw(o.dailyBuildingEnergyPanelRect),m=bf(bi),w=bf(Ir),x=bf(Or),v=bf(gs),b=Ww.hasSolarPanels(Xw.getState().elements),A=Af(id),T=Af(rd),P=Af(nd),S=Xw(Ei),H=n.a.useRef(null),j=Object(r.useRef)(null),z=Object(r.useRef)(),R=j.current?j.current.clientWidth+40:g?g.width+40:640,W=j.current?j.current.clientHeight+100:g?g.height+100:460,M=Object(r.useState)({x:g?Math.max(g.x,R-window.innerWidth):0,y:g?Math.min(g.y,window.innerHeight-W):0}),I=Object(u.a)(M,2),C=I[0],F=I[1],k=Object(r.useState)([]),O=Object(u.a)(k,2),Y=O[0],N=O[1],U=Object(r.useState)(0),E=Object(u.a)(U,2),V=E[0],J=E[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(){N([]),J(0),K(0),_(0),le(0),re([])},pe=tO(y,ce,b),ye=pe.sum,ge=pe.sumHeaterMap,we=pe.sumAcMap,xe=pe.sumSolarPanelMap,ve=pe.dataLabels;Object(r.useEffect)((function(){N(ye);var e=0,t=0,l=0,a=ge.size>1;if(ge){se.current=[];var o,i=Object(h.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(h.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 f,p=Object(h.a)(xe.keys());try{for(p.s();!(f=p.n()).done;){var y=f.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(h.a)(ge.keys());try{for(w.s();!(m=w.n()).done;){var x=m.value,v=0,S=ge.get(x),H=we.get(x),j=xe.get(x);S&&(v+=S),H&&(v+=H),j&&(v-=j),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,W=0;W0&&Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.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()}}))}})]})]})})})},dO=n.a.memo(sO),uO=Tv.a.div(pC||(pC=Object(Av.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"]))),fO=Tv.a.div(yC||(yC=Object(Av.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"]))),hO=Tv.a.div(gC||(gC=Object(Av.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=Xw.getState().world,s=Xw(Is),d=Xw(Vi),p=Xw(Gi),y=null!==(t=Xw(Ui))&&void 0!==t?t:Qe,g=Xw(si),m=Xw(is),w=new Date(Xw(i.date)),x=Xw(o.yearlyBuildingEnergyPanelRect),v=bf(bi),b=bf(Fr),A=bf(Yr),T=bf(gs),P=Ww.hasSolarPanels(Xw.getState().elements),S=Af(id),H=Af(rd),j=Af(nd),z=Xw(Ei),R=Object(r.useRef)(null),W=Object(r.useRef)(),M=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,M-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-I):0}),F=Object(u.a)(C,2),k=F[0],O=F[1],Y=n.a.useRef(null),N={lng:d},U=s(null!==a&&void 0!==a?a:"Boston MA, USA"),E=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=tO(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)),He=Object(r.useRef)(new Array(V).fill(0)),je=Object(r.useRef)([]),ze=Object(r.useRef)([]),Re=Object(r.useRef)([]),De=Object(r.useRef)([]);Object(r.useEffect)((function(){We()}),[V,A]),Object(r.useEffect)((function(){b&&We()}),[b]);var We=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),He.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(je.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(h.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(h.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(h.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(f.a)(Ae.current));var We=0;if(we){var Me,Ie=Object(h.a)(we.keys());try{for(Ie.s();!(Me=Ie.n()).done;){var Ce,Fe=Me.value;We+=null!==(Ce=we.get(Fe))&&void 0!==Ce?Ce:0}}catch(qe){Ie.e(qe)}finally{Ie.f()}}var ke=0;if(xe){var Oe,Ye=Object(h.a)(xe.keys());try{for(Ye.s();!(Oe=Ye.n()).done;){var Le,Ne=Oe.value;ke+=null!==(Le=xe.get(Ne))&&void 0!==Le?Le:0}}catch(qe){Ye.e(qe)}finally{Ye.f()}}var Ue=0;if(ve&&P){var Ee,Ve=Object(h.a)(ve.keys());try{for(Ve.s();!(Ee=Ve.n()).done;){var Je,Ge=Ee.value;Ue+=null!==(Je=ve.get(Ge))&&void 0!==Je?Je:0}}catch(qe){Ve.e(qe)}finally{Ve.f()}}Te.current[e]=We*J*30,Pe.current[e]=ke*J*30,Se.current[e]=Ue*J*30,He.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(He.current.slice(0,e+1).reduce((function(e,t){return e+t}),0)),S(Xe),H(Be),j(Ke),bf.getState().showSolarRadiationHeatmap||Af.getState().clearDataStore()}),[v]),Object(r.useEffect)((function(){O({x:Math.max(null===x||void 0===x?void 0:x.x,M-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})}),[x,M,I]),Object(r.useEffect)((function(){var e=function(){O({x:Math.max(null===x||void 0===x?void 0:x.x,M-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})};return window.addEventListener("resize",e),R.current&&(W.current||(W.current=new ResizeObserver((function(){g((function(e){R.current&&(e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ft(0,0,600,500)),e.viewState.yearlyBuildingEnergyPanelRect.width=R.current.offsetWidth,e.viewState.yearlyBuildingEnergyPanelRect.height=R.current.offsetHeight)}))}))),W.current.observe(R.current)),function(){var t;window.removeEventListener("resize",e),null===(t=W.current)||void 0===t||t.disconnect()}}),[x,M,I]);var Me=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",N),Ce=me.t("word.Energy",N),Fe=!he||!he[0]||0===Object.keys(he[0]).length;return Object(pf.jsx)(qT.a,{nodeRef:Y,handle:".handle",bounds:"parent",axis:"both",position:k,onDrag:function(e,t){O({x:Math.max(t.x,M-window.innerWidth),y:Math.min(t.y,window.innerHeight-I)})},onStop:function(e,t){g((function(e){e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ft(0,0,600,360)),e.viewState.yearlyBuildingEnergyPanelRect.x=Math.max(t.x,M-window.innerWidth),e.viewState.yearlyBuildingEnergyPanelRect.y=Math.min(t.y,window.innerHeight-I)}))},onMouseDown:function(){g((function(e){e.selectedFloatingWindow="yearlyBuildingEnergyPanel"}))},children:Object(pf.jsx)(uO,{ref:Y,style:{zIndex:"yearlyBuildingEnergyPanel"===z?Ke:9},children:Object(pf.jsxs)(fO,{ref:R,style:{opacity:y,width:(x?x.width:600)+"px",height:(x?x.height:400)+"px"},children:[Object(pf.jsxs)(hO,{className:"handle",style:{direction:"ltr"},children:[Object(pf.jsxs)("span",{children:[me.t("buildingEnergyPanel.YearlyBuildingEnergy",N)+": ",Object(pf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",N)+" "+a+" | "+w.getFullYear()})]}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Me()},onMouseDown:function(){Me()},children:me.t("word.Close",N)})]}),Object(pf.jsx)(iO,{type:L.YearlyBuildingEnergy,dataSource:he,hasSolarPanels:P,labels:se,height:100,dataKeyAxisX:"Month",labelX:Ie,labelY:Ce,unitY:me.t("word.kWh",N),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!T&&Object(pf.jsxs)(Pv.b,{style:{alignSelf:"center",direction:"ltr"},children:[0===je.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Heater",N)+": "+B.toFixed(0)}):Object(pf.jsx)(xD.a,{content:je.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Heater",N)+": "+B.toFixed(0)})}),0===ze.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.AC",N)+": "+Z.toFixed(0)}):Object(pf.jsx)(xD.a,{content:ze.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.AC",N)+": "+Z.toFixed(0)})}),0!==te&&Object(pf.jsx)(pf.Fragment,{children:0===Re.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.SolarPanel",N)+": "+te.toFixed(0)}):Object(pf.jsx)(xD.a,{content:Re.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.SolarPanel",N)+": "+te.toFixed(0)})})}),0===De.current.length?Object(pf.jsx)(Pv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Net",N)+": "+ie.toFixed(0)}):Object(pf.jsx)(xD.a,{content:De.current.map((function(e,t){return Object(pf.jsx)("div",{children:e},t)})),children:Object(pf.jsx)(Pv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Net",N)+": "+ie.toFixed(0)})}),Object(pf.jsx)(Sv.a,{type:"default",icon:Fe?Object(pf.jsx)(LC.a,{}):Object(pf.jsx)(NC.a,{}),title:me.t(Fe?"word.Run":"word.Update",N),onClick:function(){var e=Xw.getState().elements,t=Xw.getState().countElementsByType,l=Xw.getState().getChildrenOfType,a=zT(e,t,l);if(a.status!==nv.NO_BUILDING)if(a.status!==nv.AT_LEAST_ONE_BAD_NO_GOOD)a.status===nv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",N)),Kh(me.t("message.SimulationStarted",N)),setTimeout((function(){m(),bf.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",N);break;case D.WALL_EMPTY:o=me.t("message.BuildingContainsEmptyWall",N);break;case D.ROOF_MISSING:o=me.t("message.BuildingRoofMissing",N);break;default:o=me.t("message.UnknownErrors",N)}Qh(me.t("message.SimulationWillNotStartDueToErrors",N)+": "+o)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",N))}}),Object(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(UC.a,{}),title:me.t("word.SaveAsImage",N),onClick:function(){_h("line-graph-"+Ie+"-"+Ce,"yearly-building-energy",{}).then((function(){Kh(me.t("message.ScreenshotSaved",N)),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(pf.jsx)(Sv.a,{type:"default",icon:Object(pf.jsx)(EC.a,{}),title:me.t("word.SaveAsCsv",N),onClick:function(){$h(Ae.current,"yearly-building-energy.csv"),Kh(me.t("message.CsvFileSaved",N)),p&&g((function(e){e.actionInfo={name:"Export Yearly Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},yO=n.a.memo(pO),gO=function(e){var t=e.setDialogVisible,l=Xw(si),a=Xw(Vi),o=Xw(Sr),i=Xw(pi),n=Xw(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 H=function(e){l((function(t){t.minimumNavigationMoveSpeed=e})),bf.setState((function(t){t.navigationMoveSpeed=e}))},j=function(e){l((function(t){t.minimumNavigationTurnSpeed=e})),bf.setState((function(t){t.navigationTurnSpeed=e}))};return Object(pf.jsxs)(lb.a,{width:500,visible:!0,title:Object(pf.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(pf.jsx)(Sv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",S)},"Cancel"),Object(pf.jsx)(Sv.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(){H(l.oldValue)},redo:function(){H(l.newValue)}};o(l),H(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(){j(c.oldValue)},redo:function(){j(c.newValue)}};o(c),j(r)}}(),t(!1)},children:me.t("word.OK",S)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(pf.jsx)(qT.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(pf.jsx)("div",{ref:b,children:e})})},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumMoveSpeed",S)+" ([1, 10]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumTurnSpeed",S)+" ([1, 5]): "}),Object(pf.jsx)(BT.a,{className:"gutter-row",span:8,children:Object(pf.jsx)(ob.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)}})})]})]})},mO=n.a.memo(gO),wO=function(){var e=Xw(o.showSiteInfoPanel),t=Xw(o.showDesignInfoPanel),l=Xw(o.showInstructionPanel),a=Xw(o.showMapPanel),n=Xw(o.showHeliodonPanel),c=Xw(o.showStickyNotePanel),s=Xw(o.showWeatherPanel),d=Xw(o.showDiurnalTemperaturePanel),f=bf(fi),h=bf(hi),p=bf(Us),y=Xw(o.showDailyLightSensorPanel),g=Xw(o.showYearlyLightSensorPanel),m=Xw(o.showDailyPvYieldPanel),w=Xw(o.showYearlyPvYieldPanel),x=Xw(o.showVisibilityResultsPanel),v=Xw(o.showDailyParabolicTroughYieldPanel),b=Xw(o.showYearlyParabolicTroughYieldPanel),A=Xw(o.showDailyParabolicDishYieldPanel),T=Xw(o.showYearlyParabolicDishYieldPanel),P=Xw(o.showDailyFresnelReflectorYieldPanel),S=Xw(o.showYearlyFresnelReflectorYieldPanel),H=Xw(o.showDailyHeliostatYieldPanel),j=Xw(o.showYearlyHeliostatYieldPanel),z=Xw(o.showDailyUpdraftTowerYieldPanel),R=Xw(o.showYearlyUpdraftTowerYieldPanel),D=Xw(o.showDailyBuildingEnergyPanel),W=Xw(o.showYearlyBuildingEnergyPanel),M=Xw(o.showEvolutionPanel),I=Xw(Ss),C=Xw(i.latitude),F=Xw(i.longitude),k=Xw(Ys),O=Object(r.useState)("Boston MA, USA"),Y=Object(u.a)(O,2),N=Y[0],U=Y[1];return Object(r.useEffect)((function(){var e;U(null!==(e=k(C,F))&&void 0!==e?e:"Boston MA, USA")}),[C,F]),Object(pf.jsxs)(pf.Fragment,{children:[a&&Object(pf.jsx)(mM,{}),n&&Object(pf.jsx)(HM,{}),c&&Object(pf.jsx)(iF,{}),e&&Object(pf.jsx)(RF,{city:N}),t&&Object(pf.jsx)(SF,{}),l&&!I&&Object(pf.jsx)(sF,{}),s&&Object(pf.jsx)(YC,{city:N,graphs:[L.MonthlyTemperatures,L.SunshineHours]}),d&&Object(pf.jsx)(Nk,{city:N}),f&&Object(pf.jsx)(eO,{setDialogVisible:function(e){bf.setState((function(t){t.showEconomicsPanel=e}))}}),h&&Object(pf.jsx)(mO,{setDialogVisible:function(e){bf.setState((function(t){t.showNavigationPanel=e}))}}),g&&Object(pf.jsx)(KC,{city:N}),y&&Object(pf.jsx)($C,{city:N}),w&&Object(pf.jsx)(gF,{city:N}),m&&Object(pf.jsx)(bF,{city:N}),x&&Object(pf.jsx)(LF,{}),b&&Object(pf.jsx)(GF,{city:N}),v&&Object(pf.jsx)(QF,{city:N}),T&&Object(pf.jsx)(nk,{city:N}),A&&Object(pf.jsx)(tk,{city:N}),P&&Object(pf.jsx)(fk,{city:N}),S&&Object(pf.jsx)(wk,{city:N}),H&&Object(pf.jsx)(Tk,{city:N}),j&&Object(pf.jsx)(Rk,{city:N}),z&&Object(pf.jsx)(Fk,{city:N}),R&&Object(pf.jsx)(Xk,{city:N}),D&&Object(pf.jsx)(dO,{city:N}),W&&Object(pf.jsx)(yO,{city:N}),p&&Object(pf.jsx)(IF,{}),M&&Object(pf.jsx)(_k,{})]})},xO=n.a.memo(wO),vO=function(){function e(){Object(je.a)(this,e)}return Object(ke.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?Ww.absoluteCoordinates(o.cx,o.cy,o.cz,i,r,o.lz):Ww.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,Ww.isZero(o.rotation[0])?f.z+=o.poleHeight:(p=o.rotation[0],y=h,g=!1)),u&&!Ww.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 We.Vector3).fromArray(o.normal),H=e.getMonth(),j=Ww.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,W=f.x-(v-P)/2,M=f.y-(b-P)/2,I=d||u?f.z:i.lz+o.poleHeight+o.lz,C=new We.Vector2(f.x,f.y),F=new We.Vector3,k=Array.from(Array(A),(function(){return new Array(T)})),O=new We.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 We.Quaternion).setFromUnitVectors(Rt,Y);(O=(new We.Euler).setFromQuaternion(L)).z+=y;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var N=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(Y.x,0,Y.z).normalize());(O=(new We.Euler).setFromQuaternion(N)).z+=y;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:var U=new We.Vector3(Y.x,-Y.y,0).normalize(),E=Math.acos(jt.dot(U))*Math.sign(U.x);O=new We.Euler(o.tiltAngle,0,E+h,"ZYX");break;case te.TILTED_SINGLE_AXIS_TRACKER:}}S.applyEuler(O),d&&!g&&(O.x=o.rotation[0],O.z=o.rotation[2]+h),u&&(O.x=vt+o.tiltAngle,O.z=i.relativeAngle+h);for(var J=Fy(l,j,n,py.SPHERE_MODEL),G=ky(t.ground,H,S,J),X=S.dot(l),B=new We.Vector2,K=new We.Vector3,q=0;q0&&(B.set(W+q*R,M+Q*D),K.set(B.x-C.x,B.y-C.y,0),K.applyEuler(O),F.set(f.x+K.x,f.y+K.y,I+K.z),c(o.id,F,l)<0&&(k[q][Q]+=X*J));var Z=0;switch(a.shadeTolerance){case le.NONE:for(var _=Number.MAX_VALUE,ee=0;ee0){var E,J=Object(h.a)(r);try{for(J.s();!(E=J.n()).done;){var G=E.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 We.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(h.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===Gy.Arched){var re=P.clone().add(new We.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(h.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.ySy||ye<0)&&pe&&(F[O][Y]+=I),C>0&&ye<0&&(k[O][Y]+=C*M,pe&&(F[O][Y]+=C*M))}}}return{intensity:F,unitArea:b*A,heatmap:k}}},{key:"computeDoorSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(i.cx,i.cy,i.cz),r).setZ(i.lz/2+r.lz).clone().add(new We.Vector3(o.cx*i.lx,0,o.cz*i.lz)),v=new We.Vector3(Math.cos(w-vt),Math.sin(w-vt),0),b=g*Math.cos(w),A=g*Math.sin(w),T=new We.Vector3,P=Fy(a,d,n,py.SPHERE_MODEL),S=ky(l.ground,t.getMonth(),v,P),H=v.dot(a),j=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.doorType===Gy.Arched)for(var z=0;z0&&c(o.id,T,a)<0&&(j[z][R]+=H*P))}else for(var M=0;M0){var C=M-p/2+.5,F=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+F*m),c(o.id,T,a)<0&&(j[M][I]+=H*P)}return{intensity:j,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&&(j[z][R]+=H*P))}else for(var M=0;M0){var C=M-p/2+.5,F=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+F*m),c(o.id,T,a)<0&&(j[M][I]+=H*P)}return{intensity:j,unitArea:g*m}}},{key:"computeRoofWindowSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Ww.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 We.Vector3(o.cx,o.cy,o.cz).applyEuler(new We.Euler(0,0,r.rotation[2]));w.x+=r.cx,w.y+=r.cy,w.z+=r.lz;var x=new We.Euler(o.rotation[0],o.rotation[1],o.rotation[2]+r.rotation[2],"ZXY"),v=new We.Vector3(0,0,1).applyEuler(x),b=new We.Vector3,A=Fy(a,d,n,py.SPHERE_MODEL),T=ky(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 H=0;H0&&c(o.id,b,a)<0&&(S[H][j]+=P*A))}else for(var W=0;W0){var I=W-p/2+.5,C=M-y/2+.5,F=new We.Vector3(I,C,0);F.applyEuler(x),b.set(w.x+F.x,w.y+F.y,w.z+F.z),c(o.id,b,a)<0&&(S[W][M]+=P*A)}return{intensity:S,unitArea:g*m}}},{key:"computePyramidRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,w=Ww.dayOfYear(t),x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,w,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.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 We.Vector3).subVectors(w,y),S=(new We.Vector3).subVectors(T,y),H=(new We.Vector3).subVectors(T,w),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/m)),D=Math.max(2,Math.round(z/m)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(W),P.normalize();var M=R*S.dot(P)/j;S.normalize(),H.normalize();var I=(new We.Vector3).crossVectors(S,H).normalize(),C=P.multiplyScalar(.5*j/R),F=(new We.Vector3).crossVectors(I,P).normalize().multiplyScalar(.5*z/D),k=new We.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+Hy+(r?o.thickness:0));k.add(C).add(F),C.multiplyScalar(2),F.multiplyScalar(2),A.push(C.length()*F.length());var O=new We.Vector3,Y=[],L=.01;Y.push({x:-.01,y:-.01}),Y.push({x:R+L,y:-.01}),Y.push({x:M,y:D+L});for(var N=ky(l.ground,t.getMonth(),I,v),U=I.dot(a),E=0;ESy||X<0)&&(W[E][J]+=N),U>0&&X<0&&(W[E][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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],y=o.id+"-"+n,m=f[0].clone().applyEuler(x),T=f[1].clone().applyEuler(x),P=f[2].clone().applyEuler(x),S=(new We.Vector3).subVectors(T,m),H=(new We.Vector3).subVectors(P,m),j=(new We.Vector3).subVectors(P,T),z=S.length(),R=(new We.Vector3).crossVectors(H,j).length()/z,D=Math.max(2,Math.round(z/w)),W=Math.max(2,Math.round(R/w)),M=Array(D).fill(0).map((function(){return Array(W).fill(0)}));b.push(M),S.normalize();var I=D*H.dot(S)/z;H.normalize(),j.normalize();var C=(new We.Vector3).crossVectors(H,j).normalize(),F=S.multiplyScalar(.5*z/D),k=(new We.Vector3).crossVectors(C,S).normalize().multiplyScalar(.5*R/W),O=new We.Vector3,Y=new We.Vector3(c.cx+m.x,c.cy+m.y,c.lz+m.z+Hy+(r?o.thickness:0));Y.add(F).add(k),F.multiplyScalar(2),k.multiplyScalar(2),A.push(F.length()*k.length());var L,N=ky(l.ground,t.getMonth(),C,v),U=C.dot(a),E=[],V=Object(h.a)(f);try{for(V.s();!(L=V.n()).done;){var J=L.value;E.push({x:J.x,y:J.y})}}catch(ae){V.e(ae)}finally{V.f()}if(n%2===0)for(var G=0;GSy||q<0)&&(M[G][B]+=N),U>0&&q<0&&(M[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:W+Z});for(var _=0;_Sy||le<0)&&(M[_][ee]+=N),U>0&&le<0&&(M[_][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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.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 We.Vector3).subVectors(m,y),S=(new We.Vector3).subVectors(T,y),H=(new We.Vector3).subVectors(T,m),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/w)),D=Math.max(2,Math.round(z/w)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(W),P.normalize(),S.normalize(),H.normalize();var M=(new We.Vector3).crossVectors(S,H).normalize(),I=P.multiplyScalar(.5*j/R),C=(new We.Vector3).crossVectors(M,P).normalize().multiplyScalar(.5*z/D),F=new We.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+Hy+(r?o.thickness:0));F.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),A.push(I.length()*C.length());for(var k=new We.Vector3,O=ky(l.ground,t.getMonth(),M,v),Y=M.dot(a),L=0;LSy||E<0)&&(W[L][U]+=O),Y>0&&E<0&&(W[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,f,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,f,p);var g,m=Ww.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new We.Euler(0,0,c.rotation[2],"ZYX"),v=Fy(a,m,f,py.SPHERE_MODEL),b=[],A=[],T=Object(h.a)(n.entries());try{for(T.s();!(g=T.n()).done;){var P=Object(u.a)(g.value,2),S=P[0],H=P[1],j=o.id+"-"+S;S===n.length-1?function(){var i,n=Number.MAX_VALUE,u=Number.MAX_VALUE,f=-Number.MAX_VALUE,y=-Number.MAX_VALUE,g=Object(h.a)(H);try{for(g.s();!(i=g.n()).done;){var m=i.value.clone().applyEuler(x);m.x>f&&(f=m.x),m.xy&&(y=m.y),m.ySy||O<0)&&(D[F][k]+=I),C>0&&O<0&&(D[F][k]+=C*v)}}}():function(){var i=H[0].clone().applyEuler(x),n=H[1].clone().applyEuler(x),u=H[2].clone().applyEuler(x),f=(new We.Vector3).subVectors(n,i),h=(new We.Vector3).subVectors(u,i),y=(new We.Vector3).subVectors(u,n),g=f.length(),m=(new We.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 We.Vector3).crossVectors(h,y).normalize(),R=f.multiplyScalar(.5*g/T),D=(new We.Vector3).crossVectors(z,f).normalize().multiplyScalar(.5*m/P),W=new We.Vector3(c.cx+i.x,c.cy+i.y,c.lz+i.z+Hy+(r?o.thickness:0));W.add(R).add(D),R.multiplyScalar(2),D.multiplyScalar(2),A.push(R.length()*D.length());for(var M=new We.Vector3,I=ky(l.ground,t.getMonth(),z,v),C=z.dot(a),F=0;FSy||Y<0)&&(S[F][O]+=I),C>0&&Y<0&&(S[F][O]+=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 f,p,y=Ww.dayOfYear(t),g=null!==(f=l.solarRadiationHeatmapGridCellSize)&&void 0!==f?f:.5,m=new We.Euler(0,0,n.rotation[2],"ZYX"),w=Fy(a,y,d,py.SPHERE_MODEL),x=[],v=[],b=Number.MAX_VALUE,A=Number.MAX_VALUE,T=-Number.MAX_VALUE,P=-Number.MAX_VALUE,S=Object(h.a)(r);try{for(S.s();!(p=S.n()).done;){var H,j=p.value,z=Object(h.a)(j);try{for(z.s();!(H=z.n()).done;){var R=H.value.clone().applyEuler(m);R.x>T&&(T=R.x),R.xP&&(P=R.y),R.ySy||E<0)&&(C[N][U]+=Y),L>0&&E<0&&(C[N][U]+=L*w)}}return{segmentIntensities:x,segmentUnitArea:v}}},{key:"computeGableRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,f){var p,y,g=Ww.dayOfYear(t),m=null!==(p=l.solarRadiationHeatmapGridCellSize)&&void 0!==p?p:.5,w=new We.Euler(0,0,n.rotation[2],"ZYX"),x=Fy(a,g,d,py.SPHERE_MODEL),v=[],b=[],A=Object(h.a)(r.entries());try{var T=function(){var r=Object(u.a)(y.value,2),d=r[0],h=r[1],p=o.id+"-"+d,g=h[0].clone().applyEuler(w),A=h[1].clone().applyEuler(w),T=h[2].clone().applyEuler(w),P=(new We.Vector3).subVectors(A,g),S=(new We.Vector3).subVectors(T,g),H=(new We.Vector3).subVectors(T,A),j=P.length(),z=(new We.Vector3).crossVectors(S,H).length()/j,R=Math.max(2,Math.round(j/m)),D=Math.max(2,Math.round(z/m)),W=Array(R).fill(0).map((function(){return Array(D).fill(0)}));v.push(W),P.normalize(),S.normalize(),H.normalize();var M=(new We.Vector3).crossVectors(S,H).normalize(),I=P.multiplyScalar(.5*j/R),C=(new We.Vector3).crossVectors(M,P).normalize().multiplyScalar(.5*z/D),F=new We.Vector3(n.cx+g.x,n.cy+g.y,n.lz+g.z+Hy+(i?o.thickness:0));F.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),b.push(I.length()*C.length());for(var k=new We.Vector3,O=ky(l.ground,t.getMonth(),M,x),Y=M.dot(a),L=0;LSy||E<0)&&(W[L][U]+=O),Y>0&&E<0&&(W[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(h.a)(t);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Zm.getAbsoluteWindowVerticesOnRoof(r,a),c=Ww.getPoints(n);if(Ww.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(h.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value,f=Zm.getAbsoluteSolarPanelVerticesOnRoof(u,a),p=Ww.getPoints(f);if(Ww.isPointInside(e.x,e.y,p))return!1}}catch(y){d.e(y)}finally{d.f()}}return!0}}]),e}(),bO=function(e){var t,l,a,o,i=e.city,n=Xw(si),c=bf(hf),s=Xw(Is),d=Xw(_r),p=Xw($r),y=Xw(tn),g=Xw(Ni),m=Af(xi),w=Af(Ri),x=Af(zi),v=Af(Ti),b=Af(Si),A=Af(ji),T=Xw(Vi),P=Xw(Gi),S=bf(Ir),H=bf(Cr),j=bf(Fr),z=bf(kr),R=Xw.getState().world,D=Xw.getState().elements,W=!!R.noAnimationForThermalSimulation,M=null!==(t=R.highestTemperatureTimeInMinutes)&&void 0!==t?t:900,I=Object(r.useRef)(0),C=Object(r.useRef)(!1),F=Object(r.useRef)(new Date(R.date)),k=Object(r.useRef)(0),O=Object(r.useRef)(!1),Y=Object(r.useRef)(new Date(R.date)),L=Object(r.useRef)(0),N=Object(r.useRef)({high:20,low:0}),E=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 We.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.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(h.a)(D);try{for(t.s();!(e=t.n()).done;){var l,a,o,i=e.value;if(Ww.onBuildingEnvelope(i))null===(l=G.current.get(i.id))||void 0===l||l.fill(0);if(i.type===V.Roof){var r,n=Object(h.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(!W||Ww.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=F.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),O.current=!1};ge()}}),[S]),Object(r.useEffect)((function(){O.current=H,H?(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())}),[H]);var ge=function(){ze()},we=function(){O.current?(le.setTime(Y.current.getTime()),O.current=!1):(F.current=new Date(R.date),L.current=Ww.dayOfYear(le),le.setHours(0,re/2)),C.current=!1,pe(),ye()},xe=function(){var e,t=Object(h.a)(D);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(Ww.onBuildingEnvelope(l)||l.type===V.SolarPanel){var a=G.current.get(l.id);a&&v(l.id,Object(f.a)(a));var o=$.current.get(l.id);o&&m(l.id,o.map((function(e){return Object(f.a)(e)})))}if(l.type===V.Roof){var i,r=Object(h.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(f.a)(s));var d=$.current.get(c);d&&m(c,d.map((function(e){return Object(f.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(f.a)(u)),(u=B.current.get(l.id))&&A(l.id,Object(f.a)(u))}}}catch(p){t.e(p)}finally{t.f()}bf.setState((function(e){e.flagOfDailySimulation=!e.flagOfDailySimulation,e.runYearlyThermalSimulation||(e.showSolarRadiationHeatmap=!0,e.showHeatFluxes=!0)})),P&&!j&&setTimeout((function(){n((function(e){var t=Af.getState().totalBuildingHeater,l=Af.getState().totalBuildingAc,a=Af.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&&!O.current){if(le.getMinutes()+60*le.getHours()+(Ww.dayOfYear(le)-L.current)*by+re>by)return ze(),cancelAnimationFrame(I.current),n((function(e){e.world.date=F.current.toLocaleString("en-US"),e.viewState.showDailyBuildingEnergyPanel=!0,e.selectedFloatingWindow="dailyBuildingEnergyPanel"})),bf.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(j){if(!W||Ww.hasMovingParts(D))return He(),Pe(le.getMonth()),fe(),I.current=requestAnimationFrame(je),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=F.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),O.current=!1};setTimeout((function(){}),50)}}),[j]),Object(r.useEffect)((function(){O.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),je())}),[z]);var He=function(){O.current?(le.setTime(Y.current.getTime()),O.current=!1):(F.current=new Date(R.date),k.current=0,le.setMonth(0,22),L.current=Ww.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},je=function e(){if(j&&!O.current)if(le.getMinutes()+60*le.getHours()+(Ww.dayOfYear(le)-L.current)*byAt?te.sunshineHours[le.getMonth()]/(30*e*ie):0,Q.current=Cy(1,Wy(le),Ry(le),Ww.toRadians(R.latitude)).normalize();var t,l=Object(h.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),Me(a);break;case V.Wall:Ce(a);break;case V.Roof:var o=a;Oe(o),Fe(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=vO.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))}(E.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=vO.computeRoofWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),n=0;n0){for(var s=vO.computeWallWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),u=0;u0){for(var h=vO.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=vO.computeWallSolarRadiationEnergy(le,R,Q.current,e,t,m,w,A,b?0:1,ae,ue),P=0;P0){var I,C=Object(h.a)(m);try{for(C.s();!(I=C.n()).done;){var F=I.value;g-=Ww.getWindowArea(F,e)}}catch(X){C.e(X)}finally{C.f()}}if(w&&w.length>0){var k,O=Object(h.a)(w);try{for(O.s();!(k=O.n()).done;){var Y=k.value;g-=Y.lx*Y.lz*e.lx*e.lz}}catch(X){O.e(X)}finally{O.f()}}var L=Ww.isZero(v)||Ww.isZero(x)?0:v*x/((null!==(r=e.volumetricHeatCapacity)&&void 0!==r?r:.5)*g*e.ly),N=(E.current+L-i)*g/(null!==(n=e.rValue)&&void 0!==n?n:2)*.001/ie;c&&e.openToOutside&&(N+=(E.current-i)*(p-g)*50*.001/ie),he(e.id,N)}else if(e.openToOutside){var U=Ww.getWallVertices(e,0),J=Ww.getPolygonArea(U),G=E.current-i;he(e.id,G*J*50*.001/ie)}}},Fe=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=Ww.calculateBuildingArea(e),n=J.current-i;he(o.id,n*r/(null!==(a=o.rValue)&&void 0!==a?a:2)*.001/ie)}},ke=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)},Oe=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=Ne(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(h.a)(a.entries());try{for(s.s();!(r=s.n()).done;){var f,p=Object(u.a)(r.value,2),y=p[0],g=p[1],m=(g.surfaceTemperature-(e.ceiling?ke(e,g.surfaceTemperature,n):n))*g.totalArea/(null!==(f=e.rValue)&&void 0!==f?f: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(h.a)(t);try{for(n.s();!(o=n.n()).done;){var c,s=o.value,d=Object(h.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(h.a)(t);try{for(b.s();!(w=b.n()).done;){var A,T=w.value,P=[],H=Object(h.a)(T);try{for(H.s();!(A=H.n()).done;){var j=A.value;P.push(Ww.mapVector3ToPoint2(j))}}catch(me){H.e(me)}finally{H.f()}v+=Ww.getPolygonArea(P)}}catch(me){b.e(me)}finally{b.f()}if(g.length>0){var z,D=Object(h.a)(g);try{for(D.s();!(z=D.n()).done;){var W=z.value;v-=W.lx*W.lz}}catch(me){D.e(me)}finally{D.f()}v<0&&(v=0)}m.push(v)}else{var M,I=Object(h.a)(t);try{for(I.s();!(M=I.n()).done;){var C=M.value,F=Ww.getTriangleArea(C[0],C[1],C[2]);if(g.length>0){var k,O=Object(h.a)(g);try{for(O.s();!(k=O.n()).done;){var Y=k.value;Zm.onSegment(C,Y.cx,Y.cy)&&(F-=Y.lx*Y.lz)}}catch(me){O.e(me)}finally{O.f()}F<0&&(F=0)}m.push(F)}}catch(me){I.e(me)}finally{I.f()}}var L=RT(e),N=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var U=y(V.SolarPanel,e.id),J=vO.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(h.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=0;if(3===b.length?A=Ww.getTriangleArea(b[0],b[1],b[2]):4===b.length&&(A=Ww.getTriangleArea(b[0],b[1],b[2])+Ww.getTriangleArea(b[2],b[3],b[0])),w.length>0){var T,P=Object(h.a)(w);try{for(P.s();!(T=P.n()).done;){var H=T.value;Zm.onSegment(b,H.cx,H.cy)&&(A-=H.lx*H.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 j=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=RT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var W=y(V.SolarPanel,e.id),M=vO.computeHipRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,W,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(h.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=Ww.getTriangleArea(b[0],b[1],b[2])+Ww.getTriangleArea(b[2],b[3],b[0]);if(w.length>0){var T,P=Object(h.a)(w);try{for(P.s();!(T=P.n()).done;){var H=T.value;Zm.onSegment(b,H.cx,H.cy)&&(A-=H.lx*H.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 j=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=RT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var W=y(V.SolarPanel,e.id),M=vO.computeGambrelRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,W,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(h.a)(m);try{for(T.s();!(A=T.n()).done;){var P=A.value;Zm.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 H,j=t[a-1],z=new Array,D=Object(h.a)(j);try{for(D.s();!(H=D.n()).done;){var W=H.value;z.push({x:W.x,y:W.y})}}catch(pe){D.e(pe)}finally{D.f()}var M=Ww.getPolygonArea(z);if(m.length>0){for(var I=m.length-1;I>=0;I--){var C=m[I];Zm.onSegment(j,C.cx,C.cy)&&(M-=C.lx*C.lz,m.splice(I,1))}M<0&&(M=0)}g.push(M);var F=i?[g.reduce((function(e,t){return e+t}),0)]:g,k=RT(e),O=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var Y=y(V.SolarPanel,e.id),L=vO.computeMansardRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,m,Y,ae,ue),N=0;N0){var d,u=Object(h.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;Zm.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=RT(e),m=Array(a).fill(0);if(Q.current&&Q.current.z>0){for(var w=y(V.SolarPanel,e.id),v=vO.computeGableRoofSolarRadiationEnergy(le,R,Q.current,e,!0,t,l,i,w,ae,ue),b=0;b0&&(f(),j(),bf.setState((function(e){e.runStaticSimulation=!1,e.simulationInProgress=!1,e.showSolarRadiationHeatmap=!0})),Kh(me.t("message.SimulationCompleted",m)))}),[p]);var H=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},j=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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,P.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(h.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:W(l);break;case V.Wall:M(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:k(o);break;case It.Mansard:F(o);break;case It.Hip:O(o)}}}}catch(r){t.e(r)}finally{t.f()}},z=function(e){var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Ww.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 j=Ww.getWorldDataById(e.id);A=j.pos.x,P=j.pos.y,S=j.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)})),W=Array(f).fill(0).map((function(){return Array(h).fill(0)})),M=Array(f).fill(0).map((function(){return Array(h).fill(0)})),I=Rt,C=zt.clone().applyAxisAngle(Rt,e.rotation[2]),F=jt.clone().applyAxisAngle(Rt,e.rotation[2]),k=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),O=St.clone().applyAxisAngle(Rt,e.rotation[2]),Y=new We.Vector3,L=0,U=new We.Vector2(A,P),E=new We.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 _=Fy(Z,i,v,py.SPHERE_MODEL),$=ky(o.ground,l,I,_),ee=I.dot(Z),te=A-r/2,le=P-n/2,ae=S+s/2,oe=0;oe0&&(E.set(te+(oe+.5)*p,le+(ie+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,ae),H(e.id,Y,Z)||(z[oe][ie]+=ee*_));te=A-r/2,le=S-s/2,$=ky(o.ground,l,C,_),ee=C.dot(Z);for(var re=0;re0&&(E.set(te+(re+.5)*p,J),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(ne+.5)*g),H(e.id,Y,Z)||(R[re][ne]+=ee*_));$=ky(o.ground,l,F,_),ee=F.dot(Z);for(var ce=0;ce0&&(E.set(te+(ce+.5)*p,G),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(h-(se+.5))*g),H(e.id,Y,Z)||(D[ce][se]+=ee*_));te=P-n/2,le=S-s/2,$=ky(o.ground,l,k,_),ee=k.dot(Z);for(var de=0;de0&&(E.set(X,te+(de+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(ue+.5)*g),H(e.id,Y,Z)||(W[de][ue]+=ee*_));$=ky(o.ground,l,O,_),ee=O.dot(Z);for(var fe=0;fe0&&(E.set(B,te+(fe+.5)*y),E.rotateAround(U,e.rotation[2]),Y.set(E.x,E.y,le+(he+.5)*g),H(e.id,Y,Z)||(M[fe][he]+=ee*_))}}W=Ww.transpose(W),M=Ww.transpose(M);var pe=L*b/60,ye=pe>At?w.sunshineHours[l]/(30*pe*o.timesPerHour):0;N(z,ye),N(R,ye),N(D,ye),N(W,ye),N(M,ye),d(e.id+"-top",z),d(e.id+"-south",R),d(e.id+"-north",D),d(e.id+"-west",W),d(e.id+"-east",M)},R=function(e){for(var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Ww.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 We.Vector2(e.cx,e.cy),m=new We.Vector3,A=Array(s).fill(0).map((function(){return Array(u).fill(0)})),P=0,S=0;S<24;S++)for(var j=0;j0){P++;for(var D=Fy(R,i,v,py.SPHERE_MODEL),W=ky(o.ground,l,Rt,D),M=Rt.dot(R),I=new We.Vector2,C=0;C0&&(I.set(p+(C+.5)*f,y+(F+.5)*h),I.rotateAround(g,e.rotation[2]),m.set(I.x,I.y,c),H(e.id,m,R)||(A[C][F]+=M*D))}}var k=P*b/60,O=k>At?w.sunshineHours[l]/(30*k*o.timesPerHour):0;N(A,O),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=Ww.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 We.Vector3(0,0,p),m=s*s,A=0,P=0;P<24;P++)for(var S=0;S0){A++;for(var R=Fy(z,c,v,py.SPHERE_MODEL),D=ky(o.ground,r,Rt,R),W=Rt.dot(z),M=0;Mm||(y[M][I]+=D,W>0&&(H(e.id+"-sut",g,z)||(y[M][I]+=W*R)))}}}var C=A*b/60,F=C>At?w.sunshineHours[r]/(30*C*o.timesPerHour):0;N(y,F),d(e.id+"-sut",y)}},W=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?Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t,s(e),e.lz):Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t),r=(new We.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,Ww.isZero(e.rotation[0])?i.z+=e.poleHeight:(f=e.rotation[0],u=n,h=!1)),a&&!Ww.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 We.Euler(l&&!h?0:f,0,u,"ZYX");r.applyEuler(A);var P=x.getFullYear(),S=x.getMonth(),j=x.getDate(),z=Ww.dayOfYear(x),R=e.lx,D=e.ly,W=Math.max(2,Math.round(e.lx/T)),M=Math.max(2,Math.round(e.ly/T)),I=R/W,C=D/M,F=i.x-(R-T)/2,k=i.y-(D-T)/2,O=l||a?i.z:t.lz+e.poleHeight+e.lz,Y=new We.Vector2(i.x,i.y),L=new We.Vector3,U=Array(W).fill(0).map((function(){return Array(M).fill(0)})),E=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){E++;for(var K=Fy(B,z,v,py.SPHERE_MODEL),q=ky(o.ground,S,r,K),Q=r.dot(B),Z=new We.Vector2,_=new We.Vector3,$=0;$0&&(Z.set(F+$*I,k+ee*C),_.set(Z.x-Y.x,Z.y-Y.y,0),_.applyEuler(A),L.set(i.x+_.x,i.y+_.y,O+_.z),H(e.id,L,B)||(U[$][ee]+=Q*K))}}var le=E*b/60,ae=le>At?w.sunshineHours[S]/(30*le*o.timesPerHour):0;N(U,ae),d(e.id,U)},M=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=Ww.dayOfYear(x),n=e.lx,c=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(e.cx,e.cy,c/2),t).setZ(c/2+t.lz),m=new We.Vector3(Math.cos(y-vt),Math.sin(y-vt),0),A=new We.Vector3,P=Array(u).fill(0).map((function(){return Array(f).fill(0)})),S=0,j=h*Math.cos(y),z=h*Math.sin(y),R=Ww.getWallVertices(e,2),D=(c-e.lz)/2,W=0;W<24;W++)for(var M=0;M0){S++;for(var F=Fy(C,r,v,py.SPHERE_MODEL),k=ky(o.ground,a,m,F),O=m.dot(C),Y=0;Y0&&(A.set(g.x+U*j,g.y+U*z,g.z+E*p),H(e.id,A,C)||(P[Y][L]+=O*F)))}}}var V=S*b/60,J=V>At?w.sunshineHours[a]/(30*V*o.timesPerHour):0;N(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=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(a.cx,a.cy,a.cz),t).setZ(a.lz/2+t.lz).clone().add(new We.Vector3(e.cx*a.lx,0,e.cz*a.lz)),S=new We.Vector3(Math.cos(A-vt),Math.sin(A-vt),0),j=new We.Vector3,z=Array(p).fill(0).map((function(){return Array(y).fill(0)})),R=0,D=g*Math.cos(A),W=g*Math.sin(A),M=0;M<24;M++)for(var I=0;I0){R++;var k=Fy(F,u,v,py.SPHERE_MODEL),O=ky(o.ground,r,S,k),Y=S.dot(F);if(e.doorType===Gy.Arched)for(var L=0;L0&&(H(e.id,j,F)||(z[L][U]+=Y*k)))}else for(var J=0;J0&&(j.set(P.x+X*D,P.y+X*W,P.z+B*m),H(e.id,j,F)||(z[J][G]+=Y*k))}}}var K=R*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;N(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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(r,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;N(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},F=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);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(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.a)(l.entries());try{for(R.s();!(m=R.n()).done;){var D=Object(u.a)(m.value,2),W=D[0],M=D[1],I=e.id+"-"+W;W===l.length-1?function(){var e,l=Number.MAX_VALUE,a=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(h.a)(M);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 O=Fy(k,j,v,py.SPHERE_MODEL),Y=ky(o.ground,P,Rt,O),L=Rt.dot(k),U=0;U0&&(R.y=m.y+E*y,H(I,R,k)||(g[U][E]+=L*O))}}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;N(g,J),d(I,g)}():function(){var e=M[0].clone().applyEuler(z),l=M[1].clone().applyEuler(z),a=M[2].clone().applyEuler(z),i=(new We.Vector3).subVectors(l,e),r=(new We.Vector3).subVectors(a,e),n=(new We.Vector3).subVectors(a,l),c=i.length(),s=(new We.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 We.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*c/u),g=(new We.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*s/f),m=new We.Vector3(t.cx+e.x,t.cy+e.y,t.lz+e.z+Hy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var x=0,R=new We.Vector3,D=0;D<24;D++)for(var W=0;W0){x++;for(var k=Fy(F,j,v,py.SPHERE_MODEL),O=ky(o.ground,P,p,k),Y=p.dot(F),L=0;L0&&(R.copy(m).add(U).add(g.clone().multiplyScalar(E)),H(I,R,F)||(h[L][E]+=Y*k))}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;N(h,J),d(I,h)}()}}catch(C){R.e(C)}finally{R.f()}}}},k=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(r,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;N(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},O=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(h.a)(l);try{for(n.s();!(a=n.n()).done;){var c,f=a.value,p=Object(h.a)(f);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(W){p.e(W)}finally{p.f()}}}catch(W){n.e(W)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),j=Ww.dayOfYear(x),z=new We.Euler(0,0,t.rotation[2],"ZYX"),R=Object(h.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 We.Vector3).subVectors(c,n),h=(new We.Vector3).subVectors(s,n),p=(new We.Vector3).subVectors(s,c),y=f.length(),g=(new We.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 W=(new We.Vector3).crossVectors(h,p).normalize(),M=f.multiplyScalar(.5*y/x),I=(new We.Vector3).crossVectors(W,f).normalize().multiplyScalar(.5*g/R),C=0,F=new We.Vector3,k=new We.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+Hy);if(k.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2),a%2===0)for(var O=0;O<24;O++)for(var Y=0;Y0){C++;for(var E=Fy(U,j,v,py.SPHERE_MODEL),V=ky(o.ground,P,W,E),J=W.dot(U),G=0;G0&&(F.copy(k).add(X).add(I.clone().multiplyScalar(B)),H(r,F,U)||(D[G][B]+=J*E))}}else for(var K=0;K<24;K++)for(var q=0;q0){C++;for(var _=Fy(Z,j,v,py.SPHERE_MODEL),$=ky(o.ground,P,W,_),ee=W.dot(Z),te=0;te0&&(F.copy(k).add(le).add(I.clone().multiplyScalar(ae)),H(r,F,Z)||(D[te][ae]+=ee*_))}}var oe=C*b/60,ie=oe>At?w.sunshineHours[P]/(30*oe*o.timesPerHour):0;N(D,ie),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(W){R.e(W)}finally{R.f()}}}},Y=function(e,t,l){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Ww.dayOfYear(x),s=new We.Euler(0,0,t.rotation[2],"ZYX"),u=l[0][0].z,f=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(h.a)(l);try{for(m.s();!(a=m.n()).done;){var A,P=a.value,S=Object(h.a)(P);try{for(S.s();!(A=S.n()).done;){var j=A.value.clone().applyEuler(s);j.x>y&&(y=j.x),j.xg&&(g=j.y),j.y0){C++;for(var U=Fy(L,c,v,py.SPHERE_MODEL),E=ky(o.ground,r,Rt,U),V=Rt.dot(L),J=0;J0&&(F.y=I.y+G*W,H(e.id,F,L)||(M[J][G]+=V*U))}}}var X=C*b/60,B=X>At?w.sunshineHours[r]/(30*X*o.timesPerHour):0;N(M,B),d(e.id,M)},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=Ww.dayOfYear(x),f=new We.Euler(0,0,t.rotation[2],"ZYX"),p=Object(h.a)(l.entries());try{var g=function(){var l=Object(u.a)(a.value,2),s=l[0],h=l[1],p=e.id+"-"+s,y=h[0].clone().applyEuler(f),g=h[1].clone().applyEuler(f),m=h[2].clone().applyEuler(f),x=(new We.Vector3).subVectors(g,y),A=(new We.Vector3).subVectors(m,y),P=(new We.Vector3).subVectors(m,g),S=x.length(),j=(new We.Vector3).crossVectors(A,P).length()/S,z=Math.max(2,Math.round(S/T)),R=Math.max(2,Math.round(j/T)),D=Array(z).fill(0).map((function(){return Array(R).fill(0)}));x.normalize(),A.normalize(),P.normalize();var W=(new We.Vector3).crossVectors(A,P).normalize(),M=x.multiplyScalar(.5*S/z),I=(new We.Vector3).crossVectors(W,x).normalize().multiplyScalar(.5*j/R),C=new We.Vector3(t.cx+y.x,t.cy+y.y,t.lz+y.z+Hy);C.add(M).add(I),M.multiplyScalar(2),I.multiplyScalar(2);for(var F=0,k=new We.Vector3,O=0;O<24;O++)for(var Y=0;Y0){F++;for(var E=Fy(U,c,v,py.SPHERE_MODEL),V=ky(o.ground,r,W,E),J=W.dot(U),G=0;G0&&(k.copy(C).add(X).add(I.clone().multiplyScalar(B)),H(p,k,U)||(D[G][B]+=J*E))}}var K=F*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;N(D,q),d(p,D)};for(p.s();!(a=p.n()).done;)g()}catch(m){p.e(m)}finally{p.f()}}},N=function(e,t){for(var l=0;l=Y.sunset)return cancelAnimationFrame(M.current),bf.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(h.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=F.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(h.a)(u);try{for(x.s();!(p=x.n()).done;){var v,A=p.value,T=Object(h.a)(A);try{for(T.s();!(v=T.n()).done;){var H=v.value;if(Math.abs(H.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 j=F.current.get(d.id);if(j){for(var z=0;z1){W.current.length=0,z.set(t,l);var a=D.current.filter((function(t){return t.uuid!==e}));return z.intersectObjects(a,!1,W.current),W.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,D.current)}}catch(i){a.e(i)}finally{a.f()}}},X=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=Ww.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=F.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)})),F.current.set(e.id+"-top",h));var y=F.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)})),F.current.set(e.id+"-south",y));var g=F.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)})),F.current.set(e.id+"-north",g));var m=F.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)})),F.current.set(e.id+"-west",m));var w=F.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)})),F.current.set(e.id+"-east",w));var x=Rt,v=zt.clone().applyAxisAngle(Rt,e.rotation[2]),b=jt.clone().applyAxisAngle(Rt,e.rotation[2]),A=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),T=St.clone().applyAxisAngle(Rt,e.rotation[2]),P=p(e),j=e.cx,z=e.cy,D=e.cz;if(P&&P.type===V.Cuboid){var W=Ww.getWorldDataById(e.id);j=W.pos.x,z=W.pos.y,D=W.pos.z}for(var M=new We.Vector3,I=new We.Vector2(j,z),C=new We.Vector2,k=z-o/2,O=z+o/2,Y=j-a/2,L=j+a/2,N=Fy(t,l,H,py.SPHERE_MODEL),U=ky(c.ground,S.getMonth(),x,N),J=x.dot(t),G=j-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]),M.set(C.x,C.y,B),E(e.id,M,t)||(h[K][q]+=J*N));G=j-a/2,X=D-i/2,U=ky(c.ground,S.getMonth(),v,N),J=v.dot(t);for(var Q=0;Q0&&(C.set(G+(Q+.5)*d,k),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(Z+.5)*f),E(e.id,M,t)||(y[Q][Z]+=J*N));U=ky(c.ground,S.getMonth(),b,N),J=b.dot(t);for(var _=0;_0&&(C.set(G+(_+.5)*d,O),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(s-($+.5))*f),E(e.id,M,t)||(g[_][$]+=J*N));G=z-o/2,X=D-i/2,U=ky(c.ground,S.getMonth(),A,N),J=A.dot(t);for(var ee=0;ee0&&(C.set(Y,G+(ee+.5)*u),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(te+.5)*f),E(e.id,M,t)||(m[ee][te]+=J*N));U=ky(c.ground,S.getMonth(),T,N),J=T.dot(t);for(var le=0;le0&&(C.set(L,G+(le+.5)*u),C.rotateAround(I,e.rotation[2]),M.set(C.x,C.y,X+(ae+.5)*f),E(e.id,M,t)||(w[le][ae]+=J*N))}},B=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=Ww.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 We.Vector2(e.cx,e.cy),p=new We.Vector3,y=F.current.get(e.id);y&&y.length===r&&y[0].length===n||(y=Array(r).fill(0).map((function(){return Array(n).fill(0)})),F.current.set(e.id,y));for(var g=Fy(t,l,H,py.SPHERE_MODEL),m=ky(c.ground,S.getMonth(),Rt,g),w=Rt.dot(t),x=new We.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),E(e.id,p,t)||(y[v][b]+=w*g))}},K=function(e){var t=Iy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=Ww.dayOfYear(S),o=e.lx,i=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(e.cx,e.cy,e.cz),l).setZ(i/2+l.lz),h=new We.Vector3(Math.cos(u-vt),Math.sin(u-vt),0),p=s*Math.cos(u),g=s*Math.sin(u),m=new We.Vector3,w=F.current.get(e.id);w&&w.length===r&&w[0].length===n||(w=Array(r).fill(0).map((function(){return Array(n).fill(0)})),F.current.set(e.id,w));for(var x=Ww.getWallVertices(e,1),v=(i-e.lz)/2,b=Fy(t,a,H,py.SPHERE_MODEL),A=ky(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),E(e.id,m,t)||(w[P][j]+=T*b)))}}},q=function(e){var t=Iy(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=Ww.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=Ww.wallAbsolutePosition(new We.Vector3(i.cx,i.cy,i.cz),l).setZ(i.lz/2+l.lz).clone().add(new We.Vector3(e.cx*i.lx,0,e.cz*i.lz)),m=new We.Vector3(Math.cos(h-vt),Math.sin(h-vt),0),w=u*Math.cos(h),x=u*Math.sin(h),v=new We.Vector3,b=F.current.get(e.id);b&&b.length===s&&b[0].length===d||(b=Array(s).fill(0).map((function(){return Array(d).fill(0)})),F.current.set(e.id,b));var A=Fy(t,o,H,py.SPHERE_MODEL),T=ky(c.ground,S.getMonth(),m,A),P=m.dot(t);if(e.doorType===Gy.Arched)for(var j=0;j0&&(E(e.id,v,t)||(b[j][z]+=P*A)))}else for(var M=0;M0){var C=M-s/2+.5,k=I-d/2+.5;v.set(g.x+C*w,g.y+C*x,g.z+k*f),E(e.id,v,t)||(b[M][I]+=P*A)}}},Q=function(e,t,l,a){var o,i=a[0][0].z,r=Ww.dayOfYear(S),n=Fy(e,r,H,py.SPHERE_MODEL),s=new We.Euler(0,0,l.rotation[2],"ZYX"),d=Number.MAX_VALUE,u=Number.MAX_VALUE,f=-Number.MAX_VALUE,p=-Number.MAX_VALUE,y=Object(h.a)(a);try{for(y.s();!(o=y.n()).done;){var g,m=o.value,w=Object(h.a)(m);try{for(w.s();!(g=w.n()).done;){var x=g.value.clone().applyEuler(s);x.x>f&&(f=x.x),x.xp&&(p=x.y),x.y0&&(z.y=j.y+I*T,E(t.id,z,e)||(P[M][I]+=W*n))}},Z=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(r,z,t)||(A[M][C]+=W*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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(z){f.e(z)}finally{f.f()}}}catch(z){n.e(z)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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],j=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(h.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+H*y,E(j,v,t)||(g[T][H]+=A*x))}}():function(){var e=P[0].clone().applyEuler(w),a=P[1].clone().applyEuler(w),o=P[2].clone().applyEuler(w),i=(new We.Vector3).subVectors(a,e),r=(new We.Vector3).subVectors(o,e),n=(new We.Vector3).subVectors(o,a),s=i.length(),d=(new We.Vector3).crossVectors(r,n).length()/s,u=Math.max(2,Math.round(s/R)),f=Math.max(2,Math.round(d/R)),h=F.current.get(j);h&&h.length===u&&h[0].length===f||(h=Array(u).fill(0).map((function(){return Array(f).fill(0)})),F.current.set(j,h)),i.normalize(),r.normalize(),n.normalize();var p=(new We.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*s/u),g=(new We.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*d/f),m=new We.Vector3(l.cx+e.x,l.cy+e.y,l.lz+e.z+Hy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var v=new We.Vector3,b=ky(c.ground,S.getMonth(),p,x),A=p.dot(t),T=0;T0&&(v.copy(m).add(H).add(g.clone().multiplyScalar(z)),E(j,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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(r,z,t)||(A[M][C]+=W*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=Iy(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(h.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,f=Object(h.a)(d);try{for(f.s();!(s=f.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){f.e(T)}finally{f.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Ww.dayOfYear(S),w=new We.Euler(0,0,l.rotation[2],"ZYX"),x=Fy(t,m,H,py.SPHERE_MODEL),v=Object(h.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 We.Vector3).subVectors(s,n),h=(new We.Vector3).subVectors(d,n),p=(new We.Vector3).subVectors(d,s),y=f.length(),m=(new We.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=F.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new We.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),H=(new We.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),j=new We.Vector3,z=new We.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+Hy);z.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var D=ky(c.ground,S.getMonth(),T,x),W=T.dot(t),M=0;M0&&(j.copy(z).add(I).add(H.clone().multiplyScalar(C)),E(r,j,t)||(A[M][C]+=W*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=Iy(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=Ww.dayOfYear(S),r=new We.Euler(0,0,l.rotation[2],"ZYX"),n=Fy(t,i,H,py.SPHERE_MODEL),s=Object(h.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 We.Vector3).subVectors(h,f),g=(new We.Vector3).subVectors(p,f),m=(new We.Vector3).subVectors(p,h),w=y.length(),x=(new We.Vector3).crossVectors(g,m).length()/w,v=Math.max(2,Math.round(w/R)),b=Math.max(2,Math.round(x/R)),A=F.current.get(d);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),F.current.set(d,A)),y.normalize(),g.normalize(),m.normalize();var T=(new We.Vector3).crossVectors(g,m).normalize(),P=y.multiplyScalar(.5*w/v),H=(new We.Vector3).crossVectors(T,y).normalize().multiplyScalar(.5*x/b),j=new We.Vector3(l.cx+f.x,l.cy+f.y,l.lz+f.z+Hy);j.add(P).add(H),P.multiplyScalar(2),H.multiplyScalar(2);for(var z=new We.Vector3,D=ky(c.ground,S.getMonth(),T,n),W=T.dot(t),M=0;M0&&(z.copy(j).add(I).add(H.clone().multiplyScalar(C)),E(d,z,t)||(A[M][C]+=W*n))};for(s.s();!(o=s.n()).done;)d()}catch(f){s.e(f)}finally{s.f()}}}},ae=function(e){var t=Iy(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=Ww.dayOfYear(S),r=o?Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l,y(e),e.lz):Ww.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,Ww.isZero(e.rotation[0])?r.z+=e.poleHeight:(d=e.rotation[0],s=n,u=!1)),o&&!Ww.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 We.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,j=r.x-(x-R)/2,z=r.y-(v-R)/2,D=a||o?r.z:l.lz+e.poleHeight+e.lz,W=new We.Vector2(r.x,r.y),M=new We.Vector3,I=F.current.get(e.id);I&&I.length===b&&I[0].length===A||(I=Array(b).fill(0).map((function(){return Array(A).fill(0)})),F.current.set(e.id,I));var C=new We.Euler(a&&!u?0:d,0,s,"ZYX");if(e.trackerType!==te.NO_TRACKER){var k=n?t.clone().applyAxisAngle(Rt,-n):t.clone();switch(e.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var O=(new We.Quaternion).setFromUnitVectors(Rt,k);(C=(new We.Euler).setFromQuaternion(O)).z+=s;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var Y=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(k.x,0,k.z).normalize());(C=(new We.Euler).setFromQuaternion(Y)).z+=s;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:if(Math.abs(e.tiltAngle)>.001){var L=new We.Vector3(k.x,-k.y,0).normalize(),N=Math.acos(jt.dot(L))*Math.sign(L.x);C=new We.Euler(e.tiltAngle,0,N+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=Fy(t,i,H,py.SPHERE_MODEL),J=ky(c.ground,S.getMonth(),w,U),G=w.dot(t),X=new We.Vector2,B=new We.Vector3,K=0;K0&&(X.set(j+K*T,z+q*P),B.set(X.x-W.x,X.y-W.y,0),B.applyEuler(C),M.set(r.x+B.x,r.y+B.y,D+B.z),E(e.id,M,t)||(I[K][q]+=G*U))}},oe=function(e){var t=Iy(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=Ww.dayOfYear(S),o=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new We.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 We.Vector2(o.x,o.y),b=new We.Vector3,A=F.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),F.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,j=Ww.isZero(P),z=j?1:Math.cos(P),D=j?0:Math.sin(P),W=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),M=(new We.Quaternion).setFromUnitVectors(Rt,new We.Vector3(W.x*z,W.x*D,W.z).normalize()),I=(new We.Euler).setFromQuaternion(M);i.copy(r.clone().applyEuler(I));for(var C=Fy(t,a,H,py.SPHERE_MODEL),k=ky(c.ground,S.getMonth(),i,C),O=i.dot(t),Y=new We.Vector2,L=new We.Vector3,N=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;G0&&(Y.set(N,w+X*g),j||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),E(e.id,b,t)||(A[G][X]+=O*C*V))}}},ie=function(e){var t=Iy(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=Ww.dayOfYear(S),o=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new We.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 We.Vector2(o.x,o.y),b=new We.Vector3,A=F.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),F.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,j=Ww.isZero(P),z=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),D=(new We.Quaternion).setFromUnitVectors(Rt,z),W=(new We.Euler).setFromQuaternion(D);i.copy(r.clone().applyEuler(W));for(var M=Fy(t,a,H,py.SPHERE_MODEL),I=ky(c.ground,S.getMonth(),i,M),C=i.dot(t),k=new We.Vector2,O=new We.Vector3,Y=0,L=0,N=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&&(k.set(Y,L),j||k.rotateAround(v,P),O.set(k.x-v.x,k.y-v.y,0),O.applyEuler(W),b.set(o.x+O.x,o.y+O.y,x+O.z),E(e.id,b,t)||(V=1/Math.sqrt(1+(N*N+U*U)*J),A[G][X]+=C*M*V)))}},re=function(e){var t,l=Iy(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),E(e.id,P,l)||E(e.id,P,D)||(j[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),E(e.id,P,l)||(j[_][$]+=X*U))}}}}},ne=function(e){var t,l=Iy(S,c.latitude);if(!(l.z0&&(L.set(U,b+X*w),N.set(L.x-T.x,L.y-T.y,0),N.applyEuler(D),P.set(n.x+N.x,n.y+N.y,A+N.z),E(e.id,P,l)||E(e.id,P,z)||(j[J][X]+=Y*k))}else for(var B=0;B0&&(L.set(U,b+K*w),N.set(L.x-T.x,L.y-T.y,0),N.applyEuler(D),P.set(n.x+N.x,n.y+N.y,A+N.z),E(e.id,P,l)||(j[B][K]+=Y*k))}}}}},ce=function(e){var t=e.solarUpdraftTower;if(t){var l=Iy(S,c.latitude);if(!(l.z<=0)){var a=Ww.dayOfYear(S),o=(new We.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=F.current.get(u);f&&f.length===r&&f[0].length===r||(f=Array(r).fill(0).map((function(){return Array(r).fill(0)})),F.current.set(u,f));for(var h,p,y=Fy(l,a,H,py.SPHERE_MODEL),g=ky(c.ground,S.getMonth(),o,y),m=new We.Vector3(0,0,d),w=o.dot(l),x=i*i,v=0;vx||(f[v][b]+=g,w>0&&(E(u,m,l)||(f[v][b]+=w*y)))}}}};return Object(pf.jsx)(pf.Fragment,{})},HO=n.a.memo(SO),jO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(pd),x=Xw($n),v=Af(md),b=Xw(ec),A=Xw(hd),T=Xw(gd),P=Af(xd),S=bf(cd),H=bf(sd),j=bf(dd),z=bf(ud),R=Xw(o.showDailyParabolicTroughYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Ww.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",W)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=j,j?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),ae())}),[j]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,oe(),void(d&&c((function(e){var t=Af.getState().sumDailyParabolicTroughYield();e.actionInfo={name:"Daily Simulation for Parabolic Troughs Completed",result:{totalYield:t},details:Af.getState().dailyParabolicTroughYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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&&(M.set(x+O*h,v+Y*y),c||M.rotateAround(A,n),F.set(M.x-A.x,M.y-A.y,0),F.applyEuler(R),T.set(o.x+F.x,o.y+F.y,b+F.z),pe(e.id,T,t)||(k+=W*D));var L=K.current.get(e.id);if(L)L[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=k/(u*f)}}},ue=function(){var e=$.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},fe=function(){var e=ee.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-N[I.getMonth()])},pe=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(h.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(h.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===O?a.fill(0):q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},zO=n.a.memo(jO),RO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(du),x=Xw($n),v=Af(hu),b=Xw(ec),A=Xw(su),T=Xw(fu),P=Af(yu),S=bf(ou),H=bf(iu),j=bf(ru),z=bf(nu),R=Xw(o.showDailyParabolicDishYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Ww.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",W)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=j,j?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),ae())}),[j]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForParabolicDishes=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,oe(),void(d&&c((function(e){var t=Af.getState().sumDailyParabolicDishYield();e.actionInfo={name:"Daily Simulation for Parabolic Dishes Completed",result:{totalYield:t},details:Af.getState().dailyParabolicDishYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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+F*u,w+k*f),P||D.rotateAround(v,T),W.set(D.x-v.x,D.y-v.y,0),W.applyEuler(j),b.set(o.x+W.x,o.y+W.y,x+W.z),pe(e.id,b,t)||(M+=R*z));var O=K.current.get(e.id);if(O)O[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=M/(s*d)}}},ue=function(){var e=$.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},fe=function(){var e=ee.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-N[I.getMonth()])},pe=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(h.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(h.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===O?a.fill(0):q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},DO=n.a.memo(RO),WO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(Hd),x=Xw($n),v=Xw(Sd),b=Af(Rd),A=Xw(ec),T=Xw(zd),P=Af(Wd),S=bf(vd),H=bf(bd),j=bf(Ad),z=bf(Td),R=Xw(o.showDailyFresnelReflectorYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Ww.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",W)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=j,j?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),oe())}),[j]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),B.current=!0,ie(),void(d&&c((function(e){var t=Af.getState().sumDailyFresnelReflectorYield();e.actionInfo={name:"Daily Simulation for Fresnel Reflectors Completed",result:{totalYield:t},details:Af.getState().dailyFresnelReflectorYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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),N.set(L.x-P.x,L.y-P.y,0),N.applyEuler(r),S.set(s.x+N.x,s.y+N.y,T+N.z),ye(e.id,S,l)||ye(e.id,S,n)||(E+=Y*O))}var K=q.current.get(e.id);if(K)K[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=E/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(){var e=te.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):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-N[I.getMonth()])},ye=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(h.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(h.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===O?a.fill(0):Q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},MO=n.a.memo(WO),IO=function(e){var t,l,a,i,n=e.city,c=Xw(si),s=bf(hf),d=Xw(Gi),f=Xw(Vi),p=Xw.getState().world,y=Xw.getState().elements,g=Xw(Is),m=Xw($r),w=Af(Yd),x=Xw($n),v=Xw(Od),b=Af(Ud),A=Xw(ec),T=Xw(Nd),P=Af(Vd),S=bf(Md),H=bf(Id),j=bf(Cd),z=bf(Fd),R=Xw(o.showDailyHeliostatYieldPanel),D=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:f}}),[f]),M=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===M||void 0===M?void 0:M.elevation:0,F=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,k=60/F,O=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/O,L=Object(r.useMemo)((function(){return new We.Raycaster}),[]),N=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,E=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 Dy(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Ww.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",W)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=j,j?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(s("simulationPaused",!1),oe())}),[j]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),k/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"})),bf.setState((function(e){e.runDailySimulationForHeliostats=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),B.current=!0,ie(),void(d&&c((function(e){var t=Af.getState().sumDailyHeliostatYield();e.actionInfo={name:"Daily Simulation for Heliostats Completed",result:{totalYield:t},details:Af.getState().dailyHeliostatYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+k),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(h.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(h.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&&(M.set(O,A+L*v),F.set(M.x-P.x,M.y-P.y,0),F.applyEuler(n),S.set(s.x+F.x,s.y+F.y,T+F.z),ye(e.id,S,l)||ye(e.id,S,r)||(k+=W*D))}var N=q.current.get(e.id);if(N)N[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=k/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):0},he=function(){var e=te.current.daylight()/60;return e>At?M.sunshineHours[I.getMonth()]/(30*e*F):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-N[I.getMonth()])},ye=function(e,t,l){if(E.current.length>1){J.current.length=0,L.set(t,l);var a=E.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;E.current.length=0;var l,a=Object(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,E.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(h.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(h.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===O?a.fill(0):Q.current.set(l.id,new Array(O).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(pf.jsx)(pf.Fragment,{})},CO=n.a.memo(IO),FO=function(e){var t,l,a,n,c,s=e.city,d=Xw(si),f=bf(hf),p=Xw(Gi),y=Xw(Vi),g=Xw.getState().world,m=Xw.getState().elements,w=Xw(Is),x=Af(au),v=Af(Zd),b=Af(_d),A=Af(tu),T=bf(Jd),P=bf(Xd),S=bf(Gd),H=bf(Bd),j=Xw(o.showDailyUpdraftTowerYieldPanel),z=Xw(i.noAnimationForSolarUpdraftTowerSimulation),R=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,D=null!==(l=g.sutGridCellSize)&&void 0!==l?l:1,W=Object(Se.f)().scene,M=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),F=s?null===(a=w(s))||void 0===a?void 0:a.elevation:0,k=null!==(n=g.sutTimesPerHour)&&void 0!==n?n:4,O=60/k,Y=null!==(c=g.sutDaysPerYear)&&void 0!==c?c:6,L=12/Y,N=Object(r.useMemo)((function(){return new We.Raycaster}),[]),U=Object(r.useRef)([]),E=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 Dy(C,g.latitude)}),[g.date,g.latitude]),oe=Object(r.useRef)(ae),ie=Ww.daysInYear(C)/12;Object(r.useEffect)((function(){if(T){if(!z||Ww.hasMovingParts(m))return ne(),J.current=requestAnimationFrame(ce),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",M)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.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),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(f("simulationPaused",!1),ce())}),[P]);var re=function(){Te(),ge();var e,t=Object(h.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"})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,se(),p&&d((function(e){var t=Af.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Static Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.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),-O/2)),X.current=!1,Te(),ge()},ce=function e(){if(T&&!ee.current){if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*by+O>=ae.sunset)return cancelAnimationFrame(J.current),d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),bf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,se(),void(p&&d((function(e){var t=Af.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Dynamic Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}})));C.setHours(C.getHours(),C.getMinutes()+O),d((function(e){e.world.date=C.toLocaleString("en-US")}));var t,l=Object(h.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(h.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,f=Math.PI*o.solarUpdraftTower.chimneyRadius*o.solarUpdraftTower.chimneyRadius,p=Math.PI*o.solarUpdraftTower.collectorRadius*o.solarUpdraftTower.collectorRadius,y=1239.7*f,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*gy*f,P=new Date(g.date),S=void 0,H=void 0;s&&(S=w(s),H=MT(P,S.lowestTemperatures,S.highestTemperatures));for(var j=0;j0&&j>0&&v[j-1]>z){var W,M,I=(v[j-1]+z)/2,C=(null!==(W=g.airConvectiveCoefficient)&&void 0!==W?W:5)*p*(I-z),F=I+my,k=F*F*F*F,O=D*D*D*D,Y=(null!==(M=o.solarUpdraftTower.collectorEmissivity)&&void 0!==M?M:.95)*wy*p*(k-O);A[j]-=C+Y,A[j]<0&&(A[j]=0)}var L=A[j]/(y*D),N=D*(1+Math.cbrt(L*L/x))-my,U=N>z?Math.sqrt(x*((N+my)/D-1)):0;A[j]=T*U*U*U*.001,v[j]=N,b[j]=U}}}}}}catch(E){l.e(E)}finally{l.f()}de()},de=function(){var e,t=new Map,l=0,a=[],o=Object(h.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 f={};f.Hour=u;for(var p=1;p<=l;p++){var y,g="Tower"+p;f[a[p-1]]=null===(y=t.get(g))||void 0===y?void 0:y[u]}d.push(f)}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,H,j="Temperature Tower"+P;T["T_"+a[P-1]]=null===(S=t.get(j))||void 0===S?void 0:S[A],j="Wind Speed Tower"+P,T["V_"+a[P-1]]=null===(H=t.get(j))||void 0===H?void 0:H[A]}w.push(T)}v(w),x(a)};Object(r.useEffect)((function(){if(S){if(!z||Ww.hasMovingParts(m))return ue(),J.current=requestAnimationFrame(he),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",M)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};fe()}}),[S]),Object(r.useEffect)((function(){ee.current=H,H?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(f("simulationPaused",!1),he())}),[H]);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=Dy(C,g.latitude),C.setHours(Math.floor(oe.current.sunrise/60),-O/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=Dy(C,g.latitude),ge();var t,l=Object(h.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"})),bf.setState((function(e){e.runYearlySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,ye(),p&&d((function(e){var t=Af.getState().sumYearlyUpdraftTowerYield();e.actionInfo={name:"Static Yearly Simulation for Updraft Tower Completed",result:{totalYield:t},details:Af.getState().yearlyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},he=function e(){if(S&&!ee.current)if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*by+O0&&H>0&&r[H-1]>z){var W,M,I=(r[H-1]+z)/2,F=(null!==(W=g.airConvectiveCoefficient)&&void 0!==W?W:5)*v*(I-z),k=I+my,O=k*k*k*k,Y=D*D*D*D,L=(null!==(M=o.solarUpdraftTower.collectorEmissivity)&&void 0!==M?M:.95)*wy*v*(O-Y);i[H]-=F+L,i[H]<0&&(i[H]=0)}var N=i[H]/(b*D),U=D*(1+Math.cbrt(N*N/A))-my,E=U>z?Math.sqrt(A*((U+my)/D-1)):0;i[H]=T*E*E*E*.001,r[H]=U,n[H]=E}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()}j&&de()},ye=function(){var e,t=[],l=[],a=0,o=Object(h.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 f,p=Object(h.a)(t.entries());try{for(p.s();!(f=p.n()).done;){var y=Object(u.a)(f.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(h.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(h.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=Iy(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 We.Vector3).fromArray(e.normal),r=C.getFullYear(),n=C.getMonth(),c=C.getDate(),s=Ww.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 We.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=Fy(T,s,F,py.SPHERE_MODEL),S=ky(g.ground,n,Rt,P),H=i.dot(T);w=0;for(var j=0;jm||(w++,l[v]+=S,H>0&&(Pe(e.id+"-sut",y,T)||(l[v]+=H*P)))}}}w&&(l[v]/=w),l[v]*=x}}},be=function(){var e=ae.daylight()/60;return e>At?I.sunshineHours[C.getMonth()]/(30*e*k):0},Ae=function(){var e=C.getMonth(),t=oe.current.daylight()/60;return t>At?I.sunshineHours[e]/(30*t*k):0},Te=function(){var e=W.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,U.current)}}catch(i){a.e(i)}finally{a.f()}}},Pe=function(e,t,l){if(U.current.length>1){E.current.length=0,N.set(t,l);var a=U.current.filter((function(t){return t.uuid!==e}));return N.intersectObjects(a,!1,E.current),E.current.length>0}return!1};return Object(pf.jsx)(pf.Fragment,{})},kO=n.a.memo(FO),OO=function e(t,l){Object(je.a)(this,e),this.position=void 0,this.observer=void 0,this.position=t,this.observer=l},YO=function(){var e,t=Xw(Vi),l=Xw.getState().world,a=Xw.getState().elements,o=Xw(si),i=bf(hf),n=Xw($r),c=Xw(_r),s=bf(Vs),d=Object(Se.f)().scene,f={lng:t},p=Object(r.useMemo)((function(){return new We.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",f))),i("simulationInProgress",!1)}),[s]);var x=function(){if(Af.getState().clearSolarPanelVisibilityResults(),function(){g.current=[];var e,t=Object(h.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?Ww.absoluteHumanOrTreeCoordinates(o.cx,o.cy,o.cz,i):new We.Vector3(o.cx,o.cy,o.cz);r.z+=o.lz,g.current.push(new OO(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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,m.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(h.a)(g.current);try{for(t.s();!(e=t.n()).done;){var l,o=e.value,i=new Map,r=Object(h.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,f=Object(h.a)(a);try{for(f.s();!(u=f.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){f.e(b)}finally{f.f()}Af.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=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,l);a&&(o.z=e.cz+l.cz+l.lz/2);var i=(new We.Vector3).fromArray(e.normal),r=l.rotation[2]+e.relativeAzimuth;Math.abs(e.tiltAngle)>.001&&i.applyEuler(new We.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 We.Vector2(o.x,o.y),P=0,S=new We.Vector3,H=new We.Vector3,j=new We.Vector2,z=Ww.isZero(r),R=0;R0&&(H.normalize(),b(e.id,S,H)&&(P+=Math.abs(H.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(h.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(pf.jsx)(pf.Fragment,{})},LO=n.a.memo(YO),NO=function(e){var t,l=e.city,a=Xw(si),n=bf(hf),c=Xw(Gi),s=Xw(Vi),d=Xw.getState().world,f=Xw.getState().elements,p=Xw($r),y=Xw(_r),g=Xw(Is),m=Xw(Fs),w=Xw(Os),x=Af(Su),v=Af(bu),b=Af(Tu),A=bf(gu),T=bf(mu),P=bf(wu),S=bf(xu),H=Xw(o.showDailyLightSensorPanel),j=Xw(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]),W=new Date(d.date),M=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,F=null!==(t=d.timesPerHour)&&void 0!==t?t:4,k=60/F,O=Object(r.useMemo)((function(){return new We.Raycaster}),[]),Y=Object(r.useRef)([]),L=Object(r.useRef)([]),N=Object(r.useRef)(0),U=Object(r.useRef)(!1),E=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 Dy(W,d.latitude)}),[d.date,d.latitude]),$=Object(r.useRef)(_);Object(r.useEffect)((function(){if(A){if(!j||Ww.hasMovingParts(f))return te(),N.current=requestAnimationFrame(le),function(){cancelAnimationFrame(N.current),U.current||(Kh(me.t("message.SimulationAborted",R)),a((function(e){e.world.date=E.current.toLocaleString("en-US")})),bf.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(W.getTime()),cancelAnimationFrame(N.current),n("simulationPaused",!0),Kh(me.t("message.SimulationPaused",R))):(n("simulationPaused",!1),le())}),[T]);var ee=function(){ge(),de();var e,t=Object(h.a)(f);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"})),bf.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:Af.getState().dailyLightSensorData,timestamp:(new Date).getTime()}}))},te=function(){q.current?(W.setTime(Q.current.getTime()),q.current=!1):(E.current=new Date(d.date),Z.current=W.getDay(),W.setHours(Math.floor(_.sunrise/60),-k/2)),U.current=!1,ge(),de()},le=function e(){if(A&&!q.current){if(W.getMinutes()+60*W.getHours()+(W.getDay()-Z.current)*by+k>=_.sunset)return cancelAnimationFrame(N.current),a((function(e){e.world.date=E.current.toLocaleString("en-US"),e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),bf.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:Af.getState().dailyLightSensorData,timestamp:(new Date).getTime()}})));W.setHours(W.getHours(),W.getMinutes()+k),a((function(e){e.world.date=W.toLocaleString("en-US")}));var t,l=Object(h.a)(f);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()}N.current=requestAnimationFrame(e)}},ae=function(){var e,t=pe(),l=Object(h.a)(f);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[W.getMinutes()>=30?W.getHours()+1===24?0:W.getHours()+1:W.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=Ww.absoluteCoordinates(e.cx,e.cy,e.cz,t,a||void 0),i=(new We.Vector3).fromArray(e.normal);i.applyAxisAngle(Rt,t.rotation[2]);for(var r=W.getFullYear(),n=W.getMonth(),c=W.getDate(),s=Ww.dayOfYear(W),u=0;u<24;u++)for(var f=0;f0){var m=Fy(g,s,C,py.SPHERE_MODEL),w=i.dot(g);w>0&&(we(e.id,o,g)||(l[u]+=w*m)),l[u]+=ky(d.ground,n,i,m)}}}},pe=function(){var e=_.daylight()/60;return e>At?D.sunshineHours[W.getMonth()]/(30*e*F):0},ye=function(){var e=W.getMonth(),t=$.current.daylight()/60;return t>At?(X.current[e]=t,B.current[e]=D.sunshineHours[e]/(30*t),B.current[e]/F):(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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.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,O.set(t,l);var a=Y.current.filter((function(t){return t.uuid!==e}));return O.intersectObjects(a,!1,L.current),L.current.length>0}return!1};return Object(pf.jsx)(pf.Fragment,{})},UO=n.a.memo(NO),EO=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))},VO=function(e){var t,l,a,n,c,s=e.city,d=Xw(si),f=bf(hf),p=Xw(Gi),y=Xw(Vi),g=Xw.getState().world,m=Xw.getState().elements,w=Xw(Ni),x=Xw(Is),v=Xw($r),b=Xw(_r),A=Af($s),T=Xw($n),P=Af(ld),S=Xw(ec),H=Xw(_s),j=Xw(td),z=Af(od),R=bf(Gs),D=bf(Xs),W=bf(qs),M=bf(Bs),I=bf(Ks),C=bf(Qs),F=Xw(o.showDailyPvYieldPanel),k=Xw(i.noAnimationForSolarPanelSimulation),O=null!==(t=Xw(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,Y=bf(Er),L=Object(Se.f)().scene,N=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]),E=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 We.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 Dy(E,g.latitude)}),[g.date,g.latitude]),ye=Object(r.useRef)(pe),ge=Ww.daysInYear(E)/12;Object(r.useEffect)((function(){if(R){if(!k||Ww.hasMovingParts(m))return xe(),oe.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(oe.current),ie.current||(Kh(me.t("message.SimulationAborted",N)),d((function(e){e.world.date=re.current.toLocaleString("en-US")})),bf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),de.current=!1};setTimeout((function(){we(!1)}),50)}}),[R]),Object(r.useEffect)((function(){D&&k&&!Ww.hasMovingParts(m)&&setTimeout((function(){we(!0)}),50)}),[D]),Object(r.useEffect)((function(){de.current=W,W?(ue.current=new Date(E.getTime()),cancelAnimationFrame(oe.current),f("simulationPaused",!0),Kh(me.t("message.SimulationPaused",N))):(f("simulationPaused",!1),ve())}),[W]);var we=function(e){Le(),Me();var t,l=Object(h.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")})),bf.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",N)),p)){var o=Af.getState().sumDailyPvYield(),i=Af.getState().getDailyPvProfit(),r=Af.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?(E.setTime(ue.current.getTime()),de.current=!1):(re.current=new Date(g.date),fe.current=E.getDay(),E.setHours(Math.floor(pe.sunrise/60),-X/2)),ie.current=!1,Le(),Me()},ve=function e(){if(R&&!de.current){if(E.getMinutes()+60*E.getHours()+(E.getDay()-fe.current)*by+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")})),bf.setState((function(e){e.runDailySimulationForSolarPanels=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),ie.current=!0,be(),!Y&&(Kh(me.t("message.SimulationCompleted",N)),p)){var t=Af.getState().sumDailyPvYield(),l=Af.getState().getDailyPvProfit(),a=Af.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}E.setHours(E.getHours(),E.getMinutes()+X),d((function(e){e.world.date=E.toLocaleString("en-US")}));var o,i=Object(h.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(h.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=ke(o)*t,n=0;n0){var B=Fy(U,R,J,py.SPHERE_MODEL),K=ky(g.ground,j,y,B),q=y.dot(U),Q=new We.Vector2,_=new We.Vector3;if(o.bifacialityFactor>0)for(var ee=y.clone().negate(),oe=K+ky(g.ground,j,ee,B)*o.bifacialityFactor,ie=0;ie0?q:-q*o.bifacialityFactor)*B);else for(var ce=0;ce0&&(Q.set(M+ce*D,I+se*W),_.set(Q.x-F.x,Q.y-F.y,0),_.applyEuler(m),k.set(r.x+_.x,r.y+_.y,C+_.z),Ye(e.id,k,U)||(O[ce][se]+=q*B));var de=0;Oe(N);var ue=EO(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+ky(g.ground,S,q,U)*o.bifacialityFactor,_=0;_0?X:-X*o.bifacialityFactor)*U);else for(var oe=0;oe0&&(B.set(R+oe*j,D+ie*z),K.set(B.x-M.x,B.y-M.y,0),K.applyEuler(F),I.set(r.x+K.x,r.y+K.y,W+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?E.getHours()+1===24?0:E.getHours()+1:E.getHours()]+=Te*re/(x*A)}}},Me=function(){var e,t=Object(h.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(h.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[E.getMonth()]/(30*e*G):0},Fe=function(){var e=ye.current.daylight()/60;return e>At?U.sunshineHours[E.getMonth()]/(30*e*G):0},ke=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[E.getMonth()])},Oe=function(e){if(s){var t=x(s);if(t){var l=MT(e,t.lowestTemperatures,t.highestTemperatures);he.current=WT(l.high,l.low,g.diurnalTemperatureModel,O,Dy(e,g.latitude),Ww.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(h.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Ww.fetchSimulationElements(o,_.current)}}catch(i){a.e(i)}finally{a.f()}}};return Object(pf.jsx)(pf.Fragment,{})},JO=n.a.memo(VO),GO=function(){var e=Xw(i.latitude),t=Xw(i.longitude),l=Xw(Ys),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(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(AO,{city:n}),Object(pf.jsx)(PO,{city:n}),Object(pf.jsx)(HO,{city:n}),Object(pf.jsx)(UO,{city:n}),Object(pf.jsx)(JO,{city:n}),Object(pf.jsx)(LO,{}),Object(pf.jsx)(zO,{city:n}),Object(pf.jsx)(DO,{city:n}),Object(pf.jsx)(MO,{city:n}),Object(pf.jsx)(CO,{city:n}),Object(pf.jsx)(kO,{city:n})]})},XO=n.a.memo(GO),BO=l(843),KO=l(118),qO=l(860),QO=l(573),ZO=l(861),_O=l(862),$O=l(863),eY=l(864),tY=l(865),lY=l(866),aY=l(867),oY=l(572),iY=l(301),rY=l(571),nY=l(868),cY=l(869),sY=l(870),dY="data:image/png;base64,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",uY=l(338),fY=l(91),hY=l(218),pY=l(557),yY=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,f=e.max,p=e.step,y=e.value,g=Xw(si),m=Xw(di),w=Xw(Vi),x=Xw(Ps),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)(f);Object(r.useEffect)((function(){P.current=d}),[d]),Object(r.useEffect)((function(){S.current=f}),[f]);var H={lng:w},j=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})),bf.setState((function(e){e.updateProjectsFlag=!0}))},W=function(){j&&x.owner&&x.title?function(e,t,l){var a={lng:Xw.getState().language};return oP.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()},M=function(e,t){return Object(pf.jsx)("span",{style:{display:"block",width:t+"px"},children:e})},I=function(){return Object(pf.jsx)("text",{onClick:W,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(pf.jsxs)(pf.Fragment,{children:["orientation"!==o?Object(pf.jsx)(xD.a,{content:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(ob.a,{style:{width:"240px"},addonBefore:M(me.t("word.Minimum",H)+(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(h.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&&nP(m.uid,x.title,t.projectInfo.ranges);else{var d={variable:o,minimum:e,maximum:f};t.projectInfo.ranges.push(d),m.uid&&x.title&&rP(m.uid,x.title,d)}}else{var p={variable:o,minimum:e,maximum:f};t.projectInfo.ranges=[p],m.uid&&x.title&&rP(m.uid,x.title,p)}})),P.current=e,T(!A)}}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ob.a,{style:{width:"240px"},addonBefore:M(me.t("word.Maximum",H)+(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(h.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&&nP(m.uid,x.title,t.projectInfo.ranges);else{var f={variable:o,minimum:d,maximum:e};t.projectInfo.ranges.push(f),m.uid&&x.title&&rP(m.uid,x.title,f)}}else{var p={variable:o,minimum:d,maximum:e};t.projectInfo.ranges=[p],m.uid&&x.title&&rP(m.uid,x.title,p)}})),S.current=e,T(!A)}})]}),children:I()}):Object(pf.jsx)(pf.Fragment,{children:I()}),void 0!==y&&Object(pf.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",H)+(0===y?" (\u25ad)":" (\u25af)"):y.toFixed(s))+(""!==n?n:"")}),Object(pf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(f),stroke:"gold",strokeWidth:10,onClick:W,style:{cursor:"pointer"},strokeOpacity:x.selectedProperty===o?.5:0}),Object(pf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(f),stroke:"black",strokeWidth:2}),R.map((function(e){var t=e.value,l=e.yOffset;return Object(pf.jsxs)("g",{transform:"translate(0, ".concat(l,")"),shapeRendering:"crispEdges",children:[Object(pf.jsx)("line",{x1:-5,x2:0,stroke:"black",strokeWidth:1}),Object(pf.jsx)("text",{style:{fontSize:"10px",textAnchor:"start",alignmentBaseline:"central",transform:"translateX(-25px)"},children:"orientation"===o?0===t?"\u25ad":"\u25af":t},t)]},t)}))]})},gY=n.a.memo(yY),mY={top:30,right:55,bottom:36,left:55},wY=["#e0ac2b","#e85252","#6689c6","#9a6fb0","#a53253","#69b3a2","#556b2f","#8b008b","#ff1493","#d2691e","#2f4f4f","#dc143c"],xY=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,h=e.digits,p=e.tickIntegers,y=e.hover,g=e.hoveredIndex,m=e.selectedIndex,w=l-mY.right-mY.left,x=a-mY.top-mY.bottom,v=Object(f.a)(new Set(o.map((function(e){return e.group})))),b=uY.b().range([0,w]).domain(s).padding(0),A={};s.forEach((function(e,t){var l,a;A[e]=fY.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=hY.a().domain(v).range(wY),P=pY.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(pf.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})),H=s.map((function(e,t){var l,a=A[e];return Object(pf.jsx)("g",{transform:"translate("+b(e)+",0)",children:Object(pf.jsx)(gY,{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:h[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(pf.jsx)("svg",{id:t,width:l,height:a,onContextMenu:function(e){e.stopPropagation()},children:Object(pf.jsxs)("g",{width:w,height:x,transform:"translate(".concat([mY.left,mY.top].join(","),")"),children:[S,H]})})},vY=n.a.memo(xY),bY=l(347),AY=l(161),TY=l(828),PY=l(292),SY=Object(Tv.a)(VM)(mC||(mC=Object(Av.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"]))),HY=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.symbolSize,o=e.changeHorizontalGrid,i=e.changeVerticalGrid,n=e.changeSymbolSize,c={lng:Xw(Vi)},s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(pf.jsxs)(tb.a,{children:[Object(pf.jsxs)(tb.a.Item,{children:[me.t("menu.graph.SymbolSize",c)+":",Object(pf.jsx)(oH.a,{min:1,max:8,tooltipVisible:!1,value:a,onChange:function(e){null===n||void 0===n||n(e)}})]}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:t,onClick:function(){null===o||void 0===o||o(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",c)})}),Object(pf.jsx)(tb.a.Item,{children:Object(pf.jsx)(ab.a,{checked:l,onClick:function(){null===i||void 0===i||i(!l)},children:me.t("menu.graph.ShowVerticalGridLines",c)})})]});return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(nb.a,{overlay:p,placement:"bottomRight",visible:f,onVisibleChange:function(e){h(e)},children:Object(pf.jsx)(SY,{style:{top:"120px",right:"16px"},onClick:function(e){e.stopPropagation()}})})})},jY=GT.a.TextArea,zY=yb.a.Option,RY=Tv.a.div(wC||(wC=Object(Av.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"]))),DY=Tv.a.div(xC||(xC=Object(Av.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"]))),WY=Tv.a.div(vC||(vC=Object(Av.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"]))),MY=Tv.a.div(bC||(bC=Object(Av.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),IY=Tv.a.div(AC||(AC=Object(Av.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"]))),CY=Tv.a.div(TC||(TC=Object(Av.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"]))),FY=function(e){var t,l,a,o,i,n,c,s,d,p,y,g,m,w,v,b,A,T,P,S,H,j=e.relativeWidth,R=e.canvas,D=Xw(si),M=Xw(di),I=Xw(Vi),C=Xw(ar),F=Xw(Ps),k=Xw(df),O=Xw(af),Y=Object(r.useState)(),L=Object(u.a)(Y,2),N=L[0],U=L[1],E=Object(r.useState)(),V=Object(u.a)(E,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=F.description)&&void 0!==t?t:null),ae=Object(r.useRef)(!1),oe=Object(r.useRef)(!1),ie=Object(r.useRef)(null!==(l=F.dataColoring)&&void 0!==l?l:z.ALL),re=Object(r.useRef)(!1),ne=Object(r.useRef)(null!==(a=F.designs)&&void 0!==a?a:[]),ce=Object(r.useRef)(null!==(o=F.thumbnailWidth)&&void 0!==o?o:200),se=Object(r.useRef)(null!==(i=F.xAxisNameScatteredPlot)&&void 0!==i?i:"rowWidth"),de=Object(r.useRef)(null!==(n=F.yAxisNameScatteredPlot)&&void 0!==n?n:"rowWidth"),ue=Object(r.useRef)(null!==(c=F.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=F.xAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[F.xAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;de.current=null!==(e=F.yAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[F.yAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;ue.current=null!==(e=F.dotSizeScatteredPlot)&&void 0!==e?e:5}),[F.dotSizeScatteredPlot]),Object(r.useEffect)((function(){var e;ce.current=null!==(e=F.thumbnailWidth)&&void 0!==e?e:200}),[F.thumbnailWidth]);var pe=Object(r.useMemo)((function(){return{lng:I}}),[I]),ye=M.uid===F.owner;Object(r.useEffect)((function(){if(ne.current=[],F.designs){var e,t=Object(h.a)(F.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=F.selectedProperty;if(a){var o=F.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*(Ww.calculateCost(e)-Ww.calculateCost(t)):"yearlyProfit"===a?o*(Ww.calculateProfit(e)-Ww.calculateProfit(t)):a in e&&a in t?o*(e[a]-t[a]):0:0}))}q(!K)}}),[F.designs,F.sortDescending,F.selectedProperty]),Object(r.useEffect)((function(){if(U(void 0),F.designs){var e,t=Object(h.a)(F.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,F.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),bf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},we=function(){M.uid&&F.title&&N&&function(e,t,l){var a={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:oP.a.firestore.FieldValue.arrayRemove(l)}).then((function(){bf.setState((function(e){e.updateProjectsFlag=!0})),oP.a.firestore().collection("users").doc(e).collection("designs").doc(l.title).delete().then((function(){Xw.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)}))}(M.uid,F.title,N).then((function(){D((function(e){if(e.projectInfo.designs){var t,l=-1,a=Object(h.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===N.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(j*window.innerWidth/ve-be),Te=Object(r.useMemo)((function(){var e,t,l,a,o,i;return[Gw.getVariables(F.type,null!==(e=F.hiddenParameters)&&void 0!==e?e:[]),Gw.getTitles(F.type,pe,null!==(t=F.hiddenParameters)&&void 0!==t?t:[]),Gw.getUnits(F.type,pe,null!==(l=F.hiddenParameters)&&void 0!==l?l:[]),Gw.getDigits(F.type,null!==(a=F.hiddenParameters)&&void 0!==a?a:[]),Gw.getTickIntegers(F.type,null!==(o=F.hiddenParameters)&&void 0!==o?o:[]),Gw.getTypes(F.type,null!==(i=F.hiddenParameters)&&void 0!==i?i:[])]}),[F.type,F.hiddenParameters,_,pe]),Pe=Object(u.a)(Te,6),Se=Pe[0],He=Pe[1],je=Pe[2],ze=Pe[3],Re=Pe[4],De=Pe[5],We=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a,o,i,r,n,c,s,d,u,f,p,y,g,m=t.value,w={};(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("rowWidth"))||(w.rowWidth=m.rowsPerRack),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("tiltAngle"))||(w.tiltAngle=Ww.toDegrees(m.tiltAngle)),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("interRowSpacing"))||(w.interRowSpacing=m.interRowSpacing),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("latitude"))||(w.latitude=null!==(n=m.latitude)&&void 0!==n?n:42),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("orientation"))||(w.orientation=m.orientation===$.landscape?0:1),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("poleHeight"))||(w.poleHeight=m.poleHeight),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("unitCost"))||(w.unitCost=m.unitCost),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("sellingPrice"))||(w.sellingPrice=m.sellingPrice),(null===(f=F.hiddenParameters)||void 0===f?void 0:f.includes(""))||(w.totalYearlyCost=Ww.calculateCost(m)),(null===(p=F.hiddenParameters)||void 0===p?void 0:p.includes("totalYearlyYield"))||(w.totalYearlyYield=.001*m.yearlyYield),(null===(y=F.hiddenParameters)||void 0===y?void 0:y.includes("meanYearlyYield"))||(w.meanYearlyYield=m.yearlyYield/m.panelCount),(null===(g=F.hiddenParameters)||void 0===g?void 0:g.includes("yearlyProfit"))||(w.yearlyProfit=Ww.calculateProfit(m)),w.group=F.dataColoring===z.INDIVIDUALS?m.title:"default",w.selected=N===m,w.hovered=J===m,w.invisible=m.invisible,e.push(w)}}catch(x){l.e(x)}finally{l.f()}}return e}),[F.designs,F.type,J,N,O,F.hiddenParameters,F.dataColoring,_]),Me=function(e,t){var l=t;if(F.ranges){var a,o=Object(h.a)(F.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(F.ranges){var a,o=Object(h.a)(F.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(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Me("rowWidth",k.minimumRowsPerRack)),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Me("tiltAngle",Ww.toDegrees(k.minimumTiltAngle))),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Me("interRowSpacing",k.minimumInterRowSpacing)),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Me("latitude",-90)),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(0),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Me("poleHeight",0)),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Me("unitCost",.1)),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Me("sellingPrice",.1)),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Me("totalYearlyCost",0)),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Me("totalYearlyYield",0)),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Me("meanYearlyYield",0)),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Me("yearlyProfit",-10)),f}return[]}),[k,F.type,F.ranges,F.hiddenParameters,_]),Fe=Object(r.useMemo)((function(){if(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Ie("rowWidth",k.maximumRowsPerRack)),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Ie("tiltAngle",Ww.toDegrees(k.maximumTiltAngle))),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Ie("interRowSpacing",k.maximumInterRowSpacing)),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Ie("latitude",90)),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Ie("poleHeight",5)),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Ie("unitCost",1)),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Ie("sellingPrice",.5)),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Ie("totalYearlyCost",100)),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Ie("totalYearlyYield",100)),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Ie("meanYearlyYield",1e3)),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Ie("yearlyProfit",10)),f}return[]}),[k,F.type,F.ranges,F.hiddenParameters,_]),ke=Object(r.useMemo)((function(){if(F.type===W.SOLAR_PANEL_ARRAY&&k){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(1),(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(.1),(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(.1),(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(.1),(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(.1),(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(.01),(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(.01),(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(.1),(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(1),(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(1),(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(.1),f}return[]}),[F.type,F.hiddenParameters,_]),Oe=Object(r.useRef)(!(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("rowWidth"))),Ye=Object(r.useRef)(!(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("tiltAngle"))),Le=Object(r.useRef)(!(null===(p=F.hiddenParameters)||void 0===p?void 0:p.includes("interRowSpacing"))),Ne=Object(r.useRef)(!(null===(y=F.hiddenParameters)||void 0===y?void 0:y.includes("latitude"))),Ue=Object(r.useRef)(!(null===(g=F.hiddenParameters)||void 0===g?void 0:g.includes("orientation"))),Ee=Object(r.useRef)(!(null===(m=F.hiddenParameters)||void 0===m?void 0:m.includes("poleHeight"))),Ve=Object(r.useRef)(!(null===(w=F.hiddenParameters)||void 0===w?void 0:w.includes("unitCost"))),Je=Object(r.useRef)(!(null===(v=F.hiddenParameters)||void 0===v?void 0:v.includes("sellingPrice"))),Xe=Object(r.useRef)(!(null===(b=F.hiddenParameters)||void 0===b?void 0:b.includes("totalYearlyCost"))),Be=Object(r.useRef)(!(null===(A=F.hiddenParameters)||void 0===A?void 0:A.includes("totalYearlyYield"))),Ke=Object(r.useRef)(!(null===(T=F.hiddenParameters)||void 0===T?void 0:T.includes("meanYearlyYield"))),qe=Object(r.useRef)(!(null===(P=F.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;Oe.current=!(null===(e=F.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth")),Ye.current=!(null===(t=F.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle")),Le.current=!(null===(l=F.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing")),Ne.current=!(null===(a=F.hiddenParameters)||void 0===a?void 0:a.includes("latitude")),Ue.current=!(null===(o=F.hiddenParameters)||void 0===o?void 0:o.includes("orientation")),Ee.current=!(null===(i=F.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight")),Ve.current=!(null===(r=F.hiddenParameters)||void 0===r?void 0:r.includes("unitCost")),Je.current=!(null===(n=F.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice")),Xe.current=!(null===(c=F.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost")),Be.current=!(null===(s=F.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield")),Ke.current=!(null===(d=F.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield")),qe.current=!(null===(u=F.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit")),q(!K)}),[F.hiddenParameters]),Object(r.useEffect)((function(){le.current=F.description}),[F.description]);var Qe=function(e){var t;t=e.title,D((function(e){if(e.projectInfo.designs){var l,a=Object(h.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&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};oP.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(f.a)(i.designs));var n,c=-1,s=Object(h.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,oP.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(){}))}(M.uid,F.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?M.uid&&F.title&&function(e,t,l,a){var o={lng:Xw.getState().language};return oP.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({hiddenParameters:a?oP.a.firestore.FieldValue.arrayUnion(l):oP.a.firestore.FieldValue.arrayRemove(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",o)+": "+e)}))}(M.uid,F.title,t,!e).then((function(){Ze(e,t)})):Ze(e,t)},$e=function(){D((function(e){e.projectInfo.dataColoring=ie.current})),bf.setState((function(e){e.updateProjectsFlag=!0})),q(!K)},et=function(e){ie.current=e,ye?M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,ie.current).then((function(){$e()})):$e()},tt=function(){return Object(pf.jsxs)(pf.Fragment,{children:[Object(pf.jsx)(zY,{value:"rowWidth",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})},"rowWidth"),Object(pf.jsx)(zY,{value:"tiltAngle",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})},"tiltAngle"),Object(pf.jsx)(zY,{value:"interRowSpacing",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})},"interRowSpacing"),Object(pf.jsx)(zY,{value:"latitude",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})},"latitude"),Object(pf.jsx)(zY,{value:"orientation",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})},"orientation"),Object(pf.jsx)(zY,{value:"poleHeight",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})},"poleHeight"),Object(pf.jsx)(zY,{value:"unitCost",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})},"unitCost"),Object(pf.jsx)(zY,{value:"sellingPrice",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})},"sellingPrice"),Object(pf.jsx)(zY,{value:"totalYearlyCost",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})},"totalYearlyCost"),Object(pf.jsx)(zY,{value:"totalYearlyYield",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})},"totalYearlyYield"),Object(pf.jsx)(zY,{value:"meanYearlyYield",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})},"meanYearlyYield"),Object(pf.jsx)(zY,{value:"yearlyProfit",children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})},"yearlProfit")]})},lt=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(!a.invisible&&a!==N){var o={};Gw.setScatterData(se.current,"x",o,a),Gw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,F.designs,F.type,N]),at=Object(r.useMemo)((function(){var e=[];if(F.designs&&F.type===W.SOLAR_PANEL_ARRAY){var t,l=Object(h.a)(F.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a===N){var o={};Gw.setScatterData(se.current,"x",o,a),Gw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,F.designs,F.type,N]),ot=function(e){var t={min:0,max:1};if(F.type===W.SOLAR_PANEL_ARRAY&&k)switch(e){case"rowWidth":t.min=Me("rowWidth",k.minimumRowsPerRack),t.max=Ie("rowWidth",k.maximumRowsPerRack);break;case"tiltAngle":t.min=Me("tiltAngle",Ww.toDegrees(k.minimumTiltAngle)),t.max=Ie("tiltAngle",Ww.toDegrees(k.maximumTiltAngle));break;case"interRowSpacing":t.min=Me("interRowSpacing",k.minimumInterRowSpacing),t.max=Ie("interRowSpacing",k.maximumInterRowSpacing);break;case"latitude":t.min=Me("latitude",-90),t.max=Ie("latitude",90);break;case"orientation":t.min=0,t.max=1;break;case"poleHeight":t.min=Me("poleHeight",0),t.max=Ie("poleHeight",5);break;case"unitCost":t.min=Me("unitCost",.1),t.max=Ie("unitCost",1);break;case"sellingPrice":t.min=Me("sellingPrice",.1),t.max=Ie("sellingPrice",.5);break;case"totalYearlyCost":t.min=Me("totalYearlyCost",0),t.max=Ie("totalYearlyCost",100);break;case"totalYearlyYield":t.min=Me("totalYearlyYield",0),t.max=Ie("totalYearlyYield",100);break;case"meanYearlyYield":t.min=Me("meanYearlyYield",0),t.max=Ie("meanYearlyYield",1e3);break;case"yearlyProfit":t.min=Me("yearlyProfit",-10),t.max=Ie("yearlyProfit",10)}return t},it=Object(r.useMemo)((function(){return ot(se.current)}),[se.current,F.ranges]),rt=Object(r.useMemo)((function(){return ot(de.current)}),[de.current,F.ranges]),nt=Object(r.useMemo)((function(){return Gw.getUnit(se.current,pe)}),[se.current,pe]),ct=Object(r.useMemo)((function(){return Gw.getUnit(de.current,pe)}),[de.current,pe]),st=function(e){var t=e.cx,l=e.cy;return Object(pf.jsx)(AY.a,{cx:t,cy:l,fill:"#8884d8",r:ue.current})};return Object(pf.jsx)(RY,{onContextMenu:function(e){e.stopPropagation()},children:Object(pf.jsxs)(DY,{children:[Object(pf.jsxs)(WY,{children:[Object(pf.jsx)("span",{children:(ye?me.t("projectPanel.Project",pe):me.t("projectPanel.ProjectByOtherPeople",pe))+": "+F.title+(ye?"":" ("+me.t("word.Owner",pe)+": "+(null===(S=F.owner)||void 0===S?void 0:S.substring(0,4))+"***)")+" ("+ne.current.length+")"}),Object(pf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ge()},onTouchStart:function(){ge()},children:Object(pf.jsx)(KO.a,{title:me.t("word.Close",pe)})})]}),Object(pf.jsx)(qR.a,{style:{backgroundColor:"white",border:"none"},onChange:function(e){oe.current=e.length>0,q(!K)},children:Object(pf.jsx)(qR.a.Panel,{style:{backgroundColor:"white",border:"none"},header:Object(pf.jsxs)(MY,{children:[Object(pf.jsx)("span",{children:me.t("projectPanel.ProjectDescription",pe)+" | "+me.t("projectPanel.ProjectType",pe)+": "+F.type}),Object(pf.jsxs)("span",{children:[ye&&Object(pf.jsxs)(pf.Fragment,{children:[oe.current&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),te.current=!te.current,q(!K)},children:te.current?Object(pf.jsx)(qO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionNonEditable",pe)}):Object(pf.jsx)(QO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionEditable",pe)})}),Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),bf.setState((function(e){e.curateDesignToProjectFlag=!0}))},children:Object(pf.jsx)(ZO.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.CurateCurrentDesign",pe)})}),N&&N.title===C&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){var t;(e.stopPropagation(),R&&M.uid&&F.title&&C)&&function(e,t,l,a,o,i){var r={lng:Xw.getState().language};return bf.setState((function(e){e.waiting=!0})),oP.a.firestore().collection("users").doc(e).collection("designs").doc(o).set(Xw.getState().exportContent()).then((function(){if(bf.getState().setChanged(!1),i){var n=Ww.resizeCanvas(i,a).toDataURL();oP.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(f.a)(i.designs));var s,d=-1,p=Object(h.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]=cP(t,o,n),oP.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(){Xw.getState().set((function(e){e.projectInfo.designs=c})),bf.setState((function(e){e.updateProjectsFlag=!0,e.waiting=!1}))})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",r)+": "+e)})).finally((function(){}))}}))}(M.uid,F.type,F.title,null!==(t=F.thumbnailWidth)&&void 0!==t?t:200,C,R).then((function(){q(!K)}))},children:Object(pf.jsx)(_O.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.UpdateSelectedDesign",pe)})}),N&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),we(),U(void 0)},children:Object(pf.jsx)($O.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.RemoveSelectedDesign",pe)})}),N&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){if(e.stopPropagation(),F.title){var t=Ge+"?client=web&userid="+M.uid+"&project="+encodeURIComponent(F.title);N&&(t+="&title="+encodeURIComponent(N.title)),Zh(t),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",pe)+".")}},children:Object(pf.jsx)(eY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectListPanel.GenerateProjectLink",pe)})})]}),F.designs&&F.designs.length>1&&F.selectedProperty&&Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),D((function(e){e.projectInfo.sortDescending=!e.projectInfo.sortDescending}))},children:F.sortDescending?Object(pf.jsx)(tY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)}):Object(pf.jsx)(lY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)})}),Object(pf.jsx)(xD.a,{title:Object(pf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("projectPanel.ProjectSettings",pe)}),content:function(){return Object(pf.jsx)("div",{style:{width:"250px"},onClick:function(e){return e.stopPropagation()},children:Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{span:14,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.ThumbnailImageSize",pe),": "]})}),Object(pf.jsx)(BT.a,{span:10,children:Object(pf.jsxs)(yb.a,{style:{width:"100%"},value:ce.current,onChange:function(e){ce.current=e,ye?M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){D((function(e){e.projectInfo.thumbnailWidth=ce.current}))})):D((function(e){e.projectInfo.thumbnailWidth=ce.current})),q(!K)},children:[Object(pf.jsx)(zY,{value:100,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Small",pe)})},"small-thumbnail"),Object(pf.jsx)(zY,{value:125,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Medium",pe)})},"medium-thumbnail"),Object(pf.jsx)(zY,{value:200,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Large",pe)})},"large-thumbnail")]})})]})})},children:Object(pf.jsx)(Sv.a,{style:{border:"none",padding:"4px"},onClick:function(e){return e.stopPropagation()},children:Object(pf.jsx)(aY.a,{style:{fontSize:"24px",color:"gray"}})})})]})]}),children:Object(pf.jsx)(jY,{title:te.current?void 0:me.t("projectPanel.DoubleClickToMakeDescriptionEditable",pe),bordered:te.current,readOnly:!te.current,value:null!==(H=le.current)&&void 0!==H?H: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&&M.uid&&ye&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.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(pf.jsxs)(CY,{children:[Object(pf.jsx)(BO.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===F.thumbnailWidth?8:125===F.thumbnailWidth?12:30;return Object(pf.jsxs)(BO.b.Item,{style:{marginBottom:"-28px"},onMouseOver:function(){G(e)},onMouseLeave:function(){G(void 0)},children:[Object(pf.jsx)("img",{loading:"eager",width:Ae+"px",height:"auto",onError:function(e){e.target.src=dY},onLoad:function(t){D((function(l){l.projectImages.set(e.title,t.target)})),bf.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":"")+(N===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:dY,style:{transition:".5s ease",opacity:J===e?.5:1,padding:"1px",cursor:"pointer",borderRadius:N===e?"0":"10px",border:N===e?"2px solid red":"none"},onDoubleClick:function(t){var l=t.target;l.src===dY&&(l.src=e.thumbnailUrl),U(e),F.owner&&hP(F.owner,e.title,!0,!0).then((function(){}))},onClick:function(t){var l=t.target;l.src===dY&&(l.src=e.thumbnailUrl),U(e!==N?e:void 0)}}),Object(pf.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(pf.jsxs)("div",{style:{position:"relative",right:"10px",textAlign:"right",bottom:"36px",color:"white"},children:[e.title===C&&Object(pf.jsx)(oY.a,{style:{paddingRight:"4px",fontSize:"16px"}}),e.invisible?Object(pf.jsx)(iY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignNotShownInSolutionSpaceClickToShow",pe)}):Object(pf.jsx)(rY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignShownInSolutionSpaceClickToHide",pe)})]})]})}}),Object(pf.jsxs)(IY,{children:[Object(pf.jsx)("span",{style:{paddingLeft:"20px"},children:me.t("projectPanel.DistributionInSolutionSpace",pe)}),Object(pf.jsxs)("span",{children:[F.type===W.SOLAR_PANEL_ARRAY&&Object(pf.jsx)(xD.a,{title:me.t("projectPanel.ChooseSolutionSpace",pe),onVisibleChange:function(e){re.current&&(e||bf.setState((function(e){e.updateProjectsFlag=!0})),re.current=!1)},content:Object(pf.jsxs)("div",{children:[Object(pf.jsx)(ab.a,{onChange:function(e){Oe.current=e.target.checked,_e(Oe.current,"rowWidth"),ee(!_)},checked:Oe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ye.current=e.target.checked,_e(Ye.current,"tiltAngle"),ee(!_)},checked:Ye.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Le.current=e.target.checked,_e(Le.current,"interRowSpacing"),ee(!_)},checked:Le.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ne.current=e.target.checked,_e(Ne.current,"latitude"),ee(!_)},checked:Ne.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ue.current=e.target.checked,_e(Ue.current,"orientation"),ee(!_)},checked:Ue.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ee.current=e.target.checked,_e(Ee.current,"poleHeight"),ee(!_)},checked:Ee.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ve.current=e.target.checked,_e(Ve.current,"unitCost"),ee(!_)},checked:Ve.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Je.current=e.target.checked,_e(Je.current,"sellingPrice"),ee(!_)},checked:Je.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Xe.current=e.target.checked,_e(Xe.current,"totalYearlyCost"),ee(!_)},checked:Xe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Be.current=e.target.checked,_e(Be.current,"totalYearlyYield"),ee(!_)},checked:Be.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){Ke.current=e.target.checked,_e(Ke.current,"meanYearlyYield"),ee(!_)},checked:Ke.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})}),Object(pf.jsx)("br",{}),Object(pf.jsx)(ab.a,{onChange:function(e){qe.current=e.target.checked,_e(qe.current,"yearlyProfit"),ee(!_)},checked:qe.current,children:Object(pf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})})]}),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(nY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(xD.a,{title:me.t("projectPanel.ChooseDataColoring",pe),content:function(){var e;return Object(pf.jsx)("div",{children:Object(pf.jsxs)(rb.a.Group,{onChange:function(e){et(e.target.value)},value:null!==(e=F.dataColoring)&&void 0!==e?e:z.ALL,children:[Object(pf.jsx)(rb.a,{style:{fontSize:"12px"},value:z.ALL,children:me.t("projectPanel.SameColorForAllDesigns",pe)}),Object(pf.jsx)("br",{}),Object(pf.jsx)(rb.a,{style:{fontSize:"12px"},value:z.INDIVIDUALS,children:me.t("projectPanel.OneColorForEachDesign",pe)})]})})}(),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(cY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(xD.a,{title:me.t("projectPanel.GenerateScatteredPlot",pe),content:Object(pf.jsxs)("div",{style:{width:"280px"},children:[Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(pf.jsx)(BT.a,{span:8,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectXAxis",pe),": "]})}),Object(pf.jsx)(BT.a,{span:16,children:Object(pf.jsx)(yb.a,{style:{width:"100%"},value:se.current,onChange:function(e){se.current=e,ye&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(pf.jsxs)(XT.a,{gutter:6,style:{paddingBottom:"8px"},children:[Object(pf.jsx)(BT.a,{span:8,style:{paddingTop:"5px"},children:Object(pf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectYAxis",pe),": "]})}),Object(pf.jsx)(BT.a,{span:16,children:Object(pf.jsx)(yb.a,{style:{width:"100%"},value:de.current,onChange:function(e){de.current=e,ye&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(pf.jsx)(XT.a,{style:{paddingBottom:"8px"},children:Object(pf.jsxs)("div",{children:[Object(pf.jsxs)(TY.a,{id:"scattered-chart",width:280,height:240,margin:{top:0,right:0,bottom:-10,left:-10},children:[Object(pf.jsx)(WM.a,{strokeWidth:"1",stroke:"gray",horizontal:fe.current,vertical:he.current}),Object(pf.jsx)(IM.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(pf.jsx)(FM.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(pf.jsx)(DM.a,{cursor:{strokeDasharray:"3 3"},formatter:function(e){return e.toFixed(2)}}),Object(pf.jsx)(PY.a,{name:"All",data:lt,fill:"#8884d8",shape:Object(pf.jsx)(st,{})}),N&&Object(pf.jsx)(PY.a,{name:"Selected",data:at,fill:"red",shape:"star"})]}),Object(pf.jsx)(HY,{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&&M.uid&&F.title&&function(e,t,l){var a={lng:Xw.getState().language};return oP.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)}))}(M.uid,F.title,e).then((function(){})),q(!K)}})]})}),Object(pf.jsx)(XT.a,{children:Object(pf.jsx)("span",{style:{width:"100%",textAlign:"center"},children:Object(pf.jsx)(UC.a,{style:{fontSize:"18px",color:"gray",paddingRight:"8px"},title:me.t("projectPanel.ScatteredPlotScreenshot",pe),onClick:function(){var e=document.getElementById("scattered-chart");e&&Object(bY.saveSvgAsPng)(e,"scattered-chart-"+F.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))}})})})]}),children:Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(pf.jsx)(sY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(pf.jsx)(Sv.a,{style:{border:"none",paddingRight:"20px",background:"white"},onClick:function(){var e=document.getElementById("design-space");e&&Object(bY.saveSvgAsPng)(e,"design-space-"+F.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))},children:Object(pf.jsx)(UC.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.SolutionSpaceScreenshot",pe)})})]})]}),Object(pf.jsx)(vY,{id:"design-space",width:j*window.innerWidth,height:xe/2-120,data:We,types:De,minima:Ce,maxima:Fe,steps:ke,variables:Se,titles:He,units:je,digits:ze,tickIntegers:Re,hover:function(e){F.designs&&e>=0&&e0){bf.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})),bf.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}()&&bf.setState((function(e){e.saveLocalFileDialogVisible=!1})),x(!1)},C=function(){bf.setState((function(e){e.saveLocalFileDialogVisible=!1}))};return Object(pf.jsx)(pf.Fragment,{children:Object(pf.jsx)(lb.a,{title:Object(pf.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(pf.jsx)(Sv.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(pf.jsx)(Sv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(pf.jsx)(Sv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")]:[Object(pf.jsx)(Sv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(pf.jsx)(Sv.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(pf.jsx)(qT.a,{disabled:!A,bounds:H,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();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(pf.jsx)("div",{ref:z,children:e})})},children:Object(pf.jsx)(GT.a,{placeholder:"File name",value:h,onPressEnter:I,onChange:function(e){a((function(t){t.localFileName=e.target.value}))}})})})},UY=n.a.memo(NY),EY=function(){var e=Xw(Ji),t=Xw((function(e){return e.world})),l=Xw((function(e){return e.elements})),a=Xw((function(e){return e.viewState})),o=Xw((function(e){return e.notes})),i=bf(Us),n=bf(Es),c=bf(Wi),s=bf(Mi),d=Xw(Ms),u=Xw(Cs),f=Xw(ks),h=Xw(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(),bf.setState((function(e){e.openModelsMap=g,g&&(e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.leaderboardFlag=!0,e.showLeaderboard=!0)}))}),[]),Object(r.useEffect)((function(){bf.getState().skipChange?s(!1):bf.getState().changed||c(!0)}),[t,a,l,o]),Object(r.useEffect)((function(){i&&bf.setState((function(e){e.showSolarRadiationHeatmap=!1})),n&&bf.setState((function(e){e.showHeatFluxes=!1}))}),[t,l]),Object(pf.jsx)(qw.a,{locale:e,children:Object(pf.jsxs)(Bw,{children:[y?Object(pf.jsx)(LY,{viewOnly:!0}):Object(pf.jsxs)(Kw.a,{onBeforeunload:function(){return""},children:[Object(pf.jsx)(LY,{viewOnly:!1})," "]}),Object(pf.jsx)(UY,{viewOnly:y})]})})};s.a.render(Object(pf.jsx)(n.a.StrictMode,{children:Object(pf.jsx)(EY,{})}),document.getElementById("root"))}},[[789,1,2]]]); +//# sourceMappingURL=main.eb054a75.chunk.js.map \ No newline at end of file diff --git a/static/js/main.71a8bdfe.chunk.js.map b/static/js/main.eb054a75.chunk.js.map similarity index 54% rename from static/js/main.71a8bdfe.chunk.js.map rename to static/js/main.eb054a75.chunk.js.map index d30c2bb62..baed30b08 100644 --- a/static/js/main.71a8bdfe.chunk.js.map +++ b/static/js/main.eb054a75.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","models/Groupable.ts","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/parapet.tsx","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","components/groupMaster.tsx","analysis/SunMinutes.ts","analysis/sunTools.ts","views/solarUpdraftTower.tsx","resources/glow.png","views/solarPowerTower.tsx","views/solarReceiverPipe.tsx","models/DoorModel.ts","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/wall/wall.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/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/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/windowShutterSubMenu.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/windowShutterColorSelection.tsx","components/contextMenu/elementMenu/windowShutterWidthInput.tsx","components/contextMenu/elementMenu/windowMenu.tsx","components/contextMenu/elementMenu/windowItemSelection.tsx","components/contextMenu/elementMenu/windowNumberInput.tsx","components/contextMenu/elementMenu/windowUValueInput.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/rename.png","assets/delete.png","assets/create_link.png","panels/cloudFilePanel.tsx","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/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","PrivacyInfo","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","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","AllCuboids","OnlyThisSide","AllSidesOfThisCuboid","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","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","AllSolarPanels","pvModelPanel","SolarPanelSpecs","PanelSize","Cells","CellType","Monocrystalline","Polycrystalline","ThinFilm","Bifacial","BifacialityFactor","Black","Blue","ShadeTolerance","SolarCellEfficiency","NominalOperatingCellTemperature","TemperatureCoefficientOfPmax","parabolicTroughMenu","ModuleLength","Modules","ModulesLong","LatusRectum","OnlyThisParabolicTrough","AllParabolicTroughsAboveFoundation","AllParabolicTroughs","fresnelReflectorMenu","AbsorberPipe","SelectAbsorberToReflectSunlightTo","OnlyThisFresnelReflector","AllFresnelReflectorsAboveFoundation","AllFresnelReflectors","heliostatMenu","Tower","SelectTowerToReflectSunlightTo","OnlyThisHeliostat","AllHeliostatsAboveFoundation","AllHeliostats","parabolicDishMenu","ReceiverStructure","CentralPole","CentralPoleWithTripod","Quadrupod","RimDiameter","ExtraPoleHeightInAdditionToRadius","OnlyThisParabolicDish","AllParabolicDishesAboveFoundation","AllParabolicDishes","wallMenu","TextureDefault","SizeOfWall","OnlyThisWall","AllConnectedWalls","AllWallsAboveFoundation","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","AllWindows","Mullion","MullionWidth","MullionSpacing","MullionColor","Tint","SolarHeatGainCoefficient","Shutter","LeftShutter","RightShutter","BothShutters","ShutterWidth","ShutterColor","Frame","FrameWidth","SillWidth","WindowType","Default","Arched","Polygonal","Interior","roofMenu","OnlyThisRoof","AllRoofsAboveFoundation","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","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","EnableNavigation","DisableNavigation","Move","MoveInstruction","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","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","clickToAccessCloudTools","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","shutter","showLeft","windowShutterLeft","showRight","windowShutterRight","windowShutterColor","windowShutterWidth","Window","mullion","windowMullion","mullionWidth","windowMullionWidth","mullionSpacing","windowMullionSpacing","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","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","autoDeletedRoof","autoDeletedChild","groupActionMode","groupMasterId","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","spacingX","spacingY","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","shutterWidth","shutterHeight","shutterPosX","shutterPosZ","glassShape","getArchedWindowShape","renderSealPlane","showMullion","showFrame","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","_","isGroupable","useGroupMaster","elementModel","enableGroupMaster","buildingResizerUpdateFlag","baseGroupSetRef","Set","baseVerticesRef","childCuboidSetRef","groupMasterDimension","setGroupMasterDimension","groupMasterPosition","setGroupMasterPosition","groupMasterRotation","setGroupMasterRotation","isCuboid","setBaseVertices","checkOverlapWithAllBases","size","setGroupedBasesData","setSingleBaseData","base","zero","getWorldDataById","pos","rot","center","rotateAround","setAllChildBases","el","has","isChild","areTwoBasesOverlapped","maxHeight","maxTopZ","elem","wall","roofId","topZ","bound","calculatePolygonBounds","parentWorldPos","parentTopZ","boundCenterWorldPos","relativePosition","setZ","maxChildHeight","maxBaseZ","baseGroupSet","childCuboidSet","useSelected","selectedElementIdSet","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","useMultiCurrWallArray","currentWallArray","isLoopRef","useRoofHeight","highestWallHeight","useUpdateOldRoofFiles","centerPoint","wallArray","getWallPoint","calculatePolygonCentroid","Number","isNaN","centerPointV3","overhangs","res","getWallNormal","wallPointsAfterOffset","overhangHeight","dLeft","overhangHeightLeft","dRight","overhangHeightRight","getOverhangHeight","getWallHeight","lh","rh","wallLeftPointAfterOverhang","wallRightPointAfterOverhang","leftPointAfterOverhang","rightPointAfterOverhang","addVectors","divideScalar","ceilingPoints","isFirstRender","useIsFirstRender","addIdRoofId","addedRoofId","wallsIdSet","needUpdateWallsId","newWallsIdArray","newWallsIdSet","leftRoofHeight","rightRoofHeight","setAddedRoofId","useUpdateRooftopElements","checkIsFlatRoof","isFlatRoof","setIsFlatRoof","heatmapTextures","setHeatmapTextures","flatHeatmapTexture","setFlatHeatmapTexture","updateSegmentVertices","useUpdateSegmentVerticesMap","fetchHeatmapTexture","segmentVertices","minX","MAX_VALUE","minY","maxX","vcx","vcy","wrapT","wrapS","RepeatWrapping","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","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","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","DEFAULT_PARAPET_SETTINGS","display","parapetHeight","copingsWidth","copingsHeight","wallData","parapetZ","currWallPointData","leftWallPointData","rightWallPointData","bodyHeight","useWallTexture","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","intersection","intersections","eventObject","stopPropagation","wallPointData","innerOffset","outerOffset","leftPointV3","rightPointV3","v3","v4","k1","k2","x0","y0","useHandleSize","handleSize","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","oldParent","newParent","absLx","absLz","WALL_OUTSIDE_SURFACE_MESH_NAME","addUndoableAddRooftopElement","undoableAdd","addedElement","handleAddElementOnRoof","includes","getPointerOnRoof","posRelToFoundation","posRelToCentroid","computeState","makeSolarPanel","solarPanelModelName","solarPanelOrientation","solarPanelPoleHeight","solarPanelPoleSpacing","solarPanelTiltAngle","solarPanelRelativeAzimuth","solarPanelFrameColor","makeWindow","makeSensor","makeLight","lightDistance","lightIntensity","lightColor","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","walls","lw","rw","leftMostWall","rightMostWall","highestLz","longestEavesLength","composedWallArray","isGabled","getHighestComposedWallHeight","ignoreSide","getHighestWallHeight","riseInnerState","setRiseInnerState","mansardTop","relToFoundation","getRoofPointsOfGambrelRoof","gambrelRoof","frontRidgeRightPoint","backRidgeRightPoint","topRidgeRightPoint","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","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","Operation","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","ResizeHandle","MoveHandle","mesh","initalPosition","initalDimension","initalRotation","aspectRatio","lockAspectRatio","intersectionPlanePositionRef","intersectionPlaneRotationRef","resizeAnchorRef","elementHeightMapRef","wallRelPointsMapRef","partialWallHeightMapRef","skylightRelPosMapRef","baseRelPosMapRef","baseRotationMapRef","basePosRatioMapRef","baseDmsRatioMapRef","resizerCenterRelPosRef","foundatonOldDataMapRef","wallOldPointsMapRef","elementOldHeightMapRef","oldPartialWallHeightMapRef","oldSkyligthPosMapRef","setHx","setHy","setHeight","operation","setOperation","getThree","setDimension","initPointerDown","setCommonStoreHandleType","updateUndoableResizeXY","foundationDataMap","wallPointsMap","skyligthPosMap","updateUndoableResizeZ","heightMap","partialWallHeightMap","partialWallHeight","upperLeft","upperRight","lowerLeft","lowerRight","updateFoundationGroupPosition","pointerDownBottomResizeHandle","positionV2","ResizeXY","currLx","currLy","leftPointRelative","rightPointRelative","pointerDonwTopResizeHandle","cameraX","cameraY","ResizeZ","bottomHanldeZ","topHanldeZ","moveHanldeX","moveHnadleY","resizeHandleY","UpperLeftTop","UpperRightTop","LowerLeftTop","LowerRightTop","Upper","Lower","RotateLower","RotateUpper","resizerCenter","elemCenter","pointer2D","anchor","diagonalVector","diagonalDistance","tempWorldDataMap","posRatio","dmsRatio","newLx","newLy","parentWorldData","worldCenter","relativeCenter","leftRelPoint","rightRelPoint","diagonal","updateElementOnRoofFn","resizeXY","heightRatio","newHeight","resizeZ","rotateAngle","groupSize","oldCenter","newCenter","rotate","oldPositionMap","newPositionMap","foundationNewDataMap","wallNewPointsMap","newSkylightPosMap","undoableReizeXY","oldFoundationDataMap","newFoundationDataMap","oldWallPointsMap","newWallPointsMap","oldSkylightPosMap","addUndoableResizeXY","newHeightMap","newPartialWallHeightMap","undoableResizeZ","oldElementHeightMap","newElementHeightMap","oldPartialWallHeightMap","addUndoableReseizeZ","InnerCommonStoreState","action","obj","startsWith","Resize","useSolarPanelHeatmapTexture","useSolarPanelTexture","customizedFrameColor","customizedBacksheetColor","cellType","backsheetColor","canvasTexture","portrait","drawSolarPanelCanvasTexture","ny","ctx","getContext","fillStyle","fillRect","padding","gap","cellSizeX","cellSizeY","beginPath","CanvasTexture","dms","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","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","structureSpacing","structureWidth","structureColor","unfilledHeight","useUpdateOldFiles","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","setGroupMasterId","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","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","detachId","targetWallId","addedWall","isPlantOrHuman","wp","resizeAnchor2D","rp","wbc","dyl","wcx","rc","dxl","parabolicTroughWidth","fresnelReflectorWidth","diameter","parabolicDishRimDiameter","wallAuxToWall","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","insideBoundary","noCollision","pointerOnRoof","anchorWorldPos","pointerRelToFoundation","diffVector","getNewResizedData","whx","whz","lowerLeftPoint","lowerRightPoint","pointerRelToLowerLeft","botNormal","topXRelToLeft","projectOnVector","newTopX","topToBotDist2D","topToBotDist","newPolygonTop","anchorRelToFoundation","rectHeight","anchorToCenterNormal","addUndoableReizePolygonTop","mullionSpacingX","mullionSpacingY","wireframeRadius","RectangleWindow","RulerOnWall","yOffset","defaultShutter","WINDOW_GROUP_NAME","GROUP_NAME","isAllowedToSelectMe","onClickResizeHandle","dimensionData","positionData","positionY","isClickedOnHandles","renderWindow","WallWireFrame","showParapet","leftHeight","rightHeight","cl","cr","ElBeingAddedStatus","DoorWireFrame","ul","ur","ll","lr","DoorFrame","RectangleDoor","doorShape","ArchedDoor","ihx","ihz","iah","DoorHandleWrapper","DoorSealPlanes","doorModel","isFileChangedFlag","door","useUpdateOldDoors","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","WallHeatFlux","isPartialWallFull","frameVertices","getWallVertices","partialWallVertices","getPartialWallVertices","frameArea","doors","getHighestPointOfWall","halfDif","isWall","WALL_BLOCK_PLANE","WALL_INTERSECTION_PLANE_NAME","WALL_PADDING","InsideWallMaterial","night","BackSide","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","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","dimensionXZ","positionXZ","isValidToAddRoof","rect","sameHeight","isSettingElementStartPoint","status","SettingStartPoint","getPointer","object3D","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","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","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","currWorldPosition","currWorldRotation","childWorldPosition","relPos","NS","EW","resizeLx","isYResizeHandle","resizeLy","handleRotate","parentWorldRot","worldPos","handleObject","topHandleWorldPosition","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","baseId","getBaseId","legalAddToCuboid","diff","handleAddElement","legalOnCuboid","isSolarPanelNewAzimuthOk","sensorModel","light","heatFlux","applyAxisAngle","absoluteCoordinates","lit","lightModel","parentThickness","CUBOID_WRAPPER_NAME","CUBOID_STACKABLE_CHILD","CuboidRenderer","showGroupMaster","isStackableChild","design","yearlyYield","sellingPrice","panelCount","unitCost","lat","model","title","userid","newWidth","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","childId","checkLock","ifNeedListenToAutoDeletion","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","newRoof","ceilingRValue","newGambrelRoof","oldGambrelRoof","DefaultViewState","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","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","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","cut","autoDeleted","removed","currentWall","observer","cache","countAllElements","countAllElementsByType","ancestorId","includingLocked","idOk","copyCutElements","copiedElements","elementsMapOldToNew","elementsMapNewToOld","oldElem","newElem","oldRoofId","oldWallId","elemToPaste","isPositionRelative","approved","getAllChildren","elementMap","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","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","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","Ground","setElementRotation","groundModel","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","isRoofTopElement","updateBaseGroupPosition","moveElementOnPointerUp","newHumanOrPlantParentId","rotatedElementId","rotatedElementType","rotateElementOnPointerUp","setBasePosMap","currElem","handleGroupMaster","handleTempHumanPlantChild","getFirstStackableCuboid","firstIntersectedCuboidObject","intersect","firstIntersectedCuboidObjectId","legalOnGround","handleHumanAndPlantPositionFixedOnParent","handleResize","sizeOk","centerPointAbsPos","leftPointAbsPos","rightPointAbsPos","centerPointRelativePos","leftPointRelativePos","rightPointRelativePos","verticesAbsPos","centerPos","relPosToFoundation","handleMove","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","updateColor","AllObjectsOfThisType","needChange","oldColorsAll","undoableChangeAll","oldValues","onChangeComplete","paddingTop","FoundationLengthInput","inputValue","setInputValue","denormalizedPosMapRef","oldChildrenVerticesMapRef","newChildrenVerticesMapRef","denormalizedVerticesMapRef","rejectRef","rejectedValue","rejectChange","doesNewSizeContainAllChildren","containsAllChildren","updateLxWithChildren","newX","newY","attachToObjectGroup","setLx","oldLxsAll","oldSizes","oldChildrenVerticesMap","newChildrenVerticesMap","ps","vs","FoundationWidthInput","denormalizedPositionMapRef","updateLyWithChildren","updateLy","oldLysAll","FoundationHeightInput","updateLzAndCzById","updateLzAndCzForAll","updateCzOfChildren","setLz","oldLzsAll","FoundationAzimuthInput","updateAzimuth","oldAzimuthsAll","oldAzimuth","FoundationTextureSelection","selectedTexture","setSelectedTexture","updateFoundationTextureById","updateFoundationTextureForAll","updateTexture","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","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","updateInMap","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","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","solarPanels","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","oldLineStylesAll","oldLineStylesOnSurface","oldLineStylesAboveFoundation","oldStyle","Dotted","PolygonLineWidthSelection","selectedLineWidth","setSelectedLineWidth","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","oldModelsAll","oldModelsAboveFoundation","oldModelsOnSurface","isParentCuboid","oldModel","SolarPanelOrientationSelection","selectedOrientation","setSelectedOrientation","updateSolarPanelOrientationById","updateSolarPanelOrientationAboveFoundation","updateSolarPanelOrientationOnSurface","updateSolarPanelOrientationForAll","checkElementOnRoofState","withinParent","setOrientation","oldOrientationsAll","oldOrientationsAboveFoundation","oldOrientationsOnSurface","oldOrientation","SolarPanelLengthInput","setDx","updateSolarPanelLxById","panelizeLx","updateSolarPanelLxAboveFoundation","updateSolarPanelLxOnSurface","updateSolarPanelLxForAll","setLength","oldLengthsAll","oldLengthsAboveFoundation","oldLengthsOnSurface","oldLength","panelize","SolarPanelWidthInput","setDy","updateSolarPanelLyById","panelizeLy","updateSolarPanelLyAboveFoundation","updateSolarPanelLyOnSurface","updateSolarPanelLyForAll","oldWidthsAll","oldWidthsAboveFoundation","oldWidthsOnSurface","SolarPanelTiltAngleInput","isOnWall","updateSolarPanelTiltAngleAboveFoundation","isReverse","updateSolarPanelTiltAngleOnSurface","updateSolarPanelTiltAngleForAll","setTiltAngle","oldTiltAnglesAll","oldTiltAnglesAboveFoundation","oldTiltAnglesOnSurface","oldTiltAngle","SolarPanelRelativeAzimuthInput","updateRelativeAzimuthById","updateRelativeAzimuthOnSurface","updateRelativeAzimuthAboveFoundation","updateRelativeAzimuthForAll","setRelativeAzimuth","oldRelativeAzimuthsAll","ra","oldRelativeAzimuthsAboveFoundation","oldRelativeAzimuthsOnSurface","oldRelativeAzimuth","SolarPanelTrackerSelection","selectedTrackerType","setSelectedTrackerType","updateSolarPanelTrackerTypeById","updateSolarPanelTrackerTypeAboveFoundation","updateSolarPanelTrackerTypeOnSurface","updateSolarPanelTrackerTypeForAll","setTrackerType","tracker","oldTrackerTypesAll","tt","oldTrackerTypesAboveFoundation","oldTrackerTypesOnSurface","oldTrackerType","SolarPanelPoleHeightInput","updatePoleHeightById","updatePoleHeightOnSurface","updatePoleHeightAboveFoundation","updatePoleHeightForAll","setPoleHeight","oldPoleHeightsAll","oldPoleHeightsAboveFoundation","oldPoleHeightsOnSurface","oldPoleHeight","SolarPanelPoleSpacingInput","updateSolarPanelPoleSpacingById","updateSolarPanelPoleSpacingAboveFoundation","updateSolarPanelPoleSpacingOnSurface","updateSolarPanelPoleSpacingForAll","setPoleSpacing","oldPoleSpacingsAll","oldPoleSpacingsAboveFoundation","oldPoleSpacingsOnSurface","oldPoleSpacing","SolarPanelFrameColorSelection","updateSolarPanelFrameColorById","updateSolarPanelFrameColorAboveFoundation","updateSolarPanelFrameColorOnSurface","updateSolarPanelFrameColorForAll","setFrameColor","oldFrameColorsAll","fc","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","oldLatusRectumsAll","oldLatusRectumsAboveFoundation","oldLatusRectum","ParabolicTroughModuleLengthInput","setModuleLength","oldModuleLengthsAll","ml","oldModuleLengthsAboveFoundation","oldModuleLength","ParabolicTroughReflectanceInput","updateAboveFoundation","setReflectance","oldReflectancesAll","rf","oldReflectancesAboveFoundation","oldReflectance","ParabolicTroughAbsorptanceInput","oldAbsorptancesAll","oldAbsorptancesAboveFoundation","oldAbsorptance","ParabolicTroughOpticalEfficiencyInput","oldOpticalEfficienciesAll","oldOpticalEfficienciesAboveFoundation","oldOpticalEfficiency","ParabolicTroughThermalEfficiencyInput","oldThermalEfficienciesAll","oldThermalEfficienciesAboveFoundation","oldThermalEfficiency","ParabolicTroughMenu","moduleLengthDialogVisible","setModuleLengthDialogVisible","latusRectumDialogVisible","setLatusRectumDialogVisible","reflectanceDialogVisible","setReflectanceDialogVisible","absorptanceDialogVisible","setAbsorptanceDialogVisible","opticalEfficiencyDialogVisible","setOpticalEfficiencyDialogVisible","thermalEfficiencyDialogVisible","setThermalEfficiencyDialogVisible","ParabolicDishDiameterInput","setDiameter","oldDiametersAll","di","oldDiametersAboveFoundation","oldDiameter","ParabolicDishPoleHeightInput","ParabolicDishLatusRectumInput","ParabolicDishReflectanceInput","ParabolicDishAbsorptanceInput","pd","ParabolicDishOpticalEfficiencyInput","ParabolicDishThermalEfficiencyInput","ParabolicDishStructureTypeInput","inputStructureType","setInputStructureType","setStructureType","oldStructureTypesAll","st","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","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","ShutterSide","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","updateTextureInMap","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","WindowShutterColorSelection","updatedWindow","WindowShutterWidthInput","WindowDataType","WindowShutterSubMenu","shutterWidthDialogVisible","setShutterWidthDialogVisible","selectShutter","both","setWindowShutter","oldShow","newShow","WindowItemSelection","selectedItem","onItemChange","updateOnSameWall","WindowNumberInput","note","digit","oldValuesOnSameWall","undoableChangeOnSameParent","WindowUValueInput","_defs","_path","_path2","_path3","_path4","_path5","_path6","SelectionDialogSettings","NumberDialogSettings","WindowMenu","updateWindowMullionById","updateWindowTypeById","updateWindowFrameById","updateEmptyWindowById","renderTypeSubMenu","RoofTextureSelection","updatedRoof","RoofTexture01Icon","RoofTexture02Icon","RoofTexture03Icon","RoofTexture04Icon","RoofTexture05Icon","RoofTexture06Icon","RoofTexture07Icon","RoofColorSelection","RoofThicknessInput","inputLength","setInputLength","setThickness","oldThicknessAll","oldThicknessAboveFoundation","oldThickness","RoofRafterSpacingInput","updateRoofRafterSpacingById","setRafterSpacing","oldSpacingAll","oldSpacingAboveFoundation","oldSpacing","RoofOpacityInput","GlassTintSelection","selectedTint","setSelectedTint","updateTintById","undoTintInMap","setTint","oldTintsAll","oldTintsAboveFoundation","oldTint","RoofRafterWidthInput","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","RenameImage","LinkImage","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","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","changeProjectTitle","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","restore","pointerEvents","AutoDeletionListener","handleUndoAutoDeletion","manualDeletedElements","manualCutElements","listenToAutoDeletionByCut","listenToAutoDeletionByDelete","combined","undoName","undoableDelete","handleKeys","KeyboardListener","moveStepAbsolute","removeElement","isNewPositionOk","moveLeft","displacement","halfLx","undoableMoveLeft","undoableMoveAllLeft","undoableMoveRight","undoableMoveAllRight","halfLy","undoableMoveUp","undoableMoveAllUp","moveDown","undoableMoveDown","undoableMoveAllDown","setMultiSelectionMode","toggle2DView","toggleNatigationView","toggleAutoRotate","keyNameRef","handleEventType","onKeyEvent","handleKeyUp","SceneRadiusCalculator","components","fetchAabbElements","boxes","setFromObject","box","getWorldDirection","setCompassRotation","dircXY","deg","transform","CameraController","enabldeNavigationControls","cameraPositionLength","panRadius","minPan","maxPan","initialOrbitCamera","initialOrbitDomElement","orbitControlRef","persCameraRef","orthCameraRef","onInteractionStart","onInteractionEnd","oc","getVector","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","onMouseEnter","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","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","xMinMax","yMinMax","xUnit","getUnit","yUnit","RenderDot","Dot","CloseOutlined","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":"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,O,yCAAAA,I,8DAAAA,M,cAKAxjB,O,mCAAAA,I,4BAAAA,M,cAKAG,O,qEAAAA,I,uEAAAA,I,kEAAAA,M,cAMA1D,O,iBAAAA,I,mBAAAA,I,oBAAAA,M,cAMAlX,O,aAAAA,I,aAAAA,I,iBAAAA,I,eAAAA,I,gBAAAA,M,cAoBAk+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,cAwBAvxB,K,kBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,sBAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,eAAAA,M,cAYAwxB,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,cAMAnrB,O,eAAAA,I,yBAAAA,I,2BAAAA,I,gCAAAA,M,cAOAorB,K,gBAAAA,E,YAAAA,E,gBAAAA,E,iBAAAA,M,cAOAC,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,gCAAAA,M,cASA7gB,K,oBAAAA,E,uBAAAA,M,cAKA8gB,K,qBAAAA,E,yBAAAA,E,uBAAAA,E,kBAAAA,Q,cAOAC,K,kBAAAA,E,sCAAAA,E,qCAAAA,E,oCAAAA,E,mCAAAA,Q,cAQA/e,K,YAAAA,E,YAAAA,E,mBAAAA,Q,cAMAgf,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,+BAAAA,E,+BAAAA,E,+BAAAA,E,+BAAAA,E,+BAAAA,E,gCAAAA,E,gCAAAA,Q,cAcAC,K,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,mCAAAA,E,mCAAAA,Q,cAcAC,K,qBAA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","file":"static/js/main.71a8bdfe.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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_en = {\n translation: {\n name: {\n IFI: 'Institute for Future Intelligence',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\n },\n\n cookie: {\n Statement: 'By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.',\n Accept: 'Accept',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'This product is brought to you by',\n TermsOfService: 'Terms of Service',\n PrivacyPolicy: 'Privacy Policy',\n Software: 'Software',\n Content: 'Content',\n Research: 'Research',\n Support: 'Support',\n Acknowledgment: 'Acknowledgment',\n FundingInformation:\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.',\n Contact: 'For more information, please contact Charles Xie (charles@intofuture.org).',\n Translators: 'Translators',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'All Rights Reserved',\n MeterAbbreviation: 'm',\n Version: 'Version',\n VersionInitial: 'V',\n Options: 'Options',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Maximum Number',\n MinimumNumber: 'Minimum Number',\n MaximumValue: 'Maximum Value',\n MinimumValue: 'Minimum Value',\n Or: 'Or',\n None: 'None',\n High: 'High',\n Partial: 'Partial',\n Teacher: 'Teacher',\n Class: 'Class',\n Total: 'Total',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Range',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Press',\n Open: 'Open',\n Save: 'Save',\n SaveAsImage: 'Save as Image',\n SaveAsCsv: 'Save as CSV',\n Update: 'Update',\n Paste: 'Paste',\n Copy: 'Copy',\n Cut: 'Cut',\n Delete: 'Delete',\n Lock: 'Lock',\n Translucent: 'Translucent',\n Color: 'Color',\n Texture: 'Texture',\n Size: 'Size',\n Thickness: 'Thickness',\n Yes: 'Yes',\n No: 'No',\n OK: 'OK',\n Cancel: 'Cancel',\n Apply: 'Apply',\n Close: 'Close',\n ApplyTo: 'Apply to',\n Run: 'Run',\n Pause: 'Pause',\n Resume: 'Resume',\n Clear: 'Clear',\n Warning: 'Warning',\n Caution: 'Caution',\n Reminder: 'Reminder',\n Length: 'Length',\n Width: 'Width',\n Height: 'Height',\n Radius: 'Radius',\n Angle: 'Angle',\n Azimuth: 'Azimuth',\n Coordinates: 'Coordinates',\n Weather: 'Weather',\n Show: 'Show',\n Animate: 'Animate',\n Date: 'Date',\n Time: 'Time',\n Title: 'Title',\n Owner: 'Owner',\n Action: 'Action',\n Rename: 'Rename',\n Location: 'Location',\n Latitude: 'Latitude',\n Month: 'Month',\n Day: 'Day',\n Hour: 'Hour',\n Daylight: 'Daylight',\n Radiation: 'Radiation',\n Temperature: 'Temperature',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'W',\n Fixed: 'Fixed',\n Elements: 'Elements',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'No Texture',\n FoundationElement: 'Foundation',\n CuboidElement: 'Cuboid',\n PolygonElement: 'Polygon',\n SensorElement: 'Sensor',\n SolarPanelElement: 'Solar Panel',\n WaterHeaterElement: 'Water Heater',\n ParabolicDishElement: 'Parabolic Dish',\n ParabolicTroughElement: 'Parabolic Trough',\n FresnelReflectorElement: 'Fresnel Reflector',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Locked',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Cannot sign in',\n CannotSignOut: 'Cannot sign out',\n YourAccountWasCreated: 'Your account was created.',\n CannotCreateAccount: 'Cannot create an account',\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'The cloud file was not found',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Cannot open the cloud file',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\n CannotRenameCloudFile: 'Cannot rename the cloud file',\n DoYouWantToSaveChanges: 'Do you want to save changes?',\n NotApplicableToSelectedAction: 'Not Applicable to Selected Action',\n ThisElementIsLocked: 'This element is locked.',\n ThisCannotBeUndone: 'This cannot be undone.',\n AzimuthOfNorthIsZero: 'Azimuth of north is 0°',\n CounterclockwiseAzimuthIsPositive: 'Counter-clockwise is positive',\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\n CannotPasteOutsideBoundary: 'Cannot paste outside the boundary.',\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\n CannotMoveObjectTooFar: 'Cannot move object too far.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Existing solar panels will be removed before applying the new layout.',\n DoYouWantToContinue: 'Do you want to continue?',\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\n ScreenshotSaved: 'A screenshot was saved.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simulation started.',\n SimulationCompleted: 'Simulation completed.',\n SimulationAborted: 'Simulation aborted.',\n SimulationPaused: 'Simulation paused.',\n CancelSimulation: 'Cancel simulation',\n PauseSimulation: 'Pause simulation',\n ResumeSimulation: 'Resume simulation',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evolution started.',\n EvolutionCompleted: 'Evolution completed.',\n EvolutionAborted: 'Evolution aborted.',\n EvolutionPaused: 'Evolution paused.',\n EncounterEvolutionError: 'Encountered an evolution error.',\n CancelEvolution: 'Cancel evolution',\n PauseEvolution: 'Pause evolution',\n ResumeEvolution: 'Resume evolution',\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\n ObjectiveFunctionTypeError:\n 'The current objective function is not supported by this operation. Please start from the menu.',\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analysis Options',\n option: {\n GridCellSize: 'Grid Cell Size',\n SamplingFrequency: 'Sampling Frequency',\n TimesPerHour: 'Times per Hour',\n DaysPerYear: 'Days per Year',\n },\n mainMenu: 'Main Menu',\n cloudMenu: 'Cloud Menu',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'File',\n file: {\n CreateNewFile: 'Create New File',\n OpenLocalFile: 'Open Local File',\n SaveAsLocalFile: 'Save as Local File',\n SavingAbortedMustHaveValidFileName: 'Saving aborted! You must have a valid file name',\n OpenCloudFile: 'Open Cloud File',\n SaveCloudFile: 'Save Cloud File',\n SaveAsCloudFile: 'Save as Cloud File',\n SavingAbortedMustHaveValidTitle: 'Saving aborted! You must have a valid title for a cloud file',\n ToSaveYourWorkPleaseSignIn: 'To save your work, please sign in.',\n TakeScreenshot: 'Take Screenshot',\n UseCloudFileName: 'Use Cloud File Name',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Edit',\n edit: {\n Undo: 'Undo',\n Redo: 'Redo',\n },\n viewSubMenu: 'View',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D View',\n ResetView: 'Reset',\n ZoomIn: 'Zoom In',\n ZoomOut: 'Zoom Out',\n AutoRotate: 'Auto rotate',\n ShowShadow: 'Show Shadow',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Translucent Floating Windows',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Site Information',\n DesignInformation: 'Design Information',\n Instruction: 'Instruction',\n StickyNote: 'Sticky Note',\n Note: 'Note',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Weather Data',\n DiurnalTemperature: 'Diurnal Temperature',\n Heliodon: 'Heliodon',\n SunAndTime: 'Sun & Time',\n },\n benchmarksSubMenu: 'Benchmarks',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Line Width',\n SymbolSize: 'Symbol Size',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\n },\n analysisSubMenu: 'Analysis',\n physicsSubMenu: 'Physics',\n physics: {\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\n ReflectionHeatmap: 'Reflection Heatmap',\n },\n sensorSubMenu: 'Sensor',\n sensor: {\n CollectDailyData: 'Collect Daily Data',\n CollectYearlyData: 'Collect Yearly Data',\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Solar Panel',\n solarPanel: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n AnalyzeVisibility: 'Analyze Visibility',\n PanelDiscretization: 'Panel Discretization',\n Exact: 'Exact',\n Approximate: 'Approximate',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\n },\n parabolicTroughSubMenu: 'Parabolic Trough',\n parabolicTrough: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n parabolicDishSubMenu: 'Parabolic Dish',\n parabolicDish: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n fresnelReflectorSubMenu: 'Fresnel Reflector',\n fresnelReflector: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\n },\n\n tutorialsSubMenu: 'Tutorials',\n\n solarEnergyScienceSubMenu: 'Solar Science',\n solarEnergyScienceTutorials: {\n SunAngles: 'Sun Angles Relative to an Observer on the Ground',\n InsolationAndClimate: 'Insolation and Climate',\n SolarRadiationToBox: 'Solar Radiation to a Box',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Building Design',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'All Basic Roof Types',\n },\n\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle of a Solar Panel',\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth of a Solar Panel',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Solar Trackers',\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\n SolarPowerTower: 'Solar Power Tower',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Examples',\n\n solarEnergySubMenu: 'Solar Energy',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Sun Beam and Heliodon',\n RooftopSolarPanels: 'Rooftop Solar Panels',\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Bus Stop',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Vegetative Buffer',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\n },\n\n builtEnvironmentSubMenu: 'Built Environment',\n residentialBuildingsSubMenu: 'Residential Buildings',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Dutch Colonial House',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solarium',\n Church1: 'Church 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Barn Style House',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Commercial Buildings',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Office Building',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Urban Planning',\n urbanPlanningExamples: {\n Heatmap1: 'Heatmap',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Greenhouse',\n Pavilion: 'Pavilion in a Park',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\n },\n\n languageSubMenu: 'Language',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'About Us',\n },\n\n avatarMenu: {\n AccountSettings: 'Account Settings',\n PrivacyInfo:\n 'When you sign in, your Google ID is used to create and access your Aladdin account.\\nOnly a random alphanumeric string is stored in our database as a reference.\\nNo personally identifiable data such as your name or email is ever gathered.\\nFor more information, see our Privacy Policy:\\nhttps://intofuture.org/aladdin-privacy.html',\n SignIn: 'Sign In',\n SignOut: 'Sign Out',\n IfYouAreAStudent: 'If you are a student',\n },\n\n skyMenu: {\n Axes: 'Axes',\n Theme: 'Theme',\n ThemeDefault: 'Default',\n ThemeDesert: 'Desert',\n ThemeDune: 'Dune',\n ThemeForest: 'Forest',\n ThemeGrassland: 'Grassland',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\n ShowAzimuthAngle: 'Show Azimuth Angle',\n ShowElevationAngle: 'Show Elevation Angle',\n ShowZenithAngle: 'Show Zenith Angle',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Image on Ground',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Remove All Unlocked People',\n RemoveAllUnlockedFoundations: 'Remove All Unlocked Foundations',\n RemoveAllUnlockedCuboids: 'Remove All Unlocked Cuboids',\n DoYouReallyWantToRemoveAllPeople: 'Do you really want to remove all the people who are not locked',\n DoYouReallyWantToRemoveAllTrees: 'Do you really want to remove all the trees that are not locked',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Do you really want to remove all the foundations that are not locked',\n DoYouReallyWantToRemoveAllCuboids: 'Do you really want to remove all the cuboids that are not locked',\n LockAllElements: 'Lock All Elements',\n UnlockAllElements: 'Unlock All Elements',\n },\n\n labelSubMenu: {\n Label: 'Label',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Keep Showing Label',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Remove All Unlocked Walls',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Racks',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n SolarPanels: 'Solar Panels',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Do you really want to remove all the solar panels on this foundation that are not locked',\n ParabolicTroughs: 'Parabolic Troughs',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\n ParabolicDishes: 'Parabolic Dishes',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\n FresnelReflectors: 'Fresnel Reflectors',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\n Heliostats: 'Heliostats',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\n Sensors: 'Sensors',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Do you really want to remove all the sensors on this foundation that are not locked',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Walls',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Do you really want to remove all the walls on this foundation that are not locked',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Polygons',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Do you really want to remove all the polygons on this foundation that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Do you really want to remove all the humans on this foundation who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Do you really want to remove all the trees on this foundation that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Only This Foundation',\n AllConnectedFoundations: 'All Connected Foundations',\n AllFoundations: 'All Foundations',\n AddPolygon: 'Add Polygon',\n SolarStructure: 'Solar Structure',\n GroupMaster: 'Group Master',\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\n ReceiverTowerHeight: 'Height of Receiver Tower',\n ReceiverTowerRadius: 'Radius of Receiver Tower',\n ReceiverAbsorptance: 'Absorptance of Receiver',\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\n AbsorberHeight: 'Height of Absorber Pipe',\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\n AbsorberAbsorptance: 'Absorptance of Absorber',\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\n },\n\n cuboidMenu: {\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Racks',\n SolarPanels: 'Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Do you really want to remove all the solar panels on this cuboid that are not locked',\n Sensors: 'Sensors',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Do you really want to remove all the sensors on this cuboid that are not locked',\n Polygons: 'Polygons',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Do you really want to remove all the polygons on this cuboid that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Do you really want to remove all the humans on this cuboid who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Do you really want to remove all the trees on this cuboid that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Only This Cuboid',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids Above Same Base',\n AllCuboids: 'All Cuboids',\n OnlyThisSide: 'Only This Side',\n AllSidesOfThisCuboid: 'All Sides of This Cuboid',\n AllSidesOfAllCuboids: 'All Sides of All Cuboids',\n AddPolygon: 'Add Polygon',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Filled',\n FillTexture: 'Fill Texture',\n FillColor: 'Fill Color',\n Opacity: 'Opacity',\n LineColor: 'Line Color',\n LineWidth: 'Line Width',\n LineStyle: 'Line Style',\n SolidLine: 'Solid Line',\n DashedLine: 'Dashed Line',\n DottedLine: 'Dotted Line',\n InsertVertexBeforeIndex: 'Insert Vertex Before Index',\n InsertVertexAfterIndex: 'Insert Vertex After Index',\n DeleteVertex: 'Delete Vertex',\n OnlyThisPolygon: 'Only This Polygon',\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\n AllPolygonsAboveFoundation: 'All Polygons Above Foundation',\n AllPolygons: 'All Polygons',\n Layout: 'Layout',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\n SolarPanelArrayModel: 'Solar Panel Model',\n SolarPanelArrayOrientation: 'Orientation',\n SolarPanelArrayTiltAngle: 'Tilt Angle',\n SolarPanelArrayRowWidth: 'Row Width',\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Row Axis',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Pole Height',\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimization',\n Parameters: 'Parameters',\n Variables: 'Variables',\n Constants: 'Constants',\n GeneticAlgorithm: 'Genetic Algorithm',\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n Generation: 'Generation',\n Gene: 'Gene',\n NormalizedVariables: 'Normalized Variables',\n Objective: 'Objective',\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\n ObjectiveFunctionDailyProfit: 'Daily Profit',\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\n RouletteWheel: 'Roulette Wheel',\n Tournament: 'Tournament',\n SearchMethod: 'Search Method',\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\n PopulationSize: 'Population Size',\n MaximumGenerations: 'Maximum Generations',\n SelectionRate: 'Selection Rate',\n CrossoverRate: 'Crossover Rate',\n MutationRate: 'Mutation Rate',\n Step: 'Step',\n SwarmSize: 'Swarm Size',\n MaximumSteps: 'Maximum Steps',\n MaximumVelocity: 'Maximum Velocity',\n InertiaWeight: 'Inertia Weight',\n CognitiveCoefficient: 'Cognitive Coefficient',\n SocialCoefficient: 'Social Coefficient',\n ConvergenceThreshold: 'Convergence Threshold for Termination',\n LocalSearchRadius: 'Local Search Radius',\n RowsPerRackRange: 'Range for Rows per Rack',\n TiltAngleRange: 'Range for Tilt Angle',\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\n },\n\n treeMenu: {\n ShowModel: 'Show Model',\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Change Person',\n Flip: 'Flip',\n Observer: 'Observer',\n ViewFromThisPerson: 'View from This Person',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Relative Azimuth',\n Pole: 'Pole',\n PoleHeight: 'Pole Height',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Extra Pole Height',\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\n DrawSunBeam: 'Draw Sun Beam',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflector Reflectance',\n ReceiverAbsorptance: 'Receiver Absorptance',\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Change PV Model',\n Orientation: 'Orientation',\n Portrait: 'Portrait',\n Landscape: 'Landscape',\n FrameColor: 'Frame Color',\n Panels: 'panels',\n PanelsWide: 'panels wide',\n PanelsLong: 'panels long',\n TiltAngle: 'Tilt Angle',\n SouthFacingIsPositive: 'South facing is positive',\n Tracker: 'Tracker',\n SolarTrackerFollowsSun: 'A tracker follows the sun to increase solar panel outputs.',\n PoleSpacing: 'Pole Spacing',\n NoTracker: 'No Tracker',\n HorizontalSingleAxisTracker: 'Horizontal Single Axis Tracker',\n VerticalSingleAxisTracker: 'Vertical Single Axis Tracker',\n AltazimuthDualAxisTracker: 'Altazimuth Dual Axis Tracker',\n OnlyThisSolarPanel: 'Only This Solar Panel',\n AllSolarPanelsOnSurface: 'All Solar Panels on the Same Surface',\n AllSolarPanelsAboveFoundation: 'All Solar Panels Above the Same Foundation',\n AllSolarPanels: 'All Solar Panels',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Solar Panel Specs',\n Model: 'Model',\n PanelSize: 'Panel Size',\n Cells: 'Cells',\n CellType: 'Cell Type',\n Monocrystalline: 'Monocrystalline',\n Polycrystalline: 'Polycrystalline',\n ThinFilm: 'Thin Film',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Black',\n Blue: 'Blue',\n ShadeTolerance: 'Shade Tolerance',\n SolarCellEfficiency: 'Solar Cell Efficiency',\n NominalOperatingCellTemperature: 'Nominal Operating Cell Temperature',\n TemperatureCoefficientOfPmax: 'Temperature Coefficient of Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n LatusRectum: 'Latus Rectum',\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\n AllParabolicTroughs: 'All Parabolic Troughs',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Absorber Pipe',\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\n AllFresnelReflectors: 'All Fresnel Reflectors',\n },\n\n heliostatMenu: {\n Tower: 'Tower',\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\n OnlyThisHeliostat: 'Only This Heliostat',\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\n AllHeliostats: 'All Heliostats',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Receiver Structure',\n CentralPole: 'Central Pole',\n CentralPoleWithTripod: 'Central Pole with Tripod',\n Quadrupod: 'Quadrupod',\n RimDiameter: 'Rim Diameter',\n LatusRectum: 'Latus Rectum',\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\n AllParabolicDishes: 'All Parabolic Dishes',\n },\n\n wallMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n SizeOfWall: 'Size of Wall',\n OnlyThisWall: 'Only This Wall',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: 'All Walls Above the Same Foundation',\n AllWalls: 'All Walls',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\n Doors: 'Doors',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n WallStructure: 'Wall Structure',\n DefaultStructure: 'Default',\n StudStructure: 'Stud',\n PillarStructure: 'Pillar',\n Opacity: 'Opacity',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Height',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Only This Window',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\n AllWindows: 'All Windows',\n Width: 'Width',\n Height: 'Height',\n Mullion: 'Mullion',\n MullionWidth: 'Mullion Width',\n MullionSpacing: 'Mullion Spacing',\n MullionColor: 'Mullion Color',\n Tint: 'Tint',\n Opacity: 'Opacity',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Shutter',\n LeftShutter: 'Left Shutter',\n RightShutter: 'Right Shutter',\n BothShutters: 'Both Shutters',\n ShutterWidth: 'Relative Width',\n ShutterColor: 'Shutter Color',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n OnlyThisRoof: 'Only This Roof',\n AllRoofsAboveFoundation: 'All Roofs Above the Same Foundation',\n AllRoofs: 'All Roofs',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Rafter Spacing',\n RafterWidth: 'Rafter Width',\n RafterThickness: 'Rafter Thickness',\n RafterColor: 'Rafter Color',\n RoofColor: 'Roof Color',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Glass Tint',\n Opacity: 'Opacity',\n RoofStructure: 'Roof Structure',\n DefaultStructure: 'Default',\n RafterStructure: 'Rafter',\n GlassStructure: 'Glass',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n Texture11: 'Texture 11',\n Texture12: 'Texture 12',\n Texture13: 'Texture 13',\n Texture14: 'Texture 14',\n Texture15: 'Texture 15',\n Texture16: 'Texture 16',\n Texture17: 'Texture 17',\n OnlyThisDoor: 'Only This Door',\n AllDoorsOnWall: 'All Doors on the Same Wall',\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\n AllDoors: 'All Doors',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'High',\n Low: 'Low',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Color Contrast',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\n },\n\n instructionPanel: {\n Rotate: 'Rotate',\n DragMouse: 'Drag mouse',\n Zoom: 'Zoom',\n MouseWheelOrKeys: 'Rotate mouse wheel or press Ctrl+[ or Ctrl+]',\n MouseWheelOrKeysMac: 'Rotate mouse wheel or press ⌘+[ or ⌘+]',\n Pan: 'Pan',\n HoldCtrlDragMouse: 'Hold Ctrl and drag mouse',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Reset',\n AutoRotate: 'Auto rotate',\n StartOrStop: 'Press F4 to start or stop',\n },\n\n mapPanel: {\n ImageOnGround: 'Image on Ground',\n WeatherStations: 'Weather Stations',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Coordinates',\n Zoom: 'Zoom',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Solar Panel Visibility',\n Observer: 'Observer',\n VantagePoint: 'Vantage Point',\n ItemizedVisibilityByFields: 'Itemized by Fields',\n TotalVisibility: 'Total',\n },\n\n sensorPanel: {\n LightSensor: 'Light Sensor',\n WeatherDataFrom: 'Weather Data from',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Solar Panel Daily Yield',\n SolarPanelYearlyYield: 'Solar Panel Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualSolarPanels: 'Show outputs of individual solar panels',\n Profit: 'Profit',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Daily Yield',\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\n ChimneyAirTemperature: 'Chimney Air Temperature',\n ChimneyWindSpeed: 'Chimney Wind Speed',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Sun & Time Settings',\n SunAngles: 'Angles',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'My Cloud Files',\n GenerateLink: 'Generate Link',\n LinkGeneratedInClipBoard: 'A link has been generated in the clip board',\n DoYouReallyWantToDelete: 'Do you really want to delete',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'My Account Settings',\n MyID: 'My 🆔',\n ClickToCopyMyID: 'Click to copy my ID',\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'User Count',\n SchoolID: 'School ID',\n ClassID: 'Class ID',\n },\n\n weatherPanel: {\n SunshineHours: 'Sunshine',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Select Air Temperature Model',\n Sinusoidal: 'Sinusoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Economics Parameters',\n ElectricitySellingPrice: 'Electricity Selling Price',\n OperationalCostPerUnit: 'Operational Cost per Unit',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Clearness',\n ShowDaylightResults: 'Show daylight results',\n ShowSkyClearnessResults: 'Show sky clearness results',\n ShowAverageDailySolarRadiation: 'Show average daily solar radiation',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'There is no sensor for collecting data.',\n NoSolarPanelForAnalysis: 'There is no solar panel for analysis.',\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Cloud file',\n Select: 'Select',\n AddFoundation: 'Add foundation',\n AddWall: 'Add wall',\n AddWindow: 'Add window',\n AddDoor: 'Add door',\n AddPyramidRoof: 'Add pyramid roof',\n AddGableRoof: 'Add gable roof',\n AddHipRoof: 'Add hip roof',\n AddGambrelRoof: 'Add gambrel roof',\n AddMansardRoof: 'Add Mansard roof',\n AddCuboid: 'Add cuboid',\n AddSensor: 'Add sensor',\n AddSolarPanel: 'Add solar panel',\n AddWaterHeater: 'Add water heater',\n AddParabolicDish: 'Add parabolic dish',\n AddParabolicTrough: 'Add parabolic trough',\n AddFresnelReflector: 'Add Fresnel reflector',\n AddHeliostat: 'Add heliostat',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Add tree',\n AddFlower: 'Add flower',\n AddPeople: 'Add people',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Manipulate a group',\n ClearScene: 'Clear scene',\n ShowSunAndTimeSettings: 'Show sun and time settings',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'Do you really want to clear the content',\n ClickForMoreButtons: 'Click for more buttons',\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\n SwitchToAddingWall: 'Switch to Adding Wall',\n SwitchToAddingWindow: 'Switch to Adding Window',\n SwitchToAddingDoor: 'Switch to Adding Door',\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\n SwitchToAddingSensor: 'Switch to Adding Sensor',\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Switch to Adding Tree',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Switch to Adding People',\n },\n\n tooltip: {\n gotoIFI: 'Go to Institute for Future Intelligence',\n visitAladdinHomePage: 'Visit Aladdin Homepage',\n clickToOpenMenu: 'Click to open main menu',\n clickToAccessCloudTools: 'Click to access cloud tools',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Dogwood',\n Elm: 'Elm',\n FanPalm: 'Fan Palm',\n Linden: 'Linden',\n Magnolia: 'Magnolia',\n Maple: 'Maple',\n Oak: 'Oak',\n Pine: 'Pine',\n Spruce: 'Spruce',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Jaah',\n Jack: 'Jack',\n Jacob: 'Jacob',\n Jacqueline: 'Jacqueline',\n Jade: 'Jade',\n Jamelia: 'Jamelia',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Jaya',\n Jaye: 'Jaye',\n Jeanette: 'Jeanette',\n Jedi: 'Jedi',\n Jeff: 'Jeff',\n Jena: 'Jena',\n Jennifer: 'Jennifer',\n Jess: 'Jess',\n Jett: 'Jett',\n Jill: 'Jill',\n Jiya: 'Jiya',\n Joan: 'Joan',\n Jocelyn: 'Jocelyn',\n Joel: 'Joel',\n Joey: 'Joey',\n John: 'John',\n Jonathon: 'Jonathon',\n Jose: 'Jose',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Judd',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Julio',\n Jumapili: 'Jumapili',\n June: 'June',\n Juro: 'Juro',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_zh_cn = {\n translation: {\n name: {\n IFI: '未来智能研究所',\n Aladdin: '阿拉丁',\n Tagline: '阿拉丁: 探索人工智能时代的设计软件 — 未来智能研究所研发',\n },\n\n cookie: {\n Statement: '声明:为了改善您的用户体验,阿拉丁采用cookie储存少量数据。',\n Accept: '同意',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: '未来智能研究所荣誉出品',\n TermsOfService: '服务条款',\n PrivacyPolicy: '隐私政策',\n Software: '软件',\n Content: '课件',\n Research: '研究',\n Support: '服务',\n Acknowledgment: '鸣谢',\n FundingInformation:\n '本产品的研发承蒙美国国家科学基金会慷慨资助(项目号#2105695,#2131097,#2301164)。本产品的任何观点或结论仅代表创作者个人意见。',\n Contact: '如您需要更多信息,请联系 Charles Xie (charles@intofuture.org)。我们会尽快回复。',\n Translators: '翻译',\n },\n\n word: {\n LastUpdate: '上一次更新',\n Small: '小',\n Medium: '中',\n Large: '大',\n Design: '设计',\n Information: '信息',\n Type: '类别',\n Text: '文字',\n FontSize: '字体大小',\n FontColor: '字体颜色',\n Model: '模型',\n Models: '模型',\n Upload: '上传',\n ClickCount: '点击数',\n Share: '分享',\n AlreadyLike: '已点赞',\n Like: '点赞',\n MustLogInToLike: '必须登录才能点赞',\n AllRightsReserved: '版权所有',\n MeterAbbreviation: '米',\n Version: '版本',\n VersionInitial: '版本',\n Options: '选项',\n Maximum: '最大',\n Minimum: '最小',\n MaximumNumber: '最多',\n MinimumNumber: '最少',\n MaximumValue: '最大值',\n MinimumValue: '最小值',\n Or: '或',\n None: '无',\n High: '高',\n Partial: '部分',\n Teacher: '老师',\n Class: '班级',\n Total: '总数',\n Leaderboard: '用戶排行榜',\n Latest: '最新',\n Range: '范围',\n SIUnit: '国际单位制',\n USUnit: '美国单位制',\n ThermalTransmittance: '热透过率',\n ThermalResistance: '热阻',\n UValue: 'U值',\n RValue: 'R值',\n VolumetricHeatCapacity: '容积热容',\n BuildingHVACSystem: '建筑物暖通空调系统',\n ThermostatSetpoint: '恒温器设定值',\n TemperatureToleranceThreshold: '温度忍耐阈值',\n TemperatureToleranceThresholdExplanation:\n '当日最低外面温度高于恒温器设定值减去此阈值,暖气不开。\\n当日最高外面温度低于恒温器设定值加上此阈值,空调不开。',\n Press: '按',\n Open: '打开',\n Save: '保存',\n SaveAsImage: '保存为图像',\n SaveAsCsv: '保存为CSV',\n Update: '刷新',\n Paste: '粘贴',\n Copy: '复制',\n Cut: '剪切',\n Delete: '删除',\n Lock: '固定',\n Translucent: '半透明',\n Color: '颜色',\n Texture: '材质',\n Thickness: '厚度',\n Size: '尺寸',\n Yes: '是',\n No: '不',\n OK: '确定',\n Cancel: '取消',\n Apply: '应用',\n Close: '关闭',\n ApplyTo: '适用于',\n Run: '运行',\n Pause: '暂停',\n Resume: '继续',\n Clear: '清空',\n Warning: '警告',\n Caution: '小心',\n Reminder: '提醒',\n Length: '长度',\n Width: '宽度',\n Height: '高度',\n Radius: '半径',\n Angle: '角度',\n Azimuth: '方位角',\n Coordinates: '坐标',\n Weather: '天气',\n Show: '显示',\n Animate: '动画',\n Date: '日期',\n Time: '时间',\n Title: '标题',\n Owner: '所有者',\n Action: '操作',\n Rename: '改名',\n Location: '位置',\n Latitude: '纬度',\n Month: '月份',\n Day: '天',\n Hour: '小时',\n Daylight: '白天长度',\n Radiation: '辐射',\n Temperature: '温度',\n kWh: '千瓦时',\n dollar: '元',\n MeterPerSecond: '米/秒',\n NorthInitial: '北',\n SouthInitial: '南',\n EastInitial: '东',\n WestInitial: '西',\n Fixed: '固定',\n Elements: '部件',\n Energy: '能量',\n Unknown: '未知',\n Label: '标签',\n Description: '描述',\n NoDescription: '无描述',\n MaximumCharacters: '最多字符数',\n Author: '作者',\n Publisher: '发布者',\n Building: '建筑',\n ResidentialBuilding: '住宅建筑',\n CommercialBuilding: '商用建筑',\n SchoolBuilding: '学校建筑',\n TouristAttraction: '旅游景点',\n UnderConstruction: '在建',\n Photovoltaic: '光伏',\n Anonymous: '无名氏',\n Nickname: '别名',\n Pin: '置顶',\n Unpin: '解除置顶',\n },\n\n shared: {\n NoTexture: '无材质',\n FoundationElement: '地基',\n CuboidElement: '长方体',\n PolygonElement: '多边形',\n SensorElement: '传感器',\n SolarPanelElement: '光伏板',\n WaterHeaterElement: '太阳能热水器',\n ParabolicDishElement: '抛物线碟',\n ParabolicTroughElement: '抛物线槽',\n FresnelReflectorElement: '菲涅耳反射镜',\n HeliostatElement: '定日镜',\n WindTurbineElement: '风力涡轮机',\n LightElement: '电灯',\n ElementLocked: '固定',\n ModelType: '模型类别',\n OutputBreakdown: '分列发电量',\n MoreResults: '更多结果',\n },\n\n message: {\n ModelNotFound: '没有找到模型',\n CannotSignIn: '登录失败',\n CannotSignOut: '退出失败',\n YourAccountWasCreated: '成功建立您的账号。',\n CannotCreateAccount: '无法创建账号',\n YourAccountSettingsWereSaved: '您的账号设定已保存。',\n CannotSaveYourAccountSettings: '您的账号设定无法保存',\n CannotSaveYourFileToCloud: '无法保存您的文件到云端',\n CannotCreateNewProject: '无法创建新项目',\n CannotCreateNewProjectWithoutTitle: '没有标题, 无法创建新项目',\n CannotOpenYourProjects: '无法打开您的项目列表',\n CannotOpenProject: '无法打开项目',\n CannotDeleteProject: '无法删除项目',\n CannotRenameProject: '无法给项目改名',\n CannotAddDesignToProject: '无法把此设计加到项目里',\n CannotAddDesignToProjectOwnedByOthers: '不能把此设计加到别人的项目里',\n DesignRemovedFromProject: '设计被成功地从项目里删除',\n CannotRemoveDesignFromProject: '无法把此设计从项目里删除',\n CannotUpdateProject: '无法更新项目',\n CannotFetchProjectData: '无法取得项目数据',\n TitleUsedChooseDifferentOne: '此标题已经被使用, 请采用不同的标题',\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此标题的云文件已经存在,您确定要覆盖它吗?',\n CloudFileNotFound: '找不到此云端文件',\n CannotLoadModelsOnMap: '无法下载地图上的模型',\n CannotLoadLeaderboard: '无法下载排行榜',\n CannotPublishModelOnMap: '模型无法发布到地图上',\n CannotLikeModelFromMap: '无法点赞地图上的模型',\n CannotDeleteModelFromMap: '无法删除地图上的模型',\n ModelDeletedFromMap: '模型已从地图上删除',\n DoYouWantToDeleteModelFromMap: '您要删除地图上的这个模型吗?',\n CannotOpenCloudFile: '此云端文件无法打开',\n CannotReadCloudFile: '无法读取此云端文件',\n CannotWriteCloudFile: '无法存储此云端文件',\n CloudFileCopied: '拷贝云端文件',\n CannotOpenCloudFolder: '您的云端文件夹无法打开',\n CannotDeleteCloudFile: '无法删除此云端文件',\n CannotRenameCloudFile: '此云端文件的名字无法更改',\n DoYouWantToSaveChanges: '您要保存当前文件吗?',\n NotApplicableToSelectedAction: '此值不适用于当前选择范围',\n ThisElementIsLocked: '这个部件被锁定。',\n ThisCannotBeUndone: '这个操作一旦执行就不能撤销。',\n AzimuthOfNorthIsZero: '正北的方位角为零度',\n CounterclockwiseAzimuthIsPositive: '逆时针为正',\n MoveCancelledBecauseOfOverlap: '位置重叠,移动取消。',\n MoveOutsideBoundaryCancelled: '位置出界,移动取消。',\n RotationCancelledBecauseOfOverlap: '位置重叠,旋转取消。',\n RotationOutsideBoundaryCancelled: '位置出界,旋转取消。',\n ResizingCancelledBecauseOfOverlap: '位置重叠,尺寸调整取消。',\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸调整取消。',\n CannotPasteOutsideBoundary: '位置出界,不能复制。',\n CannotPasteBecauseOfOverlap: '位置重叠,不能复制。',\n CannotMoveObjectTooFar: '位置太远,移动取消。',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '采用新布局之前必须移除现有的光伏板。',\n DoYouWantToContinue: '您想继续吗?',\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接触。',\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重叠。',\n ScreenshotSaved: '截屏图片保存在下载文件夹里。',\n CsvFileSaved: 'CSV保存在下载文件夹里。',\n SimulationStarted: '模拟开始。',\n SimulationCompleted: '模拟结束。',\n SimulationAborted: '模拟取消。',\n SimulationPaused: '模拟暂停。',\n CancelSimulation: '取消模拟',\n PauseSimulation: '暂停模拟',\n ResumeSimulation: '继续模拟',\n SimulationWillNotStartDueToErrors: '由于错误模拟无法运行',\n SimulationWillStartDespiteWarnings: '发现问题,但模拟仍然将运行。',\n EvolutionStarted: '演化开始。',\n EvolutionCompleted: '演化结束。',\n EvolutionAborted: '演化取消。',\n EvolutionPaused: '演化暂停。',\n EncounterEvolutionError: '演化出错。',\n CancelEvolution: '取消演化',\n PauseEvolution: '暂停演化',\n ResumeEvolution: '继续演化',\n ConvergenceThresholdHasBeenReached: '收敛阈值已达到。',\n MaximumNumberOfGenerationsHasBeenReached: '最大世代数已达到。',\n MaximumNumberOfStepsHasBeenReached: '最大步数已达到。',\n ObjectiveFunctionTypeError: '此操作不支持当前的目标函数。请从菜单启动此功能。',\n WallsAreNotAtSameHeight: '墙体高度不同。',\n WallsAreNotPerpendicular: '墙体不垂直。',\n WallsAreNotConnected: '墙体不相连。',\n WallsNumberNeedToBeFour: '墙体数量必须为四个。',\n BuildingContainsEmptyWall: '建筑物有空墙。',\n BuildingRoofMissing: '建筑物没有屋顶。',\n UnknownErrors: '未知错误。',\n },\n\n menu: {\n AnalysisOptions: '分析选项',\n option: {\n GridCellSize: '计算网格的尺寸',\n SamplingFrequency: '采样频率',\n TimesPerHour: '每小时采样次数',\n DaysPerYear: '每一年采样天数',\n },\n mainMenu: '主菜单',\n cloudMenu: '云菜单',\n projectSubMenu: '项目',\n project: {\n CreateNewProject: '创建新项目',\n OpenProject: '打开项目',\n SaveProjectAs: '另存项目为',\n YouMustLogInToCreateProject: '您必须登录才能创建项目',\n YouMustLogInToOpenProject: '您必须登录才能打开项目',\n },\n fileSubMenu: '文件',\n file: {\n CreateNewFile: '创建新文件',\n OpenLocalFile: '打开本地文件',\n SaveAsLocalFile: '保存为本地文件',\n SavingAbortedMustHaveValidFileName: '文件名无效,保存失败',\n OpenCloudFile: '打开云端文件',\n SaveCloudFile: '保存云端文件',\n SaveAsCloudFile: '保存为云端文件',\n SavingAbortedMustHaveValidTitle: '云端文件名无效,保存失败',\n ToSaveYourWorkPleaseSignIn: '为了保存您的云端文件,请您先登录。',\n TakeScreenshot: '截屏',\n UseCloudFileName: '采用云端文件名',\n PublishOnModelsMap: '发布到地图上',\n PublishedOnModelsMap: '您的模型成功发布到地图上',\n UpdatedOnModelsMap: '您的模型更新成功',\n YouMustLogInToPublishYourModel: '您必须登录才能发布模型',\n YouCannotPublishAModelThatYouDoNotOwn: '您不能发布他人的模型',\n YouMustSaveModelOnCloudBeforePublishingIt: '您必须先把此模型保存在云端才能发布它',\n },\n editSubMenu: '编辑',\n edit: {\n Undo: '撤销',\n Redo: '重做',\n },\n viewSubMenu: '视界',\n view: {\n NavigationView: '导航模式',\n TwoDimensionalView: '二维模式',\n ResetView: '重置视角',\n ZoomIn: '放大',\n ZoomOut: '缩小',\n AutoRotate: '自动旋转',\n ShowShadow: '显示阴影',\n ShowSurfaceShininess: '显示表面光泽',\n TranslucentFloatingWindows: '透明浮动窗口',\n accessoriesSubMenu: '配件',\n accessories: {\n SiteInformation: '位置信息',\n DesignInformation: '设计信息',\n Instruction: '操作说明',\n StickyNote: '便签',\n Note: '便签',\n },\n },\n settingsSubMenu: '设置',\n settings: {\n WeatherData: '气象数据',\n DiurnalTemperature: '昼夜温度',\n Heliodon: '日影仪',\n SunAndTime: '太阳和时间',\n },\n benchmarksSubMenu: '基准',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: '太阳能辐射模型预测和实际测量的对比',\n BESTESTCase600: '建筑物能耗模拟测试:BESTEST案例600',\n BESTESTCase610: '建筑物能耗模拟测试:BESTEST案例610',\n BESTESTCase620: '建筑物能耗模拟测试:BESTEST案例620',\n BESTESTCase630: '建筑物能耗模拟测试:BESTEST案例630',\n },\n graph: {\n LineWidth: '线条宽度',\n SymbolSize: '符号大小',\n BarCategoryGap: '直条间隙',\n ShowHorizontalGridLines: '显示格子的水平线条',\n ShowVerticalGridLines: '显示格子的竖直线条',\n },\n analysisSubMenu: '分析',\n physicsSubMenu: '物理',\n physics: {\n DailySolarRadiationHeatmap: '当日太阳辐射总量分布热图',\n SolarRadiationHeatmapOptions: '太阳辐射热图选项',\n SolarRadiationHeatmapGridCellSize: '太阳辐射热图网格的尺寸',\n SolarRadiationHeatmapMaxValue: '太阳辐射热图最大值',\n SolarRadiationHeatmapNoAnimation: '若无移动部件则省略动画',\n ReflectionHeatmap: '反射热图',\n },\n sensorSubMenu: '传感器',\n sensor: {\n CollectDailyData: '收集当天数据',\n CollectYearlyData: '收集全年数据',\n SensorSimulationNoAnimation: '若无移动部件则省略动画',\n },\n buildingSubMenu: '建筑物',\n building: {\n AnalyzeDailyBuildingEnergy: '建筑物当天能耗分析',\n AnalyzeYearlyBuildingEnergy: '建筑物全年能耗分析',\n EnergyAnalysisOptions: '能耗分析选项',\n EnergyGridCellSize: '计算网格的尺寸',\n BuildingEnergySimulationNoAnimation: '若无移动部件则省略动画',\n },\n solarPanelSubMenu: '太阳能光伏板',\n solarPanel: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n AnalyzeVisibility: '分析可见度',\n PanelDiscretization: '光伏板离散化方法',\n Exact: '准确',\n Approximate: '近似',\n EnergyGridCellSize: '计算网格的尺寸',\n VisibilityGridCellSize: '视界因子计算网格的尺寸',\n EnergyAnalysisOptions: '能量分析选项',\n VisibilityAnalysisOptions: '可见度分析选项',\n SolarPanelSimulationNoAnimation: '若无移动部件则省略动画',\n },\n parabolicTroughSubMenu: '抛物线槽',\n parabolicTrough: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n parabolicDishSubMenu: '抛物线碟',\n parabolicDish: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n fresnelReflectorSubMenu: '菲涅尔反射镜',\n fresnelReflector: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n heliostatSubMenu: '定日镜',\n heliostat: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n solarUpdraftTowerSubMenu: '太阳能上升气流塔',\n solarUpdraftTower: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n SolarUpdraftTowerSimulationNoAnimation: '若无移动部件则省略动画',\n },\n\n tutorialsSubMenu: '教程',\n\n solarEnergyScienceSubMenu: '太阳能科学',\n solarEnergyScienceTutorials: {\n SunAngles: '太阳相对于地面观察者的角度',\n InsolationAndClimate: '太阳辐射和气候的关系',\n SolarRadiationToBox: '一个长方体受到的太阳能辐射分析',\n },\n\n buildingScienceSubMenu: '建筑科学',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: '房屋的热学封套和围护封套',\n EffectOfSizeOnBuildingEnergy: '房屋大小对能耗的影响',\n EffectOfOrientationOnBuildingEnergy: '房屋方位对能耗的影响',\n EffectOfInsulationOnBuildingEnergy: '房屋隔热对能耗的影响',\n EffectOfRoofColorOnBuildingEnergy: '屋顶颜色对建筑物能耗的影响',\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋檐延伸长度对建筑物能耗的影响',\n EffectOfWindowSHGCOnBuildingEnergy: '窗户太阳能输入对房屋能耗的影响',\n EffectOfThermostatSetpointOnBuildingEnergy: '恒温器设定值对房屋能耗的影响',\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板对房屋能耗的影响',\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度对房屋能耗的影响',\n EffectOfTreesOnBuildingEnergy: '树荫对房屋能耗的影响',\n },\n\n buildingDesignSubMenu: '建筑设计',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: '有棚顶窗的科德角风格的住宅',\n MansardRoofWithDormers: '有天窗的折线屋顶',\n GableRoofVsHipRoof: '双坡屋顶和四坡屋顶的对比',\n ColonialVsSaltbox: '殖民地风格和盐盒风格的对比',\n GambrelRoofVsMansardRoof: '复斜屋顶和折线屋顶的对比',\n CombinationRoofVsBonnetRoof: '组合屋顶和帽檐屋顶的对比',\n DutchGableRoof: '荷兰双坡屋顶',\n GableAndValleyRoof: '坡谷屋顶',\n ClerestoryRoof: '天窗屋顶',\n MonitorRoof: '采光屋顶',\n AFrameHouse: 'A字形房子',\n HalfTimberedHouse: '半木骨架房子',\n AllBasicRoofTypes: '所有的基本屋顶类型',\n },\n\n photovoltaicSolarPowerSubMenu: '光伏发电',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: '光伏板倾斜角对发电量的影响',\n EffectOfAzimuthOfSolarPanel: '光伏板方位角对发电量的影响',\n SolarPanelTypes: '光伏板类型',\n VerticalBifacialSolarPanels: '竖直的双面光伏板',\n CompareMonofacialAndBifacialSolarPanels: '单面光伏板和双面光伏板的对比',\n SolarTrackers: '自动追日器',\n CoveringGroundWithSolarPanels: '为什么我们不简单地用光伏板覆盖地面',\n InterRowSpacingOfSolarPanelArray: '光伏板阵列行间距对发电量的影响',\n EffectOfOrientationOfSolarPanels: '光伏板排列方向对发电量的影响',\n SolarPanelArrayAutomaticLayout: '光伏板自动排列',\n },\n\n concentratedSolarPowerSubMenu: '光热发电',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: '抛物线槽方位角对发电量的影响',\n EffectOfLatusRectumOfParabolicTrough: '抛物线槽通径对发电量的影响',\n FocusSunlightWithParabolicDish: '用抛物线碟聚焦陽光',\n LinearFresnelReflectors: '用直线式菲涅尔反射镜聚焦陽光',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸热管的安装高度对直线式菲涅尔反射镜发电量的影响',\n EffectOfAzimuthOfLinearFresnelReflectors: '直线式菲涅尔反射镜方位角对发电量的影响',\n LinearFresnelReflectorsWithTwoAbsorbers: '配备两个吸收管的直线式菲涅尔反射镜阵列',\n CosineEfficiencyOfHeliostats: '定日镜的余弦效率',\n ShadowingAndBlockingOfHeliostats: '定日镜的阴影和遮挡',\n EffectSolarPowerTowerHeight: '吸收塔高度对发电量的影响',\n SolarPowerTower: '塔式光热发电站',\n },\n\n otherTypesOfSolarPowerSubMenu: '其它类型的太阳能发电',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: '太阳能上升气流塔',\n },\n\n generativeDesignSubMenu: '生成式设计',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: '单面光伏板阵列的倾斜角',\n BifacialSolarPanelArrayTiltAngle: '双面光伏板阵列的倾斜角',\n OutputOfSolarPanelArrayInDifferentPlaces: '一个光伏板阵列在不同地区的产出',\n SimpleSolarFarmParetoFront: '简单太阳能农场设计的帕累托前沿',\n },\n\n examplesSubMenu: '例子',\n\n solarEnergySubMenu: '太阳能',\n solarEnergyExamples: {\n SunBeamAndHeliodon: '太阳光束和日影仪',\n RooftopSolarPanels: '屋顶光伏板',\n NevadaSolarOneParabolicTroughArray: '内华达州太阳能一号的抛物线槽阵列',\n TooeleParabolicDishArray: '犹他州图埃勒的抛物线碟阵列',\n PS10SolarPowerTower: '西班牙塞维利亚的PS10太阳能发电塔',\n TucsonLinearFresnelReflectors: '亚利桑那州图森的直线式菲涅尔反射镜阵列',\n SolarCanopyFormFactors: '太阳能天篷外形设计',\n SolarCanopyOverBleachers: '看台太阳能天篷',\n SolarCanopyOverGarage: '车库太阳能天篷',\n SolarBusStop: '太阳能候车亭',\n SolarFacadeTesla: '特斯拉光伏墙',\n BuildingIntegratedPhotovoltaics: '建筑整合光伏',\n Floatovoltaics: '浮动光伏',\n Agrivoltaics: '农业光伏',\n VegetativeBuffer: '太阳能农场绿化带',\n RainbowSwashSolarFarmBostonMA: '马萨诸塞州波士顿彩虹激流旁边的光伏板阵列',\n MickeyMouseSolarFarmOrlandoFL: '佛罗里达州奥兰多的米老鼠形状光伏板阵列',\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亚州贝克斯菲尔德灌溉渠上假想的光伏板阵列',\n SolarNoiseBarrierLexingtonMA: '马萨诸塞州列克星敦高速公路噪音墙上假想的光伏板',\n HSATSolarTrackersRaleighNC: '北卡罗来纳州罗利的一个水平方向单轴旋转追日光伏板阵列(HSAT)',\n AADATSolarTrackersLancasterCA: '加利福尼亚州兰开斯特的一个双轴旋转追日光伏板阵列(AADAT)',\n SolarUpdraftTowerInCity: '太阳能上升气流塔在城市中的应用',\n },\n\n builtEnvironmentSubMenu: '建造环境',\n residentialBuildingsSubMenu: '住宅建筑',\n residentialBuildingExamples: {\n ColonialHouse: '殖民地风格的住宅',\n DutchColonialHouse: '荷兰殖民地风格的住宅',\n TShapedHouse: 'T字型房子',\n CapeCodHouseWithGarage: '有车库的科德角风格的住宅',\n Solarium: '有日光浴室的房子',\n Church1: '教堂例一',\n Cathedral1: '主教座堂例一',\n Cathedral2: '主教座堂例二',\n Mosque1: '清真寺例一',\n AdobeTaosHouse: '陶斯土坯房',\n RanchHouse: '牧场风格的住宅',\n BonnetHouse: '有帽檐屋顶的住宅',\n BarnStyleHouse: '谷仓式风格的住宅',\n ModernHouse: '现代风格的住宅',\n ButterflyRoofHouse: '蝴蝶型屋顶的住宅',\n },\n commercialBuildingsSubMenu: '商用建筑',\n commercialBuildingExamples: {\n WhiteHouse: '白宫',\n BilimMersinTurkiye: '土耳其梅尔辛科学教育中心',\n SpanishStyleHotel: '西班牙风格旅馆',\n ApartmentBuilding: '公寓楼',\n OfficeBuilding: '办公楼',\n Hotel: '旅馆',\n },\n buildingComplexesSubMenu: '建筑群',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯灵顿高中',\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒罗阿帕奇学校',\n },\n urbanPlanningSubMenu: '城市规划',\n urbanPlanningExamples: {\n Heatmap1: '热图例一',\n },\n otherBuildingsSubMenu: '其它建筑',\n otherBuildingExamples: {\n Greenhouse: '温室',\n Pavilion: '公园的亭子',\n OctagonalPagoda: '八角塔',\n OceanFront: '海边',\n EgyptianPyramids: '埃及金字塔',\n MayanPyramid: '玛雅金字塔',\n SiOSePol: '三十三孔桥',\n StackedCuboids: '堆砌长方体',\n },\n\n artificialIntelligenceSubMenu: '人工智能',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: '优化单排光伏板的倾斜角',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '优化多排光伏板的倾斜角',\n SolarFarmGenerativeDesign: '生成式设计太阳能农场',\n SolarFarmGenerativeDesignWithBlock: '生成式设计太阳能农场:周边有建筑物的情况',\n FitchburgSolarFarmGenerativeDesign: '生成式设计太阳能农场:真实世界案例',\n },\n\n languageSubMenu: '语言',\n publicSubMenu: '公共',\n ModelsGallery: '模型画廊',\n ModelsMap: '模型地图',\n AboutUs: '关于我们',\n },\n\n avatarMenu: {\n AccountSettings: '账号设定',\n PrivacyInfo:\n '登录需要采用您的谷歌ID建立或进入您的阿拉丁账户。\\n我们只储存一个随机的字符串作为您的ID。\\n任何关于您的可辨识的个人信息都没有被收集。\\n详情请参考我们的隐私声明:\\nhttps://intofuture.org/aladdin-privacy.html',\n SignIn: '登录',\n SignOut: '退出账号',\n IfYouAreAStudent: '如果您是一个学生',\n },\n\n skyMenu: {\n Axes: '显示坐标轴',\n Theme: '环境主题',\n ThemeDefault: '默认',\n ThemeDesert: '沙漠',\n ThemeDune: '沙丘',\n ThemeForest: '森林',\n ThemeGrassland: '草原',\n ThemeHill: '丘陵',\n ThemeLake: '湖泊',\n ThemeMountain: '山脉',\n ThemeRural: '田园',\n SunlightAttenuationCoefficientInAir: '阳光在空气中传播的衰减系数',\n ConvectiveCoefficientOfAir: '空气对流传热系数',\n HighestTemperatureTimeInMinutes: '最高气温时间(分钟)',\n SelectSunAnglesToShow: '选择太阳角度显示',\n ShowAzimuthAngle: '显示方位角',\n ShowElevationAngle: '显示高度角',\n ShowZenithAngle: '显示天顶角',\n DirectLightBrightnessAtNoon: '正午直射光照度',\n AmbientLightBrightnessAtNoon: '正午环境光照度',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: '月份辐射度损失比',\n Vegetation: '植被',\n LeafOutDay: '树叶长出的日子',\n LeafOffDay: '树叶脱落的日子',\n Albedo: '反照率',\n ImageOnGround: '地面显示图像',\n WaterSurface: '水面',\n RemoveAllUnlockedTrees: '删除所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\n RemoveAllUnlockedCuboids: '删除所有非固定的长方体',\n DoYouReallyWantToRemoveAllPeople: '你确定删除所有非固定的人物吗',\n DoYouReallyWantToRemoveAllTrees: '你确定删除所有非固定的树木吗',\n DoYouReallyWantToRemoveAllFlowers: '你确定删除所有非固定的花草吗',\n DoYouReallyWantToRemoveAllSolarPanels: '你确定删除所有非固定的光伏板吗',\n DoYouReallyWantToRemoveAllFoundations: '你确定删除所有非固定的地基吗',\n DoYouReallyWantToRemoveAllCuboids: '你确定删除所有非固定的长方体吗',\n LockAllElements: '固定所有的部件',\n UnlockAllElements: '解除所有的固定',\n },\n\n labelSubMenu: {\n Label: '标签',\n LabelText: '标签的内容',\n LabelHeight: '标签的高度',\n LabelSize: '标签的大小',\n LabelFontSize: '字体的大小',\n LabelColor: '标签的颜色',\n KeepShowingLabel: '显示标签',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: '删除此地基上所有非固定的光伏板',\n RemoveAllUnlockedParabolicTroughs: '删除此地基上所有非固定的抛物线槽',\n RemoveAllUnlockedParabolicDishes: '删除此地基上所有非固定的抛物线碟',\n RemoveAllUnlockedFresnelReflectors: '删除此地基上所有非固定的菲涅耳反射镜',\n RemoveAllUnlockedHeliostats: '删除此地基上所有非固定的定日镜',\n RemoveAllUnlockedSensors: '删除此地基上所有非固定的传感器',\n RemoveAllUnlockedLights: '删除此地基上所有非固定的电灯',\n RemoveAllUnlockedWalls: '删除此地基上所有非固定的墙',\n RemoveAllUnlockedWindows: '删除此地基上所有非固定的窗户',\n RemoveAllUnlockedDoors: '删除此地基上所有非固定的门',\n RemoveAllUnlockedPolygons: '删除此地基上所有非固定的多边形',\n RemoveAllUnlockedHumans: '删除此地基上所有非固定的人物',\n RemoveAllUnlockedTrees: '删除此地基上所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除此地基上所有非固定的花草',\n Racks: '支架',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n SolarPanels: '光伏板',\n SolarPanelArray: '光伏板阵列',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你确定删除此地基上所有非固定的光伏板吗',\n ParabolicTroughs: '抛物线槽',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你确定删除此地基上所有非固定的抛物线槽吗',\n ParabolicDishes: '抛物线碟',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你确定删除此地基上所有非固定的抛物线碟吗',\n FresnelReflectors: '菲涅耳反射镜',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你确定删除此地基上所有非固定的菲涅耳反射镜吗',\n Heliostats: '定日镜',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你确定删除此地基上所有非固定的定日镜吗',\n Sensors: '传感器',\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你确定删除此地基上所有非固定的传感器吗',\n Lights: '电灯',\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你确定删除此地基上所有非固定的电灯吗',\n Walls: '墙',\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你确定删除此地基上所有非固定的墙吗',\n Windows: '窗户',\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你确定删除此地基上所有非固定的窗户吗',\n Doors: '门',\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你确定删除此地基上所有非固定的门吗',\n Polygons: '多边形',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你确定删除此地基上所有非固定的多边形吗',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你确定删除此地基上所有非固定的人物吗',\n Trees: '树木',\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你确定删除此地基上所有非固定的树木吗',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你确定删除此地基上所有非固定的花草吗',\n OnlyThisFoundation: '只这块地基',\n AllConnectedFoundations: '所有相连的地基',\n AllFoundations: '所有的地基',\n AddPolygon: '添加多边形',\n SolarStructure: '太阳能构型',\n GroupMaster: '主地基',\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\n GroundFloorRValue: '建筑物地板的R值',\n OnlyThisGroundFloor: '只这个建筑物的地板',\n AllGroundFloors: '所有建筑物的地板',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: '和定日镜配套的吸收塔',\n ReceiverTowerPhysicalProperties: '太阳能吸收塔的物理性质',\n ReceiverTowerHeight: '太阳能吸收塔的高度',\n ReceiverTowerRadius: '太阳能吸收塔的半径',\n ReceiverAbsorptance: '太阳能吸收器的吸收率',\n ReceiverOpticalEfficiency: '太阳能吸收器的光效率',\n ReceiverThermalEfficiency: '太阳能吸收器的热效率',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: '和菲涅尔反射镜配套的吸收管',\n AbsorberPipePhysicalProperties: '太阳能吸收管的物理性质',\n AbsorberHeight: '太阳能吸收管的安装高度',\n AbsorberApertureWidth: '太阳能吸收管的孔径',\n AbsorberPipePoleNumber: '太阳能吸收管的支柱数量',\n AbsorberAbsorptance: '太阳能吸收管的吸收率',\n AbsorberOpticalEfficiency: '太阳能吸收管的光效率',\n AbsorberThermalEfficiency: '太阳能吸收管的热效率',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: '太阳能上升气流塔',\n SolarUpdraftTowerPhysicalProperties: '太阳能上升气流塔的物理性质',\n SolarUpdraftTowerChimneyHeight: '太阳能上升气流塔烟囱的高度',\n SolarUpdraftTowerChimneyRadius: '太阳能上升气流塔烟囱的半径',\n SolarUpdraftTowerCollectorHeight: '太阳能上升气流塔集热棚的高度',\n SolarUpdraftTowerCollectorRadius: '太阳能上升气流塔集热棚的半径',\n SolarUpdraftTowerCollectorTransmissivity: '太阳能上升气流塔集热棚的透射率',\n SolarUpdraftTowerCollectorEmissivity: '太阳能上升气流塔集热棚的发射率',\n SolarUpdraftTowerDischargeCoefficient: '太阳能上升气流塔的流量系数',\n SolarUpdraftTowerTurbineEfficiency: '太阳能上升气流塔的涡轮机效率',\n },\n\n cuboidMenu: {\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n RemoveAllUnlockedSolarPanels: '删除此长方体表面上所有非固定的光伏板',\n RemoveAllUnlockedSensors: '删除此长方体表面上所有非固定的传感器',\n RemoveAllUnlockedPolygons: '删除此长方体表面上所有非固定的多边形',\n RemoveAllUnlockedHumans: '删除此长方体表面上所有非固定的人物',\n RemoveAllUnlockedTrees: '删除此长方体表面上所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除此长方体表面上所有非固定的花草',\n Racks: '支架',\n SolarPanels: '光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你确定删除此长方体表面上所有非固定的光伏板吗',\n Sensors: '传感器',\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你确定删除此长方体表面上所有非固定的传感器吗',\n Polygons: '多边形',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你确定删除此长方体表面上所有非固定的多边形吗',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你确定删除此长方体表面上所有非固定的人物吗',\n Trees: '树木',\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你确定删除此长方体表面上所有非固定的树木吗',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你确定删除此长方体表面上所有非固定的花草吗',\n OnlyThisCuboid: '只这个长方体',\n AllCuboidsOnSameSurface: '同一表面上所有的长方体',\n AllCuboidsAboveSameBase: '同一地基上所有的长方体',\n AllCuboids: '所有的长方体',\n OnlyThisSide: '只这个表面',\n AllSidesOfThisCuboid: '这个长方体所有的侧面',\n AllSidesOfAllCuboids: '所有的长方体所有的侧面',\n AddPolygon: '添加多边形',\n Stackable: '可堆砌',\n GroupMaster: '主长方体',\n },\n\n polygonMenu: {\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n TextBox: '文字框',\n FontOutlineColor: '字体轮廓颜色',\n FontOutlineWidth: '字体轮廓线宽',\n FontStrokeColor: '字体描边颜色',\n FontStrokeWidth: '字体描边线宽',\n NoOutline: '无轮廓线',\n Shiny: '光泽',\n Filled: '填充',\n FillTexture: '填充材质',\n FillColor: '填充颜色',\n Opacity: '遮光度',\n LineColor: '线条颜色',\n LineWidth: '线条宽度',\n LineStyle: '线条样式',\n SolidLine: '实线',\n DashedLine: '虚线',\n DottedLine: '点线',\n InsertVertexBeforeIndex: '前面插入顶点',\n InsertVertexAfterIndex: '后面插入顶点',\n DeleteVertex: '移除顶点',\n OnlyThisPolygon: '只这个多边形',\n AllPolygonsOnSurface: '同一表面上所有的多边形',\n AllPolygonsAboveFoundation: '同一地基上所有的多边形',\n AllPolygons: '所有的多边形',\n Layout: '布局',\n SolarPanelArrayLayout: '光伏板阵列布局',\n SolarPanelArrayLayoutParametricDesign: '光伏板阵列布局参数化设计',\n SolarPanelArrayLayoutGenerativeDesign: '光伏板阵列布局生成式设计',\n SolarPanelArrayModel: '光伏板型号',\n SolarPanelArrayOrientation: '排列方向',\n SolarPanelArrayTiltAngle: '倾斜角度',\n SolarPanelArrayRowWidth: '行宽度',\n SolarPanelArrayInterRowSpacing: '行间距',\n SolarPanelArrayRowSpacing: '行间距',\n SolarPanelArrayRowAxis: '行轴方向',\n SolarPanelArrayLeftRightRowAxis: '左右方向(相对)',\n SolarPanelArrayUpDownRowAxis: '上下方向(相对)',\n SolarPanelArrayEastWestRowAxis: '东西方向(绝对)',\n SolarPanelArrayNorthSouthRowAxis: '南北方向(绝对)',\n SolarPanelArrayMargin: '边缘余地',\n SolarPanelArrayPoleHeight: '支架高度',\n SolarPanelArrayPoleSpacing: '支柱间隔',\n SolarPanelArrayTotalYearlyCost: '全年总成本',\n SolarPanelArrayTotalYearlyRevenue: '全年总收入',\n SolarPanelArrayTotalYearlyYield: '全年总发电量',\n SolarPanelArrayMeanYearlyYield: '平均年发电量',\n SolarPanelArrayYearlyProfit: '全年利润',\n LayoutNotAcceptedCheckYourParameters: '恕不能采用此布局。请检查您的参数设置。',\n },\n\n optimizationMenu: {\n Optimization: '优化',\n Parameters: '参数',\n Variables: '变量',\n Constants: '常量',\n GeneticAlgorithm: '遗传算法',\n GeneticAlgorithmSettings: '遗传算法设定',\n ParticleSwarmOptimization: '粒子群优化',\n ParticleSwarmOptimizationSettings: '粒子群优化设定',\n SolarPanelTiltAngleOptimization: '光伏板倾斜角度优化',\n SolarPanelArrayLayout: '光伏板阵列布局',\n Generation: '世代',\n Gene: '基因',\n NormalizedVariables: '标准化变量',\n Objective: '目标函数',\n ObjectiveFunctionDailyTotalYield: '当日总产出',\n ObjectiveFunctionYearlyTotalYield: '全年总产出',\n ObjectiveFunctionDailyMeanYield: '当日平均产出',\n ObjectiveFunctionYearlyMeanYield: '全年平均产出',\n ObjectiveFunctionDailyProfit: '当日利润',\n ObjectiveFunctionYearlyProfit: '全年利润',\n GeneticAlgorithmSelectionMethod: '遗传算法选择方法',\n RouletteWheel: '轮盘制',\n Tournament: '淘汰制',\n SearchMethod: '搜索方法',\n GlobalSearchUniformSelection: '全局搜索均匀取样',\n LocalSearchRandomOptimization: '局部搜索随机优化',\n PopulationSize: '种群个体数目',\n MaximumGenerations: '最大世代数目',\n SelectionRate: '选择概率',\n CrossoverRate: '交配概率',\n MutationRate: '突变概率',\n Step: '步数',\n SwarmSize: '粒子数目',\n MaximumSteps: '最大步数',\n MaximumVelocity: '最大速度',\n InertiaWeight: '惯性权重',\n CognitiveCoefficient: '认知系数',\n SocialCoefficient: '社会系数',\n ConvergenceThreshold: '终止条件的收敛阈值',\n LocalSearchRadius: '局部搜索的半径',\n RowsPerRackRange: '单个支架上光伏板行数的变化范围',\n TiltAngleRange: '光伏板倾斜角度的变化范围',\n InterRowSpacingRange: '光伏板阵列行间距的变化范围',\n ClickTargetPolygonToActivate: '点击目标多边形激活',\n ClickTargetFoundationToActivate: '点击目标地基激活',\n },\n\n treeMenu: {\n ShowModel: '显示近似模型',\n Flip: '翻转',\n Type: '树种',\n Spread: '树冠直径',\n },\n\n flowerMenu: {\n Flip: '翻转',\n Type: '品种',\n Spread: '直径',\n },\n\n peopleMenu: {\n ChangePerson: '改变人物',\n Flip: '转身',\n Observer: '观察者',\n ViewFromThisPerson: '视角移到此人位置',\n },\n\n lightMenu: {\n Color: '颜色',\n Intensity: '亮度',\n Decay: '衰减',\n MaximumDistance: '最大距离',\n Inside: '内部',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: '相对方位角',\n Pole: '支柱',\n PoleHeight: '支柱高度',\n PoleRadius: '支柱半径',\n ExtraPoleHeight: '额外的支柱高度',\n ExtraPoleHeightInAdditionToHalfWidth: '宽度一半额外的支柱高度',\n DrawSunBeam: '显示光束',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: '反射器镜面反射率',\n ReceiverAbsorptance: '接收器吸收率',\n ReflectorOpticalEfficiency: '反射器光效率',\n ReceiverThermalEfficiency: '接收器热效率',\n },\n\n solarPanelMenu: {\n InverterEfficiency: '逆变器效率',\n InverterEfficiencyExplained: '直流电转换为交流电的效率。',\n DcToAcSizeRatio: '直流-交流容量比例',\n DcToAcSizeRatioExplained: '直流电容量和交流电容量的比例。',\n ChangePvModel: '改变光伏板型号',\n Orientation: '排列方向',\n Portrait: '纵向',\n Landscape: '橫向',\n FrameColor: '框架颜色',\n Panels: '块',\n PanelsWide: '块光伏板宽',\n PanelsLong: '块光伏板长',\n TiltAngle: '倾斜角度',\n SouthFacingIsPositive: '朝南为正',\n Tracker: '追日系统',\n SolarTrackerFollowsSun: '追日系统提高光伏板产出。',\n PoleSpacing: '支柱间隔',\n NoTracker: '无追日系统',\n HorizontalSingleAxisTracker: '水平单轴追日系统',\n VerticalSingleAxisTracker: '竖直单轴追日系统',\n AltazimuthDualAxisTracker: '地平双轴追日系统',\n OnlyThisSolarPanel: '只这个光伏板',\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\n AllSolarPanels: '所有的光伏板',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: '光伏板型号性能',\n Model: '型号',\n PanelSize: '尺寸',\n Cells: '电池組',\n CellType: '光伏电池类型',\n Monocrystalline: '单晶硅',\n Polycrystalline: '多晶硅',\n ThinFilm: '薄膜',\n Bifacial: '双面',\n BifacialityFactor: '双面性因子',\n Black: '黑色',\n Blue: '蓝色',\n ShadeTolerance: '阴影耐受度',\n SolarCellEfficiency: '光伏电池效率',\n NominalOperatingCellTemperature: '名义电池运行温度',\n TemperatureCoefficientOfPmax: 'Pmax温度系数',\n },\n\n parabolicTroughMenu: {\n ModuleLength: '模块长度',\n Modules: '模块',\n ModulesLong: '模块长',\n LatusRectum: '通径',\n OnlyThisParabolicTrough: '只这个抛物线槽',\n AllParabolicTroughsAboveFoundation: '同一地基上所有的抛物线槽',\n AllParabolicTroughs: '所有的抛物线槽',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: '吸收管',\n SelectAbsorberToReflectSunlightTo: '选择阳光反射到的吸收管',\n ModuleLength: '模块长度',\n Modules: '模块',\n ModulesLong: '模块长',\n OnlyThisFresnelReflector: '只这个菲涅耳反射镜',\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射镜',\n AllFresnelReflectors: '所有的菲涅耳反射镜',\n },\n\n heliostatMenu: {\n Tower: '吸收塔',\n SelectTowerToReflectSunlightTo: '选择阳光反射到的吸收塔',\n OnlyThisHeliostat: '只这个定日镜',\n AllHeliostatsAboveFoundation: '同一地基上所有的定日镜',\n AllHeliostats: '所有的定日镜',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: '接收器结构',\n CentralPole: '中心直柱',\n CentralPoleWithTripod: '三脚架和中心直柱',\n Quadrupod: '四脚架',\n RimDiameter: '外圈直径',\n LatusRectum: '通径',\n ExtraPoleHeightInAdditionToRadius: '半径之外额外的支架高度',\n OnlyThisParabolicDish: '只这个抛物线碟',\n AllParabolicDishesAboveFoundation: '同一地基上所有的抛物线碟',\n AllParabolicDishes: '所有的抛物线碟',\n },\n\n wallMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n SizeOfWall: '墙的尺寸',\n OnlyThisWall: '只这堵墙',\n AllConnectedWalls: '所有连接的墙',\n AllWallsAboveFoundation: '同一地基上所有的墙',\n AllWalls: '所有的墙',\n Windows: '窗户',\n LockAllWindows: '固定所有的窗户',\n UnlockAllWindows: '解除所有的窗户固定',\n RemoveAllUnlockedWindows: '删除这堵墙上所有非固定的窗户',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你确定删除这堵墙上所有非固定的窗户吗',\n Doors: '门',\n RemoveAllUnlockedDoors: '删除这堵墙上所有非固定的门',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你确定删除这堵墙上所有非固定的门吗',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '删除这堵墙上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你确定删除这堵墙上所有非固定的光伏板吗',\n Sensors: '传感器',\n LockAllSensors: '固定所有的传感器',\n UnlockAllSensors: '解除所有的传感器固定',\n RemoveAllUnlockedSensors: '删除这堵墙上所有非固定的传感器',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你确定删除这堵墙上所有非固定的传感器吗',\n Lights: '电灯',\n RemoveAllUnlockedLights: '删除这堵墙上所有非固定的电灯',\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你确定删除这堵墙上所有非固定的电灯吗',\n LockAllPolygons: '固定这堵墙上所有的多边形',\n UnlockAllPolygons: '解除这堵墙上所有的多边形固定',\n RemoveAllUnlockedPolygons: '删除这堵墙上所有非固定的多边形',\n WallStructure: '墙结构',\n DefaultStructure: '默认',\n StudStructure: '墙柱',\n PillarStructure: '圆柱',\n Opacity: '遮光度',\n StructureSpacing: '结构间距',\n StructureWidth: '结构宽度',\n StructureThickness: '结构厚度',\n StructureColor: '结构颜色',\n Color: '牆体颜色',\n Height: '高度',\n Thickness: '厚度',\n Texture: '材质',\n AllLightsOnWallInside: '所有电灯在牆内',\n AllLightsOnWallOutside: '所有电灯在牆外',\n Fill: '填充',\n Full: '全部',\n Partial: '部分',\n Empty: '空白',\n OpenToOutside: '对外面开放',\n EavesLength: '屋檐延伸长度',\n Parapet: '女墙',\n ParapetColor: '女墙颜色',\n ParapetTexture: '女墙材质',\n ParapetHeight: '女墙高度',\n CopingsHeight: '顶盖高度',\n CopingsWidth: '顶盖宽度',\n },\n\n windowMenu: {\n OnlyThisWindow: '只这个窗户',\n AllWindowsOnSurface: '同一表面上所有的窗户',\n AllWindowsAboveFoundation: '同一地基上所有的窗户',\n AllWindows: '所有的窗户',\n Width: '宽度',\n Height: '高度',\n Mullion: '直棂',\n MullionWidth: '直棂宽度',\n MullionSpacing: '直棂间距',\n MullionColor: '直棂颜色',\n Tint: '着色',\n Opacity: '不透明度',\n SolarHeatGainCoefficient: '太阳辐射热获取系数(SHGC) = 1 - 不透明度',\n Shutter: '百叶窗',\n LeftShutter: '左侧百叶窗',\n RightShutter: '右侧百叶窗',\n BothShutters: '两侧百叶窗',\n ShutterWidth: '相对宽度',\n ShutterColor: '百叶窗颜色',\n Frame: '边框',\n FrameWidth: '边框宽度',\n SillWidth: '窗台宽度',\n Color: '边框颜色',\n WindowType: '窗户种类',\n Default: '默认',\n Arched: '拱形',\n Polygonal: '多边形',\n Interior: '内窗',\n Empty: '空白',\n },\n\n roofMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n OnlyThisRoof: '只这个屋顶',\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\n AllRoofs: '所有的屋顶',\n OnlyThisCeiling: '只这个天花板',\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\n AllCeilings: '所有的天花板',\n EavesOverhangLength: '屋檐延伸长度',\n RafterSpacing: '屋椽间距',\n RafterWidth: '屋椽宽度',\n RafterThickness: '屋椽厚度',\n RafterColor: '屋椽颜色',\n RoofColor: '屋顶颜色',\n RoofSideColor: '屋顶侧面颜色',\n GlassTint: '玻璃颜色',\n Opacity: '遮光度',\n RoofStructure: '屋顶结构',\n DefaultStructure: '默认',\n RafterStructure: '屋椽',\n GlassStructure: '玻璃',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '删除这个屋顶上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你确定删除这个屋顶上所有非固定的光伏板吗',\n Windows: '天窗',\n LockAllWindows: '固定所有的天窗',\n UnlockAllWindows: '解除所有的天窗固定',\n RemoveAllUnlockedWindows: '删除这个屋顶上所有非固定的天窗',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你确定删除这个屋顶上所有非固定的天窗吗',\n Sensors: '传感器',\n LockAllSensors: '固定所有的传感器',\n UnlockAllSensors: '解除所有的传感器固定',\n RemoveAllUnlockedSensors: '删除这个屋顶上所有非固定的传感器',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你确定删除这个屋顶上所有非固定的传感器吗',\n Lights: '电灯',\n RemoveAllUnlockedLights: '删除这个屋顶上所有非固定的电灯',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你确定删除这个屋顶上所有非固定的电灯吗',\n AllLightsOnRoofInside: '所有电灯在屋顶内',\n AllLightsOnRoofOutside: '所有电灯在屋顶外',\n Rise: '相对高度',\n Ceiling: '天花板',\n RoofRValue: '屋顶R值',\n CeilingRValue: '天花板R值',\n },\n\n doorMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n Texture11: '十一号材质',\n Texture12: '十二号材质',\n Texture13: '十三号材质',\n Texture14: '十四号材质',\n Texture15: '十五号材质',\n Texture16: '十六号材质',\n Texture17: '十七号材质',\n OnlyThisDoor: '只这个门',\n AllDoorsOnWall: '同一面墙上所有的门',\n AllDoorsAboveFoundation: '同一地基上所有的门',\n AllDoors: '所有的门',\n DoorType: '门种类',\n Default: '默认',\n Arched: '拱形',\n Filled: '填充',\n FrameColor: '门框颜色',\n Interior: '内门',\n },\n\n siteInfoPanel: {\n High: '最高温度',\n Low: '最低温度',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: '选中的定日镜总数',\n NumberOfSelectedSolarPanels: '选中的光伏板总数',\n ElectricityGeneratedDailyBySolarPanels: '这些光伏板的日发电量',\n SceneDiameter: '场景直径',\n BuildingArea: '建筑面积',\n },\n\n visualizationControlPanel: {\n ColorContrast: '热图颜色对比度',\n FluxScale: '热通量长度',\n ClickUpOrDownArrowButtonsToChange: '点击上下箭头改变参数',\n },\n\n instructionPanel: {\n Rotate: '旋转',\n DragMouse: '拖动鼠标',\n Zoom: '缩放',\n MouseWheelOrKeys: '鼠标滚轮或者Ctrl+[和Ctrl+]',\n MouseWheelOrKeysMac: '鼠标滚轮或者⌘+[和⌘+]',\n Pan: '平移',\n HoldCtrlDragMouse: '按下Ctrl键并拖动鼠标',\n HoldMetaDragMouse: '按下⌘键并拖动鼠标',\n Enter2DMode: '進入二维模式',\n Exit2DMode: '退出二维模式',\n EnableNavigation: '進入导航模式',\n DisableNavigation: '退出导航模式',\n Move: '移动',\n MoveInstruction: '按下W/A/S/D/Z/X键',\n Turn: '拐弯',\n TurnInstruction: '按下方向键',\n ResetView: '重置视角',\n AutoRotate: '自动旋转',\n StartOrStop: '按F4键启动或停止',\n },\n\n mapPanel: {\n ImageOnGround: '地面显示图像',\n WeatherStations: '气象站',\n WeatherStationsNote: '关闭此选项以提高地图速度',\n Coordinates: '经纬度坐标',\n Zoom: '放大程度',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: '光伏板对观察者的可见度',\n Observer: '观察者',\n VantagePoint: '观察位置',\n ItemizedVisibilityByFields: '每个场的可见度',\n TotalVisibility: '总可见度',\n },\n\n sensorPanel: {\n LightSensor: '光传感器',\n WeatherDataFrom: '气象数据来自',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: '建筑物日能耗',\n YearlyBuildingEnergy: '建筑物年能耗',\n Heater: '暖气',\n AC: '空调',\n SolarPanel: '光伏',\n Net: '净能耗',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: '光伏日发电量',\n SolarPanelYearlyYield: '光伏年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualSolarPanels: '显示每行光伏板单独发电量',\n Profit: '利润',\n TotalCost: '总成本',\n TotalRevenue: '总收入',\n TotalYield: '总发电量',\n MeanYield: '平均发电量',\n ModuleCount: '光伏板总数',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: '抛物线槽日发电量',\n ParabolicTroughYearlyYield: '抛物线槽年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualParabolicTroughs: '显示每行抛物线槽单独发电量',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: '抛物线碟日发电量',\n ParabolicDishYearlyYield: '抛物线碟年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualParabolicDishes: '显示每个抛物线碟单独发电量',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: '菲涅耳反射镜日发电量',\n FresnelReflectorYearlyYield: '菲涅耳反射镜年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualFresnelReflectors: '显示每个菲涅耳反射镜单独发电量',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: '定日镜日发电量',\n HeliostatYearlyYield: '定日镜年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualHeliostats: '显示每个定日镜单独发电量',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: '太阳能上升气流塔日发电量',\n UpdraftTowerYearlyYield: '太阳能上升气流塔年发电量',\n ChimneyAirTemperature: '烟囱空气温度',\n ChimneyWindSpeed: '烟囱风速',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualUpdraftTowers: '显示每个太阳能上升气流塔单独发电量',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: '太阳和时间设置',\n SunAngles: '角度',\n TwentyFourHours: '24小时',\n },\n\n cloudFilePanel: {\n SearchByTitle: '按标题搜索',\n MyLikes: '我喜欢的模型',\n MyCloudFiles: '我的云文件',\n GenerateLink: '生成链接',\n LinkGeneratedInClipBoard: '链接已经复制到剪贴板',\n DoYouReallyWantToDelete: '您确定删除此文件',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文件已被分享或发布, 改名会使已有链接失效',\n },\n\n projectListPanel: {\n SearchByTitle: '按标题搜索',\n MyProjects: '我的项目',\n GenerateProjectLink: '生成项目链接',\n ProjectLinkGeneratedInClipBoard: '项目链接已经复制到剪贴板',\n DoYouReallyWantToDeleteProject: '您确定删除项目',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此项目已被分享或发布, 改名会使已有链接失效',\n },\n\n projectPanel: {\n ProjectSettings: '项目设定',\n ThumbnailImageSize: '缩略图大小',\n ProjectByOtherPeople: '别人的项目',\n Project: '项目',\n ProjectType: '类别',\n ProjectDescription: '描述',\n MakeDescriptionEditable: '编辑描述',\n MakeDescriptionNonEditable: '不编辑描述',\n DoubleClickToMakeDescriptionEditable: '双击此描述激活编辑功能',\n SolarPanelArray: '光伏板阵列设计',\n CurateCurrentDesign: '收藏当前设计',\n UpdateSelectedDesign: '更新选中设计',\n RemoveSelectedDesign: '删除选中设计',\n ClickToFlipSortingOrder: '点击逆转排序方向',\n DesignNotShownInSolutionSpaceClickToShow: '此设计目前不显示在设计空间内,点击显示',\n DesignShownInSolutionSpaceClickToHide: '此设计目前显示在设计空间内,点击隐藏',\n DistributionInSolutionSpace: '方案在设计空间里的分布',\n ChooseSolutionSpace: '选择设计空间',\n ChooseDataColoring: '选择数据着色',\n SameColorForAllDesigns: '所有设计一个颜色',\n OneColorForEachDesign: '每个设计一个颜色',\n SolutionSpaceScreenshot: '设计空间截图',\n ScatteredPlotScreenshot: '散点图截图',\n SingleClickToSelectDoubleClickToOpen: '单击选择,双击打开。',\n SingleClickToDeselectDoubleClickToOpen: '单击取消选择,双击打开。',\n GenerateScatteredPlot: '生成散点图',\n SelectXAxis: '选择X轴',\n SelectYAxis: '选择Y轴',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: '我的账户设定',\n MyID: '我的🆔',\n ClickToCopyMyID: '点击此处拷贝我的ID',\n IDInClipBoard: '您现在可以粘贴ID了。',\n StoreMyNameInMyFilesWhenSaving: '保存文件时签上我的大名',\n DoYouReallyWantToShowYourNameInYourFiles: '您确定在您的文件里保存您的大名吗?',\n SignFileDisclaimer: '如果您选择保存,您的大名可能被所有打开您的文件的人看到。',\n Likes: '点赞总数',\n AllPublished: '发布总数',\n PublishedUnderAliases: '别名发布',\n UserCount: '用户总数',\n SchoolID: '学校编号',\n ClassID: '班级编号',\n },\n\n weatherPanel: {\n SunshineHours: '日照时间',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: '选择气温模型',\n Sinusoidal: '正弦函数',\n },\n\n economicsPanel: {\n EconomicsParameters: '经济学参数',\n ElectricitySellingPrice: '销售电价',\n OperationalCostPerUnit: '单位运行成本',\n SellingPrice: '销售电价',\n UnitCost: '单位成本',\n },\n\n navigationPanel: {\n NavigationParameters: '导航模式参数',\n MinimumMoveSpeed: '最小移动速度',\n MinimumTurnSpeed: '最小拐弯速度',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: '天空清晰度',\n ShowDaylightResults: '显示日照时间结果',\n ShowSkyClearnessResults: '显示天空清晰度结果',\n ShowAverageDailySolarRadiation: '显示日平均辐射结果',\n },\n\n analysisManager: {\n NoSensorForCollectingData: '没有传感器收集数据。',\n NoSolarPanelForAnalysis: '没有光伏板可以分析。',\n NoObserverForVisibilityAnalysis: '没有找到可见度分析的观察者。',\n NoWaterHeaterForAnalysis: '沒有太阳能热水器可以分析。',\n NoParabolicDishForAnalysis: '沒有抛物线碟可以分析。',\n NoParabolicTroughForAnalysis: '沒有抛物线槽可以分析。',\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射镜可以分析。',\n NoHeliostatForAnalysis: '沒有定日镜可以分析。',\n NoSolarUpdraftTowerForAnalysis: '沒有太阳能上升气流塔可以分析。',\n NoBuildingForAnalysis: '沒有建筑物可以分析。',\n },\n\n toolbar: {\n CloudFile: '云文件',\n Select: '选择',\n AddFoundation: '添加地基',\n AddWall: '添加墙体',\n AddWindow: '添加窗户',\n AddDoor: '添加门',\n AddPyramidRoof: '添加金字塔屋顶',\n AddGableRoof: '添加双坡屋顶',\n AddHipRoof: '添加四坡屋顶',\n AddGambrelRoof: '添加复斜屋顶',\n AddMansardRoof: '添加折线屋顶',\n AddCuboid: '添加长方体',\n AddSensor: '添加传感器',\n AddSolarPanel: '添加光伏板',\n AddWaterHeater: '添加太阳能热水器',\n AddParabolicDish: '添加抛物线碟',\n AddParabolicTrough: '添加抛物线槽',\n AddFresnelReflector: '添加菲涅耳反射镜',\n AddHeliostat: '添加定日镜',\n AddWindTurbine: '添加风力涡轮机',\n AddLight: '添加电灯',\n AddTree: '添加树木',\n AddFlower: '添加花草',\n AddPeople: '添加人物',\n DoubleClickToLockThisModeForNextAction: '双击按钮给下个动作锁定此模式',\n ClickToUnlockThisModeForNextAction: '点击按钮让动作完成即离开此模式',\n ManipulateGroup: '整体操作一个组',\n ClearScene: '清空场景',\n ShowSunAndTimeSettings: '显示太阳和时间设置',\n SpatialAnalysisOfEnergy: '能量的空间分析',\n DoYouReallyWantToClearContent: '您确定清空场景吗',\n ClickForMoreButtons: '点击此处切换到更多的按钮模式',\n SwitchToAddingFoundation: '切换到添加地基模式',\n SwitchToAddingCuboid: '切换到添加长方体模式',\n SwitchToAddingWall: '切换到添加墙体模式',\n SwitchToAddingWindow: '切换到添加窗户模式',\n SwitchToAddingDoor: '切换到添加门模式',\n SwitchToAddingPyramidRoof: '切换到添加金字塔屋顶模式',\n SwitchToAddingGableRoof: '切换到添加双坡屋顶模式',\n SwitchToAddingHipRoof: '切换到添加四坡屋顶模式',\n SwitchToAddingGambrelRoof: '切换到添加复斜屋顶模式',\n SwitchToAddingMansardRoof: '切换到添加折线屋顶模式',\n SwitchToAddingSolarPanel: '切换到添加光伏板模式',\n SwitchToAddingSensor: '切换到添加传感器模式',\n SwitchToAddingWaterHeater: '切换到添加太阳能热水器模式',\n SwitchToAddingParabolicDish: '切换到添加抛物线碟模式',\n SwitchToAddingParabolicTrough: '切换到添加抛物线槽模式',\n SwitchToAddingFresnelReflector: '切换到添加菲涅耳反射镜模式',\n SwitchToAddingHeliostat: '切换到添加定日镜模式',\n SwitchToAddingWindTurbine: '切换到添加风力涡轮机模式',\n SwitchToAddingLight: '切换到添加电灯模式',\n SwitchToAddingTree: '切换到添加树木模式',\n SwitchToAddingFlower: '切换到添加花草模式',\n SwitchToAddingPeople: '切换到添加人物模式',\n },\n\n tooltip: {\n gotoIFI: '访问未来智能研究所',\n visitAladdinHomePage: '访问阿拉丁主页',\n clickToOpenMenu: '点击打开主菜单',\n clickToAccessCloudTools: '点击打开云菜单',\n },\n\n tree: {\n Apple: '苹果树',\n Birch: '白桦',\n Coconut: '椰子树',\n Dogwood: '茱萸',\n Elm: '榆树',\n FanPalm: '扇叶棕榈',\n Linden: '菩提',\n Magnolia: '玉兰',\n Maple: '枫树',\n Oak: '橡树',\n Pine: '松树',\n Spruce: '云杉',\n },\n\n flower: {\n Bellflower: '铃兰',\n Boxwood: '黄杨',\n CactusCombo1: '仙人掌组合一',\n CactusCombo2: '仙人掌组合二',\n CactusCombo3: '仙人掌组合三',\n CactusCombo4: '仙人掌组合四',\n Hibiscus: '木槿',\n Hosta: '玉簪',\n Hydrangea: '绣球花',\n Peony: '牡丹',\n RedRose: '红玫瑰',\n Spirea: '绣线菊',\n Sunflower: '向日葵',\n TallBush: '高灌木',\n Tulip: '郁金香',\n WhiteFlower: '白花',\n YellowFlower: '黄花',\n },\n\n people: {\n Jaah: '贾阿',\n Jack: '杰克',\n Jacob: '雅各布',\n Jacqueline: '杰奎琳',\n Jade: '美玉',\n Jamelia: '洁米莉雅',\n James: '詹姆斯',\n Jane: '简',\n Jaya: '佳娅',\n Jaye: '杰伊',\n Jeanette: '珍妮特',\n Jedi: '杰迪',\n Jeff: '杰夫',\n Jena: '珍娜',\n Jennifer: '珍尼弗',\n Jess: '杰西',\n Jett: '杰特',\n Jill: '吉尔',\n Jiya: '吉娅',\n Joan: '琼',\n Jocelyn: '乔斯林',\n Joel: '乔尔',\n Joey: '乔伊',\n John: '约翰',\n Jonathon: '乔纳森',\n Jose: '何塞',\n Joseph: '约瑟夫',\n Joshua: '约书亚',\n Judd: '贾德',\n Judy: '朱蒂',\n Julia: '朱莉娅',\n Julio: '胡里奥',\n Jumapili: '祖玛匹莉',\n June: '准卫',\n Juro: '朱诺',\n Justin: '贾斯汀',\n },\n\n compass: {\n N: '北',\n S: '南',\n W: '西',\n E: '东',\n },\n\n month: {\n January: '一月',\n February: '二月',\n March: '三月',\n April: '四月',\n May: '五月',\n June: '六月',\n July: '七月',\n August: '八月',\n September: '九月',\n October: '十月',\n November: '十一月',\n December: '十二月',\n },\n\n modelsMap: {\n SearchByPublisher: '按发布者搜索',\n SearchByLabel: '按标签搜索',\n MyPublishedModels: '我发布的模型',\n TotalNumberOfUserPublishedModels: '用户发布的模型总数',\n SortFromOldestToNewest: '从早到晚排序',\n SortFromNewestToOldest: '从晚到早排序',\n ModelsFoundOnThisSite: '个模型在此位置',\n ShowModelsPublishedByThisAuthor: '展示此用户发布的模型',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_zh_tw = {\n translation: {\n name: {\n IFI: '未來智能研究所',\n Aladdin: '阿拉丁',\n Tagline: '阿拉丁: 探索人工智慧時代的設計軟體 — 未來智能研究所研發',\n },\n\n cookie: {\n Statement: '聲明:為了改善您的用戶體驗,阿拉丁採用cookie儲存少量數據。',\n Accept: '同意',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: '未來智能研究所榮譽出品',\n TermsOfService: '服務條款',\n PrivacyPolicy: '隱私政策',\n Software: '軟體',\n Content: '課件',\n Research: '研究',\n Support: '服務',\n Acknowledgment: '鳴謝',\n FundingInformation:\n '本產品的研發承蒙美國國家科學基金會慷慨資助(項目號#2105695,#2131097,#2301164)。本產品的任何觀點或結論僅代表創作者個人意見。',\n Contact: '如您需要更多資訊,請聯繫 Charles Xie (charles@intofuture.org)。我們會盡快回复。',\n Translators: '翻譯',\n },\n\n word: {\n LastUpdate: '上一次更新',\n Small: '小',\n Medium: '中',\n Large: '大',\n Design: '設計',\n Information: '資訊',\n Type: '類别',\n Text: '文字',\n FontSize: '字體大小',\n FontColor: '字體顏色',\n Model: '模型',\n Models: '模型',\n Upload: '上傳',\n ClickCount: '點擊數',\n Share: '分享',\n AlreadyLike: '已點贊',\n Like: '點贊',\n MustLogInToLike: '必須登錄才能點贊',\n AllRightsReserved: '版權所有',\n MeterAbbreviation: '米',\n Version: '版本',\n VersionInitial: '版本',\n Options: '選項',\n Maximum: '最大',\n Minimum: '最小',\n MaximumNumber: '最多',\n MinimumNumber: '最少',\n MaximumValue: '最大值',\n MinimumValue: '最小值',\n Or: '或',\n None: '無',\n High: '高',\n Partial: '部分',\n Teacher: '老師',\n Class: '班級',\n Total: '總數',\n Leaderboard: '用戶排行榜',\n Latest: '最新',\n Range: '範圍',\n SIUnit: '國際單位制',\n USUnit: '美國單位制',\n ThermalTransmittance: '熱透過率',\n ThermalResistance: '熱阻',\n UValue: 'U值',\n RValue: 'R值',\n VolumetricHeatCapacity: '容積熱容',\n BuildingHVACSystem: '建築物暖通空調系統',\n ThermostatSetpoint: '恆溫器設定值',\n TemperatureToleranceThreshold: '溫度忍耐閾值',\n TemperatureToleranceThresholdExplanation:\n '當日最低外面溫度高於恆溫器設定值減去此閾值,暖氣不開。\\n當日最高外面溫度低於恆溫器設定值加上此閾值,空調不開。',\n Press: '按',\n Open: '打開',\n Save: '保存',\n SaveAsImage: '保存為圖像',\n SaveAsCsv: '保存為CSV',\n Update: '刷新',\n Paste: '粘貼',\n Copy: '複製',\n Cut: '剪切',\n Delete: '删除',\n Lock: '固定',\n Translucent: '半透明',\n Color: '顏色',\n Texture: '材質',\n Thickness: '厚度',\n Size: '尺寸',\n Yes: '是',\n No: '不',\n OK: '確定',\n Cancel: '取消',\n Apply: '應用',\n Close: '關閉',\n ApplyTo: '適用於',\n Run: '運行',\n Pause: '暫停',\n Resume: '繼續',\n Clear: '清空',\n Warning: '警告',\n Caution: '小心',\n Reminder: '提醒',\n Length: '長度',\n Width: '寬度',\n Height: '高度',\n Radius: '半徑',\n Angle: '角度',\n Azimuth: '方位角',\n Coordinates: '坐標',\n Weather: '天氣',\n Show: '顯示',\n Animate: '動畫',\n Date: '日期',\n Time: '時間',\n Title: '標題',\n Owner: '所有者',\n Action: '操作',\n Rename: '改名',\n Location: '位置',\n Latitude: '緯度',\n Month: '月份',\n Day: '天',\n Hour: '小時',\n Daylight: '白天長度',\n Radiation: '輻射',\n Temperature: '温度',\n kWh: '千瓦時',\n dollar: '元',\n MeterPerSecond: '米/秒',\n NorthInitial: '北',\n SouthInitial: '南',\n EastInitial: '東',\n WestInitial: '西',\n Fixed: '固定',\n Elements: '部件',\n Energy: '能量',\n Unknown: '未知',\n Label: '標籤',\n Description: '描述',\n NoDescription: '無描述',\n MaximumCharacters: '最多字符數',\n Author: '作者',\n Publisher: '發布者',\n Building: '建築',\n ResidentialBuilding: '住宅建築',\n CommercialBuilding: '商用建築',\n SchoolBuilding: '學校建築',\n TouristAttraction: '旅遊景點',\n UnderConstruction: '在建',\n Photovoltaic: '光伏',\n Anonymous: '無名氏',\n Nickname: '别名',\n Pin: '置頂',\n Unpin: '解除置頂',\n },\n\n shared: {\n NoTexture: '無材質',\n FoundationElement: '地基',\n CuboidElement: '長方體',\n PolygonElement: '多邊形',\n SensorElement: '傳感器',\n SolarPanelElement: '光伏板',\n WaterHeaterElement: '太陽能熱水器',\n ParabolicDishElement: '拋物線碟',\n ParabolicTroughElement: '拋物線槽',\n FresnelReflectorElement: '菲涅耳反射鏡',\n HeliostatElement: '定日鏡',\n WindTurbineElement: '風力渦輪機',\n LightElement: '電燈',\n ElementLocked: '固定',\n ModelType: '模型類别',\n OutputBreakdown: '分列發電量',\n MoreResults: '更多結果',\n },\n\n message: {\n ModelNotFound: '沒有找到模型',\n CannotSignIn: '登錄失敗',\n CannotSignOut: '退出失敗',\n YourAccountWasCreated: '成功建立您的賬號。',\n CannotCreateAccount: '無法創建賬號',\n YourAccountSettingsWereSaved: '您的賬號設定已保存。',\n CannotSaveYourAccountSettings: '您的賬號設定無法保存',\n CannotSaveYourFileToCloud: '無法保存您的文檔到雲端',\n CannotCreateNewProject: '無法創建新項目',\n CannotCreateNewProjectWithoutTitle: '沒有標題, 無法創建新項目',\n CannotOpenYourProjects: '無法打開您的項目列表',\n CannotOpenProject: '無法打開項目',\n CannotDeleteProject: '無法刪除項目',\n CannotRenameProject: '無法給項目改名',\n CannotAddDesignToProject: '無法把此設計加到項目裡',\n CannotAddDesignToProjectOwnedByOthers: '不能把此設計加到別人的項目裡',\n DesignRemovedFromProject: '設計被成功地從項目裡刪除',\n CannotRemoveDesignFromProject: '無法把此設計從項目裡刪除',\n CannotUpdateProject: '無法更新項目',\n CannotFetchProjectData: '無法取得項目數據',\n TitleUsedChooseDifferentOne: '此標題已經被使用, 請採用不同的標題',\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此標題的雲文檔已經存在,您確定要覆蓋它嗎?',\n CloudFileNotFound: '找不到此云端文檔',\n CannotLoadModelsOnMap: '無法下載地圖上的模型',\n CannotLoadLeaderboard: '無法下載排行榜',\n CannotPublishModelOnMap: '模型無法發佈到地圖上',\n CannotLikeModelFromMap: '無法點贊地圖上的模型',\n CannotDeleteModelFromMap: '無法删除地圖上的模型',\n ModelDeletedFromMap: '模型已從地圖上刪除',\n DoYouWantToDeleteModelFromMap: '您要删除地圖上的這個模型嗎?',\n CannotOpenCloudFile: '此云端文檔無法打開',\n CannotReadCloudFile: '無法讀取此云端文檔',\n CannotWriteCloudFile: '無法存儲此云端文檔',\n CloudFileCopied: '拷貝云端文檔',\n CannotOpenCloudFolder: '您的雲端文檔夾無法打開',\n CannotDeleteCloudFile: '無法刪除此云端文檔',\n CannotRenameCloudFile: '此云端文檔的名字無法更改',\n DoYouWantToSaveChanges: '您要保存當前文檔嗎?',\n NotApplicableToSelectedAction: '此值不適用於當前選擇範圍',\n ThisElementIsLocked: '這個部件被鎖定。',\n ThisCannotBeUndone: '這個操作一旦執行就不能撤銷。',\n AzimuthOfNorthIsZero: '正北的方位角為零度',\n CounterclockwiseAzimuthIsPositive: '逆時針為正',\n MoveCancelledBecauseOfOverlap: '位置重疊,移動取消。',\n MoveOutsideBoundaryCancelled: '位置出界,移動取消。',\n RotationCancelledBecauseOfOverlap: '位置重疊,旋轉取消。',\n RotationOutsideBoundaryCancelled: '位置出界,旋轉取消。',\n ResizingCancelledBecauseOfOverlap: '位置重疊,尺寸調整取消。',\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸調整取消。',\n CannotPasteOutsideBoundary: '位置出界,不能複制。',\n CannotPasteBecauseOfOverlap: '位置重疊,不能複制。',\n CannotMoveObjectTooFar: '位置太遠,移動取消。',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '採用新佈局之前必須移除現有的光伏板。',\n DoYouWantToContinue: '您想繼續嗎?',\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接觸。',\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重疊。',\n ScreenshotSaved: '截屏圖片保存在下載文檔夾裡。',\n CsvFileSaved: 'CSV保存在下載文檔夾裡。',\n SimulationStarted: '模擬開始。',\n SimulationCompleted: '模擬結束。',\n SimulationAborted: '模擬取消。',\n SimulationPaused: '模擬暫停。',\n CancelSimulation: '取消模擬',\n PauseSimulation: '暫停模擬',\n ResumeSimulation: '繼續模擬',\n SimulationWillNotStartDueToErrors: '由於錯誤模擬無法運行',\n SimulationWillStartDespiteWarnings: '發現問題,但模擬仍然將運行。',\n EvolutionStarted: '演化開始。',\n EvolutionCompleted: '演化結束。',\n EvolutionAborted: '演化取消。',\n EvolutionPaused: '演化暫停。',\n EncounterEvolutionError: '演化出錯。',\n CancelEvolution: '取消演化',\n PauseEvolution: '暫停演化',\n ResumeEvolution: '繼續演化',\n ConvergenceThresholdHasBeenReached: '收斂閾值已達到。',\n MaximumNumberOfGenerationsHasBeenReached: '最大世代數已達到。',\n MaximumNumberOfStepsHasBeenReached: '最大步數已達到。',\n ObjectiveFunctionTypeError: '此操作不支持當前的目標函數。請從菜單啟動此功能。',\n WallsAreNotAtSameHeight: '墻體高度不同。',\n WallsAreNotPerpendicular: '墻體不垂直。',\n WallsAreNotConnected: '墻體不相連。',\n WallsNumberNeedToBeFour: '墻體數量必須為四個。',\n BuildingContainsEmptyWall: '建築物有空牆。',\n BuildingRoofMissing: '建築物沒有屋頂。',\n UnknownErrors: '未知錯誤。',\n },\n\n menu: {\n AnalysisOptions: '分析選項',\n option: {\n GridCellSize: '計算網格的尺寸',\n SamplingFrequency: '採樣頻率',\n TimesPerHour: '每小時採樣次數',\n DaysPerYear: '每一年採樣天數',\n },\n mainMenu: '主菜單',\n cloudMenu: '雲菜單',\n projectSubMenu: '項目',\n project: {\n CreateNewProject: '創建新項目',\n OpenProject: '打開項目',\n SaveProjectAs: '另存項目為',\n YouMustLogInToCreateProject: '您必須登錄才能創建項目',\n YouMustLogInToOpenProject: '您必須登錄才能打開項目',\n },\n fileSubMenu: '文檔',\n file: {\n CreateNewFile: '創建新文檔',\n OpenLocalFile: '打開本地文檔',\n SaveAsLocalFile: '保存為本地文檔',\n SavingAbortedMustHaveValidFileName: '文檔名無效,保存失敗',\n OpenCloudFile: '打開雲端文檔',\n SaveCloudFile: '保存雲端文檔',\n SaveAsCloudFile: '保存為雲端文檔',\n SavingAbortedMustHaveValidTitle: '雲端文檔名無效,保存失敗',\n ToSaveYourWorkPleaseSignIn: '為了保存您的雲端文檔,請您先登錄。',\n TakeScreenshot: '截屏',\n UseCloudFileName: '採用雲端文件名',\n PublishOnModelsMap: '發佈到地圖上',\n PublishedOnModelsMap: '您的模型成功發佈到地圖上',\n UpdatedOnModelsMap: '您的模型更新成功',\n YouMustLogInToPublishYourModel: '您必須登錄才能發布模型',\n YouCannotPublishAModelThatYouDoNotOwn: '您不能發布他人的模型',\n YouMustSaveModelOnCloudBeforePublishingIt: '您必須先把此模型保存在雲端才能發布它',\n },\n editSubMenu: '編輯',\n edit: {\n Undo: '撤銷',\n Redo: '重做',\n },\n viewSubMenu: '視界',\n view: {\n NavigationView: '導航模式',\n TwoDimensionalView: '二維模式',\n ResetView: '重置視角',\n ZoomIn: '放大',\n ZoomOut: '縮小',\n AutoRotate: '自動旋轉',\n ShowShadow: '顯示陰影',\n ShowSurfaceShininess: '顯示表面光澤',\n TranslucentFloatingWindows: '透明浮動窗口',\n accessoriesSubMenu: '配件',\n accessories: {\n SiteInformation: '位置資訊',\n DesignInformation: '設計資訊',\n Instruction: '操作說明',\n StickyNote: '便簽',\n Note: '便簽',\n },\n },\n settingsSubMenu: '設置',\n settings: {\n WeatherData: '氣象數據',\n DiurnalTemperature: '晝夜溫度',\n Heliodon: '日影儀',\n SunAndTime: '太陽和時間',\n },\n benchmarksSubMenu: '基準',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: '太陽能輻射模型預測和實際測量的對比',\n BESTESTCase600: '建築物能耗模擬測試:BESTEST案例600',\n BESTESTCase610: '建築物能耗模擬測試:BESTEST案例610',\n BESTESTCase620: '建築物能耗模擬測試:BESTEST案例620',\n BESTESTCase630: '建築物能耗模擬測試:BESTEST案例630',\n },\n graph: {\n LineWidth: '線條寬度',\n SymbolSize: '符號大小',\n BarCategoryGap: '直條間隙',\n ShowHorizontalGridLines: '顯示格子的水平線條',\n ShowVerticalGridLines: '顯示格子的豎直線條',\n },\n analysisSubMenu: '分析',\n physicsSubMenu: '物理',\n physics: {\n DailySolarRadiationHeatmap: '當日太陽輻射總量分佈熱圖',\n SolarRadiationHeatmapOptions: '太陽輻射熱圖選項',\n SolarRadiationHeatmapGridCellSize: '太陽輻射熱圖網格的尺寸',\n SolarRadiationHeatmapMaxValue: '太陽輻射熱圖最大值',\n SolarRadiationHeatmapNoAnimation: '若無移動部件則省略動畫',\n ReflectionHeatmap: '反射熱圖',\n },\n sensorSubMenu: '傳感器',\n sensor: {\n CollectDailyData: '收集當天數據',\n CollectYearlyData: '收集全年數據',\n SensorSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n buildingSubMenu: '建築物',\n building: {\n AnalyzeDailyBuildingEnergy: '建築物當天能耗分析',\n AnalyzeYearlyBuildingEnergy: '建築物全年能耗分析',\n EnergyAnalysisOptions: '能耗分析選項',\n EnergyGridCellSize: '計算網格的尺寸',\n BuildingEnergySimulationNoAnimation: '若無移動部件則省略動畫',\n },\n solarPanelSubMenu: '太陽能光伏板',\n solarPanel: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n AnalyzeVisibility: '分析可見度',\n PanelDiscretization: '光伏板離散化方法',\n Exact: '準確',\n Approximate: '近似',\n EnergyGridCellSize: '計算網格的尺寸',\n VisibilityGridCellSize: '視界因子計算網格的尺寸',\n EnergyAnalysisOptions: '能量分析選項',\n VisibilityAnalysisOptions: '可見度分析選項',\n SolarPanelSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n parabolicTroughSubMenu: '拋物線槽',\n parabolicTrough: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n parabolicDishSubMenu: '拋物線碟',\n parabolicDish: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n fresnelReflectorSubMenu: '菲涅爾反射鏡',\n fresnelReflector: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n heliostatSubMenu: '定日鏡',\n heliostat: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n solarUpdraftTowerSubMenu: '太陽能上升氣流塔',\n solarUpdraftTower: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n SolarUpdraftTowerSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n\n tutorialsSubMenu: '教程',\n\n solarEnergyScienceSubMenu: '太陽能科學',\n solarEnergyScienceTutorials: {\n SunAngles: '太陽相對於地面觀察者的角度',\n InsolationAndClimate: '太陽輻射和氣候的關係',\n SolarRadiationToBox: '一個長方體受到的太陽能輻射分析',\n },\n\n buildingScienceSubMenu: '建築科學',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: '房屋的熱學封套和圍護封套',\n EffectOfSizeOnBuildingEnergy: '房屋大小對能耗的影響',\n EffectOfOrientationOnBuildingEnergy: '房屋方位對能耗的影響',\n EffectOfInsulationOnBuildingEnergy: '房屋隔熱對能耗的影響',\n EffectOfRoofColorOnBuildingEnergy: '屋頂顏色對建築物能耗的影響',\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋簷延伸長度對建築物能耗的影響',\n EffectOfWindowSHGCOnBuildingEnergy: '窗戶太陽能輸入對房屋能耗的影響',\n EffectOfThermostatSetpointOnBuildingEnergy: '恆溫器設定值對房屋能耗的影響',\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板對房屋能耗的影響',\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度對房屋能耗的影響',\n EffectOfTreesOnBuildingEnergy: '樹蔭對房屋能耗的影響',\n },\n\n buildingDesignSubMenu: '建築設計',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: '有棚頂窗的科德角風格的住宅',\n MansardRoofWithDormers: '有天窗的折線屋頂',\n GableRoofVsHipRoof: '雙坡屋頂和四坡屋顶的對比',\n ColonialVsSaltbox: '殖民地風格和鹽盒風格的對比',\n GambrelRoofVsMansardRoof: '复斜屋顶和折線屋頂的對比',\n CombinationRoofVsBonnetRoof: '組合屋頂和帽簷屋頂的對比',\n DutchGableRoof: '荷蘭雙坡屋頂',\n GableAndValleyRoof: '坡谷屋頂',\n ClerestoryRoof: '天窗屋頂',\n MonitorRoof: '採光屋頂',\n AFrameHouse: 'A字形房子',\n HalfTimberedHouse: '半木骨架房子',\n AllBasicRoofTypes: '所有的基本屋頂類型',\n },\n\n photovoltaicSolarPowerSubMenu: '光伏發電',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: '光伏板傾斜角對發電量的影響',\n EffectOfAzimuthOfSolarPanel: '光伏板方位角對發電量的影響',\n SolarPanelTypes: '光伏板類型',\n VerticalBifacialSolarPanels: '豎直的雙面光伏板',\n CompareMonofacialAndBifacialSolarPanels: '單面光伏板和雙面光伏板的對比',\n SolarTrackers: '自動追日器',\n CoveringGroundWithSolarPanels: '為什麼我們不簡單地用光伏板覆蓋地面',\n InterRowSpacingOfSolarPanelArray: '光伏板陣列行間距對發電量的影響',\n EffectOfOrientationOfSolarPanels: '光伏板排列方向對發電量的影響',\n SolarPanelArrayAutomaticLayout: '光伏板自動排列',\n },\n\n concentratedSolarPowerSubMenu: '光熱發電',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: '拋物線槽方位角對發電量的影響',\n EffectOfLatusRectumOfParabolicTrough: '拋物線槽通徑對發電量的影響',\n FocusSunlightWithParabolicDish: '用拋物線碟聚焦阳光',\n LinearFresnelReflectors: '用直線式菲涅爾反射鏡聚焦阳光',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸熱管的安装高度對直線式菲涅爾反射鏡發電量的影響',\n EffectOfAzimuthOfLinearFresnelReflectors: '直線式菲涅爾反射鏡方位角對發電量的影響',\n LinearFresnelReflectorsWithTwoAbsorbers: '配備兩個吸收管的直線式菲涅爾反射鏡陣列',\n CosineEfficiencyOfHeliostats: '定日鏡的餘弦效率',\n ShadowingAndBlockingOfHeliostats: '定日鏡的陰影和遮擋',\n EffectSolarPowerTowerHeight: '吸收塔高度對發電量的影響',\n SolarPowerTower: '塔式光熱發電站',\n },\n\n otherTypesOfSolarPowerSubMenu: '其它類型的太陽能發電',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: '太陽能上升氣流塔',\n },\n\n generativeDesignSubMenu: '生成式設計',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: '單面光伏板陣列的傾斜角',\n BifacialSolarPanelArrayTiltAngle: '雙面光伏板陣列的傾斜角',\n OutputOfSolarPanelArrayInDifferentPlaces: '一個光伏板陣列在不同地區的產出',\n SimpleSolarFarmParetoFront: '簡單太陽能農場設計的帕累托前沿',\n },\n\n examplesSubMenu: '例子',\n\n solarEnergySubMenu: '太陽能',\n solarEnergyExamples: {\n SunBeamAndHeliodon: '太陽光束和日影儀',\n RooftopSolarPanels: '屋頂光伏板',\n NevadaSolarOneParabolicTroughArray: '內華達州太陽能一號的拋物線槽陣列',\n TooeleParabolicDishArray: '猶他州圖埃勒的拋物線碟陣列',\n PS10SolarPowerTower: '西班牙塞維利亞的PS10太陽能發電塔',\n TucsonLinearFresnelReflectors: '亞利桑那州圖森的直線式菲涅爾反射鏡陣列',\n SolarCanopyFormFactors: '太陽能天篷外形設計',\n SolarCanopyOverBleachers: '看台太陽能天篷',\n SolarCanopyOverGarage: '車庫太陽能天篷',\n SolarBusStop: '太陽能候車亭',\n SolarFacadeTesla: '特斯拉光伏牆',\n BuildingIntegratedPhotovoltaics: '建築整合光伏',\n Floatovoltaics: '浮動光伏',\n Agrivoltaics: '農業光伏',\n VegetativeBuffer: '太陽能農場绿化带',\n RainbowSwashSolarFarmBostonMA: '馬薩諸塞州波士頓彩虹激流旁邊的光伏板陣列',\n MickeyMouseSolarFarmOrlandoFL: '佛羅里達州奧蘭多的米老鼠形狀光伏板陣列',\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亞州貝克斯菲爾德灌溉渠上假想的光伏板陣列',\n SolarNoiseBarrierLexingtonMA: '馬薩諸塞州列剋星敦高速公路噪音牆上假想的光伏板',\n HSATSolarTrackersRaleighNC: '北卡羅來納州羅利的一個水平方向單軸旋轉追日光伏板陣列(HSAT)',\n AADATSolarTrackersLancasterCA: '加利福尼亞州蘭開斯特的一個雙軸旋轉追日光伏板陣列(AADAT)',\n SolarTrackersInRealWorld: '模擬',\n SolarUpdraftTowerInCity: '太陽能上升氣流塔在城市中的應用',\n },\n\n builtEnvironmentSubMenu: '建造環境',\n residentialBuildingsSubMenu: '住宅建築',\n residentialBuildingExamples: {\n ColonialHouse: '殖民地風格的住宅',\n DutchColonialHouse: '荷蘭殖民地風格的住宅',\n TShapedHouse: 'T字型房子',\n CapeCodHouseWithGarage: '有車庫的科德角風格的住宅',\n Solarium: '有日光浴室的房子',\n Church1: '教堂例一',\n Cathedral1: '主教座堂例一',\n Cathedral2: '主教座堂例二',\n Mosque1: '清真寺例一',\n AdobeTaosHouse: '陶斯土坯房',\n RanchHouse: '牧場風格的住宅',\n BonnetHouse: '有帽簷屋頂的住宅',\n BarnStyleHouse: '穀倉式風格的住宅',\n ModernHouse: '現代風格的住宅',\n ButterflyRoofHouse: '蝴蝶型屋頂的住宅',\n },\n commercialBuildingsSubMenu: '商用建築',\n commercialBuildingExamples: {\n WhiteHouse: '白宫',\n BilimMersinTurkiye: '土耳其梅爾辛科學教育中心',\n SpanishStyleHotel: '西班牙風格旅館',\n ApartmentBuilding: '公寓樓',\n OfficeBuilding: '寫字樓',\n Hotel: '旅館',\n },\n buildingComplexesSubMenu: '建築群',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯靈頓高中',\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒羅阿帕奇學校',\n },\n urbanPlanningSubMenu: '城市規劃',\n urbanPlanningExamples: {\n Heatmap1: '熱圖例一',\n },\n otherBuildingsSubMenu: '其它建築',\n otherBuildingExamples: {\n Greenhouse: '溫室',\n Pavilion: '公園的亭子',\n OctagonalPagoda: '八角塔',\n OceanFront: '海邊',\n EgyptianPyramids: '埃及金字塔',\n MayanPyramid: '瑪雅金字塔',\n SiOSePol: '三十三孔橋',\n StackedCuboids: '堆砌長方體',\n },\n\n artificialIntelligenceSubMenu: '人工智慧',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: '優化單排光伏板的傾斜角',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '優化多排光伏板的傾斜角',\n SolarFarmGenerativeDesign: '生成式設計太陽能農場',\n SolarFarmGenerativeDesignWithBlock: '生成式設計太陽能農場:周邊有建築物的情況',\n FitchburgSolarFarmGenerativeDesign: '生成式設計太陽能農場:真實世界案例',\n },\n\n languageSubMenu: '語言',\n publicSubMenu: '公共',\n ModelsGallery: '模型畫廊',\n ModelsMap: '模型地圖',\n AboutUs: '關於我們',\n },\n\n avatarMenu: {\n AccountSettings: '賬號設定',\n PrivacyInfo:\n '登錄需要採用您的谷歌ID建立或進入您的阿拉丁賬戶。\\n我們只儲存一個隨機的字符串作為您的ID。\\n任何關於您的可辨識的個人信息都沒有被收集。\\n詳情請參考我們的隱私聲明:\\nhttps://intofuture.org/aladdin-privacy.html',\n SignIn: '登錄',\n SignOut: '退出賬號',\n IfYouAreAStudent: '如果您是一個學生',\n },\n\n skyMenu: {\n Axes: '顯示坐標軸',\n Theme: '環境主題',\n ThemeDefault: '默認',\n ThemeDesert: '沙漠',\n ThemeDune: '沙丘',\n ThemeForest: '森林',\n ThemeGrassland: '草原',\n ThemeHill: '丘陵',\n ThemeLake: '湖泊',\n ThemeMountain: '山脈',\n ThemeRural: '田園',\n SunlightAttenuationCoefficientInAir: '陽光在空氣中傳播的衰減係數',\n ConvectiveCoefficientOfAir: '空氣對流傳熱係數',\n HighestTemperatureTimeInMinutes: '最高氣溫時間(分鐘)',\n SelectSunAnglesToShow: '選擇太陽角度顯示',\n ShowAzimuthAngle: '顯示方位角',\n ShowElevationAngle: '顯示高度角',\n ShowZenithAngle: '顯示天頂角',\n DirectLightBrightnessAtNoon: '正午直射光照度',\n AmbientLightBrightnessAtNoon: '正午環境光照度',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: '月份輻射度損失比',\n Vegetation: '植被',\n LeafOutDay: '樹葉長出的日子',\n LeafOffDay: '樹葉脫落的日子',\n Albedo: '反照率',\n ImageOnGround: '地面顯示圖像',\n WaterSurface: '水面',\n RemoveAllUnlockedTrees: '刪除所有非固定的樹木',\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\n RemoveAllUnlockedCuboids: '删除所有非固定的長方體',\n DoYouReallyWantToRemoveAllPeople: '你確定刪除所有非固定的人物嗎',\n DoYouReallyWantToRemoveAllTrees: '你確定刪除所有非固定的樹木嗎',\n DoYouReallyWantToRemoveAllFlowers: '你確定刪除所有非固定的花草嗎',\n DoYouReallyWantToRemoveAllSolarPanels: '你確定刪除所有非固定的光伏板嗎',\n DoYouReallyWantToRemoveAllFoundations: '你確定刪除所有非固定的地基嗎',\n DoYouReallyWantToRemoveAllCuboids: '你確定刪除所有非固定的長方體嗎',\n LockAllElements: '固定所有的部件',\n UnlockAllElements: '解除所有的固定',\n },\n\n labelSubMenu: {\n Label: '標籤',\n LabelText: '標籤的内容',\n LabelHeight: '標籤的高度',\n LabelSize: '標籤的大小',\n LabelFontSize: '字體的大小',\n LabelColor: '標籤的顏色',\n KeepShowingLabel: '顯示標籤',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: '刪除此地基上所有非固定的光伏板',\n RemoveAllUnlockedParabolicTroughs: '刪除此地基上所有非固定的拋物線槽',\n RemoveAllUnlockedParabolicDishes: '刪除此地基上所有非固定的拋物線碟',\n RemoveAllUnlockedFresnelReflectors: '刪除此地基上所有非固定的菲涅耳反射鏡',\n RemoveAllUnlockedHeliostats: '刪除此地基上所有非固定的定日鏡',\n RemoveAllUnlockedSensors: '刪除此地基上所有非固定的傳感器',\n RemoveAllUnlockedLights: '刪除此地基上所有非固定的電燈',\n RemoveAllUnlockedWalls: '刪除此地基上所有非固定的牆',\n RemoveAllUnlockedWindows: '刪除此地基上所有非固定的窗戶',\n RemoveAllUnlockedDoors: '刪除此地基上所有非固定的門',\n RemoveAllUnlockedPolygons: '刪除此地基上所有非固定的多邊形',\n RemoveAllUnlockedHumans: '刪除此地基上所有非固定的人物',\n RemoveAllUnlockedTrees: '刪除此地基上所有非固定的樹木',\n RemoveAllUnlockedFlowers: '刪除此地基上所有非固定的花草',\n Racks: '支架',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n SolarPanels: '光伏板',\n SolarPanelArray: '光伏板陣列',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你確定刪除此地基上所有非固定的光伏板嗎',\n ParabolicTroughs: '拋物線槽',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你確定刪除此地基上所有非固定的拋物線槽嗎',\n ParabolicDishes: '拋物線碟',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你確定刪除此地基上所有非固定的拋物線碟嗎',\n FresnelReflectors: '菲涅耳反射鏡',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你確定刪除此地基上所有非固定的菲涅耳反射鏡嗎',\n Heliostats: '定日鏡',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你確定刪除此地基上所有非固定的定日鏡嗎',\n Sensors: '傳感器',\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你確定刪除此地基上所有非固定的傳感器嗎',\n Lights: '電燈',\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你確定刪除此地基上所有非固定的電燈嗎',\n Walls: '牆',\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你確定刪除此地基上所有非固定的牆嗎',\n Windows: '窗戶',\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你確定刪除此地基上所有非固定的窗戶嗎',\n Doors: '門',\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你確定刪除此地基上所有非固定的門嗎',\n Polygons: '多邊形',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你確定刪除此地基上所有非固定的多邊形嗎',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你確定刪除此地基上所有非固定的人物嗎',\n Trees: '樹木',\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你確定刪除此地基上所有非固定的樹木嗎',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你確定刪除此地基上所有非固定的花草嗎',\n OnlyThisFoundation: '只這塊地基',\n AllConnectedFoundations: '所有相連的地基',\n AllFoundations: '所有的地基',\n AddPolygon: '添加多邊形',\n SolarStructure: '太陽能構型',\n GroupMaster: '主地基',\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\n GroundFloorRValue: '建築物地板的R值',\n OnlyThisGroundFloor: '只這個建築物的地板',\n AllGroundFloors: '所有建築物的地板',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: '和定日鏡配套的吸收塔',\n ReceiverTowerPhysicalProperties: '太陽能吸收塔的物理性質',\n ReceiverTowerHeight: '太陽能吸收塔的高度',\n ReceiverTowerRadius: '太陽能吸收塔的半徑',\n ReceiverAbsorptance: '太陽能吸收器的吸收率',\n ReceiverOpticalEfficiency: '太陽能吸收器的光效率',\n ReceiverThermalEfficiency: '太陽能吸收器的熱效率',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: '和菲涅爾反射鏡配套的吸收管',\n AbsorberPipePhysicalProperties: '太陽能吸收管的物理性質',\n AbsorberHeight: '太陽能吸收管的安装高度',\n AbsorberApertureWidth: '太陽能吸收管的孔徑',\n AbsorberPipePoleNumber: '太陽能吸收管的支柱數量',\n AbsorberAbsorptance: '太陽能吸收管的吸收率',\n AbsorberOpticalEfficiency: '太陽能吸收管的光效率',\n AbsorberThermalEfficiency: '太陽能吸收管的熱效率',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: '太陽能上升氣流塔',\n SolarUpdraftTowerPhysicalProperties: '太陽能上升氣流塔的物理性質',\n SolarUpdraftTowerChimneyHeight: '太陽能上升氣流塔煙囪的高度',\n SolarUpdraftTowerChimneyRadius: '太陽能上升氣流塔煙囪的半徑',\n SolarUpdraftTowerCollectorHeight: '太陽能上升氣流塔集熱棚的高度',\n SolarUpdraftTowerCollectorRadius: '太陽能上升氣流塔集熱棚的半徑',\n SolarUpdraftTowerCollectorTransmissivity: '太陽能上升氣流塔集熱棚的透射率',\n SolarUpdraftTowerCollectorEmissivity: '太陽能上升氣流塔集熱棚的發射率',\n SolarUpdraftTowerDischargeCoefficient: '太陽能上升氣流塔的流量係數',\n SolarUpdraftTowerTurbineEfficiency: '太陽能上升氣流塔的渦輪機效率',\n },\n\n cuboidMenu: {\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n RemoveAllUnlockedSolarPanels: '刪除此長方體表面上所有非固定的光伏板',\n RemoveAllUnlockedSensors: '刪除此長方體表面上所有非固定的傳感器',\n RemoveAllUnlockedPolygons: '刪除此長方體表面上所有非固定的多邊形',\n RemoveAllUnlockedHumans: '刪除此長方體表面上所有非固定的人物',\n RemoveAllUnlockedTrees: '刪除此長方體表面上所有非固定的樹木',\n RemoveAllUnlockedFlowers: '刪除此長方體表面上所有非固定的花草',\n Racks: '支架',\n SolarPanels: '光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你確定刪除此長方體表面上所有非固定的光伏板嗎',\n Sensors: '傳感器',\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你確定刪除此長方體表面上所有非固定的傳感器嗎',\n Polygons: '多邊形',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你確定刪除此長方體表面上所有非固定的多邊形嗎',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你確定刪除此長方體表面上所有非固定的人物嗎',\n Trees: '樹木',\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你確定刪除此長方體表面上所有非固定的樹木嗎',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你確定刪除此長方體表面上所有非固定的花草嗎',\n OnlyThisCuboid: '只這個長方體',\n AllCuboidsOnSameSurface: '同一表面上所有的長方體',\n AllCuboidsAboveSameBase: '同一地基上所有的長方體',\n AllCuboids: '所有的長方體',\n OnlyThisSide: '只這個表面',\n AllSidesOfThisCuboid: '這個長方體所有的側面',\n AllSidesOfAllCuboids: '所有的長方體所有的側面',\n AddPolygon: '添加多邊形',\n Stackable: '可堆砌',\n GroupMaster: '主長方體',\n },\n\n polygonMenu: {\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n TextBox: '文字框',\n FontOutlineColor: '字體輪廓顏色',\n FontOutlineWidth: '字體輪廓線寬',\n FontStrokeColor: '字體描邊顏色',\n FontStrokeWidth: '字體描邊線寬',\n NoOutline: '無輪廓線',\n Shiny: '光澤',\n Filled: '填充',\n FillTexture: '填充材質',\n FillColor: '填充顏色',\n Opacity: '遮光度',\n LineColor: '線條顏色',\n LineWidth: '線條寬度',\n LineStyle: '線條樣式',\n SolidLine: '實線',\n DashedLine: '虛線',\n DottedLine: '點線',\n InsertVertexBeforeIndex: '前面插入頂點',\n InsertVertexAfterIndex: '後面插入頂點',\n DeleteVertex: '移除頂點',\n OnlyThisPolygon: '只這個多邊形',\n AllPolygonsOnSurface: '同一表面上所有的多邊形',\n AllPolygonsAboveFoundation: '同一地基上所有的多邊形',\n AllPolygons: '所有的多邊形',\n Layout: '佈局',\n SolarPanelArrayLayout: '光伏板陣列佈局',\n SolarPanelArrayLayoutParametricDesign: '光伏板陣列佈局參數化設計',\n SolarPanelArrayLayoutGenerativeDesign: '光伏板陣列佈局生成式設計',\n SolarPanelArrayModel: '光伏板型號',\n SolarPanelArrayOrientation: '排列方向',\n SolarPanelArrayTiltAngle: '傾斜角度',\n SolarPanelArrayRowWidth: '行寬度',\n SolarPanelArrayInterRowSpacing: '行間距',\n SolarPanelArrayRowSpacing: '行間距',\n SolarPanelArrayRowAxis: '行軸方向',\n SolarPanelArrayLeftRightRowAxis: '左右方向(相對)',\n SolarPanelArrayUpDownRowAxis: '上下方向(相對)',\n SolarPanelArrayEastWestRowAxis: '東西方向(絕對)',\n SolarPanelArrayNorthSouthRowAxis: '南北方向(絕對)',\n SolarPanelArrayMargin: '邊緣餘地',\n SolarPanelArrayPoleHeight: '支架高度',\n SolarPanelArrayPoleSpacing: '支柱間隔',\n SolarPanelArrayTotalYearlyCost: '全年總成本',\n SolarPanelArrayTotalYearlyRevenue: '全年總收入',\n SolarPanelArrayTotalYearlyYield: '全年總發電量',\n SolarPanelArrayMeanYearlyYield: '平均年發電量',\n SolarPanelArrayYearlyProfit: '全年利潤',\n LayoutNotAcceptedCheckYourParameters: '恕不能採用此佈局。請檢查您的參數設置。',\n },\n\n optimizationMenu: {\n Optimization: '優化',\n Parameters: '參數',\n Variables: '變量',\n Constants: '常量',\n GeneticAlgorithm: '遺傳算法',\n GeneticAlgorithmSettings: '遺傳算法設定',\n ParticleSwarmOptimization: '粒子群優化',\n ParticleSwarmOptimizationSettings: '粒子群優化設定',\n SolarPanelTiltAngleOptimization: '光伏板傾斜角度優化',\n SolarPanelArrayLayout: '光伏板陣列佈局',\n Generation: '世代',\n Gene: '基因',\n NormalizedVariables: '標準化變量',\n Objective: '目標函數',\n ObjectiveFunctionDailyTotalYield: '當日總產出',\n ObjectiveFunctionYearlyTotalYield: '全年總產出',\n ObjectiveFunctionDailyMeanYield: '當日平均產出',\n ObjectiveFunctionYearlyMeanYield: '全年平均產出',\n ObjectiveFunctionDailyProfit: '當日利潤',\n ObjectiveFunctionYearlyProfit: '全年利潤',\n GeneticAlgorithmSelectionMethod: '遺傳算法選擇方法',\n RouletteWheel: '輪盤制',\n Tournament: '淘汰制',\n SearchMethod: '搜索方法',\n GlobalSearchUniformSelection: '全局搜索均勻取樣',\n LocalSearchRandomOptimization: '局部搜索隨機優化',\n PopulationSize: '種群個體數目',\n MaximumGenerations: '最大世代數目',\n SelectionRate: '選擇概率',\n CrossoverRate: '交配概率',\n MutationRate: '突變概率',\n Step: '步數',\n SwarmSize: '粒子數目',\n MaximumSteps: '最大步數',\n MaximumVelocity: '最大速度',\n InertiaWeight: '慣性權重',\n CognitiveCoefficient: '認知係數',\n SocialCoefficient: '社會係數',\n ConvergenceThreshold: '終止條件的收斂閾值',\n LocalSearchRadius: '局部搜索的半徑',\n RowsPerRackRange: '單個支架上光伏板行數的變化範圍',\n TiltAngleRange: '光伏板傾斜角度的變化範圍',\n InterRowSpacingRange: '光伏板陣列行間距的變化範圍',\n ClickTargetPolygonToActivate: '點擊目標多邊形激活',\n ClickTargetFoundationToActivate: '點擊目標地基激活',\n },\n\n treeMenu: {\n ShowModel: '顯示近似模型',\n Flip: '翻轉',\n Type: '樹種',\n Spread: '樹冠直徑',\n },\n\n flowerMenu: {\n Flip: '翻轉',\n Type: '品種',\n Spread: '直徑',\n },\n\n peopleMenu: {\n ChangePerson: '改變人物',\n Flip: '轉身',\n Observer: '觀察者',\n ViewFromThisPerson: '視角移到此人位置',\n },\n\n lightMenu: {\n Color: '顏色',\n Intensity: '亮度',\n Decay: '衰减',\n MaximumDistance: '最大距離',\n Inside: '内部',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: '相對方位角',\n Pole: '支柱',\n PoleHeight: '支柱高度',\n PoleRadius: '支柱半徑',\n ExtraPoleHeight: '額外的支柱高度',\n ExtraPoleHeightInAdditionToHalfWidth: '寬度一半額外的支柱高度',\n DrawSunBeam: '顯示光束',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: '反射器鏡面反射率',\n ReceiverAbsorptance: '接收器吸收率',\n ReflectorOpticalEfficiency: '反射器光效率',\n ReceiverThermalEfficiency: '接收器熱效率',\n },\n\n solarPanelMenu: {\n InverterEfficiency: '逆變器效率',\n InverterEfficiencyExplained: '直流電轉換為交流電的效率。',\n DcToAcSizeRatio: '直流-交流容量比例',\n DcToAcSizeRatioExplained: '直流電容量和交流電容量的比例。',\n ChangePvModel: '改變光伏板型號',\n Orientation: '排列方向',\n Portrait: '縱向',\n Landscape: '橫向',\n FrameColor: '框架顏色',\n Panels: '塊',\n PanelsWide: '塊光伏板寬',\n PanelsLong: '塊光伏板長',\n TiltAngle: '傾斜角度',\n SouthFacingIsPositive: '朝南為正',\n Tracker: '追日系統',\n SolarTrackerFollowsSun: '追日系統提高光伏板產出。',\n PoleSpacing: '支柱間隔',\n NoTracker: '無追日系統',\n HorizontalSingleAxisTracker: '水平單軸追日系統',\n VerticalSingleAxisTracker: '豎直單軸追日系統',\n AltazimuthDualAxisTracker: '地平雙軸追日系統',\n OnlyThisSolarPanel: '只這個光伏板',\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\n AllSolarPanels: '所有的光伏板',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: '光伏板型號性能',\n Model: '型號',\n PanelSize: '尺寸',\n Cells: '電池組',\n CellType: '光伏電池類型',\n Monocrystalline: '單晶矽',\n Polycrystalline: '多晶矽',\n ThinFilm: '薄膜',\n Bifacial: '雙面',\n BifacialityFactor: '雙面性因子',\n Black: '黑色',\n Blue: '藍色',\n ShadeTolerance: '陰影耐受度',\n SolarCellEfficiency: '光伏電池效率',\n NominalOperatingCellTemperature: '名義電池運行溫度',\n TemperatureCoefficientOfPmax: 'Pmax溫度係數',\n },\n\n parabolicTroughMenu: {\n ModuleLength: '模塊長度',\n Modules: '模塊',\n ModulesLong: '模塊長',\n LatusRectum: '通徑',\n OnlyThisParabolicTrough: '只這個拋物線槽',\n AllParabolicTroughsAboveFoundation: '同一地基上所有的拋物線槽',\n AllParabolicTroughs: '所有的拋物線槽',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: '吸收管',\n SelectAbsorberToReflectSunlightTo: '選擇陽光反射到的吸收管',\n ModuleLength: '模塊長度',\n Modules: '模塊',\n ModulesLong: '模塊長',\n OnlyThisFresnelReflector: '只這個菲涅耳反射鏡',\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射鏡',\n AllFresnelReflectors: '所有的菲涅耳反射鏡',\n },\n\n heliostatMenu: {\n Tower: '吸收塔',\n SelectTowerToReflectSunlightTo: '選擇陽光反射到的吸收塔',\n OnlyThisHeliostat: '只這個定日鏡',\n AllHeliostatsAboveFoundation: '同一地基上所有的定日鏡',\n AllHeliostats: '所有的定日鏡',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: '接收器結構',\n CentralPole: '中心直柱',\n CentralPoleWithTripod: '三腳架和中心直柱',\n Quadrupod: '四脚架',\n RimDiameter: '外圈直徑',\n LatusRectum: '通徑',\n ExtraPoleHeightInAdditionToRadius: '半徑之外額外的支架高度',\n OnlyThisParabolicDish: '只這個拋物線碟',\n AllParabolicDishesAboveFoundation: '同一地基上所有的拋物線碟',\n AllParabolicDishes: '所有的拋物線碟',\n },\n\n wallMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n SizeOfWall: '牆的尺寸',\n OnlyThisWall: '只這堵牆',\n AllConnectedWalls: '所有連接的牆',\n AllWallsAboveFoundation: '同一地基上所有的牆',\n AllWalls: '所有的牆',\n Windows: '窗戶',\n LockAllWindows: '固定所有的窗戶',\n UnlockAllWindows: '解除所有的窗戶固定',\n RemoveAllUnlockedWindows: '刪除這堵牆上所有非固定的窗戶',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你確定刪除這堵牆上所有非固定的窗戶嗎',\n Doors: '門',\n RemoveAllUnlockedDoors: '刪除這堵牆上所有非固定的門',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你確定刪除這堵牆上所有非固定的門嗎',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '刪除這堵牆上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你確定刪除這堵牆上所有非固定的光伏板嗎',\n Sensors: '傳感器',\n LockAllSensors: '固定所有的傳感器',\n UnlockAllSensors: '解除所有的傳感器固定',\n RemoveAllUnlockedSensors: '刪除這堵牆上所有非固定的傳感器',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你確定刪除這堵牆上所有非固定的傳感器嗎',\n Lights: '電燈',\n RemoveAllUnlockedLights: '刪除這堵牆上所有非固定的電燈',\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你確定刪除這堵牆上所有非固定的電燈嗎',\n LockAllPolygons: '固定這堵牆上所有的多邊形',\n UnlockAllPolygons: '解除這堵牆上所有的多邊形固定',\n RemoveAllUnlockedPolygons: '刪除這堵牆上所有非固定的多邊形',\n WallStructure: '牆結構',\n DefaultStructure: '默認',\n StudStructure: '牆柱',\n PillarStructure: '圓柱',\n Opacity: '遮光度',\n StructureSpacing: '結構間距',\n StructureWidth: '結構寬度',\n StructureThickness: '結構厚度',\n StructureColor: '結構颜色',\n Color: '牆体颜色',\n Height: '高度',\n Thickness: '厚度',\n Texture: '材質',\n AllLightsOnWallInside: '所有電燈在牆內',\n AllLightsOnWallOutside: '所有電燈在牆外',\n Fill: '填充',\n Full: '全部',\n Partial: '部分',\n Empty: '空白',\n OpenToOutside: '對外面開放',\n EavesLength: '屋簷延伸長度',\n Parapet: '女牆',\n ParapetColor: '女牆颜色',\n ParapetTexture: '女牆材質',\n ParapetHeight: '女牆高度',\n CopingsHeight: '頂蓋高度',\n CopingsWidth: '頂蓋寬度',\n },\n\n windowMenu: {\n OnlyThisWindow: '只這個窗戶',\n AllWindowsOnSurface: '同一表面上所有的窗戶',\n AllWindowsAboveFoundation: '同一地基上所有的窗戶',\n AllWindows: '所有的窗戶',\n Width: '寬度',\n Height: '高度',\n Mullion: '直櫺',\n MullionWidth: '直櫺寬度',\n MullionSpacing: '直櫺間距',\n MullionColor: '直櫺颜色',\n Tint: '著色',\n Opacity: '不透明度',\n SolarHeatGainCoefficient: '太陽輻射熱獲取係數(SHGC) = 1 - 不透明度',\n Shutter: '百葉窗',\n LeftShutter: '左側百葉窗',\n RightShutter: '右側百葉窗',\n BothShutters: '兩側百葉窗',\n ShutterWidth: '相對寬度',\n ShutterColor: '百葉窗顏色',\n Frame: '邊框',\n FrameWidth: '邊框寬度',\n SillWidth: '窗台寬度',\n Color: '邊框顔色',\n WindowType: '窗戶種類',\n Default: '默認',\n Arched: '拱形',\n Polygonal: '多邊形',\n Interior: '内窗',\n Empty: '空白',\n },\n\n roofMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n OnlyThisRoof: '只這個屋顶',\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\n AllRoofs: '所有的屋顶',\n OnlyThisCeiling: '只這個天花板',\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\n AllCeilings: '所有的天花板',\n EavesOverhangLength: '屋簷延伸長度',\n RafterSpacing: '屋椽間距',\n RafterWidth: '屋椽寬度',\n RafterThickness: '屋椽厚度',\n RafterColor: '屋椽颜色',\n RoofColor: '屋顶颜色',\n RoofSideColor: '屋顶側面颜色',\n GlassTint: '玻璃顏色',\n Opacity: '遮光度',\n RoofStructure: '屋頂結構',\n DefaultStructure: '默認',\n RafterStructure: '屋椽',\n GlassStructure: '玻璃',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '刪除這個屋顶上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你確定刪除這個屋顶上所有非固定的光伏板嗎',\n Windows: '天窗',\n LockAllWindows: '固定所有的天窗',\n UnlockAllWindows: '解除所有的天窗固定',\n RemoveAllUnlockedWindows: '刪除這個屋顶上所有非固定的天窗',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你確定刪除這個屋顶上所有非固定的天窗嗎',\n Sensors: '傳感器',\n LockAllSensors: '固定所有的傳感器',\n UnlockAllSensors: '解除所有的傳感器固定',\n RemoveAllUnlockedSensors: '刪除這個屋顶上所有非固定的傳感器',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你確定刪除這個屋顶上所有非固定的傳感器嗎',\n Lights: '電燈',\n RemoveAllUnlockedLights: '刪除這個屋顶上所有非固定的電燈',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你確定刪除這個屋顶上所有非固定的電燈嗎',\n AllLightsOnRoofInside: '所有電燈在屋頂內',\n AllLightsOnRoofOutside: '所有電燈在屋頂外',\n Rise: '相對高度',\n Ceiling: '天花板',\n RoofRValue: '屋顶R值',\n CeilingRValue: '天花板R值',\n },\n\n doorMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n Texture11: '十一號材質',\n Texture12: '十二號材質',\n Texture13: '十三號材質',\n Texture14: '十四號材質',\n Texture15: '十五號材質',\n Texture16: '十六號材質',\n Texture17: '十七號材質',\n OnlyThisDoor: '只這個門',\n AllDoorsOnWall: '同一面牆上所有的門',\n AllDoorsAboveFoundation: '同一地基上所有的門',\n AllDoors: '所有的門',\n DoorType: '門種類',\n Default: '默認',\n Arched: '拱形',\n Filled: '填充',\n FrameColor: '門框顏色',\n Interior: '內門',\n },\n\n siteInfoPanel: {\n High: '最高溫度',\n Low: '最低温度',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: '選中的定日鏡總數',\n NumberOfSelectedSolarPanels: '選中的光伏板總數',\n ElectricityGeneratedDailyBySolarPanels: '這些光伏板的日發電量',\n SceneDiameter: '場景直徑',\n BuildingArea: '建築面積',\n },\n\n visualizationControlPanel: {\n ColorContrast: '熱圖顏色對比度',\n FluxScale: '熱通量長度',\n ClickUpOrDownArrowButtonsToChange: '點擊上下箭頭改變參數',\n },\n\n instructionPanel: {\n Rotate: '旋轉',\n DragMouse: '拖動滑鼠',\n Zoom: '缩放',\n MouseWheelOrKeys: '滑鼠滾輪或者Ctrl+[和Ctrl+]',\n MouseWheelOrKeysMac: '滑鼠滾輪或者⌘+[和⌘+]',\n Pan: '平移',\n HoldCtrlDragMouse: '按下Ctrl鍵並拖動滑鼠',\n HoldMetaDragMouse: '按下⌘鍵並拖動滑鼠',\n Enter2DMode: '進入二維模式',\n Exit2DMode: '退出二維模式',\n EnableNavigation: '進入導航模式',\n DisableNavigation: '退出導航模式',\n Move: '移動',\n MoveInstruction: '按下W/A/S/D/Z/X鍵',\n Turn: '拐彎',\n TurnInstruction: '按下方向鍵',\n ResetView: '重置視角',\n AutoRotate: '自動旋轉',\n StartOrStop: '按F4鍵啟動或停止',\n },\n\n mapPanel: {\n ImageOnGround: '地面顯示圖像',\n WeatherStations: '氣象站',\n WeatherStationsNote: '關閉此選項以提高地圖速度',\n Coordinates: '經緯度坐標',\n Zoom: '放大程度',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: '光伏板對觀察者的可見度',\n Observer: '觀察者',\n VantagePoint: '觀察位置',\n ItemizedVisibilityByFields: '每個場的可見度',\n TotalVisibility: '總可見度',\n },\n\n sensorPanel: {\n LightSensor: '光傳感器',\n WeatherDataFrom: '氣象數據來自',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: '建築物日能耗',\n YearlyBuildingEnergy: '建築物年能耗',\n Heater: '暖氣',\n AC: '空調',\n SolarPanel: '光伏',\n Net: '淨能耗',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: '光伏日發電量',\n SolarPanelYearlyYield: '光伏年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualSolarPanels: '顯示每行光伏板單獨發電量',\n Profit: '利潤',\n TotalCost: '總成本',\n TotalRevenue: '總收入',\n TotalYield: '總發電量',\n MeanYield: '平均發電量',\n ModuleCount: '光伏板總數',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: '拋物線槽日發電量',\n ParabolicTroughYearlyYield: '拋物線槽年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualParabolicTroughs: '顯示每行拋物線槽單獨發電量',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: '拋物線碟日發電量',\n ParabolicDishYearlyYield: '拋物線碟年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualParabolicDishes: '顯示每個拋物線碟單獨發電量',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: '菲涅耳反射鏡日發電量',\n FresnelReflectorYearlyYield: '菲涅耳反射鏡年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualFresnelReflectors: '顯示每個菲涅耳反射鏡單獨發電量',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: '定日鏡日發電量',\n HeliostatYearlyYield: '定日鏡年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualHeliostats: '顯示每個定日鏡單獨發電量',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: '太陽能上升氣流塔日發電量',\n UpdraftTowerYearlyYield: '太陽能上升氣流塔年發電量',\n ChimneyAirTemperature: '煙囪空氣溫度',\n ChimneyWindSpeed: '煙囪風速',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualUpdraftTowers: '顯示每個太陽能上升氣流塔單獨發電量',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: '太陽和時間設置',\n SunAngles: '角度',\n TwentyFourHours: '24小時',\n },\n\n cloudFilePanel: {\n SearchByTitle: '按標題搜索',\n MyLikes: '我喜歡的模型',\n MyCloudFiles: '我的雲文件',\n GenerateLink: '生成鏈接',\n LinkGeneratedInClipBoard: '鏈接已經復製到剪貼板',\n DoYouReallyWantToDelete: '您確定刪除此文檔',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文檔已被分享或發布, 改名會使已有鏈接失效',\n },\n\n projectListPanel: {\n SearchByTitle: '按標題搜索',\n MyProjects: '我的項目',\n GenerateProjectLink: '生成項目鏈接',\n ProjectLinkGeneratedInClipBoard: '項目鏈接已經復製到剪貼板',\n DoYouReallyWantToDeleteProject: '您確定刪除項目',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此項目已被分享或發布, 改名會使已有鏈接失效',\n },\n\n projectPanel: {\n ProjectSettings: '項目設定',\n ThumbnailImageSize: '縮略圖大小',\n ProjectByOtherPeople: '別人的項目',\n Project: '項目',\n ProjectType: '類别',\n ProjectDescription: '描述',\n MakeDescriptionEditable: '編輯描述',\n MakeDescriptionNonEditable: '不編輯描述',\n DoubleClickToMakeDescriptionEditable: '雙擊此描述激活編輯功能',\n SolarPanelArray: '光伏板陣列設計',\n CurateCurrentDesign: '收藏當前設計',\n UpdateSelectedDesign: '更新選中設計',\n RemoveSelectedDesign: '刪除選中設計',\n ClickToFlipSortingOrder: '點擊逆轉排序方向',\n DesignNotShownInSolutionSpaceClickToShow: '此設計目前不顯示在設計空間內,點擊顯示',\n DesignShownInSolutionSpaceClickToHide: '此設計目前顯示在設計空間內,點擊隱藏',\n DistributionInSolutionSpace: '方案在設計空間裡的分佈',\n ChooseSolutionSpace: '選擇設計空間',\n ChooseDataColoring: '選擇數據著色',\n SameColorForAllDesigns: '所有設計一個顏色',\n OneColorForEachDesign: '每個設計一個顏色',\n SolutionSpaceScreenshot: '設計空間截圖',\n ScatteredPlotScreenshot: '散點圖截圖',\n SingleClickToSelectDoubleClickToOpen: '單擊選擇,雙擊打開。',\n SingleClickToDeselectDoubleClickToOpen: '單擊取消選擇,雙擊打開。',\n GenerateScatteredPlot: '生成散點圖',\n SelectXAxis: '選擇X軸',\n SelectYAxis: '選擇Y軸',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: '我的賬戶設定',\n MyID: '我的🆔',\n ClickToCopyMyID: '點擊此處拷貝我的ID',\n IDInClipBoard: '您現在可以粘貼ID了。',\n StoreMyNameInMyFilesWhenSaving: '保存文檔時籤上我的大名',\n DoYouReallyWantToShowYourNameInYourFiles: '您確定在您的文檔裡保存您的大名嗎?',\n SignFileDisclaimer: '如果您選擇保存,您的大名可能被所有打開您的文檔的人看到。',\n Likes: '點贊總數',\n AllPublished: '發佈總數',\n PublishedUnderAliases: '别名發佈',\n UserCount: '用戶總數',\n SchoolID: '學校編號',\n ClassID: '班級編號',\n },\n\n weatherPanel: {\n SunshineHours: '日照時間',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: '選擇氣溫模型',\n Sinusoidal: '正弦函數',\n },\n\n economicsPanel: {\n EconomicsParameters: '經濟學參數',\n ElectricitySellingPrice: '銷售電價',\n OperationalCostPerUnit: '單位運行成本',\n SellingPrice: '銷售電價',\n UnitCost: '單位成本',\n },\n\n navigationPanel: {\n NavigationParameters: '導航模式參數',\n MinimumMoveSpeed: '最小移動速度',\n MinimumTurnSpeed: '最小拐彎速度',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: '天空清晰度',\n ShowDaylightResults: '顯示日照時間結果',\n ShowSkyClearnessResults: '顯示天空清晰度結果',\n ShowAverageDailySolarRadiation: '顯示日平均輻射結果',\n },\n\n analysisManager: {\n NoSensorForCollectingData: '沒有傳感器收集數據。',\n NoSolarPanelForAnalysis: '沒有光伏板可以分析。',\n NoObserverForVisibilityAnalysis: '沒有找到可見度分析的觀察者。',\n NoWaterHeaterForAnalysis: '沒有太陽能熱水器可以分析。',\n NoParabolicDishForAnalysis: '沒有拋物線碟可以分析。',\n NoParabolicTroughForAnalysis: '沒有拋物線槽可以分析。',\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射鏡可以分析。',\n NoHeliostatForAnalysis: '沒有定日鏡可以分析。',\n NoSolarUpdraftTowerForAnalysis: '沒有太陽能上升氣流塔可以分析。',\n NoBuildingForAnalysis: '沒有建築物可以分析。',\n },\n\n toolbar: {\n CloudFile: '雲文檔',\n Select: '選擇',\n AddFoundation: '添加地基',\n AddWall: '添加牆體',\n AddWindow: '添加窗戶',\n AddDoor: '添加門',\n AddPyramidRoof: '添加金字塔屋頂',\n AddGableRoof: '添加雙坡屋頂',\n AddHipRoof: '添加四坡屋顶',\n AddGambrelRoof: '添加复斜屋顶',\n AddMansardRoof: '添加折線屋顶',\n AddCuboid: '添加長方體',\n AddSensor: '添加傳感器',\n AddSolarPanel: '添加光伏板',\n AddWaterHeater: '添加太陽能熱水器',\n AddParabolicDish: '添加拋物線碟',\n AddParabolicTrough: '添加拋物線槽',\n AddFresnelReflector: '添加菲涅耳反射鏡',\n AddHeliostat: '添加定日鏡',\n AddWindTurbine: '添加風力渦輪機',\n AddLight: '添加電燈',\n AddTree: '添加樹木',\n AddFlower: '添加花草',\n AddPeople: '添加人物',\n DoubleClickToLockThisModeForNextAction: '雙擊按鈕給下個動作鎖定此模式',\n ClickToUnlockThisModeForNextAction: '點擊按鈕讓動作完成即離開此模式',\n ManipulateGroup: '整體操作一個組',\n ClearScene: '清空場景',\n ShowSunAndTimeSettings: '顯示太陽和時間設置',\n SpatialAnalysisOfEnergy: '能量的空間分析',\n DoYouReallyWantToClearContent: '您確定清空場景嗎',\n ClickForMoreButtons: '點擊此處切換到更多的按鈕模式',\n SwitchToAddingFoundation: '切換到添加地基模式',\n SwitchToAddingCuboid: '切換到添加長方體模式',\n SwitchToAddingWall: '切換到添加牆體模式',\n SwitchToAddingWindow: '切換到添加窗戶模式',\n SwitchToAddingDoor: '切換到添加門模式',\n SwitchToAddingPyramidRoof: '切換到添加金字塔屋頂模式',\n SwitchToAddingGableRoof: '切換到添加雙坡屋頂模式',\n SwitchToAddingHipRoof: '切換到添加四坡屋頂模式',\n SwitchToAddingGambrelRoof: '切換到添加复斜屋頂模式',\n SwitchToAddingMansardRoof: '切換到添加折線屋頂模式',\n SwitchToAddingSolarPanel: '切換到添加光伏板模式',\n SwitchToAddingSensor: '切換到添加傳感器模式',\n SwitchToAddingWaterHeater: '切換到添加太陽能熱水器模式',\n SwitchToAddingParabolicDish: '切換到添加拋物線碟模式',\n SwitchToAddingParabolicTrough: '切換到添加拋物線槽模式',\n SwitchToAddingFresnelReflector: '切換到添加菲涅耳反射鏡模式',\n SwitchToAddingHeliostat: '切換到添加定日鏡模式',\n SwitchToAddingWindTurbine: '切換到添加風力渦輪機模式',\n SwitchToAddingLight: '切換到添加電燈模式',\n SwitchToAddingTree: '切換到添加樹木模式',\n SwitchToAddingFlower: '切換到添加花草模式',\n SwitchToAddingPeople: '切換到添加人物模式',\n },\n\n tooltip: {\n gotoIFI: '訪問未來智能研究所',\n visitAladdinHomePage: '訪問阿拉丁主頁',\n clickToOpenMenu: '點擊打開主菜單',\n clickToAccessCloudTools: '點擊打開雲菜單',\n },\n\n tree: {\n Apple: '蘋果樹',\n Birch: '白樺',\n Coconut: '椰子樹',\n Dogwood: '茱萸',\n Elm: '榆樹',\n FanPalm: '扇葉棕櫚',\n Linden: '菩提',\n Magnolia: '玉蘭',\n Maple: '楓樹',\n Oak: '橡樹',\n Pine: '松樹',\n Spruce: '雲杉',\n },\n\n flower: {\n Bellflower: '鈴蘭',\n Boxwood: '黃楊',\n CactusCombo1: '仙人掌組合一',\n CactusCombo2: '仙人掌組合二',\n CactusCombo3: '仙人掌組合三',\n CactusCombo4: '仙人掌組合四',\n Hibiscus: '木槿',\n Hosta: '玉簪',\n Hydrangea: '繡球花',\n Peony: '牡丹',\n RedRose: '紅玫瑰',\n Spirea: '繡線菊',\n Sunflower: '向日葵',\n TallBush: '高灌木',\n Tulip: '鬱金香',\n WhiteFlower: '白花',\n YellowFlower: '黄花',\n },\n\n people: {\n Jaah: '賈阿',\n Jack: '傑克',\n Jacob: '雅各布',\n Jacqueline: '杰奎琳',\n Jade: '美玉',\n Jamelia: '潔米莉雅',\n James: '詹姆斯',\n Jane: '簡',\n Jaya: '佳婭',\n Jaye: '傑伊',\n Jeanette: '珍妮特',\n Jedi: '傑迪',\n Jeff: '傑夫',\n Jena: '珍娜',\n Jennifer: '珍尼弗',\n Jess: '傑西',\n Jett: '傑特',\n Jill: '吉爾',\n Jiya: '吉娅',\n Joan: '瓊',\n Jocelyn: '喬斯林',\n Joel: '喬爾',\n Joey: '喬伊',\n John: '約翰',\n Jonathon: '喬納森',\n Jose: '何塞',\n Joseph: '約瑟夫',\n Joshua: '約書亞',\n Judd: '賈德',\n Judy: '朱蒂',\n Julia: '朱莉婭',\n Julio: '胡里奥',\n Jumapili: '祖瑪匹莉',\n June: '準衛',\n Juro: '朱諾',\n Justin: '賈斯汀',\n },\n\n compass: {\n N: '北',\n S: '南',\n W: '西',\n E: '東',\n },\n\n month: {\n January: '一月',\n February: '二月',\n March: '三月',\n April: '四月',\n May: '五月',\n June: '六月',\n July: '七月',\n August: '八月',\n September: '九月',\n October: '十月',\n November: '十一月',\n December: '十二月',\n },\n\n modelsMap: {\n SearchByPublisher: '按發布者搜索',\n SearchByLabel: '按標籤搜索',\n MyPublishedModels: '我發布的模型',\n TotalNumberOfUserPublishedModels: '用戶發布的模型總數',\n SortFromOldestToNewest: '從早到晚排序',\n SortFromNewestToOldest: '從晚到早排序',\n ModelsFoundOnThisSite: '個模型在此位置',\n ShowModelsPublishedByThisAuthor: '展示此用戶發布的模型',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_es = {\n translation: {\n name: {\n IFI: 'Instituto de inteligencia futura',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\n },\n\n cookie: {\n Statement: 'Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin',\n Accept: 'Aceptar',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Este producto esta hecho por',\n TermsOfService: 'Términos de servicio',\n PrivacyPolicy: 'Política de privacidad',\n Software: 'Programa',\n Content: 'Contenido',\n Research: 'Investigación',\n Support: 'Ayuda',\n Acknowledgment: 'Agradecimientos',\n FundingInformation:\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.',\n Contact: 'Para más información, por favor contacte con Charles Xie (charles@intofuture.org).',\n Translators: 'Translators',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'Todos los derechos reservados',\n MeterAbbreviation: 'm',\n Version: 'Versión',\n VersionInitial: 'V',\n Options: 'Opciones',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Número máximo',\n MinimumNumber: 'Minimum Number',\n MaximumValue: 'Maximum Value',\n MinimumValue: 'Minimum Value',\n Or: 'O',\n None: 'Ninguno',\n High: 'High',\n Partial: 'Partial',\n Teacher: 'Profesor',\n Class: 'Clase',\n Total: 'Total',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Rango',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Press',\n Open: 'Abrir',\n Save: 'Guardar',\n SaveAsImage: 'Guardar como imagen',\n SaveAsCsv: 'Save as CSV',\n Update: 'Actualizar',\n Paste: 'Pegar',\n Copy: 'Copiar',\n Cut: 'Cortar',\n Delete: 'Eliminar',\n Lock: 'Cerrar con llave',\n Translucent: 'Translucent',\n Color: 'Color',\n Texture: 'Textura',\n Size: 'Tamaño',\n Thickness: 'Grosor',\n Yes: 'Sí',\n No: 'No',\n OK: 'OK',\n Cancel: 'Cancelar',\n Apply: 'Aplicar',\n Close: 'Cerrar',\n ApplyTo: 'Aplicar a',\n Run: 'Run',\n Pause: 'Pause',\n Resume: 'Resume',\n Clear: 'Limpiar',\n Warning: 'Aviso',\n Caution: 'Caution',\n Reminder: 'Reminder',\n Length: 'Longitud',\n Width: 'Ancho',\n Height: 'Altura',\n Radius: 'Radius',\n Angle: 'Ángulo',\n Azimuth: 'Azimut',\n Coordinates: 'Coordinates',\n Weather: 'Tiempo',\n Show: 'Mostrar',\n Animate: 'Animar',\n Date: 'Fecha',\n Time: 'Tiempo',\n Title: 'Título',\n Owner: 'Propietario',\n Action: 'Acción',\n Rename: 'Renombrar',\n Location: 'Location',\n Latitude: 'Latitud',\n Month: 'Mes',\n Day: 'Día',\n Hour: 'Hora',\n Daylight: 'Luz solar',\n Radiation: 'Radiación',\n Temperature: 'Temperatura',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'O',\n Fixed: 'Fixed',\n Elements: 'Elements',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'Sin textura',\n FoundationElement: 'Bases',\n CuboidElement: 'Cuboide',\n PolygonElement: 'Polígon',\n SensorElement: 'Sensor',\n SolarPanelElement: 'Panel solar',\n WaterHeaterElement: 'Water Heater',\n ParabolicDishElement: 'Parabolic Dish',\n ParabolicTroughElement: 'Parabolic Trough',\n FresnelReflectorElement: 'Fresnel Reflector',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Bloqueado',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Cannot sign in',\n CannotSignOut: 'Cannot sign out',\n YourAccountWasCreated: 'Your account was created.',\n CannotCreateAccount: 'Cannot create an account',\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'The cloud file was not found',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Cannot open the cloud file',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\n CannotRenameCloudFile: 'Cannot rename the cloud file',\n DoYouWantToSaveChanges: '¿Quieres guardar los cambios?',\n NotApplicableToSelectedAction: 'No se aplica a la acción seleccionada',\n ThisElementIsLocked: 'Este elemento está bloqueado',\n ThisCannotBeUndone: 'Esto no se puede deshacer',\n AzimuthOfNorthIsZero: 'Azimut del norte es 0°',\n CounterclockwiseAzimuthIsPositive: 'Hacia la izquierda es positivo',\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\n CannotPasteOutsideBoundary: 'Cannot paste outside this surface.',\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\n CannotMoveObjectTooFar: 'Cannot move object too far.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Existing solar panels will be removed before applying the new layout.',\n DoYouWantToContinue: 'Do you want to continue?',\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\n ScreenshotSaved: 'A screenshot was saved.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simulation started.',\n SimulationCompleted: 'Simulation completed.',\n SimulationAborted: 'Simulation aborted.',\n SimulationPaused: 'Simulation paused.',\n CancelSimulation: 'Cancel simulation',\n PauseSimulation: 'Pause simulation',\n ResumeSimulation: 'Resume simulation',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evolution started.',\n EvolutionCompleted: 'Evolution completed.',\n EvolutionAborted: 'Evolution aborted.',\n EvolutionPaused: 'Evolution paused.',\n EncounterEvolutionError: 'Encountered an evolution error.',\n CancelEvolution: 'Cancel evolution',\n PauseEvolution: 'Pause evolution',\n ResumeEvolution: 'Resume evolution',\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\n ObjectiveFunctionTypeError:\n 'The current objective function is not supported by this operation. Please start from the menu.',\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analysis Options',\n option: {\n GridCellSize: 'Grid Cell Size',\n SamplingFrequency: 'Frecuencia de muestreo',\n TimesPerHour: 'Veces per hora',\n DaysPerYear: 'Days per Year',\n },\n mainMenu: 'Menu principal',\n cloudMenu: 'Menú en la nube',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'Archivo',\n file: {\n CreateNewFile: 'Crear nuevo archivo',\n OpenLocalFile: 'Abrir archivo local',\n SaveAsLocalFile: 'Guardar como archivo local',\n SavingAbortedMustHaveValidFileName: '!Error guardando! Debes tener un nombre de archivo válido',\n OpenCloudFile: 'Abrir archivo en la nube',\n SaveCloudFile: 'Guardar archivo en la nube',\n SaveAsCloudFile: 'Guardar como archivo en la nube',\n SavingAbortedMustHaveValidTitle: '!Error guardando! Debes tener un título válido para el archivo en la nube',\n ToSaveYourWorkPleaseSignIn: 'Para guardar tu trabajo, por favor regístrese.',\n TakeScreenshot: 'Hacer captura de pantalla',\n UseCloudFileName: 'Use Cloud File Name',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Editar',\n edit: {\n Undo: 'Deshacer',\n Redo: 'Repetir',\n },\n viewSubMenu: 'Vista',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: 'Vista 2D',\n ResetView: 'Resetear',\n ZoomIn: 'Acercar',\n ZoomOut: 'Alejar',\n AutoRotate: 'Auto rotación',\n ShowShadow: 'Mostrar sombra',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Translucent Floating Windows',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Información del sitio',\n DesignInformation: 'Información de diseño',\n Instruction: 'Instrucción',\n StickyNote: 'Nota adhesiva',\n Note: 'Nota',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Datos del tiempo',\n DiurnalTemperature: 'Diurnal Temperature',\n Heliodon: 'Heliodon',\n SunAndTime: 'Sun & Time',\n },\n benchmarksSubMenu: 'Benchmarks',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Line Width',\n SymbolSize: 'Symbol Size',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\n },\n analysisSubMenu: 'Análisis',\n physicsSubMenu: 'Physics',\n physics: {\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\n ReflectionHeatmap: 'Reflection Heatmap',\n },\n sensorSubMenu: 'Sensores',\n sensor: {\n CollectDailyData: 'Recoger datos diarios',\n CollectYearlyData: 'Recoger datos anuales',\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Paneles solares',\n solarPanel: {\n AnalyzeDailyYield: 'Analizar el rendimiento diario',\n AnalyzeYearlyYield: 'Analizar el rendimiento anual',\n AnalyzeVisibility: 'Analyze Visibility',\n PanelDiscretization: 'Discretización del panel',\n Exact: 'Exacto',\n Approximate: 'Aproximado',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\n },\n parabolicTroughSubMenu: 'Parabolic Trough',\n parabolicTrough: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n parabolicDishSubMenu: 'Parabolic Dish',\n parabolicDish: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n fresnelReflectorSubMenu: 'Fresnel Reflector',\n fresnelReflector: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\n },\n\n tutorialsSubMenu: 'Tutorials',\n\n solarEnergyScienceSubMenu: 'Solar Science',\n solarEnergyScienceTutorials: {\n SunAngles: 'Ángulos solares relativos a un observador en el suelo',\n InsolationAndClimate: 'Insolation and Climate',\n SolarRadiationToBox: 'Radiación solar a una caja',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Building Design',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'All Basic Roof Types',\n },\n\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle',\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Seguidores solares',\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\n SolarPowerTower: 'Solar Power Tower',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Ejemplos',\n\n solarEnergySubMenu: 'Energía Solar',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Rayo de sol y heliodon',\n RooftopSolarPanels: 'Rooftop Solar Panels',\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Bus Stop',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Vegetative Buffer',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\n },\n\n builtEnvironmentSubMenu: 'Built Environment',\n residentialBuildingsSubMenu: 'Residential Buildings',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Dutch Colonial House',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solarium',\n Church1: 'Church 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Barn Style House',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Commercial Buildings',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Edificio de oficinas',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Urban Planning',\n urbanPlanningExamples: {\n Heatmap1: 'Heatmap',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Greenhouse',\n Pavilion: 'Pavilion in a Park',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\n },\n\n languageSubMenu: 'Idioma',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'Sobre nosotros',\n },\n\n avatarMenu: {\n AccountSettings: 'Configuraciones de la cuenta',\n PrivacyInfo:\n 'When you sign in, your Google ID is used to create and access your Aladdin account.\\nOnly a random alphanumeric string is stored in our database as a reference.\\nNo personally identifiable data such as your name or email is ever gathered.\\nFor more information, see our Privacy Policy:\\nhttps://intofuture.org/aladdin-privacy.html',\n SignIn: 'Iniciar sesión',\n SignOut: 'Desconectar',\n IfYouAreAStudent: 'Si eres un estudiante',\n },\n\n skyMenu: {\n Axes: 'Ejes',\n Theme: 'Tema',\n ThemeDefault: 'Por defecto',\n ThemeDesert: 'Desierto',\n ThemeDune: 'Dune',\n ThemeForest: 'Bosque',\n ThemeGrassland: 'Campo',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\n ShowAzimuthAngle: 'Show Azimuth Angle',\n ShowElevationAngle: 'Show Elevation Angle',\n ShowZenithAngle: 'Show Zenith Angle',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Imagen en el suelo',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Eliminar todos los árboles',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Eliminar toda la gente',\n RemoveAllUnlockedFoundations: 'Eliminar todos las bases',\n RemoveAllUnlockedCuboids: 'Eliminar todos los cuboides',\n DoYouReallyWantToRemoveAllPeople: 'Estás seguro que quieres eliminar a toda la gente who are not locked',\n DoYouReallyWantToRemoveAllTrees: 'Estás seguro que quieres eliminar todos los árboles that are not locked',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Estás seguro que quieres eliminar todas las bases that are not locked',\n DoYouReallyWantToRemoveAllCuboids: 'Estás seguro que quieres eliminar todos los cuboides that are not locked',\n LockAllElements: 'Lock All Elements',\n UnlockAllElements: 'Unlock All Elements',\n },\n\n labelSubMenu: {\n Label: 'Etiqueta',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Seguir mostrando etiqueta',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Eliminar todas las paredes',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n RemoveAllUnlockedHumans: 'Remove All Humans',\n RemoveAllUnlockedTrees: 'Remove All Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Rejillas',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n SolarPanels: 'Paneles solares',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Estás seguro que quieres eliminar todos los paneles solares en esta base that are not locked',\n ParabolicTroughs: 'Parabolic Troughs',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\n ParabolicDishes: 'Parabolic Dishes',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\n FresnelReflectors: 'Fresnel Reflectors',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\n Heliostats: 'Heliostats',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\n Sensors: 'Sensores',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Estás seguro que quieres eliminar todos los sensores de esta base',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Paredes',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Estás seguro que quieres eliminar todas las paredes de esta base that are not locked',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Polígonos',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Estás seguro que quieres eliminar todos los polígonos de esta base that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Do you really want to remove all the humans on this foundation who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Do you really want to remove all the trees on this foundation that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Solamente esta base',\n AllConnectedFoundations: 'Todas las bases conectadas',\n AllFoundations: 'Todas las bases',\n AddPolygon: 'Añadir polígono',\n SolarStructure: 'Solar Structure',\n GroupMaster: 'Group Master',\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\n ReceiverTowerHeight: 'Height of Receiver Tower',\n ReceiverTowerRadius: 'Radius of Receiver Tower',\n ReceiverAbsorptance: 'Absorptance of Receiver',\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\n AbsorberHeight: 'Height of Absorber Pipe',\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\n AbsorberAbsorptance: 'Absorptance of Absorber',\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\n },\n\n cuboidMenu: {\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n RemoveAllUnlockedHumans: 'Remove All Humans',\n RemoveAllUnlockedTrees: 'Remove All Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Rejillas',\n SolarPanels: 'Paneles solares',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Estás seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked',\n Sensors: 'Sensores',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Estás seguro que quieres eliminar todos los sensores de este cuboide that are not locked',\n Polygons: 'Polígonos',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Estás seguro que quieres eliminar todos los polígonos de este cuboide that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Do you really want to remove all the humans on this cuboid who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Do you really want to remove all the trees on this cuboid that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Solamente este cuboide',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\n AllCuboids: 'Todos los cuboides',\n OnlyThisSide: 'Solamente este lado',\n AllSidesOfThisCuboid: 'Todos los lados en este cuboide',\n AllSidesOfAllCuboids: 'Todos los lados en todos los cuboides',\n AddPolygon: 'Añadir polígono',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Rellenar',\n FillTexture: 'Rellenar textura',\n FillColor: 'Rellenar color',\n Opacity: 'Opacity',\n LineColor: 'Color de la línea',\n LineWidth: 'Line Width',\n LineStyle: 'Line Style',\n SolidLine: 'Solid Line',\n DashedLine: 'Dashed Line',\n DottedLine: 'Dotted Line',\n InsertVertexBeforeIndex: 'Añadir vértice antes del índice',\n InsertVertexAfterIndex: 'Añadir vértice después del índice',\n DeleteVertex: 'Eliminar vértice',\n OnlyThisPolygon: 'Solamente este polígono',\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\n AllPolygonsAboveFoundation: 'Todos los polígonos sobre la base',\n AllPolygons: 'Todos los polígonos',\n Layout: 'Layout',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\n SolarPanelArrayModel: 'Solar Panel Model',\n SolarPanelArrayOrientation: 'Orientation',\n SolarPanelArrayTiltAngle: 'Tilt Angle',\n SolarPanelArrayRowWidth: 'Row Width',\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Row Axis',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Pole Height',\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimization',\n Parameters: 'Parameters',\n Variables: 'Variables',\n Constants: 'Constants',\n GeneticAlgorithm: 'Genetic Algorithm',\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n Generation: 'Generation',\n Gene: 'Gene',\n NormalizedVariables: 'Normalized Variables',\n Objective: 'Objective',\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\n ObjectiveFunctionDailyProfit: 'Daily Profit',\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\n RouletteWheel: 'Roulette Wheel',\n Tournament: 'Tournament',\n SearchMethod: 'Search Method',\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\n PopulationSize: 'Population Size',\n MaximumGenerations: 'Maximum Generations',\n SelectionRate: 'Selection Rate',\n CrossoverRate: 'Crossover Rate',\n MutationRate: 'Mutation Rate',\n Step: 'Step',\n SwarmSize: 'Swarm Size',\n MaximumSteps: 'Maximum Steps',\n MaximumVelocity: 'Maximum Velocity',\n InertiaWeight: 'Inertia Weight',\n CognitiveCoefficient: 'Cognitive Coefficient',\n SocialCoefficient: 'Social Coefficient',\n ConvergenceThreshold: 'Convergence Threshold for Termination',\n LocalSearchRadius: 'Local Search Radius',\n RowsPerRackRange: 'Range for Rows per Rack',\n TiltAngleRange: 'Range for Tilt Angle',\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\n },\n\n treeMenu: {\n ShowModel: 'Mostrar modelo',\n Flip: 'Flip',\n Type: 'Tipo',\n Spread: 'Extender',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Cambiar persona',\n Flip: 'Flip',\n Observer: 'Observer',\n ViewFromThisPerson: 'View from This Person',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Azimut relativa',\n Pole: 'Pole',\n PoleHeight: 'Altura del poste',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Extra Pole Height',\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\n DrawSunBeam: 'Dibujar rayo del sol',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflector Reflectance',\n ReceiverAbsorptance: 'Receiver Absorptance',\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Cambiar modelo PV',\n Orientation: 'Orientación',\n Portrait: 'Vertical',\n Landscape: 'Horizontal',\n FrameColor: 'Frame Color',\n Panels: 'paneles',\n PanelsWide: 'ancho paneles',\n PanelsLong: 'longitud paneles',\n TiltAngle: 'Inclinar ángulo',\n SouthFacingIsPositive: 'Orientado al sur es positivo',\n Tracker: 'Seguidor',\n SolarTrackerFollowsSun: 'Un seguidor sigue el sol para incrementar las salidas de los paneles solares',\n PoleSpacing: 'Espaciado entre postes',\n NoTracker: 'Sin seguimiento',\n HorizontalSingleAxisTracker: 'Seguidor horizontal de eje único',\n VerticalSingleAxisTracker: 'Seguidor vertical de eje único',\n AltazimuthDualAxisTracker: 'Seguidor de doble eje altazimutal',\n OnlyThisSolarPanel: 'Solamente este panel solar',\n AllSolarPanelsOnSurface: 'Todos los paneles solares en la misma superficie',\n AllSolarPanelsAboveFoundation: 'Todos los paneles solares sobre la misma base',\n AllSolarPanels: 'Todos los paneles solares',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Especificaciones del panel solar',\n Model: 'Modelo',\n PanelSize: 'Tamaño del panel',\n Cells: 'Celdas',\n CellType: 'Tipo de celda',\n Monocrystalline: 'Monocristalino',\n Polycrystalline: 'Policristalino',\n ThinFilm: 'Película delgada',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Negro',\n Blue: 'Azul',\n ShadeTolerance: 'Tolerancia a la sombra',\n SolarCellEfficiency: 'Eficiencia de la célula solar',\n NominalOperatingCellTemperature: 'Temperatura nominal de la celda de funcionamiento',\n TemperatureCoefficientOfPmax: 'Coeficiente de temperatura de Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n LatusRectum: 'Latus Rectum',\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\n AllParabolicTroughs: 'All Parabolic Troughs',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Absorber Pipe',\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\n AllFresnelReflectors: 'All Fresnel Reflectors',\n },\n\n heliostatMenu: {\n Tower: 'Tower',\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\n OnlyThisHeliostat: 'Only This Heliostat',\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\n AllHeliostats: 'All Heliostats',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Receiver Structure',\n CentralPole: 'Central Pole',\n CentralPoleWithTripod: 'Central Pole with Tripod',\n Quadrupod: 'Quadrupod',\n RimDiameter: 'Rim Diameter',\n LatusRectum: 'Latus Rectum',\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\n AllParabolicDishes: 'All Parabolic Dishes',\n },\n\n wallMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n SizeOfWall: 'Tamaño de la pared',\n OnlyThisWall: 'Solamente esta pared',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: 'Todas las paredes sobre la misma base',\n AllWalls: 'Todo paredes',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\n Doors: 'Doors',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n WallStructure: 'Wall Structure',\n DefaultStructure: 'Default',\n StudStructure: 'Stud',\n PillarStructure: 'Pillar',\n Opacity: 'Opacity',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Altura',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Only This Window',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\n AllWindows: 'All Windows',\n Width: 'Ancho',\n Height: 'Altura',\n Mullion: 'Mullion',\n MullionWidth: 'Mullion Width',\n MullionSpacing: 'Mullion Spacing',\n MullionColor: 'Mullion Color',\n Tint: 'Tint',\n Opacity: 'Opacity',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Shutter',\n LeftShutter: 'Left Shutter',\n RightShutter: 'Right Shutter',\n BothShutters: 'Both Shutters',\n ShutterWidth: 'Relative Width',\n ShutterColor: 'Shutter Color',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n OnlyThisRoof: 'Only This Wall',\n AllRoofsAboveFoundation: 'All Walls Above the Same Foundation',\n AllRoofs: 'All Roofs',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Rafter Spacing',\n RafterWidth: 'Rafter Width',\n RafterThickness: 'Rafter Thickness',\n RafterColor: 'Rafter Color',\n RoofColor: 'Roof Color',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Glass Tint',\n Opacity: 'Opacity',\n RoofStructure: 'Roof Structure',\n DefaultStructure: 'Default',\n RafterStructure: 'Rafter',\n GlassStructure: 'Glass',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n Texture11: 'Textura 11',\n Texture12: 'Textura 12',\n Texture13: 'Textura 13',\n Texture14: 'Textura 14',\n Texture15: 'Textura 15',\n Texture16: 'Textura 16',\n Texture17: 'Textura 17',\n OnlyThisDoor: 'Only This Door',\n AllDoorsOnWall: 'All Doors on the Same Wall',\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\n AllDoors: 'All Doors',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'Alto',\n Low: 'Bajo',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Color Contrast',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\n },\n\n instructionPanel: {\n Rotate: 'Rotar',\n DragMouse: 'Arrastrar el ratón',\n Zoom: 'Zoom',\n MouseWheelOrKeys: 'Girar el mouse o presionar Ctrl+[ o Ctrl+]',\n MouseWheelOrKeysMac: 'Girar el mouse o presionar ⌘+[ o ⌘+]',\n Pan: 'Panorámica',\n HoldCtrlDragMouse: 'Mantener Ctrl y mover el ratón',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Reset',\n AutoRotate: 'Auto rotar',\n StartOrStop: 'Presiona F4 para empezar o parar',\n },\n\n mapPanel: {\n ImageOnGround: 'Imagen en el suelo',\n WeatherStations: 'Weather Stations',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Coordenadas',\n Zoom: 'Zoom',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Solar Panel Visibility',\n Observer: 'Observer',\n VantagePoint: 'Vantage Point',\n ItemizedVisibilityByFields: 'Itemized by Fields',\n TotalVisibility: 'Total',\n },\n\n sensorPanel: {\n LightSensor: 'Sensor de luz',\n WeatherDataFrom: 'Datos metereológicos de',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Rendimiento diario del panel solar',\n SolarPanelYearlyYield: 'Rendimiento anual del panel solar',\n Yield: 'Rendimiento',\n YieldPerHour: 'Rendimiento por hora',\n DailyTotal: 'Total diario',\n YearlyTotal: 'Total anual',\n ShowOutputsOfIndividualSolarPanels: 'Mostrar salidas de paneles solares individuales',\n Profit: 'Profit',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Daily Yield',\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\n ChimneyAirTemperature: 'Chimney Air Temperature',\n ChimneyWindSpeed: 'Chimney Wind Speed',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Sun & Time Settings',\n SunAngles: 'Ángulos',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'Mis archivos en la nube',\n GenerateLink: 'Generar enlace',\n LinkGeneratedInClipBoard: 'Se ha generado un enlace en el portapapeles',\n DoYouReallyWantToDelete: 'Estás seguro que quieres eliminar',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Configuración de mi cuenta',\n MyID: 'My 🆔',\n ClickToCopyMyID: 'Click to copy my ID',\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'User Count',\n SchoolID: 'School ID',\n ClassID: 'Class ID',\n },\n\n weatherPanel: {\n SunshineHours: 'Luz solar',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Select Air Temperature Model',\n Sinusoidal: 'Sinusoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Economics Parameters',\n ElectricitySellingPrice: 'Electricity Selling Price',\n OperationalCostPerUnit: 'Operational Cost per Unit',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Claridad',\n ShowDaylightResults: 'Mostrar resultados de la luz solar',\n ShowSkyClearnessResults: 'Mostrar resultados de claridad del cielo',\n ShowAverageDailySolarRadiation: 'Mostrar la radiación solar diaria promedio',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Sin sensor para recopilar datos',\n NoSolarPanelForAnalysis: 'Sin panel solar para el análisis',\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Archivo en la nube',\n Select: 'Seleccionar',\n AddFoundation: 'Añadir base',\n AddWall: 'Añadir pared',\n AddWindow: 'Añadir ventana',\n AddDoor: 'Añadir door',\n AddPyramidRoof: 'Add pyramid roof',\n AddGableRoof: 'Add gable roof',\n AddHipRoof: 'Add hip roof',\n AddGambrelRoof: 'Add gambrel roof',\n AddMansardRoof: 'Add mansard roof',\n AddCuboid: 'Añadir cuboid',\n AddSensor: 'Añadir sensor',\n AddSolarPanel: 'Añadir panel solar',\n AddWaterHeater: 'Add water heater',\n AddParabolicDish: 'Add parabolic dish',\n AddParabolicTrough: 'Add parabolic trough',\n AddFresnelReflector: 'Add Fresnel reflector',\n AddHeliostat: 'Add heliostat',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Añadir árbol',\n AddFlower: 'Add flower',\n AddPeople: 'Añadir gente',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Manipulate a group',\n ClearScene: 'Clear escena',\n ShowSunAndTimeSettings: 'Show sun and time settings',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'Estás seguro que quieres borrar el contenido',\n ClickForMoreButtons: 'Click for more buttons',\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\n SwitchToAddingWall: 'Switch to Adding Wall',\n SwitchToAddingWindow: 'Switch to Adding Window',\n SwitchToAddingDoor: 'Switch to Adding Door',\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\n SwitchToAddingSensor: 'Switch to Adding Sensor',\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Switch to Adding Tree',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Switch to Adding People',\n },\n\n tooltip: {\n gotoIFI: 'Ver Institute for Future Intelligence',\n visitAladdinHomePage: 'Visita la página de Aladdin',\n clickToOpenMenu: 'Haz clic para abrir el menú principal',\n clickToAccessCloudTools: 'Haz clic para acceder a las herramientas en la nube',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Cerezo silvestre',\n Elm: 'Olmo',\n FanPalm: 'Fan Palm',\n Linden: 'Tilo',\n Magnolia: 'Magnolia',\n Maple: 'Arce',\n Oak: 'Roble',\n Pine: 'Pino',\n Spruce: 'Spruce',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Jaah',\n Jack: 'Jack',\n Jacob: 'Jacob',\n Jacqueline: 'Jacqueline',\n Jade: 'Jade',\n Jamelia: 'Jamelia',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Jaya',\n Jaye: 'Jaye',\n Jeanette: 'Jeanette',\n Jedi: 'Jedi',\n Jeff: 'Jeff',\n Jena: 'Jena',\n Jennifer: 'Jennifer',\n Jess: 'Jess',\n Jett: 'Jett',\n Jill: 'Jill',\n Jiya: 'Jiya',\n Joan: 'Joan',\n Jocelyn: 'Jocelyn',\n Joel: 'Joel',\n Joey: 'Joey',\n John: 'John',\n Jonathon: 'Jonathon',\n Jose: 'Jose',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Judd',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Julio',\n Jumapili: 'Jumapili',\n June: 'June',\n Juro: 'Juro',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_tr = {\n translation: {\n name: {\n IFI: 'Yarının Zekası Enstitüsü',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Açıklanabilir Yapay Zeka ile Tasarımı Yeniden Hayal Et — Yarının Zekası Enstitüsü',\n },\n\n cookie: {\n Statement: 'Kabul Ete tıklayarak, iyi bir Aladdin deneyimi için çerez kullanımını kabul etmiş olursunuz.',\n Accept: 'Kabul Et',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Geliştiriciler',\n TermsOfService: 'Hizmet Şartları',\n PrivacyPolicy: 'Gizlilik Politikası',\n Software: 'Yazılım',\n Content: 'İçerik',\n Research: 'Araştırma',\n Support: 'Destek',\n Acknowledgment: 'Onay',\n FundingInformation:\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.\",\n Contact: 'Daha fazla bilgi için lütfen Charles Xie (charles@intofuture.org) ile iletişime geçiniz.',\n Translators: 'Çevirmenler',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'Tüm Hakları Saklıdır.',\n MeterAbbreviation: 'm',\n Version: 'Sürüm',\n VersionInitial: 'S',\n Options: 'Seçenekler',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Maksimum Sayı',\n MinimumNumber: 'Minimum Sayı',\n MaximumValue: 'Maksimum Değer',\n MinimumValue: 'Minimum Değer',\n Or: 'Veya',\n None: 'Hiçbiri',\n High: 'Yüksek',\n Partial: 'Kısmi',\n Teacher: 'Öğretmen',\n Class: 'Sınıf',\n Total: 'Toplam',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Aralık',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Tıkla',\n Open: 'Aç',\n Save: 'Kaydet',\n SaveAsImage: 'Resim Olarak Kaydet',\n SaveAsCsv: 'Save as CSV',\n Update: 'Güncelle',\n Paste: 'Yapıştır',\n Copy: 'Kopyala',\n Cut: 'Kes',\n Delete: 'Sil',\n Lock: 'Kilitle',\n Translucent: 'Yarı Saydam',\n Color: 'Renk',\n Texture: 'Doku',\n Size: 'Boyut',\n Thickness: 'Kalınlık',\n Yes: 'Evet',\n No: 'Hayır',\n OK: 'Tamam',\n Cancel: 'İptal',\n Apply: 'Uygula',\n Close: 'Kapat',\n ApplyTo: 'Uygula',\n Run: 'Çalıştır',\n Pause: 'Duraklat',\n Resume: 'Sürdür',\n Clear: 'Temizle',\n Warning: 'Uyarı',\n Caution: 'Caution',\n Reminder: 'Hatırlatıcı',\n Length: 'Uzunluk',\n Width: 'Genişlik',\n Height: 'Yükseklik',\n Radius: 'Yarıçap',\n Angle: 'Açı',\n Azimuth: 'Azimut',\n Coordinates: 'Koordinatlar',\n Weather: 'Hava Durumu',\n Show: 'Göster',\n Animate: 'Oynat',\n Date: 'Tarih',\n Time: 'Saat',\n Title: 'Başlık',\n Owner: 'Sahibi',\n Action: 'Eylem',\n Rename: 'Yeniden Adlandır',\n Location: 'Konum',\n Latitude: 'Enlem',\n Month: 'Ay',\n Day: 'Gün',\n Hour: 'Saat',\n Daylight: 'Gün Işığı',\n Radiation: 'Işınım',\n Temperature: 'Sıcaklık',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'W',\n Fixed: 'Sabit',\n Elements: 'Öğeler',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'Doku Yok',\n FoundationElement: 'Temel',\n CuboidElement: 'Kübik',\n PolygonElement: 'Poligon',\n SensorElement: 'Sensör',\n SolarPanelElement: 'Güneş Paneli',\n WaterHeaterElement: 'Su Isıtıcı',\n ParabolicDishElement: 'Parabolik Çanak',\n ParabolicTroughElement: 'Parabolik Oluk',\n FresnelReflectorElement: 'Fresnel Reflektör',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Kilitli',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Oturum açılamıyor',\n CannotSignOut: 'Çıkış yapılamıyor',\n YourAccountWasCreated: 'Hesabınız oluşturuldu',\n CannotCreateAccount: 'Hesap oluşturulamıyor',\n YourAccountSettingsWereSaved: 'Hesap ayarlarınız kaydedildi.',\n CannotSaveYourAccountSettings: 'Hesap ayarlarınız kaydedilemiyor',\n CannotSaveYourFileToCloud: 'Dosyanız buluta kaydedilemiyor',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'Bulut dosyası bulunamadı',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Bulut dosyası açılamıyor',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Bulut klasörünüz açılamıyor',\n CannotDeleteCloudFile: 'Bulut dosyası silinemiyor',\n CannotRenameCloudFile: 'Bulut dosyası yeniden adlandırılamıyor',\n DoYouWantToSaveChanges: 'Değişiklikleri kaydetmek istiyor musunuz?',\n NotApplicableToSelectedAction: 'Seçili eyleme uygulanamaz',\n ThisElementIsLocked: 'Bu öğe kilitli.',\n ThisCannotBeUndone: 'Geri alınamaz.',\n AzimuthOfNorthIsZero: 'Kuzey yönünün azimut açısı 0 ° derecedir.',\n CounterclockwiseAzimuthIsPositive: 'Saat yönünün tersi yönde azimut açısı pozitiftir.',\n MoveCancelledBecauseOfOverlap: 'Çakışma nedeniyle taşıma iptal edildi.',\n MoveOutsideBoundaryCancelled: 'Alan dışına çıkan taşıma iptal edildi.',\n RotationCancelledBecauseOfOverlap: 'Çakışma nedeniyle döndürme iptal edildi.',\n RotationOutsideBoundaryCancelled: 'Alan dışı döndürme iptal edildi.',\n ResizingCancelledBecauseOfOverlap: 'Çakışma nedeniyle yeniden boyutlandırma iptal edildi.',\n ResizingOutsideBoundaryCancelled: 'Alan dışında yeniden boyutlandırma iptal edildi.',\n CannotPasteOutsideBoundary: 'Alanın dışına yapıştırılamaz.',\n CannotPasteBecauseOfOverlap: 'Çakışma nedeniyle yapıştırılamıyor.',\n CannotMoveObjectTooFar: 'Nesne buraya taşınamaz.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Yeni yerleşim düzeni uygulanmadan önce mevcut güneş panelleri kaldırılacaktır.',\n DoYouWantToContinue: 'Devam etmek istiyor musunuz?',\n SolarPanelsCannotIntersectWithGround: 'Güneş panelleri zeminle kesişemez.',\n SolarPanelsCannotOverlapWithOneAnother: 'Güneş panelleri birbiriyle örtüşemez.',\n ScreenshotSaved: 'Ekran görüntüsü kaydedildi.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simülasyon başladı.',\n SimulationCompleted: 'Simülasyon tamamlandı.',\n SimulationAborted: 'Simülasyon iptal edildi.',\n SimulationPaused: 'Simülasyon duraklatıldı.',\n CancelSimulation: 'Simülasyonu iptal et',\n PauseSimulation: 'Simülasyonu duraklat',\n ResumeSimulation: 'Simülasyonu devam ettir',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evrim başladı.',\n EvolutionCompleted: 'Evrim tamamlandı.',\n EvolutionAborted: 'Evrim iptal edildi.',\n EvolutionPaused: 'Evrim duraklatıldı.',\n EncounterEvolutionError: 'Evrim hatasıyla karşılaşıldı.',\n CancelEvolution: 'Evrimi iptal et',\n PauseEvolution: 'Evrimi duraklat',\n ResumeEvolution: 'Evrime devam et',\n ConvergenceThresholdHasBeenReached: 'Yakınsama eşiğine ulaşıldı.',\n MaximumNumberOfGenerationsHasBeenReached: 'Maksimum nesil sayısına ulaşıldı.',\n MaximumNumberOfStepsHasBeenReached: 'Maksimum adım sayısına ulaşıldı.',\n ObjectiveFunctionTypeError: 'Geçerli işlev desteklenmiyor. Lütfen menüden başlatınız.',\n WallsAreNotAtSameHeight: 'Walls are not at same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analiz Seçenekleri',\n option: {\n GridCellSize: 'Hücre Boyutu',\n SamplingFrequency: 'Örneklem Frekansı',\n TimesPerHour: 'x 1/saat',\n DaysPerYear: 'Gün Sayısı / Yıl',\n },\n mainMenu: 'Ana Menü',\n cloudMenu: 'Bulut Menüsü',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'Dosya',\n file: {\n CreateNewFile: 'Yeni Dosya Oluştur',\n OpenLocalFile: 'Yerel Dosya Aç',\n SaveAsLocalFile: 'Yerel Dosya Olarak Kaydet',\n SavingAbortedMustHaveValidFileName: 'Kaydetme iptal edildi! Geçerli bir dosya adı kullanınız.',\n OpenCloudFile: 'Bulut Dosyası Aç',\n SaveCloudFile: 'Bulut Dosyasını Kaydet',\n SaveAsCloudFile: 'Bulut Dosyası Olarak Kaydet',\n SavingAbortedMustHaveValidTitle: 'Kaydetme iptal edildi! Dosya adı geçersiz!',\n ToSaveYourWorkPleaseSignIn: 'Çalışmanızı kaydetmek için lütfen oturum açınız.',\n TakeScreenshot: 'Ekran görüntüsü al',\n UseCloudFileName: 'Bulut Dosya Adını Kullan',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Düzen',\n edit: {\n Undo: 'Geri Al',\n Redo: 'Yinele',\n },\n viewSubMenu: 'Görünüm',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D',\n ResetView: 'Yenile',\n ZoomIn: 'Yaklaş',\n ZoomOut: 'Uzaklaş',\n AutoRotate: 'Otomatik Döndür',\n ShowShadow: 'Gölge',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Yüzer Pencere',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Konum Bilgisi',\n DesignInformation: 'Izgara Hücre Sayısı',\n Instruction: 'Yardım',\n StickyNote: 'Notlar',\n Note: 'Notlar',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Hava Durumu',\n DiurnalTemperature: 'Günlük Sıcaklık',\n Heliodon: 'Heliodon',\n SunAndTime: 'Güneş & Zaman',\n },\n benchmarksSubMenu: 'Deneysel',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Güneş Işınım Tahmini Vs. Ölçümü ',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Çizgi Kalınlığı',\n SymbolSize: 'Sembol Boyutu',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Yatay Izgara Çizgilerini Göster',\n ShowVerticalGridLines: 'Dikey Izgara Çizgilerini Göster',\n },\n analysisSubMenu: 'Analiz',\n physicsSubMenu: 'Fizik',\n physics: {\n DailySolarRadiationHeatmap: 'Günlük Isı Haritası',\n SolarRadiationHeatmapOptions: 'Isı Haritası Seçenekleri',\n SolarRadiationHeatmapGridCellSize: 'Hücre Boyutu',\n SolarRadiationHeatmapMaxValue: 'Işınım Maksimum Değer',\n SolarRadiationHeatmapNoAnimation: 'Animasyon Yok',\n ReflectionHeatmap: 'Yansıma Isı Haritası',\n },\n sensorSubMenu: 'Sensörler',\n sensor: {\n CollectDailyData: 'Günlük Veri Topla',\n CollectYearlyData: 'Yıllık Veri Topla',\n SensorSimulationNoAnimation: 'Animasyon Yok',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Güneş Panelleri',\n solarPanel: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n AnalyzeVisibility: 'Görünüm Analizi',\n PanelDiscretization: 'Panel Ayrıklaştırma',\n Exact: 'Kesin',\n Approximate: '\tYaklaşık',\n EnergyGridCellSize: 'Hücre Boyutu',\n VisibilityGridCellSize: 'Hücre Boyutu',\n EnergyAnalysisOptions: 'Enerji Analiz Seçenekleri',\n VisibilityAnalysisOptions: 'Görünüm Analiz Seçenekleri',\n SolarPanelSimulationNoAnimation: 'Animasyon Yok',\n },\n parabolicTroughSubMenu: 'Parabolik Oluk',\n parabolicTrough: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n parabolicDishSubMenu: 'Parabolik Çanak',\n parabolicDish: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n fresnelReflectorSubMenu: 'Fresnel Yansıtıcı',\n fresnelReflector: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Kulesi',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n SolarUpdraftTowerSimulationNoAnimation: 'Animasyon Yok',\n },\n\n tutorialsSubMenu: 'Öğrenme Merkezi',\n\n solarEnergyScienceSubMenu: 'Güneş Bilimi',\n solarEnergyScienceTutorials: {\n SunAngles: 'Gözlemciye Göre Güneş Açıları',\n InsolationAndClimate: 'Güneşlenme ve İklim',\n SolarRadiationToBox: 'Kutu Güneş Işınımı',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Bina Tasarımı',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Çatı Pencereli Cape Cod Evi',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Beşik Çatı vs. Kırma Çatı',\n ColonialVsSaltbox: 'Koloni vs. Tuz Kutusu',\n GambrelRoofVsMansardRoof: 'Flemenk Çatı vs. Mansart Çatı',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'Tüm Çatı Tipleri',\n },\n\n photovoltaicSolarPowerSubMenu: 'Fotovoltaik Güneş Enerjisi',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Güneş Paneli Eğim Açısı Etkisi',\n EffectOfAzimuthOfSolarPanel: 'Güneş Paneli Azimut Açısı Etkisi',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Güneş İzleyiciler',\n CoveringGroundWithSolarPanels:\n 'Sadece güneş panellerini kullanarak yüzeyi kaplamak neden iyi bir fikir değildir?',\n InterRowSpacingOfSolarPanelArray: 'Güneş Paneli Dizi Arası Boşluk Etkisi',\n EffectOfOrientationOfSolarPanels: 'Güneş Panelleri Yön Etkisi',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Yoğunlaştırılmış Güneş Enerjisi',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Parabolik Oluk Azimut Açısı Etkisi',\n EffectOfLatusRectumOfParabolicTrough: 'Parabolik Oluk Özkiriş Etkisi',\n FocusSunlightWithParabolicDish: 'Güneş Işığını Parabolik Çanakla Odaklama',\n LinearFresnelReflectors: 'Doğrusal Fresnel Reflektörler',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Doğrusal Fresnel Reflektörlerde Soğurucu Boru Yükseklik Etkisi',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Doğrusal Fresnel Reflektörlerde Azimut Açısı Etkisi',\n LinearFresnelReflectorsWithTwoAbsorbers: 'İki Soğuruculu Doğrusal Fresnel Reflektörler',\n CosineEfficiencyOfHeliostats: 'Heliostatların Kosinüs Verimliliği',\n ShadowingAndBlockingOfHeliostats: 'Heliostatlarda Gölgeleme ve Engellenme',\n EffectSolarPowerTowerHeight: 'Güneş Güç Kulesi Yükseklik Etkisi',\n SolarPowerTower: 'Güneş Güç Kulesi',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Diğer Güneş Gücü Türleri',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Kulesi',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Örnekler',\n\n solarEnergySubMenu: 'Güneş Enerjisi',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Güneş Işını ve Heliodon',\n RooftopSolarPanels: 'Çatı Üstü Güneş Panelleri',\n NevadaSolarOneParabolicTroughArray: 'Nevada Eyaletinde Parabolik Oluk Dizisi',\n TooeleParabolicDishArray: 'Tooele Şehrinde Parabolik Çanak Dizisi',\n PS10SolarPowerTower: 'PS10 Güneş Güç Kulesi',\n TucsonLinearFresnelReflectors: 'Tucson Şehrinde Doğrusal Fresnel Reflektörleri',\n SolarCanopyFormFactors: 'Solar Gölgelik Biçim Etkileri',\n SolarCanopyOverBleachers: 'Tirübün Üzeri Solar Gölgelik',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Otobüs Durağı',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Bitkisel Tampon',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Bakersfield Şehrinde Kanal Üzerindeki Varsayımsal Güneş Panelleri',\n SolarNoiseBarrierLexingtonMA: 'Lexington Kasabasında Varsayımsal Güneş Gürültü Bariyeri',\n HSATSolarTrackersRaleighNC: 'Raleigh Şehrinde Yatay Tek Eksenli İzleyiciler (HSAT)',\n AADATSolarTrackersLancasterCA: 'Lancaster Şehrinde Azimut–İrtifa Çift Eksenli İzleyiciler (AADAT)',\n SolarUpdraftTowerInCity: 'Şehir Solar Updraft Kulesi',\n },\n\n builtEnvironmentSubMenu: 'Yapılı Çevre',\n residentialBuildingsSubMenu: 'Konut inşaatları',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Flemenk Koloni Evi',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solaryum',\n Church1: 'Kilise 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Çiftlik Evi',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Ticari Binalar',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'Yenişehir Belediyesi Bilim ve Sanat Merkezi',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Ofis Binası',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'Güney Burlington Lisesi',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Şehir Planlaması',\n urbanPlanningExamples: {\n Heatmap1: 'Isı Haritası',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Sera',\n Pavilion: 'Park Kamelyası',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Yapay Zeka',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Güneş Paneli Sıra Eğim Açısı Optimize Etme',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Çoklu Güneş Paneli Sıra Eğim Açısı Optimize Etme',\n SolarFarmGenerativeDesign: 'Güneş Tarlası Tasarımı',\n SolarFarmGenerativeDesignWithBlock: 'Blok Varlığında Güneş Tarlası Tasarımı',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Güneş Tarlası Tasarımı',\n },\n\n languageSubMenu: 'Dil',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'Hakkımızda',\n },\n\n avatarMenu: {\n AccountSettings: 'Hesap Ayarları',\n PrivacyInfo:\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.\\nVeritabanımızda referans olarak yalnızca rastgele bir alfasayısal dize depolanır.\\nAdınız veya e-posta adresiniz gibi kişisel olarak tanımlanabilir hiçbir veri toplanmaz.\\n Daha fazla bilgi için Gizlilik Politikamıza bakın:\\nhttps://intofuture.org/aladdin-privacy.html',\n SignIn: 'Kayıt Ol',\n SignOut: 'Oturum Kapat',\n IfYouAreAStudent: 'Eğer Öğrenciyseniz',\n },\n\n skyMenu: {\n Axes: 'Eksenler',\n Theme: 'Tema',\n ThemeDefault: 'Varsayılan',\n ThemeDesert: 'Çöl',\n ThemeDune: 'Dune',\n ThemeForest: 'Orman',\n ThemeGrassland: 'Çayır',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Havan Güneş Işığı Zayıflatma Katsayısı',\n ConvectiveCoefficientOfAir: 'Havan Isı İletkenlik Katsayısı',\n HighestTemperatureTimeInMinutes: 'En Yüksek Sıcaklık Süresi (Dakika)',\n SelectSunAnglesToShow: 'Gösterilecek Güneş Açılarını Seçin',\n ShowAzimuthAngle: 'Azimut Açısını Göster',\n ShowElevationAngle: 'Yükselme Açısını Göster',\n ShowZenithAngle: 'Zenit Açısını Göster',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Yer Görüntüsü',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Tüm Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Tüm Kişileri Kaldır',\n RemoveAllUnlockedFoundations: 'Tüm Temelleri Kaldır',\n RemoveAllUnlockedCuboids: 'Tüm Kübikleri Kaldır',\n DoYouReallyWantToRemoveAllPeople: 'Tüm Kişileri Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllTrees: 'Tüm Ağaçları Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Tüm Temelleri Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllCuboids: 'Tüm Kübikleri Kaldırmak İstiyor Musunuz?',\n LockAllElements: 'Tüm Öğeleri Kilitle',\n UnlockAllElements: 'Tüm Öğelerin Kilidini Aç',\n },\n\n labelSubMenu: {\n Label: 'Etiket',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Etiketi Göstermeye Devam Et',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\n RemoveAllUnlockedParabolicTroughs: 'Tüm Kilitlenmemiş Parabolik Olukları Kaldır',\n RemoveAllUnlockedParabolicDishes: 'Tüm Kilitlenmemiş Parabolik Çanakları Kaldır',\n RemoveAllUnlockedFresnelReflectors: 'Tüm Kilitlenmemiş Fresnel Reflektörleri Kaldır',\n RemoveAllUnlockedHeliostats: 'Tüm Kilitlenmemiş Heliostatları Kaldır',\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Tüm Kilitlenmemiş Duvarları Kaldır',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Çokgenleri Kaldır',\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş İnsanları Kaldır',\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Çerçeveler',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n SolarPanels: 'Güneş Panelleri',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n ' Seçili temel üzerindeki tüm güneş panellerini kaldırmak istiyor musunuz?',\n ParabolicTroughs: 'Parabolik Oluklar',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik olukları kaldırmak istiyor musunuz?',\n ParabolicDishes: 'Parabolik Çanaklar',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik çanakları kaldırmak istiyor musunuz?',\n FresnelReflectors: 'Fresnel Reflektörler',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm Fresnel reflektörlerini kaldırmak istiyor musunuz?',\n Heliostats: 'Heliostatlar',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm heliostatları kaldırmak istiyor musunuz?',\n Sensors: 'Sensörler',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm sensörleri kaldırmak istiyor musunuz?',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Duvarlar',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm duvarları kaldırmak istiyor musunuz? ',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Poligonlar',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm poligonları kaldırmak istiyor musunuz?',\n Humans: 'Kişiler',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm insanları kaldırmak istiyor musunuz?',\n Trees: 'Ağaçlar',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm ağaçları kaldırmak istiyor musunuz?',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Sadece Seçili Temel',\n AllConnectedFoundations: 'Tüm Bağlantılı Temeller',\n AllFoundations: 'Tüm Temeller',\n AddPolygon: 'Poligon Ekle',\n SolarStructure: 'Solar Yapı Seçin',\n GroupMaster: 'Grup Yöneticisi',\n LockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğeleri kilitle',\n UnlockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğelerin kilidini aç',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Heliostat Alıcı Kulesi',\n ReceiverTowerPhysicalProperties: 'Alıcı Kule Fiziksel Özellikler',\n ReceiverTowerHeight: 'Alıcı Kule Yükseklik',\n ReceiverTowerRadius: 'Alıcı Kule Yarıçap',\n ReceiverAbsorptance: 'Alıcı Absorbsiyon',\n ReceiverOpticalEfficiency: 'Alıcı Optik Verim',\n ReceiverThermalEfficiency: 'Alıcı Termal Verim',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Fresnel Reflektör Soğurucu Boru',\n AbsorberPipePhysicalProperties: 'Soğurucu Boru Fiziksel Özellikler',\n AbsorberHeight: 'Soğurucu Boru Yükseklik',\n AbsorberApertureWidth: 'Soğurucu boru diyafram genişliği',\n AbsorberPipePoleNumber: 'Soğurucu Boru Sayısı',\n AbsorberAbsorptance: 'Soğurucu Absorbsiyonu',\n AbsorberOpticalEfficiency: 'Soğurucu Optik Verimlilik',\n AbsorberThermalEfficiency: 'Soğurucu Isıl Verimlilik',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Kulesi',\n SolarUpdraftTowerPhysicalProperties: 'Solar Updraft Kulesi Fiziksel Özellikler',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Kulesi Baca Yüksekliği',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Kulesi Baca Yarıçapı',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Kulesi Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Kulesi Kollektör Yarıçapı',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Kulesi Kollektör Geçirgenliği',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Kulesi Kollektör Emisivite',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Kulesi Deşarj Katsayısı',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Kulesi Türbin Verimliliği',\n },\n\n cuboidMenu: {\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş Kişileri Kaldır',\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Çerçeveler',\n SolarPanels: 'Güneş Panelleri',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm güneş panellerini kaldırmak istiyor musunuz?',\n Sensors: 'Sensörler',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm sensörleri kaldırmak istiyor musunuz?',\n Polygons: 'Poligonlar',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm poligonları kaldırmak istiyor musunuz?',\n Humans: 'İnsanlar',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm insanları kaldırmak istiyor musunuz?',\n Trees: 'Ağaçlar',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm ağaçları kaldırmak istiyor musunuz?',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Sadece Seçili Kübik',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\n AllCuboids: 'Tüm Kübikler',\n OnlyThisSide: 'Sadece Seçili Yüzey',\n AllSidesOfThisCuboid: 'Seçili Kübik Tüm Yüzeyler',\n AllSidesOfAllCuboids: 'Bütün Kübik Yüzeyleri ',\n AddPolygon: 'Poligon Ekle',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Dolgu',\n FillTexture: 'Dolgu Dokusu',\n FillColor: 'Dolgu Rengi',\n Opacity: 'Opaklık',\n LineColor: 'Çizgi Rengi',\n LineWidth: 'Çizgi Kalınlığı',\n LineStyle: 'Çizgi Stili',\n SolidLine: 'Düz çizgi',\n DashedLine: 'Kesik çizgi',\n DottedLine: 'Noktalı çizgi',\n InsertVertexBeforeIndex: 'İndeksten Önce Tepe Noktası Ekle',\n InsertVertexAfterIndex: 'İndeksten Sonra Tepe Noktası Ekle',\n DeleteVertex: 'Tepe Noktası Sil',\n OnlyThisPolygon: 'Sadece Seçili Poligon',\n AllPolygonsOnSurface: 'Tüm Poligonlar Aynı Yüzeyde',\n AllPolygonsAboveFoundation: 'Temel Üzerindeki Tüm Poligonlar',\n AllPolygons: 'Tüm Poligonlar',\n Layout: 'Düzen',\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\n SolarPanelArrayLayoutParametricDesign: 'Güneş Paneli Dizi Düzeni: Parametrik Tasarım',\n SolarPanelArrayLayoutGenerativeDesign: 'Güneş Paneli Dizi Düzeni: Üretici Tasarım',\n SolarPanelArrayModel: 'Güneş Paneli Modeli',\n SolarPanelArrayOrientation: 'Oryantasyon',\n SolarPanelArrayTiltAngle: 'Eğim Açısı',\n SolarPanelArrayRowWidth: 'Dizi Sıra Genişliği',\n SolarPanelArrayInterRowSpacing: 'Dizi Sıra Arası Boşluk',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Dizi Sıra Ekseni',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'Doğu-Batı (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'Kuzey-Güney (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Direk Yükseklik',\n SolarPanelArrayPoleSpacing: 'Direk Aralık',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'Bu yerleşim düzeni uygulanamaz. Lütfen parametrelerinizi kontrol edin.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimizasyon',\n Parameters: 'Parametreler',\n Variables: 'Değişkenler',\n Constants: 'Sabitler',\n GeneticAlgorithm: 'Genetik Algoritma',\n GeneticAlgorithmSettings: 'Genetik Algoritma Ayarı',\n ParticleSwarmOptimization: 'Parçacık Sürü Optimizasyon',\n ParticleSwarmOptimizationSettings: 'Parçacık Sürü Optimizasyon Ayarı',\n SolarPanelTiltAngleOptimization: 'Güneş Paneli Eğim Açısı Optimizasyonu',\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\n Generation: 'Nesil',\n Gene: 'Gen',\n NormalizedVariables: 'Normalleştirilmiş Değişkenler',\n Objective: 'Amaç',\n ObjectiveFunctionDailyTotalYield: 'Günlük Toplam Üretim',\n ObjectiveFunctionYearlyTotalYield: 'Yıllık Toplam Üretim',\n ObjectiveFunctionDailyMeanYield: 'Günlük Ortalama Üretim',\n ObjectiveFunctionYearlyMeanYield: 'Yıllık Ortalama Üretim',\n ObjectiveFunctionDailyProfit: 'Günlük Kazanç',\n ObjectiveFunctionYearlyProfit: 'Yıllık Kazanç',\n GeneticAlgorithmSelectionMethod: 'Genetik Algoritma Seçim Yöntemi',\n RouletteWheel: 'Rulet Çarkı',\n Tournament: 'Turnuva',\n SearchMethod: 'Arama Yöntemi',\n GlobalSearchUniformSelection: 'Küresel Arama Standart Seçim',\n LocalSearchRandomOptimization: 'Yerel Arama Rastgele Optimizasyon',\n PopulationSize: 'Popülasyon Boyutu',\n MaximumGenerations: 'Maksimum Nesil',\n SelectionRate: 'Seçim Oranı',\n CrossoverRate: 'Geçiş Oranı',\n MutationRate: 'Mutasyon Oranı',\n Step: 'Adım',\n SwarmSize: 'Sürü Boyutu',\n MaximumSteps: 'Maksimum Adım',\n MaximumVelocity: 'Maksimum Hız',\n InertiaWeight: 'Atalet Ağırlığı',\n CognitiveCoefficient: 'Bilişsel Katsayı',\n SocialCoefficient: 'Sosyal Katsayı',\n ConvergenceThreshold: 'Sonlandırma için Yakınsama Eşiği',\n LocalSearchRadius: 'Yerel Arama Yarıçapı',\n RowsPerRackRange: 'Raf Başına Sıra Aralığı',\n TiltAngleRange: 'Eğim Açısı Aralığı',\n InterRowSpacingRange: 'Sıra Arası Aralık Ranjı',\n ClickTargetPolygonToActivate: 'Etkinleştirmek için Hedef Poligona Tıklayınız',\n ClickTargetFoundationToActivate: 'Etkinleştirmek için Hedef Temele Tıklayınız',\n },\n\n treeMenu: {\n ShowModel: 'Modeli Göster',\n Flip: 'Flip',\n Type: 'Tür',\n Spread: 'Yayılım',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Kişi Değiştir',\n Flip: 'Flip',\n Observer: 'Gözlemci',\n ViewFromThisPerson: ' Seçili Kişiye Göre Perspektif',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Göreceli Azimut Açısı',\n Pole: 'Pole',\n PoleHeight: 'Direk Yüksekliği',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Ekstra Direk Yüksekliği',\n ExtraPoleHeightInAdditionToHalfWidth: 'Yarım Genişliğe Ek Ekstra Direk Yüksekliği',\n DrawSunBeam: 'Güneş Işını Çiz',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflektör Yansıma',\n ReceiverAbsorptance: 'Alıcı Absorbsiyonu',\n ReflectorOpticalEfficiency: 'Reflektör Optik Verimliliği',\n ReceiverThermalEfficiency: 'Alıcı Termal Verimliliği',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'PV Modelini Değiştir',\n Orientation: 'Oryantasyon',\n Portrait: 'Portre',\n Landscape: 'Peyzaj',\n FrameColor: 'Frame Color',\n Panels: 'Paneller',\n PanelsWide: 'Panel Genişliği',\n PanelsLong: 'Panel Uzunluğu',\n TiltAngle: 'Eğim Açısı',\n SouthFacingIsPositive: 'Güney yönünde açı pozitiftir.',\n Tracker: 'İzleyici',\n SolarTrackerFollowsSun: 'Güneş paneli verimini artırmak için bir güneş izleme sistemi güneşi sürekli takip eder.',\n PoleSpacing: 'Direk Aralığı',\n NoTracker: 'İzleme Sistemi Yok',\n HorizontalSingleAxisTracker: 'Yatay Tek Eksenli İzleme Sistemi',\n VerticalSingleAxisTracker: 'Dikey Tek Eksenli İzleme Sistemi',\n AltazimuthDualAxisTracker: 'Altazimut Çift Eksenli İzleme Sistemi',\n OnlyThisSolarPanel: 'Sadece Seçili Güneş Paneli',\n AllSolarPanelsOnSurface: 'Tüm Güneş Panelleri Aynı Yüzeyde',\n AllSolarPanelsAboveFoundation: 'Tüm Güneş Panelleri Aynı Temel Üzerinde',\n AllSolarPanels: 'Tüm Güneş Panelleri',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Güneş Paneli Özellikleri',\n Model: 'Model',\n PanelSize: 'Panel Boyutu',\n Cells: 'Hücreler',\n CellType: 'Hücre Tipi',\n Monocrystalline: 'Monokristal',\n Polycrystalline: 'Polikristal',\n ThinFilm: 'İnce Katman',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Siyah',\n Blue: 'Mavi',\n ShadeTolerance: 'Gölge Toleransı',\n SolarCellEfficiency: 'Güneş Pili Verimliliği',\n NominalOperatingCellTemperature: 'Nominal Çalışma Hücresi Sıcaklığı',\n TemperatureCoefficientOfPmax: 'Pmax Sıcaklık Katsayısı',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Modül Uzunluğu',\n Modules: 'Modüller',\n ModulesLong: 'Modüllerin Uzunluğu',\n LatusRectum: 'Özkiriş',\n OnlyThisParabolicTrough: 'Sadece Seçili Parabolik Oluk',\n AllParabolicTroughsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Parabolik Oluklar',\n AllParabolicTroughs: 'Tüm Parabolik Oluklar',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Soğurucu Boru',\n SelectAbsorberToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Soğurucuyu Seçin',\n ModuleLength: 'Modül Uzunluğu',\n Modules: 'Modüller',\n ModulesLong: 'Modüllerin Uzunluğu',\n OnlyThisFresnelReflector: 'Sadece Seçili Fresnel Reflektör',\n AllFresnelReflectorsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Fresnel Reflektörler',\n AllFresnelReflectors: 'Tüm Fresnel Reflektörler',\n },\n\n heliostatMenu: {\n Tower: 'Kule',\n SelectTowerToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Kuleyi Seçin',\n OnlyThisHeliostat: 'Sadece Seçili Heliostat',\n AllHeliostatsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Heliostatlar',\n AllHeliostats: 'Tüm Heliostatlar',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Alıcı Yapısı',\n CentralPole: 'Merkez Direk',\n CentralPoleWithTripod: 'Tripodlu Merkez Direk',\n Quadrupod: 'Dört Ayaklı',\n RimDiameter: 'Kasnak Çapı',\n LatusRectum: 'Özkiriş',\n ExtraPoleHeightInAdditionToRadius: 'Yarıçapa Ek Olarak Ekstra Direk Yüksekliği',\n OnlyThisParabolicDish: 'Sadece Seçili Parabolik Çanak',\n AllParabolicDishesAboveFoundation: 'Aynı Temel Üzerindeki Tüm Parabolik Çanaklar',\n AllParabolicDishes: 'Tüm Parabolik Çanaklar',\n },\n\n wallMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n SizeOfWall: 'Duvar Boyutu',\n OnlyThisWall: 'Sadece Seçili Duvar',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: ' Aynı Temel Üzerindeki Tüm Duvarlar',\n AllWalls: 'Tüm Duvarlar',\n Windows: 'Pencereler',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Kilitlenmemiş Tüm Pencereleri Kaldır',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: ' Seçili duvardaki tüm pencereleri kaldırmak istiyor musunuz?',\n Doors: 'Kapılar',\n RemoveAllUnlockedDoors: 'Tüm Kilitlenmemiş Kapıları Kaldır',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: ' Seçili duvardaki tüm kapıları kaldırmak istiyor musun?',\n SolarPanels: 'Güneş Panelleri',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Kilitlenmemiş Tüm Güneş Panellerini Kaldır',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:\n ' Seçili duvardaki tüm güneş panellerini kaldırmak istiyor musunuz?',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\n WallStructure: 'Duvar Yapısı',\n DefaultStructure: 'Varsayılan',\n StudStructure: 'Ahşap Dikme',\n PillarStructure: 'Pillar',\n Opacity: 'Opaklık',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Height',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Sadece Bu Pencere',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Pencereler',\n AllWindows: 'Tüm Pencereler',\n Width: 'Genişlik',\n Height: 'Yükseklik',\n Mullion: 'Tiriz',\n MullionWidth: 'Tiriz Genişliği',\n MullionSpacing: 'Tiriz Aralığı',\n MullionColor: 'Mullion Color',\n Tint: 'Ton',\n Opacity: 'Opaklık',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Kepenk',\n LeftShutter: 'Sol Kepenk',\n RightShutter: 'Sağ Kepenk',\n BothShutters: 'Kepenkler',\n ShutterWidth: 'Genişlik',\n ShutterColor: 'Kepenk Rengi',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n OnlyThisRoof: 'Sadece Seçili Çatı',\n AllRoofsAboveFoundation: 'Aynı Temelin Üzerinde Tüm Çatılar',\n AllRoofs: 'Tüm Çatılar',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Mertek Aralığı',\n RafterWidth: 'Mertek Genişliği',\n RafterThickness: 'Mertek Kalınlığı',\n RafterColor: 'Mertek Rengi',\n RoofColor: 'Çatı Rengi',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Cam Tonu',\n Opacity: 'Opaklık',\n RoofStructure: 'Çatı Yapısı',\n DefaultStructure: 'Varsayılan',\n RafterStructure: 'Mertek',\n GlassStructure: 'Cam',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n Texture11: 'Doku 11',\n Texture12: 'Doku 12',\n Texture13: 'Doku 13',\n Texture14: 'Doku 14',\n Texture15: 'Doku 15',\n Texture16: 'Doku 16',\n Texture17: 'Doku 17',\n OnlyThisDoor: 'Sadece Seçili Kapı',\n AllDoorsOnWall: 'Aynı Duvardaki Tüm Kapılar',\n AllDoorsAboveFoundation: 'Aynı Temelin Üstündeki Tüm Kapılar',\n AllDoors: 'Tüm Kapılar',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'Yüksek',\n Low: 'Düşük',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Seçilen heliostat sayısı',\n NumberOfSelectedSolarPanels: 'Seçilen güneş paneli sayısı',\n ElectricityGeneratedDailyBySolarPanels: 'Güneş panellerinin günlük elektrik üretimi',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Renk Kontrastı',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Değiştirmek için yukarı veya aşağı ok butonlarına tıklayınız',\n },\n\n instructionPanel: {\n Rotate: 'Döndürme',\n DragMouse: 'Sol Tık + Sürükle',\n Zoom: 'Yakınlaştırma',\n MouseWheelOrKeys: 'Tekerlek veya Ctrl+[ veya Ctrl+]',\n MouseWheelOrKeysMac: 'Tekerlek veya ⌘+[ veya ⌘+]',\n Pan: 'Ekran Kaydırma',\n HoldCtrlDragMouse: 'Ctrl + Sürükle',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Yeniden Başlat',\n AutoRotate: 'Otomatik Döndürme',\n StartOrStop: 'Başlat veya Durdur (F4)',\n },\n\n mapPanel: {\n ImageOnGround: 'Yüzey Görünümü',\n WeatherStations: 'Referans',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Koordinatlar',\n Zoom: 'Büyüt',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Güneş Paneli Görünüm',\n Observer: 'Gözlemci',\n VantagePoint: 'Referans Noktası',\n ItemizedVisibilityByFields: 'Alana Özel Perspektif',\n TotalVisibility: 'Toplam',\n },\n\n sensorPanel: {\n LightSensor: 'Işık Sensörü',\n WeatherDataFrom: 'Hava Durumu',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Güneş Paneli Günlük Üretim',\n SolarPanelYearlyYield: 'Güneş Paneli Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualSolarPanels: 'Herbir güneş panelinin üretimini göster',\n Profit: 'Kazanç',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolik Oluk Günlük Üretim',\n ParabolicTroughYearlyYield: 'Parabolik Oluk Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualParabolicTroughs: 'Herbir parabolik oluğun üretimini göster',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolik Çanak Günlük Üretim',\n ParabolicDishYearlyYield: 'Parabolik Çanak Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualParabolicDishes: 'Herbir parabolik çanağın üretimini göster',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflektör Günlük Üretim',\n FresnelReflectorYearlyYield: 'Fresnel Reflektör Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualFresnelReflectors: 'Herbir Fresnel yansıtıcısının üretimini göster',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Günlük Üretim',\n HeliostatYearlyYield: 'Heliostat Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualHeliostats: 'Herbir heliostatın üretimini göster',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Kulesi Günlük Üretimi',\n UpdraftTowerYearlyYield: 'Solar Updraft Kulesi Yıllık Üretimi',\n ChimneyAirTemperature: 'Baca Hava Sıcaklığı',\n ChimneyWindSpeed: 'Baca Rüzgar Hızı',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualUpdraftTowers: 'Herbir updraft kulesinin üretimini göster',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Güneş & Saat Ayarları',\n SunAngles: 'Açılar',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'Bulut Dosyalarım',\n GenerateLink: 'Link Oluştur',\n LinkGeneratedInClipBoard: 'Klip Panosunda Oluşturulan Link',\n DoYouReallyWantToDelete: 'Gerçekten silmek istiyor musun?',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Hesap Ayarlarım',\n MyID: 'Bilgilerim',\n ClickToCopyMyID: 'Bilgilerinizi kopyalamak için tıklayın',\n IDInClipBoard: 'Kişisel bilgileriniz kopyalandı ve yapıştırmaya hazır.',\n StoreMyNameInMyFilesWhenSaving: 'Kaydederken, adımı dosyalarıma ekle',\n DoYouReallyWantToShowYourNameInYourFiles: 'Dosyalarınızda isminizin gösterilmesini istiyor musunuz?',\n SignFileDisclaimer: 'Evet ise, isiminiz dosyalarınıza erişimi olan bütün kişiler tarafından görülebilir.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'Kullanıcı Sayısı',\n SchoolID: 'Okul',\n ClassID: 'Sınıf',\n },\n\n weatherPanel: {\n SunshineHours: 'Gündüz Saatleri',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Model Seç',\n Sinusoidal: 'Sinüzoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Ekonomik Parametreler',\n ElectricitySellingPrice: 'Elektrik Satış Fiyatı',\n OperationalCostPerUnit: 'Birim Başına İşletme Maliyeti',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Gökyüzü Açıklığı',\n ShowDaylightResults: 'Gün Işığı Sonuçlarını Göster',\n ShowSkyClearnessResults: 'Gökyüzü Açıklığı Sonuçlarını Göster',\n ShowAverageDailySolarRadiation: 'Günlük ortalama güneş Işınımını göster',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Veri toplamak için sensör yok.',\n NoSolarPanelForAnalysis: 'Analiz için güneş paneli yok.',\n NoObserverForVisibilityAnalysis: 'Görünürlük analizi için gözlemci yok.',\n NoWaterHeaterForAnalysis: 'Analiz için su ısıtıcısı yok',\n NoParabolicDishForAnalysis: 'Analiz için parabolik çanak yok',\n NoParabolicTroughForAnalysis: 'Analiz için parabolik oluk yok.',\n NoFresnelReflectorForAnalysis: 'Analiz için Fresnel reflektörü yok.',\n NoHeliostatForAnalysis: 'Analiz için heliostat yok.',\n NoSolarUpdraftTowerForAnalysis: 'Analiz için Solar Updraft Kulesi yok.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Bulut Dosyası',\n Select: 'Seç',\n AddFoundation: 'Temel Ekle',\n AddWall: 'Duvar Ekle',\n AddWindow: 'Pencere Ekle',\n AddDoor: 'Kapı Ekle',\n AddPyramidRoof: 'Piramit Çatı Ekle',\n AddGableRoof: 'Beşik Çatı Ekle',\n AddHipRoof: 'Kırma Çatı Ekle',\n AddGambrelRoof: 'Flemenk Çatı Ekle',\n AddMansardRoof: 'Mansart Çatı Ekle',\n AddCuboid: 'Kübik Ekle',\n AddSensor: 'Sensör Ekle',\n AddSolarPanel: 'Güneş Paneli Ekle',\n AddWaterHeater: 'Su Isıtıcı Ekle',\n AddParabolicDish: 'Parabolik Çanak Ekle',\n AddParabolicTrough: 'Parabolik Oluk Ekle',\n AddFresnelReflector: 'Fresnel Reflektörü Ekle',\n AddHeliostat: 'Heliostat Ekle',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Ağaç Ekle',\n AddFlower: 'Add flower',\n AddPeople: 'İnsan Ekle',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Ölçeklendirme',\n ClearScene: 'Herşeyi Sil',\n ShowSunAndTimeSettings: 'Güneş & Zaman Ayarlarını Göster',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'İçeriği silmek istiyor musunuz',\n ClickForMoreButtons: 'Daha fazla buton için tıklayın',\n SwitchToAddingFoundation: 'Temel Ekle ',\n SwitchToAddingCuboid: 'Kübik Ekle ',\n SwitchToAddingWall: 'Duvar Ekle',\n SwitchToAddingWindow: \"Pencere Eklemeyi'Aç\",\n SwitchToAddingDoor: 'Kapı Ekle',\n SwitchToAddingPyramidRoof: 'Piramit Çatı Ekle',\n SwitchToAddingGableRoof: 'Beşik Çatı Ekle',\n SwitchToAddingHipRoof: 'Kırma Çatı Ekle',\n SwitchToAddingGambrelRoof: 'Flemenk Çatı Ekle',\n SwitchToAddingMansardRoof: 'Mansart Çatı Ekle',\n SwitchToAddingSolarPanel: 'Güneş Paneli Ekle',\n SwitchToAddingSensor: 'Sensör Ekle',\n SwitchToAddingWaterHeater: 'Su Isıtıcı Ekle',\n SwitchToAddingParabolicDish: 'Parabolik Çanak Ekle',\n SwitchToAddingParabolicTrough: 'Parabolik Oluk Ekle',\n SwitchToAddingFresnelReflector: 'Fresnel Reflektör Ekle',\n SwitchToAddingHeliostat: 'Heliostat Ekle',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Ağaç Ekle',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Kişi Ekle',\n },\n\n tooltip: {\n gotoIFI: 'Yarının Zekası Enstitüsüne Git',\n visitAladdinHomePage: 'Aladdin Ana Sayfasını Ziyaret Edin',\n clickToOpenMenu: 'Ana Menüyü Açmak İçin Tıklayınız',\n clickToAccessCloudTools: 'Bulut Araçlarına Erişmek İçin Tıklayınız',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Kızılcık Ağacı',\n Elm: 'Karaağaç',\n FanPalm: 'Fan Palm',\n Linden: 'Ihlamur Ağacı',\n Magnolia: 'Magnolia',\n Maple: 'Akçaağaç',\n Oak: 'Meşe Ağacı',\n Pine: 'Çam',\n Spruce: 'Alaçam',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Ata',\n Jack: 'Mete',\n Jacob: 'Jacob',\n Jacqueline: 'Beril',\n Jade: 'Ece',\n Jamelia: 'Bilge',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Asya',\n Jaye: 'Aylin',\n Jeanette: 'Jeanette',\n Jedi: 'Alp',\n Jeff: 'Kaya',\n Jena: 'Nehir',\n Jennifer: 'Defne',\n Jess: 'Zeynep',\n Jett: 'Umut',\n Jill: 'Jill',\n Jiya: 'Elif',\n Joan: 'Ezgi',\n Jocelyn: 'Jocelyn',\n Joel: 'Cenk',\n Joey: 'Azra',\n John: 'Can',\n Jonathon: 'Jonathon',\n Jose: 'Mert',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Ozan',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Bulut',\n Jumapili: 'Umay',\n June: 'Naz',\n Juro: 'Efe',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_ua = {\n translation: {\n name: {\n IFI: 'Інститут Інтелекту Майбутнього',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Переосмислення Дизайну з Пояснювальним Штучним Інтелектом - Інститут Інтелекту Майбутнього',\n },\n\n cookie: {\n Statement:\n 'Натиснувши «Прийняти», ви погоджуєтеся з використанням файлів cookie для покращення вашого досвіду з Aladdin.',\n Accept: 'Прийняти',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Цей Продукт Було Створено:',\n TermsOfService: 'Умови Використання',\n PrivacyPolicy: 'Політика Конфіденційності',\n Software: 'Програмне Забезпечення',\n Content: 'Матеріали',\n Research: 'Дослідження',\n Support: 'Підтримка',\n Acknowledgment: 'Подяка',\n FundingInformation:\n 'Національний Науковий Фонд (ННФ, Cполучені Штати Америки) надав фінансову підтримку для дослідження та розробки цього продукту за допомогою грантів №2105695, №2131097, та №#2301164. Однак, будь-які погляди, результати та висновки, висловлені у продукті, належать авторам і можуть не повністю відображати погляди ННФ.',\n Contact: 'Для отримання додаткової інформації, будь ласка, зверніться до Charles Xie (charles@intofuture.org).',\n Translators: 'Переклад',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Текст',\n FontSize: 'Розмір Шрифту',\n FontColor: 'Колір Шрифту',\n Model: ' Модель',\n Models: 'Моделі',\n Upload: 'Завантажити',\n ClickCount: 'Натисніть Підрахувати',\n Share: 'Поділитись',\n AlreadyLike: 'Вподобано',\n Like: 'Вподобати',\n MustLogInToLike: 'Потрібно Увійти, щоб Вподобати',\n AllRightsReserved: 'Усі Права Захищено',\n MeterAbbreviation: 'м',\n Version: 'Версія',\n VersionInitial: 'В',\n Options: 'Опції',\n Maximum: 'Максимум',\n Minimum: 'Мінімум',\n MaximumNumber: 'Максимальне Число',\n MinimumNumber: 'Мінімальне Число',\n MaximumValue: 'Максимальне Значення',\n MinimumValue: 'Мінімальне Значення',\n Or: 'Або',\n None: 'Жоден',\n High: 'Високий',\n Partial: 'Частковий',\n Teacher: 'Вчитель',\n Class: 'Клас',\n Total: 'Всього',\n Leaderboard: 'Таблиця Лідерів',\n Latest: 'Останнє',\n Range: 'Діапазон',\n SIUnit: 'SI Одиниця',\n USUnit: 'US Одиниця',\n ThermalTransmittance: 'Теплопередача',\n ThermalResistance: 'Термічний Опір',\n UValue: 'U-Значення',\n RValue: 'R-Значення',\n VolumetricHeatCapacity: \"Об'ємна Теплоємність\",\n BuildingHVACSystem: 'Побудова Системи Опалення, Вентиляції та Кондиціювання Повітря (ОВК)',\n ThermostatSetpoint: 'Задана Температура Термостата',\n TemperatureToleranceThreshold: 'Порогове Значення Допустимого Відхилення Температури',\n TemperatureToleranceThresholdExplanation:\n 'Обігрівач не працюватиме, якщо найнижча зовнішня температура дня вища за значення отриманe, якщо від заданої температури відняти порогове значення. Кондиціонер не працюватиме, якщо найвища зовнішня температура дня нижча за значення отримане, якщо від заданої температури відняти порогове значення.',\n Press: 'Натиснути',\n Open: 'Відкрити',\n Save: 'Зберегти',\n SaveAsImage: 'Зберегти як Зображення',\n SaveAsCsv: 'Зберегти як CSV',\n Update: 'Оновити',\n Paste: 'Вставити',\n Copy: 'Копіювати',\n Cut: 'Вирізати',\n Delete: 'Видалити',\n Lock: 'Заблокувати',\n Translucent: 'Півпрозорий',\n Color: 'Колір',\n Texture: 'Текстура',\n Size: 'Розмір',\n Thickness: 'Товщина',\n Yes: 'Так',\n No: 'Ні',\n OK: 'ОК',\n Cancel: 'Скасувати',\n Apply: 'Застосувати',\n Close: 'Закрити',\n ApplyTo: 'Застосувати До',\n Run: 'Запустити',\n Pause: 'Пауза',\n Resume: 'Відновити',\n Clear: 'Очистити',\n Warning: 'Попередження',\n Caution: 'Обережно',\n Reminder: 'Нагадування',\n Length: 'Довжина',\n Width: 'Ширина',\n Height: 'Висота',\n Radius: 'Радіус',\n Angle: 'Кут',\n Azimuth: 'Азимут',\n Coordinates: 'Координати',\n Weather: 'Погода',\n Show: 'Показати',\n Animate: 'Анімувати',\n Date: 'Дата',\n Time: 'Час',\n Title: 'Заголовок',\n Owner: 'Власник',\n Action: 'Дія',\n Rename: 'Перейменувати',\n Location: 'Місцезнаходження',\n Latitude: 'Широта',\n Month: 'Місяць',\n Day: 'День',\n Hour: 'Година',\n Daylight: 'Денне світло',\n Radiation: 'Радіаційне Випромінювання',\n Temperature: 'Температура',\n kWh: 'кВт-год',\n dollar: 'долар',\n MeterPerSecond: 'м/с',\n NorthInitial: 'Північ',\n SouthInitial: 'Південь',\n EastInitial: 'Схід',\n WestInitial: 'Захід',\n Fixed: 'Фіксований',\n Elements: 'Елементи',\n Energy: 'Енергія',\n Unknown: 'Невідомо',\n Label: 'Мітка',\n Description: 'Опис',\n NoDescription: 'Без опису',\n MaximumCharacters: 'Максимальна кількість символів',\n Author: 'Автор',\n Publisher: 'Видавець',\n Building: 'Будівля',\n ResidentialBuilding: 'Житлова будівля',\n CommercialBuilding: 'Комерційна будівля',\n SchoolBuilding: 'Шкільна будівля',\n TouristAttraction: \"Туристична визначна пам'ятка\",\n UnderConstruction: 'В стадії будівництва',\n Photovoltaic: 'Фотоелектричний',\n Anonymous: 'Анонімний',\n Nickname: 'Нікнейм',\n Pin: 'Закріпити',\n Unpin: 'Відкріпити',\n },\n\n shared: {\n NoTexture: 'Без текстури',\n FoundationElement: 'Фундамент',\n CuboidElement: 'Паралелепіпед',\n PolygonElement: 'Багатокутник',\n SensorElement: 'Сенсор',\n SolarPanelElement: 'Сонячна панель',\n WaterHeaterElement: 'Водонагрівач',\n ParabolicDishElement: 'Параболічна тарілка',\n ParabolicTroughElement: 'Параболічний сонячний колектор',\n FresnelReflectorElement: 'Відбивач Френеля',\n HeliostatElement: 'Геліостат',\n WindTurbineElement: 'Вітрова турбіна',\n LightElement: 'Світло',\n ElementLocked: 'Заблоковано',\n ModelType: 'Тип моделі',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Модель не знайдено',\n CannotSignIn: 'Не вдається увійти',\n CannotSignOut: 'Не вдається вийти',\n YourAccountWasCreated: 'Ваш обліковий запис був створений',\n CannotCreateAccount: 'Не вдається створити обліковий запис',\n YourAccountSettingsWereSaved: 'Налаштування облікового запису були збережені',\n CannotSaveYourAccountSettings: 'Не вдається зберегти налаштування облікового запису',\n CannotSaveYourFileToCloud: 'Не вдається зберегти ваш файл у хмарному середовищі',\n CannotCreateNewProject: 'Не вдається створити новий проєкт',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Не вдається відкрити ваші проєкти',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'Ця назва була використана. Виберіть іншу',\n CloudFileWithTitleExistsDoYouWantToOverwrite:\n 'Хмарний файл з такою ж назвою вже існує. Ви хочете перезаписати його?',\n CloudFileNotFound: 'Файл у хмарному середовищі не знайдено',\n CannotLoadModelsOnMap: 'Не вдається завантажити моделі на карту',\n CannotLoadLeaderboard: 'Не вдається завантажити таблицю лідерів',\n CannotPublishModelOnMap: 'Не вдається опублікувати модель на карті',\n CannotLikeModelFromMap: 'Не вдається оцінити модель з карти',\n CannotDeleteModelFromMap: 'Не вдається видалити модель з карти',\n ModelDeletedFromMap: 'Модель видалена з карти',\n DoYouWantToDeleteModelFromMap: 'Ви бажаєте видалити модель з карти?',\n CannotOpenCloudFile: 'Не вдається відкрити файл у хмарному середовищі',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Не вдається відкрити папку у хмарному середовищі',\n CannotDeleteCloudFile: 'Не вдається видалити файл у хмарному середовищі',\n CannotRenameCloudFile: 'Не вдається перейменувати файл у хмарному середовищі',\n DoYouWantToSaveChanges: 'Бажаєте зберегти зміни?',\n NotApplicableToSelectedAction: 'Не застосовується до обраної дії',\n ThisElementIsLocked: 'Цей елемент заблокований.',\n ThisCannotBeUndone: 'Це не можна скасувати.',\n AzimuthOfNorthIsZero: 'Азимут півночі дорівнює 0°',\n CounterclockwiseAzimuthIsPositive: 'Азимут є позитивним проти годинникової стрілки.',\n MoveCancelledBecauseOfOverlap: 'Переміщення скасовано через перекриття.',\n MoveOutsideBoundaryCancelled: 'Переміщення за межі скасовано.',\n RotationCancelledBecauseOfOverlap: 'Ротацію скасовано через перекриття.',\n RotationOutsideBoundaryCancelled: 'Ротація за межі скасована.',\n ResizingCancelledBecauseOfOverlap: 'Зміна розміру скасована через перекриття.',\n ResizingOutsideBoundaryCancelled: 'Зміна розміру за межі скасована.',\n CannotPasteOutsideBoundary: 'Не можна вставити за межі.',\n CannotPasteBecauseOfOverlap: 'Не можна вставити через перекриття.',\n CannotMoveObjectTooFar: \"Не можна перемістити об'єкт занадто далеко.\",\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Існуючі сонячні панелі будуть видалені перед застосуванням нового макету.',\n DoYouWantToContinue: 'Бажаєте продовжити?',\n SolarPanelsCannotIntersectWithGround: 'Сонячні панелі не можуть перетинатися з землею.',\n SolarPanelsCannotOverlapWithOneAnother: 'Сонячні панелі не можуть накладатися одна на одну.',\n ScreenshotSaved: 'Знімок екрана збережено.',\n CsvFileSaved: 'CSV файл збережено.',\n SimulationStarted: 'Розпочато симуляцію.',\n SimulationCompleted: 'Симуляцію завершено.',\n SimulationAborted: 'Симуляцію перервано.',\n SimulationPaused: 'Симуляцію призупинено.',\n CancelSimulation: 'Скасувати симуляцію',\n PauseSimulation: 'Призупинити симуляцію',\n ResumeSimulation: 'Продовжити симуляцію',\n SimulationWillNotStartDueToErrors: 'Симуляція не розпочнеться через помилки',\n SimulationWillStartDespiteWarnings: 'Симуляція розпочнеться незважаючи на попередження.',\n EvolutionStarted: 'Еволюцію розпочато.',\n EvolutionCompleted: 'Еволюцію завершено.',\n EvolutionAborted: 'Еволюцію перервано.',\n EvolutionPaused: 'Еволюцію призупинено.',\n EncounterEvolutionError: 'Сталася помилка еволюції.',\n CancelEvolution: 'Скасувати еволюцію',\n PauseEvolution: 'Призупинити еволюцію',\n ResumeEvolution: 'Продовжити еволюцію',\n ConvergenceThresholdHasBeenReached: 'Досягнуто порогове значення збіжності.',\n MaximumNumberOfGenerationsHasBeenReached: 'Досягнуто максимальну кількість поколінь.',\n MaximumNumberOfStepsHasBeenReached: 'Досягнуто максимальну кількість кроків.',\n ObjectiveFunctionTypeError:\n 'Поточна цільова функція не підтримується цією операцією. Будь ласка, розпочніть з меню.',\n WallsAreNotAtSameHeight: 'Стіни не знаходяться на однаковій висоті.',\n WallsAreNotPerpendicular: 'Стіни не перпендикулярні.',\n WallsAreNotConnected: \"Стіни не з'єднані.\",\n WallsNumberNeedToBeFour: 'Кількість стін має дорівнювати чотири.',\n BuildingContainsEmptyWall: 'Будівля містить одну або кілька порожніх стін.',\n BuildingRoofMissing: 'У будівлі відсутній дах.',\n UnknownErrors: 'Невідомі помилки.',\n },\n\n menu: {\n AnalysisOptions: 'Опції аналізу',\n option: {\n GridCellSize: 'Розмір комірки сітки',\n SamplingFrequency: 'Частота вибірки',\n TimesPerHour: 'Разів на годину',\n DaysPerYear: 'Днів на рік',\n },\n mainMenu: 'Головне Меню',\n cloudMenu: 'Меню Хмарного Середовища',\n projectSubMenu: 'Проєкт',\n project: {\n CreateNewProject: 'Створити Новий Проєкт',\n OpenProject: 'Відкрити Проєкт',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'Ви повинні увійти, щоб створити новий проєкт',\n YouMustLogInToOpenProject: 'Ви повинні увійти, щоб відкрити проєкт',\n },\n fileSubMenu: 'Файл',\n file: {\n CreateNewFile: 'Створити новий',\n OpenLocalFile: 'Відкрити локально',\n SaveAsLocalFile: 'Зберегти як',\n SavingAbortedMustHaveValidFileName: \"Збереження перервано! Вам потрібно мати дійсне ім'я файлу\",\n OpenCloudFile: 'Відкрити у хмарному середовищі',\n SaveCloudFile: 'Зберегти у хмарному середовищі',\n SaveAsCloudFile: 'Зберегти у хмарному середовищі',\n SavingAbortedMustHaveValidTitle: 'Збереження перервано! Вам потрібно мати дійсний заголовок для хмарного файлу',\n ToSaveYourWorkPleaseSignIn: 'Щоб зберегти вашу роботу, будь ласка, увійдіть в систему.',\n TakeScreenshot: 'Зробити знімок екрана',\n UseCloudFileName: \"Використовувати ім'я файлу у хмарному середовищі\",\n PublishOnModelsMap: 'Опублікувати на карті моделей',\n PublishedOnModelsMap: 'Вашу модель було опубліковано на карті моделей',\n UpdatedOnModelsMap: 'Ваша модель була оновлена на карті моделей',\n YouMustLogInToPublishYourModel: 'Вам потрібно увійти в систему, щоб опублікувати свою модель',\n YouCannotPublishAModelThatYouDoNotOwn: 'Ви не можете опублікувати модель, якою не володієте',\n YouMustSaveModelOnCloudBeforePublishingIt:\n 'Вам потрібно зберегти модель у хмарному середовищі перед її публікацією',\n },\n editSubMenu: 'Редагувати',\n edit: {\n Undo: 'Скасувати',\n Redo: 'Повторити',\n },\n viewSubMenu: 'Перегляд',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D Вигляд',\n ResetView: 'Скинути',\n ZoomIn: 'Збільшити масштаб',\n ZoomOut: 'Зменшити масштаб',\n AutoRotate: 'Автоматичний поворот',\n ShowShadow: 'Показати тінь',\n ShowSurfaceShininess: 'Показати блиск поверхні',\n TranslucentFloatingWindows: 'Напівпрозорі плаваючі вікна',\n accessoriesSubMenu: 'Додаткові елементи',\n accessories: {\n SiteInformation: 'Інформація про місце',\n DesignInformation: 'Інформація про дизайн',\n Instruction: 'Інструкція',\n StickyNote: 'Примітка',\n Note: 'Примітка',\n },\n },\n settingsSubMenu: 'Налаштування',\n settings: {\n WeatherData: 'Дані про погоду',\n DiurnalTemperature: 'Добова температура',\n Heliodon: 'Геліодон',\n SunAndTime: 'Сонце та час',\n },\n benchmarksSubMenu: 'Бенчмарки',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Прогнозування сонячної радіації порівняно з вимірюванням',\n BESTESTCase600: 'Тестування енергоефективності будівель: BESTEST Case 600',\n BESTESTCase610: 'Тестування енергоефективності будівель: BESTEST Case 610',\n BESTESTCase620: 'Тестування енергоефективності будівель: BESTEST Case 620',\n BESTESTCase630: 'Тестування енергоефективності будівель: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Товщина лінії',\n SymbolSize: 'Розмір символу',\n BarCategoryGap: 'Відступ категорій стовпців',\n ShowHorizontalGridLines: 'Показати горизонтальні лінії сітки',\n ShowVerticalGridLines: 'Показати вертикальні лінії сітки',\n },\n analysisSubMenu: 'Аналіз',\n physicsSubMenu: 'Фізика',\n physics: {\n DailySolarRadiationHeatmap: 'Щоденна карта сонячної радіації',\n SolarRadiationHeatmapOptions: 'Параметри карти сонячної радіації',\n SolarRadiationHeatmapGridCellSize: 'Розмір комірки на карті сонячної радіації',\n SolarRadiationHeatmapMaxValue: 'Максимальне значення на карті',\n SolarRadiationHeatmapNoAnimation: 'Немає анімації для статичної моделі',\n ReflectionHeatmap: 'Карта відображень',\n },\n sensorSubMenu: 'Датчик',\n sensor: {\n CollectDailyData: 'Збирати щоденні дані',\n CollectYearlyData: 'Збирати щорічні дані',\n SensorSimulationNoAnimation: 'Немає анімації для збору даних датчика',\n },\n buildingSubMenu: 'Будівля',\n building: {\n AnalyzeDailyBuildingEnergy: 'Аналізувати щоденну енергію будівлі',\n AnalyzeYearlyBuildingEnergy: 'Аналізувати щорічну енергію будівлі',\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\n EnergyGridCellSize: 'Розмір комірки сітки',\n BuildingEnergySimulationNoAnimation: 'Немає анімації симулювати енергію будівлі',\n },\n solarPanelSubMenu: 'Сонячна панель',\n solarPanel: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n AnalyzeVisibility: 'Аналізувати видимість',\n PanelDiscretization: 'Дискретизація панелі',\n Exact: 'Точний',\n Approximate: 'Наближений',\n EnergyGridCellSize: 'Розмір комірки сітки енергії',\n VisibilityGridCellSize: 'Розмір комірки сітки коефіцієнта видимості',\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\n VisibilityAnalysisOptions: 'Параметри аналізу видимості',\n SolarPanelSimulationNoAnimation: 'Немає анімації для симуляції сонячної панелі',\n },\n parabolicTroughSubMenu: 'Параболічний сонячний колектор',\n parabolicTrough: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n parabolicDishSubMenu: 'Параболічний диск',\n parabolicDish: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n fresnelReflectorSubMenu: 'Відбивач Френеля',\n fresnelReflector: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n heliostatSubMenu: 'Геліостат',\n heliostat: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n solarUpdraftTowerSubMenu: 'Сонячна вежа з використаним повітрям',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n SolarUpdraftTowerSimulationNoAnimation: 'Немає анімації симулювати сонячну вежу з використаним повітрям',\n },\n\n tutorialsSubMenu: 'Посібники',\n\n solarEnergyScienceSubMenu: 'Сонячна наука',\n solarEnergyScienceTutorials: {\n SunAngles: 'Кути сонця відносно спостерігача на землі',\n InsolationAndClimate: 'Інсоляція та клімат',\n SolarRadiationToBox: 'Сонячна радіація в коробку',\n },\n\n buildingScienceSubMenu: 'Наука про будівлі',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Теплозахисна оболонка проти будівельної оболонки',\n EffectOfSizeOnBuildingEnergy: 'Вплив розміру на енергію будівлі',\n EffectOfOrientationOnBuildingEnergy: 'Вплив орієнтації на енергію будівлі',\n EffectOfInsulationOnBuildingEnergy: 'Вплив інсоляції на енергію будівлі',\n EffectOfRoofColorOnBuildingEnergy: 'Вплив кольору даху на енергію будівлі',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Вплив довжини виступу карнизу на енергію будівлі',\n EffectOfWindowSHGCOnBuildingEnergy: 'Вплив коефіцієнта сонячного теплозиску вікна на енергію будівлі',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Вплив заданої температури на термостаті на енергію будівлі',\n EffectOfSolarPanelsOnBuildingEnergy: 'Вплив сонячних панелей на енергію будівлі',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Вплив температури грунту на енергію будівлі',\n EffectOfTreesOnBuildingEnergy: 'Вплив дерев на енергію будівлі',\n },\n\n buildingDesignSubMenu: 'Дизайн будівлі',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Будинок у стилі Кейп Код з пристроєм типу \"шед-дормер\"',\n MansardRoofWithDormers: 'Мансарда з горизонтальними пристроями',\n GableRoofVsHipRoof: 'Схиловий дах проти двосхилих дахів',\n ColonialVsSaltbox: 'Колоніальний стиль проти стилю Saltbox',\n GambrelRoofVsMansardRoof: 'Півшаровий дах проти мансардного даху',\n CombinationRoofVsBonnetRoof: 'Комбінований дах проти капотного даху',\n DutchGableRoof: 'Голландський дах з рикетом',\n GableAndValleyRoof: 'Схиловий та долинний дах',\n ClerestoryRoof: 'Клересторний дах',\n MonitorRoof: 'Моніторний дах',\n AFrameHouse: 'Будинок у формі літери \"А\"',\n HalfTimberedHouse: \"Будинок з напівдерев'яними стінами\",\n AllBasicRoofTypes: 'Усі основні типи дахів',\n },\n\n photovoltaicSolarPowerSubMenu: 'Фотоелектрична сонячна енергія',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Вплив кута нахилу сонячної панелі',\n EffectOfAzimuthOfSolarPanel: 'Вплив азимуту сонячної панелі',\n SolarPanelTypes: 'Типи сонячних панелей',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Сонячні трекери',\n CoveringGroundWithSolarPanels: 'Чому просто покриття землі сонячними панелями - не найкраща ідея',\n InterRowSpacingOfSolarPanelArray: 'Вплив міжрядного простору в масиві сонячних панелей',\n EffectOfOrientationOfSolarPanels: 'Вплив орієнтації сонячних панелей',\n SolarPanelArrayAutomaticLayout: 'Автоматичне розміщення масиву сонячних панелей',\n },\n\n concentratedSolarPowerSubMenu: 'Концентрована сонячна енергія',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Вплив азимуту параболічного сонячного колектора',\n EffectOfLatusRectumOfParabolicTrough: 'Вплив прямої лінії на параболічний сонячний колектор',\n FocusSunlightWithParabolicDish: 'Фокусування сонячного світла за допомогою параболічного диску',\n LinearFresnelReflectors: 'Лінійні відбивачі Френеля',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Вплив висоти поглинаючої трубки на лінійні відбивачі Френеля',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Вплив азимуту на лінійні відбивачі Френеля',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Лінійні відбивачі Френеля з двома поглинаючими елементами',\n CosineEfficiencyOfHeliostats: 'Косинусна ефективність геліостатів',\n ShadowingAndBlockingOfHeliostats: 'Затінення та блокування геліостатів',\n EffectSolarPowerTowerHeight: 'Вплив висоти сонячної вежі з використаним повітрям',\n SolarPowerTower: 'Сонячна вежа з використаним повітрям',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Інші типи сонячної енергії',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Сонячна вежа з використаним повітрям',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Приклади',\n\n solarEnergySubMenu: 'Сонячна енергія',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Промінь сонця та геліодон',\n RooftopSolarPanels: 'Сонячні панелі на даху',\n NevadaSolarOneParabolicTroughArray: 'Масив параболічних сонячних колекторів Nevada Solar One',\n TooeleParabolicDishArray: 'Масив параболічних тарілок Tooele',\n PS10SolarPowerTower: 'Сонячна енергетична вежа PS10',\n TucsonLinearFresnelReflectors: 'Лінійні відбивачі Френеля в Tucson',\n SolarCanopyFormFactors: 'Форми сонячних козирків',\n SolarCanopyOverBleachers: 'Сонячний козирок над трибунами',\n SolarCanopyOverGarage: 'Сонячний козирок над гаражем',\n SolarBusStop: 'Сонячна автобусна зупинка',\n SolarFacadeTesla: 'Сонячна фасадна панель Tesla',\n BuildingIntegratedPhotovoltaics: 'Вбудовані фотоелектричні системи в будівлі',\n Floatovoltaics: 'Сонячні панелі на плавучих платформах',\n Agrivoltaics: 'Агровольтаїка',\n VegetativeBuffer: 'Вегетативна зона',\n RainbowSwashSolarFarmBostonMA: 'Сонячна ферма Rainbow Swash в Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Сонячна ферма Міккі Мауса в Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Сонячні панелі над каналом в Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: \"Сонячний шумовий бар'єр в Lexington, MA\",\n HSATSolarTrackersRaleighNC: 'Сонячні трекери з горизонтальною віссю в Raleign, NC',\n AADATSolarTrackersLancasterCA: 'Сонячні трекери з азимутальною-вертикальною віссю в Lancaster, CA',\n SolarUpdraftTowerInCity: 'Сонячна вежа з використаним повітрям у місті',\n },\n\n builtEnvironmentSubMenu: 'Забудоване середовище',\n residentialBuildingsSubMenu: 'Житлові будівлі',\n residentialBuildingExamples: {\n ColonialHouse: 'Колоніальний будинок',\n DutchColonialHouse: 'Голландський колоніальний будинок',\n TShapedHouse: 'Будинок у формі літери Т',\n CapeCodHouseWithGarage: 'Будинок у стилі Cape Cod з гаражем',\n Solarium: 'Солярій',\n Church1: 'Церква 1',\n Cathedral1: 'Собор 1',\n Cathedral2: 'Собор 2',\n Mosque1: 'Мечеть 1',\n AdobeTaosHouse: 'Будинок з адобе в стилі Taos',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Будинок в стилі Bonnet',\n BarnStyleHouse: 'Будинок у стилі амбара',\n ModernHouse: 'Сучасний будинок',\n ButterflyRoofHouse: 'Будинок з метеликовим дахом',\n },\n commercialBuildingsSubMenu: 'Комерційні будівлі',\n commercialBuildingExamples: {\n WhiteHouse: 'Білий Дім',\n BilimMersinTurkiye: 'Bilim, Mersin, Туреччина',\n SpanishStyleHotel: 'Готель в іспанському стилі',\n ApartmentBuilding: 'Багатоквартирний будинок',\n OfficeBuilding: 'Офісна будівля',\n Hotel: 'Готель',\n },\n buildingComplexesSubMenu: 'Будівельні комплекси',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, Vermont',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, New Mexico',\n },\n urbanPlanningSubMenu: 'Міське планування',\n urbanPlanningExamples: {\n Heatmap1: 'Теплова карта',\n },\n otherBuildingsSubMenu: 'Інші будівлі',\n otherBuildingExamples: {\n Greenhouse: 'Теплиця',\n Pavilion: 'Павільйон у парку',\n OctagonalPagoda: 'Восьмикутна пагода',\n OceanFront: 'Будівля біля океану',\n EgyptianPyramids: 'Єгипетські піраміди',\n MayanPyramid: 'Піраміда Мая',\n SiOSePol: 'Si-O-Se-Pol',\n StackedCuboids: 'Стековані кубоїди',\n },\n\n artificialIntelligenceSubMenu: 'Штучний інтелект',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Оптимізація кута нахилу одного ряду сонячних панелей',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Оптимізація кутів нахилу декількох рядів сонячних панелей',\n SolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми',\n SolarFarmGenerativeDesignWithBlock: 'Генеративний дизайн сонячної ферми в присутності перешкоди',\n FitchburgSolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми у Fitchburg',\n },\n languageSubMenu: 'Мова',\n publicSubMenu: 'Загальнодоступно',\n ModelsGallery: 'Галерея моделей',\n ModelsMap: 'Карта моделей',\n AboutUs: 'Про нас',\n },\n\n avatarMenu: {\n AccountSettings: 'Налаштування облікового запису',\n PrivacyInfo:\n \"Коли ви увійдете, ваш Google ID використовується для створення та доступу до вашого облікового запису Aladdin.\\nВ нашій базі даних зберігається лише випадковий алфавітно-цифровий рядок як посилання.\\nМи ніколи не збираємо особисто ідентифіковану інформацію, таку як ваше ім'я або електронна пошта.\\nДля отримання додаткової інформації ознайомтесь з нашою Політикою Конфіденційності:\\nhttps://intofuture.org/aladdin-privacy.html\",\n SignIn: 'Увійти',\n SignOut: 'Вийти',\n IfYouAreAStudent: 'Якщо ви студент',\n },\n\n skyMenu: {\n Axes: 'Вісі',\n Theme: 'Тематика',\n ThemeDefault: 'За замовчуванням',\n ThemeDesert: 'Пустеля',\n ThemeDune: 'Дюна',\n ThemeForest: 'Ліс',\n ThemeGrassland: 'Степ',\n ThemeHill: 'Пагорб',\n ThemeLake: 'Озеро',\n ThemeMountain: 'Гора',\n ThemeRural: 'Сільська місцевість',\n SunlightAttenuationCoefficientInAir: 'Коефіцієнт затухання сонячного світла у повітрі',\n ConvectiveCoefficientOfAir: 'Коефіцієнт конвекції повітря',\n HighestTemperatureTimeInMinutes: 'Час найвищої температури (хвилини)',\n SelectSunAnglesToShow: 'Виберіть кути сонця, які показати',\n ShowAzimuthAngle: 'Показати азимутний кут',\n ShowElevationAngle: 'Показати висотний кут',\n ShowZenithAngle: 'Показати зенітний кут',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Рослинність',\n LeafOutDay: 'День розпускання листя',\n LeafOffDay: 'День опадання листя',\n Albedo: 'Альбедо',\n ImageOnGround: 'Зображення на поверхні',\n WaterSurface: 'Поверхня води',\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Видалити всіх розблокованих людей',\n RemoveAllUnlockedFoundations: 'Видалити всі розблоковані фундаменти',\n RemoveAllUnlockedCuboids: 'Видалити всі розблоковані кубоїди',\n DoYouReallyWantToRemoveAllPeople: 'Ви дійсно хочете видалити всіх людей, що не заблоковані',\n DoYouReallyWantToRemoveAllTrees: 'Ви дійсно хочете видалити всі дерева, що не заблоковані',\n DoYouReallyWantToRemoveAllFlowers: 'Ви дійсно хочете видалити всі квіти, що не заблоковані',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Ви дійсно хочете видалити всі фундаменти, що не заблоковані',\n DoYouReallyWantToRemoveAllCuboids: 'Ви дійсно хочете видалити всі кубоїди, що не заблоковані',\n LockAllElements: 'Заблокувати всі елементи',\n UnlockAllElements: 'Розблокувати всі елементи',\n },\n\n labelSubMenu: {\n Label: 'Мітка',\n LabelText: 'Текст мітки',\n LabelHeight: 'Висота мітки',\n LabelSize: 'Розмір мітки',\n LabelFontSize: 'Розмір шрифту',\n LabelColor: 'Колір мітки',\n KeepShowingLabel: 'Залишати видимою мітку',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Видалити всі незаблоковані сонячні панелі',\n RemoveAllUnlockedParabolicTroughs: 'Видалити всі незаблоковані параболічні сонячні колектори',\n RemoveAllUnlockedParabolicDishes: 'Видалити всі незаблоковані параболічні антени',\n RemoveAllUnlockedFresnelReflectors: 'Видалити всі незаблоковані відбивачі Френеля',\n RemoveAllUnlockedHeliostats: 'Видалити всі незаблоковані геліостати',\n RemoveAllUnlockedSensors: 'Видалити всі незаблоковані датчики',\n RemoveAllUnlockedLights: 'Видалити всі незаблоковані освітлювальні прилади',\n RemoveAllUnlockedWalls: 'Видалити всі незаблоковані стіни',\n RemoveAllUnlockedWindows: 'Видалити всі незаблоковані вікна',\n RemoveAllUnlockedDoors: 'Видалити всі незаблоковані двері',\n RemoveAllUnlockedPolygons: 'Видалити всі незаблоковані полігони',\n RemoveAllUnlockedHumans: 'Видалити всіх незаблокованих людей',\n RemoveAllUnlockedTrees: 'Видалити всі незаблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі незаблоковані квіти',\n Racks: 'Стелажі',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n SolarPanels: 'Сонячні панелі',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому фундаменті, які не є заблокованими',\n ParabolicTroughs: 'Параболічні сонячні колектори',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Ви дійсно бажаєте видалити всі параболічні сонячні колектори на цьому фундаменті, які не є заблокованими',\n ParabolicDishes: 'Параболічні антени',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Ви дійсно бажаєте видалити всі параболічні антени на цьому фундаменті, які не є заблокованими',\n FresnelReflectors: 'Відбивачі Френеля',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі відбивачі Френеля на цьому фундаменті, які не є заблокованими',\n Heliostats: 'Геліостати',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Ви дійсно бажаєте видалити всі геліостати на цьому фундаменті, які не є заблокованими',\n Sensors: 'Датчики',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі датчики на цьому фундаменті, які не є заблокованими',\n Lights: 'Світильники',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Ви дійсно бажаєте видалити всі світильники на цьому фундаменті, які не є заблокованими',\n Walls: 'Стіни',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Ви дійсно бажаєте видалити всі стіни на цьому фундаменті, які не є заблокованими',\n Windows: 'Вікна',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Ви дійсно бажаєте видалити всі вікна на цьому фундаменті, які не є заблокованими',\n Doors: 'Двері',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі двері на цьому фундаменті, які не є заблокованими',\n Polygons: 'Багатокутники',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Ви дійсно бажаєте видалити всі багатокутники на цьому фундаменті, які не є заблокованими',\n Humans: 'Люди',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Ви дійсно бажаєте видалити всіх людей на цьому фундаменті, які не є заблокованими',\n Trees: 'Дерева',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Ви дійсно бажаєте видалити всі дерева на цьому фундаменті, які не є заблокованими',\n Flowers: 'Квіти',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Ви дійсно бажаєте видалити всі квіти на цьому фундаменті, які не є заблокованими',\n OnlyThisFoundation: 'Тільки цей фундамент',\n AllConnectedFoundations: 'Всі пов’язані фундаменти',\n AllFoundations: 'Всі фундаменти',\n AddPolygon: 'Додати багатокутник',\n SolarStructure: 'Вибрати сонячну структуру',\n GroupMaster: 'Груповий майстер',\n LockAllElementsOnThisFoundation: 'Заблокувати всі елементи на цьому фундаменті',\n UnlockAllElementsOnThisFoundation: 'Розблокувати всі елементи на цьому фундаменті',\n GroundFloorRValue: 'Теплопровідність перекриття цокольного поверху',\n OnlyThisGroundFloor: 'Тільки цокольний поверх',\n AllGroundFloors: 'Всі цокольні поверхи',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Вежа приймача для геліостатів',\n ReceiverTowerPhysicalProperties: 'Фізичні властивості вежі приймача',\n ReceiverTowerHeight: 'Висота вежі приймача',\n ReceiverTowerRadius: 'Радіус вежі приймача',\n ReceiverAbsorptance: 'Поглинання приймача',\n ReceiverOpticalEfficiency: 'Оптична ефективність приймача',\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Трубопровід для відбивачів Френеля',\n AbsorberPipePhysicalProperties: 'Фізичні властивості трубопроводу поглинання',\n AbsorberHeight: 'Висота трубопроводу поглинання',\n AbsorberApertureWidth: 'Ширина отвору трубопроводу поглинання',\n AbsorberPipePoleNumber: 'Кількість полюсів для трубопроводу поглинання',\n AbsorberAbsorptance: 'Сила поглинання',\n AbsorberOpticalEfficiency: 'Оптична ефективність поглинача',\n AbsorberThermalEfficiency: 'Теплова ефективність поглинача',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Сонячна вежа з тяговим потоком',\n SolarUpdraftTowerPhysicalProperties: 'Фізичні властивості сонячної вежі з тяговим потоком',\n SolarUpdraftTowerChimneyHeight: 'Висота димової труби сонячної вежі з тяговим потоком',\n SolarUpdraftTowerChimneyRadius: 'Радіус димової труби сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorHeight: 'Висота колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorRadius: 'Радіус колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorTransmissivity: 'Проникність колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorEmissivity: 'Випромінюваність колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerDischargeCoefficient: 'Коефіцієнт викиду сонячної вежі з тяговим потоком',\n SolarUpdraftTowerTurbineEfficiency: 'Ефективність турбіни сонячної вежі з тяговим потоком',\n },\n\n cuboidMenu: {\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\n RemoveAllUnlockedHumans: 'Видалити всіх розблокованих людей',\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\n Racks: 'Стійки',\n SolarPanels: 'Сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому кубоїді, які не заблоковані',\n Sensors: 'Сенсори',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Ви дійсно бажаєте видалити всі сенсори на цьому кубоїді, які не заблоковані',\n Polygons: 'Полігони',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Ви дійсно бажаєте видалити всі полігони на цьому кубоїді, які не заблоковані',\n Humans: 'Люди',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Ви дійсно бажаєте видалити всіх людей на цьому кубоїді, які не заблоковані',\n Trees: 'Дерева',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Ви дійсно бажаєте видалити всі дерева на цьому кубоїді, які не заблоковані',\n Flowers: 'Квіти',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Ви дійсно бажаєте видалити всі квіти на цьому кубоїді, які не заблоковані',\n OnlyThisCuboid: 'Тільки цей кубоїд',\n AllCuboidsOnSameSurface: 'Усі кубоїди на одній поверхні',\n AllCuboidsAboveSameBase: 'Усі кубоїди над тією ж основою',\n AllCuboids: 'Всі кубоїди',\n OnlyThisSide: 'Тільки ця сторона',\n AllSidesOfThisCuboid: 'Всі сторони цього кубоїда',\n AllSidesOfAllCuboids: 'Всі сторони всіх кубоїдів',\n AddPolygon: 'Додати полігон',\n Stackable: 'Стекабельне',\n GroupMaster: 'Майстер групи',\n },\n\n polygonMenu: {\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n TextBox: 'Текстове поле',\n FontOutlineColor: 'Колір контуру шрифту',\n FontOutlineWidth: 'Товщина контуру шрифту',\n FontStrokeColor: 'Колір обводки шрифту',\n FontStrokeWidth: 'Товщина обводки шрифту',\n NoOutline: 'Без контуру',\n Shiny: 'Блискучий',\n Filled: 'Заповнений',\n FillTexture: 'Текстура заповнення',\n FillColor: 'Колір заповнення',\n Opacity: 'Прозорість',\n LineColor: 'Колір лінії',\n LineWidth: 'Товщина лінії',\n LineStyle: 'Стиль лінії',\n SolidLine: 'Суцільна лінія',\n DashedLine: 'Пунктирна лінія',\n DottedLine: 'Точкова лінія',\n InsertVertexBeforeIndex: 'Вставити вершину перед індексом',\n InsertVertexAfterIndex: 'Вставити вершину після індексу',\n DeleteVertex: 'Видалити вершину',\n OnlyThisPolygon: 'Тільки цей полігон',\n AllPolygonsOnSurface: 'Всі полігони на цій поверхні',\n AllPolygonsAboveFoundation: 'Всі полігони вище фундаменту',\n AllPolygons: 'Всі полігони',\n Layout: 'Розташування',\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\n SolarPanelArrayLayoutParametricDesign: 'Розташування сонячних панелей: параметричний дизайн',\n SolarPanelArrayLayoutGenerativeDesign: 'Розташування сонячних панелей: генеративний дизайн',\n SolarPanelArrayModel: 'Модель сонячної панелі',\n SolarPanelArrayOrientation: 'Орієнтація',\n SolarPanelArrayTiltAngle: 'Кут нахилу',\n SolarPanelArrayRowWidth: 'Ширина ряду',\n SolarPanelArrayInterRowSpacing: 'Міжрядковий інтервал',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Вісь ряду',\n SolarPanelArrayLeftRightRowAxis: 'Наліво-Направо (відносне)',\n SolarPanelArrayUpDownRowAxis: 'Вгору-Вниз (відносне)',\n SolarPanelArrayEastWestRowAxis: 'Схід-Захід (абсолютне)',\n SolarPanelArrayNorthSouthRowAxis: 'Північ-Південь (абсолютне)',\n SolarPanelArrayMargin: 'Відступ',\n SolarPanelArrayPoleHeight: 'Висота стовпа',\n SolarPanelArrayPoleSpacing: 'Інтервал між стовпами',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'Це розташування не приймається. Будь ласка, перевірте ваші параметри.',\n },\n\n optimizationMenu: {\n Optimization: 'Оптимізація',\n Parameters: 'Параметри',\n Variables: 'Змінні',\n Constants: 'Константи',\n GeneticAlgorithm: 'Генетичний алгоритм',\n GeneticAlgorithmSettings: 'Налаштування генетичного алгоритму',\n ParticleSwarmOptimization: 'Оптимізація роєм частинок',\n ParticleSwarmOptimizationSettings: 'Налаштування оптимізації роєм частинок',\n SolarPanelTiltAngleOptimization: 'Оптимізація кута нахилу сонячних панелей',\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\n Generation: 'Покоління',\n Gene: 'Ген',\n NormalizedVariables: 'Нормалізовані змінні',\n Objective: 'Ціль',\n ObjectiveFunctionDailyTotalYield: 'Щоденний загальний дохід',\n ObjectiveFunctionYearlyTotalYield: 'Щорічний загальний дохід',\n ObjectiveFunctionDailyMeanYield: 'Щоденний середній дохід',\n ObjectiveFunctionYearlyMeanYield: 'Щорічний середній дохід',\n ObjectiveFunctionDailyProfit: 'Щоденний прибуток',\n ObjectiveFunctionYearlyProfit: 'Щорічний прибуток',\n GeneticAlgorithmSelectionMethod: 'Метод вибору для генетичного алгоритму',\n RouletteWheel: 'Велосипедне колесо',\n Tournament: 'Турнір',\n SearchMethod: 'Метод пошуку',\n GlobalSearchUniformSelection: 'Глобальний пошук з однорідним вибором',\n LocalSearchRandomOptimization: 'Локальний пошук випадкової оптимізації',\n PopulationSize: 'Розмір населення',\n MaximumGenerations: 'Максимальна кількість поколінь',\n SelectionRate: 'Швидкість відбору',\n CrossoverRate: 'Швидкість схрещування',\n MutationRate: 'Швидкість мутації',\n Step: 'Крок',\n SwarmSize: 'Розмір рою',\n MaximumSteps: 'Максимальна кількість кроків',\n MaximumVelocity: 'Максимальна швидкість',\n InertiaWeight: 'Вага інерції',\n CognitiveCoefficient: 'Коефіцієнт когнітивної функції',\n SocialCoefficient: 'Коефіцієнт соціальної взаємодії',\n ConvergenceThreshold: 'Поріг збіжності для завершення',\n LocalSearchRadius: 'Радіус локального пошуку',\n RowsPerRackRange: 'Діапазон для рядів на стелаж',\n TiltAngleRange: 'Діапазон для кута нахилу',\n InterRowSpacingRange: 'Діапазон для міжрядкового проміжку',\n ClickTargetPolygonToActivate: 'Натисніть на цільовий полігон для активації',\n ClickTargetFoundationToActivate: 'Натисніть на цільовий фундамент для активації',\n },\n\n treeMenu: {\n ShowModel: 'Показати модель',\n Flip: 'Перевернути',\n Type: 'Тип',\n Spread: 'Розповсюдження',\n },\n\n flowerMenu: {\n Flip: 'Перевернути',\n Type: 'Тип',\n Spread: 'Розповсюдження',\n },\n\n peopleMenu: {\n ChangePerson: 'Змінити особу',\n Flip: 'Перевернути',\n Observer: 'Спостерігач',\n ViewFromThisPerson: 'Переглянути з цієї особи',\n },\n\n lightMenu: {\n Color: 'Колір',\n Intensity: 'Інтенсивність',\n Decay: 'Затухання',\n MaximumDistance: 'Максимальна відстань',\n Inside: 'Усередині',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Відносний азимут',\n Pole: 'Стовп',\n PoleHeight: 'Висота стовпа',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Додаткова висота стовпа',\n ExtraPoleHeightInAdditionToHalfWidth: 'Додаткова висота стовпа на додаток до половини ширини',\n DrawSunBeam: 'Намалювати промінь сонця',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Відбивання відбивача',\n ReceiverAbsorptance: 'Поглинання приймача',\n ReflectorOpticalEfficiency: 'Оптична ефективність відбивача',\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Змінити модель',\n Orientation: 'Орієнтація',\n Portrait: 'Вертикальна',\n Landscape: 'Горизонтальна',\n FrameColor: 'Колір рамки',\n Panels: 'панелі',\n PanelsWide: 'панелі по ширині',\n PanelsLong: 'панелі по довжині',\n TiltAngle: 'Кут нахилу',\n SouthFacingIsPositive: 'Південь вважається позитивним',\n Tracker: 'Трекер',\n SolarTrackerFollowsSun: 'Трекер слідкує за сонцем для збільшення виходу сонячних панелей.',\n PoleSpacing: 'Відстань між стовпами',\n NoTracker: 'Без трекера',\n HorizontalSingleAxisTracker: 'Трекер з горизонтальною одноосевою орієнтацією',\n VerticalSingleAxisTracker: 'Трекер з вертикальною одноосевою орієнтацією',\n AltazimuthDualAxisTracker: 'Трекер з азимутально-альтазимутальною двоосевою орієнтацією',\n OnlyThisSolarPanel: 'Тільки ця сонячна панель',\n AllSolarPanelsOnSurface: 'Всі сонячні панелі на одній поверхні',\n AllSolarPanelsAboveFoundation: 'Всі сонячні панелі над однією фундаментом',\n AllSolarPanels: 'Всі сонячні панелі',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Технічні характеристики сонячної панелі',\n Model: 'Модель',\n PanelSize: 'Розмір панелі',\n Cells: 'Комірки',\n CellType: 'Тип комірок',\n Monocrystalline: 'Монокристалічні',\n Polycrystalline: 'Полікристалічні',\n ThinFilm: 'Тонкоплівкові',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Чорний',\n Blue: 'Синій',\n ShadeTolerance: 'Стійкість до затінення',\n SolarCellEfficiency: 'Ефективність сонячної комірки',\n NominalOperatingCellTemperature: 'Номінальна робоча температура комірки',\n TemperatureCoefficientOfPmax: 'Температурний коефіцієнт Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Довжина модуля',\n Modules: 'модулі',\n ModulesLong: 'модулів у довжину',\n LatusRectum: 'Велика піввісь',\n OnlyThisParabolicTrough: 'Тільки цей параболічний сонячний колектор',\n AllParabolicTroughsAboveFoundation: 'Усі параболічні сонячні колектори над цим фундаментом',\n AllParabolicTroughs: 'Усі параболічні сонячні колектори',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Труба поглинання',\n SelectAbsorberToReflectSunlightTo: 'Виберіть поглинач, до якого буде відбиватися сонячне світло',\n ModuleLength: 'Довжина модуля',\n Modules: 'модулі',\n ModulesLong: 'модулів у довжину',\n OnlyThisFresnelReflector: 'Тільки цей відбивач Френеля',\n AllFresnelReflectorsAboveFoundation: 'Усі відбивачі Френеля над цим фундаментом',\n AllFresnelReflectors: 'Усі відбивачі Френеля',\n },\n\n heliostatMenu: {\n Tower: 'Вежа',\n SelectTowerToReflectSunlightTo: 'Виберіть вежу, до якої буде відбиватися сонячне світло',\n OnlyThisHeliostat: 'Тільки цей геліостат',\n AllHeliostatsAboveFoundation: 'Усі геліостати над цим фундаментом',\n AllHeliostats: 'Усі геліостати',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Структура приймача',\n CentralPole: 'Центральний стовп',\n CentralPoleWithTripod: 'Центральний стовп з триногою',\n Quadrupod: 'Чотиринога',\n RimDiameter: 'Діаметр ободу',\n LatusRectum: 'Велика піввісь',\n ExtraPoleHeightInAdditionToRadius: 'Додаткова висота стовпа плюс радіус',\n OnlyThisParabolicDish: 'Тільки ця параболічна тарілка',\n AllParabolicDishesAboveFoundation: 'Усі параболічні тарілки над цим фундаментом',\n AllParabolicDishes: 'Усі параболічні тарілки',\n },\n\n wallMenu: {\n TextureDefault: 'Типова текстура',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n SizeOfWall: 'Розмір стіни',\n OnlyThisWall: 'Тільки ця стіна',\n AllConnectedWalls: \"Всі пов'язані стіни\",\n AllWallsAboveFoundation: 'Всі стіни над цим фундаментом',\n AllWalls: 'Всі стіни',\n Windows: 'Вікна',\n LockAllWindows: 'Заблокувати всі вікна',\n UnlockAllWindows: 'Розблокувати всі вікна',\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Ви дійсно бажаєте видалити всі вікна на цій стіні',\n Doors: 'Двері',\n RemoveAllUnlockedDoors: 'Видалити всі розблоковані двері',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Ви дійсно бажаєте видалити всі двері на цій стіні',\n SolarPanels: 'Сонячні панелі',\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Ви дійсно бажаєте видалити всі сонячні панелі на цій стіні',\n Sensors: 'Датчики',\n LockAllSensors: 'Заблокувати всі датчики',\n UnlockAllSensors: 'Розблокувати всі датчики',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані датчики',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Ви дійсно бажаєте видалити всі датчики на цій стіні',\n Lights: 'Лампи',\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Ви дійсно бажаєте видалити всі лампи на цій стіні',\n LockAllPolygons: 'Заблокувати всі полігони',\n UnlockAllPolygons: 'Розблокувати всі полігони',\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\n WallStructure: 'Структура стіни',\n DefaultStructure: 'Типова',\n StudStructure: 'Студ',\n PillarStructure: 'Пілар',\n Opacity: 'Непрозорість',\n StructureSpacing: 'Відстань між структурами',\n StructureWidth: 'Ширина структури',\n StructureThickness: 'Товщина структури',\n StructureColor: 'Колір структури',\n Color: 'Колір стіни',\n Height: 'Висота',\n Thickness: 'Товщина',\n Texture: 'Текстура',\n AllLightsOnWallInside: 'Всі лампи всередині стіни',\n AllLightsOnWallOutside: 'Всі лампи ззовні стіни',\n Fill: 'Заповнення',\n Full: 'Повне',\n Partial: 'Часткове',\n Empty: 'Порожнє',\n OpenToOutside: 'Відкрите на зовнішню сторону',\n EavesLength: 'Довжина карнизу',\n Parapet: 'Перила',\n ParapetColor: 'Колір перил',\n ParapetTexture: 'Текстура перил',\n ParapetHeight: 'Висота перил',\n CopingsHeight: 'Висота паркану',\n CopingsWidth: 'Ширина паркану',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Тільки це вікно',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'Всі вікна над однією фундаментом',\n AllWindows: 'Всі вікна',\n Width: 'Ширина',\n Height: 'Висота',\n Mullion: 'Розділовий стовпець',\n MullionWidth: 'Ширина розділового стовпця',\n MullionSpacing: 'Відстань між розділовими стовпцями',\n MullionColor: 'Колір розділового стовпця',\n Tint: 'Відтінок',\n Opacity: 'Непрозорість',\n SolarHeatGainCoefficient: 'Коефіцієнт сонячного теплового навантаження (SHGC) = 1 - непрозорість',\n Shutter: 'Жалюзі',\n LeftShutter: 'Ліве жалюзі',\n RightShutter: 'Праве жалюзі',\n BothShutters: 'Обидві жалюзі',\n ShutterWidth: 'Відносна ширина',\n ShutterColor: 'Колір жалюзі',\n Frame: 'Рамка',\n FrameWidth: 'Ширина рамки',\n SillWidth: 'Ширина підвіконня',\n Color: 'Колір рамки',\n WindowType: 'Тип вікна',\n Default: 'Типове',\n Arched: 'Аркове',\n Polygonal: 'Багатокутне',\n Interior: \"Інтер'єр\",\n Empty: 'Порожнє',\n },\n\n roofMenu: {\n TextureDefault: 'Типове',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n OnlyThisRoof: 'Тільки цей дах',\n AllRoofsAboveFoundation: 'Всі дахи над одним фундаментом',\n AllRoofs: 'Всі дахи',\n OnlyThisCeiling: 'Тільки ця стеля',\n AllCeilingsAboveFoundation: 'Всі стелі над одним фундаментом',\n AllCeilings: 'Всі стелі',\n EavesOverhangLength: 'Довжина виступу карнизу',\n RafterSpacing: 'Відстань між стропилами',\n RafterWidth: 'Ширина стропила',\n RafterThickness: 'Товщина стропила',\n RafterColor: 'Колір стропила',\n RoofColor: 'Колір даху',\n RoofSideColor: 'Колір бокової частини даху',\n GlassTint: 'Колір скла',\n Opacity: 'Непрозорість',\n RoofStructure: 'Структура даху',\n DefaultStructure: 'Типова',\n RafterStructure: 'Стропило',\n GlassStructure: 'Скло',\n SolarPanels: 'Сонячні панелі',\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому даху',\n Windows: 'Вікна',\n LockAllWindows: 'Заблокувати всі вікна',\n UnlockAllWindows: 'Розблокувати всі вікна',\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Ви дійсно бажаєте видалити всі вікна на цьому даху',\n Sensors: 'Сенсори',\n LockAllSensors: 'Заблокувати всі сенсори',\n UnlockAllSensors: 'Розблокувати всі сенсори',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Ви дійсно бажаєте видалити всі сенсори на цьому даху',\n Lights: 'Лампи',\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Ви дійсно бажаєте видалити всі лампи на цьому даху',\n AllLightsOnRoofInside: 'Всі лампи на даху всередині',\n AllLightsOnRoofOutside: 'Всі лампи на даху ззовні',\n Rise: 'Піднімання',\n Ceiling: 'Стеля',\n RoofRValue: 'Значення R для даху',\n CeilingRValue: 'Значення R для стелі',\n },\n\n doorMenu: {\n TextureDefault: 'За замовчуванням',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n Texture11: 'Текстура 11',\n Texture12: 'Текстура 12',\n Texture13: 'Текстура 13',\n Texture14: 'Текстура 14',\n Texture15: 'Текстура 15',\n Texture16: 'Текстура 16',\n Texture17: 'Текстура 17',\n OnlyThisDoor: 'Тільки ці двері',\n AllDoorsOnWall: 'Всі двері на цій стіні',\n AllDoorsAboveFoundation: 'Всі двері над тим самим фундаментом',\n AllDoors: 'Всі двері',\n DoorType: 'Тип дверей',\n Default: 'За замовчуванням',\n Arched: 'Аркові',\n Filled: 'Заповнені',\n FrameColor: 'Колір рамки',\n Interior: \"Інтер'єр\",\n },\n\n siteInfoPanel: {\n High: 'Високо',\n Low: 'Низько',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Кількість вибраних геліостатів',\n NumberOfSelectedSolarPanels: 'Кількість вибраних сонячних панелей',\n ElectricityGeneratedDailyBySolarPanels: 'Електрика, що генерується щоденно цими сонячними панелями',\n SceneDiameter: 'Діаметр сцени',\n BuildingArea: 'Площа будівлі',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Контраст кольору',\n FluxScale: 'Шкала потоку',\n ClickUpOrDownArrowButtonsToChange: 'Натисніть кнопки зі стрілками вгору або вниз щоб змінити',\n },\n\n instructionPanel: {\n Rotate: 'Повернути',\n DragMouse: 'Перетягніть мишею',\n Zoom: 'Масштабування',\n MouseWheelOrKeys: 'Обертайте колесо миші або натисніть Ctrl+[ або Ctrl+]',\n MouseWheelOrKeysMac: 'Обертайте колесо миші або натисніть ⌘+[ або ⌘+]',\n Pan: 'Переміщення',\n HoldCtrlDragMouse: 'Натисніть і утримуйте Ctrl, перетягніть мишею',\n HoldMetaDragMouse: 'Натисніть і утримуйте ⌘, перетягніть мишею',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Скинути',\n AutoRotate: 'Автоматичний поворот',\n StartOrStop: 'Натисніть F4, щоб почати або зупинити',\n },\n\n mapPanel: {\n ImageOnGround: 'Зображення на землі',\n WeatherStations: 'Метеостанції',\n WeatherStationsNote: 'Вимкніть це, щоб прискорити',\n Coordinates: 'Координати',\n Zoom: 'Масштабування',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Видимість сонячних панелей',\n Observer: 'Спостерігач',\n VantagePoint: 'Точка огляду',\n ItemizedVisibilityByFields: 'Розгорнутий за полями',\n TotalVisibility: 'Загальна видимість',\n },\n\n sensorPanel: {\n LightSensor: 'Датчик освітленості',\n WeatherDataFrom: 'Метеодані з',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Щоденна енергія будівлі',\n YearlyBuildingEnergy: 'Річна енергія будівлі',\n Heater: 'Обігрівач',\n AC: 'Кондиціонер',\n SolarPanel: 'Сонячна панель',\n Net: 'Всього',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Щоденний дохід сонячних панелей',\n SolarPanelYearlyYield: 'Річний дохід сонячних панелей',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualSolarPanels: 'Показати дохід окремих сонячних панелей',\n Profit: 'Прибуток',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Щоденний дохід параболічних сонячних колекторів',\n ParabolicTroughYearlyYield: 'Річний дохід параболічних сонячних колекторів',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualParabolicTroughs: 'Показати дохід окремих параболічних сонячних колекторів',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Щоденний дохід параболічних тарілок',\n ParabolicDishYearlyYield: 'Річний дохід параболічних тарілок',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualParabolicDishes: 'Показати дохід окремих параболічних тарілок',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Щоденний дохід відбивача Френеля',\n FresnelReflectorYearlyYield: 'Річний дохід відбивача Френеля',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualFresnelReflectors: 'Показати дохід окремих відбивачів Френеля',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Щоденний дохід геліостату',\n HeliostatYearlyYield: 'Річний дохід геліостату',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualHeliostats: 'Показати дохід окремих геліостатів',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Щоденний дохід сонячної вежі',\n UpdraftTowerYearlyYield: 'Річний дохід сонячної вежі',\n ChimneyAirTemperature: 'Температура повітря у димовій трубі',\n ChimneyWindSpeed: 'Швидкість вітру у димовій трубі',\n Yield: 'дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualUpdraftTowers: 'Показати дохід окремих сонячних веж',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Налаштування Сонця та Часу',\n SunAngles: 'Кути Сонця',\n TwentyFourHours: '24 Години',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Пошук за назвою',\n MyLikes: 'Мої вподобання',\n MyCloudFiles: 'Мої файли у хмарному середовищі',\n GenerateLink: 'Створити посилання',\n LinkGeneratedInClipBoard: 'Посилання було створено та скопійовано до буферу обміну',\n DoYouReallyWantToDelete: 'Ви дійсно бажаєте видалити',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'Якщо цей файл було відкрито або опубліковано, зміна його назви порушить наявні посилання',\n },\n\n projectListPanel: {\n SearchByTitle: 'Пошук за назвою',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Тип проєкту',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Мої налаштування облікового запису',\n MyID: 'Моє 🆔',\n ClickToCopyMyID: 'Натисніть, щоб скопіювати моє ID',\n IDInClipBoard: 'Ваш ID було скопійоване і готове для вставки.',\n StoreMyNameInMyFilesWhenSaving: \"Зберігати моє ім'я в моїх файлах при збереженні\",\n DoYouReallyWantToShowYourNameInYourFiles: \"Ви дійсно бажаєте відображати ваше ім'я в файлах?\",\n SignFileDisclaimer: \"Якщо так, ваше ім'я зможе бачити будь-хто, хто матиме доступ до ваших файлів.\",\n Likes: 'Вподобання',\n AllPublished: 'Усі опубліковані',\n PublishedUnderAliases: 'Псевдоніми',\n UserCount: 'Кількість користувачів',\n SchoolID: 'ID Школи',\n ClassID: 'ID Класу',\n },\n\n weatherPanel: {\n SunshineHours: 'Сонячні години',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Виберіть модель повітряної температури',\n Sinusoidal: 'Синусоїдальна',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Параметри економіки',\n ElectricitySellingPrice: 'Ціна продажу електроенергії',\n OperationalCostPerUnit: 'Операційні витрати за одиницю',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Ясність неба',\n ShowDaylightResults: 'Показати результати денного освітлення',\n ShowSkyClearnessResults: 'Показати результати ясності неба',\n ShowAverageDailySolarRadiation: 'Показати середню щоденну сонячну радіацію',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Немає датчика для збору даних.',\n NoSolarPanelForAnalysis: 'Немає сонячної панелі для аналізу.',\n NoObserverForVisibilityAnalysis: 'Немає спостерігача для аналізу видимості.',\n NoWaterHeaterForAnalysis: 'Немає водонагрівача для аналізу.',\n NoParabolicDishForAnalysis: 'Немає параболічної тарілки для аналізу.',\n NoParabolicTroughForAnalysis: 'Немає параболічного сонячного колектора для аналізу.',\n NoFresnelReflectorForAnalysis: 'Немає відбивача Френеля для аналізу.',\n NoHeliostatForAnalysis: 'Немає геліостата для аналізу.',\n NoSolarUpdraftTowerForAnalysis: 'Немає сонячної вежі для аналізу.',\n NoBuildingForAnalysis: 'Немає будівлі для аналізу.',\n },\n\n toolbar: {\n CloudFile: 'Хмарний файл',\n Select: 'Вибрати',\n AddFoundation: 'Додати фундамент',\n AddWall: 'Додати стіну',\n AddWindow: 'Додати вікно',\n AddDoor: 'Додати двері',\n AddPyramidRoof: 'Додати пірамідальний дах',\n AddGableRoof: 'Додати шатровий дах',\n AddHipRoof: 'Додати чотирихилий дах',\n AddGambrelRoof: 'Додати двосхилий дах',\n AddMansardRoof: 'Додати мансардний дах',\n AddCuboid: 'Додати прямокутний паралелепіпед',\n AddSensor: 'Додати датчик',\n AddSolarPanel: 'Додати сонячну панель',\n AddWaterHeater: 'Додати водонагрівач',\n AddParabolicDish: 'Додати параболічну тарілку',\n AddParabolicTrough: 'Додати параболічний сонячний колектор',\n AddFresnelReflector: 'Додати відбивач Френеля',\n AddHeliostat: 'Додати геліостат',\n AddWindTurbine: 'Додати вітрогенератор',\n AddLight: 'Додати світло',\n AddTree: 'Додати дерево',\n AddFlower: 'Додати квітку',\n AddPeople: 'Додати людей',\n DoubleClickToLockThisModeForNextAction: 'Подвійне клацання, щоб заблокувати цей режим для наступної дії',\n ClickToUnlockThisModeForNextAction: 'Клацніть, щоб розблокувати цей режим для наступної дії',\n ManipulateGroup: 'Маніпулювати групою',\n ClearScene: 'Очистити сцену',\n ShowSunAndTimeSettings: 'Показати налаштування Сонця та Часу',\n SpatialAnalysisOfEnergy: 'Просторовий аналіз енергії',\n DoYouReallyWantToClearContent: 'Ви дійсно бажаєте очистити вміст',\n ClickForMoreButtons: 'Натисніть для додаткових кнопок',\n SwitchToAddingFoundation: 'Переключитися на додавання фундаменту',\n SwitchToAddingCuboid: 'Переключитися на додавання прямокутного паралелепіпеду',\n SwitchToAddingWall: 'Переключитися на додавання стіни',\n SwitchToAddingWindow: 'Переключитися на додавання вікна',\n SwitchToAddingDoor: 'Переключитися на додавання дверей',\n SwitchToAddingPyramidRoof: 'Переключитися на додавання пірамідального даху',\n SwitchToAddingGableRoof: 'Переключитися на додавання шатрового даху',\n SwitchToAddingHipRoof: 'Переключитися на додавання чотирихилий даху',\n SwitchToAddingGambrelRoof: 'Переключитися на додавання двосхилий даху',\n SwitchToAddingMansardRoof: 'Переключитися на додавання мансардного даху',\n SwitchToAddingSolarPanel: 'Переключитися на додавання сонячної панелі',\n SwitchToAddingSensor: 'Переключитися на додавання датчика',\n SwitchToAddingWaterHeater: 'Переключитися на додавання водонагрівача',\n SwitchToAddingParabolicDish: 'Переключитися на додавання параболічної тарілки',\n SwitchToAddingParabolicTrough: 'Переключитися на додавання параболічного сонячного колектора',\n SwitchToAddingFresnelReflector: 'Переключитися на додавання відбивача Френеля',\n SwitchToAddingHeliostat: 'Переключитися на додавання геліостата',\n SwitchToAddingWindTurbine: 'Переключитися на додавання вітрогенератора',\n SwitchToAddingLight: 'Переключитися на додавання освітлення',\n SwitchToAddingTree: 'Переключитися на додавання дерева',\n SwitchToAddingFlower: 'Переключитися на додавання квітки',\n SwitchToAddingPeople: 'Переключитися на додавання людей',\n },\n\n tooltip: {\n gotoIFI: 'Перейти до Інституту Інтелекту Майбутнього',\n visitAladdinHomePage: 'Відвідати домашню сторінку Aladdin',\n clickToOpenMenu: 'Натисність, щоб відкрити Головне Меню',\n clickToAccessCloudTools: 'Натисність, щоб отримати доступ до хмарних інструментів',\n },\n\n tree: {\n Apple: 'Яблуня',\n Birch: 'Береза',\n Coconut: 'Кокос',\n Dogwood: 'Дерен',\n Elm: \"В'яз\",\n FanPalm: 'Віяльна пальма',\n Linden: 'Липа',\n Magnolia: 'Магнолія',\n Maple: 'Клен',\n Oak: 'Дуб',\n Pine: 'Сосна',\n Spruce: 'Ялина',\n },\n\n flower: {\n Bellflower: 'Дзвоник',\n Boxwood: 'Самшит',\n CactusCombo1: 'Кактус Комбо 1',\n CactusCombo2: 'Кактус Комбо 2',\n CactusCombo3: 'Кактус Комбо 3',\n CactusCombo4: 'Кактус Комбо 4',\n Hibiscus: 'Гібіскус',\n Hosta: 'Госта',\n Hydrangea: 'Гортензія',\n Peony: 'Півонія',\n RedRose: 'Червона троянда',\n Spirea: 'Спірея',\n Sunflower: 'Соняшник',\n TallBush: 'Високий кущ',\n Tulip: 'Тюльпан',\n WhiteFlower: 'Біла квітка',\n YellowFlower: 'Жовта квітка',\n },\n\n people: {\n Jaah: 'Артем',\n Jack: 'Віталій',\n Jacob: 'Ярослав',\n Jacqueline: 'Олена',\n Jade: 'Ольга',\n Jamelia: 'Олександра',\n James: 'Андрій',\n Jane: 'Вікторія',\n Jaya: 'Ірина',\n Jaye: 'Назар',\n Jeanette: 'Соломія',\n Jedi: 'Євген',\n Jeff: 'Павло',\n Jena: 'Любов',\n Jennifer: 'Тетяна',\n Jess: 'Злата',\n Jett: 'Сергій',\n Jill: 'Надія',\n Jiya: 'Марина',\n Joan: 'Іванна',\n Jocelyn: 'Анастасія',\n Joel: 'Володимир',\n Joey: 'Вероніка',\n John: 'Іван',\n Jonathon: 'Петро',\n Jose: 'Микита',\n Joseph: 'Віктор',\n Joshua: 'Михайло',\n Judd: 'Владислав',\n Judy: 'Марія',\n Julia: 'Юлія',\n Julio: 'Дмитро',\n Jumapili: 'Марта',\n June: 'Анна',\n Juro: 'Юрій',\n Justin: 'Богдан',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Пошук за виробником',\n SearchByLabel: 'Пошук за міткою',\n MyPublishedModels: 'Мої опубліковані моделі',\n TotalNumberOfUserPublishedModels: 'Загальна кількість моделей, опублікованих користувачами',\n SortFromOldestToNewest: 'Сортувати від найдавніших до найновіших',\n SortFromNewestToOldest: 'Сортувати від найновіших до найдавніших',\n ModelsFoundOnThisSite: 'моделей знайдено на цьому сайті',\n ShowModelsPublishedByThisAuthor: 'Показати моделі, опубліковані цим автором',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { extend, Object3DNode } from '@react-three/fiber';\nimport TextSprite from 'three-spritetext';\nimport { MyOrbitControls } from './js/MyOrbitControls';\nimport { ParabolicCylinderGeometry } from './js/ParabolicCylinderGeometry';\nimport { ParaboloidGeometry } from './js/ParaboloidGeometry';\nimport { ConvexGeometry } from './js/ConvexGeometry';\nimport { Vector2 } from 'three';\n\n// Extend makes these JSX elements (with the first character lower-cased)\nextend({ TextSprite });\nextend({ MyOrbitControls });\nextend({ ParabolicCylinderGeometry });\nextend({ ParaboloidGeometry });\nextend({ ConvexGeometry });\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n textSprite: Object3DNode;\n myOrbitControls: Object3DNode;\n parabolicCylinderGeometry: Object3DNode;\n paraboloidGeometry: Object3DNode;\n convexGeometry: Object3DNode;\n }\n }\n}\n\nexport interface User {\n displayName: string | null;\n email: string | null;\n photoURL: string | null;\n uid: string | null;\n signFile: boolean;\n noLogging: boolean;\n schoolID: SchoolID;\n classID: ClassID;\n likes?: string[];\n published?: string[];\n aliases?: string[];\n}\n\nexport enum FirebaseName {\n FILES = 'Files',\n LOG_DATA = 'Log Data',\n}\n\nexport interface ModelSite {\n userid: string;\n title: string;\n latitude: number;\n longitude: number;\n address?: string;\n countryCode?: string;\n type?: string;\n author?: string;\n label?: string;\n description?: string;\n likeCount?: number;\n clickCount?: number;\n timeCreated?: number;\n pinned?: boolean;\n thumbnailUrl?: string;\n hashtags?: string;\n}\n\nexport interface Design {\n timestamp: number;\n title: string;\n thumbnail: string; // PNG Base64 data\n [key: string]: any;\n}\n\nexport enum SchoolID {\n UNKNOWN = 'UNKNOWN SCHOOL',\n SCHOOL1 = 'SCHOOL 1',\n SCHOOL2 = 'SCHOOL 2',\n SCHOOL3 = 'SCHOOL 3',\n SCHOOL4 = 'SCHOOL 4',\n SCHOOL5 = 'SCHOOL 5',\n}\n\nexport enum ClassID {\n UNKNOWN = 'UNKNOWN CLASS',\n CLASS1 = 'CLASS 1',\n CLASS2 = 'CLASS 2',\n CLASS3 = 'CLASS 3',\n CLASS4 = 'CLASS 4',\n CLASS5 = 'CLASS 5',\n CLASS6 = 'CLASS 6',\n CLASS7 = 'CLASS 7',\n CLASS8 = 'CLASS 8',\n CLASS9 = 'CLASS 9',\n}\n\nexport interface CloudFileInfo {\n readonly timestamp: number;\n readonly fileName: string;\n readonly uuid: string;\n readonly userid: string;\n}\n\nexport enum DataColoring {\n ALL = 0,\n INDIVIDUALS = 1,\n GROUPS = 2,\n}\n\nexport interface Range {\n variable: string;\n minimum: number;\n maximum: number;\n}\n\n// use null for undefined, as we need to persist this in Firebase\nexport interface ProjectInfo {\n owner: string | null;\n timestamp: number;\n title: string | null;\n description: string | null;\n type: DesignProblem;\n designs: Design[] | null;\n ranges: Range[] | null;\n hiddenParameters: string[] | null;\n counter: number;\n dataColoring: DataColoring;\n selectedProperty: string | null;\n sortDescending: boolean | null;\n xAxisNameScatteredPlot: string | null;\n yAxisNameScatteredPlot: string | null;\n dotSizeScatteredPlot: number | null;\n thumbnailWidth: number | null;\n}\n\nexport interface ActionInfo {\n readonly timestamp: number;\n readonly name: string;\n readonly elementId?: string;\n readonly elementType?: ObjectType;\n readonly result?: any;\n readonly details?: any;\n readonly steps?: number;\n}\n\nexport enum ModelType {\n UNKNOWN = 'Unknown',\n UNDER_CONSTRUCTION = 'Under Construction',\n RESIDENTIAL_BUILDING = 'Residential Building',\n COMMERCIAL_BUILDING = 'Commercial Building',\n SCHOOL_BUILDING = 'School Building',\n TOURIST_ATTRACTION = 'Tourist Attraction',\n PHOTOVOLTAIC = 'Photovoltaic',\n PARABOLIC_DISH = 'Parabolic Dish',\n PARABOLIC_TROUGH = 'Parabolic Trough',\n FRESNEL_REFLECTOR = 'Fresnel Reflector',\n SOLAR_POWER_TOWER = 'Solar Power Tower',\n}\n\nexport enum BuildingCompletionStatus {\n COMPLETE,\n ROOF_MISSING,\n WALL_DISJOINED,\n WALL_EMPTY,\n}\n\nexport enum DesignProblem {\n SOLAR_PANEL_TILT_ANGLE = 'Solar Panel Tilt Angle',\n SOLAR_PANEL_ARRAY = 'Solar Panel Array',\n}\n\nexport enum ObjectiveFunctionType {\n DAILY_TOTAL_OUTPUT = 1,\n YEARLY_TOTAL_OUTPUT = 2,\n DAILY_AVERAGE_OUTPUT = 3,\n YEARLY_AVERAGE_OUTPUT = 4,\n DAILY_PROFIT = 5,\n YEARLY_PROFIT = 6,\n}\n\nexport enum EvolutionMethod {\n GENETIC_ALGORITHM = 1,\n PARTICLE_SWARM_OPTIMIZATION = 2,\n}\n\nexport enum GeneticAlgorithmSelectionMethod {\n ROULETTE_WHEEL = 1,\n TOURNAMENT = 2,\n}\n\nexport enum SearchMethod {\n GLOBAL_SEARCH_UNIFORM_SELECTION = 1,\n LOCAL_SEARCH_RANDOM_OPTIMIZATION = 2, // https://en.wikipedia.org/wiki/Random_optimization\n GLOBAL_SEARCH_FITNESS_SHARING = 3, // https://stackoverflow.com/questions/13775810/what-is-niching-scheme\n}\n\nexport enum LineStyle {\n Solid = 1,\n Dashed = 2,\n Dotted = 3,\n}\n\nexport enum LineWidth {\n One = 1,\n Two = 2,\n Three = 3,\n Four = 4,\n Five = 5,\n}\n\nexport interface DatumEntry {\n [key: string]: number | undefined | string | boolean;\n}\n\nexport interface EnergyUsage {\n heater: number;\n ac: number;\n solarPanel: number;\n geothermal: number;\n label?: string;\n}\n\nexport enum ChartType {\n Line = 1,\n Area = 2,\n}\n\nexport enum GraphDataType {\n HourlyTemperatures = 1,\n MonthlyTemperatures = 2,\n SunshineHours = 3,\n DaylightData = 4,\n ClearnessData = 5,\n YearlyRadiationSensorData = 6,\n DailyRadiationSensorData = 7,\n YearlyPvYield = 8,\n DailyPvYield = 9,\n YearlyParabolicTroughYield = 10,\n DailyParabolicTroughYield = 11,\n YearlyParabolicDishYield = 12,\n DailyParabolicDishYield = 13,\n YearlyFresnelReflectorYield = 14,\n DailyFresnelReflectorYield = 15,\n YearlyHeliostatYield = 16,\n DailyHeliostatYield = 17,\n YearlyUpdraftTowerYield = 18,\n DailyUpdraftTowerYield = 19,\n YearlyBuildingEnergy = 20,\n DailyBuildingEnergy = 21,\n}\n\nexport enum Theme {\n Default = 'Default',\n Desert = 'Desert',\n Dune = 'Dune',\n Forest = 'Forest',\n Grassland = 'Grassland',\n Hill = 'Hill',\n Lake = 'Lake',\n Mountain = 'Mountain',\n Rural = 'Rural',\n}\n\nexport enum DiurnalTemperatureModel {\n Sinusoidal = 1,\n PartonLogan = 2, // https://www.sciencedirect.com/science/article/abs/pii/0002157181901059\n}\n\nexport enum Language {\n English = 'English',\n ChineseSimplified = '简体中文',\n ChineseTraditional = '繁体中文',\n Turkish = 'Türkçe',\n Spanish = 'Español',\n Ukrainian = 'Українська',\n}\n\nexport enum ObjectType {\n Sky = 'Sky',\n Ground = 'Ground',\n Foundation = 'Foundation',\n Wall = 'Wall',\n Window = 'Window',\n Door = 'Door',\n Roof = 'Roof',\n PyramidRoof = 'Pyramid Roof',\n GableRoof = 'Gable Roof',\n HipRoof = 'Hip Roof',\n GambrelRoof = 'Gambrel Roof',\n MansardRoof = 'Mansard Roof',\n Sensor = 'Sensor',\n SolarPanel = 'Solar Panel',\n WaterHeater = 'Water Heater',\n ParabolicDish = 'Parabolic Dish',\n ParabolicTrough = 'Parabolic Trough',\n FresnelReflector = 'Fresnel Reflector',\n Heliostat = 'Heliostat',\n WindTurbine = 'Wind Turbine',\n Cuboid = 'Cuboid',\n Human = 'Human',\n Tree = 'Tree',\n Flower = 'Flower',\n Polygon = 'Polygon',\n PolygonVertex = 'Polygon Vertex',\n Light = 'Light',\n None = 'None',\n}\n\nexport enum ParabolicDishStructureType {\n CentralPole = 1,\n CentralPoleWithTripod = 2,\n Quadrupod = 3,\n}\n\nexport enum SolarStructure {\n None = 0,\n FocusPipe = 1,\n FocusTower = 2,\n UpdraftTower = 3,\n}\n\nexport enum ActionType {\n Select = 'Select',\n Move = 'Move',\n Resize = 'Resize',\n Rotate = 'Rotate',\n}\n\nexport enum MoveHandleType {\n Default = 'Move Handle', // used when there is only one handle for moving\n Lower = 'Move Handle Lower',\n Upper = 'Move Handle Upper',\n Left = 'Move Handle Left',\n Right = 'Move Handle Right',\n Top = 'Move Handle Top',\n Mid = 'Move Handle Mid',\n}\n\nexport enum ResizeHandleType {\n LowerLeft = 'Resize Handle Lower Left',\n UpperLeft = 'Resize Handle Upper Left',\n LowerRight = 'Resize Handle Lower Right',\n UpperRight = 'Resize Handle Upper Right',\n LowerLeftTop = 'Resize Handle Lower Left Top',\n UpperLeftTop = 'Resize Handle Upper Left Top',\n LowerRightTop = 'Resize Handle Lower Right Top',\n UpperRightTop = 'Resize Handle Upper Right Top',\n Lower = 'Resize Handle Lower',\n Upper = 'Resize Handle Upper',\n Left = 'Resize Handle Left',\n Right = 'Resize Handle Right',\n Top = 'Resize Handle Top',\n Default = 'Resize Handle', // used for resizing a polygon\n Arch = 'Resize Handle Arch',\n WallPartialResizeLeft = 'Wall Partial Resize Handle Left',\n WallPartialResizeRight = 'Wall Partial Resize Handle Right',\n WallPartialResizeLeftTop = 'Wall Partial Resize Handle Left Top',\n WallPartialResizeRightTop = 'Wall Partial Resize Handle Right Top',\n}\n\nexport enum RotateHandleType {\n Lower = 'Rotate Handle Lower',\n Upper = 'Rotate Handle Upper',\n Tilt = 'Rotate Handle Tilt',\n}\n\nexport enum PolygonVertexAction {\n Delete = 'Delete Vertex',\n InsertBeforeIndex = 'Insert Vertex Before Index',\n InsertAfterIndex = 'Insert Vertex After Index',\n}\n\nexport enum IntersectionPlaneType {\n Horizontal = 'Horizontal',\n Vertical = 'Vertical',\n Ground = 'Ground',\n Sky = 'Sky',\n}\n\nexport enum Scope {\n OnlyThisObject = 1,\n AllObjectsOfThisTypeOnSurface = 2,\n AllObjectsOfThisTypeAboveFoundation = 3,\n AllObjectsOfThisType = 4,\n AllConnectedObjects = 5,\n OnlyThisSide = 6, // same wall\n}\n\nexport enum Orientation {\n portrait = 'Portrait',\n landscape = 'Landscape',\n}\n\nexport enum RowAxis {\n eastWest = 'East-West', // absolute\n northSouth = 'North-South', // absolute\n leftRight = 'Left-Right', // relative to the parent\n upDown = 'Up-Down', // relative to the parent\n}\n\nexport enum TrackerType {\n NO_TRACKER = 'None',\n HORIZONTAL_SINGLE_AXIS_TRACKER = 'HSAT',\n ALTAZIMUTH_DUAL_AXIS_TRACKER = 'AADAT',\n VERTICAL_SINGLE_AXIS_TRACKER = 'VSAT',\n TILTED_SINGLE_AXIS_TRACKER = 'TSAT',\n}\n\nexport enum ShadeTolerance {\n NONE = 'None',\n HIGH = 'High',\n PARTIAL = 'Partial',\n}\n\nexport enum Discretization {\n EXACT = 'Exact',\n APPROXIMATE = 'Approximate',\n}\n\nexport enum TreeType {\n Apple = 'Apple',\n Birch = 'Birch',\n Coconut = 'Coconut',\n Dogwood = 'Dogwood',\n Elm = 'Elm',\n FanPalm = 'Fan Palm',\n Linden = 'Linden',\n Magnolia = 'Magnolia',\n Maple = 'Maple',\n Oak = 'Oak',\n Pine = 'Pine',\n Spruce = 'Spruce',\n}\n\nexport enum FlowerType {\n Bellflower = 'Bellflower',\n Boxwood = 'Boxwood',\n CactusCombo1 = 'Cactus Combo 1',\n CactusCombo2 = 'Cactus Combo 2',\n CactusCombo3 = 'Cactus Combo 3',\n CactusCombo4 = 'Cactus Combo 4',\n Hibiscus = 'Hibiscus',\n Hosta = 'Hosta',\n Hydrangea = 'Hydrangea',\n Peony = 'Peony',\n RedRose = 'Red Rose',\n Spirea = 'Spirea',\n Sunflower = 'Sunflower',\n TallBush = 'Tall Bush',\n Tulip = 'Tulip',\n WhiteFlower = 'White Flower',\n YellowFlower = 'Yellow Flower',\n}\n\nexport enum Gender {\n Male = 'Male',\n Female = 'Female',\n Other = 'Other',\n}\n\nexport enum HumanName {\n Jaah = 'Jaah',\n Jack = 'Jack',\n Jacob = 'Jacob',\n Jacqueline = 'Jacqueline',\n Jade = 'Jade',\n Jamelia = 'Jamelia',\n James = 'James',\n Jane = 'Jane',\n Jaya = 'Jaya',\n Jaye = 'Jaye',\n Jeanette = 'Jeanette',\n Jedi = 'Jedi',\n Jeff = 'Jeff',\n Jena = 'Jena',\n Jennifer = 'Jennifer',\n Jess = 'Jess',\n Jett = 'Jett',\n Jill = 'Jill',\n Jiya = 'Jiya',\n Jocelyn = 'Jocelyn',\n Joan = 'Joan',\n Joel = 'Joel',\n Joey = 'Joey',\n John = 'John',\n Jonathon = 'Jonathon',\n Joseph = 'Joseph',\n Jose = 'Jose',\n Joshua = 'Joshua',\n Judd = 'Judd',\n Judy = 'Judy',\n Julia = 'Julia',\n Julio = 'Julio',\n Jumapili = 'Jumapili',\n June = 'June',\n Juro = 'Juro',\n Justin = 'Justin',\n}\n\nexport enum PolygonTexture {\n Texture01 = 'Polygon Texture #1',\n Texture02 = 'Polygon Texture #2',\n Texture03 = 'Polygon Texture #3',\n Texture04 = 'Polygon Texture #4',\n Texture05 = 'Polygon Texture #5',\n Texture06 = 'Polygon Texture #6',\n Texture07 = 'Polygon Texture #7',\n Texture08 = 'Polygon Texture #8',\n Texture09 = 'Polygon Texture #9',\n Texture10 = 'Polygon Texture #10',\n NoTexture = 'No Polygon Texture',\n}\n\nexport enum FoundationTexture {\n Texture01 = 'Foundation Texture #1',\n Texture02 = 'Foundation Texture #2',\n Texture03 = 'Foundation Texture #3',\n Texture04 = 'Foundation Texture #4',\n Texture05 = 'Foundation Texture #5',\n Texture06 = 'Foundation Texture #6',\n Texture07 = 'Foundation Texture #7',\n Texture08 = 'Foundation Texture #8',\n Texture09 = 'Foundation Texture #9',\n Texture10 = 'Foundation Texture #10',\n NoTexture = 'No Foundation Texture',\n}\n\nexport enum CuboidTexture {\n Facade01 = 'Facade #1',\n Facade02 = 'Facade #2',\n Facade03 = 'Facade #3',\n Facade04 = 'Facade #4',\n Facade05 = 'Facade #5',\n Facade06 = 'Facade #6',\n Facade07 = 'Facade #7',\n Facade08 = 'Facade #8',\n Facade09 = 'Facade #9',\n Facade10 = 'Facade #10',\n NoTexture = 'No Facade Texture',\n}\n\nexport enum WallTexture {\n Default = 'Wall Texture Default',\n Texture01 = 'Wall Texture #1',\n Texture02 = 'Wall Texture #2',\n Texture03 = 'Wall Texture #3',\n Texture04 = 'Wall Texture #4',\n Texture05 = 'Wall Texture #5',\n Texture06 = 'Wall Texture #6',\n Texture07 = 'Wall Texture #7',\n Texture08 = 'Wall Texture #8',\n Texture09 = 'Wall Texture #9',\n Texture10 = 'Wall Texture #10',\n NoTexture = 'No Wall Texture',\n}\n\nexport enum DoorTexture {\n Default = 'Door Texture Default',\n Texture01 = 'Door Texture #1',\n Texture02 = 'Door Texture #2',\n Texture03 = 'Door Texture #3',\n Texture04 = 'Door Texture #4',\n Texture05 = 'Door Texture #5',\n Texture06 = 'Door Texture #6',\n Texture07 = 'Door Texture #7',\n Texture08 = 'Door Texture #8',\n Texture09 = 'Door Texture #9',\n Texture10 = 'Door Texture #10',\n Texture11 = 'Door Texture #11',\n Texture12 = 'Door Texture #12',\n Texture13 = 'Door Texture #13',\n Texture14 = 'Door Texture #14',\n Texture15 = 'Door Texture #15',\n Texture16 = 'Door Texture #16',\n Texture17 = 'Door Texture #17',\n NoTexture = 'No Door Texture',\n}\n\nexport enum RoofTexture {\n Default = 'Roof Texture Default',\n Texture01 = 'Roof Texture #1',\n Texture02 = 'Roof Texture #2',\n Texture03 = 'Roof Texture #3',\n Texture04 = 'Roof Texture #4',\n Texture05 = 'Roof Texture #5',\n Texture06 = 'Roof Texture #6',\n Texture07 = 'Roof Texture #7',\n NoTexture = 'No Roof Texture',\n}\n\nexport enum WallSide {\n Left = 'Left',\n Right = 'Right',\n}\n\nexport enum ElementState {\n Valid = 'Valid',\n OverLap = 'OverLap',\n OutsideBoundary = 'OutsideBoundary',\n Invalid = 'Invalid',\n}\n\nexport type WallAbsPos = {\n leftPointAbsPos: Vector2;\n rightPointAbsPos: Vector2;\n centerPointAbsPos: Vector2;\n};\n\nexport enum RoofHandleType {\n Mid = 'Mid',\n Left = 'Left',\n Right = 'Right',\n TopMid = 'TopMid',\n TopLeft = 'TopLeft',\n TopRight = 'TopRight',\n FrontLeft = 'FrontLeft',\n FrontRight = 'FrontRight',\n BackLeft = 'BackLeft',\n BackRight = 'BackRight',\n Top = 'Top',\n Ridge = 'Ridge',\n Null = 'Null',\n}\n\nexport interface OldRooftopElementData {\n parentId: string;\n foundationId?: string;\n position: number[];\n rotation: number[];\n normal: number[];\n}\n\nexport type BoxArgs = [width?: number | undefined, height?: number | undefined, depth?: number | undefined];\n","export default __webpack_public_path__ + \"static/media/weather.dfa085ac.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 {\n Euler,\n EventDispatcher,\n MOUSE,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nclass MyOrbitControls extends EventDispatcher {\n\n constructor( object, domElement ) {\n\n super();\n\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = 'none'; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = - Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.moveSpeed = 1;\n this.turnSpeed = 1;\n this.keys = {\n MOVE_LEFT: 'KeyA',\n MOVE_RIGHT: 'KeyD',\n MOVE_FORWARD: 'KeyW',\n MOVE_BACKWARD: 'KeyS',\n MOVE_UP: 'KeyZ',\n MOVE_DOWN: 'KeyX',\n ROTATE_LEFT: 'ArrowLeft',\n ROTATE_UP: 'ArrowUp',\n ROTATE_RIGHT: 'ArrowRight',\n ROTATE_DOWN: 'ArrowDown'\n };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n\n return spherical.phi;\n\n };\n\n this.getAzimuthalAngle = function () {\n\n return spherical.theta;\n\n };\n\n this.getDistance = function () {\n\n return this.object.position.distanceTo( this.target );\n\n };\n\n this.listenToKeyEvents = function ( domElement ) {\n\n domElement.addEventListener( 'keydown', onKeyDown );\n this._domElementKeyEvents = domElement;\n\n reverse = false;\n oldZ = 0\n\n };\n\n this.removeKeyEvents = function () {\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n }\n\n this.saveState = function () {\n\n scope.target0.copy( scope.target );\n scope.position0.copy( scope.object.position );\n scope.zoom0 = scope.object.zoom;\n\n };\n\n this.reset = function () {\n\n scope.target.copy( scope.target0 );\n scope.object.position.copy( scope.position0 );\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent( _changeEvent );\n\n scope.update();\n\n state = STATE.NONE;\n\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = function () {\n\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n\n const position = scope.object.position;\n\n offset.copy( position ).sub( scope.target );\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion( quat );\n\n // angle from z-axis around y-axis\n spherical.setFromVector3( offset );\n\n if ( scope.autoRotate && state === STATE.NONE ) {\n\n rotateLeft( getAutoRotationAngle() );\n\n }\n\n if ( scope.enableDamping ) {\n\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n } else {\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if ( isFinite( min ) && isFinite( max ) ) {\n\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n if ( min <= max ) {\n\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n } else {\n\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n Math.max( min, spherical.theta ) :\n Math.min( max, spherical.theta );\n\n }\n\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n spherical.makeSafe();\n\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n // move target to panned location\n\n if ( scope.enableDamping === true ) {\n\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n } else {\n\n scope.target.add( panOffset );\n\n }\n\n offset.setFromSpherical( spherical );\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion( quatInverse );\n\n position.copy( scope.target ).add( offset );\n\n scope.object.lookAt( scope.target );\n\n if ( scope.enableDamping === true ) {\n\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n } else {\n\n sphericalDelta.set( 0, 0, 0 );\n\n panOffset.set( 0, 0, 0 );\n\n }\n\n scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if ( zoomChanged ||\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n scope.dispatchEvent( _changeEvent );\n\n lastPosition.copy( scope.object.position );\n lastQuaternion.copy( scope.object.quaternion );\n zoomChanged = false;\n\n return true;\n\n }\n\n return false;\n\n };\n\n }();\n\n this.dispose = function () {\n\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n };\n\n //\n // internals\n //\n\n const scope = this;\n\n const STATE = {\n NONE: - 1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n };\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const pointers = [];\n const pointerPositions = {};\n\n // navigation\n let reverse = false;\n let oldZ = 0;\n\n function getAutoRotationAngle() {\n\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n }\n\n function getZoomScale() {\n\n return Math.pow( 0.95, scope.zoomSpeed );\n\n }\n\n function rotateLeft( angle ) {\n\n sphericalDelta.theta -= angle;\n\n }\n\n function rotateUp( angle ) {\n\n sphericalDelta.phi -= angle;\n\n }\n\n const panLeft = function () {\n\n const v = new Vector3();\n\n return function panLeft( distance, objectMatrix ) {\n\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n v.multiplyScalar( - distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n const panUp = function () {\n\n const v = new Vector3();\n\n return function panUp( distance, objectMatrix ) {\n\n if ( scope.screenSpacePanning === true ) {\n\n v.setFromMatrixColumn( objectMatrix, 1 );\n\n } else {\n\n v.setFromMatrixColumn( objectMatrix, 0 );\n v.crossVectors( scope.object.up, v );\n\n }\n\n v.multiplyScalar( distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = function () {\n\n const offset = new Vector3();\n\n return function pan( deltaX, deltaY ) {\n\n const element = scope.domElement;\n\n if ( scope.object.isPerspectiveCamera ) {\n\n // perspective\n const position = scope.object.position;\n offset.copy( position ).sub( scope.target );\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n // orthographic\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n } else {\n\n // camera neither orthographic nor perspective\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n scope.enablePan = false;\n\n }\n\n };\n\n }();\n\n const moveUp = function() {\n\n const _vector = new Vector3();\n\n return function moveUp( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 1 );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add(_vector)\n\n camera.position.z = Math.max(0, camera.position.z);\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const moveForward = function() {\n\n const _vector = new Vector3();\n\n return function moveForward( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 0 );\n\n _vector.crossVectors( camera.up, _vector );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add(_vector)\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const moveRight = function() {\n\n const _vector = new Vector3();\n\n return function moveRight( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 0 );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add( _vector );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n }();\n\n const spinUp = function() {\n\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\n\n return function spinUp( distance ) {\n\n const camera = scope.object;\n\n _euler.setFromQuaternion( camera.quaternion );\n\n if ( Math.abs( Math.abs( _euler.z - oldZ ) - Math.PI ) < 0.01 ) {\n\n reverse = !reverse;\n\n }\n\n if ( reverse ) {\n\n _euler.x -= 0.01 * distance;\n\n } else {\n\n _euler.x += 0.01 * distance;\n\n }\n\n _euler.x = Math.max(0.1, _euler.x);\n\n oldZ = _euler.z;\n\n camera.quaternion.setFromEuler( _euler );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const spinRight = function() {\n\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\n\n return function rotateRight( distance ) {\n\n const camera = scope.object;\n\n _euler.setFromQuaternion( camera.quaternion );\n\n _euler.z -= 0.01 * distance;\n\n camera.quaternion.setFromEuler( _euler );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n function dollyOut( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale /= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n function dollyIn( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale *= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate( event ) {\n\n rotateStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownDolly( event ) {\n\n dollyStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownPan( event ) {\n\n panStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseMoveRotate( event ) {\n\n rotateEnd.set( event.clientX, event.clientY );\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n scope.update();\n\n }\n\n function handleMouseMoveDolly( event ) {\n\n dollyEnd.set( event.clientX, event.clientY );\n\n dollyDelta.subVectors( dollyEnd, dollyStart );\n\n if ( dollyDelta.y > 0 ) {\n\n dollyOut( getZoomScale() );\n\n } else if ( dollyDelta.y < 0 ) {\n\n dollyIn( getZoomScale() );\n\n }\n\n dollyStart.copy( dollyEnd );\n\n scope.update();\n\n }\n\n function handleMouseMovePan( event ) {\n\n panEnd.set( event.clientX, event.clientY );\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n scope.update();\n\n }\n\n function handleMouseWheel( event ) {\n\n if ( event.deltaY < 0 ) {\n\n dollyIn( getZoomScale() );\n\n } else if ( event.deltaY > 0 ) {\n\n dollyOut( getZoomScale() );\n\n }\n\n scope.update();\n\n }\n\n function handleKeyDown( event ) {\n\n let needsUpdate = false;\n\n switch ( event.code ) {\n\n case scope.keys.MOVE_FORWARD:\n moveForward(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_BACKWARD:\n moveForward(-scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_UP:\n moveUp(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_DOWN:\n moveUp(-scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_RIGHT:\n moveRight(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_LEFT:\n moveRight(-scope.moveSpeed);\n break;\n\n case scope.keys.ROTATE_UP:\n spinUp(scope.turnSpeed);\n break;\n\n case scope.keys.ROTATE_DOWN:\n spinUp(-scope.turnSpeed);\n break;\n\n case scope.keys.ROTATE_LEFT:\n spinRight( -scope.turnSpeed );\n break;\n\n case scope.keys.ROTATE_RIGHT:\n spinRight( scope.turnSpeed );\n break;\n\n }\n\n if ( needsUpdate ) {\n\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n\n }\n\n\n }\n\n function handleTouchStartRotate() {\n\n if ( pointers.length === 1 ) {\n\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n rotateStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartPan() {\n\n if ( pointers.length === 1 ) {\n\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n panStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartDolly() {\n\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyStart.set( 0, distance );\n\n }\n\n function handleTouchStartDollyPan() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enablePan ) handleTouchStartPan();\n\n }\n\n function handleTouchStartDollyRotate() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enableRotate ) handleTouchStartRotate();\n\n }\n\n function handleTouchMoveRotate( event ) {\n\n if ( pointers.length === 1 ) {\n\n rotateEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n rotateEnd.set( x, y );\n\n }\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n }\n\n function handleTouchMovePan( event ) {\n\n if ( pointers.length === 1 ) {\n\n panEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n panEnd.set( x, y );\n\n }\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n }\n\n function handleTouchMoveDolly( event ) {\n\n const position = getSecondPointerPosition( event );\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyEnd.set( 0, distance );\n\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n dollyOut( dollyDelta.y );\n\n dollyStart.copy( dollyEnd );\n\n }\n\n function handleTouchMoveDollyPan( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enablePan ) handleTouchMovePan( event );\n\n }\n\n function handleTouchMoveDollyRotate( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.setPointerCapture( event.pointerId );\n\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n }\n\n //\n\n addPointer( event );\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchStart( event );\n\n } else {\n\n onMouseDown( event );\n\n }\n\n }\n\n function onPointerMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchMove( event );\n\n } else {\n\n onMouseMove( event );\n\n }\n\n }\n\n function onPointerUp( event ) {\n\n removePointer( event );\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.releasePointerCapture( event.pointerId );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n }\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onPointerCancel( event ) {\n\n removePointer( event );\n\n }\n\n function onMouseDown( event ) {\n\n let mouseAction;\n\n switch ( event.button ) {\n\n case 0:\n\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n\n mouseAction = - 1;\n\n }\n\n switch ( mouseAction ) {\n\n case MOUSE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseDownDolly( event );\n\n state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n\n // XIE: Default to pan in 2D mode\n if(scope.object.isOrthographicCamera) {\n\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n\n } else {\n\n if (event.ctrlKey || event.metaKey) {\n\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n\n } else {\n\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n state = STATE.ROTATE;\n\n }\n\n }\n\n break;\n\n case MOUSE.PAN:\n\n if ( event.ctrlKey || event.metaKey ) {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n } else {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onMouseMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n switch ( state ) {\n\n case STATE.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseMoveRotate( event );\n\n break;\n\n case STATE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseMoveDolly( event );\n\n break;\n\n case STATE.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleMouseMovePan( event );\n\n break;\n\n }\n\n }\n\n function onMouseWheel( event ) {\n\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n event.preventDefault();\n\n scope.dispatchEvent( _startEvent );\n\n handleMouseWheel( event );\n\n scope.dispatchEvent( _endEvent );\n\n }\n\n function onKeyDown( event ) {\n\n if ( scope.enabled === false || scope.enablePan === false ) return;\n\n handleKeyDown( event );\n\n }\n\n function onTouchStart( event ) {\n\n trackPointer( event );\n\n switch ( pointers.length ) {\n\n case 1:\n\n switch ( scope.touches.ONE ) {\n\n case TOUCH.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchStartRotate();\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchStartPan();\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n case 2:\n\n switch ( scope.touches.TWO ) {\n\n case TOUCH.DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchStartDollyPan();\n\n state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchStartDollyRotate();\n\n state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onTouchMove( event ) {\n\n trackPointer( event );\n\n switch ( state ) {\n\n case STATE.TOUCH_ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchMoveRotate( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchMovePan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchMoveDollyPan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchMoveDollyRotate( event );\n\n scope.update();\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n }\n\n function onContextMenu( event ) {\n\n if ( scope.enabled === false ) return;\n\n event.preventDefault();\n\n }\n\n function addPointer( event ) {\n\n pointers.push( event );\n\n }\n\n function removePointer( event ) {\n\n delete pointerPositions[ event.pointerId ];\n\n for ( let i = 0; i < pointers.length; i ++ ) {\n\n if ( pointers[ i ].pointerId === event.pointerId ) {\n\n pointers.splice( i, 1 );\n return;\n\n }\n\n }\n\n }\n\n function trackPointer( event ) {\n\n let position = pointerPositions[ event.pointerId ];\n\n if ( position === undefined ) {\n\n position = new Vector2();\n pointerPositions[ event.pointerId ] = position;\n\n }\n\n position.set( event.pageX, event.pageY );\n\n }\n\n function getSecondPointerPosition( event ) {\n\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\n\n return pointerPositions[ pointer.pointerId ];\n\n }\n\n //\n\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n // force an update at start\n\n this.update();\n\n }\n\n}\n\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends MyOrbitControls {\n\n constructor( object, domElement ) {\n\n super( object, domElement );\n\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN;\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\n\n this.touches.ONE = TOUCH.PAN;\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\n\n }\n\n}\n\nexport { MyOrbitControls, MapControls };\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.0';\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","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface WindowModel extends ElementModel {\r\n // solar heat gain coefficient (https://en.wikipedia.org/wiki/Solar_gain) = 1 - opacity\r\n opacity: number;\r\n tint: string;\r\n uValue: number;\r\n\r\n shutter: ShutterProps;\r\n\r\n mullion: boolean;\r\n mullionWidth: number;\r\n mullionSpacing: number;\r\n mullionColor: string;\r\n\r\n // frameColor is using color\r\n frame: boolean;\r\n frameWidth: number;\r\n sillWidth: number;\r\n\r\n windowType: WindowType;\r\n archHeight: number;\r\n\r\n parentType?: ObjectType.Wall | ObjectType.Roof;\r\n\r\n // polygonal window top vertex position [x, h], x is relative to center(from -0.5 to 0.5), h is absolute\r\n polygonTop?: number[];\r\n\r\n // if empty, it is a hole on its parent (roof or window)\r\n empty?: boolean;\r\n\r\n // Is this window inside a building? If yes, this will be no heat exchange. By default, it is not.\r\n interior?: boolean;\r\n}\r\n\r\nexport interface ShutterProps {\r\n showLeft: boolean;\r\n showRight: boolean;\r\n color: string;\r\n width: number;\r\n}\r\n\r\nexport enum WindowType {\r\n Default = 'Default',\r\n Arched = 'Arched',\r\n Circular = 'Circular',\r\n Polygonal = 'Polygonal',\r\n}\r\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=\"","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n CuboidTexture,\r\n DoorTexture,\r\n FlowerType,\r\n FoundationTexture,\r\n HumanName,\r\n ObjectType,\r\n Orientation,\r\n ParabolicDishStructureType,\r\n RoofTexture,\r\n TrackerType,\r\n TreeType,\r\n WallTexture,\r\n} from '../types';\r\nimport short from 'short-uuid';\r\nimport { Vector3 } from 'three';\r\nimport { ElementModel } from './ElementModel';\r\nimport { HumanModel } from './HumanModel';\r\nimport { TreeModel } from './TreeModel';\r\nimport { FlowerModel } from './FlowerModel';\r\nimport { SensorModel } from './SensorModel';\r\nimport { CuboidModel } from './CuboidModel';\r\nimport { FoundationModel } from './FoundationModel';\r\nimport { SolarPanelModel } from './SolarPanelModel';\r\nimport { PvModel } from './PvModel';\r\nimport { WallFill, WallModel, WallStructure } from './WallModel';\r\nimport {\r\n GableRoofModel,\r\n GambrelRoofModel,\r\n HipRoofModel,\r\n MansardRoofModel,\r\n PyramidRoofModel,\r\n RoofModel,\r\n RoofStructure,\r\n RoofType,\r\n} from './RoofModel';\r\nimport { GROUND_ID } from '../constants';\r\nimport { WindowModel } from './WindowModel';\r\nimport { Point2 } from './Point2';\r\nimport { PolygonModel } from './PolygonModel';\r\nimport { Util } from '../Util';\r\nimport { HumanData } from '../HumanData';\r\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\r\nimport { ParabolicDishModel } from './ParabolicDishModel';\r\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\r\nimport { HeliostatModel } from './HeliostatModel';\r\nimport { DoorModel } from './DoorModel';\r\nimport { WindTurbineModel } from './WindTurbineModel';\r\nimport { FlowerData } from '../FlowerData';\r\nimport { LightModel } from './LightModel';\r\nimport { HvacSystem } from './HvacSystem';\r\nimport { useStore } from 'src/stores/common';\r\nimport { RoofUtil } from '../views/roof/RoofUtil';\r\n\r\nexport class ElementModelFactory {\r\n static makeHuman(name: HumanName, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Human,\r\n name: name ?? HumanName.Jack,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: HumanData.fetchWidth(name ?? HumanName.Jack),\r\n lz: HumanData.fetchHeight(name ?? HumanName.Jack),\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as HumanModel;\r\n }\r\n\r\n static makeTree(type: TreeType, spread: number, height: number, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Tree,\r\n name: type ?? TreeType.Dogwood,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: spread ?? 3,\r\n lz: height ?? 4,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as TreeModel;\r\n }\r\n\r\n static makeSolarPanel(\r\n parent: ElementModel,\r\n pvModel: PvModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n orientation?: Orientation,\r\n poleHeight?: number,\r\n poleSpacing?: number,\r\n tiltAngle?: number,\r\n relativeAzimuth?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n frameColor?: string,\r\n lx?: number,\r\n ly?: number,\r\n parentType?: ObjectType,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n parentType = ObjectType.Foundation;\r\n break;\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n parentType = ObjectType.Cuboid;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.SolarPanel,\r\n pvModelName: pvModel.name,\r\n trackerType: TrackerType.NO_TRACKER,\r\n relativeAzimuth: relativeAzimuth ?? 0,\r\n tiltAngle: tiltAngle ?? 0,\r\n orientation: orientation ?? Orientation.landscape,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 1,\r\n poleRadius: 0.05,\r\n poleSpacing: poleSpacing ?? 3,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? (orientation === Orientation.landscape ? pvModel.length : pvModel.width),\r\n ly: ly ?? (orientation === Orientation.landscape ? pvModel.width : pvModel.length),\r\n lz: pvModel.thickness,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n color: '#fff',\r\n frameColor: frameColor ?? 'white',\r\n parentType: parentType,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SolarPanelModel;\r\n }\r\n\r\n static makeFlower(name: FlowerType, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Flower,\r\n name: name ?? FlowerType.YellowFlower,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: FlowerData.fetchSpread(name ?? FlowerType.YellowFlower),\r\n lz: FlowerData.fetchHeight(name ?? FlowerType.YellowFlower),\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as FlowerModel;\r\n }\r\n\r\n static makeCuboid(x: number, y: number, height: number, faceColors: string[], faceTextures: CuboidTexture[]) {\r\n return {\r\n type: ObjectType.Cuboid,\r\n cx: x,\r\n cy: y,\r\n cz: height ? height / 2 : 2,\r\n lx: 0.1,\r\n ly: 0.1,\r\n lz: height ?? 4,\r\n color: '#808080',\r\n faceColors: faceColors ?? ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'],\r\n textureTypes: faceTextures ?? [\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: useStore.getState().actionState.cuboidStackable,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: GROUND_ID,\r\n selected: false,\r\n id: short.generate() as string,\r\n } as CuboidModel;\r\n }\r\n\r\n static makeFoundation(x: number, y: number, height: number, color: string, texture: FoundationTexture) {\r\n return {\r\n type: ObjectType.Foundation,\r\n cx: x,\r\n cy: y,\r\n cz: height ? height / 2 : 0.05,\r\n lx: 0,\r\n ly: 0,\r\n lz: height ?? 0.1,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: GROUND_ID,\r\n selected: false,\r\n color: color ?? '#808080',\r\n textureType: texture ?? FoundationTexture.NoTexture,\r\n solarUpdraftTower: {},\r\n solarAbsorberPipe: {},\r\n solarPowerTower: {},\r\n hvacSystem: { thermostatSetpoint: 20 } as HvacSystem,\r\n id: short.generate() as string,\r\n } as FoundationModel;\r\n }\r\n\r\n static makeParabolicTrough(\r\n parent: ElementModel,\r\n reflectance: number,\r\n absorptance: number,\r\n opticalEfficiency: number,\r\n thermalEfficiency: number,\r\n latusRectum: number,\r\n poleHeight: number,\r\n moduleLength: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicTrough,\r\n reflectance: reflectance ?? 0.9,\r\n absorptance: absorptance ?? 0.95,\r\n opticalEfficiency: opticalEfficiency ?? 0.7,\r\n thermalEfficiency: thermalEfficiency ?? 0.3,\r\n moduleLength: moduleLength ?? 3,\r\n latusRectum: latusRectum ?? 2,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n absorberTubeRadius: 0.05,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\r\n poleRadius: 0.05,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 9, // north-south alignment by default\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicTroughModel;\r\n }\r\n\r\n static makeParabolicDish(\r\n parent: ElementModel,\r\n reflectance: number,\r\n absorptance: number,\r\n opticalEfficiency: number,\r\n thermalEfficiency: number,\r\n latusRectum: number,\r\n poleHeight: number,\r\n receiverStructure: ParabolicDishStructureType,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicDish,\r\n reflectance: reflectance ?? 0.9,\r\n absorptance: absorptance ?? 0.95,\r\n opticalEfficiency: opticalEfficiency ?? 0.7,\r\n thermalEfficiency: thermalEfficiency ?? 0.3,\r\n moduleLength: 3,\r\n latusRectum: latusRectum ?? 8,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n structureType: receiverStructure ?? ParabolicDishStructureType.CentralPole,\r\n receiverRadius: 0.25,\r\n receiverPoleRadius: 0.1,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to the radius (half of lx or ly)\r\n poleRadius: 0.2,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 4, // diameter of the rim\r\n ly: ly ?? 4, // diameter of the rim (identical to lx)\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicDishModel;\r\n }\r\n\r\n static makeFresnelReflector(\r\n parent: ElementModel,\r\n receiverId: string,\r\n reflectance: number,\r\n poleHeight: number,\r\n moduleLength: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.FresnelReflector,\r\n receiverId: receiverId ?? 'None',\r\n reflectance: reflectance ?? 0.9,\r\n moduleLength: moduleLength ?? 3,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\r\n poleRadius: 0.05,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 9, // north-south alignment by default\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as FresnelReflectorModel;\r\n }\r\n\r\n static makeHeliostat(\r\n parent: ElementModel,\r\n towerId: string,\r\n reflectance: number,\r\n poleHeight: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Heliostat,\r\n towerId: towerId ?? 'None',\r\n reflectance: reflectance ?? 0.9,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width or height, whichever is larger\r\n poleRadius: 0.1,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 4,\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as HeliostatModel;\r\n }\r\n\r\n static makeWindTurbine(parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.WindTurbine,\r\n bladeRadius: 10,\r\n towerRadius: 0.5,\r\n towerHeight: 20,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 3,\r\n lz: 15,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as WindTurbineModel;\r\n }\r\n\r\n static makePolygon(\r\n parent: ElementModel,\r\n x: number,\r\n y: number,\r\n z: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n parentType?: ObjectType,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const hx = 0.2;\r\n const hy = 0.2;\r\n const hz = 0.2;\r\n let rx = x;\r\n let ry = y;\r\n // if the parent is a cuboid, determine the 2D coordinates within each face\r\n if (parent.type === ObjectType.Cuboid && normal) {\r\n if (Util.isUnitVectorX(normal)) {\r\n // west and east face\r\n rx = z;\r\n } else if (Util.isUnitVectorY(normal)) {\r\n // south and north face\r\n ry = z;\r\n }\r\n } else if (parent.type === ObjectType.Wall) {\r\n ry = z;\r\n }\r\n return {\r\n type: ObjectType.Polygon,\r\n cx: rx,\r\n cy: ry,\r\n cz: 0,\r\n lx: 2 * hx,\r\n ly: 2 * hy,\r\n lz: 2 * hz,\r\n color: '#ffffff',\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n vertices: [\r\n { x: Math.max(-0.5, rx - hx), y: Math.max(-0.5, ry - hy) } as Point2,\r\n { x: Math.max(-0.5, rx - hx), y: Math.min(0.5, ry + hy) } as Point2,\r\n { x: Math.min(0.5, rx + hx), y: Math.min(0.5, ry + hy) } as Point2,\r\n { x: Math.min(0.5, rx + hx), y: Math.max(-0.5, ry - hy) } as Point2,\r\n ],\r\n parentId: parent.id,\r\n parentType: parentType,\r\n foundationId: foundationId,\r\n selected: false,\r\n filled: true,\r\n selectedIndex: -1,\r\n id: short.generate() as string,\r\n } as PolygonModel;\r\n }\r\n\r\n static makeWall(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Wall,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0,\r\n ly: actionState.wallThickness ?? 0.3,\r\n lz: actionState.wallHeight ?? 5,\r\n parapet: actionState.wallParapet,\r\n eavesLength: actionState.wallEavesLength ?? 0.3,\r\n rValue: actionState.wallRValue ?? 3,\r\n fill: WallFill.Full,\r\n leftUnfilledHeight: 0.5,\r\n rightUnfilledHeight: 0.5,\r\n leftTopPartialHeight: actionState.wallHeight - 0.5,\r\n rightTopPartialHeight: actionState.wallHeight - 0.5,\r\n relativeAngle: 0,\r\n leftPoint: [],\r\n rightPoint: [],\r\n leftJoints: [],\r\n rightJoints: [],\r\n textureType: actionState.wallTexture ?? WallTexture.Default,\r\n color: actionState.wallColor ?? '#ffffff',\r\n volumetricHeatCapacity: actionState.wallVolumetricHeatCapacity ?? 0.5,\r\n wallStructure: actionState.wallStructure ?? WallStructure.Default,\r\n studSpacing: actionState.wallStructureSpacing ?? 2,\r\n studWidth: actionState.wallStructureWidth ?? 0.1,\r\n studColor: actionState.wallStructureColor ?? '#ffffff',\r\n opacity: actionState.wallOpacity !== undefined ? actionState.wallOpacity : 0.5,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n windows: [],\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as WallModel;\r\n }\r\n\r\n static makeSensor(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3, rotation?: number[]) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Sensor,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0.1,\r\n ly: 0.1,\r\n lz: 0.01,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n parentType: parent.type,\r\n id: short.generate() as string,\r\n } as SensorModel;\r\n }\r\n\r\n static makeLight(\r\n parent: ElementModel,\r\n decay: number,\r\n distance: number,\r\n intensity: number,\r\n color: string,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Light,\r\n decay: decay ?? 2,\r\n distance: distance ?? 5,\r\n intensity: intensity ?? 3,\r\n color: color ?? '#ffff99',\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0.16,\r\n ly: 0.16,\r\n lz: 0.08,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n parentType: parent.type,\r\n id: short.generate() as string,\r\n } as LightModel;\r\n }\r\n\r\n static makeWindow(\r\n parent: ElementModel,\r\n cx: number,\r\n cy: number,\r\n cz: number,\r\n parentType: ObjectType,\r\n rotation?: number[],\r\n lx = 0,\r\n lz = 0,\r\n ) {\r\n let foundationId;\r\n let ly = 0;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n ly = parent.ly;\r\n break;\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n ly = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n const actionState = useStore.getState().actionState;\r\n const shutter = {\r\n showLeft: actionState.windowShutterLeft,\r\n showRight: actionState.windowShutterRight,\r\n color: actionState.windowShutterColor,\r\n width: actionState.windowShutterWidth,\r\n };\r\n return {\r\n type: ObjectType.Window,\r\n cx: cx,\r\n cy: cy,\r\n cz: cz,\r\n lx: lx,\r\n ly: ly,\r\n lz: lz,\r\n shutter: shutter,\r\n mullion: actionState.windowMullion,\r\n mullionWidth: actionState.windowMullionWidth,\r\n mullionSpacing: actionState.windowMullionSpacing,\r\n mullionColor: actionState.windowMullionColor,\r\n frame: actionState.windowFrame,\r\n frameWidth: actionState.windowFrameWidth,\r\n sillWidth: RoofUtil.isTypeRoof(parentType) ? 0 : actionState.windowSillWidth,\r\n windowType: actionState.windowType,\r\n empty: actionState.windowEmpty,\r\n interior: actionState.windowInterior,\r\n archHeight: actionState.windowArchHeight,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n color: actionState.windowColor ?? '#ffffff', // frame color\r\n tint: actionState.windowTint ?? '#73D8FF', // glass color\r\n opacity: actionState.windowOpacity !== undefined ? actionState.windowOpacity : 0.5,\r\n uValue: actionState.windowUValue ?? 0.5,\r\n normal: [0, -1, 0],\r\n rotation: rotation ? [...rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n parentType: parentType,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as WindowModel;\r\n }\r\n\r\n static makeDoor(parent: ElementModel) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Door,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n doorType: actionState.doorType,\r\n filled: actionState.doorFilled,\r\n interior: actionState.doorInterior,\r\n archHeight: actionState.doorArchHeight,\r\n textureType: actionState.doorTexture ?? DoorTexture.Default,\r\n color: actionState.doorColor ?? '#ffffff',\r\n uValue: actionState.doorUValue ?? 0.5,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as DoorModel;\r\n }\r\n\r\n static makePyramidRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Pyramid,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as PyramidRoofModel;\r\n }\r\n\r\n static makeGableRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Gable,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n ridgeLeftPoint: [0, 1],\r\n ridgeRightPoint: [0, 1],\r\n } as GableRoofModel;\r\n }\r\n\r\n static makeHipRoof(wallsId: string[], parent: ElementModel, ridgeLength: number) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Hip,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n leftRidgeLength: (ridgeLength ?? 2) / 2,\r\n rightRidgeLength: (ridgeLength ?? 2) / 2,\r\n } as HipRoofModel;\r\n }\r\n\r\n static makeGambrelRoof(wallsId: string[], parent: ElementModel) {\r\n const xPercent = 0.35;\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Gambrel,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n topRidgePoint: [0, 1],\r\n frontRidgePoint: [xPercent, 0.5],\r\n backRidgePoint: [xPercent, 0.5],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as GambrelRoofModel;\r\n }\r\n\r\n static makeMansardRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Mansard,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n ridgeWidth: 1,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as MansardRoofModel;\r\n }\r\n}\r\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\nimport { PrimitiveStoreState } from '../commonPrimitive';\nimport { DataStoreState } from '../commonData';\n\nexport const set = (state: CommonStoreState) => state.set;\n\nexport const user = (state: CommonStoreState) => state.user;\n\nexport const userCount = (state: PrimitiveStoreState) => state.userCount;\n\nexport const showEconomicsPanel = (state: PrimitiveStoreState) => state.showEconomicsPanel;\n\nexport const showNavigationPanel = (state: PrimitiveStoreState) => state.showNavigationPanel;\n\nexport const minimumNavigationMoveSpeed = (state: CommonStoreState) => state.minimumNavigationMoveSpeed;\n\nexport const minimumNavigationTurnSpeed = (state: CommonStoreState) => state.minimumNavigationTurnSpeed;\n\nexport const navigationMoveSpeed = (state: PrimitiveStoreState) => state.navigationMoveSpeed;\n\nexport const navigationTurnSpeed = (state: PrimitiveStoreState) => state.navigationTurnSpeed;\n\nexport const getHeatmap = (state: DataStoreState) => state.getHeatmap;\n\nexport const setHeatmap = (state: DataStoreState) => state.setHeatmap;\n\nexport const clearHeatmaps = (state: DataStoreState) => state.clearHeatmaps;\n\nexport const clearDataStore = (state: DataStoreState) => state.clearDataStore;\n\nexport const flagOfDailySimulation = (state: PrimitiveStoreState) => state.flagOfDailySimulation;\n\nexport const hourlyHeatExchangeArrayMap = (state: DataStoreState) => state.hourlyHeatExchangeArrayMap;\n\nexport const setHourlyHeatExchangeArray = (state: DataStoreState) => state.setHourlyHeatExchangeArray;\n\nexport const hourlySolarHeatGainArrayMap = (state: DataStoreState) => state.hourlySolarHeatGainArrayMap;\n\nexport const setHourlySolarHeatGainArray = (state: DataStoreState) => state.setHourlySolarHeatGainArray;\n\nexport const hourlySolarPanelOutputArrayMap = (state: DataStoreState) => state.hourlySolarPanelOutputArrayMap;\n\nexport const setHourlySolarPanelOutputArray = (state: DataStoreState) => state.setHourlySolarPanelOutputArray;\n\nexport const getRoofSegmentVertices = (state: DataStoreState) => state.getRoofSegmentVertices;\n\nexport const getRoofSegmentVerticesWithoutOverhang = (state: DataStoreState) =>\n state.getRoofSegmentVerticesWithoutOverhang;\n\nexport const changed = (state: PrimitiveStoreState) => state.changed;\n\nexport const setChanged = (state: PrimitiveStoreState) => state.setChanged;\n\nexport const setSkipChange = (state: PrimitiveStoreState) => state.setSkipChange;\n\nexport const applyCount = (state: CommonStoreState) => state.applyCount;\n\nexport const setApplyCount = (state: CommonStoreState) => state.setApplyCount;\n\nexport const revertApply = (state: CommonStoreState) => state.revertApply;\n\nexport const elements = (state: CommonStoreState) => state.elements;\n\nexport const notes = (state: CommonStoreState) => state.notes;\n\nexport const pvModules = (state: CommonStoreState) => state.pvModules;\n\nexport const loadPvModules = (state: CommonStoreState) => state.loadPvModules;\n\nexport const getPvModule = (state: CommonStoreState) => state.getPvModule;\n\nexport const floatingWindowOpacity = (state: CommonStoreState) => state.floatingWindowOpacity;\n\nexport const selectedFloatingWindow = (state: CommonStoreState) => state.selectedFloatingWindow;\n\nexport const language = (state: CommonStoreState) => state.language;\n\nexport const locale = (state: CommonStoreState) => state.locale;\n\nexport const loggable = (state: CommonStoreState) => state.loggable;\n\nexport const actionInfo = (state: CommonStoreState) => state.actionInfo;\n\nexport const currentUndoable = (state: CommonStoreState) => state.currentUndoable;\n\nexport const openModelsMap = (state: PrimitiveStoreState) => state.openModelsMap;\n\nexport const modelsMapLatitude = (state: CommonStoreState) => state.modelsMapLatitude;\n\nexport const modelsMapLongitude = (state: CommonStoreState) => state.modelsMapLongitude;\n\nexport const modelsMapZoom = (state: CommonStoreState) => state.modelsMapZoom;\n\nexport const modelsMapTilt = (state: CommonStoreState) => state.modelsMapTilt;\n\nexport const modelsMapType = (state: CommonStoreState) => state.modelsMapType;\n\nexport const modelsMapWeatherStations = (state: PrimitiveStoreState) => state.modelsMapWeatherStations;\n\nexport const showCloudFileTitleDialog = (state: CommonStoreState) => state.showCloudFileTitleDialog;\n\nexport const showCloudFileTitleDialogFlag = (state: CommonStoreState) => state.showCloudFileTitleDialogFlag;\n\nexport const cloudFile = (state: CommonStoreState) => state.cloudFile;\n\nexport const latestModelSite = (state: CommonStoreState) => state.latestModelSite;\n\nexport const modelSites = (state: CommonStoreState) => state.modelSites;\n\nexport const peopleModels = (state: CommonStoreState) => state.peopleModels;\n\nexport const saveCloudFileFlag = (state: PrimitiveStoreState) => state.saveCloudFileFlag;\n\nexport const createProjectFlag = (state: PrimitiveStoreState) => state.createProjectFlag;\n\nexport const saveProjectFlag = (state: PrimitiveStoreState) => state.saveProjectFlag;\n\nexport const curateDesignToProjectFlag = (state: PrimitiveStoreState) => state.curateDesignToProjectFlag;\n\nexport const showProjectsFlag = (state: PrimitiveStoreState) => state.showProjectsFlag;\n\nexport const updateProjectsFlag = (state: PrimitiveStoreState) => state.updateProjectsFlag;\n\nexport const modelsMapFlag = (state: PrimitiveStoreState) => state.modelsMapFlag;\n\nexport const leaderboardFlag = (state: PrimitiveStoreState) => state.leaderboardFlag;\n\nexport const showLeaderboard = (state: PrimitiveStoreState) => state.showLeaderboard;\n\nexport const publishOnModelsMapFlag = (state: PrimitiveStoreState) => state.publishOnModelsMapFlag;\n\nexport const listCloudFilesFlag = (state: PrimitiveStoreState) => state.listCloudFilesFlag;\n\nexport const localContentToImportAfterCloudFileUpdate = (state: CommonStoreState) =>\n state.localContentToImportAfterCloudFileUpdate;\n\nexport const localFileName = (state: CommonStoreState) => state.localFileName;\n\nexport const createNewFileFlag = (state: CommonStoreState) => state.createNewFileFlag;\n\nexport const openLocalFileFlag = (state: CommonStoreState) => state.openLocalFileFlag;\n\nexport const saveLocalFileDialogVisible = (state: PrimitiveStoreState) => state.saveLocalFileDialogVisible;\n\nexport const fileChanged = (state: CommonStoreState) => state.fileChanged;\n\nexport const undoManager = (state: CommonStoreState) => state.undoManager;\n\nexport const addUndoable = (state: CommonStoreState) => state.addUndoable;\n\nexport const importContent = (state: CommonStoreState) => state.importContent;\n\nexport const exportContent = (state: CommonStoreState) => state.exportContent;\n\nexport const clearContent = (state: CommonStoreState) => state.clearContent;\n\nexport const createEmptyFile = (state: CommonStoreState) => state.createEmptyFile;\n\nexport const aabb = (state: CommonStoreState) => state.aabb;\n\nexport const animateSun = (state: PrimitiveStoreState) => state.animateSun;\n\nexport const animate24Hours = (state: CommonStoreState) => state.animate24Hours;\n\nexport const runDailyThermalSimulation = (state: PrimitiveStoreState) => state.runDailyThermalSimulation;\n\nexport const pauseDailyThermalSimulation = (state: PrimitiveStoreState) => state.pauseDailyThermalSimulation;\n\nexport const runYearlyThermalSimulation = (state: PrimitiveStoreState) => state.runYearlyThermalSimulation;\n\nexport const pauseYearlyThermalSimulation = (state: PrimitiveStoreState) => state.pauseYearlyThermalSimulation;\n\nexport const clearDailySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearDailySimulationResultsFlag;\n\nexport const clearYearlySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearYearlySimulationResultsFlag;\n\nexport const runDynamicSimulation = (state: PrimitiveStoreState) => state.runDynamicSimulation;\n\nexport const runStaticSimulation = (state: PrimitiveStoreState) => state.runStaticSimulation;\n\nexport const pauseSimulation = (state: PrimitiveStoreState) => state.pauseSimulation;\n\nexport const runEvolution = (state: PrimitiveStoreState) => state.runEvolution;\n\nexport const pauseEvolution = (state: PrimitiveStoreState) => state.pauseEvolution;\n\nexport const objectiveEvaluationIndex = (state: PrimitiveStoreState) => state.objectiveEvaluationIndex;\n\nexport const evolutionMethod = (state: CommonStoreState) => state.evolutionMethod;\n\nexport const updateSceneRadiusFlag = (state: CommonStoreState) => state.updateSceneRadiusFlag;\n\nexport const updateSceneRadius = (state: CommonStoreState) => state.updateSceneRadius;\n\nexport const sceneRadius = (state: CommonStoreState) => state.sceneRadius;\n\nexport const cameraDirection = (state: CommonStoreState) => state.cameraDirection;\n\nexport const getCameraDirection = (state: CommonStoreState) => state.getCameraDirection;\n\nexport const getElementById = (state: CommonStoreState) => state.getElementById;\n\nexport const getFoundation = (state: CommonStoreState) => state.getFoundation;\n\nexport const getParent = (state: CommonStoreState) => state.getParent;\n\nexport const getChildren = (state: CommonStoreState) => state.getChildren;\n\nexport const getChildrenOfType = (state: CommonStoreState) => state.getChildrenOfType;\n\nexport const selectedElement = (state: CommonStoreState) => state.selectedElement;\n\nexport const getSelectedElement = (state: CommonStoreState) => state.getSelectedElement;\n\nexport const overlapWithSibling = (state: CommonStoreState) => state.overlapWithSibling;\n\nexport const selectedSideIndex = (state: CommonStoreState) => state.selectedSideIndex;\n\nexport const setElementPosition = (state: CommonStoreState) => state.setElementPosition;\n\nexport const setElementSize = (state: CommonStoreState) => state.setElementSize;\n\nexport const setElementNormal = (state: CommonStoreState) => state.setElementNormal;\n\nexport const updateAllElementLocks = (state: CommonStoreState) => state.updateAllElementLocks;\n\nexport const updateElementLockByFoundationId = (state: CommonStoreState) => state.updateElementLockByFoundationId;\n\nexport const updateElementLockByParentId = (state: CommonStoreState) => state.updateElementLockByParentId;\n\nexport const updateElementLockById = (state: CommonStoreState) => state.updateElementLockById;\n\nexport const updateElementReferenceById = (state: CommonStoreState) => state.updateElementReferenceById;\n\nexport const updateElementLabelById = (state: CommonStoreState) => state.updateElementLabelById;\n\nexport const updateElementShowLabelById = (state: CommonStoreState) => state.updateElementShowLabelById;\n\nexport const updateElementCxById = (state: CommonStoreState) => state.updateElementCxById;\n\nexport const updateElementCyById = (state: CommonStoreState) => state.updateElementCyById;\n\nexport const updateElementCzById = (state: CommonStoreState) => state.updateElementCzById;\n\nexport const updateElementCzForAll = (state: CommonStoreState) => state.updateElementCzForAll;\n\nexport const updateElementLxById = (state: CommonStoreState) => state.updateElementLxById;\n\nexport const updateElementLxAboveFoundation = (state: CommonStoreState) => state.updateElementLxAboveFoundation;\n\nexport const updateElementLxForAll = (state: CommonStoreState) => state.updateElementLxForAll;\n\nexport const updateElementLyById = (state: CommonStoreState) => state.updateElementLyById;\n\nexport const updateElementLyAboveFoundation = (state: CommonStoreState) => state.updateElementLyAboveFoundation;\n\nexport const updateElementLyForAll = (state: CommonStoreState) => state.updateElementLyForAll;\n\nexport const updateElementLzById = (state: CommonStoreState) => state.updateElementLzById;\n\nexport const updateElementLzForAll = (state: CommonStoreState) => state.updateElementLzForAll;\n\nexport const updateElementColorById = (state: CommonStoreState) => state.updateElementColorById;\n\nexport const updateElementColorOnSurface = (state: CommonStoreState) => state.updateElementColorOnSurface;\n\nexport const updateElementColorAboveFoundation = (state: CommonStoreState) => state.updateElementColorAboveFoundation;\n\nexport const updateElementColorForAll = (state: CommonStoreState) => state.updateElementColorForAll;\n\nexport const updateElementLineColorById = (state: CommonStoreState) => state.updateElementLineColorById;\n\nexport const updateElementLineColorOnSurface = (state: CommonStoreState) => state.updateElementLineColorOnSurface;\n\nexport const updateElementLineColorAboveFoundation = (state: CommonStoreState) =>\n state.updateElementLineColorAboveFoundation;\n\nexport const updateElementLineColorForAll = (state: CommonStoreState) => state.updateElementLineColorForAll;\n\nexport const updateElementLineWidthById = (state: CommonStoreState) => state.updateElementLineWidthById;\n\nexport const updateElementLineWidthOnSurface = (state: CommonStoreState) => state.updateElementLineWidthOnSurface;\n\nexport const updateElementLineWidthAboveFoundation = (state: CommonStoreState) =>\n state.updateElementLineWidthAboveFoundation;\n\nexport const updateElementLineWidthForAll = (state: CommonStoreState) => state.updateElementLineWidthForAll;\n\nexport const updateElementRotationById = (state: CommonStoreState) => state.updateElementRotationById;\n\nexport const updateElementRotationForAll = (state: CommonStoreState) => state.updateElementRotationForAll;\n\nexport const foundationActionScope = (state: CommonStoreState) => state.foundationActionScope;\n\nexport const setFoundationActionScope = (state: CommonStoreState) => state.setFoundationActionScope;\n\nexport const polygonActionScope = (state: CommonStoreState) => state.polygonActionScope;\n\nexport const setPolygonActionScope = (state: CommonStoreState) => state.setPolygonActionScope;\n\nexport const updatePolygonVertexPositionById = (state: CommonStoreState) => state.updatePolygonVertexPositionById;\n\nexport const updatePolygonVerticesById = (state: CommonStoreState) => state.updatePolygonVerticesById;\n\nexport const cuboidActionScope = (state: CommonStoreState) => state.cuboidActionScope;\n\nexport const setCuboidActionScope = (state: CommonStoreState) => state.setCuboidActionScope;\n\nexport const solarPanelActionScope = (state: CommonStoreState) => state.solarPanelActionScope;\n\nexport const setSolarPanelActionScope = (state: CommonStoreState) => state.setSolarPanelActionScope;\n\nexport const updateSolarCollectorDailyYieldById = (state: CommonStoreState) => state.updateSolarCollectorDailyYieldById;\n\nexport const updateSolarCollectorYearlyYieldById = (state: CommonStoreState) =>\n state.updateSolarCollectorYearlyYieldById;\n\nexport const updateSolarPanelTiltAngleById = (state: CommonStoreState) => state.updateSolarPanelTiltAngleById;\n\nexport const updateSolarCollectorDrawSunBeamById = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamById;\n\nexport const updateSolarCollectorDrawSunBeamAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamAboveFoundation;\n\nexport const updateSolarCollectorDrawSunBeamForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamForAll;\n\nexport const updateSolarCollectorRelativeAzimuthById = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthById;\n\nexport const updateSolarCollectorRelativeAzimuthOnSurface = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthOnSurface;\n\nexport const updateSolarCollectorRelativeAzimuthAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthAboveFoundation;\n\nexport const updateSolarCollectorRelativeAzimuthForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthForAll;\n\nexport const updateSolarCollectorPoleHeightById = (state: CommonStoreState) => state.updateSolarCollectorPoleHeightById;\n\nexport const updateSolarCollectorPoleHeightOnSurface = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightOnSurface;\n\nexport const updateSolarCollectorPoleHeightAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightAboveFoundation;\n\nexport const updateSolarCollectorPoleHeightForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightForAll;\n\nexport const updateSolarCollectorPoleRadiusById = (state: CommonStoreState) => state.updateSolarCollectorPoleRadiusById;\n\nexport const updateSolarCollectorPoleRadiusAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleRadiusAboveFoundation;\n\nexport const updateSolarCollectorPoleRadiusForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleRadiusForAll;\n\nexport const updateCspReflectanceById = (state: CommonStoreState) => state.updateCspReflectanceById;\n\nexport const updateCspReflectanceAboveFoundation = (state: CommonStoreState) =>\n state.updateCspReflectanceAboveFoundation;\n\nexport const updateCspReflectanceForAll = (state: CommonStoreState) => state.updateCspReflectanceForAll;\n\nexport const updateParabolicCollectorAbsorptanceById = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceById;\n\nexport const updateParabolicCollectorAbsorptanceAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceAboveFoundation;\n\nexport const updateParabolicCollectorAbsorptanceForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceForAll;\n\nexport const updateParabolicCollectorOpticalEfficiencyById = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyById;\n\nexport const updateParabolicCollectorOpticalEfficiencyAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyAboveFoundation;\n\nexport const updateParabolicCollectorOpticalEfficiencyForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyForAll;\n\nexport const updateParabolicCollectorThermalEfficiencyById = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyById;\n\nexport const updateParabolicCollectorThermalEfficiencyAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyAboveFoundation;\n\nexport const updateParabolicCollectorThermalEfficiencyForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyForAll;\n\nexport const parabolicTroughActionScope = (state: CommonStoreState) => state.parabolicTroughActionScope;\n\nexport const setParabolicTroughActionScope = (state: CommonStoreState) => state.setParabolicTroughActionScope;\n\nexport const fresnelReflectorActionScope = (state: CommonStoreState) => state.fresnelReflectorActionScope;\n\nexport const setFresnelReflectorActionScope = (state: CommonStoreState) => state.setFresnelReflectorActionScope;\n\nexport const heliostatActionScope = (state: CommonStoreState) => state.heliostatActionScope;\n\nexport const setHeliostatActionScope = (state: CommonStoreState) => state.setHeliostatActionScope;\n\nexport const updateSolarReceiverById = (state: CommonStoreState) => state.updateSolarReceiverById;\n\nexport const updateSolarReceiverAboveFoundation = (state: CommonStoreState) => state.updateSolarReceiverAboveFoundation;\n\nexport const updateSolarReceiverForAll = (state: CommonStoreState) => state.updateSolarReceiverForAll;\n\nexport const parabolicDishActionScope = (state: CommonStoreState) => state.parabolicDishActionScope;\n\nexport const setParabolicDishActionScope = (state: CommonStoreState) => state.setParabolicDishActionScope;\n\nexport const updateParabolaLatusRectumById = (state: CommonStoreState) => state.updateParabolaLatusRectumById;\n\nexport const updateParabolaLatusRectumAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolaLatusRectumAboveFoundation;\n\nexport const updateParabolaLatusRectumForAll = (state: CommonStoreState) => state.updateParabolaLatusRectumForAll;\n\nexport const updateModuleLengthById = (state: CommonStoreState) => state.updateModuleLengthById;\n\nexport const updateModuleLengthAboveFoundation = (state: CommonStoreState) => state.updateModuleLengthAboveFoundation;\n\nexport const updateModuleLengthForAll = (state: CommonStoreState) => state.updateModuleLengthForAll;\n\nexport const updateInsideLightById = (state: CommonStoreState) => state.updateInsideLightById;\n\nexport const updateInsideLightsByParentId = (state: CommonStoreState) => state.updateInsideLightsByParentId;\n\nexport const copyElementById = (state: CommonStoreState) => state.copyElementById;\n\nexport const removeElementById = (state: CommonStoreState) => state.removeElementById;\n\nexport const removeElementsByType = (state: CommonStoreState) => state.removeElementsByType;\n\nexport const clearDeletedElements = (state: CommonStoreState) => state.clearDeletedElements;\n\nexport const countElementsByReferenceId = (state: CommonStoreState) => state.countElementsByReferenceId;\n\nexport const removeElementsByReferenceId = (state: CommonStoreState) => state.removeElementsByReferenceId;\n\nexport const removeAllChildElementsByType = (state: CommonStoreState) => state.removeAllChildElementsByType;\n\nexport const removeAllElementsOnFoundationByType = (state: CommonStoreState) =>\n state.removeAllElementsOnFoundationByType;\n\nexport const pasteElementsToPoint = (state: CommonStoreState) => state.pasteElementsToPoint;\n\nexport const pasteElementsByKey = (state: CommonStoreState) => state.pasteElementsByKey;\n\nexport const elementsToPaste = (state: CommonStoreState) => state.elementsToPaste;\n\nexport const selectMe = (state: CommonStoreState) => state.selectMe;\n\nexport const selectNone = (state: CommonStoreState) => state.selectNone;\n\nexport const addElement = (state: CommonStoreState) => state.addElement;\n\nexport const objectTypeToAdd = (state: CommonStoreState) => state.objectTypeToAdd;\n\nexport const actionModeLock = (state: CommonStoreState) => state.actionModeLock;\n\nexport const countElementsByType = (state: CommonStoreState) => state.countElementsByType;\n\nexport const countSolarStructuresByType = (state: CommonStoreState) => state.countSolarStructuresByType;\n\nexport const countObservers = (state: CommonStoreState) => state.countObservers;\n\nexport const countAllElements = (state: CommonStoreState) => state.countAllElements;\n\nexport const countAllElementsByType = (state: CommonStoreState) => state.countAllElementsByType;\n\nexport const countAllOffspringsByTypeAtOnce = (state: CommonStoreState) => state.countAllOffspringsByTypeAtOnce;\n\nexport const countSolarPanelsOnRack = (state: CommonStoreState) => state.countSolarPanelsOnRack;\n\nexport const selectedElementAngle = (state: CommonStoreState) => state.selectedElementAngle;\n\nexport const selectedElementHeight = (state: CommonStoreState) => state.selectedElementHeight;\n\nexport const waiting = (state: PrimitiveStoreState) => state.waiting;\n\nexport const simulationInProgress = (state: PrimitiveStoreState) => state.simulationInProgress;\n\nexport const simulationPaused = (state: PrimitiveStoreState) => state.simulationPaused;\n\nexport const evolutionInProgress = (state: PrimitiveStoreState) => state.evolutionInProgress;\n\nexport const evolutionPaused = (state: PrimitiveStoreState) => state.evolutionPaused;\n\nexport const contextMenuObjectType = (state: CommonStoreState) => state.contextMenuObjectType;\n\nexport const localFileDialogRequested = (state: CommonStoreState) => state.localFileDialogRequested;\n\nexport const enableFineGrid = (state: CommonStoreState) => state.enableFineGrid;\n\nexport const setEnableFineGrid = (state: CommonStoreState) => state.setEnableFineGrid;\n\nexport const showCloudFilePanel = (state: PrimitiveStoreState) => state.showCloudFilePanel;\n\nexport const projectInfo = (state: CommonStoreState) => state.projectInfo;\n\nexport const projectView = (state: CommonStoreState) => state.projectView;\n\nexport const showProjectListPanel = (state: PrimitiveStoreState) => state.showProjectListPanel;\n\nexport const showModelsGallery = (state: PrimitiveStoreState) => state.showModelsGallery;\n\nexport const showAccountSettingsPanel = (state: PrimitiveStoreState) => state.showAccountSettingsPanel;\n\nexport const showLikesPanel = (state: PrimitiveStoreState) => state.showLikesPanel;\n\nexport const showPublishedModelsPanel = (state: PrimitiveStoreState) => state.showPublishedModelsPanel;\n\n// science\nexport const weatherData = (state: CommonStoreState) => state.weatherData;\n\nexport const loadWeatherData = (state: CommonStoreState) => state.loadWeatherData;\n\nexport const getWeather = (state: CommonStoreState) => state.getWeather;\n\nexport const loadHorizontalSolarRadiationData = (state: CommonStoreState) => state.loadHorizontalSolarRadiationData;\n\nexport const getHorizontalSolarRadiation = (state: CommonStoreState) => state.getHorizontalSolarRadiation;\n\nexport const loadVerticalSolarRadiationData = (state: CommonStoreState) => state.loadVerticalSolarRadiationData;\n\nexport const getVerticalSolarRadiation = (state: CommonStoreState) => state.getVerticalSolarRadiation;\n\nexport const getClosestCity = (state: CommonStoreState) => state.getClosestCity;\n\nexport const sunlightDirection = (state: CommonStoreState) => state.sunlightDirection;\n\nexport const setSunlightDirection = (state: CommonStoreState) => state.setSunlightDirection;\n\nexport const showSolarRadiationHeatmap = (state: PrimitiveStoreState) => state.showSolarRadiationHeatmap;\n\nexport const showHeatFluxes = (state: PrimitiveStoreState) => state.showHeatFluxes;\n\n// solar panels (PV)\n\nexport const runSolarPanelVisibilityAnalysis = (state: PrimitiveStoreState) => state.runSolarPanelVisibilityAnalysis;\n\nexport const solarPanelVisibilityResults = (state: DataStoreState) => state.solarPanelVisibilityResults;\n\nexport const runDailySimulationForSolarPanels = (state: PrimitiveStoreState) => state.runDailySimulationForSolarPanels;\n\nexport const runDailySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\n state.runDailySimulationForSolarPanelsLastStep;\n\nexport const runYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForSolarPanels;\n\nexport const runYearlySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForSolarPanelsLastStep;\n\nexport const pauseDailySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForSolarPanels;\n\nexport const pauseYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForSolarPanels;\n\nexport const dailyPvYield = (state: DataStoreState) => state.dailyPvYield;\n\nexport const dailyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.dailyPvIndividualOutputs;\n\nexport const setDailyPvYield = (state: DataStoreState) => state.setDailyPvYield;\n\nexport const yearlyPvYield = (state: DataStoreState) => state.yearlyPvYield;\n\nexport const yearlyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.yearlyPvIndividualOutputs;\n\nexport const setYearlyPvYield = (state: DataStoreState) => state.setYearlyPvYield;\n\nexport const solarPanelLabels = (state: DataStoreState) => state.solarPanelLabels;\n\nexport const setSolarPanelLabels = (state: DataStoreState) => state.setSolarPanelLabels;\n\nexport const setTotalBuildingHeater = (state: DataStoreState) => state.setTotalBuildingHeater;\n\nexport const setTotalBuildingAc = (state: DataStoreState) => state.setTotalBuildingAc;\n\nexport const setTotalBuildingSolarPanel = (state: DataStoreState) => state.setTotalBuildingSolarPanel;\n\nexport const updateElementOnRoofFlag = (state: CommonStoreState) => state.updateElementOnRoofFlag;\n\n// parabolic troughs (CSP)\n\nexport const runDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.runDailySimulationForParabolicTroughs;\n\nexport const runYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForParabolicTroughs;\n\nexport const pauseDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForParabolicTroughs;\n\nexport const pauseYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForParabolicTroughs;\n\nexport const dailyParabolicTroughYield = (state: DataStoreState) => state.dailyParabolicTroughYield;\n\nexport const dailyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyParabolicTroughIndividualOutputs;\n\nexport const setDailyParabolicTroughYield = (state: DataStoreState) => state.setDailyParabolicTroughYield;\n\nexport const yearlyParabolicTroughYield = (state: DataStoreState) => state.yearlyParabolicTroughYield;\n\nexport const yearlyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyParabolicTroughIndividualOutputs;\n\nexport const setYearlyParabolicTroughYield = (state: DataStoreState) => state.setYearlyParabolicTroughYield;\n\nexport const parabolicTroughLabels = (state: DataStoreState) => state.parabolicTroughLabels;\n\nexport const setParabolicTroughLabels = (state: DataStoreState) => state.setParabolicTroughLabels;\n\n// Fresnel reflectors (CSP)\n\nexport const runDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.runDailySimulationForFresnelReflectors;\n\nexport const runYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForFresnelReflectors;\n\nexport const pauseDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForFresnelReflectors;\n\nexport const pauseYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForFresnelReflectors;\n\nexport const dailyFresnelReflectorYield = (state: DataStoreState) => state.dailyFresnelReflectorYield;\n\nexport const dailyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyFresnelReflectorIndividualOutputs;\n\nexport const setDailyFresnelReflectorYield = (state: DataStoreState) => state.setDailyFresnelReflectorYield;\n\nexport const yearlyFresnelReflectorYield = (state: DataStoreState) => state.yearlyFresnelReflectorYield;\n\nexport const yearlyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyFresnelReflectorIndividualOutputs;\n\nexport const setYearlyFresnelReflectorYield = (state: DataStoreState) => state.setYearlyFresnelReflectorYield;\n\nexport const fresnelReflectorLabels = (state: DataStoreState) => state.fresnelReflectorLabels;\n\nexport const setFresnelReflectorLabels = (state: DataStoreState) => state.setFresnelReflectorLabels;\n\n// heliostats (CSP)\n\nexport const runDailySimulationForHeliostats = (state: PrimitiveStoreState) => state.runDailySimulationForHeliostats;\n\nexport const runYearlySimulationForHeliostats = (state: PrimitiveStoreState) => state.runYearlySimulationForHeliostats;\n\nexport const pauseDailySimulationForHeliostats = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForHeliostats;\n\nexport const pauseYearlySimulationForHeliostats = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForHeliostats;\n\nexport const dailyHeliostatYield = (state: DataStoreState) => state.dailyHeliostatYield;\n\nexport const dailyHeliostatIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyHeliostatIndividualOutputs;\n\nexport const setDailyHeliostatYield = (state: DataStoreState) => state.setDailyHeliostatYield;\n\nexport const yearlyHeliostatYield = (state: DataStoreState) => state.yearlyHeliostatYield;\n\nexport const yearlyHeliostatIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyHeliostatIndividualOutputs;\n\nexport const setYearlyHeliostatYield = (state: DataStoreState) => state.setYearlyHeliostatYield;\n\nexport const heliostatLabels = (state: DataStoreState) => state.heliostatLabels;\n\nexport const setHeliostatLabels = (state: DataStoreState) => state.setHeliostatLabels;\n\n// solar updraft towers\n\nexport const runDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.runDailySimulationForUpdraftTower;\n\nexport const runYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForUpdraftTower;\n\nexport const pauseDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForUpdraftTower;\n\nexport const pauseYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForUpdraftTower;\n\nexport const dailyUpdraftTowerResults = (state: DataStoreState) => state.dailyUpdraftTowerResults;\n\nexport const dailyUpdraftTowerYield = (state: DataStoreState) => state.dailyUpdraftTowerYield;\n\nexport const dailyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyUpdraftTowerIndividualOutputs;\n\nexport const setDailyUpdraftTowerResults = (state: DataStoreState) => state.setDailyUpdraftTowerResults;\n\nexport const setDailyUpdraftTowerYield = (state: DataStoreState) => state.setDailyUpdraftTowerYield;\n\nexport const yearlyUpdraftTowerYield = (state: DataStoreState) => state.yearlyUpdraftTowerYield;\n\nexport const yearlyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyUpdraftTowerIndividualOutputs;\n\nexport const setYearlyUpdraftTowerYield = (state: DataStoreState) => state.setYearlyUpdraftTowerYield;\n\nexport const updraftTowerLabels = (state: DataStoreState) => state.updraftTowerLabels;\n\nexport const setUpdraftTowerLabels = (state: DataStoreState) => state.setUpdraftTowerLabels;\n\n// parabolic dishes (CSP)\n\nexport const runDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.runDailySimulationForParabolicDishes;\n\nexport const runYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForParabolicDishes;\n\nexport const pauseDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForParabolicDishes;\n\nexport const pauseYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForParabolicDishes;\n\nexport const dailyParabolicDishYield = (state: DataStoreState) => state.dailyParabolicDishYield;\n\nexport const dailyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyParabolicDishIndividualOutputs;\n\nexport const setDailyParabolicDishYield = (state: DataStoreState) => state.setDailyParabolicDishYield;\n\nexport const yearlyParabolicDishYield = (state: DataStoreState) => state.yearlyParabolicDishYield;\n\nexport const yearlyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyParabolicDishIndividualOutputs;\n\nexport const setYearlyParabolicDishYield = (state: DataStoreState) => state.setYearlyParabolicDishYield;\n\nexport const parabolicDishLabels = (state: DataStoreState) => state.parabolicDishLabels;\n\nexport const setParabolicDishLabels = (state: DataStoreState) => state.setParabolicDishLabels;\n\n// sensors\n\nexport const runDailyLightSensor = (state: PrimitiveStoreState) => state.runDailyLightSensor;\n\nexport const pauseDailyLightSensor = (state: PrimitiveStoreState) => state.pauseDailyLightSensor;\n\nexport const runYearlyLightSensor = (state: PrimitiveStoreState) => state.runYearlyLightSensor;\n\nexport const pauseYearlyLightSensor = (state: PrimitiveStoreState) => state.pauseYearlyLightSensor;\n\nexport const dailyLightSensorData = (state: DataStoreState) => state.dailyLightSensorData;\n\nexport const setDailyLightSensorData = (state: DataStoreState) => state.setDailyLightSensorData;\n\nexport const yearlyLightSensorData = (state: DataStoreState) => state.yearlyLightSensorData;\n\nexport const setYearlyLightSensorData = (state: DataStoreState) => state.setYearlyLightSensorData;\n\nexport const sensorLabels = (state: DataStoreState) => state.sensorLabels;\n\nexport const setSensorLabels = (state: DataStoreState) => state.setSensorLabels;\n\n// handles\n\nexport const hoveredHandle = (state: CommonStoreState) => state.hoveredHandle;\n\nexport const moveHandleType = (state: CommonStoreState) => state.moveHandleType;\n\nexport const resizeHandleType = (state: CommonStoreState) => state.resizeHandleType;\n\nexport const getResizeHandlePosition = (state: CommonStoreState) => state.getResizeHandlePosition;\n\nexport const rotateHandleType = (state: CommonStoreState) => state.rotateHandleType;\n\nexport const resizeAnchor = (state: CommonStoreState) => state.resizeAnchor;\n\n// elements\n\nexport const isAddingElement = (state: CommonStoreState) => state.isAddingElement;\n\nexport const addedFoundationId = (state: CommonStoreState) => state.addedFoundationId;\n\nexport const deletedFoundationId = (state: CommonStoreState) => state.deletedFoundationId;\n\nexport const addedCuboidId = (state: CommonStoreState) => state.addedCuboidId;\n\nexport const deletedCuboidId = (state: CommonStoreState) => state.deletedCuboidId;\n\nexport const addedWallId = (state: CommonStoreState) => state.addedWallId;\n\nexport const deletedWallId = (state: CommonStoreState) => state.deletedWallId;\n\nexport const deletedRoofId = (state: CommonStoreState) => state.deletedRoofId;\n\nexport const autoDeletedRoof = (state: CommonStoreState) => state.autoDeletedRoof;\n\nexport const autoDeletedChild = (state: CommonStoreState) => state.autoDeletedChild;\n\nexport const groupActionMode = (state: CommonStoreState) => state.groupActionMode;\n\nexport const groupMasterId = (state: CommonStoreState) => state.groupMasterId;\n\nexport const groupActionUpdateFlag = (state: CommonStoreState) => state.groupActionUpdateFlag;\n\nexport const addedWindowId = (state: CommonStoreState) => state.addedWindowId;\n\nexport const addedDoorId = (state: CommonStoreState) => state.addedDoorId;\n\nexport const updateWallMapOnFoundationFlag = (state: CommonStoreState) => state.updateWallMapOnFoundationFlag;\n\nexport const wallActionScope = (state: CommonStoreState) => state.wallActionScope;\n\nexport const roofActionScope = (state: CommonStoreState) => state.roofActionScope;\n\nexport const windowActionScope = (state: CommonStoreState) => state.windowActionScope;\n\nexport const doorActionScope = (state: CommonStoreState) => state.doorActionScope;\n\nexport const setWallActionScope = (state: CommonStoreState) => state.setWallActionScope;\n\nexport const setRoofActionScope = (state: CommonStoreState) => state.setRoofActionScope;\n\nexport const setDoorActionScope = (state: CommonStoreState) => state.setDoorActionScope;\n\nexport const setWindowActionScope = (state: CommonStoreState) => state.setWindowActionScope;\n\nexport const updateWallLeftJointsById = (state: CommonStoreState) => state.updateWallLeftJointsById;\n\nexport const updateWallRightJointsById = (state: CommonStoreState) => state.updateWallRightJointsById;\n\nexport const updateWallLeftPointById = (state: CommonStoreState) => state.updateWallLeftPointById;\n\nexport const updateRoofRiseById = (state: CommonStoreState) => state.updateRoofRiseById;\n\nexport const updateRoofStructureById = (state: CommonStoreState) => state.updateRoofStructureById;\n\nexport * as solarPanelArrayLayoutParams from './solarPanelArrayLayoutParams';\n\nexport const economicsParams = (state: CommonStoreState) => state.economicsParams;\n\n// genetic algorithms and particle swarm optimization\n\nexport const fittestIndividualResults = (state: CommonStoreState) => state.fittestIndividualResults;\n\nexport const setFittestIndividualResults = (state: CommonStoreState) => state.setFittestIndividualResults;\n\nexport const variableLabels = (state: CommonStoreState) => state.variableLabels;\n\nexport const setVariableLabels = (state: CommonStoreState) => state.setVariableLabels;\n\nexport const evolutionaryAlgorithmState = (state: CommonStoreState) => state.evolutionaryAlgorithmState;\n\nexport const solarPanelArrayLayoutConstraints = (state: CommonStoreState) => state.solarPanelArrayLayoutConstraints;\n\nexport const geneticAlgorithmWizardSelectedTab = (state: CommonStoreState) => state.geneticAlgorithmWizardSelectedTab;\n\nexport const particleSwarmOptimizationWizardSelectedTab = (state: CommonStoreState) =>\n state.particleSwarmOptimizationWizardSelectedTab;\n\nexport const setPrimitiveStore = (state: PrimitiveStoreState) => state.setPrimitiveStore;\n\nexport * as viewState from './viewState';\n\nexport * as world from './world';\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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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, spacingX, spacingY, 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 / spacingX) - 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, spacingX]);\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 / spacingY);\n let curr = top;\n for (let i = 0; i < number; i++) {\n arr.push(curr);\n curr -= spacingY;\n }\n return arr;\n }, [lx, lz, ah, width, spacingY]);\n\n const archMullions = useMemo(() => {\n const arr: number[] = [];\n\n const dividers = Math.round(lx / spacingX) - 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);\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, spacingX]);\n\n const renderRadialMullion = (length: number, angle: number) => {\n return (\n \n \n {material}\n \n \n );\n };\n\n return (\n \n {horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\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 shutter,\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 shutterWidth = useMemo(() => shutter.width * lx, [lx, shutter.width]);\n const shutterHeight = useMemo(() => lz - Math.min(archHeight, lz, lx / 2), [lx, lz, archHeight]);\n const shutterPosX = useMemo(\n () => ((shutterWidth + frameData.width + lx) / 2) * 1.025,\n [lx, shutterWidth, frameData.width],\n );\n const shutterPosZ = useMemo(() => -Math.min(archHeight, lz, lx / 2) / 2, [lz, shutterHeight]);\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.showMullion && 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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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 shutter,\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(() => shutter.width * lx, [lx, shutter]);\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","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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\nimport { Point2 } from 'src/models/Point2';\nimport { RoofModel } from 'src/models/RoofModel';\nimport { WallModel } from 'src/models/WallModel';\nimport { useStore } from 'src/stores/common';\nimport { ObjectType } from 'src/types';\nimport { Util } from 'src/Util';\nimport { Vector2, Vector3 } from 'three';\nimport * as Selector from '../stores/selector';\nimport { GROUND_ID } from '../constants';\n\nexport const useGroupMaster = (elementModel: GroupableModel, groupMasterId: string | null) => {\n const { id, cx, cy, lx, ly, lz, selected, enableGroupMaster } = elementModel;\n\n const buildingResizerUpdateFlag = useStore(Selector.groupActionUpdateFlag);\n const baseGroupSetRef = useRef>(new Set());\n const baseVerticesRef = useRef([]);\n const childCuboidSetRef = useRef>(new Set());\n\n const [groupMasterDimension, setGroupMasterDimension] = useState(null);\n const [groupMasterPosition, setGroupMasterPosition] = useState([cx, cy, lz / 2]);\n const [groupMasterRotation, setGroupMasterRotation] = useState(0);\n\n const isCuboid = elementModel.type === ObjectType.Cuboid;\n\n useEffect(() => {\n if (groupMasterId === id) {\n baseGroupSetRef.current.clear();\n childCuboidSetRef.current.clear();\n baseVerticesRef.current = [];\n\n setBaseVertices(elementModel);\n if (elementModel.enableGroupMaster) {\n checkOverlapWithAllBases(elementModel);\n if (baseGroupSetRef.current.size > 1) {\n setGroupedBasesData();\n } else {\n setSingleBaseData();\n }\n } else {\n setSingleBaseData();\n }\n } else {\n setGroupMasterPosition([cx, cy, 0]);\n setGroupMasterDimension(null);\n setGroupMasterRotation(0);\n }\n }, [groupMasterId, buildingResizerUpdateFlag, enableGroupMaster]);\n\n const setBaseVertices = (base: ElementModel) => {\n const hx = base.lx / 2;\n const hy = base.ly / 2;\n const zero = new Vector2();\n const { pos, rot } = Util.getWorldDataById(base.id);\n const center = new Vector2(pos.x, pos.y);\n const v1 = new Vector2(hx, hy);\n const v2 = new Vector2(-hx, hy);\n const v3 = new Vector2(hx, -hy);\n const v4 = new Vector2(-hx, -hy);\n const arr = [v1, v2, v3, v4].map((v) => {\n v.rotateAround(zero, rot).add(center);\n return { x: v.x, y: v.y } as Point2;\n });\n baseGroupSetRef.current.add(base.id);\n baseVerticesRef.current.push(...arr);\n };\n\n const setAllChildBases = (el: ElementModel) => {\n baseGroupSetRef.current.add(el.id);\n childCuboidSetRef.current.add(el.id);\n for (const e of useStore.getState().elements) {\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === el.id) {\n setAllChildBases(e);\n }\n }\n };\n\n const checkOverlapWithAllBases = (base: ElementModel) => {\n for (const el of useStore.getState().elements) {\n if (isGroupable(el) && el.parentId === GROUND_ID && !el.locked && !baseGroupSetRef.current.has(el.id)) {\n const isUnlockedChild = Util.isChild(base.id, el.id, true);\n\n if (isUnlockedChild) {\n setAllChildBases(el);\n } else if (Util.areTwoBasesOverlapped(el, base)) {\n setBaseVertices(el);\n checkOverlapWithAllBases(el);\n }\n }\n }\n };\n\n const setSingleBaseData = () => {\n let maxHeight = isCuboid ? 0 : 3;\n let maxTopZ = maxHeight;\n const map = new Map(); // roofId -> maxWallHeight\n // we can use one loop to get maxWallHeight, because roof is always after wall?\n for (const elem of useStore.getState().elements) {\n if (elem.foundationId === elementModel?.id) {\n if (elem.type === ObjectType.Wall) {\n const wall = elem as WallModel;\n maxHeight = Math.max(maxHeight, wall.lz);\n if (wall.roofId) {\n const maxWallHeight = map.get(wall.roofId) ?? 0;\n if (maxWallHeight < wall.lz) {\n map.set(wall.roofId, wall.lz);\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n maxHeight = Math.max(maxHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\n }\n } else if (elem.type === ObjectType.Cuboid && Util.isChild(elementModel.id, elem.id, true)) {\n setBaseVertices(elem);\n childCuboidSetRef.current.add(elem.id);\n const { topZ } = Util.getWorldDataById(elem.id);\n maxTopZ = Math.max(maxTopZ, topZ);\n }\n }\n\n if (baseGroupSetRef.current.size > 1) {\n const bound = Util.calculatePolygonBounds(baseVerticesRef.current);\n const { pos: parentWorldPos, topZ: parentTopZ } = Util.getWorldDataById(elementModel.parentId);\n const boundCenterWorldPos = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\n const relativePosition = new Vector3().subVectors(boundCenterWorldPos, parentWorldPos).setZ(0);\n setGroupMasterDimension([bound.width, bound.height, maxTopZ - parentTopZ]);\n setGroupMasterPosition(relativePosition.toArray());\n setGroupMasterRotation(0);\n } else {\n setGroupMasterPosition([cx, cy, 0]);\n setGroupMasterRotation(elementModel?.rotation[2]);\n setGroupMasterDimension([lx, ly, maxHeight + lz]);\n }\n };\n\n const setGroupedBasesData = () => {\n const bound = Util.calculatePolygonBounds(baseVerticesRef.current);\n let maxChildHeight = isCuboid ? 0 : 1;\n let maxBaseZ = lz;\n const map = new Map(); // roofId -> maxWallHeight\n for (const elem of useStore.getState().elements) {\n // children\n if (elem.foundationId && baseGroupSetRef.current.has(elem.foundationId)) {\n if (elem.type === ObjectType.Wall) {\n const wall = elem as WallModel;\n maxChildHeight = Math.max(maxChildHeight, wall.lz);\n if (wall.roofId) {\n const maxWallHeight = map.get(wall.roofId) ?? 0;\n if (maxWallHeight < wall.lz) {\n map.set(wall.roofId, wall.lz);\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n maxChildHeight = Math.max(maxChildHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\n }\n }\n // cuboids\n else if (elem.type === ObjectType.Cuboid && baseGroupSetRef.current.has(elem.id)) {\n const { topZ } = Util.getWorldDataById(elem.id);\n maxBaseZ = Math.max(maxBaseZ, topZ);\n }\n }\n const { pos: parentWorldPos, topZ: parentTopZ } = Util.getWorldDataById(elementModel.parentId);\n const boundCenterWorldPos = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\n const relativePosition = new Vector3().subVectors(boundCenterWorldPos, parentWorldPos).setZ(0);\n setGroupMasterDimension([bound.width, bound.height, Math.max(maxChildHeight, maxBaseZ)]);\n setGroupMasterPosition(relativePosition.toArray());\n setGroupMasterRotation(0);\n };\n\n const baseGroupSet = baseGroupSetRef.current;\n const childCuboidSet = childCuboidSetRef.current;\n return { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation };\n};\n\nexport const useSelected = (id: string) => {\n const selected = useStore((state) => state.selectedElementIdSet.has(id));\n return selected;\n};\n\nexport const useLanguage = () => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n return lang;\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 { 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 addIdRoofId = useStore.getState().addedRoofId;\r\n if (addIdRoofId && addIdRoofId === 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 }\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 addedRoofId = useStore.getState().addedRoofId;\r\n if (addedRoofId && addedRoofId === 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().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if ((addIdRoofId && addIdRoofId === 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().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if ((addIdRoofId && addIdRoofId === id) || !isFirstRender) {\r\n updateWalls(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n useStore.getState().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if (addIdRoofId && addIdRoofId === 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().setAddedRoofId(null);\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().addedRoofId === 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().setAddedRoofId(null);\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\";","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.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n if (useStore.getState().groupActionMode) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n e.stopPropagation();\r\n } else 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().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 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 useUpdateOldFiles = (wallModel: WallModel) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (\r\n wallModel.wallStructure === undefined ||\r\n wallModel.structureSpacing === undefined ||\r\n wallModel.structureWidth === undefined ||\r\n wallModel.structureColor === undefined ||\r\n wallModel.opacity === undefined ||\r\n wallModel.fill === undefined ||\r\n wallModel.leftUnfilledHeight === undefined ||\r\n wallModel.rightUnfilledHeight === undefined ||\r\n wallModel.leftTopPartialHeight === undefined ||\r\n wallModel.rightTopPartialHeight === undefined ||\r\n wallModel.eavesLength === undefined ||\r\n wallModel.parapet === undefined\r\n ) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wallModel.id) {\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 const roof = state.elements.find((e) => e.id === wall.roofId && e.type === ObjectType.Roof) as RoofModel;\r\n if (roof) {\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 if (wall.parapet === undefined) {\r\n wall.parapet = { ...DEFAULT_PARAPET_SETTINGS };\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\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 for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n e.selected = true;\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n state.groupMasterId = foundationId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(foundationId);\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 // 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 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\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 while (wall && (!wall.roofId || wall.roofId === roofId)) {\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 while (wall && (!wall.roofId || wall.roofId === roofId)) {\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 (\r\n roofModel.ceiling === undefined ||\r\n roofModel.rise === undefined ||\r\n (roofModel.roofType === RoofType.Gambrel &&\r\n ((roofModel as GambrelRoofModel).frontRidgePoint === undefined ||\r\n (roofModel as GambrelRoofModel).backRidgePoint === undefined ||\r\n (roofModel as GambrelRoofModel).topRidgePoint === undefined))\r\n ) {\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.ceiling === undefined) {\r\n roof.ceiling = false;\r\n }\r\n if (roof.rise === undefined) {\r\n roof.rise = roof.lz - highestWallHeight;\r\n roof.lz = 0;\r\n }\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 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-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Euler, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport { Box, Circle, Cone, Plane, Sphere, Torus } from '@react-three/drei';\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from '../stores/selector';\nimport { GROUND_ID, HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR, TWO_PI } from 'src/constants';\nimport { WallFill, WallModel } from 'src/models/WallModel';\nimport Wireframe from './wireframe';\nimport { UndoableMoveFoundationGroup } from 'src/undo/UndoableMove';\nimport { UndoableResizeBuildingXY, UndoableResizeBuildingZ } from 'src/undo/UndoableResizeBuilding';\nimport { useHandleSize } from 'src/views/wall/hooks';\nimport { RoofModel } from 'src/models/RoofModel';\nimport { isGroupable } from 'src/models/Groupable';\nimport { Util } from 'src/Util';\nimport { WindowModel } from 'src/models/WindowModel';\n\ninterface GroupMasterProps {\n baseGroupSet: Set;\n childCuboidSet: Set;\n initalPosition: number[];\n initalDimension: number[];\n initalRotation: number;\n}\n\ninterface HandleProps {\n args: number[]; // [cx, cy, cz, handleSize];\n handleType: MoveHandleType | ResizeHandleType | RotateHandleType;\n}\n\nenum Operation {\n Move = 'Move',\n ResizeXY = 'Resize XY',\n ResizeZ = 'Resize Z',\n RotateUpper = 'Rotate Upper',\n RotateLower = 'Rotate Lower',\n Null = 'Null',\n}\n\nexport type PartialWallHeight = {\n upperLeft: number;\n upperRight: number;\n lowerLeft: number;\n lowerRight: number;\n};\n\nconst zeroVector2 = new Vector2();\n\nconst ResizeHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n >\n \n \n );\n};\n\nconst MoveHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n >\n \n \n );\n};\n\nconst RotateHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n const mesh = useMemo(() => , [color]);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n scale={handleSize * 4}\n >\n \n \n {mesh}\n \n \n {mesh}\n \n \n {mesh}\n \n \n \n \n );\n};\n\nconst GroupMaster = ({\n baseGroupSet,\n childCuboidSet,\n initalPosition,\n initalDimension,\n initalRotation,\n}: GroupMasterProps) => {\n const [cx, cy, cz] = initalPosition;\n const [lx, ly, lz] = initalDimension;\n const aspectRatio = lx === 0 ? 1 : ly / lx;\n const lockAspectRatio = baseGroupSet.size > 1;\n\n const intersectionPlaneRef = useRef(null);\n const intersectionPlanePositionRef = useRef(new Vector3());\n const intersectionPlaneRotationRef = useRef(new Euler());\n const resizeAnchorRef = useRef(new Vector2());\n const elementHeightMapRef = useRef>(new Map());\n const wallRelPointsMapRef = useRef>(new Map());\n const partialWallHeightMapRef = useRef>(new Map());\n const skylightRelPosMapRef = useRef>(new Map());\n const baseRelPosMapRef = useRef>(new Map());\n const baseRotationMapRef = useRef>(new Map());\n const basePosRatioMapRef = useRef>(new Map()); // 2d\n const baseDmsRatioMapRef = useRef>(new Map()); // 2d\n const resizerCenterRelPosRef = useRef(new Vector3());\n const pointerDownRef = useRef(false); // for performance reason\n\n // undo\n const foundatonOldDataMapRef = useRef>(new Map());\n const wallOldPointsMapRef = useRef>(new Map());\n const elementOldHeightMapRef = useRef>(new Map());\n const oldPartialWallHeightMapRef = useRef>(new Map());\n const oldSkyligthPosMapRef = useRef>(new Map());\n\n const [position, setPosition] = useState(new Vector3(cx, cy, cz));\n const [rotation, setRotation] = useState(initalRotation);\n const [hx, setHx] = useState(lx / 2);\n const [hy, setHy] = useState(ly / 2);\n const [height, setHeight] = useState(lz);\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\n const [operation, setOperation] = useState(Operation.Null);\n\n const { get: getThree } = useThree();\n const ray = useMemo(() => new Raycaster(), []);\n const mouse = useMemo(() => new Vector2(), []);\n\n const orthographic = useStore(Selector.viewState.orthographic);\n\n const getElementById = useStore(Selector.getElementById);\n const getCameraDirection = useStore(Selector.getCameraDirection);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n\n useEffect(() => {\n setHeight(lz);\n }, [lz]);\n\n useEffect(() => {\n setPosition(new Vector3(cx, cy, cz));\n setDimension(lx, ly);\n setRotation(initalRotation);\n }, [initalPosition, initalDimension, initalRotation]);\n\n const setRayCast = (e: PointerEvent) => {\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, getThree().camera);\n };\n\n const setDimension = (lx: number, ly: number) => {\n setHx(lx / 2);\n setHy(ly / 2);\n };\n\n const initPointerDown = (event: ThreeEvent) => {\n setShowIntersectionPlane(true);\n useRefStore.getState().setEnableOrbitController(false);\n pointerDownRef.current = true;\n intersectionPlanePositionRef.current.set(0, 0, 0);\n intersectionPlaneRotationRef.current.set(0, 0, 0);\n setCommonStoreHandleType(MoveHandleType.Default);\n event.stopPropagation();\n };\n\n const updateUndoableResizeXY = (\n foundationDataMap: Map,\n wallPointsMap: Map,\n skyligthPosMap: Map,\n ) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && foundationDataMap.has(elem.id)) {\n [elem.cx, elem.cy, elem.lx, elem.ly] = foundationDataMap.get(elem.id)!;\n } else if (foundationDataMap.has(elem.parentId)) {\n switch (elem.type) {\n case ObjectType.Wall: {\n const points = wallPointsMap.get(elem.id);\n if (!points) continue;\n const w = elem as WallModel;\n const leftPoint = points.slice(0, 3);\n const rightPoint = points.slice(3);\n w.cx = (leftPoint[0] + rightPoint[0]) / 2;\n w.cy = (leftPoint[1] + rightPoint[1]) / 2;\n w.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\n w.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n w.leftPoint = [...leftPoint];\n w.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const position = skyligthPosMap.get(elem.id);\n if (!position) continue;\n [window.cx, window.cy] = position;\n break;\n }\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const updateUndoableResizeZ = (\n heightMap: Map,\n partialWallHeightMap: Map,\n ) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (heightMap.has(elem.id)) {\n const height = heightMap.get(elem.id);\n if (height !== undefined) {\n if (elem.type === ObjectType.Roof) {\n (elem as RoofModel).rise = height;\n } else {\n elem.lz = height;\n }\n }\n }\n if (elem.type === ObjectType.Wall && partialWallHeightMap.has(elem.id)) {\n const w = elem as WallModel;\n const partialWallHeight = partialWallHeightMap.get(w.id);\n if (partialWallHeight) {\n w.leftTopPartialHeight = partialWallHeight.upperLeft;\n w.rightTopPartialHeight = partialWallHeight.upperRight;\n w.leftUnfilledHeight = partialWallHeight.lowerLeft;\n w.rightUnfilledHeight = partialWallHeight.lowerRight;\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const updateFoundationGroupPosition = (map: Map) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (map.has(elem.id)) {\n const pos = map.get(elem.id);\n if (pos) {\n elem.cx = pos[0];\n elem.cy = pos[1];\n elem.cz = pos[2];\n elem.rotation[2] = pos[3];\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n };\n\n const addUndoableMove = () => {\n const map = new Map();\n for (const elem of useStore.getState().elements) {\n if ((isGroupable(elem) && baseGroupSet.has(elem.id)) || baseGroupSet.has(elem.parentId)) {\n map.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n const name = operation === Operation.Move ? 'Move' : 'Rotate';\n const undoableMove = {\n name: `${name} Foundation Group`,\n timestamp: Date.now(),\n oldPositionMap: new Map(foundatonOldDataMapRef.current),\n newPositionMap: new Map(map),\n undo: () => {\n updateFoundationGroupPosition(undoableMove.oldPositionMap);\n },\n redo: () => {\n updateFoundationGroupPosition(undoableMove.newPositionMap);\n },\n } as UndoableMoveFoundationGroup;\n addUndoable(undoableMove);\n };\n\n const addUndoableResizeXY = () => {\n const foundationNewDataMap = new Map();\n const wallNewPointsMap = new Map();\n const newSkylightPosMap = new Map();\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && foundatonOldDataMapRef.current.has(elem.id)) {\n foundationNewDataMap.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\n } else if (wallOldPointsMapRef.current.has(elem.id)) {\n const w = elem as WallModel;\n wallNewPointsMap.set(elem.id, [...w.leftPoint, ...w.rightPoint]);\n } else if (oldSkyligthPosMapRef.current.has(elem.id)) {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n newSkylightPosMap.set(window.id, [window.cx, window.cy]);\n }\n }\n const undoableReizeXY = {\n name: 'Resize Building XY',\n timestamp: Date.now(),\n oldFoundationDataMap: new Map(foundatonOldDataMapRef.current),\n newFoundationDataMap: new Map(foundationNewDataMap),\n oldWallPointsMap: new Map(wallOldPointsMapRef.current),\n newWallPointsMap: new Map(wallNewPointsMap),\n oldSkylightPosMap: new Map(oldSkyligthPosMapRef.current),\n newSkylightPosMap: new Map(newSkylightPosMap),\n undo: () => {\n updateUndoableResizeXY(\n undoableReizeXY.oldFoundationDataMap,\n undoableReizeXY.oldWallPointsMap,\n undoableReizeXY.oldSkylightPosMap,\n );\n },\n redo: () => {\n updateUndoableResizeXY(\n undoableReizeXY.newFoundationDataMap,\n undoableReizeXY.newWallPointsMap,\n undoableReizeXY.newSkylightPosMap,\n );\n },\n } as UndoableResizeBuildingXY;\n addUndoable(undoableReizeXY);\n };\n\n const addUndoableReseizeZ = () => {\n const newHeightMap = new Map();\n const newPartialWallHeightMap = new Map();\n\n for (const elem of useStore.getState().elements) {\n if (elementOldHeightMapRef.current.has(elem.id)) {\n if (elem.type === ObjectType.Roof) {\n newHeightMap.set(elem.id, (elem as RoofModel).rise);\n } else {\n newHeightMap.set(elem.id, elem.lz);\n }\n }\n if (elem.type === ObjectType.Wall && oldPartialWallHeightMapRef.current.has(elem.id)) {\n const w = elem as WallModel;\n newPartialWallHeightMap.set(w.id, {\n lowerLeft: w.leftUnfilledHeight,\n lowerRight: w.rightUnfilledHeight,\n upperLeft: w.leftTopPartialHeight,\n upperRight: w.rightTopPartialHeight,\n });\n }\n }\n const undoableResizeZ = {\n name: 'Resize Building Z',\n timestamp: Date.now(),\n oldElementHeightMap: new Map(elementOldHeightMapRef.current),\n newElementHeightMap: new Map(newHeightMap),\n oldPartialWallHeightMap: new Map(oldPartialWallHeightMapRef.current),\n newPartialWallHeightMap: new Map(newPartialWallHeightMap),\n undo: () => {\n updateUndoableResizeZ(undoableResizeZ.oldElementHeightMap, undoableResizeZ.oldPartialWallHeightMap);\n },\n redo: () => {\n updateUndoableResizeZ(undoableResizeZ.newElementHeightMap, undoableResizeZ.newPartialWallHeightMap);\n },\n } as UndoableResizeBuildingZ;\n addUndoable(undoableResizeZ);\n };\n\n const setCommonStoreHandleType = (handleType: MoveHandleType | null) => {\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n });\n };\n\n const resizeXY = (p: Vector3) => {\n const pointer2D = new Vector2(p.x, p.y);\n const anchor = resizeAnchorRef.current.clone();\n\n if (lockAspectRatio) {\n const diagonalVector = new Vector2().subVectors(pointer2D, anchor);\n const diagonalDistance = Math.max(1, diagonalVector.length());\n\n const lx = Math.sqrt(Math.pow(diagonalDistance, 2) / (Math.pow(aspectRatio, 2) + 1));\n const ly = lx * aspectRatio;\n\n const center = new Vector2(lx * Math.sign(diagonalVector.x), ly * Math.sign(diagonalVector.y))\n .normalize()\n .multiplyScalar(diagonalDistance / 2)\n .add(anchor);\n\n setPosition(new Vector3(center.x, center.y));\n setDimension(lx, ly);\n\n setCommonStore((state) => {\n const tempWorldDataMap = new Map();\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const posRatio = basePosRatioMapRef.current.get(elem.id);\n const dmsRatio = baseDmsRatioMapRef.current.get(elem.id);\n if (posRatio && dmsRatio) {\n const newLx = dmsRatio[0] * lx;\n const newLy = dmsRatio[1] * ly;\n\n elem.lx = newLx;\n elem.ly = newLy;\n\n if (elem.parentId !== GROUND_ID) {\n const parentWorldData = tempWorldDataMap.get(elem.parentId);\n if (parentWorldData) {\n const { pos, rot } = parentWorldData;\n const worldCenter = new Vector3(posRatio[0] * lx + center.x, posRatio[1] * ly + center.y);\n const relativeCenter = worldCenter.clone().sub(pos).applyEuler(new Euler(0, 0, -rot));\n elem.cx = relativeCenter.x;\n elem.cy = relativeCenter.y;\n tempWorldDataMap.set(elem.id, { pos: worldCenter.clone(), rot: elem.rotation[2] + rot });\n }\n } else {\n const newCx = posRatio[0] * lx + center.x;\n const newCy = posRatio[1] * ly + center.y;\n elem.cx = newCx;\n elem.cy = newCy;\n tempWorldDataMap.set(elem.id, { pos: new Vector3(newCx, newCy), rot: elem.rotation[2] });\n }\n\n for (const e of state.elements) {\n if (e.foundationId === elem.id) {\n switch (e.type) {\n case ObjectType.Wall: {\n const wall = e as WallModel;\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\n if (!relativePosition) continue;\n const [leftRelPoint, rightRelPoint] = relativePosition;\n const leftPoint = [leftRelPoint.x * newLx, leftRelPoint.y * newLy, elem.lz];\n const rightPoint = [rightRelPoint.x * newLx, rightRelPoint.y * newLy, elem.lz];\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n wall.leftPoint = [...leftPoint];\n wall.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = e as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\n if (!relativePosition) continue;\n window.cx = relativePosition[0] * newLx;\n window.cy = relativePosition[1] * newLy;\n break;\n }\n }\n }\n }\n }\n }\n }\n });\n } else {\n const diagonal = anchor.distanceTo(pointer2D);\n const angle = Math.atan2(pointer2D.x - anchor.x, pointer2D.y - anchor.y) + rotation;\n const lx = Math.abs(diagonal * Math.sin(angle));\n const ly = Math.abs(diagonal * Math.cos(angle));\n const center = new Vector2().addVectors(pointer2D, anchor).multiplyScalar(0.5);\n setPosition(new Vector3(center.x, center.y));\n setDimension(lx, ly);\n setCommonStore((state) => {\n for (const elem of state.elements) {\n // foundationGroupSet only has one element here\n if (baseGroupSet.has(elem.id)) {\n elem.lx = lx;\n elem.ly = ly;\n elem.cx = center.x;\n elem.cy = center.y;\n }\n // child elements\n else if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n switch (elem.type) {\n case ObjectType.Wall: {\n const wall = elem as WallModel;\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\n if (!relativePosition) continue;\n const [leftRelPoint, rightRelPoint] = relativePosition;\n const leftPoint = [leftRelPoint.x * lx, leftRelPoint.y * ly, 0];\n const rightPoint = [rightRelPoint.x * lx, rightRelPoint.y * ly, 0];\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n wall.leftPoint = [...leftPoint];\n wall.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\n if (!relativePosition) continue;\n window.cx = relativePosition[0] * lx;\n window.cy = relativePosition[1] * ly;\n }\n }\n }\n }\n });\n }\n\n useStore.getState().updateElementOnRoofFn();\n };\n\n const resizeZ = (p: Vector3) => {\n if (p.z < 0.1) return;\n const height = p.z;\n setHeight(height);\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (elementHeightMapRef.current.has(elem.id)) {\n if (elem.type === ObjectType.Wall) {\n elem.lz = height * elementHeightMapRef.current.get(elem.id)!;\n const w = elem as WallModel;\n if (w.fill === WallFill.Partial) {\n const partialWallHeight = partialWallHeightMapRef.current.get(w.id);\n if (partialWallHeight) {\n w.leftTopPartialHeight = height * partialWallHeight.upperLeft;\n w.rightTopPartialHeight = height * partialWallHeight.upperRight;\n w.leftUnfilledHeight = height * partialWallHeight.lowerLeft;\n w.rightUnfilledHeight = height * partialWallHeight.lowerRight;\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n (elem as RoofModel).rise = height * elementHeightMapRef.current.get(elem.id)!;\n } else if (elem.type === ObjectType.Cuboid) {\n const heightRatio = elementHeightMapRef.current.get(elem.id);\n if (heightRatio) {\n const newHeight = heightRatio * height;\n elem.lz = newHeight;\n elem.cz = newHeight / 2;\n }\n }\n }\n }\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const rotate = (p: Vector3) => {\n const resizerCenter = new Vector3(position.x, position.y);\n const r =\n Math.atan2(resizerCenter.x - p.x, p.y - resizerCenter.y) + (operation === Operation.RotateUpper ? 0 : Math.PI);\n const offset = Math.abs(r) > Math.PI ? -TWO_PI : 0;\n const rotateAngle = r + offset;\n const euler = new Euler(0, 0, rotateAngle);\n const groupSize = baseRotationMapRef.current.size;\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\n const oldCenter = baseRelPosMapRef.current.get(elem.id);\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.id) : 0;\n if (oldCenter && oldRotation !== undefined) {\n const newCenter = oldCenter.clone().applyEuler(euler);\n elem.cx = resizerCenter.x + newCenter.x;\n elem.cy = resizerCenter.y + newCenter.y;\n elem.rotation = [0, 0, oldRotation + rotateAngle];\n }\n }\n if (elem.type !== ObjectType.Cuboid && baseGroupSet.has(elem.parentId)) {\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.parentId) : 0;\n if (oldRotation !== undefined) {\n elem.rotation = [0, 0, oldRotation + rotateAngle];\n }\n }\n }\n });\n setRotation(rotateAngle);\n };\n\n const pointerDownBottomResizeHandle = (x: number, y: number) => {\n const positionV2 = new Vector2(position.x, position.y);\n resizeAnchorRef.current.set(x, y).rotateAround(zeroVector2, rotation).add(positionV2);\n setOperation(Operation.ResizeXY);\n\n basePosRatioMapRef.current.clear();\n baseDmsRatioMapRef.current.clear();\n wallRelPointsMapRef.current.clear();\n foundatonOldDataMapRef.current.clear();\n wallOldPointsMapRef.current.clear();\n skylightRelPosMapRef.current.clear();\n oldSkyligthPosMapRef.current.clear();\n\n const [currLx, currLy] = [hx * 2, hy * 2];\n for (const elem of useStore.getState().elements) {\n // base elements\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const { pos } = Util.getWorldDataById(elem.id);\n basePosRatioMapRef.current.set(elem.id, [(pos.x - position.x) / currLx, (pos.y - position.y) / currLy]);\n baseDmsRatioMapRef.current.set(elem.id, [elem.lx / currLx, elem.ly / currLy]);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\n }\n // child elements\n else if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n const foundation = getElementById(elem.foundationId);\n if (!foundation) continue;\n switch (elem.type) {\n case ObjectType.Wall: {\n const wall = elem as WallModel;\n const leftPointRelative = new Vector2(wall.leftPoint[0] / foundation.lx, wall.leftPoint[1] / foundation.ly);\n const rightPointRelative = new Vector2(\n wall.rightPoint[0] / foundation.lx,\n wall.rightPoint[1] / foundation.ly,\n );\n wallRelPointsMapRef.current.set(wall.id, [leftPointRelative, rightPointRelative]);\n wallOldPointsMapRef.current.set(wall.id, [...wall.leftPoint, ...wall.rightPoint]);\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n skylightRelPosMapRef.current.set(window.id, [window.cx / foundation.lx, window.cy / foundation.ly]);\n oldSkyligthPosMapRef.current.set(window.id, [window.cx, window.cy]);\n break;\n }\n }\n }\n }\n };\n\n const pointerDonwTopResizeHandle = (x: number, y: number, z: number) => {\n const { x: cameraX, y: cameraY } = getCameraDirection();\n intersectionPlanePositionRef.current.set(x, y, z);\n intersectionPlaneRotationRef.current.set(-HALF_PI, 0, -Math.atan2(cameraX, cameraY) - rotation, 'ZXY');\n setOperation(Operation.ResizeZ);\n\n elementHeightMapRef.current.clear();\n elementOldHeightMapRef.current.clear();\n partialWallHeightMapRef.current.clear();\n oldPartialWallHeightMapRef.current.clear();\n\n for (const elem of useStore.getState().elements) {\n if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n if (elem.type === ObjectType.Wall) {\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\n const w = elem as WallModel;\n if (w.fill === WallFill.Partial) {\n oldPartialWallHeightMapRef.current.set(w.id, {\n upperLeft: w.leftTopPartialHeight,\n upperRight: w.rightTopPartialHeight,\n lowerLeft: w.leftUnfilledHeight,\n lowerRight: w.rightUnfilledHeight,\n });\n partialWallHeightMapRef.current.set(w.id, {\n upperLeft: w.leftTopPartialHeight / height,\n upperRight: w.rightTopPartialHeight / height,\n lowerLeft: w.leftUnfilledHeight / height,\n lowerRight: w.rightUnfilledHeight / height,\n });\n }\n } else if (elem.type === ObjectType.Roof) {\n elementHeightMapRef.current.set(elem.id, (elem as RoofModel).rise / height);\n elementOldHeightMapRef.current.set(elem.id, (elem as RoofModel).rise);\n }\n } else if (baseGroupSet.has(elem.id)) {\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\n }\n }\n };\n\n const handleResizeHandlesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n switch (event.object.name) {\n case ResizeHandleType.UpperLeft: {\n pointerDownBottomResizeHandle(hx, -hy);\n break;\n }\n case ResizeHandleType.UpperRight: {\n pointerDownBottomResizeHandle(-hx, -hy);\n break;\n }\n case ResizeHandleType.LowerLeft: {\n pointerDownBottomResizeHandle(hx, hy);\n break;\n }\n case ResizeHandleType.LowerRight: {\n pointerDownBottomResizeHandle(-hx, hy);\n break;\n }\n case ResizeHandleType.UpperLeftTop: {\n pointerDonwTopResizeHandle(-hx, hy, height);\n break;\n }\n case ResizeHandleType.UpperRightTop: {\n pointerDonwTopResizeHandle(hx, hy, height);\n break;\n }\n case ResizeHandleType.LowerLeftTop: {\n pointerDonwTopResizeHandle(-hx, -hy, height);\n break;\n }\n case ResizeHandleType.LowerRightTop: {\n pointerDonwTopResizeHandle(hx, -hy, height);\n break;\n }\n }\n };\n\n const handleMoveHanldesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n setOperation(Operation.Move);\n if (event.intersections.length > 0) {\n const p = event.intersections[0].point.clone().setZ(0);\n resizerCenterRelPosRef.current.subVectors(position, p);\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const c = new Vector3(elem.cx, elem.cy);\n const v = new Vector3().subVectors(c, p);\n baseRelPosMapRef.current.set(elem.id, v);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n }\n };\n\n const handleRotateHandlesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n if (event.object.name === RotateHandleType.Lower) {\n setOperation(Operation.RotateLower);\n } else if (event.object.name === RotateHandleType.Upper) {\n setOperation(Operation.RotateUpper);\n }\n if (event.intersections.length > 0) {\n const resizerCenter = new Vector3(position.x, position.y);\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const elemCenter = new Vector3(elem.cx, elem.cy);\n const v = new Vector3().subVectors(elemCenter, resizerCenter);\n baseRelPosMapRef.current.set(elem.id, v);\n baseRotationMapRef.current.set(elem.id, elem.rotation[2]);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n if (baseGroupSet.has(elem.parentId)) {\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n }\n };\n\n const handleIntersectionPlanePointerUp = (event: ThreeEvent) => {\n switch (operation) {\n case Operation.Move:\n case Operation.RotateLower:\n case Operation.RotateUpper:\n addUndoableMove();\n break;\n case Operation.ResizeXY:\n addUndoableResizeXY();\n break;\n case Operation.ResizeZ:\n addUndoableReseizeZ();\n break;\n }\n setShowIntersectionPlane(false);\n useRefStore.getState().setEnableOrbitController(true);\n pointerDownRef.current = false;\n setOperation(Operation.Null);\n setCommonStoreHandleType(null);\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const handleIntersectionPlanePointerMove = (event: ThreeEvent) => {\n if (!intersectionPlaneRef.current || !pointerDownRef.current) return;\n setRayCast(event);\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n switch (operation) {\n case Operation.ResizeXY:\n resizeXY(p);\n break;\n case Operation.ResizeZ:\n resizeZ(p);\n break;\n case Operation.RotateLower:\n case Operation.RotateUpper:\n rotate(p);\n break;\n case Operation.Move:\n setPosition(new Vector3().addVectors(p.clone().setZ(0), resizerCenterRelPosRef.current));\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\n const v = baseRelPosMapRef.current.get(elem.id);\n if (v) {\n elem.cx = p.x + v.x;\n elem.cy = p.y + v.y;\n }\n }\n }\n });\n break;\n }\n }\n };\n\n const handleSize = useHandleSize();\n const bottomHanldeZ = handleSize / 2;\n const topHanldeZ = height + bottomHanldeZ - handleSize / 2;\n const moveHanldeX = hx + handleSize;\n const moveHnadleY = hy + handleSize;\n const resizeHandleY = hy + handleSize * 4;\n\n return (\n \n \n \n \n \n \n {!orthographic && (\n <>\n \n \n \n \n \n )}\n \n\n \n \n \n \n \n \n\n \n \n \n \n\n {showIntersectionPlane && (\n \n )}\n\n \n \n \n \n );\n};\n\nexport default React.memo(GroupMaster);\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","/*\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","/*\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 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 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.Select);\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\r\n useEffect(() => {\r\n if (deletedRoofId === 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 }, [deletedRoofId]);\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 (useStore.getState().groupActionMode) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n e.stopPropagation();\r\n } else {\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\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\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 { useUpdateOldFiles } from './hooks';\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 useUpdateOldFiles(wallModel);\r\n\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 MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\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 GroupMaster from 'src/components/groupMaster';\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 { useGroupMaster, 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 const groupMasterId = useStore(Selector.groupMasterId);\r\n\r\n const { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation } =\r\n useGroupMaster(foundationModel, groupMasterId);\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 const autoDeletedRoof = useStore(Selector.autoDeletedRoof);\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 }, [autoDeletedRoof, 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.autoDeletedRoof = 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 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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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 (useStore.getState().groupActionMode) {\r\n useStore.getState().setGroupMasterId(id);\r\n }\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.Select);\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 && !groupMasterId && (\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 {selected && !locked && groupMasterId === id && foundationModel && groupMasterDimension && (\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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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 {\n width: mullionWidth,\n spacingX: mullionSpacingX,\n spacingY: mullionSpacingY,\n color: mullionColor,\n } = 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 / mullionSpacingX) - 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, mullionSpacingX]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lz / mullionSpacingY) - 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, mullionSpacingY]);\n\n return (\n \n {verticalMullions.map((x, index) => (\n \n {material}\n \n ))}\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 shutter,\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(() => shutter.width * lx, [lx, shutter]);\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.showMullion && (\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, { useEffect, 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 const defaultShutter = { showLeft: false, showRight: false, color: 'grey', width: 0.5 };\r\n\r\nexport type MullionDataType = {\r\n showMullion: boolean;\r\n width: number;\r\n spacingX: number;\r\n spacingY: 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\nconst useUpdateOldFiles = (windowModel: WindowModel) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (\r\n windowModel.mullion === undefined ||\r\n windowModel.mullionWidth === undefined ||\r\n windowModel.mullionSpacing === undefined ||\r\n windowModel.tint === undefined ||\r\n windowModel.opacity === undefined ||\r\n windowModel.shutter === undefined ||\r\n windowModel.mullionColor === undefined ||\r\n windowModel.frame === undefined ||\r\n windowModel.color === undefined ||\r\n windowModel.frameWidth === undefined ||\r\n windowModel.windowType === undefined ||\r\n windowModel.archHeight === undefined\r\n ) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === windowModel.id) {\r\n const w = e as WindowModel;\r\n if (w.mullion === undefined) {\r\n w.mullion = true;\r\n }\r\n if (w.mullionWidth === undefined) {\r\n w.mullionWidth = 0.06;\r\n }\r\n if (w.mullionSpacing === undefined) {\r\n w.mullionSpacing = 0.5;\r\n }\r\n if (w.tint === undefined) {\r\n w.tint = '#73D8FF';\r\n }\r\n if (w.opacity === undefined) {\r\n w.opacity = 0.5;\r\n }\r\n if (w.shutter === undefined) {\r\n w.shutter = defaultShutter;\r\n }\r\n if (w.mullionColor === undefined) {\r\n w.mullionColor = 'white';\r\n }\r\n if (w.frame === undefined) {\r\n w.frame = false;\r\n }\r\n if (w.color === undefined) {\r\n w.color = 'white';\r\n }\r\n if (w.frameWidth === undefined) {\r\n w.frameWidth = 0.1;\r\n }\r\n if (w.windowType === undefined) {\r\n w.windowType = WindowType.Default;\r\n }\r\n if (w.archHeight === undefined) {\r\n w.archHeight = 1;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\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 mullion: showMullion = true,\r\n mullionWidth = 0.06,\r\n mullionSpacing = 0.5,\r\n tint = '#73D8FF',\r\n opacity = 0.5,\r\n shutter = defaultShutter,\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 useUpdateOldFiles(windowModel);\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 = () => {\r\n setCommonStore((state) => {\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 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();\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 showMullion,\r\n width: mullionWidth,\r\n spacingX: mullionSpacing,\r\n spacingY: mullionSpacing,\r\n color: mullionColor,\r\n } as MullionDataType),\r\n [showMullion, mullionWidth, mullionSpacing, 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","/*\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 deletedRoofId = useStore(Selector.deletedRoofId);\r\n const autoDeletedRoof = useStore(Selector.autoDeletedRoof);\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 (deletedRoofId === roofId || autoDeletedRoof?.id === 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 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, deletedRoofId, autoDeletedRoof]);\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 (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 state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\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 = new Vector3((-selectedElement.lx / 2) * lx, 0, (selectedElement.lz / 2) * lz);\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.addedRoofId = 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) {\r\n return;\r\n }\r\n selectMe(id, e, ActionType.Select);\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 }\r\n\r\n function handleWallSideSurfacePointerDown(e: ThreeEvent) {\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 state.groupMasterId = parentId;\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.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.groupMasterId = parentId;\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.Select);\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","/*\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, 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, useUpdateOldDoors } 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 useUpdateOldDoors(doorModel);\r\n\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 const selectMe = () => {\r\n setCommonStore((state) => {\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 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();\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 (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 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\nexport const useUpdateOldDoors = (doorModel: DoorModel) => {\r\n const isFileChangedFlag = useStore(fileChanged);\r\n useEffect(() => {\r\n if (doorModel.doorType === undefined || doorModel.archHeight === undefined || doorModel.filled === undefined) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === doorModel.id && e.type === 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 }\r\n });\r\n }\r\n }, [isFileChangedFlag]);\r\n};\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cone, Line, Plane, Ring, Sphere } from '@react-three/drei';\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../../constants';\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\nimport { Util } from '../../Util';\nimport { SolarPanelModel, SolarPanelModelOnWall } from '../../models/SolarPanelModel';\nimport { LineData } from '../LineData';\nimport { getSunDirection } from 'src/analysis/sunTools';\nimport i18n from 'src/i18n/i18n';\nimport { WallModel } from 'src/models/WallModel';\nimport { FoundationModel } from 'src/models/FoundationModel';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { PvModel } from 'src/models/PvModel';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { useSelected } from '../hooks';\n\ninterface SunbeamProps {\n drawSunbeam: boolean;\n absRotation: number;\n tiltAngle: number;\n}\n\ninterface LabelProps {\n sp: SolarPanelModelOnWall;\n}\n\ninterface TiltHandleProps {\n tiltAngle: number;\n handleSize: number;\n initPointerDown: () => void;\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\n handlePointerUp: () => void;\n}\n\nconst Sunbeam = React.memo(({ drawSunbeam, absRotation, tiltAngle }: SunbeamProps) => {\n const normalVector = new Vector3(0, 0, 1);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const sceneRadius = useStore(Selector.sceneRadius);\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude).applyEuler(new Euler(-HALF_PI - tiltAngle, 0, -absRotation));\n }, [date, latitude, absRotation, tiltAngle]);\n\n return (\n <>\n {drawSunbeam && sunDirection.z > 0 && (\n \n \n \n \n \n \n \n \n \n \n )}\n \n );\n});\n\nconst Label = ({ sp }: LabelProps) => {\n useStore(Selector.elements);\n const getElementById = useStore(Selector.getElementById);\n const language = useStore(Selector.language);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n if (!sp.foundationId || !sp.parentId) {\n return null;\n }\n\n const wall = getElementById(sp.parentId) as WallModel;\n const foundation = getElementById(sp.foundationId) as FoundationModel;\n\n if (!wall || !foundation) {\n return null;\n }\n\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\n const wCenter = new Vector3(wall.cx, wall.cy, wall.cz);\n\n const center = new Vector3(sp.cx * wall.lx, 0, sp.cz * wall.lz)\n .applyEuler(new Euler(0, 0, wall.relativeAngle))\n .add(wCenter)\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\n .add(fCenter);\n\n const labelText =\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\n (sp?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n center.x.toFixed(1) +\n ', ' +\n center.y.toFixed(1) +\n ', ' +\n center.z.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang));\n\n return (\n \n );\n};\n\nconst TiltHandle = ({\n tiltAngle,\n handleSize,\n initPointerDown,\n handlePointerMove,\n handlePointerUp,\n}: TiltHandleProps) => {\n const { gl } = useThree();\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n const [showIntersection, setShowIntersectionPlane] = useState(false);\n const tiltHandleRef = useRef();\n const intersectionPlaneRef = useRef();\n const degree = useMemo(() => new Array(7).fill(0), []);\n const setCommonStore = useStore(Selector.set);\n\n return (\n <>\n {/* ring handles */}\n {\n gl.domElement.style.cursor = 'grab';\n setColor(HIGHLIGHT_HANDLE_COLOR);\n }}\n onPointerOut={() => {\n gl.domElement.style.cursor = 'default';\n setColor(RESIZE_HANDLE_COLOR);\n }}\n onPointerDown={(e) => {\n initPointerDown();\n e.stopPropagation();\n setShowTiltAngle(true);\n setShowIntersectionPlane(true);\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {showIntersection && (\n {\n handlePointerMove(e, intersectionPlaneRef);\n }}\n onPointerUp={() => {\n handlePointerUp();\n setShowIntersectionPlane(false);\n setShowTiltAngle(false);\n }}\n >\n \n \n )}\n\n \n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n );\n};\n\nconst Mount = React.memo(\n ({ tiltAngle, spCy, spLy, lx, nx }: { tiltAngle: number; spCy: number; spLy: number; lx: number; nx: number }) => {\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const mountUnit = useMemo(() => {\n const halfLz = (spLy * Math.cos(tiltAngle)) / 2;\n const startZ = spLy * 0.75 - halfLz;\n const ly = -spCy * 1.5;\n const lz = startZ - halfLz / 2;\n const length = Math.hypot(ly, lz);\n const rotationX = Math.atan2(lz, ly);\n return (\n \n \n \n \n \n );\n }, [tiltAngle, spCy, spLy]);\n\n const arr = useMemo(() => {\n const arr: number[] = [];\n let curr = nx % 2 === 0 ? lx / 2 : 0;\n while (curr < (nx * lx) / 2) {\n arr.push(curr, -curr);\n curr += lx;\n }\n return arr;\n }, [lx, nx]);\n\n return (\n \n {arr.map((val, idx) => (\n \n {mountUnit}\n \n ))}\n \n );\n },\n);\n\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\n\nconst SolarPanelOnWall = ({\n id,\n pvModelName = 'SPR-X21-335-BLK',\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n color = 'white',\n locked = false,\n parentId,\n foundationId,\n orientation = Orientation.portrait,\n showLabel,\n drawSunBeam,\n absRotation,\n tiltAngle,\n relativeAzimuth,\n}: SolarPanelModelOnWall) => {\n tiltAngle = Math.min(0, tiltAngle);\n\n const selected = useSelected(id);\n\n const setCommonStore = useStore(Selector.set);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const pvModules = useStore(Selector.pvModules);\n\n const { camera, gl } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [nx, setNx] = useState(1);\n const baseRef = useRef();\n const solarPanelLinesRef = useRef();\n const pointerDownRef = useRef(false);\n const oldTiltRef = useRef(null);\n\n const ray = useMemo(() => new Raycaster(), []);\n const mouse = useMemo(() => new Vector2(), []);\n\n const pvModel = pvModules[pvModelName] as PvModel;\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const solarPanel = getElementById(id) as SolarPanelModelOnWall;\n\n useEffect(() => {\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n setNx(mx);\n solarPanelLinesRef.current = [];\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n }, [orientation, pvModelName, lx, ly, lz]);\n\n const euler = useMemo(() => {\n return new Euler(HALF_PI, 0, 0);\n }, []);\n\n const relativeEuler = useMemo(() => {\n return new Euler(tiltAngle, 0, 0, 'ZXY');\n }, [tiltAngle]);\n\n const hoverHandle = (e: ThreeEvent) => {\n if (e.intersections.length > 0) {\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\n if (intersected) {\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n gl.domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n gl.domElement.style.cursor = 'grab';\n } else {\n gl.domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n gl.domElement.style.cursor = 'default';\n };\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const tiltHandleSize = (baseSize * 2) / 3;\n\n cy = (ly * Math.sin(tiltAngle)) / 2;\n\n const setRayCast = (e: PointerEvent) => {\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, camera);\n };\n\n const initPointerDown = () => {\n oldTiltRef.current = tiltAngle;\n pointerDownRef.current = true;\n useRefStore.getState().setEnableOrbitController(false);\n };\n\n const tiltHandlePointerMove = (\n e: ThreeEvent,\n intersectionPlaneRef: React.MutableRefObject,\n ) => {\n if (pointerDownRef.current) {\n setRayCast(e);\n if (intersectionPlaneRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects.length > 0) {\n const pointer = intersects[0].point;\n const center = intersectionPlaneRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\n if (center) {\n const cv = new Vector3().subVectors(pointer, center);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const wr = absRotation;\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle = sign * angle - HALF_PI;\n angle = Util.clamp(angle, -HALF_PI, 0);\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\n }\n }\n }\n }\n };\n\n const tiltHandlePointerUp = () => {\n const sp = getElementById(id) as SolarPanelModel;\n if (sp && oldTiltRef.current !== null && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltRef.current,\n newValue: sp.tiltAngle,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n useStore\n .getState()\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\n },\n redo: () => {\n useStore\n .getState()\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\n },\n } as UndoableChange;\n useStore.getState().addUndoable(undoableChange);\n }\n useRefStore.getState().setEnableOrbitController(true);\n pointerDownRef.current = false;\n };\n\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.resizeHandleType = handleType;\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\n });\n };\n\n const clickHandle = (e: ThreeEvent) => {\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\n const handleType = e.object.name;\n switch (handleType) {\n case MoveHandleType.Default: {\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\n });\n break;\n }\n case ResizeHandleType.Left: {\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, 0));\n break;\n }\n case ResizeHandleType.Right: {\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, 0));\n break;\n }\n case ResizeHandleType.Lower: {\n onClickResizeHandle(handleType, new Vector3(0, 0, ly / 2));\n break;\n }\n case ResizeHandleType.Upper: {\n onClickResizeHandle(handleType, new Vector3(0, 0, -ly / 2));\n break;\n }\n }\n }\n };\n\n const texture = useSolarPanelTexture(\n lx,\n ly,\n pvModel,\n orientation,\n solarPanel?.frameColor,\n solarPanel?.backsheetColor,\n );\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n const renderTopTextureMaterial = () => {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return ;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n };\n\n const renderBotTextureMaterial = () => {\n if (pvModel?.bifacialityFactor === 0 || tiltAngle === 0) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n };\n\n return (\n <>\n \n \n {/* draw panel */}\n {\n if (\n e.button === 2 ||\n useStore.getState().isAddingElement() ||\n useStore.getState().objectTypeToAdd !== ObjectType.None\n )\n return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n gl.domElement.style.cursor = 'move';\n setHovered(true);\n }\n }\n }}\n onPointerOut={(e) => {\n gl.domElement.style.cursor = 'default';\n setHovered(false);\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLinesRef.current &&\n solarPanelLinesRef.current.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n\n \n\n {/*draw label */}\n {(hovered || showLabel) && !selected && \n\n {tiltAngle !== 0 && pvModel && (\n \n )}\n \n\n {selected && !locked && (\n \n \n \n )}\n \n );\n};\n\nexport default React.memo(SolarPanelOnWall);\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);\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);\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);\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 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 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 { 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\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 }\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 };\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 // 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 {/* 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?: () => 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, 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 const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === handleType) {\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = 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 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';\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { getSunDirection } from 'src/analysis/sunTools';\nimport RotateHandle from 'src/components/rotateHandle';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from 'src/constants';\nimport i18n from 'src/i18n/i18n';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { PvModel } from 'src/models/PvModel';\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\nimport { useStore } from 'src/stores/common';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { useRefStore } from 'src/stores/commonRef';\nimport {\n ActionType,\n BoxArgs,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n TrackerType,\n} from 'src/types';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport { Util } from 'src/Util';\nimport { Euler, Vector3, Mesh, DoubleSide, Color, FrontSide } from 'three';\nimport * as Selector from '../../stores/selector';\nimport { LineData } from '../LineData';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { useSelected } from '../hooks';\n\ninterface SolarPanelBoxGroupProps {\n solarPanelModel: SolarPanelModel;\n groupRotation: Euler;\n panelRotation: Euler;\n}\n\ninterface SunbeamProps {\n sunDirection: Vector3;\n}\n\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\n\nconst SolarPanelOnCuboid = (solarPanelModel: SolarPanelModel) => {\n const {\n id,\n parentId,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n normal,\n locked,\n trackerType,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius,\n poleSpacing,\n color = 'white',\n } = solarPanelModel;\n\n const selected = useSelected(id);\n\n const isTop = isSolarPanelOnTopFace(normal);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = isTop ? poleHeight : 0;\n const baseSize = Math.max(1, (lx + ly) / 16);\n const rotateHandleSize = (baseSize * 2) / 3;\n const tiltHandleSize = (baseSize * 2) / 3;\n const poleZ = -poleHeight / 2 - lz / 2;\n\n const setCommonStore = useStore(Selector.set);\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\n const addUndoable = useStore(Selector.addUndoable);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n\n const {\n gl: { domElement },\n camera,\n raycaster,\n mouse,\n } = useThree();\n\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n\n const pointerDown = useRef(false);\n const oldTiltAngleRef = useRef(0);\n const newTiltAngleRef = useRef(0);\n const parentWorldPositionRef = useRef(null);\n const parentWorldRotationRef = useRef(null);\n\n const tiltHandleRef = useRef();\n\n const degree = useMemo(() => new Array(13).fill(0), []);\n const dateObject = useMemo(() => new Date(date), [date]);\n\n const poles = useMemo(() => {\n const poleArray: Vector3[] = [];\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\n const sinTilt = 0.5 * Math.sin(tiltAngle);\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\n for (let ix = -poleNx; ix <= poleNx; ix++) {\n for (let iy = -poleNy; iy <= poleNy; iy++) {\n const xi = ix * cosAz - iy * sinAz;\n const yi = ix * sinAz + iy * cosAz;\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\n }\n }\n return poleArray;\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\n\n const groupRotation = useMemo(() => getRotationFromNormal(normal), [normal]);\n\n const panelRotation = useMemo(() => {\n if (isTop) {\n if (trackerType === TrackerType.NO_TRACKER) {\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }\n const sunDirection = getSunDirection(dateObject, latitude);\n const rot = getWorldRotationZ(parentId, groupRotation.z) - groupRotation.z;\n switch (trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const r = Math.hypot(sunDirection.x, sunDirection.y);\n return new Euler(\n Math.atan2(r, sunDirection.z),\n 0,\n Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot,\n 'ZXY',\n );\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n return new Euler(0, Math.atan2(sunDirection.x, sunDirection.z), -rot + (lx < ly ? 0 : HALF_PI), 'XYZ');\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n return new Euler(tiltAngle, 0, Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot, 'ZXY');\n }\n }\n return new Euler();\n }, [isTop, tiltAngle, relativeAzimuth, trackerType, dateObject, latitude]);\n\n const showRotateHandle = selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop;\n const showTiltHandle =\n selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop && Math.abs(actualPoleHeight) > 0.1;\n const showPoles = actualPoleHeight > 0 && isTop;\n\n // handle pointer up\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n setShowTiltAngle(false);\n setCommonStore((state) => {\n state.rotateHandleType = null;\n state.moveHandleType = null;\n state.resizeHandleType = null;\n });\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const getRotateHandleColor = (rotateHandleType: RotateHandleType) => {\n return hoveredHandle === rotateHandleType || useStore.getState().rotateHandleType === rotateHandleType\n ? HIGHLIGHT_HANDLE_COLOR\n : RESIZE_HANDLE_COLOR;\n };\n\n return (\n \n \n\n {/* draw rotate handles */}\n {showRotateHandle && (\n \n {/* rotate handles */}\n \n \n \n )}\n\n {/* draw tilt handles */}\n {showTiltHandle && (\n <>\n {/* ring handles */}\n {\n hoverHandle(e, RotateHandleType.Tilt);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n setShowTiltAngle(true);\n if (hoveredHandle) {\n useRefStore.getState().setEnableOrbitController(false);\n pointerDown.current = true;\n // const sp = getElementById(id) as SolarPanelModel;\n oldTiltAngleRef.current = tiltAngle;\n const { rot } = Util.getWorldDataById(parentId);\n parentWorldRotationRef.current = rot;\n }\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltAngleRef.current,\n newValue: newTiltAngleRef.current,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n }}\n onPointerMove={(e) => {\n if (pointerDown.current) {\n raycaster.setFromCamera(mouse, camera);\n if (tiltHandleRef.current) {\n const intersects = raycaster.intersectObjects([tiltHandleRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n const parent = tiltHandleRef.current.parent;\n if (parent) {\n const ov = parent.localToWorld(new Vector3()); // rotate point in world coordinate\n const cv = new Vector3().subVectors(p, ov);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > actualPoleHeight;\n if (!touch) {\n const wr = relativeAzimuth + (parentWorldRotationRef.current ?? 0);\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle *= sign;\n updateSolarPanelTiltAngleById(id, angle);\n newTiltAngleRef.current = angle;\n }\n }\n }\n }\n }\n }}\n >\n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n )}\n\n {/* draw poles */}\n {showPoles &&\n poles.map((p, i) => {\n return (\n \n \n \n );\n })}\n \n );\n};\n\nconst SolarPanelBoxGroup = ({ solarPanelModel, groupRotation, panelRotation }: SolarPanelBoxGroupProps) => {\n let {\n id,\n parentId,\n lx,\n ly,\n lz,\n cx,\n cy,\n cz,\n normal,\n tiltAngle,\n relativeAzimuth,\n trackerType,\n drawSunBeam,\n selected,\n locked,\n showLabel,\n label,\n pvModelName,\n orientation,\n frameColor,\n backsheetColor,\n color,\n poleHeight,\n } = solarPanelModel;\n\n const setCommonStore = useStore(Selector.set);\n const selectMe = useStore(Selector.selectMe);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const language = useStore(Selector.language);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const pvModules = useStore(Selector.pvModules);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const isTop = isSolarPanelOnTopFace(normal);\n const actualTiltAngle = isTop ? tiltAngle : 0;\n const actualRelativeAzimuth = isTop ? relativeAzimuth : 0;\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const [hx, hy, hz] = [lx, ly, lz].map((v) => v / 2);\n const resizeHandleArgs = [resizeHandleSize, resizeHandleSize, lz * 1.2] as BoxArgs;\n const pvModel = pvModules[pvModelName] as PvModel;\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const dateObject = useMemo(() => new Date(date), [date]);\n const labelText = useMemo(() => {\n return (\n (label ? label : i18n.t('shared.SolarPanelElement', lang)) +\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [label, locked, language, cx, cy, cz]);\n\n const solarPanelLines = useMemo(() => {\n const lines: LineData[] = [];\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n lines.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n lines.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n return lines;\n }, [pvModel, orientation, pvModelName, lx, ly, lz]);\n\n const [relativeSunDirection, setRelativeSunDirection] = useState(getRelativeSunDirection());\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n\n const baseRef = useRef(null);\n\n const { gl } = useThree();\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n useFrame(() => {\n const newRelativeSunDirection = getRelativeSunDirection();\n if (!newRelativeSunDirection.equals(relativeSunDirection)) {\n setRelativeSunDirection(newRelativeSunDirection);\n }\n });\n\n function getRelativeSunDirection(): Vector3 {\n const euler = new Euler();\n const worldRotationZ = getWorldRotationZ(parentId, groupRotation.z);\n if (trackerType === TrackerType.NO_TRACKER) {\n euler.set(-groupRotation.x - actualTiltAngle, 0, -worldRotationZ - actualRelativeAzimuth);\n } else {\n euler.set(-groupRotation.x - panelRotation.x, -panelRotation.y, -worldRotationZ - panelRotation.z);\n }\n return getSunDirection(dateObject, latitude).applyEuler(euler);\n }\n\n function getResizeHandleColor(handleType: ResizeHandleType) {\n return hoveredHandle === handleType || resizeHandleType === handleType\n ? HIGHLIGHT_HANDLE_COLOR\n : RESIZE_HANDLE_COLOR;\n }\n\n function hoverHandle(e: ThreeEvent) {\n if (e.intersections.length > 0) {\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\n if (intersected) {\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n gl.domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n gl.domElement.style.cursor = 'grab';\n } else {\n gl.domElement.style.cursor = 'pointer';\n }\n }\n }\n }\n\n function noHoverHandle() {\n setHoveredHandle(null);\n gl.domElement.style.cursor = 'default';\n }\n\n function onClickResizeHandle(handleType: ResizeHandleType, anchor: Vector3) {\n useRefStore.getState().setEnableOrbitController(false);\n setCommonStore((state) => {\n state.resizeHandleType = handleType;\n state.resizeAnchor.copy(anchor);\n });\n }\n\n function clickHandle(e: ThreeEvent) {\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\n const handleType = e.object.name;\n switch (handleType) {\n case MoveHandleType.Default: {\n useRefStore.getState().setEnableOrbitController(false);\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\n });\n break;\n }\n case ResizeHandleType.Left: {\n const anchor = e.object.localToWorld(new Vector3(lx, 0, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Right: {\n const anchor = e.object.localToWorld(new Vector3(-lx, 0, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Lower: {\n const anchor = e.object.localToWorld(new Vector3(0, ly, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Upper: {\n const anchor = e.object.localToWorld(new Vector3(0, -ly, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n }\n }\n }\n\n function renderTopTextureMaterial() {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return ;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n }\n\n function renderBotTextureMaterial() {\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n }\n\n return (\n <>\n \n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n gl.domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n gl.domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {/* move & resize handles */}\n {selected && !locked && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n\n {/* sun beam */}\n {drawSunBeam && relativeSunDirection.z > 0 && }\n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLines.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n \n\n {/*draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nconst Sunbeam = React.memo(({ sunDirection }: SunbeamProps) => {\n const sceneRadius = useStore(Selector.sceneRadius);\n\n const sunBeamLength = useMemo(() => Math.max(100, 10 * sceneRadius), [sceneRadius]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n});\n\nexport function getRotationFromNormal(normal: number[]) {\n const [x, y, z] = normal;\n if (z === 1) {\n return new Euler(0, 0, 0);\n }\n if (x !== 0) {\n return new Euler(HALF_PI, 0, x * HALF_PI, 'ZXY');\n }\n if (y !== 0) {\n return new Euler(-y * HALF_PI, 0, 0);\n }\n return new Euler();\n}\n\nexport function isSolarPanelOnTopFace(normal: number[]) {\n return Math.abs(normal[2] - 1) < 0.01;\n}\n\nfunction getWorldRotationZ(parentId: string, selfRotation: number) {\n const { rot } = Util.getWorldDataById(parentId);\n return rot + selfRotation;\n}\n\nexport default React.memo(SolarPanelOnCuboid);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport Facade_Texture_00 from '../../resources/tiny_white_square.png';\nimport Facade_Texture_01 from '../../resources/building_facade_01.png';\nimport Facade_Texture_02 from '../../resources/building_facade_02.png';\nimport Facade_Texture_03 from '../../resources/building_facade_03.png';\nimport Facade_Texture_04 from '../../resources/building_facade_04.png';\nimport Facade_Texture_05 from '../../resources/building_facade_05.png';\nimport Facade_Texture_06 from '../../resources/building_facade_06.png';\nimport Facade_Texture_07 from '../../resources/building_facade_07.png';\nimport Facade_Texture_08 from '../../resources/building_facade_08.png';\nimport Facade_Texture_09 from '../../resources/building_facade_09.png';\nimport Facade_Texture_10 from '../../resources/building_facade_10.png';\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Plane } from '@react-three/drei';\nimport { CanvasTexture, Euler, FrontSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from '../../stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { CuboidModel } from '../../models/CuboidModel';\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n ActionType,\n CuboidTexture,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n} from '../../types';\nimport {\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n ORIGIN_VECTOR2,\n TWO_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 UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../../constants';\nimport { Util } from '../../Util';\nimport { ElementModel } from '../../models/ElementModel';\nimport { PolarGrid } from '../polarGrid';\nimport Wireframe from '../../components/wireframe';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { UndoableAdd } from '../../undo/UndoableAdd';\nimport { UndoableMove } from '../../undo/UndoableMove';\nimport { UndoableResize } from '../../undo/UndoableResize';\nimport { UndoableChange } from '../../undo/UndoableChange';\nimport i18n from '../../i18n/i18n';\nimport { Point2 } from '../../models/Point2';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { ElementGrid } from '../elementGrid';\nimport { HorizontalRuler } from '../horizontalRuler';\nimport { showError } from '../../helpers';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\nimport Handles from './handles';\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\nimport { getSolarPanelUnitLength } from '../wall/wall';\nimport { isSolarPanelOnTopFace } from '../solarPanel/solarPanelOnCuboid';\nimport { useSelected } from '../hooks';\n\nconst Cuboid = (cuboidModel: CuboidModel) => {\n const {\n id,\n cx,\n cy,\n lx = 1,\n ly = 1,\n lz = 1,\n color = 'silver',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n textureTypes = [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n stackable,\n } = cuboidModel;\n\n const selected = useSelected(id);\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const orthographic = useStore(Selector.viewState.orthographic);\n const getElementById = useStore(Selector.getElementById);\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const addElement = useStore(Selector.addElement);\n const removeElementById = useStore(Selector.removeElementById);\n const updateElementLxById = useStore(Selector.updateElementLxById);\n const updateElementLyById = useStore(Selector.updateElementLyById);\n const setElementPosition = useStore(Selector.setElementPosition);\n const setElementSize = useStore(Selector.setElementSize);\n const setElementNormal = useStore(Selector.setElementNormal);\n const selectMe = useStore(Selector.selectMe);\n const updateSolarPanelRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\n const getPvModule = useStore(Selector.getPvModule);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const addUndoable = useStore(Selector.addUndoable);\n const isAddingElement = useStore(Selector.isAddingElement);\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const groundImage = useStore(Selector.viewState.groundImage);\n const groupMasterId = useStore(Selector.groupMasterId);\n\n const {\n camera,\n gl: { domElement },\n raycaster,\n mouse,\n } = useThree();\n const [heatmapTextureTop, setHeatmapTextureTop] = useState(null);\n const [heatmapTextureSouth, setHeatmapTextureSouth] = useState(null);\n const [heatmapTextureNorth, setHeatmapTextureNorth] = useState(null);\n const [heatmapTextureWest, setHeatmapTextureWest] = useState(null);\n const [heatmapTextureEast, setHeatmapTextureEast] = useState(null);\n const [hovered, setHovered] = useState(false);\n const [showGrid, setShowGrid] = useState(false);\n const [normal, setNormal] = useState();\n\n const groupRef = useRef(null);\n const baseRef = useRef();\n const grabRef = useRef(null);\n const faceNormalRef = useRef(UNIT_VECTOR_POS_Z);\n const gridPositionRef = useRef(new Vector3(0, 0, 0));\n const gridRotationRef = useRef(new Euler(0, 0, 0));\n const gridDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldPositionRef = useRef(new Vector3());\n const newPositionRef = useRef(new Vector3());\n const oldNormalRef = useRef(new Vector3());\n const newNormalRef = useRef(new Vector3());\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldAzimuthRef = useRef(0);\n const newAzimuthRef = useRef(0);\n const oldVerticesRef = useRef([]);\n const newVerticesRef = useRef([]);\n const intersectPlaneRef = useRef();\n const worldPositionRef = useRef(new Vector3());\n const worldRotationRef = useRef(0);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\n if (grabRef.current && grabRef.current.type === ObjectType.SolarPanel) {\n const isTop = isSolarPanelOnTopFace(grabRef.current.normal);\n const actualPoleHeight = isTop ? (grabRef.current as SolarPanelModel).poleHeight : 0;\n intersectionPlanePosition.set(0, 0, cuboidModel.lz / 2 + actualPoleHeight);\n }\n\n const labelText = useMemo(() => {\n return (\n (cuboidModel?.label ? cuboidModel.label : i18n.t('shared.CuboidElement', lang)) +\n (cuboidModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (cuboidModel?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n (lz / 2).toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [cuboidModel?.label, locked, language, cx, cy, lz]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n grabRef.current = null;\n setShowGrid(false);\n useRefStore.getState().setEnableOrbitController(true);\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n useEffect(() => {\n if (useStore.getState().tempHumanPlant.length > 0) {\n setCommonStore((state) => {\n state.elements.push(...state.tempHumanPlant);\n state.tempHumanPlant = [];\n });\n }\n }, []);\n\n useEffect(() => {\n if (cuboidModel && showSolarRadiationHeatmap) {\n const maxValue = solarRadiationHeatmapMaxValue ?? 5;\n const heatmapTop = getHeatmap(cuboidModel.id + '-top');\n if (heatmapTop) {\n setHeatmapTextureTop(Util.fetchHeatmapTexture(heatmapTop, maxValue));\n }\n const heatmapSouth = getHeatmap(cuboidModel.id + '-south');\n if (heatmapSouth) {\n setHeatmapTextureSouth(Util.fetchHeatmapTexture(heatmapSouth, maxValue));\n }\n const heatmapNorth = getHeatmap(cuboidModel.id + '-north');\n if (heatmapNorth) {\n setHeatmapTextureNorth(Util.fetchHeatmapTexture(heatmapNorth, maxValue));\n }\n const heatmapWest = getHeatmap(cuboidModel.id + '-west');\n if (heatmapWest) {\n setHeatmapTextureWest(Util.fetchHeatmapTexture(heatmapWest, maxValue));\n }\n const heatmapEast = getHeatmap(cuboidModel.id + '-east');\n if (heatmapEast) {\n setHeatmapTextureEast(Util.fetchHeatmapTexture(heatmapEast, maxValue, true));\n }\n // note: unfortunately, setting the rotation of the canvas textures seems to\n // have no effect. so we must do it in a different way.\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n const fetchTextureImage = (textureType: CuboidTexture) => {\n switch (textureType) {\n case CuboidTexture.Facade01:\n return Facade_Texture_01;\n case CuboidTexture.Facade02:\n return Facade_Texture_02;\n case CuboidTexture.Facade03:\n return Facade_Texture_03;\n case CuboidTexture.Facade04:\n return Facade_Texture_04;\n case CuboidTexture.Facade05:\n return Facade_Texture_05;\n case CuboidTexture.Facade06:\n return Facade_Texture_06;\n case CuboidTexture.Facade07:\n return Facade_Texture_07;\n case CuboidTexture.Facade08:\n return Facade_Texture_08;\n case CuboidTexture.Facade09:\n return Facade_Texture_09;\n case CuboidTexture.Facade10:\n return Facade_Texture_10;\n default:\n return Facade_Texture_00;\n }\n };\n\n const fetchRepeatDividers = (textureType: CuboidTexture) => {\n switch (textureType) {\n case CuboidTexture.Facade01:\n return { x: 14, y: 6.5 };\n case CuboidTexture.Facade02:\n return { x: 14, y: 6.5 };\n case CuboidTexture.Facade03:\n return { x: 10, y: 12 };\n case CuboidTexture.Facade04:\n return { x: 20, y: 11 };\n case CuboidTexture.Facade05:\n return { x: 15, y: 10 };\n case CuboidTexture.Facade06:\n return { x: 11, y: 3.5 };\n case CuboidTexture.Facade07:\n return { x: 11, y: 10 };\n case CuboidTexture.Facade08:\n return { x: 16, y: 9 };\n case CuboidTexture.Facade09:\n return { x: 10, y: 9 };\n case CuboidTexture.Facade10:\n return { x: 12, y: 9 };\n default:\n return { x: 1, y: 1 }; // maybe for rooftop\n }\n };\n\n const textureLoaderEast = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[0]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[0]);\n t.repeat.set(ly / param.x, lz / param.y);\n t.rotation = HALF_PI;\n t.center.x = 1;\n t.center.y = 0;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureEast(t);\n });\n }, [textureTypes[0], ly, lz]);\n const [textureEast, setTextureEast] = useState(textureLoaderEast);\n\n const textureLoaderWest = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[1]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[1]);\n t.repeat.set(ly / param.x, lz / param.y);\n t.rotation = -HALF_PI;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureWest(t);\n });\n }, [textureTypes[1], ly, lz]);\n const [textureWest, setTextureWest] = useState(textureLoaderWest);\n\n const textureLoaderNorth = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[2]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[2]);\n t.repeat.set(lx / param.x, lz / param.y);\n t.rotation = Math.PI;\n t.center.x = 0;\n t.center.y = 1;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureNorth(t);\n });\n }, [textureTypes[2], lx, lz]);\n const [textureNorth, setTextureNorth] = useState(textureLoaderNorth);\n\n const textureLoaderSouth = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[3]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[3]);\n t.repeat.set(lx / param.x, lz / param.y);\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureSouth(t);\n });\n }, [textureTypes[3], lx, lz]);\n const [textureSouth, setTextureSouth] = useState(textureLoaderSouth);\n\n const textureLoaderTop = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[4]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[4]);\n t.repeat.set(lx / param.x, ly / param.y);\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureTop(t);\n });\n }, [textureTypes[4], lx, ly]);\n const [textureTop, setTextureTop] = useState(textureLoaderTop);\n\n useEffect(() => {\n invalidate();\n }, [...textureTypes]);\n\n const legalOnCuboid = (type: ObjectType) => {\n switch (type) {\n case ObjectType.Polygon:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.SolarPanel:\n return true;\n }\n return false;\n };\n\n const legalAddToCuboid = (type: ObjectType) => {\n switch (type) {\n case ObjectType.Polygon:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.SolarPanel:\n case ObjectType.Human:\n case ObjectType.Tree:\n case ObjectType.Flower:\n return true;\n }\n return false;\n };\n\n const setupGridParams = (face: Vector3) => {\n faceNormalRef.current = face;\n const aboveDistance = 0.01;\n if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Z)) {\n gridPositionRef.current = new Vector3(0, 0, hz + aboveDistance);\n gridRotationRef.current = new Euler(0, 0, 0);\n gridDimensionRef.current.set(hx, hy, hz);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_X)) {\n // east face in view coordinate system\n gridPositionRef.current = new Vector3(hx + aboveDistance, 0, 0);\n gridRotationRef.current = new Euler(0, HALF_PI, 0);\n gridDimensionRef.current.set(hz, hy, hx);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_X)) {\n // west face in view coordinate system\n gridPositionRef.current = new Vector3(-hx - aboveDistance, 0, 0);\n gridRotationRef.current = new Euler(0, -HALF_PI, 0);\n gridDimensionRef.current.set(hz, hy, hx);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_Y)) {\n // south face in the view coordinate system\n gridPositionRef.current = new Vector3(0, -hy - aboveDistance, 0);\n gridRotationRef.current = new Euler(HALF_PI, 0, 0);\n gridDimensionRef.current.set(hx, hz, hy);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Y)) {\n // north face in the view coordinate system\n gridPositionRef.current = new Vector3(0, hy + aboveDistance, 0);\n gridRotationRef.current = new Euler(-HALF_PI, 0, 0);\n gridDimensionRef.current.set(hx, hz, hy);\n }\n };\n\n const ratio = Math.max(1, Math.max(lx, ly) / 8);\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\n\n const onTopSurface = Util.isIdentical(grabRef.current?.normal, UNIT_VECTOR_POS_Z_ARRAY);\n\n const handleAddElement = (e: ThreeEvent) => {\n const intersection = e.intersections[0];\n const objectToAdd = useStore.getState().objectTypeToAdd;\n if (objectToAdd === ObjectType.SolarPanel) {\n const pointer = intersection.point;\n const { pos, rot } = Util.getWorldDataById(id);\n const diff = new Vector3().subVectors(pointer, pos).applyEuler(new Euler(0, 0, -rot));\n const addedElement = ElementModelFactory.makeSolarPanel(\n cuboidModel,\n useStore.getState().getPvModule(useStore.getState().actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\n diff.x / lx,\n diff.y / ly,\n diff.z / lz,\n useStore.getState().actionState.solarPanelOrientation ?? Orientation.landscape,\n useStore.getState().actionState.solarPanelPoleHeight ?? 1,\n useStore.getState().actionState.solarPanelPoleSpacing ?? 3,\n useStore.getState().actionState.solarPanelTiltAngle ?? 0,\n useStore.getState().actionState.solarPanelRelativeAzimuth ?? 0,\n intersection.face?.normal,\n [0, 0, 0],\n useStore.getState().actionState.solarPanelFrameColor ?? 'white',\n );\n setCommonStore((state) => {\n state.elements.push(addedElement);\n });\n return addedElement;\n } else {\n return addElement(cuboidModel, intersection.point, intersection.face?.normal);\n }\n };\n\n const handlePointerDown = (e: ThreeEvent) => {\n if (e.button === 2) return; // ignore right-click\n if (!isAddingElement()) {\n selectMe(id, e, ActionType.Select);\n }\n const selectedElement = getSelectedElement();\n let bypass = false;\n if (\n e.intersections[0].object.name === ObjectType.Polygon &&\n useStore.getState().objectTypeToAdd !== ObjectType.None\n ) {\n bypass = true;\n }\n if (selectedElement?.id === id || bypass) {\n if (useStore.getState().groupActionMode) {\n const baseId = Util.getBaseId(id);\n useStore.getState().setGroupMasterId(baseId);\n }\n // no child of this cuboid is clicked\n if (legalAddToCuboid(useStore.getState().objectTypeToAdd) && cuboidModel) {\n setShowGrid(true);\n const addedElement = handleAddElement(e);\n if (addedElement) {\n const undoableAdd = {\n name: 'Add',\n timestamp: Date.now(),\n addedElement: addedElement,\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 } else {\n useRefStore.getState().selectNone();\n useRefStore.setState((state) => {\n state.cuboidRef = groupRef;\n });\n }\n } else {\n // a child of this cuboid is clicked\n if (selectedElement && selectedElement.parentId === id) {\n if (legalOnCuboid(selectedElement.type)) {\n setShowGrid(true);\n const { rot, pos } = Util.getWorldDataById(id);\n worldPositionRef.current.copy(pos);\n worldRotationRef.current = rot;\n grabRef.current = selectedElement;\n let face;\n for (const x of e.intersections) {\n if (x.object === baseRef.current) {\n face = x.face;\n break;\n }\n }\n if (face) {\n setupGridParams(face.normal);\n if (!normal || !normal.equals(face.normal)) {\n setNormal(face.normal);\n }\n }\n useRefStore.getState().setEnableOrbitController(false);\n oldPositionRef.current.x = selectedElement.cx;\n oldPositionRef.current.y = selectedElement.cy;\n oldPositionRef.current.z = selectedElement.cz;\n oldNormalRef.current.fromArray(selectedElement.normal);\n oldDimensionRef.current.x = selectedElement.lx;\n oldDimensionRef.current.y = selectedElement.ly;\n oldDimensionRef.current.z = selectedElement.lz;\n switch (selectedElement.type) {\n case ObjectType.SolarPanel:\n oldAzimuthRef.current = (selectedElement as SolarPanelModel).relativeAzimuth;\n break;\n case ObjectType.Polygon:\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\n break;\n }\n }\n }\n }\n };\n\n const handlePointerMove = (e: ThreeEvent) => {\n if (grabRef.current && cuboidModel) {\n if (grabRef.current.type === ObjectType.SolarPanel && onTopSurface) return;\n if (grabRef.current.parentId === id && grabRef.current.type && !grabRef.current.locked) {\n const mouse = new Vector2(\n (e.offsetX / domElement.clientWidth) * 2 - 1,\n 1 - (e.offsetY / domElement.clientHeight) * 2,\n );\n raycaster.setFromCamera(mouse, camera);\n if (baseRef.current) {\n const intersects = raycaster.intersectObjects([baseRef.current]);\n if (intersects.length > 0) {\n let p = intersects[0].point;\n const face = intersects[0].face;\n if (useStore.getState().moveHandleType) {\n if (face) {\n const n = face.normal;\n if (normal && !normal.equals(n)) {\n setNormal(n);\n }\n setupGridParams(n);\n setElementNormal(grabRef.current.id, n.x, n.y, n.z);\n }\n p = Util.relativeCoordinates(p.x, p.y, p.z, cuboidModel);\n if (grabRef.current.type === ObjectType.Polygon) {\n const polygon = grabRef.current as PolygonModel;\n if (useStore.getState().moveHandleType === MoveHandleType.Default) {\n const centroid = Util.calculatePolygonCentroid(oldVerticesRef.current);\n const n = new Vector3().fromArray(polygon.normal);\n let dx: number, dy: number;\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n // east face\n dx = -(centroid.x + p.z);\n dy = p.y - centroid.y;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n // west face\n dx = p.z - centroid.x;\n dy = p.y - centroid.y;\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n // north face\n dx = p.x - centroid.x;\n dy = -(centroid.y + p.z);\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n // south face\n dx = p.x - centroid.x;\n dy = p.z - centroid.y;\n } else {\n // top face\n dx = p.x - centroid.x;\n dy = p.y - centroid.y;\n }\n const copy = oldVerticesRef.current.map((v) => ({ ...v }));\n copy.forEach((v: Point2) => {\n v.x += dx;\n v.y += dy;\n });\n // update all the vertices at once with the DEEP COPY above\n // do not update each vertex's position one by one (it is slower)\n updatePolygonVerticesById(polygon.id, copy);\n }\n } else {\n setElementPosition(grabRef.current.id, p.x, p.y, p.z);\n }\n } else if (useStore.getState().resizeHandleType) {\n switch (grabRef.current.type) {\n case ObjectType.SolarPanel:\n const solarPanel = grabRef.current as SolarPanelModel;\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\n const resizeAnchor = useStore.getState().resizeAnchor;\n const resizeHandleType = useStore.getState().resizeHandleType;\n\n // z direction\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\n const ny = Math.max(1, Math.round(Math.abs(p.z - resizeAnchor.z) / unitY));\n const length = ny * unitY;\n const v = new Vector3(0, 0, p.z - resizeAnchor.z).normalize().multiplyScalar(length);\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\n setCommonStore((state) => {\n const sp = state.elements.find((e) => e.id === solarPanel.id);\n if (!sp) return;\n sp.cz = (worldCenter.z - worldPositionRef.current.z) / lz;\n sp.ly = Math.abs(v.z);\n });\n }\n // XY direction\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\n const diff = new Vector3().subVectors(p, resizeAnchor).setZ(0);\n const nx = Math.max(1, Math.round(diff.length() / unitX));\n const length = nx * unitX;\n const v = diff.clone().normalize().multiplyScalar(length);\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\n const relativeCenter = new Vector3()\n .subVectors(worldCenter, worldPositionRef.current)\n .applyEuler(new Euler(0, 0, -worldRotationRef.current));\n setCommonStore((state) => {\n const sp = state.elements.find((e) => e.id === solarPanel.id);\n if (!sp) return;\n if (Math.abs(Math.abs(sp.normal[1]) - 1) < 0.01) {\n sp.cx = relativeCenter.x / lx;\n } else {\n sp.cy = relativeCenter.y / ly;\n }\n sp.lx = v.length();\n });\n }\n break;\n case ObjectType.Polygon:\n if (useStore.getState().resizeHandleType === ResizeHandleType.Default) {\n // first, reverse the rotation of p.x and p.y around the center of the cuboid\n let q = new Vector3(\n p.x - worldPositionRef.current.x,\n p.y - worldPositionRef.current.y,\n 0,\n ).applyEuler(new Euler(0, 0, -worldRotationRef.current, 'ZXY'));\n // then do the vertex on each face in the de-rotated coordinate system\n const polygon = grabRef.current as PolygonModel;\n const n = new Vector3().fromArray(polygon.normal);\n let lx, ly;\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n // east face\n lx = cuboidModel.lz;\n ly = cuboidModel.ly;\n q.x = -p.z + worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n // west face\n lx = cuboidModel.lz;\n ly = cuboidModel.ly;\n q.x = p.z - worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n // north face\n lx = cuboidModel.lx;\n ly = cuboidModel.lz;\n q.y = -p.z + worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n // south face\n lx = cuboidModel.lx;\n ly = cuboidModel.lz;\n q.y = p.z - worldPositionRef.current.z;\n } else {\n // top face\n lx = cuboidModel.lx;\n ly = cuboidModel.ly;\n }\n q = useStore.getState().enableFineGrid ? Util.snapToFineGrid(q) : Util.snapToNormalGrid(q);\n q.x /= lx;\n q.y /= ly;\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, q.x, q.y);\n }\n break;\n }\n }\n }\n }\n }\n }\n };\n\n const handleSolarPanelPointerMoveOnTopSurface = (e: ThreeEvent) => {\n if (intersectPlaneRef.current && grabRef.current && cuboidModel) {\n if (grabRef.current.type !== ObjectType.SolarPanel || !onTopSurface) return;\n const solarPanel = grabRef.current as SolarPanelModel;\n if (solarPanel.parentId !== id || solarPanel.locked) return;\n raycaster.setFromCamera(mouse, camera);\n const intersects = raycaster.intersectObjects([intersectPlaneRef.current]);\n if (intersects.length > 0) {\n let p = intersects[0].point.clone();\n if (useStore.getState().moveHandleType) {\n p = Util.relativeCoordinates(p.x, p.y, p.z - solarPanel.poleHeight, cuboidModel);\n setElementPosition(solarPanel.id, p.x, p.y, p.z);\n } else if (\n useStore.getState().rotateHandleType &&\n useStore.getState().rotateHandleType !== RotateHandleType.Tilt\n ) {\n const pr = worldRotationRef.current; //parent rotation\n const pc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); //world parent center\n const cc = new Vector2(cuboidModel.lx * solarPanel.cx, cuboidModel.ly * solarPanel.cy) //local current center\n .rotateAround(ORIGIN_VECTOR2, pr); //add parent rotation\n const wc = new Vector2().addVectors(cc, pc); //world current center\n const rotation =\n -pr +\n Math.atan2(-p.x + wc.x, p.y - wc.y) +\n (useStore.getState().rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\n const newAzimuth = rotation + offset;\n updateSolarPanelRelativeAzimuthById(solarPanel.id, newAzimuth);\n newAzimuthRef.current = newAzimuth;\n } else if (useStore.getState().resizeHandleType) {\n const resizeAnchor = useStore.getState().resizeAnchor;\n const pvModel = getPvModule(solarPanel.pvModelName);\n const wp = new Vector2(p.x, p.y);\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\n const distance = wp.distanceTo(resizeAnchor2D);\n const angle = solarPanel.relativeAzimuth + worldRotationRef.current; // world panel azimuth\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\n switch (useStore.getState().resizeHandleType) {\n case ResizeHandleType.Lower:\n case ResizeHandleType.Upper:\n {\n const sign = useStore.getState().resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\n const theta = rp.angle() - angle + sign * HALF_PI;\n let dyl = distance * Math.cos(theta);\n if (solarPanel.orientation === Orientation.portrait) {\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\n dyl = nx * pvModel.length;\n } else {\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\n dyl = nx * pvModel.width;\n }\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\n const wc = new Vector2(wcx, wcy); // world panel center\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); // world foundation center\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\n const newCx = rc.x / lx;\n const newCy = rc.y / ly;\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, solarPanel.lx, dyl)) {\n updateElementLyById(solarPanel.id, dyl);\n setElementPosition(solarPanel.id, newCx, newCy);\n }\n }\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n {\n let sign = useStore.getState().resizeHandleType === ResizeHandleType.Left ? -1 : 1;\n const theta =\n rp.angle() - angle + (useStore.getState().resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\n let dxl = distance * Math.cos(theta);\n if (solarPanel.orientation === Orientation.portrait) {\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\n dxl = nx * pvModel.width;\n } else {\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\n dxl = nx * pvModel.length;\n }\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\n const wc = new Vector2(wcx, wcy);\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y);\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\n const newCx = rc.x / lx;\n const newCy = rc.y / ly;\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, dxl, solarPanel.ly)) {\n updateElementLxById(solarPanel.id, dxl);\n setElementPosition(solarPanel.id, newCx, newCy);\n }\n }\n break;\n }\n }\n }\n }\n };\n\n const isSolarPanelNewPositionOk = (sp: SolarPanelModel, cx: number, cy: number) => {\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.cx = cx;\n clone.cy = cy;\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n // only check solar panels on top face\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\n return false;\n }\n }\n return true;\n };\n\n const isSolarPanelNewAzimuthOk = (sp: SolarPanelModel, az: number) => {\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.relativeAzimuth = az;\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\n return false;\n }\n return true;\n };\n\n const isSolarPanelNewSizeOk = (sp: SolarPanelModel, cx: number, cy: number, lx: number, ly: number) => {\n // check if the new length will cause the solar panel to intersect with the foundation\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\n return false;\n }\n // check if the new size will be within the foundation\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.cx = cx;\n clone.cy = cy;\n clone.lx = lx;\n clone.ly = ly;\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n // showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\n return false;\n }\n return true;\n };\n\n const handlePointerUp = () => {\n if (!grabRef.current) return;\n const elem = getElementById(grabRef.current.id);\n if (!elem || elem.parentId !== id) return;\n if (elem.type === ObjectType.Polygon) {\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\n const undoableEditPolygon = {\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\n timestamp: Date.now(),\n oldValue: oldVerticesRef.current,\n newValue: newVerticesRef.current,\n changedElementId: elem.id,\n changedElementType: elem.type,\n undo: () => {\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\n },\n redo: () => {\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\n },\n } as UndoableChange;\n addUndoable(undoableEditPolygon);\n }\n } else {\n if (useStore.getState().resizeHandleType) {\n newPositionRef.current.x = elem.cx;\n newPositionRef.current.y = elem.cy;\n newPositionRef.current.z = elem.cz;\n newDimensionRef.current.x = elem.lx;\n newDimensionRef.current.y = elem.ly;\n newDimensionRef.current.z = elem.lz;\n if (\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\n ) {\n const undoableResize = {\n name: 'Resize',\n timestamp: Date.now(),\n resizedElementId: grabRef.current.id,\n resizedElementType: grabRef.current.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 oldLx: oldDimensionRef.current.x,\n oldLy: oldDimensionRef.current.y,\n oldLz: oldDimensionRef.current.z,\n newLx: newDimensionRef.current.x,\n newLy: newDimensionRef.current.y,\n newLz: newDimensionRef.current.z,\n undo: () => {\n setElementPosition(\n undoableResize.resizedElementId,\n undoableResize.oldCx,\n undoableResize.oldCy,\n undoableResize.oldCz,\n );\n setElementSize(\n undoableResize.resizedElementId,\n undoableResize.oldLx,\n undoableResize.oldLy,\n undoableResize.oldLz,\n );\n },\n redo: () => {\n setElementPosition(\n undoableResize.resizedElementId,\n undoableResize.newCx,\n undoableResize.newCy,\n undoableResize.newCz,\n );\n setElementSize(\n undoableResize.resizedElementId,\n undoableResize.newLx,\n undoableResize.newLy,\n undoableResize.newLz,\n );\n },\n } as UndoableResize;\n addUndoable(undoableResize);\n }\n } else if (useStore.getState().rotateHandleType) {\n // currently, solar panels are the only type of child that can be rotated\n if (grabRef.current.type === ObjectType.SolarPanel) {\n const solarPanel = grabRef.current as SolarPanelModel;\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\n if (isSolarPanelNewAzimuthOk(solarPanel, newAzimuthRef.current)) {\n setCommonStore((state) => {\n state.selectedElementAngle = newAzimuthRef.current;\n });\n const undoableRotate = {\n name: 'Rotate',\n timestamp: Date.now(),\n oldValue: oldAzimuthRef.current,\n newValue: newAzimuthRef.current,\n changedElementId: solarPanel.id,\n changedElementType: solarPanel.type,\n undo: () => {\n updateSolarPanelRelativeAzimuthById(\n undoableRotate.changedElementId,\n undoableRotate.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelRelativeAzimuthById(\n undoableRotate.changedElementId,\n undoableRotate.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableRotate);\n } else {\n updateSolarPanelRelativeAzimuthById(solarPanel.id, oldAzimuthRef.current);\n }\n }\n }\n } else {\n // for moving sensors, lights, and solar panels\n newPositionRef.current.x = elem.cx;\n newPositionRef.current.y = elem.cy;\n newPositionRef.current.z = elem.cz;\n newNormalRef.current.fromArray(elem.normal);\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\n let accept = true;\n if (elem.type === ObjectType.SolarPanel) {\n accept = isSolarPanelNewPositionOk(elem as SolarPanelModel, elem.cx, elem.cy);\n }\n if (accept) {\n const undoableMove = {\n name: 'Move',\n timestamp: Date.now(),\n movedElementId: grabRef.current.id,\n movedElementType: grabRef.current?.type,\n oldCx: oldPositionRef.current.x,\n oldCy: oldPositionRef.current.y,\n oldCz: oldPositionRef.current.z,\n oldNormal: oldNormalRef.current.clone(),\n newCx: newPositionRef.current.x,\n newCy: newPositionRef.current.y,\n newCz: newPositionRef.current.z,\n newNormal: newNormalRef.current.clone(),\n undo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.oldCx,\n undoableMove.oldCy,\n undoableMove.oldCz,\n );\n if (undoableMove.oldNormal) {\n setElementNormal(\n undoableMove.movedElementId,\n undoableMove.oldNormal.x,\n undoableMove.oldNormal.y,\n undoableMove.oldNormal.z,\n );\n }\n },\n redo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.newCx,\n undoableMove.newCy,\n undoableMove.newCz,\n );\n if (undoableMove.newNormal) {\n setElementNormal(\n undoableMove.movedElementId,\n undoableMove.newNormal.x,\n undoableMove.newNormal.y,\n undoableMove.newNormal.z,\n );\n }\n },\n } as UndoableMove;\n addUndoable(undoableMove);\n } else {\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n }\n }\n }\n }\n grabRef.current = null;\n };\n\n const handlePointerOver = (e: ThreeEvent) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n }\n }\n };\n\n const handlePointerEnter = (e: ThreeEvent) => {\n // TODO: make tree, flower, and human legal\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setShowGrid(true);\n }\n }\n };\n\n const handlePointerOut = () => {\n setHovered(false);\n if (grabRef.current) {\n switch (grabRef.current.type) {\n case ObjectType.Human:\n case ObjectType.Tree:\n case ObjectType.Flower:\n setShowGrid(false);\n break;\n case ObjectType.SolarPanel:\n // Have to get the latest from the store (we may change this to ref in the future)\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarPanelModel;\n if (useStore.getState().moveHandleType && !isSolarPanelNewPositionOk(sp, sp.cx, sp.cy)) {\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n }\n break;\n }\n }\n };\n\n const handleContextMenu = (e: ThreeEvent) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n state.pastePoint.copy(e.intersections[0].point);\n const face = e.intersections[0].face;\n if (face) {\n state.pasteNormal = face.normal.clone();\n if (Util.isSame(face.normal, UNIT_VECTOR_POS_X)) {\n state.selectedSideIndex = 0;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_X)) {\n state.selectedSideIndex = 1;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Y)) {\n state.selectedSideIndex = 2;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_Y)) {\n state.selectedSideIndex = 3;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Z)) {\n state.selectedSideIndex = 4;\n }\n }\n state.clickObjectType = ObjectType.Cuboid;\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Cuboid;\n }\n }\n });\n };\n\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\n\n const faces: number[] = [0, 1, 2, 3, 4, 5];\n const textures = [\n showSolarRadiationHeatmap && heatmapTextureEast ? heatmapTextureEast : textureEast,\n showSolarRadiationHeatmap && heatmapTextureWest ? heatmapTextureWest : textureWest,\n showSolarRadiationHeatmap && heatmapTextureNorth ? heatmapTextureNorth : textureNorth,\n showSolarRadiationHeatmap && heatmapTextureSouth ? heatmapTextureSouth : textureSouth,\n showSolarRadiationHeatmap && heatmapTextureTop ? heatmapTextureTop : textureTop,\n null,\n ];\n const materials =\n cuboidModel && cuboidModel.faceColors ? (\n faces.map((i) => {\n if (textureTypes && textureTypes[i] !== CuboidTexture.NoTexture) {\n return showSolarRadiationHeatmap ? (\n \n ) : (\n \n );\n } else {\n return showSolarRadiationHeatmap ? (\n \n ) : (\n \n );\n }\n })\n ) : (\n \n );\n\n const handleArgs = useMemo(() => [hx, hy, hz], [hx, hy, hz]);\n\n const showHandles = selected && !locked && !groupMasterId;\n\n return (\n \n {/* draw rectangular cuboid */}\n \n {materials}\n \n\n {/* intersection plane that goes through the center of the selected solar panel */}\n {grabRef.current?.type === ObjectType.SolarPanel && onTopSurface && !grabRef.current.locked && (\n \n )}\n\n {showGrid && (\n <>\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType) && (\n \n )}\n {useStore.getState().rotateHandleType &&\n grabRef.current &&\n grabRef.current.type === ObjectType.SolarPanel && (\n \n )}\n \n )}\n\n {/* ruler */}\n {selected && }\n\n {/* wireFrame */}\n {(!selected || groundImage) && (\n \n )}\n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* handles */}\n {showHandles && }\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Cuboid);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Sphere } from '@react-three/drei';\nimport { Euler, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { SensorModel } from '../models/SensorModel';\nimport { useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\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} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport Wireframe from '../components/wireframe';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\nimport { useSelected } from './hooks';\n\nconst Sensor = (sensorModel: SensorModel) => {\n let {\n id,\n cx,\n cy,\n cz,\n lx = 1,\n ly = 1,\n lz = 0.1,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n parentId,\n foundationId,\n light = true,\n heatFlux = false,\n } = sensorModel;\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const selectMe = useStore(Selector.selectMe);\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n const [hovered, setHovered] = useState(false);\n const baseRef = useRef();\n const handleRef = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n const foundation = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === foundationId) {\n return e;\n }\n }\n });\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = parent.cz + parent.lz / 2;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Wall:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n break;\n case ObjectType.Roof:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n break;\n }\n }\n }\n const hz = lz / 2;\n\n const euler = useMemo(() => {\n if (parent?.type === ObjectType.Wall) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\n }\n if (parent?.type === ObjectType.Roof) {\n return new Euler(\n rotation[0],\n rotation[1],\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\n 'ZXY',\n );\n }\n if (parent?.type === ObjectType.Cuboid) {\n return getRotationFromNormal(normal);\n }\n // the normal below seems to be relative to its parent\n const n = new Vector3().fromArray(normal);\n // east face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2]);\n }, [normal, rotation, foundation?.rotation]);\n\n const labelText = useMemo(() => {\n return (\n (sensorModel?.label ? sensorModel.label : i18n.t('shared.SensorElement', lang)) +\n (sensorModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang)\n );\n }, [sensorModel?.label, locked, language, cx, cy, cz]);\n\n return (\n \n {/* draw rectangle (too small to cast shadow) */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = MoveHandleType.Default;\n });\n }}\n onContextMenu={(e) => {\n selectMe(id, e);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Sensor;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={() => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n \n\n {/* wireFrame */}\n {!selected && }\n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* draw handle */}\n {selected && !locked && (\n {\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = MoveHandleType.Default;\n });\n }}\n >\n \n \n )}\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Sensor);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Cylinder, Sphere } from '@react-three/drei';\nimport { Euler, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n TWO_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} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport Wireframe from '../components/wireframe';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { LightModel } from '../models/LightModel';\nimport { RoofModel } from '../models/RoofModel';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\nimport { useSelected } from './hooks';\n\nconst Light = (lightModel: LightModel) => {\n let {\n id,\n cx,\n cy,\n cz,\n lx = 1,\n ly = 1,\n lz = 0.1,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = '#ffff99',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n parentId,\n foundationId,\n decay = 2,\n distance = 5,\n intensity = 3,\n inside = false,\n } = lightModel;\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const selectMe = useStore(Selector.selectMe);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const night = sunlightDirection.z <= 0;\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n const [hovered, setHovered] = useState(false);\n const baseRef = useRef();\n const handleRef = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n const foundation = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === foundationId) {\n return e;\n }\n }\n });\n\n let parentThickness = 0.1;\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = parent.cz + parent.lz / 2;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Wall:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n parentThickness = (parent as WallModel).ly;\n break;\n case ObjectType.Roof:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n parentThickness = (parent as RoofModel).thickness;\n break;\n }\n }\n }\n const hz = lz / 2;\n\n const euler = useMemo(() => {\n if (parent?.type === ObjectType.Wall) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\n }\n if (parent?.type === ObjectType.Roof) {\n return new Euler(\n rotation[0],\n rotation[1],\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\n 'ZXY',\n );\n }\n if (parent?.type === ObjectType.Cuboid) {\n return getRotationFromNormal(normal);\n }\n // the normal below seems to be relative to its parent\n const n = new Vector3().fromArray(normal);\n // east face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2]);\n }, [normal, rotation, foundation?.rotation]);\n\n const labelText = useMemo(() => {\n return (\n (lightModel?.label ? lightModel.label : i18n.t('shared.LightElement', lang)) +\n (lightModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang)\n );\n }, [lightModel?.label, locked, language, cx, cy, cz]);\n\n return (\n \n {night && (\n \n )}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n }}\n onContextMenu={(e) => {\n selectMe(id, e);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Light;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={() => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n {night ? (\n \n ) : (\n \n )}\n \n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* draw handle */}\n {selected && !locked && (\n {\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n }}\n >\n \n \n )}\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Light);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport GroupMaster from 'src/components/groupMaster';\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 { useGroupMaster } from '../hooks';\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 { id, parentId, cx, cy, lz, rotation, locked } = cuboidModel;\r\n\r\n const groupMasterId = useStore(Selector.groupMasterId);\r\n\r\n const { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation } =\r\n useGroupMaster(cuboidModel, groupMasterId);\r\n\r\n const hz = lz / 2;\r\n const showGroupMaster = !!(\r\n parentId === GROUND_ID &&\r\n !locked &&\r\n groupMasterId === id &&\r\n cuboidModel &&\r\n groupMasterDimension\r\n );\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 {showGroupMaster && (\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 ifNeedListenToAutoDeletion = (el: ElementModel) => {\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","/*\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","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport short from 'short-uuid';\r\nimport { HumanModel } from './HumanModel';\r\nimport { CuboidTexture, ObjectType } from '../types';\r\nimport { TreeModel } from './TreeModel';\r\nimport { SensorModel } from './SensorModel';\r\nimport { FoundationModel } from './FoundationModel';\r\nimport { CuboidModel } from './CuboidModel';\r\nimport { ElementModel } from './ElementModel';\r\nimport { SolarPanelModel } from './SolarPanelModel';\r\nimport { WallModel } from './WallModel';\r\nimport { WindowModel } from './WindowModel';\r\nimport { GableRoofModel, GambrelRoofModel, HipRoofModel, MansardRoofModel, RoofModel, RoofType } from './RoofModel';\r\nimport { PolygonModel } from './PolygonModel';\r\nimport { Util } from '../Util';\r\nimport { Vector3 } from 'three';\r\nimport {\r\n DEFAULT_CEILING_R_VALUE,\r\n DEFAULT_GROUND_FLOOR_R_VALUE,\r\n GROUND_ID,\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 ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\r\nimport { ParabolicDishModel } from './ParabolicDishModel';\r\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\r\nimport { HeliostatModel } from './HeliostatModel';\r\nimport { DoorModel } from './DoorModel';\r\nimport { WindTurbineModel } from './WindTurbineModel';\r\nimport { FlowerModel } from './FlowerModel';\r\nimport { LightModel } from './LightModel';\r\n\r\nexport class ElementModelCloner {\r\n static clone(\r\n parent: ElementModel | null,\r\n e: ElementModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n noMove?: boolean,\r\n normal?: Vector3,\r\n oldParent?: ElementModel | null,\r\n ) {\r\n let clone = null;\r\n switch (e.type) {\r\n case ObjectType.Polygon:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.clonePolygon(parent, e as PolygonModel, x, y, z, noMove, normal);\r\n }\r\n break;\r\n case ObjectType.Sensor:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneSensor(parent, e as SensorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Light:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneLight(parent, e as LightModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneSolarPanel(parent, e as SolarPanelModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneParabolicTrough(parent, e as ParabolicTroughModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneParabolicDish(parent, e as ParabolicDishModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.FresnelReflector:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneFresnelReflector(parent, e as FresnelReflectorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Heliostat:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneHeliostat(parent, e as HeliostatModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.WindTurbine:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneWindTurbine(parent, e as WindTurbineModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (parent) {\r\n clone = ElementModelCloner.cloneWall(parent, e as WallModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Window:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneWindow(parent, e as WindowModel, x, y, z, oldParent);\r\n }\r\n break;\r\n case ObjectType.Door:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneDoor(parent, e as DoorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Roof:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneRoof(parent, e as RoofModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Human:\r\n clone = ElementModelCloner.cloneHuman(e as HumanModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Tree:\r\n clone = ElementModelCloner.cloneTree(e as TreeModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Flower:\r\n clone = ElementModelCloner.cloneFlower(e as FlowerModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Foundation:\r\n clone = ElementModelCloner.cloneFoundation(e as FoundationModel, x, y);\r\n break;\r\n case ObjectType.Cuboid:\r\n const parentId = parent ? parent.id : GROUND_ID;\r\n clone = ElementModelCloner.cloneCuboid(parentId, e as CuboidModel, x, y);\r\n break;\r\n }\r\n return clone;\r\n }\r\n\r\n private static cloneHuman(human: HumanModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Human,\r\n name: human.name,\r\n flip: human.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: human.lx,\r\n ly: human.ly,\r\n lz: human.lz,\r\n normal: [...human.normal],\r\n rotation: [...human.rotation],\r\n parentId: parent?.id ?? human.parentId,\r\n id: short.generate() as string,\r\n } as HumanModel;\r\n }\r\n\r\n private static cloneTree(tree: TreeModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Tree,\r\n name: tree.name,\r\n flip: tree.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: tree.lx,\r\n ly: tree.ly,\r\n lz: tree.lz,\r\n normal: [...tree.normal],\r\n rotation: [...tree.rotation],\r\n parentId: parent?.id ?? tree.parentId,\r\n id: short.generate() as string,\r\n } as TreeModel;\r\n }\r\n\r\n private static cloneFlower(flower: FlowerModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Flower,\r\n name: flower.name,\r\n flip: flower.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: flower.lx,\r\n ly: flower.ly,\r\n lz: flower.lz,\r\n normal: [...flower.normal],\r\n rotation: [...flower.rotation],\r\n parentId: parent?.id ?? flower.parentId,\r\n id: short.generate() as string,\r\n } as FlowerModel;\r\n }\r\n\r\n private static clonePolygon(\r\n parent: ElementModel,\r\n polygon: PolygonModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n noMove?: boolean,\r\n normal?: Vector3,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const vertices = polygon.vertices.map((v) => ({ ...v })); // deep copy;\r\n const pm = {\r\n type: ObjectType.Polygon,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: polygon.lx,\r\n ly: polygon.ly,\r\n lz: polygon.lz,\r\n filled: polygon.filled,\r\n noOutline: polygon.noOutline,\r\n color: polygon.color,\r\n lineColor: polygon.lineColor,\r\n lineWidth: polygon.lineWidth,\r\n opacity: polygon.opacity,\r\n textureType: polygon.textureType,\r\n text: polygon.text,\r\n fontSize: polygon.fontSize,\r\n fontColor: polygon.fontColor,\r\n normal: [...polygon.normal],\r\n rotation: polygon.parentId ? [...parent.rotation] : [0, 0, 0],\r\n vertices: vertices,\r\n parentId: parent.id,\r\n parentType: parent.type,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as PolygonModel;\r\n if (!noMove) {\r\n let x1 = x;\r\n let y1 = y;\r\n if (parent.type === ObjectType.Cuboid && normal) {\r\n if (Util.isSame(normal, UNIT_VECTOR_NEG_X)) {\r\n x1 = z ?? 0;\r\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_X)) {\r\n x1 = -(z ?? 0);\r\n } else if (Util.isSame(normal, UNIT_VECTOR_NEG_Y)) {\r\n y1 = z ?? 0;\r\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_Y)) {\r\n y1 = -(z ?? 0);\r\n }\r\n const dot = normal.dot(new Vector3().fromArray(polygon.normal));\r\n if (Math.abs(dot) < ZERO_TOLERANCE) {\r\n for (const v of pm.vertices) {\r\n [v.x, v.y] = [v.y, v.x];\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Wall) {\r\n x1 = -x;\r\n y1 = -(z ?? 0);\r\n }\r\n Util.translatePolygonCenterTo(pm, x1, y1);\r\n }\r\n return pm;\r\n }\r\n\r\n private static cloneSensor(parent: ElementModel, sensor: SensorModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Sensor,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: sensor.lx,\r\n ly: sensor.ly,\r\n lz: sensor.lz,\r\n showLabel: sensor.showLabel,\r\n normal: [...sensor.normal],\r\n rotation: sensor.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SensorModel;\r\n }\r\n\r\n private static cloneLight(parent: ElementModel, light: LightModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Light,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: light.lx,\r\n ly: light.ly,\r\n lz: light.lz,\r\n intensity: light.intensity,\r\n distance: light.distance,\r\n decay: light.decay,\r\n color: light.color,\r\n showLabel: light.showLabel,\r\n normal: [...light.normal],\r\n rotation: light.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as LightModel;\r\n }\r\n\r\n private static cloneSolarPanel(parent: ElementModel, solarPanel: SolarPanelModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n let parentType;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n parentType = parent.type;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n parentType = ObjectType.Wall;\r\n break;\r\n case ObjectType.Roof:\r\n parentType = ObjectType.Roof;\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n let rotation;\r\n if (solarPanel.parentType === ObjectType.Roof) {\r\n rotation = [...solarPanel.rotation];\r\n } else {\r\n rotation = solarPanel.parentId ? [...parent.rotation] : [0, 0, 0];\r\n }\r\n return {\r\n type: ObjectType.SolarPanel,\r\n pvModelName: solarPanel.pvModelName,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: solarPanel.lx,\r\n ly: solarPanel.ly,\r\n lz: solarPanel.lz,\r\n trackerType: solarPanel.trackerType,\r\n tiltAngle: solarPanel.tiltAngle,\r\n relativeAzimuth: solarPanel.relativeAzimuth,\r\n orientation: solarPanel.orientation,\r\n poleRadius: solarPanel.poleRadius,\r\n poleHeight: solarPanel.poleHeight,\r\n poleSpacing: solarPanel.poleSpacing,\r\n showLabel: solarPanel.showLabel,\r\n normal: [...solarPanel.normal],\r\n rotation: rotation,\r\n parentType: parentType,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SolarPanelModel;\r\n }\r\n\r\n private static cloneParabolicTrough(\r\n parent: ElementModel,\r\n trough: ParabolicTroughModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicTrough,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: trough.lx,\r\n ly: trough.ly,\r\n lz: trough.lz,\r\n reflectance: trough.reflectance,\r\n absorptance: trough.absorptance,\r\n opticalEfficiency: trough.opticalEfficiency,\r\n thermalEfficiency: trough.thermalEfficiency,\r\n absorberTubeRadius: trough.absorberTubeRadius,\r\n moduleLength: trough.moduleLength,\r\n latusRectum: trough.latusRectum,\r\n tiltAngle: trough.tiltAngle,\r\n relativeAzimuth: trough.relativeAzimuth,\r\n poleRadius: trough.poleRadius,\r\n poleHeight: trough.poleHeight,\r\n showLabel: trough.showLabel,\r\n normal: [...trough.normal],\r\n rotation: trough.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicTroughModel;\r\n }\r\n\r\n private static cloneParabolicDish(parent: ElementModel, dish: ParabolicDishModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicDish,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: dish.lx,\r\n ly: dish.ly,\r\n lz: dish.lz,\r\n reflectance: dish.reflectance,\r\n absorptance: dish.absorptance,\r\n opticalEfficiency: dish.opticalEfficiency,\r\n thermalEfficiency: dish.thermalEfficiency,\r\n receiverRadius: dish.receiverRadius,\r\n structureType: dish.structureType,\r\n latusRectum: dish.latusRectum,\r\n tiltAngle: dish.tiltAngle,\r\n relativeAzimuth: dish.relativeAzimuth,\r\n poleRadius: dish.poleRadius,\r\n poleHeight: dish.poleHeight,\r\n showLabel: dish.showLabel,\r\n normal: [...dish.normal],\r\n rotation: dish.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicDishModel;\r\n }\r\n\r\n private static cloneFresnelReflector(\r\n parent: ElementModel,\r\n reflector: FresnelReflectorModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.FresnelReflector,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: reflector.lx,\r\n ly: reflector.ly,\r\n lz: reflector.lz,\r\n reflectance: reflector.reflectance,\r\n moduleLength: reflector.moduleLength,\r\n tiltAngle: reflector.tiltAngle,\r\n relativeAzimuth: reflector.relativeAzimuth,\r\n poleRadius: reflector.poleRadius,\r\n poleHeight: reflector.poleHeight,\r\n showLabel: reflector.showLabel,\r\n normal: [...reflector.normal],\r\n rotation: reflector.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n receiverId: reflector.receiverId,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as FresnelReflectorModel;\r\n }\r\n\r\n private static cloneHeliostat(parent: ElementModel, heliostat: HeliostatModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Heliostat,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: heliostat.lx,\r\n ly: heliostat.ly,\r\n lz: heliostat.lz,\r\n reflectance: heliostat.reflectance,\r\n tiltAngle: heliostat.tiltAngle,\r\n relativeAzimuth: heliostat.relativeAzimuth,\r\n poleRadius: heliostat.poleRadius,\r\n poleHeight: heliostat.poleHeight,\r\n showLabel: heliostat.showLabel,\r\n normal: [...heliostat.normal],\r\n rotation: heliostat.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n towerId: heliostat.towerId,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as HeliostatModel;\r\n }\r\n\r\n private static cloneWindTurbine(\r\n parent: ElementModel,\r\n windTurbine: WindTurbineModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.WindTurbine,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: windTurbine.lx,\r\n ly: windTurbine.ly,\r\n lz: windTurbine.lz,\r\n bladeRadius: windTurbine.bladeRadius,\r\n towerRadius: windTurbine.towerRadius,\r\n towerHeight: windTurbine.towerHeight,\r\n showLabel: windTurbine.showLabel,\r\n normal: [...windTurbine.normal],\r\n rotation: windTurbine.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as WindTurbineModel;\r\n }\r\n\r\n private static cloneFoundation(foundation: FoundationModel, x: number, y: number) {\r\n return {\r\n type: ObjectType.Foundation,\r\n cx: x,\r\n cy: y,\r\n cz: foundation.cz,\r\n lx: foundation.lx,\r\n ly: foundation.ly,\r\n lz: foundation.lz,\r\n normal: [...foundation.normal],\r\n rotation: [...foundation.rotation],\r\n parentId: foundation.parentId,\r\n color: foundation.color,\r\n textureType: foundation.textureType,\r\n solarStructure: foundation.solarStructure,\r\n solarUpdraftTower: { ...foundation.solarUpdraftTower },\r\n solarAbsorberPipe: { ...foundation.solarAbsorberPipe },\r\n solarPowerTower: { ...foundation.solarPowerTower },\r\n hvacSystem: { ...foundation.hvacSystem },\r\n labelHeight: foundation.labelHeight,\r\n labelSize: foundation.labelSize,\r\n showLabel: foundation.showLabel,\r\n rValue: foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE,\r\n id: short.generate() as string,\r\n } as FoundationModel;\r\n }\r\n\r\n private static cloneCuboid(parentId: string, cuboid: CuboidModel, x: number, y: number) {\r\n return {\r\n type: ObjectType.Cuboid,\r\n cx: x,\r\n cy: y,\r\n cz: cuboid.cz,\r\n lx: cuboid.lx,\r\n ly: cuboid.ly,\r\n lz: cuboid.lz,\r\n color: cuboid.color,\r\n faceColors: cuboid.faceColors ? [...cuboid.faceColors] : ['gray', 'gray', 'gray', 'gray', 'gray', 'gray'],\r\n textureTypes: cuboid.textureTypes\r\n ? [...cuboid.textureTypes]\r\n : [\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 normal: [...cuboid.normal],\r\n rotation: [...cuboid.rotation],\r\n stackable: cuboid.stackable,\r\n enableGroupMaster: cuboid.enableGroupMaster,\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as CuboidModel;\r\n }\r\n\r\n private static cloneWall(parent: ElementModel, wall: WallModel, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Wall,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: wall.lx,\r\n ly: wall.ly,\r\n lz: wall.lz,\r\n parapet: { ...wall.parapet },\r\n eavesLength: wall.eavesLength ?? 0,\r\n rValue: wall.rValue,\r\n volumetricHeatCapacity: wall.volumetricHeatCapacity,\r\n fill: wall.fill,\r\n leftUnfilledHeight: wall.leftUnfilledHeight,\r\n rightUnfilledHeight: wall.rightUnfilledHeight,\r\n leftTopPartialHeight: wall.leftTopPartialHeight,\r\n rightTopPartialHeight: wall.rightTopPartialHeight,\r\n leftJoints: [],\r\n rightJoints: [],\r\n leftPoint: [...wall.leftPoint],\r\n rightPoint: [...wall.rightPoint],\r\n relativeAngle: wall.relativeAngle,\r\n textureType: wall.textureType,\r\n color: wall.color,\r\n normal: [...wall.normal],\r\n rotation: [...wall.rotation],\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n wallStructure: wall.wallStructure,\r\n structureSpacing: wall.structureSpacing,\r\n structureColor: wall.structureColor,\r\n structureWidth: wall.structureWidth,\r\n opacity: wall.opacity,\r\n roofId: wall.roofId,\r\n leftRoofHeight: wall.leftRoofHeight,\r\n rightRoofHeight: wall.rightRoofHeight,\r\n centerRoofHeight: wall.centerRoofHeight,\r\n centerLeftRoofHeight: wall.centerLeftRoofHeight,\r\n centerRightRoofHeight: wall.centerRightRoofHeight,\r\n } as WallModel;\r\n }\r\n\r\n private static cloneWindow(\r\n parent: ElementModel,\r\n window: WindowModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n oldParent?: ElementModel | null,\r\n ) {\r\n let foundationId;\r\n let [lx, ly, lz] = [window.lx, parent.ly, window.lz];\r\n let cy = 0.1;\r\n let rotation = [...window.rotation];\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n rotation = [0, -1, 0];\r\n break;\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n cy = y;\r\n ly = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n\r\n // copy to wall\r\n if (parent.type === ObjectType.Wall) {\r\n lx = window.lx / parent.lx;\r\n lz = window.lz / parent.lz;\r\n }\r\n return {\r\n type: ObjectType.Window,\r\n cx: x,\r\n cy: cy,\r\n cz: z,\r\n lx: lx,\r\n ly: ly,\r\n lz: lz,\r\n uValue: window.uValue,\r\n mullion: window.mullion,\r\n mullionWidth: window.mullionWidth,\r\n mullionSpacing: window.mullionSpacing,\r\n mullionColor: window.mullionColor,\r\n frame: window.frame,\r\n frameWidth: window.frameWidth,\r\n sillWidth: window.sillWidth,\r\n windowType: window.windowType,\r\n archHeight: window.archHeight,\r\n color: window.color,\r\n normal: [0, 0, 0],\r\n rotation: rotation,\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n tint: window.tint,\r\n opacity: window.opacity,\r\n shutter: { ...window.shutter },\r\n empty: window.empty,\r\n interior: window.interior,\r\n parentType: parent.type,\r\n polygonTop: window.polygonTop,\r\n } as WindowModel;\r\n }\r\n\r\n private static cloneDoor(parent: ElementModel, door: DoorModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Door,\r\n cx: x,\r\n cy: door.cy,\r\n cz: door.cz,\r\n lx: door.lx,\r\n ly: door.ly,\r\n lz: door.lz,\r\n color: door.color,\r\n frameColor: door.frameColor,\r\n opacity: door.opacity,\r\n uValue: door.uValue,\r\n volumetricHeatCapacity: door.volumetricHeatCapacity,\r\n textureType: door.textureType,\r\n filled: door.filled,\r\n interior: door.interior,\r\n doorType: door.doorType,\r\n archHeight: door.archHeight,\r\n normal: [...door.normal],\r\n rotation: [...door.rotation],\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n } as DoorModel;\r\n }\r\n\r\n private static cloneRoof(parent: ElementModel, roof: RoofModel, x: number, y: number, z?: number) {\r\n const newRoof = {\r\n id: short.generate() as string,\r\n type: ObjectType.Roof,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: roof.lx,\r\n ly: roof.ly,\r\n lz: roof.lz,\r\n ceiling: roof.ceiling,\r\n rise: roof.rise,\r\n color: roof.color,\r\n rValue: roof.rValue,\r\n ceilingRValue: roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE,\r\n volumetricHeatCapacity: roof.volumetricHeatCapacity,\r\n sideColor: roof.sideColor,\r\n normal: [...roof.normal],\r\n rotation: [...roof.rotation],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n roofType: roof.roofType,\r\n roofStructure: roof.roofStructure,\r\n rafterColor: roof.rafterColor,\r\n rafterSpacing: roof.rafterSpacing,\r\n rafterWidth: roof.rafterWidth,\r\n textureType: roof.textureType,\r\n thickness: roof.thickness,\r\n wallsId: [...roof.wallsId], // handled in common store\r\n opacity: roof.opacity,\r\n glassTint: roof.glassTint,\r\n } as RoofModel;\r\n switch (roof.roofType) {\r\n case RoofType.Gable:\r\n (newRoof as GableRoofModel).ridgeLeftPoint = [...(roof as GableRoofModel).ridgeLeftPoint];\r\n (newRoof as GableRoofModel).ridgeRightPoint = [...(roof as GableRoofModel).ridgeRightPoint];\r\n break;\r\n case RoofType.Gambrel:\r\n const newGambrelRoof = newRoof as GambrelRoofModel;\r\n const oldGambrelRoof = roof as GambrelRoofModel;\r\n newGambrelRoof.topRidgePoint = [...oldGambrelRoof.topRidgePoint];\r\n newGambrelRoof.frontRidgePoint = [...oldGambrelRoof.frontRidgePoint];\r\n newGambrelRoof.backRidgePoint = [...oldGambrelRoof.backRidgePoint];\r\n break;\r\n case RoofType.Hip:\r\n (newRoof as HipRoofModel).rightRidgeLength = (roof as HipRoofModel).rightRidgeLength;\r\n (newRoof as HipRoofModel).leftRidgeLength = (roof as HipRoofModel).leftRidgeLength;\r\n break;\r\n case RoofType.Mansard:\r\n (newRoof as MansardRoofModel).ridgeWidth = (roof as MansardRoofModel).ridgeWidth;\r\n break;\r\n }\r\n return newRoof as ElementModel;\r\n }\r\n}\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ViewState } from './ViewState';\nimport { immerable } from 'immer';\nimport { Rectangle } from '../models/Rectangle';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n DEFAULT_SOLAR_PANEL_SHININESS,\n DEFAULT_WINDOW_SHININESS,\n} from '../constants';\n\nexport class DefaultViewState implements ViewState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n navigationView: boolean;\n orthographic: boolean;\n enableRotate: boolean;\n directLightIntensity: number;\n ambientLightIntensity: number;\n cameraPosition: number[];\n cameraPosition2D: number[];\n panCenter: number[];\n panCenter2D: number[];\n cameraZoom: number;\n\n axes: boolean;\n heatFluxScaleFactor: number;\n heatFluxColor: string;\n heatFluxWidth: number;\n solarRadiationHeatMapMaxValue: number;\n solarRadiationHeatMapReflectionOnly: boolean; // for heliostats and Fresnel reflectors\n shadowEnabled: boolean;\n theme: string;\n heliodon: boolean;\n showSunAngles: boolean;\n showAzimuthAngle: boolean;\n showElevationAngle: boolean;\n showZenithAngle: boolean;\n groundImage: boolean;\n groundImageType: string;\n groundColor: string;\n waterSurface: boolean;\n solarPanelShininess: number;\n windowShininess: number;\n\n showMapPanel: boolean;\n showHeliodonPanel: boolean;\n showWeatherPanel: boolean;\n showDiurnalTemperaturePanel: boolean;\n showStickyNotePanel: boolean;\n showSiteInfoPanel: boolean;\n showDesignInfoPanel: boolean;\n showInstructionPanel: boolean;\n showDailyLightSensorPanel: boolean;\n showYearlyLightSensorPanel: boolean;\n showDailyPvYieldPanel: boolean;\n showYearlyPvYieldPanel: boolean;\n showSolarPanelVisibilityResultsPanel: boolean;\n showDailyParabolicTroughYieldPanel: boolean;\n showYearlyParabolicTroughYieldPanel: boolean;\n showDailyParabolicDishYieldPanel: boolean;\n showYearlyParabolicDishYieldPanel: boolean;\n showDailyFresnelReflectorYieldPanel: boolean;\n showYearlyFresnelReflectorYieldPanel: boolean;\n showDailyHeliostatYieldPanel: boolean;\n showYearlyHeliostatYieldPanel: boolean;\n showDailyUpdraftTowerYieldPanel: boolean;\n showYearlyUpdraftTowerYieldPanel: boolean;\n showDailyBuildingEnergyPanel: boolean;\n showYearlyBuildingEnergyPanel: boolean;\n showEvolutionPanel: boolean;\n autoRotate: boolean;\n\n heliodonPanelX: number;\n heliodonPanelY: number;\n mapPanelX: number;\n mapPanelY: number;\n weatherPanelRect: Rectangle;\n diurnalTemperaturePanelRect: Rectangle;\n stickyNotePanelRect: Rectangle;\n dailyLightSensorPanelRect: Rectangle;\n yearlyLightSensorPanelRect: Rectangle;\n yearlyLightSensorPanelShowDaylight: boolean;\n yearlyLightSensorPanelShowClearness: boolean;\n dailyPvYieldPanelRect: Rectangle;\n yearlyPvYieldPanelRect: Rectangle;\n visibilityResultsPanelRect: Rectangle;\n dailyParabolicTroughYieldPanelRect: Rectangle;\n yearlyParabolicTroughYieldPanelRect: Rectangle;\n dailyParabolicDishYieldPanelRect: Rectangle;\n yearlyParabolicDishYieldPanelRect: Rectangle;\n dailyFresnelReflectorYieldPanelRect: Rectangle;\n yearlyFresnelReflectorYieldPanelRect: Rectangle;\n dailyHeliostatYieldPanelRect: Rectangle;\n yearlyHeliostatYieldPanelRect: Rectangle;\n dailyUpdraftTowerYieldPanelRect: Rectangle;\n yearlyUpdraftTowerYieldPanelRect: Rectangle;\n dailyBuildingEnergyPanelRect: Rectangle;\n yearlyBuildingEnergyPanelRect: Rectangle;\n evolutionPanelRect: Rectangle;\n\n mapZoom: number;\n mapType: string;\n mapTilt: number;\n\n constructor() {\n this.navigationView = false;\n this.orthographic = false;\n this.enableRotate = true;\n this.directLightIntensity = 1;\n this.ambientLightIntensity = 0.1;\n this.cameraPosition = [5, -30, 1];\n this.cameraPosition2D = [0, 0, 150];\n this.panCenter = [0, 0, 0];\n this.panCenter2D = [0, 0, 0];\n this.cameraZoom = 20;\n\n this.axes = true;\n this.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\n this.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\n this.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\n this.solarRadiationHeatMapMaxValue = 5;\n this.solarRadiationHeatMapReflectionOnly = false;\n this.shadowEnabled = true;\n this.theme = 'Default';\n this.heliodon = false;\n this.showSunAngles = false;\n this.showAzimuthAngle = true;\n this.showElevationAngle = true;\n this.showZenithAngle = true;\n this.groundImage = false;\n this.groundImageType = 'roadmap';\n this.groundColor = '#16A5A5';\n this.waterSurface = false;\n this.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\n this.windowShininess = DEFAULT_WINDOW_SHININESS;\n\n this.showMapPanel = false;\n this.showHeliodonPanel = false;\n this.showWeatherPanel = false;\n this.showDiurnalTemperaturePanel = false;\n this.showStickyNotePanel = false;\n this.showSiteInfoPanel = true;\n this.showDesignInfoPanel = false;\n this.showInstructionPanel = true;\n this.showDailyLightSensorPanel = false;\n this.showYearlyLightSensorPanel = false;\n this.showDailyPvYieldPanel = false;\n this.showYearlyPvYieldPanel = false;\n this.showSolarPanelVisibilityResultsPanel = false;\n this.showDailyParabolicTroughYieldPanel = false;\n this.showYearlyParabolicTroughYieldPanel = false;\n this.showDailyParabolicDishYieldPanel = false;\n this.showYearlyParabolicDishYieldPanel = false;\n this.showDailyFresnelReflectorYieldPanel = false;\n this.showYearlyFresnelReflectorYieldPanel = false;\n this.showDailyHeliostatYieldPanel = false;\n this.showYearlyHeliostatYieldPanel = false;\n this.showDailyUpdraftTowerYieldPanel = false;\n this.showYearlyUpdraftTowerYieldPanel = false;\n this.showDailyBuildingEnergyPanel = false;\n this.showYearlyBuildingEnergyPanel = false;\n this.showEvolutionPanel = false;\n this.autoRotate = false;\n\n this.heliodonPanelX = 0;\n this.heliodonPanelY = 0;\n this.mapPanelX = 0;\n this.mapPanelY = 0;\n this.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n this.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n this.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n this.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n this.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n this.yearlyLightSensorPanelShowDaylight = false;\n this.yearlyLightSensorPanelShowClearness = false;\n this.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n this.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n this.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n this.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n\n this.mapZoom = 18;\n this.mapType = 'roadmap';\n this.mapTilt = 0;\n }\n\n static resetViewState(viewState: ViewState) {\n viewState.navigationView = false;\n viewState.orthographic = false;\n viewState.enableRotate = true;\n viewState.cameraPosition = [5, -30, 1];\n viewState.panCenter = [0, 0, 0];\n viewState.cameraZoom = 20;\n viewState.cameraPosition2D = [0, 0, 20];\n viewState.panCenter2D = [0, 0, 0];\n viewState.directLightIntensity = 1;\n viewState.ambientLightIntensity = 0.1;\n\n viewState.axes = true;\n viewState.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\n viewState.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\n viewState.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\n viewState.solarRadiationHeatMapMaxValue = 5;\n viewState.solarRadiationHeatMapReflectionOnly = false;\n viewState.shadowEnabled = true;\n viewState.theme = 'Default';\n viewState.heliodon = false;\n viewState.showSunAngles = false;\n viewState.showAzimuthAngle = true;\n viewState.showElevationAngle = true;\n viewState.showZenithAngle = true;\n viewState.groundImage = false;\n viewState.groundImageType = 'roadmap';\n viewState.groundColor = '#16A5A5';\n viewState.waterSurface = false;\n viewState.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\n viewState.windowShininess = DEFAULT_WINDOW_SHININESS;\n\n viewState.showMapPanel = false;\n viewState.showHeliodonPanel = false;\n viewState.showWeatherPanel = false;\n viewState.showDiurnalTemperaturePanel = false;\n viewState.showStickyNotePanel = false;\n viewState.showSiteInfoPanel = true;\n viewState.showDesignInfoPanel = true;\n viewState.showInstructionPanel = true;\n viewState.showDailyLightSensorPanel = false;\n viewState.showYearlyLightSensorPanel = false;\n viewState.showDailyPvYieldPanel = false;\n viewState.showYearlyPvYieldPanel = false;\n viewState.showSolarPanelVisibilityResultsPanel = false;\n viewState.showDailyParabolicTroughYieldPanel = false;\n viewState.showYearlyParabolicTroughYieldPanel = false;\n viewState.showDailyParabolicDishYieldPanel = false;\n viewState.showYearlyParabolicDishYieldPanel = false;\n viewState.showDailyFresnelReflectorYieldPanel = false;\n viewState.showYearlyFresnelReflectorYieldPanel = false;\n viewState.showDailyHeliostatYieldPanel = false;\n viewState.showYearlyHeliostatYieldPanel = false;\n viewState.showDailyUpdraftTowerYieldPanel = false;\n viewState.showYearlyUpdraftTowerYieldPanel = false;\n viewState.showDailyBuildingEnergyPanel = false;\n viewState.showYearlyBuildingEnergyPanel = false;\n viewState.showEvolutionPanel = false;\n viewState.autoRotate = false;\n\n viewState.heliodonPanelX = 0;\n viewState.heliodonPanelY = 0;\n viewState.mapPanelX = 0;\n viewState.mapPanelY = 0;\n viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n viewState.yearlyLightSensorPanelShowDaylight = false;\n viewState.yearlyLightSensorPanelShowClearness = false;\n viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n\n viewState.mapZoom = 18;\n viewState.mapType = 'roadmap';\n viewState.mapTilt = 0;\n }\n}\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 { defaultShutter } from '../views/window/window';\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 windowMullion: boolean;\n windowMullionWidth: number;\n windowMullionSpacing: 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.windowMullion = true;\n this.windowMullionWidth = 0.06;\n this.windowMullionSpacing = 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 = defaultShutter.showLeft;\n this.windowShutterRight = defaultShutter.showRight;\n this.windowShutterColor = defaultShutter.color;\n this.windowShutterWidth = defaultShutter.width;\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport create from 'zustand';\nimport short from 'short-uuid';\nimport dayjs from 'dayjs';\nimport Papa from 'papaparse';\nimport i18n from '../i18n/i18n';\nimport enUS from 'antd/lib/locale/en_US';\nimport weather from '../resources/weather.csv';\nimport solar_radiation_horizontal from '../resources/solar_radiation_horizontal.csv';\nimport solar_radiation_vertical from '../resources/solar_radiation_vertical.csv';\nimport pvmodules from '../resources/pvmodules.csv';\nimport produce, { enableMapSet } from 'immer';\nimport {\n ActionInfo,\n ActionType,\n DataColoring,\n DatumEntry,\n Design,\n DesignProblem,\n ElementState,\n EvolutionMethod,\n ModelSite,\n ModelType,\n MoveHandleType,\n ObjectType,\n Orientation,\n ProjectInfo,\n Range,\n ResizeHandleType,\n RoofHandleType,\n RotateHandleType,\n Scope,\n SolarStructure,\n User,\n} from '../types';\nimport { devtools, persist } from 'zustand/middleware';\nimport { WorldModel } from '../models/WorldModel';\nimport { ElementModel } from '../models/ElementModel';\nimport { WeatherModel } from '../models/WeatherModel';\nimport { Util } from '../Util';\nimport { DefaultWorldModel } from './DefaultWorldModel';\nimport { Box3, Euler, Raycaster, Vector2, Vector3 } from 'three';\nimport { ElementModelCloner } from '../models/ElementModelCloner';\nimport { DefaultViewState } from './DefaultViewState';\nimport { ViewState } from './ViewState';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { GroundModel } from '../models/GroundModel';\nimport { PvModel } from '../models/PvModel';\nimport { ThreeEvent } from '@react-three/fiber';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { WallModel } from '../models/WallModel';\nimport { Locale } from 'antd/lib/locale-provider';\nimport { Undoable } from '../undo/Undoable';\nimport { UndoManager } from '../undo/UndoManager';\nimport { HumanModel } from '../models/HumanModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport {\n DEFAULT_ADDRESS,\n DEFAULT_MODEL_MAP_ZOOM,\n FLOATING_WINDOW_OPACITY,\n GROUND_ID,\n HALF_PI,\n ORIGIN_VECTOR2,\n UNIT_VECTOR_POS_Z_ARRAY,\n} from '../constants';\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Point2 } from '../models/Point2';\nimport { useRefStore } from './commonRef';\nimport { showError } from '../helpers';\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\nimport { DefaultSolarPanelArrayLayoutParams } from './DefaultSolarPanelArrayLayoutParams';\nimport { SolarCollector } from '../models/SolarCollector';\nimport { ConcentratedSolarPowerCollector } from '../models/ConcentratedSolarPowerCollector';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { ElementCounter } from './ElementCounter';\nimport { ParabolicCollector } from '../models/ParabolicCollector';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { SolarRadiationData } from '../models/SolarRadiationData';\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\nimport { DefaultEvolutionaryAlgorithmState } from './DefaultEvolutionaryAlgorithmState';\nimport { RoofModel, RoofStructure } from 'src/models/RoofModel';\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\nimport { DefaultSolarPanelArrayLayoutConstraints } from './DefaultSolarPanelArrayLayoutConstraints';\nimport { EconomicsParams } from './EconomicsParams';\nimport { DefaultEconomicsParams } from './DefaultEconomicsParams';\nimport { RoofUtil } from 'src/views/roof/RoofUtil';\nimport { ActionState } from './ActionState';\nimport { DefaultActionState } from './DefaultActionState';\nimport { LightModel } from '../models/LightModel';\nimport { usePrimitiveStore } from './commonPrimitive';\nimport { useDataStore } from './commonData';\nimport { GraphState } from './GraphState';\nimport { DefaultGraphState } from './DefaultGraphState';\nimport { isStackableModel } from 'src/models/Stackable';\nimport { WindowModel } from 'src/models/WindowModel';\nimport { ProjectUtil } from '../panels/ProjectUtil';\n\nenableMapSet();\n\nexport interface CommonStoreState {\n set: (fn: (state: CommonStoreState) => void) => void;\n\n // only the following properties are persisted (see the whitelist at the end)\n world: WorldModel;\n elements: ElementModel[];\n viewState: ViewState;\n actionState: ActionState;\n graphState: GraphState;\n modelType: ModelType;\n modelAuthor: string | null;\n modelLabel: string | null;\n modelDescription: string | null;\n projectView: boolean;\n projectInfo: ProjectInfo;\n projectImages: Map;\n designProjectType: DesignProblem | null; // this belongs to a design of a project\n notes: string[];\n user: User;\n language: string;\n floatingWindowOpacity: number;\n selectedFloatingWindow: string | null;\n cloudFile: string | undefined;\n latestModelSite?: ModelSite;\n modelSites: Map>; // primary key: 'lat, lng', secondary key: 'title, userid'\n peopleModels: Map>; // primary key: author, secondary key: 'title, userid'\n modelsMapLatitude: number;\n modelsMapLongitude: number;\n modelsMapAddress: string;\n modelsMapZoom: number;\n modelsMapType: string;\n modelsMapTilt: number;\n\n minimumNavigationMoveSpeed: number;\n minimumNavigationTurnSpeed: number;\n\n ray: Raycaster;\n mouse: Vector2;\n\n fileChanged: boolean;\n applyCount: number;\n setApplyCount: (count: number) => void;\n revertApply: () => void;\n\n importContent: (input: any, title?: string) => void;\n exportContent: () => {};\n clearContent: () => void;\n createEmptyFile: () => void;\n undoManager: UndoManager;\n addUndoable: (undoable: Undoable) => void;\n\n weatherData: { [key: string]: WeatherModel };\n getWeather: (location: string) => WeatherModel;\n loadWeatherData: () => void;\n horizontalSolarRadiationData: { [key: string]: SolarRadiationData };\n getHorizontalSolarRadiation: (location: string) => SolarRadiationData;\n loadHorizontalSolarRadiationData: () => void;\n verticalSolarRadiationData: { [key: string]: SolarRadiationData };\n getVerticalSolarRadiation: (location: string) => SolarRadiationData;\n loadVerticalSolarRadiationData: () => void;\n getClosestCity: (lat: number, lng: number) => string | null;\n\n pvModules: { [key: string]: PvModel };\n getPvModule: (name: string) => PvModel;\n loadPvModules: () => void;\n\n aabb: Box3; // axis-aligned bounding box of elements\n animate24Hours: boolean;\n evolutionMethod: EvolutionMethod;\n clickObjectType: ObjectType | null;\n contextMenuObjectType: ObjectType | null;\n hoveredHandle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null;\n moveHandleType: MoveHandleType | null;\n resizeHandleType: ResizeHandleType | null;\n rotateHandleType: RotateHandleType | null;\n resizeAnchor: Vector3;\n selectedElement: ElementModel | null;\n getSelectedElement: () => ElementModel | null;\n findNearestSibling: (id: string) => string | null;\n overlapWithSibling: (me: ElementModel, threshold?: number) => boolean;\n selectedSideIndex: number;\n getResizeHandlePosition: (e: ElementModel, type: ResizeHandleType) => Vector3;\n getElementById: (id: string) => ElementModel | null;\n getParent: (child: ElementModel) => ElementModel | null;\n getFoundation: (elem: ElementModel) => FoundationModel | null;\n selectMe: (id: string, e: ThreeEvent, action?: ActionType, select?: boolean) => void;\n selectNone: () => void;\n setElementPosition: (id: string, x: number, y: number, z?: number) => void;\n setElementNormal: (id: string, x: number, y: number, z: number) => void;\n setElementSize: (id: string, lx: number, ly: number, lz?: number) => void;\n\n selectedElementIdSet: Set;\n multiSelectionsMode: boolean;\n\n // for all types of elements\n updateAllElementLocks: (locked: boolean) => void;\n updateElementLockByFoundationId: (foundationId: string, locked: boolean) => void;\n updateElementLockByParentId: (parentId: string, type: ObjectType, locked: boolean) => void;\n updateElementLockById: (id: string, locked: boolean) => void;\n updateElementReferenceById: (id: string, referenceId: string) => void;\n updateElementLabelById: (id: string, label: string) => void;\n updateElementShowLabelById: (id: string, showLabel: boolean) => void;\n\n updateElementColorById: (id: string, color: string) => void;\n updateElementColorOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n color: string,\n ) => void;\n updateElementColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\n updateElementColorForAll: (type: ObjectType, color: string) => void;\n\n updateElementLineColorById: (id: string, color: string) => void;\n updateElementLineColorOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n color: string,\n ) => void;\n updateElementLineColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\n updateElementLineColorForAll: (type: ObjectType, color: string) => void;\n\n updateElementLineWidthById: (id: string, width: number) => void;\n updateElementLineWidthOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n width: number,\n ) => void;\n updateElementLineWidthAboveFoundation: (type: ObjectType, foundationId: string, width: number) => void;\n updateElementLineWidthForAll: (type: ObjectType, width: number) => void;\n\n updateElementRotationById: (id: string, x: number, y: number, z: number) => void;\n updateElementRotationForAll: (type: ObjectType, x: number, y: number, z: number) => void;\n\n updateElementCxById: (id: string, cx: number) => void;\n updateElementCyById: (id: string, cy: number) => void;\n updateElementCzById: (id: string, cz: number) => void;\n updateElementCzForAll: (type: ObjectType, cz: number) => void;\n\n updateElementLxById: (id: string, lx: number) => void;\n updateElementLxOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lx: number) => void;\n updateElementLxAboveFoundation: (type: ObjectType, foundationId: string, lx: number) => void;\n updateElementLxForAll: (type: ObjectType, lx: number) => void;\n\n updateElementLyById: (id: string, ly: number) => void;\n updateElementLyOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, ly: number) => void;\n updateElementLyAboveFoundation: (type: ObjectType, foundationId: string, ly: number) => void;\n updateElementLyForAll: (type: ObjectType, ly: number) => void;\n\n updateElementLzById: (id: string, lz: number) => void;\n updateElementLzOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lz: number) => void;\n updateElementLzAboveFoundation: (type: ObjectType, foundationId: string, lz: number) => void;\n updateElementLzForAll: (type: ObjectType, lz: number) => void;\n\n // for all types of solar collectors\n updateSolarCollectorDrawSunBeamById: (id: string, draw: boolean) => void;\n updateSolarCollectorDrawSunBeamAboveFoundation: (type: ObjectType, foundationId: string, draw: boolean) => void;\n updateSolarCollectorDrawSunBeamForAll: (type: ObjectType, draw: boolean) => void;\n updateSolarCollectorRelativeAzimuthById: (id: string, relativeAzimuth: number) => void;\n updateSolarCollectorRelativeAzimuthOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n relativeAzimuth: number,\n ) => void;\n updateSolarCollectorRelativeAzimuthAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n relativeAzimuth: number,\n ) => void;\n updateSolarCollectorRelativeAzimuthForAll: (type: ObjectType, relativeAzimuth: number) => void;\n updateSolarCollectorPoleHeightById: (id: string, poleHeight: number) => void;\n updateSolarCollectorPoleHeightOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n poleHeight: number,\n ) => void;\n updateSolarCollectorPoleHeightAboveFoundation: (type: ObjectType, foundationId: string, poleHeight: number) => void;\n updateSolarCollectorPoleHeightForAll: (type: ObjectType, poleHeight: number) => void;\n\n updateSolarCollectorPoleRadiusById: (id: string, poleRadius: number) => void;\n updateSolarCollectorPoleRadiusOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n poleRadius: number,\n ) => void;\n updateSolarCollectorPoleRadiusAboveFoundation: (type: ObjectType, foundationId: string, poleRadius: number) => void;\n updateSolarCollectorPoleRadiusForAll: (type: ObjectType, poleRadius: number) => void;\n\n clearAllSolarCollectorYields: () => void;\n updateSolarCollectorDailyYieldById: (id: string, dailyYield: number) => void;\n updateSolarCollectorYearlyYieldById: (id: string, yearlyYield: number) => void;\n\n // for all types of concentrated solar power collectors\n updateCspReflectanceById: (id: string, reflectance: number) => void;\n updateCspReflectanceAboveFoundation: (type: ObjectType, foundationId: string, reflectance: number) => void;\n updateCspReflectanceForAll: (type: ObjectType, reflectance: number) => void;\n\n // for all types of parabolic solar collectors (that are standalone units)\n updateParabolicCollectorAbsorptanceById: (id: string, absorptance: number) => void;\n updateParabolicCollectorAbsorptanceAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n absorptance: number,\n ) => void;\n updateParabolicCollectorAbsorptanceForAll: (type: ObjectType, absorptance: number) => void;\n updateParabolicCollectorOpticalEfficiencyById: (id: string, opticalEfficiency: number) => void;\n updateParabolicCollectorOpticalEfficiencyAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n opticalEfficiency: number,\n ) => void;\n updateParabolicCollectorOpticalEfficiencyForAll: (type: ObjectType, opticalEfficiency: number) => void;\n updateParabolicCollectorThermalEfficiencyById: (id: string, thermalEfficiency: number) => void;\n updateParabolicCollectorThermalEfficiencyAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n thermalEfficiency: number,\n ) => void;\n updateParabolicCollectorThermalEfficiencyForAll: (type: ObjectType, thermalEfficiency: number) => void;\n\n // for foundations\n foundationActionScope: Scope;\n setFoundationActionScope: (scope: Scope) => void;\n\n // for cuboids\n cuboidActionScope: Scope;\n setCuboidActionScope: (scope: Scope) => void;\n\n // for polygons\n polygonActionScope: Scope;\n setPolygonActionScope: (scope: Scope) => void;\n updatePolygonVertexPositionById: (id: string, index: number, x: number, y: number) => void;\n updatePolygonVerticesById: (id: string, vertices: Point2[]) => void;\n\n // for solar panels\n solarPanelActionScope: Scope;\n setSolarPanelActionScope: (scope: Scope) => void;\n updateSolarPanelTiltAngleById: (id: string, tiltAngle: number) => void;\n setSolarPanelOrientation: (sp: SolarPanelModel, pvModel: PvModel, orientation: Orientation) => void;\n\n // for parabolic troughs\n parabolicTroughActionScope: Scope;\n setParabolicTroughActionScope: (scope: Scope) => void;\n\n // for Fresnel reflectors\n fresnelReflectorActionScope: Scope;\n setFresnelReflectorActionScope: (scope: Scope) => void;\n\n // for heliostats\n heliostatActionScope: Scope;\n setHeliostatActionScope: (scope: Scope) => void;\n\n // for Fresnel reflectors and heliostats\n updateSolarReceiverById: (id: string, receiverId: string) => void;\n updateSolarReceiverAboveFoundation: (type: ObjectType, foundationId: string, receiverId: string) => void;\n updateSolarReceiverForAll: (type: ObjectType, receiverId: string) => void;\n\n // for parabolic dishes\n parabolicDishActionScope: Scope;\n setParabolicDishActionScope: (scope: Scope) => void;\n\n // for parabolic troughs and Fresnel reflectors\n updateModuleLengthById: (id: string, moduleLength: number) => void;\n updateModuleLengthAboveFoundation: (type: ObjectType, foundationId: string, moduleLength: number) => void;\n updateModuleLengthForAll: (type: ObjectType, moduleLength: number) => void;\n\n // for parabolic troughs and dishes\n updateParabolaLatusRectumById: (id: string, latusRectum: number) => void;\n updateParabolaLatusRectumAboveFoundation: (type: ObjectType, foundationId: string, latusRectum: number) => void;\n updateParabolaLatusRectumForAll: (type: ObjectType, latusRectum: number) => void;\n\n // for walls\n wallActionScope: Scope;\n setWallActionScope: (scope: Scope) => void;\n\n // for roofs\n roofActionScope: Scope;\n setRoofActionScope: (scope: Scope) => void;\n\n // for windows\n windowActionScope: Scope;\n setWindowActionScope: (scope: Scope) => void;\n\n // for doors\n doorActionScope: Scope;\n setDoorActionScope: (scope: Scope) => void;\n\n updateWallRelativeAngleById: (id: string, angle: number) => void;\n updateWallLeftJointsById: (id: string, joints: string[]) => void;\n updateWallRightJointsById: (id: string, joints: string[]) => void;\n updateWallLeftPointById: (id: string, point: number[]) => void;\n updateWallRightPointById: (id: string, point: number[]) => void;\n\n // for roofs\n updateRoofRiseById: (id: string, rise: number, topZ?: number) => void;\n updateRoofStructureById: (id: string, structure: RoofStructure) => void;\n\n // for lights\n updateInsideLightById: (id: string, inside: boolean) => void;\n updateInsideLightsByParentId: (parentId: string, inside: boolean) => void;\n\n actionModeLock: boolean;\n objectTypeToAdd: ObjectType;\n addElement: (parent: ElementModel | GroundModel, position: Vector3, normal?: Vector3) => ElementModel | null;\n\n pastePoint: Vector3;\n pasteNormal: Vector3 | undefined;\n elementsToPaste: ElementModel[]; // this is for undoing cut and pasting\n deletedElements: ElementModel[]; // this is for undoing deletion\n clearDeletedElements: () => void;\n copyElementById: (id: string) => void;\n removeElementById: (id: string, cut: boolean, selectNone?: boolean, auto?: boolean) => ElementModel[]; // set cut to false for deletion\n copyCutElements: () => ElementModel[];\n pasteElementsToPoint: () => ElementModel[];\n pasteElementsByKey: () => ElementModel[];\n countElementsByType: (type: ObjectType, excludeLocked?: boolean) => number;\n countSolarStructuresByType: (type: SolarStructure, excludeLocked?: boolean) => number;\n countObservers: () => number;\n removeElementsByType: (type: ObjectType) => void;\n countElementsByReferenceId: (id: string) => number;\n removeElementsByReferenceId: (id: string, cache: boolean) => void;\n getChildren: (id: string) => ElementModel[];\n getChildrenOfType: (type: ObjectType, id: string) => ElementModel[];\n // the following goes faster than counting individual types of children through multiple loops\n countAllElements: (excludeLocked?: boolean) => number;\n countAllElementsByType: (excludeLocked?: boolean) => ElementCounter;\n countAllOffspringsByTypeAtOnce: (ancestorId: string, includingLocked: boolean) => ElementCounter;\n countSolarPanelsOnRack: (id: string) => number;\n removeAllChildElementsByType: (parentId: string, type: ObjectType) => void;\n removeAllElementsOnFoundationByType: (foundationId: string, type: ObjectType) => void;\n\n // genetic algorithms and particle swarm optimization\n fittestIndividualResults: DatumEntry[];\n setFittestIndividualResults: (data: DatumEntry[]) => void;\n variableLabels: (string | undefined)[];\n setVariableLabels: (labels: (string | undefined)[]) => void;\n\n sunlightDirection: Vector3;\n setSunlightDirection: (vector: Vector3) => void;\n\n cameraDirection: Vector3;\n getCameraDirection: () => Vector3;\n\n updateSceneRadiusFlag: boolean;\n updateSceneRadius: () => void;\n sceneRadius: number;\n setSceneRadius: (radius: number) => void;\n\n selectedElementAngle: number;\n selectedElementHeight: number;\n selectedElementX: number;\n selectedElementY: number;\n\n isAddingElement: () => boolean;\n addedFoundationId: string | null;\n deletedFoundationId: string | null;\n\n addedCuboidId: string | null;\n deletedCuboidId: string | null;\n\n addedWallId: string | null;\n deletedWallId: string | null;\n updateWallMapOnFoundationFlag: boolean;\n updateWallMapOnFoundation: () => void;\n\n updateElementOnRoofFlag: boolean;\n setUpdateElementOnRoofFlag: (b: boolean) => void;\n updateElementOnRoofFn: () => void;\n\n addedWindowId: string | null;\n\n addedDoorId: string | null;\n\n addedRoofId: string | null;\n deletedRoofId: string | null;\n setAddedRoofId: (id: string | null) => void;\n\n autoDeletedRoof: RoofModel | null;\n autoDeletedChild: ElementModel[] | null; // [] means checked but no element, null means haven't check yet.\n getAutoDeletedElements: () => ElementModel[] | null;\n\n groupActionMode: boolean;\n setGroupActionMode: (b: boolean) => void;\n groupMasterId: string | null;\n setGroupMasterId: (id: string | null) => void;\n groupActionUpdateFlag: boolean;\n\n locale: Locale;\n localFileName: string;\n createNewFileFlag: boolean;\n setCreateNewFileFlag: (b: boolean) => void;\n openLocalFileFlag: boolean;\n setOpenLocalFileFlag: (b: boolean) => void;\n enableFineGrid: boolean;\n setEnableFineGrid: (b: boolean) => void;\n\n loggable: boolean;\n actionInfo: ActionInfo | undefined;\n currentUndoable: Undoable | undefined;\n showCloudFileTitleDialog: boolean;\n // we have to use the sure flip of an additional flag to ensure it triggers useEffect hook\n showCloudFileTitleDialogFlag: boolean;\n localContentToImportAfterCloudFileUpdate: any;\n\n solarPanelArrayLayoutParams: SolarPanelArrayLayoutParams;\n solarPanelArrayLayoutConstraints: SolarPanelArrayLayoutConstraints;\n evolutionaryAlgorithmState: EvolutionaryAlgorithmState;\n economicsParams: EconomicsParams;\n\n geneticAlgorithmWizardSelectedTab: string;\n particleSwarmOptimizationWizardSelectedTab: string;\n\n // the following is to fix the bug that when ctrl+o is pressed, the file dialog gets fired up multiple times\n localFileDialogRequested: boolean;\n\n tempHumanPlant: ElementModel[];\n}\n\nexport const useStore = create(\n devtools(\n persist(\n (set, get) => {\n const immerSet: CommonStoreState['set'] = (fn) => set(produce(fn));\n const defaultWorldModel = new DefaultWorldModel();\n const defaultElements = defaultWorldModel.getElements();\n\n return {\n set: (fn) => {\n try {\n immerSet(fn);\n } catch (e) {\n console.log(e);\n }\n },\n world: defaultWorldModel,\n elements: defaultElements,\n user: {} as User,\n viewState: new DefaultViewState(),\n actionState: new DefaultActionState(),\n graphState: new DefaultGraphState(),\n solarPanelArrayLayoutParams: new DefaultSolarPanelArrayLayoutParams(),\n solarPanelArrayLayoutConstraints: new DefaultSolarPanelArrayLayoutConstraints(),\n evolutionaryAlgorithmState: new DefaultEvolutionaryAlgorithmState(),\n economicsParams: new DefaultEconomicsParams(),\n geneticAlgorithmWizardSelectedTab: '1',\n particleSwarmOptimizationWizardSelectedTab: '1',\n modelType: ModelType.UNKNOWN,\n modelAuthor: null,\n modelLabel: null,\n modelDescription: null,\n projectView: false,\n projectInfo: {\n owner: null,\n title: null,\n description: null,\n type: DesignProblem.SOLAR_PANEL_ARRAY,\n designs: new Array(),\n ranges: new Array(),\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(DesignProblem.SOLAR_PANEL_ARRAY),\n counter: 0,\n dataColoring: DataColoring.ALL,\n selectedProperty: null,\n sortDescending: false,\n xAxisNameScatteredPlot: null,\n yAxisNameScatteredPlot: null,\n dotSizeScatteredPlot: 5,\n thumbnailWidth: 200,\n } as ProjectInfo,\n projectImages: new Map(),\n designProjectType: null,\n notes: [],\n language: 'en',\n floatingWindowOpacity: FLOATING_WINDOW_OPACITY,\n selectedFloatingWindow: null,\n cloudFile: undefined,\n latestModelSite: undefined,\n modelSites: new Map>(),\n peopleModels: new Map>(),\n modelsMapLatitude: 42.2844063,\n modelsMapLongitude: -71.3488548,\n modelsMapAddress: DEFAULT_ADDRESS,\n modelsMapZoom: DEFAULT_MODEL_MAP_ZOOM,\n modelsMapType: 'roadmap',\n modelsMapTilt: 0,\n\n minimumNavigationMoveSpeed: 3,\n minimumNavigationTurnSpeed: 3,\n\n tempHumanPlant: [],\n\n ray: new Raycaster(),\n mouse: new Vector2(),\n\n fileChanged: false,\n\n applyCount: 0,\n setApplyCount(count) {\n immerSet((state: CommonStoreState) => {\n state.applyCount = count;\n });\n },\n // Not sure why we cannot do this within immerSet\n revertApply() {\n if (get().applyCount) {\n for (let i = 0; i < get().applyCount; i++) {\n get().undoManager.undo();\n }\n get().setApplyCount(0);\n }\n },\n\n importContent(content, title) {\n immerSet((state: CommonStoreState) => {\n state.world = content.world;\n state.viewState = content.view;\n state.graphState = content.graphState ?? new DefaultGraphState();\n state.elements = content.elements;\n state.notes = content.notes ?? [];\n state.modelType = content.modelType ?? ModelType.UNKNOWN;\n state.modelAuthor = content.modelAuthor ?? null;\n state.modelLabel = content.modelLabel ?? null;\n state.modelDescription = content.modelDescription ?? null;\n state.designProjectType = content.designProjectType ?? null;\n state.cloudFile = title;\n state.currentUndoable = undefined;\n state.actionInfo = undefined;\n state.sceneRadius = content.sceneRadius ?? 100;\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\n state.localContentToImportAfterCloudFileUpdate = undefined;\n state.fileChanged = !state.fileChanged;\n state.evolutionMethod = content.evolutionMethod ?? EvolutionMethod.GENETIC_ALGORITHM;\n state.solarPanelArrayLayoutParams =\n content.solarPanelArrayLayoutParams ?? new DefaultSolarPanelArrayLayoutParams();\n state.solarPanelArrayLayoutConstraints =\n content.solarPanelArrayLayoutConstraints ?? new DefaultSolarPanelArrayLayoutConstraints();\n state.evolutionaryAlgorithmState =\n content.evolutionaryAlgorithmState ?? new DefaultEvolutionaryAlgorithmState();\n state.economicsParams = content.economicsParams ?? new DefaultEconomicsParams();\n state.minimumNavigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\n state.minimumNavigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\n // clear existing data, if any\n state.fittestIndividualResults.length = 0;\n state.undoManager.clear();\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n state.actionState = new DefaultActionState();\n state.multiSelectionsMode = false;\n state.selectedElementIdSet.clear();\n state.groupMasterId = null;\n state.selectedFloatingWindow = null;\n // TODO: fix these bugs that are tentatively corrected here\n for (const e of state.elements) {\n if (e.type === ObjectType.Foundation && e.parentId !== GROUND_ID) {\n console.log('Error: ' + e.parentId + ' is not ground!');\n e.parentId = GROUND_ID;\n }\n }\n });\n usePrimitiveStore.setState((state) => {\n state.changed = false;\n state.skipChange = true;\n state.showSolarRadiationHeatmap = false;\n state.showHeatFluxes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n state.clearDailySimulationResultsFlag = !state.clearDailySimulationResultsFlag;\n state.clearYearlySimulationResultsFlag = !state.clearYearlySimulationResultsFlag;\n state.navigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\n state.navigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n exportContent() {\n const state = get();\n const date = new Date();\n const elements = JSON.parse(JSON.stringify(state.elements));\n Util.fixElements(elements);\n return {\n docid: short.generate(),\n time: dayjs(date).format('MM/DD/YYYY hh:mm A'),\n timestamp: date.getTime(),\n userid: state.user.uid,\n owner: state.user.signFile ? state.user.displayName : null,\n email: state.user.signFile ? state.user.email : null,\n world: JSON.parse(JSON.stringify(state.world)),\n elements: elements,\n sceneRadius: state.sceneRadius,\n view: JSON.parse(JSON.stringify(state.viewState)),\n graphState: JSON.parse(JSON.stringify(state.graphState)),\n evolutionMethod: state.evolutionMethod,\n solarPanelArrayLayoutParams: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutParams)),\n solarPanelArrayLayoutConstraints: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutConstraints)),\n evolutionaryAlgorithmState: JSON.parse(JSON.stringify(state.evolutionaryAlgorithmState)),\n economicsParams: JSON.parse(JSON.stringify(state.economicsParams)),\n modelType: state.modelType,\n modelAuthor: state.modelAuthor,\n modelLabel: state.modelLabel,\n modelDescription: state.modelDescription,\n designProjectType: state.designProjectType,\n notes: state.notes,\n minimumNavigationMoveSpeed: state.minimumNavigationMoveSpeed,\n minimumNavigationTurnSpeed: state.minimumNavigationTurnSpeed,\n };\n },\n clearContent() {\n immerSet((state: CommonStoreState) => {\n state.elements = [];\n state.sceneRadius = 100;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n createEmptyFile() {\n immerSet((state: CommonStoreState) => {\n DefaultWorldModel.resetWorldModel(state.world);\n DefaultViewState.resetViewState(state.viewState);\n // don't create a new instance like this (otherwise some UI elements may not update):\n // state.world = new DefaultWorldModel()\n state.elements = [];\n state.sceneRadius = 100;\n state.cloudFile = undefined;\n state.localContentToImportAfterCloudFileUpdate = undefined;\n state.notes = [];\n state.fileChanged = !state.fileChanged;\n state.currentUndoable = undefined;\n state.actionInfo = undefined;\n state.undoManager.clear();\n state.modelType = ModelType.UNKNOWN;\n state.modelLabel = null;\n state.modelDescription = null;\n state.designProjectType = null;\n state.minimumNavigationMoveSpeed = 3;\n state.minimumNavigationTurnSpeed = 3;\n state.multiSelectionsMode = false;\n state.selectedElementIdSet.clear();\n state.groupMasterId = null;\n state.selectedFloatingWindow = null;\n });\n usePrimitiveStore.setState((state) => {\n state.changed = false;\n state.skipChange = true;\n state.showSolarRadiationHeatmap = false;\n state.showHeatFluxes = false;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n undoManager: new UndoManager(),\n addUndoable(undoable: Undoable) {\n immerSet((state: CommonStoreState) => {\n if (state.loggable) {\n state.currentUndoable = undoable;\n }\n state.undoManager.add(undoable);\n });\n },\n\n // genetic algorithms\n fittestIndividualResults: [],\n setFittestIndividualResults(data) {\n immerSet((state: CommonStoreState) => {\n state.fittestIndividualResults = [...data];\n });\n },\n variableLabels: [],\n setVariableLabels(labels) {\n immerSet((state: CommonStoreState) => {\n state.variableLabels = [...labels];\n });\n },\n\n // aabb must be initialized with defined vectors, or it may cause problems as it may be used to\n // determine the scopes of the axes.\n aabb: new Box3(new Vector3(-10, -10, -10), new Vector3(10, 10, 10)),\n animate24Hours: false,\n evolutionMethod: EvolutionMethod.GENETIC_ALGORITHM,\n clickObjectType: null,\n contextMenuObjectType: null,\n hoveredHandle: null,\n moveHandleType: null,\n resizeHandleType: null,\n rotateHandleType: null,\n resizeAnchor: new Vector3(),\n\n selectedElement: null,\n getSelectedElement() {\n if (get().selectedElementIdSet.size === 0) return null;\n const elements = get().elements;\n for (const e of elements) {\n if (get().selectedElementIdSet.has(e.id)) {\n return e;\n }\n }\n return null;\n },\n\n selectedElementIdSet: new Set(),\n multiSelectionsMode: false,\n\n // a sibling is defined as an element of the same type of the same parent\n findNearestSibling(id) {\n let foundId: string | null = null;\n const me = get().getElementById(id);\n if (me) {\n let distanceSquare = Number.MAX_VALUE;\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== id) {\n const dx = me.cx - e.cx;\n const dy = me.cy - e.cy;\n const dz = me.cz - e.cz;\n const sq = dx * dx + dy * dy + dz * dz;\n if (distanceSquare > sq) {\n distanceSquare = sq;\n foundId = e.id;\n }\n }\n }\n }\n return foundId;\n },\n overlapWithSibling(me, threshold) {\n let overlap = false;\n if (threshold === undefined) {\n // when threshold is not set, check overlap of bounding boxes\n const parent = get().getParent(me);\n if (parent) {\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\n if (me.type === ObjectType.SolarPanel) {\n if (Util.doSolarPanelsOverlap(me as SolarPanelModel, e as SolarPanelModel, parent)) {\n overlap = true;\n break;\n }\n } else {\n if (\n Math.abs(me.cx - e.cx) * parent.lx < 0.5 * (me.lx + e.lx) &&\n Math.abs(me.cy - e.cy) * parent.ly < 0.5 * (me.ly + e.ly) &&\n Math.abs(me.cz - e.cz) * parent.lz < 0.5 * (me.lz + e.lz)\n ) {\n overlap = true;\n break;\n }\n }\n }\n }\n }\n } else {\n // when threshold is set, use the distance between centers to detect overlap using it\n const thresholdSquared = threshold * threshold;\n const parent = get().getParent(me);\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\n const dx = (me.cx - e.cx) * (parent ? parent.lx : 1);\n const dy = (me.cy - e.cy) * (parent ? parent.ly : 1);\n const dz = (me.cz - e.cz) * (parent ? parent.lz : 1);\n const sq = dx * dx + dy * dy + dz * dz;\n if (sq < thresholdSquared) {\n overlap = true;\n break;\n }\n }\n }\n }\n return overlap;\n },\n\n selectedSideIndex: -1,\n\n getResizeHandlePosition(el, handleType) {\n const { cx, cy, lx, ly, lz, type, parentId } = el;\n const p = new Vector3(cx, cy, 0);\n switch (type) {\n case ObjectType.Cuboid: {\n const v = new Vector2();\n switch (handleType) {\n case ResizeHandleType.LowerLeftTop:\n v.set(-lx / 2, -ly / 2);\n break;\n case ResizeHandleType.LowerRightTop:\n v.set(lx / 2, -ly / 2);\n break;\n case ResizeHandleType.UpperLeftTop:\n v.set(-lx / 2, ly / 2);\n break;\n case ResizeHandleType.UpperRightTop:\n v.set(lx / 2, ly / 2);\n break;\n }\n const { pos, rot } = Util.getWorldDataById(el.id);\n v.rotateAround(ORIGIN_VECTOR2, rot);\n p.set(pos.x + v.x, pos.y + v.y, pos.z - lz / 2);\n break;\n }\n case ObjectType.Wall: {\n const wall = el as WallModel;\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n const handlePosition = new Vector3();\n switch (handleType) {\n case ResizeHandleType.UpperLeft: {\n handlePosition.fromArray(wall.leftPoint).setZ(0);\n break;\n }\n case ResizeHandleType.UpperRight: {\n handlePosition.fromArray(wall.rightPoint).setZ(0);\n break;\n }\n }\n p.copy(handlePosition.applyEuler(parentRotation).add(parentPosition));\n }\n break;\n }\n case ObjectType.Roof: {\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n const handlePosition = new Vector3(get().selectedElementX, get().selectedElementY)\n .applyEuler(parentRotation)\n .add(parentPosition);\n p.set(handlePosition.x, handlePosition.y, parent.lz);\n }\n break;\n }\n case ObjectType.Tree: {\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.cz + parent.lz / 2);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n p.copy(new Vector3(el.cx, el.cy, parent.lz).applyEuler(parentRotation).add(parentPosition));\n }\n break;\n }\n }\n return p;\n },\n getElementById(id) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === id) {\n return e;\n }\n }\n return null;\n },\n getParent(child) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === child.parentId) {\n return e;\n }\n }\n return null;\n },\n getFoundation(elem) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === elem.foundationId && e.type === ObjectType.Foundation) {\n return e as FoundationModel;\n }\n }\n return null;\n },\n selectNone() {\n immerSet((state: CommonStoreState) => {\n state.selectedElementIdSet.clear();\n for (const e of state.elements) {\n e.selected = false;\n }\n state.selectedElement = null;\n });\n useRefStore.getState().selectNone();\n },\n selectMe(id, e, action, select) {\n const setEnableOrbitController = useRefStore.getState().setEnableOrbitController;\n if (e.intersections.length > 0) {\n const intersectableObjects = e.intersections.filter(\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\n );\n if (intersectableObjects[0].object === e.eventObject || select) {\n immerSet((state) => {\n if (state.multiSelectionsMode) {\n if (state.selectedElementIdSet.has(id)) {\n state.selectedElementIdSet.delete(id);\n } else {\n state.selectedElementIdSet.add(id);\n }\n } else {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(id);\n }\n\n for (const elem of state.elements) {\n if (elem.id === id) {\n elem.selected = true;\n state.selectedElement = elem;\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\n state.selectedElementHeight = elem.lz;\n } else {\n elem.selected = false;\n }\n }\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.rotateHandleType = null;\n if (action) {\n switch (action) {\n case ActionType.Move:\n if (\n state.selectedElement?.type === ObjectType.Tree ||\n state.selectedElement?.type === ObjectType.Human\n ) {\n // selecting the above two types of object automatically sets them to the moving state\n state.moveHandleType = MoveHandleType.Default;\n } else {\n state.moveHandleType = e.eventObject.name as MoveHandleType;\n }\n setEnableOrbitController(false);\n break;\n case ActionType.Resize:\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\n setEnableOrbitController(false);\n break;\n case ActionType.Rotate:\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\n setEnableOrbitController(false);\n break;\n case ActionType.Select:\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\n setEnableOrbitController(true);\n break;\n default:\n setEnableOrbitController(true);\n }\n }\n });\n }\n }\n },\n\n // for all types of elements\n updateAllElementLocks(locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n e.locked = locked;\n }\n });\n },\n updateElementLockByFoundationId(foundationId, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId || e.parentId === foundationId || e.id === foundationId) {\n e.locked = locked;\n }\n }\n });\n },\n updateElementLockByParentId(parentId, type: ObjectType, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.parentId === parentId && type === e.type) {\n e.locked = locked;\n }\n }\n });\n },\n updateElementLockById(id, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.locked = locked;\n break;\n }\n }\n });\n },\n updateElementReferenceById(id, referenceId) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.referenceId = referenceId;\n break;\n }\n }\n });\n },\n\n updateElementLabelById(id, label) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.label = label;\n break;\n }\n }\n });\n },\n updateElementShowLabelById(id, showLabel) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.showLabel = showLabel;\n break;\n }\n }\n });\n },\n\n // color\n updateElementColorById(id, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.color = color;\n break;\n }\n }\n });\n },\n updateElementColorOnSurface(type, parentId, normal, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementColorAboveFoundation(type, foundationId, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementColorForAll(type, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementLineColorById(id, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lineColor = color;\n break;\n }\n }\n });\n },\n updateElementLineColorOnSurface(type, parentId, normal, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n updateElementLineColorAboveFoundation(type, foundationId, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n updateElementLineColorForAll(type, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n\n updateElementLineWidthById(id, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.lineWidth = width;\n break;\n }\n }\n });\n },\n updateElementLineWidthOnSurface(type, parentId, normal, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n updateElementLineWidthAboveFoundation(type, foundationId, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n updateElementLineWidthForAll(type, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n\n updateElementCxById(id, cx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cx = cx;\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\n state.updateElementOnRoofFlag = true;\n }\n break;\n }\n }\n });\n },\n updateElementCyById(id, cy) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cy = cy;\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\n state.updateElementOnRoofFlag = true;\n }\n break;\n }\n }\n });\n },\n updateElementCzById(id, cz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cz = cz;\n break;\n }\n }\n });\n },\n updateElementCzForAll(type, cz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.cz = cz;\n }\n }\n });\n },\n\n // lx\n updateElementLxById(id, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lx = lx;\n break;\n }\n }\n });\n },\n updateElementLxAboveFoundation(type, foundationId, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lx = lx;\n }\n }\n });\n },\n updateElementLxOnSurface(type, parentId, normal, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.lx = lx;\n }\n }\n }\n });\n },\n updateElementLxForAll(type, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lx = lx;\n }\n }\n });\n },\n\n // ly\n updateElementLyById(id, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.ly = ly;\n break;\n }\n }\n });\n },\n updateElementLyAboveFoundation(type, foundationId, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.ly = ly;\n }\n }\n });\n },\n updateElementLyOnSurface(type, parentId, normal, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.ly = ly;\n }\n }\n }\n });\n },\n updateElementLyForAll(type, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.ly = ly;\n }\n }\n });\n },\n\n // lz\n updateElementLzById(id, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lz = lz;\n break;\n }\n }\n });\n },\n updateElementLzAboveFoundation(type, foundationId, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lz = lz;\n }\n }\n });\n },\n updateElementLzOnSurface(type, parentId, normal, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.lz = lz;\n }\n }\n }\n });\n },\n updateElementLzForAll(type, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lz = lz;\n }\n }\n });\n },\n\n updateElementRotationById(id, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n } else if (e.parentId === id && !isStackableModel(e)) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n }\n state.selectedElementAngle = z;\n });\n },\n updateElementRotationForAll(type, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n if (!e.locked) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n } else {\n // FIXME: I don't understand the logic below\n const parent = state.getParent(e);\n if (parent && !parent.locked && parent.type === type) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n }\n }\n });\n },\n\n // for solar collectors\n updateSolarCollectorDrawSunBeamById(id, draw) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (Util.isSolarCollector(e)) {\n (e as SolarCollector).drawSunBeam = draw;\n break;\n }\n }\n }\n });\n },\n updateSolarCollectorDrawSunBeamAboveFoundation(type, foundationId, draw) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === type) {\n (e as SolarCollector).drawSunBeam = draw;\n }\n }\n }\n });\n },\n updateSolarCollectorDrawSunBeamForAll(type, draw) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === type) {\n (e as SolarCollector).drawSunBeam = draw;\n }\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthById(id, relativeAzimuth) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n state.selectedElementAngle = relativeAzimuth;\n break;\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthAboveFoundation(type, foundationId, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (\n e.type === type &&\n e.foundationId === foundationId &&\n !e.locked &&\n (e as SolarPanelModel).parentType !== ObjectType.Wall\n ) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthOnSurface(type, parentId, normal, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthForAll(type, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n });\n },\n\n updateSolarCollectorPoleHeightById(id, poleHeight) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).poleHeight = poleHeight;\n break;\n }\n }\n });\n },\n updateSolarCollectorPoleHeightAboveFoundation(type, foundationId, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n });\n },\n updateSolarCollectorPoleHeightOnSurface(type, parentId, normal, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked && e.type === type) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n }\n });\n },\n updateSolarCollectorPoleHeightForAll(type, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n });\n },\n\n updateSolarCollectorPoleRadiusById(id, poleRadius) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).poleRadius = poleRadius;\n break;\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusAboveFoundation(type, foundationId, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusOnSurface(type, parentId, normal, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked && e.type === type) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusForAll(type, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n });\n },\n\n // this should be called if any of the solar collectors changes\n clearAllSolarCollectorYields() {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (Util.isSolarCollector(e)) {\n const sc = e as SolarCollector;\n sc.dailyYield = 0;\n sc.yearlyYield = 0;\n }\n }\n });\n },\n updateSolarCollectorDailyYieldById(id, dailyYield) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isSolarCollector(e)) {\n (e as SolarCollector).dailyYield = dailyYield;\n break;\n }\n }\n });\n },\n updateSolarCollectorYearlyYieldById(id, yearlyYield) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isSolarCollector(e)) {\n (e as SolarCollector).yearlyYield = yearlyYield;\n break;\n }\n }\n });\n },\n\n // for concentrated solar power collectors\n updateCspReflectanceById(id, reflectance) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isCspCollector(e)) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n break;\n }\n }\n });\n },\n updateCspReflectanceAboveFoundation(type, foundationId, reflectance) {\n if (!Util.isCspCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n }\n }\n });\n },\n updateCspReflectanceForAll(type, reflectance) {\n if (!Util.isCspCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n }\n }\n });\n },\n\n updateParabolicCollectorAbsorptanceById(id, absorptance) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).absorptance = absorptance;\n break;\n }\n }\n });\n },\n updateParabolicCollectorAbsorptanceAboveFoundation(type, foundationId, absorptance) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).absorptance = absorptance;\n }\n }\n });\n },\n updateParabolicCollectorAbsorptanceForAll(type, absorptance) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).absorptance = absorptance;\n }\n }\n });\n },\n\n updateParabolicCollectorOpticalEfficiencyById(id, opticalEfficiency) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n break;\n }\n }\n });\n },\n updateParabolicCollectorOpticalEfficiencyAboveFoundation(type, foundationId, opticalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n }\n }\n });\n },\n updateParabolicCollectorOpticalEfficiencyForAll(type, opticalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n }\n }\n });\n },\n\n updateParabolicCollectorThermalEfficiencyById(id, thermalEfficiency) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n break;\n }\n }\n });\n },\n updateParabolicCollectorThermalEfficiencyAboveFoundation(type, foundationId, thermalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n }\n }\n });\n },\n updateParabolicCollectorThermalEfficiencyForAll(type, thermalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n }\n }\n });\n },\n\n // for foundations\n foundationActionScope: Scope.OnlyThisObject,\n setFoundationActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.foundationActionScope = scope;\n });\n },\n\n // for cuboids\n cuboidActionScope: Scope.OnlyThisSide,\n setCuboidActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.cuboidActionScope = scope;\n });\n },\n\n // for polygons\n polygonActionScope: Scope.OnlyThisObject,\n setPolygonActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.polygonActionScope = scope;\n });\n },\n updatePolygonVertexPositionById(id, index, x, y) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Polygon && e.id === id) {\n const p = e as PolygonModel;\n if (index >= 0 && index < p.vertices.length) {\n p.vertices[index].x = x;\n p.vertices[index].y = y;\n }\n break;\n }\n }\n });\n },\n // must feed a deep copy of the vertices\n updatePolygonVerticesById(id, vertices) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Polygon && e.id === id) {\n const p = e as PolygonModel;\n p.vertices = vertices;\n break;\n }\n }\n });\n },\n\n // for solar panels\n solarPanelActionScope: Scope.OnlyThisObject,\n setSolarPanelActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.solarPanelActionScope = scope;\n });\n },\n updateSolarPanelTiltAngleById(id, tiltAngle) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\n const sp = e as SolarPanelModel;\n sp.tiltAngle = tiltAngle;\n break;\n }\n }\n });\n },\n setSolarPanelOrientation(sp, pvModel, orientation) {\n sp.orientation = orientation;\n if (sp.orientation === Orientation.portrait) {\n // calculate the current x-y layout\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\n sp.lx = nx * pvModel.width;\n sp.ly = ny * pvModel.length;\n } else {\n // calculate the current x-y layout\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\n sp.lx = nx * pvModel.length;\n sp.ly = ny * pvModel.width;\n }\n },\n\n // for parabolic troughs\n parabolicTroughActionScope: Scope.OnlyThisObject,\n setParabolicTroughActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.parabolicTroughActionScope = scope;\n });\n },\n\n // for Fresnel reflector\n fresnelReflectorActionScope: Scope.OnlyThisObject,\n setFresnelReflectorActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.fresnelReflectorActionScope = scope;\n });\n },\n\n // for heliostat\n heliostatActionScope: Scope.OnlyThisObject,\n setHeliostatActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.heliostatActionScope = scope;\n });\n },\n updateSolarReceiverById(id, receiverId) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n break;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n break;\n }\n }\n }\n });\n },\n updateSolarReceiverAboveFoundation(type: ObjectType, foundationId, receiverId) {\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n }\n }\n }\n });\n },\n updateSolarReceiverForAll(type, receiverId) {\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n }\n }\n }\n });\n },\n\n // for parabolic dishes\n parabolicDishActionScope: Scope.OnlyThisObject,\n setParabolicDishActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.parabolicDishActionScope = scope;\n });\n },\n\n // for parabolic troughs and Fresnel reflectors\n updateModuleLengthById(id, moduleLength) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n break;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n break;\n }\n }\n }\n });\n },\n updateModuleLengthAboveFoundation(type, foundationId, moduleLength) {\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n }\n }\n }\n });\n },\n updateModuleLengthForAll(type, moduleLength) {\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n }\n }\n }\n });\n },\n\n // for parabolic troughs and dishes\n updateParabolaLatusRectumById(id, latusRectum) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n break;\n }\n }\n });\n },\n updateParabolaLatusRectumAboveFoundation(type, foundationId, latusRectum) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n }\n }\n });\n },\n updateParabolaLatusRectumForAll(type, latusRectum) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n }\n }\n });\n },\n\n // for walls\n wallActionScope: Scope.OnlyThisObject,\n setWallActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.wallActionScope = scope;\n });\n },\n // for roofs\n roofActionScope: Scope.OnlyThisObject,\n setRoofActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.roofActionScope = scope;\n });\n },\n // for windows\n windowActionScope: Scope.OnlyThisObject,\n setWindowActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.windowActionScope = scope;\n });\n },\n\n // for doors\n doorActionScope: Scope.OnlyThisObject,\n setDoorActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.doorActionScope = scope;\n });\n },\n\n updateWallRelativeAngleById(id, angle) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).relativeAngle = angle;\n break;\n }\n }\n });\n },\n updateWallLeftJointsById(id, joints) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id) {\n (e as WallModel).leftJoints = joints;\n break;\n }\n }\n });\n },\n updateWallRightJointsById(id, joints) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id) {\n (e as WallModel).rightJoints = joints;\n break;\n }\n }\n });\n },\n updateWallLeftPointById(id, point) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).leftPoint = [...point];\n break;\n }\n }\n });\n },\n updateWallRightPointById(id, point) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).rightPoint = [...point];\n break;\n }\n }\n });\n },\n\n updateRoofRiseById(id, rise, topZ) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Roof) {\n (e as RoofModel).rise = rise;\n state.actionState.roofRise = rise;\n if (topZ !== undefined) {\n state.selectedElementHeight = topZ;\n }\n break;\n }\n }\n });\n },\n updateRoofStructureById(id, structure) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Roof) {\n const roofModel = e as RoofModel;\n roofModel.roofStructure = structure;\n break;\n }\n }\n });\n },\n\n updateInsideLightById(id, inside) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Light && e.id === id) {\n (e as LightModel).inside = inside;\n break;\n }\n }\n });\n },\n updateInsideLightsByParentId(parentId, inside) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.parentId === parentId && e.type === ObjectType.Light) {\n (e as LightModel).inside = inside;\n }\n }\n });\n },\n\n setElementPosition(id, x, y, z?) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id) {\n state.elements[i].cx = x;\n state.elements[i].cy = y;\n if (z !== undefined) {\n state.elements[i].cz = z;\n }\n break;\n }\n }\n });\n },\n setElementNormal(id, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id || e.parentId === id) {\n const elem = state.elements[i];\n elem.normal[0] = x;\n elem.normal[1] = y;\n elem.normal[2] = z;\n }\n }\n });\n },\n setElementSize(id, lx, ly, lz?) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id) {\n state.elements[i].lx = lx;\n state.elements[i].ly = ly;\n if (lz) {\n state.elements[i].lz = lz;\n state.selectedElementHeight = lz;\n }\n break;\n }\n }\n });\n },\n\n actionModeLock: false,\n objectTypeToAdd: ObjectType.None,\n addElement(parent, p, normal) {\n let model: ElementModel | null = null;\n const parentId = 'id' in parent ? parent.id : GROUND_ID;\n immerSet((state: CommonStoreState) => {\n switch (state.objectTypeToAdd) {\n case ObjectType.Human: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const human = ElementModelFactory.makeHuman(\n state.actionState.humanName,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = human;\n state.elements.push(human);\n break;\n }\n case ObjectType.Tree: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const tree = ElementModelFactory.makeTree(\n state.actionState.treeType,\n state.actionState.treeSpread,\n state.actionState.treeHeight,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = tree;\n state.elements.push(tree);\n break;\n }\n case ObjectType.Flower: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const flower = ElementModelFactory.makeFlower(\n state.actionState.flowerType,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = flower;\n state.elements.push(flower);\n break;\n }\n case ObjectType.Polygon:\n const polygonParentModel = parent as ElementModel;\n const polygonRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, polygonParentModel);\n const polygon = ElementModelFactory.makePolygon(\n polygonParentModel,\n polygonRelativeCoordinates.x,\n polygonRelativeCoordinates.y,\n polygonRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n polygonParentModel.type,\n );\n model = polygon;\n state.elements.push(polygon);\n break;\n case ObjectType.Sensor:\n const sensorParentModel = parent as ElementModel;\n const sensorRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, sensorParentModel);\n const sensor = ElementModelFactory.makeSensor(\n sensorParentModel,\n sensorRelativeCoordinates.x,\n sensorRelativeCoordinates.y,\n sensorRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n );\n model = sensor;\n state.elements.push(sensor);\n break;\n case ObjectType.Light:\n const lightParentModel = parent as ElementModel;\n const lightRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, lightParentModel);\n const light = ElementModelFactory.makeLight(\n lightParentModel,\n 2,\n state.actionState.lightDistance,\n state.actionState.lightIntensity,\n state.actionState.lightColor,\n lightRelativeCoordinates.x,\n lightRelativeCoordinates.y,\n lightRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n );\n model = light;\n state.elements.push(light);\n break;\n case ObjectType.SolarPanel:\n const solarPanelParentModel = parent as ElementModel;\n const solarPanelRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, solarPanelParentModel);\n const solarPanel = ElementModelFactory.makeSolarPanel(\n solarPanelParentModel,\n state.getPvModule(state.actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\n solarPanelRelativeCoordinates.x,\n solarPanelRelativeCoordinates.y,\n solarPanelRelativeCoordinates.z,\n state.actionState.solarPanelOrientation ?? Orientation.landscape,\n state.actionState.solarPanelPoleHeight ?? 1,\n state.actionState.solarPanelPoleSpacing ?? 3,\n state.actionState.solarPanelTiltAngle ?? 0,\n state.actionState.solarPanelRelativeAzimuth ?? 0,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.solarPanelFrameColor ?? 'white',\n );\n model = solarPanel;\n state.elements.push(solarPanel);\n break;\n case ObjectType.ParabolicTrough:\n const parabolicTroughParentModel = parent as ElementModel;\n const parabolicTroughRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n parabolicTroughParentModel,\n );\n const parabolicTrough = ElementModelFactory.makeParabolicTrough(\n parabolicTroughParentModel,\n state.actionState.parabolicTroughReflectance,\n state.actionState.parabolicTroughAbsorptance,\n state.actionState.parabolicTroughOpticalEfficiency,\n state.actionState.parabolicTroughThermalEfficiency,\n state.actionState.parabolicTroughLatusRectum,\n state.actionState.parabolicTroughPoleHeight,\n state.actionState.parabolicTroughModuleLength,\n parabolicTroughRelativeCoordinates.x,\n parabolicTroughRelativeCoordinates.y,\n parabolicTroughRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.parabolicTroughWidth,\n );\n model = parabolicTrough;\n state.elements.push(parabolicTrough);\n break;\n case ObjectType.ParabolicDish:\n const parabolicDishParentModel = parent as ElementModel;\n const parabolicDishRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n parabolicDishParentModel,\n );\n const parabolicDish = ElementModelFactory.makeParabolicDish(\n parabolicDishParentModel,\n state.actionState.parabolicDishReflectance,\n state.actionState.parabolicDishAbsorptance,\n state.actionState.parabolicDishOpticalEfficiency,\n state.actionState.parabolicDishThermalEfficiency,\n state.actionState.parabolicDishLatusRectum,\n state.actionState.parabolicDishPoleHeight,\n state.actionState.parabolicDishReceiverStructure,\n parabolicDishRelativeCoordinates.x,\n parabolicDishRelativeCoordinates.y,\n parabolicDishRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.parabolicDishRimDiameter,\n state.actionState.parabolicDishRimDiameter,\n );\n model = parabolicDish;\n state.elements.push(parabolicDish);\n break;\n case ObjectType.FresnelReflector:\n const fresnelReflectorParentModel = parent as ElementModel;\n const fresnelReflectorRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n fresnelReflectorParentModel,\n );\n const fresnelReflector = ElementModelFactory.makeFresnelReflector(\n fresnelReflectorParentModel,\n state.actionState.fresnelReflectorReceiver,\n state.actionState.fresnelReflectorReflectance,\n state.actionState.fresnelReflectorPoleHeight,\n state.actionState.fresnelReflectorModuleLength,\n fresnelReflectorRelativeCoordinates.x,\n fresnelReflectorRelativeCoordinates.y,\n fresnelReflectorRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.fresnelReflectorWidth,\n );\n model = fresnelReflector;\n state.elements.push(fresnelReflector);\n break;\n case ObjectType.Heliostat:\n const heliostatParentModel = parent as ElementModel;\n const heliostatRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, heliostatParentModel);\n const heliostat = ElementModelFactory.makeHeliostat(\n heliostatParentModel,\n state.actionState.heliostatTower,\n state.actionState.heliostatReflectance,\n state.actionState.heliostatPoleHeight,\n heliostatRelativeCoordinates.x,\n heliostatRelativeCoordinates.y,\n heliostatRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.heliostatLength,\n state.actionState.heliostatWidth,\n );\n model = heliostat;\n state.elements.push(heliostat);\n break;\n case ObjectType.Foundation:\n const foundation = ElementModelFactory.makeFoundation(\n p.x,\n p.y,\n state.actionState.foundationHeight,\n state.actionState.foundationColor,\n state.actionState.foundationTexture,\n );\n model = foundation;\n state.elements.push(foundation);\n break;\n case ObjectType.Cuboid:\n const cuboid = ElementModelFactory.makeCuboid(\n p.x,\n p.y,\n state.actionState.cuboidHeight,\n state.actionState.cuboidFaceColors,\n state.actionState.cuboidFaceTextures,\n );\n model = cuboid;\n state.elements.push(cuboid);\n break;\n case ObjectType.Wall:\n const wallParentModel = parent as ElementModel;\n const relativePos = Util.wallRelativePosition(new Vector3(p.x, p.y), wallParentModel);\n const wall = ElementModelFactory.makeWall(\n wallParentModel,\n relativePos.x,\n relativePos.y,\n relativePos.z,\n normal,\n );\n state.elements.push(wall);\n state.selectedElement = wall;\n model = wall;\n break;\n }\n if (model) {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(model.id);\n }\n });\n return model;\n },\n\n elementsToPaste: [],\n deletedElements: [],\n clearDeletedElements() {\n immerSet((state: CommonStoreState) => {\n state.deletedElements = [];\n });\n },\n pastePoint: new Vector3(),\n pasteNormal: undefined,\n copyElementById(id) {\n immerSet((state: CommonStoreState) => {\n state.elementsToPaste = [];\n // make sure that the first element to paste is the current one when it may be a parent\n for (const e of state.elements) {\n if (e.id === id) {\n if (e.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\n e.cx = centroid.x;\n e.cy = centroid.y;\n state.elementsToPaste.push(e);\n } else if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Wall) {\n const parentWall = state.elements.find(\n (el) => el.id === e.parentId && el.type === ObjectType.Wall,\n ) as WallModel | undefined;\n if (parentWall) {\n const copiedWindow = { ...e };\n copiedWindow.lx = e.lx * parentWall.lx;\n copiedWindow.lz = e.lz * parentWall.lz;\n state.elementsToPaste.push(copiedWindow);\n }\n } else {\n state.elementsToPaste.push(e);\n }\n break;\n }\n }\n for (const e of state.elements) {\n if (Util.isChild(id, e.id)) {\n if (e.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\n e.cx = centroid.x;\n e.cy = centroid.y;\n }\n state.elementsToPaste.push(e);\n }\n }\n });\n },\n removeElementById(id, cut, selectNone = true, autoDeleted) {\n const removed = get().elements.filter((e) => e.id === id || Util.isChild(id, e.id));\n immerSet((state: CommonStoreState) => {\n for (const elem of state.elements) {\n if (elem.id === id) {\n // the first element must be the parent if there are children needed to be removed as well\n if (cut) {\n if (elem.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((elem as PolygonModel).vertices);\n elem.cx = centroid.x;\n elem.cy = centroid.y;\n state.elementsToPaste = [elem];\n } else if (\n elem.type === ObjectType.Window &&\n (elem as WindowModel).parentType === ObjectType.Wall\n ) {\n const parentWall = state.elements.find(\n (el) => el.id === elem.parentId && el.type === ObjectType.Wall,\n ) as WallModel | undefined;\n if (parentWall) {\n const copiedWindow = { ...elem };\n copiedWindow.lx = elem.lx * parentWall.lx;\n copiedWindow.lz = elem.lz * parentWall.lz;\n state.elementsToPaste = [copiedWindow];\n }\n } else {\n state.elementsToPaste = [elem];\n }\n } else if (!autoDeleted) {\n state.deletedElements = [elem];\n }\n elem.selected = false;\n switch (elem.type) {\n case ObjectType.Roof: {\n state.deletedRoofId = elem.id;\n useDataStore.getState().deleteRoofSegmentVertices(id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\n if (autoDeleted) {\n state.autoDeletedRoof = elem as RoofModel;\n }\n break;\n }\n case ObjectType.Wall: {\n const currentWall = elem as WallModel;\n let leftWallId = '';\n let rightWallId = '';\n if (currentWall.leftJoints.length > 0) {\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\n }\n if (currentWall.rightJoints.length > 0) {\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\n }\n for (const e of state.elements) {\n if (e.id === leftWallId) {\n (e as WallModel).rightJoints = [];\n } else if (e.id === rightWallId) {\n (e as WallModel).leftJoints = [];\n }\n }\n state.elements = state.elements.filter(\n (e) => !(e.type === ObjectType.Roof && (e as RoofModel).wallsId.length === 0),\n );\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedWallId = elem.id;\n break;\n }\n case ObjectType.Foundation: {\n state.deletedFoundationId = elem.id;\n break;\n }\n case ObjectType.Cuboid: {\n state.deletedCuboidId = elem.id;\n break;\n }\n }\n break;\n }\n }\n if (autoDeleted) {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n if (state.autoDeletedChild) {\n state.autoDeletedChild.push(child);\n } else {\n state.autoDeletedChild = [child];\n }\n }\n }\n } else {\n if (cut) {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n state.elementsToPaste.push(child);\n }\n }\n } else {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n state.deletedElements.push(child);\n }\n }\n }\n }\n state.elements = state.elements.filter((e) => {\n if (e.id === id || e.parentId === id || e.foundationId === id || Util.isChild(id, e.id)) {\n if (e.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\n }\n return false;\n } else {\n return true;\n }\n });\n state.selectedElementIdSet.delete(id);\n if (selectNone) {\n state.selectedElement = null;\n state.selectedElementIdSet.clear();\n }\n });\n return removed;\n },\n removeElementsByType(type) {\n immerSet((state: CommonStoreState) => {\n if (type === ObjectType.Foundation) {\n state.elements = state.elements.filter((x) => {\n if (x.locked || (x.type !== ObjectType.Foundation && !x.foundationId)) {\n return true;\n } else {\n if (x.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\n }\n return false;\n }\n });\n } else {\n state.elements = state.elements.filter((x) => {\n if (x.locked || x.type !== type) {\n return true;\n } else {\n if (x.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\n }\n return false;\n }\n });\n }\n });\n },\n countElementsByType(type, excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (e.type === type && !e.locked) {\n count++;\n }\n }\n } else {\n for (const e of get().elements) {\n if (e.type === type) {\n count++;\n }\n }\n }\n return count;\n },\n countSolarStructuresByType(type, excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (e.type === ObjectType.Foundation && !e.locked) {\n if ((e as FoundationModel).solarStructure === type) {\n count++;\n }\n }\n }\n } else {\n for (const e of get().elements) {\n if (e.type === ObjectType.Foundation) {\n if ((e as FoundationModel).solarStructure === type) {\n count++;\n }\n }\n }\n }\n return count;\n },\n countObservers() {\n let count = 0;\n for (const e of get().elements) {\n if (e.type === ObjectType.Human && (e as HumanModel).observer) {\n count++;\n }\n }\n return count;\n },\n removeElementsByReferenceId(id, cache) {\n immerSet((state: CommonStoreState) => {\n if (cache) {\n state.deletedElements = [];\n for (const e of state.elements) {\n if (e.referenceId === id) {\n state.deletedElements.push(e);\n }\n }\n }\n state.elements = state.elements.filter((e) => {\n return e.referenceId !== id;\n });\n });\n },\n countElementsByReferenceId(id) {\n let count = 0;\n for (const e of get().elements) {\n if (e.referenceId === id) {\n count++;\n }\n }\n return count;\n },\n\n getChildren(id) {\n const children: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === id) {\n children.push(e);\n }\n }\n return children;\n },\n getChildrenOfType(type: ObjectType, id) {\n const children: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.type === type && e.parentId === id) {\n children.push(e);\n }\n }\n return children;\n },\n removeAllChildElementsByType(parentId, type) {\n immerSet((state: CommonStoreState) => {\n state.elements = state.elements.filter((x) => x.locked || x.type !== type || x.parentId !== parentId);\n if (type === ObjectType.Wall) {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n }\n });\n },\n removeAllElementsOnFoundationByType(foundationId, type) {\n immerSet((state: CommonStoreState) => {\n state.elements = state.elements.filter(\n (x) => x.locked || x.type !== type || x.foundationId !== foundationId,\n );\n if (type === ObjectType.Wall) {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n }\n });\n },\n countAllElements(excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (!e.locked) {\n count++;\n }\n }\n } else {\n count = get().elements.length;\n }\n return count;\n },\n countAllElementsByType(excludeLocked) {\n const counter = new ElementCounter();\n for (const e of get().elements) {\n if (excludeLocked && e.locked) continue;\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n counter.solarUpdraftTowerCount++;\n }\n counter.foundationCount++;\n break;\n case ObjectType.Cuboid:\n counter.cuboidCount++;\n break;\n case ObjectType.Wall:\n counter.wallCount++;\n break;\n case ObjectType.Window:\n counter.windowCount++;\n break;\n case ObjectType.Door:\n counter.doorCount++;\n break;\n case ObjectType.Human:\n counter.humanCount++;\n break;\n case ObjectType.Tree:\n counter.treeCount++;\n break;\n case ObjectType.Flower:\n counter.flowerCount++;\n break;\n case ObjectType.Polygon:\n counter.polygonCount++;\n break;\n case ObjectType.Sensor:\n counter.sensorCount++;\n break;\n case ObjectType.Light:\n if ((e as LightModel).inside) {\n counter.insideLightCount++;\n } else {\n counter.outsideLightCount++;\n }\n break;\n case ObjectType.SolarPanel:\n counter.solarPanelCount++;\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\n }\n break;\n case ObjectType.ParabolicDish:\n counter.parabolicDishCount++;\n break;\n case ObjectType.ParabolicTrough:\n counter.parabolicTroughCount++;\n break;\n case ObjectType.FresnelReflector:\n counter.fresnelReflectorCount++;\n break;\n case ObjectType.Heliostat:\n counter.heliostatCount++;\n break;\n case ObjectType.WindTurbine:\n counter.windTurbineCount++;\n break;\n }\n }\n return counter;\n },\n countAllOffspringsByTypeAtOnce(ancestorId, includingLocked) {\n const counter = new ElementCounter();\n for (const e of get().elements) {\n // foundationId applies to both foundations and cuboids, should have been named ancestorId\n const idOk = e.parentId === ancestorId || e.foundationId === ancestorId;\n if (includingLocked ? idOk : !e.locked && idOk) {\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n counter.solarUpdraftTowerCount++;\n }\n counter.foundationCount++;\n break;\n case ObjectType.Cuboid:\n counter.cuboidCount++;\n break;\n case ObjectType.Wall:\n counter.wallCount++;\n break;\n case ObjectType.Window:\n counter.windowCount++;\n break;\n case ObjectType.Door:\n counter.doorCount++;\n break;\n case ObjectType.Human:\n counter.humanCount++;\n break;\n case ObjectType.Tree:\n counter.treeCount++;\n break;\n case ObjectType.Flower:\n counter.flowerCount++;\n break;\n case ObjectType.Polygon:\n counter.polygonCount++;\n break;\n case ObjectType.Sensor:\n counter.sensorCount++;\n break;\n case ObjectType.Light:\n if ((e as LightModel).inside) {\n counter.insideLightCount++;\n } else {\n counter.outsideLightCount++;\n }\n break;\n case ObjectType.SolarPanel:\n counter.solarPanelCount++;\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\n }\n break;\n case ObjectType.ParabolicDish:\n counter.parabolicDishCount++;\n break;\n case ObjectType.ParabolicTrough:\n counter.parabolicTroughCount++;\n break;\n case ObjectType.FresnelReflector:\n counter.fresnelReflectorCount++;\n break;\n case ObjectType.Heliostat:\n counter.heliostatCount++;\n break;\n case ObjectType.WindTurbine:\n counter.windTurbineCount++;\n break;\n }\n }\n }\n return counter;\n },\n countSolarPanelsOnRack(id) {\n let count = 0;\n for (const e of get().elements) {\n if (e.id === id && e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n count = Util.countSolarPanelsOnRack(sp, pvModel);\n break;\n }\n }\n }\n return count;\n },\n\n // must copy the elements because they may be pasted multiple times.\n // so we must treat them as newly added elements each time.\n // note that the case of deletion is treated differently because the deleted elements cannot be pasted.\n copyCutElements() {\n const copiedElements: ElementModel[] = [];\n const map = new Map(); // oldId => newElement\n const elementsMapOldToNew = new Map();\n const elementsMapNewToOld = new Map();\n for (let i = 0; i < get().elementsToPaste.length; i++) {\n const oldElem = get().elementsToPaste[i];\n let newElem: ElementModel | null = null;\n if (i === 0) {\n // the first element is the parent\n if (get().getElementById(oldElem.id)) {\n // make a clone with a new ID if the old ID is in the elements\n newElem = ElementModelCloner.clone(\n get().getParent(oldElem),\n oldElem,\n oldElem.cx,\n oldElem.cy,\n oldElem.cz,\n );\n } else {\n // preserve the ID if it is not in the elements\n newElem = JSON.parse(JSON.stringify(oldElem));\n }\n if (newElem?.type === ObjectType.Wall) {\n const w = newElem as WallModel;\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n }\n } else {\n const oldParent = get().elementsToPaste.find((el) => el.id === oldElem.parentId);\n if (oldParent) {\n const newParent = map.get(oldParent.id);\n if (newParent) {\n if (get().getElementById(oldElem.id)) {\n // make a clone with a new ID if the old ID is in the elements\n newElem = ElementModelCloner.clone(\n newParent,\n oldElem,\n oldElem.cx,\n oldElem.cy,\n oldElem.cz,\n oldElem.type === ObjectType.Polygon,\n );\n } else {\n // preserve the ID if it is not in the elements\n newElem = JSON.parse(JSON.stringify(oldElem));\n }\n }\n }\n }\n if (newElem) {\n map.set(oldElem.id, newElem);\n elementsMapOldToNew.set(oldElem.id, newElem.id);\n elementsMapNewToOld.set(newElem.id, oldElem.id);\n copiedElements.push(newElem);\n }\n }\n for (const e of copiedElements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n for (const o of get().elementsToPaste) {\n if (o.id === oldRoofId) {\n (e as RoofModel).wallsId = (o as RoofModel).wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of get().elementsToPaste) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n\n return copiedElements;\n },\n\n pasteElementsToPoint() {\n const pastedElements: ElementModel[] = [];\n immerSet((state: CommonStoreState) => {\n if (state.elementsToPaste.length === 1) {\n // only the parent element is included in elementsToPaste when copied,\n // so we have to copy its children and grandchildren from existing elements\n let m = state.pastePoint;\n const elemToPaste = state.elementsToPaste[0];\n let newParent = state.selectedElement;\n const oldParent = state.getParent(elemToPaste);\n if (newParent) {\n if (newParent.type === ObjectType.Polygon) {\n // paste action of polygon is passed to its parent\n const q = state.getParent(newParent);\n if (q) {\n newParent = q;\n elemToPaste.parentId = newParent.id;\n if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n }\n } else if (newParent.type === ObjectType.Roof) {\n if (newParent.parentId) {\n const foundation = state.getElementById(newParent.parentId);\n if (foundation) {\n m.sub(new Vector3(foundation.cx, foundation.cy, foundation.lz)).applyEuler(\n new Euler(0, 0, -foundation.rotation[2]),\n );\n if (elemToPaste.type !== ObjectType.Window) {\n m.setX(m.x / foundation.lx);\n m.setY(m.y / foundation.ly);\n }\n }\n }\n } else if (newParent.type === ObjectType.Cuboid) {\n if (elemToPaste.type === ObjectType.Cuboid) {\n const { pos } = Util.getWorldDataById(newParent.id);\n m.sub(pos);\n } else if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n elemToPaste.parentId = newParent.id;\n } else if (newParent.type === ObjectType.Wall) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n } else {\n // if the old parent is ground, it has no type definition, but we use it to check its type\n if (oldParent && oldParent.type) {\n if (elemToPaste.type !== ObjectType.Foundation) {\n elemToPaste.parentId = newParent.id;\n if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n }\n }\n }\n if (elemToPaste.type === ObjectType.Wall) {\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\n }\n }\n const e = ElementModelCloner.clone(\n newParent,\n elemToPaste,\n m.x,\n m.y,\n m.z,\n false,\n state.pasteNormal,\n oldParent,\n );\n if (e) {\n if (state.pasteNormal) {\n e.normal = state.pasteNormal.toArray();\n }\n const lang = { lng: state.language };\n let approved = false;\n switch (e.type) {\n case ObjectType.Cuboid: {\n const getAllChildren = (el: ElementModel) => {\n const res: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === el.id) {\n res.push(e);\n switch (e.type) {\n case ObjectType.Cuboid:\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Roof:\n res.push(...getAllChildren(e));\n }\n }\n }\n return res;\n };\n const child = getAllChildren(elemToPaste);\n const elementMap = new Map(); // oldId -> newModel\n pastedElements.push(e);\n elementMap.set(elemToPaste.id, e);\n\n for (const c of child) {\n const parent = elementMap.get(c.parentId);\n if (parent) {\n const newChild = ElementModelCloner.clone(\n parent,\n c,\n c.cx,\n c.cy,\n c.cz,\n c.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...c.normal];\n }\n pastedElements.push(newChild);\n elementMap.set(c.id, newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elementsToPaste = [e];\n approved = false;\n\n break;\n }\n case ObjectType.Foundation: {\n const elementsMapNewToOld = new Map();\n const elementsMapOldToNew = new Map();\n for (const child of state.elements) {\n if (child.parentId === elemToPaste.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\n elementsMapNewToOld.set(newChild.id, child.id);\n elementsMapOldToNew.set(child.id, newChild.id);\n for (const grandChild of state.elements) {\n if (grandChild.parentId === child.id) {\n const newGrandChild = ElementModelCloner.clone(\n newChild,\n grandChild,\n grandChild.cx,\n grandChild.cy,\n grandChild.cz,\n );\n if (newGrandChild) {\n if (child.normal) {\n newGrandChild.normal = [...grandChild.normal];\n }\n pastedElements.push(newGrandChild);\n }\n }\n }\n }\n }\n }\n }\n state.elements.push(...pastedElements);\n approved = true;\n for (const e of state.elements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\n if (oldRoof) {\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of state.elements) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.ParabolicDish:\n case ObjectType.Heliostat:\n case ObjectType.FresnelReflector:\n case ObjectType.ParabolicTrough: {\n if (newParent?.type === ObjectType.Wall) {\n if (newParent) {\n switch (Util.checkElementOnWallState(e, newParent)) {\n case ElementState.Valid:\n const angle = (newParent as WallModel).relativeAngle - HALF_PI;\n e.normal = [Math.cos(angle), Math.sin(angle), 0];\n approved = true;\n break;\n case ElementState.OverLap:\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n case ElementState.OutsideBoundary:\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n }\n break;\n }\n if (newParent && newParent.type === ObjectType.Roof) {\n if (e.foundationId) {\n const foundation = state.getElementById(e.foundationId);\n if (foundation) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(newParent as RoofModel);\n\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices)) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n if (\n !RoofUtil.rooftopSPCollisionCheck(e as SolarPanelModel, foundation, solarPanelVertices)\n ) {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n }\n approved = true;\n state.updateElementOnRoofFlag = true;\n }\n }\n break;\n }\n if (state.overlapWithSibling(e)) {\n // overlap, do not approve\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n } else {\n if (newParent) {\n if (\n newParent.type === ObjectType.Foundation ||\n (newParent.type === ObjectType.Cuboid &&\n Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\n ) {\n approved = Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, newParent);\n if (!approved) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n } else {\n // TODO: other surfaces\n approved = true;\n }\n } else {\n approved = true;\n }\n }\n break;\n }\n case ObjectType.Wall: {\n const center = new Vector3(e.cx, e.cy, 0);\n const vrx = new Vector3(e.lx / 2, 0, 0);\n const vlx = new Vector3(-e.lx / 2, 0, 0);\n const w = e as WallModel;\n const euler = new Euler(0, 0, w.relativeAngle);\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n for (const child of state.elements) {\n if (child.parentId === elemToPaste.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n approved = true;\n break;\n }\n case ObjectType.Door:\n case ObjectType.Window: {\n if (newParent?.type === ObjectType.Wall) {\n switch (Util.checkElementOnWallState(e, newParent)) {\n case ElementState.Valid:\n approved = true;\n break;\n case ElementState.OverLap:\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n case ElementState.OutsideBoundary:\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n } else if (newParent?.type === ObjectType.Roof) {\n const rotation = RoofUtil.getRotationOnRoof(newParent.id, m);\n if (rotation) {\n e.rotation = [...rotation];\n }\n const windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n const boundaryVertices = RoofUtil.getRoofSegmentBoundary(newParent.id, m);\n if (!boundaryVertices) break;\n if (!RoofUtil.rooftopElementBoundaryCheck(windowVertices, boundaryVertices)) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n if (!RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, newParent.id)) {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n }\n approved = true;\n }\n break;\n }\n default: {\n approved = true;\n if (Util.isPlantOrHuman(e)) {\n if (newParent) {\n // paste on a parent\n const parent = state.getParent(e);\n if (parent) {\n const p = Util.relativePoint(state.pastePoint, parent);\n e.cx = p.x;\n e.cy = p.y;\n e.cz = p.z;\n }\n } else {\n // paste on the ground\n e.parentId = GROUND_ID;\n }\n }\n }\n }\n if (approved) {\n state.elements.push(e);\n pastedElements.push(e);\n }\n }\n } else if (state.elementsToPaste.length > 1) {\n // when a parent with children is cut, the removed children are no longer in elements array,\n // so we have to restore them from elementsToPaste.\n let m = state.pastePoint;\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n if (cutElements[0].type === ObjectType.Cuboid) {\n const newParent = state.selectedElement;\n if (newParent && newParent.type === ObjectType.Cuboid) {\n const { pos } = Util.getWorldDataById(newParent.id);\n m.sub(pos);\n cutElements[0].parentId = newParent.id;\n }\n } else if (cutElements[0].type === ObjectType.Wall) {\n const newParent = state.selectedElement;\n if (newParent && newParent.type === ObjectType.Foundation) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\n cutElements[0].parentId = newParent.id;\n cutElements[0].foundationId = newParent.id;\n }\n }\n cutElements[0].cx = m.x;\n cutElements[0].cy = m.y;\n cutElements[0].cz = m.z;\n if (cutElements[0].type === ObjectType.Foundation) {\n cutElements[0].cz += cutElements[0].lz / 2;\n } else if (cutElements[0].type === ObjectType.Cuboid) {\n cutElements[0].cz = cutElements[0].lz / 2;\n }\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n }\n }\n if (pastedElements.length > 0) {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(pastedElements[0].id);\n state.selectedElement = pastedElements[0];\n }\n });\n return pastedElements;\n },\n\n pasteElementsByKey() {\n const pastedElements: ElementModel[] = [];\n immerSet((state: CommonStoreState) => {\n if (state.elementsToPaste.length > 0) {\n const elem = state.elementsToPaste[0];\n const parent = state.getParent(elem);\n const e = ElementModelCloner.clone(parent, elem, elem.cx, elem.cy, elem.cz);\n if (e) {\n let approved = false;\n switch (e.type) {\n case ObjectType.Door:\n case ObjectType.Window:\n if (parent) {\n const hx = e.lx / 2;\n e.cx += hx * 3;\n // searching +x direction\n if (parent.type === ObjectType.Wall) {\n while (e.cx + hx < 0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n // state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx += hx;\n }\n }\n } else if (parent.type === ObjectType.Roof) {\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\n if (\n segmentVertices &&\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx / 2;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n }\n }\n }\n\n // searching -x direction\n if (!approved) {\n e.cx = elem.cx - hx * 3;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n if (parent.type === ObjectType.Wall) {\n while (e.cx - hx > -0.5) {\n if (parent.type === ObjectType.Wall) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n // state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx -= hx;\n }\n }\n }\n } else if (parent.type === ObjectType.Roof) {\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\n if (\n segmentVertices &&\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx -= hx;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n }\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n if (parent.type === ObjectType.Roof && approved) {\n state.updateElementOnRoofFlag = true;\n }\n }\n break;\n case ObjectType.Human:\n e.cx += 1;\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n case ObjectType.Tree:\n case ObjectType.Flower:\n e.cx += e.lx;\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n case ObjectType.SolarPanel:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n if (e.parentId) {\n const parent = state.getParent(e);\n if (parent) {\n if (parent.type === ObjectType.Wall) {\n const hx = e.lx / parent.lx / 2;\n e.cx += hx * 3;\n // searching +x direction\n while (e.cx + hx < 0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx;\n }\n }\n // searching -x direction\n if (!approved) {\n e.cx = elem.cx - hx * 3;\n while (e.cx - hx > -0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx -= hx;\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n } else {\n }\n break;\n } else if (parent.type === ObjectType.Roof) {\n if (elem.foundationId) {\n const foundation = state.getElementById(elem.foundationId);\n if (foundation) {\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n\n const hx = e.lx / foundation.lx / 2;\n e.cx += hx * 1.25;\n\n while (e.cx + hx < 0.5) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n if (\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\n RoofUtil.rooftopSPCollisionCheck(\n e as SolarPanelModel,\n foundation,\n solarPanelVertices,\n )\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx * 1.25;\n }\n }\n if (!approved) {\n e.cx = elem.cx - hx * 1.25;\n while (e.cx - hx > -0.5) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n if (\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\n RoofUtil.rooftopSPCollisionCheck(\n e as SolarPanelModel,\n foundation,\n solarPanelVertices,\n )\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx -= hx * 1.25;\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n } else {\n state.updateElementOnRoofFlag = true;\n }\n }\n }\n break;\n }\n const nearestNeighborId = state.findNearestSibling(elem.id);\n if (nearestNeighborId) {\n const nearestNeighbor = state.getElementById(nearestNeighborId);\n if (nearestNeighbor) {\n const oldX = e.cx;\n const oldY = e.cy;\n const oldZ = e.cz;\n const dx = nearestNeighbor.cx - elem.cx;\n const dy = nearestNeighbor.cy - elem.cy;\n const dz = nearestNeighbor.cz - elem.cz;\n e.cx = nearestNeighbor.cx + dx;\n e.cy = nearestNeighbor.cy + dy;\n e.cz = nearestNeighbor.cz + dz;\n if (state.overlapWithSibling(e)) {\n // try the opposite direction first before giving up\n e.cx = elem.cx - dx;\n e.cy = elem.cy - dy;\n e.cz = elem.cz - dz;\n if (state.overlapWithSibling(e)) {\n // we may need to hop twice in the opposite direction\n e.cx = elem.cx - 2 * dx;\n e.cy = elem.cy - 2 * dy;\n e.cz = elem.cz - 2 * dz;\n if (state.overlapWithSibling(e)) {\n e.cx = oldX - dx;\n e.cy = oldY - dy;\n e.cz = oldZ - dz;\n }\n }\n }\n } else {\n e.cx += e.lx / parent.lx;\n }\n } else {\n // a loner\n e.cx += e.lx / parent.lx;\n }\n const lang = { lng: state.language };\n if (!state.overlapWithSibling(e)) {\n if (\n parent.type === ObjectType.Foundation ||\n (parent.type === ObjectType.Cuboid && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\n ) {\n if (Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n } else {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n } else {\n // TODO: For other surfaces, handle out-of-bounds errors here\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n }\n } else {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n }\n }\n }\n break;\n case ObjectType.Sensor:\n case ObjectType.Light:\n if (e.parentId) {\n const parent = state.getParent(e);\n if (parent) {\n e.cx += e.lx / parent.lx;\n }\n if (e.cx < 0.5) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n }\n }\n break;\n case ObjectType.Polygon:\n const polygon = e as PolygonModel;\n for (const v of polygon.vertices) {\n v.x += 0.1;\n }\n polygon.cx += 0.1;\n state.elements.push(polygon);\n state.elementsToPaste = [polygon];\n approved = true;\n break;\n case ObjectType.Cuboid:\n e.cx += e.lx;\n if (state.elementsToPaste.length === 1) {\n const getAllChildren = (el: ElementModel) => {\n const res: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === el.id) {\n res.push(e);\n switch (e.type) {\n case ObjectType.Cuboid:\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Roof:\n res.push(...getAllChildren(e));\n }\n }\n }\n return res;\n };\n const child = getAllChildren(elem);\n const elementMap = new Map(); // oldId -> newModel\n pastedElements.push(e);\n elementMap.set(elem.id, e);\n\n for (const c of child) {\n const parent = elementMap.get(c.parentId);\n if (parent) {\n const newChild = ElementModelCloner.clone(\n parent,\n c,\n c.cx,\n c.cy,\n c.cz,\n c.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...c.normal];\n }\n pastedElements.push(newChild);\n elementMap.set(c.id, newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elementsToPaste = [e];\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(e.id);\n state.selectedElement = e;\n } else if (state.elementsToPaste.length > 1) {\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += cutElements[0].lx;\n state.elements.push(...cutElements);\n state.elementsToPaste = [...cutElements];\n pastedElements.push(...cutElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n approved = false;\n break;\n case ObjectType.Foundation:\n e.cx += e.lx;\n if (state.elementsToPaste.length === 1) {\n // When copying from an existing container, elementsToPaste stores only the container.\n // So we have to copy its children and grandchildren as well. This differs from the\n // situation of cutting, in which case all the children and grandchildren must be\n // stored in elementsToPaste.\n const elementsMapNewToOld = new Map();\n const elementsMapOldToNew = new Map();\n for (const child of state.elements) {\n // technically, parentId must not be the same as ID, but just to be sure...\n if (child.parentId === elem.id && child.parentId !== child.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\n elementsMapNewToOld.set(newChild.id, child.id);\n elementsMapOldToNew.set(child.id, newChild.id);\n for (const grandChild of state.elements) {\n if (grandChild.parentId === child.id) {\n const newGrandChild = ElementModelCloner.clone(\n newChild,\n grandChild,\n grandChild.cx,\n grandChild.cy,\n grandChild.cz,\n );\n if (newGrandChild) {\n if (child.normal) {\n newGrandChild.normal = [...grandChild.normal];\n }\n pastedElements.push(newGrandChild);\n }\n }\n }\n }\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elements.push(e);\n state.elementsToPaste = [e];\n for (const e of state.elements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\n if (oldRoof) {\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of state.elements) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n } else if (state.elementsToPaste.length > 1) {\n // when a parent with children is cut, the removed children are no longer in elements array,\n // so we have to restore them from elementsToPaste.\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += cutElements[0].lx;\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n state.elementsToPaste = cutElements;\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n approved = true;\n break;\n case ObjectType.Wall:\n const w = e as WallModel;\n const step = new Vector3(1, -1, 0).applyEuler(new Euler(0, 0, w.relativeAngle));\n e.cx += step.x;\n e.cy += step.y;\n if (state.elementsToPaste.length === 1) {\n const center = new Vector3(e.cx, e.cy, 0);\n const vrx = new Vector3(e.lx / 2, 0, 0);\n const vlx = new Vector3(-e.lx / 2, 0, 0);\n const euler = new Euler(0, 0, w.relativeAngle);\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n for (const child of state.elements) {\n if (child.parentId === elem.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elements.push(e);\n state.elementsToPaste = [e];\n } else if (state.elementsToPaste.length > 1) {\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += step.x;\n cutElements[0].cy -= step.y;\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n state.elementsToPaste = cutElements;\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n approved = true;\n break;\n }\n if (state.elementsToPaste.length === 1 && approved) {\n pastedElements.push(e);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(e.id);\n state.selectedElement = e;\n }\n }\n }\n });\n return pastedElements;\n },\n\n pvModules: {},\n loadPvModules() {\n const pvModels: PvModel[] = [];\n Papa.parse(pvmodules, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const pv = {\n name: row[0].trim(),\n brand: row[1].trim(),\n cellType: row[2].trim(),\n efficiency: parseFloat(row[3].trim()),\n length: parseFloat(row[4].trim()),\n nominalLength: parseFloat(row[5].trim()),\n width: parseFloat(row[6].trim()),\n nominalWidth: parseFloat(row[7].trim()),\n thickness: parseFloat(row[8].trim()),\n m: parseFloat(row[9].trim()),\n n: parseFloat(row[10].trim()),\n pmax: parseFloat(row[11].trim()),\n vmpp: parseFloat(row[12].trim()),\n impp: parseFloat(row[13].trim()),\n voc: parseFloat(row[14].trim()),\n isc: parseFloat(row[15].trim()),\n pmaxTC: parseFloat(row[16].trim()),\n noct: parseFloat(row[17].trim()),\n weight: parseFloat(row[18].trim()),\n color: row[19].trim(),\n shadeTolerance: row[20].trim(),\n bifacialityFactor: parseFloat(row[21].trim()),\n } as PvModel;\n pvModels.push(pv);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const model of pvModels) {\n state.pvModules[model.name] = model;\n }\n });\n },\n });\n },\n getPvModule(name: string) {\n return get().pvModules[name];\n },\n\n weatherData: {},\n loadWeatherData() {\n const data: WeatherModel[] = [];\n Papa.parse(weather, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const lows: number[] = [];\n const highs: number[] = [];\n const sun: number[] = [];\n for (let i = 5; i < 29; i++) {\n if ((i - 5) % 2 === 0) {\n lows.push(parseFloat(row[i].trim()));\n } else {\n highs.push(parseFloat(row[i].trim()));\n }\n }\n for (let i = 29; i < 41; i++) {\n sun.push(parseFloat(row[i].trim()));\n }\n const wm = {\n city: row[0].trim(),\n country: row[1].trim(),\n longitude: parseFloat(row[2].trim()),\n latitude: parseFloat(row[3].trim()),\n elevation: parseFloat(row[4].trim()),\n lowestTemperatures: lows,\n highestTemperatures: highs,\n sunshineHours: sun,\n } as WeatherModel;\n data.push(wm);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const row of data) {\n state.weatherData[row.city + ', ' + row.country] = row;\n }\n });\n },\n });\n },\n getWeather(location) {\n return get().weatherData[location];\n },\n horizontalSolarRadiationData: {},\n loadHorizontalSolarRadiationData() {\n const radiationData: SolarRadiationData[] = [];\n Papa.parse(solar_radiation_horizontal, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const data: number[] = [];\n for (let i = 2; i < 14; i++) {\n data.push(parseFloat(row[i].trim()));\n }\n const sr = {\n city: row[0].trim(),\n country: row[1].trim(),\n data: data,\n } as SolarRadiationData;\n radiationData.push(sr);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const x of radiationData) {\n state.horizontalSolarRadiationData[x.city + ', ' + x.country] = x;\n }\n });\n },\n });\n },\n getHorizontalSolarRadiation(location) {\n return get().horizontalSolarRadiationData[location];\n },\n verticalSolarRadiationData: {},\n loadVerticalSolarRadiationData() {\n const radiationData: SolarRadiationData[] = [];\n Papa.parse(solar_radiation_vertical, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const data: number[] = [];\n for (let i = 2; i < 14; i++) {\n data.push(parseFloat(row[i].trim()));\n }\n const sr = {\n city: row[0].trim(),\n country: row[1].trim(),\n data: data,\n } as SolarRadiationData;\n radiationData.push(sr);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const x of radiationData) {\n state.verticalSolarRadiationData[x.city + ', ' + x.country] = x;\n }\n });\n },\n });\n },\n getVerticalSolarRadiation(location) {\n return get().verticalSolarRadiationData[location];\n },\n getClosestCity(lat, lng) {\n let min: number = Number.MAX_VALUE;\n let city = null;\n let distance: number;\n const wd = get().weatherData;\n for (const name in wd) {\n if (wd.hasOwnProperty(name)) {\n distance = Util.getDistance(lng, lat, wd[name].longitude, wd[name].latitude);\n if (distance < min) {\n min = distance;\n city = name;\n }\n }\n }\n return city;\n },\n\n sunlightDirection: new Vector3(0, 2, 2),\n setSunlightDirection(vector) {\n immerSet((state: CommonStoreState) => {\n state.sunlightDirection = vector.clone();\n });\n },\n\n cameraDirection: new Vector3(),\n getCameraDirection() {\n return get().cameraDirection;\n },\n\n updateSceneRadiusFlag: false,\n updateSceneRadius() {\n immerSet((state: CommonStoreState) => {\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\n });\n },\n sceneRadius: 100,\n setSceneRadius(radius) {\n immerSet((state: CommonStoreState) => {\n state.sceneRadius = radius;\n });\n },\n\n selectedElementAngle: 0,\n selectedElementHeight: 0,\n selectedElementX: 0,\n selectedElementY: 0,\n\n isAddingElement() {\n return !!(\n get().addedCuboidId ||\n get().addedFoundationId ||\n get().addedWallId ||\n get().addedWindowId ||\n get().addedDoorId\n );\n },\n\n addedFoundationId: null,\n deletedFoundationId: null,\n\n addedCuboidId: null,\n deletedCuboidId: null,\n\n addedWallId: null,\n deletedWallId: null,\n updateWallMapOnFoundationFlag: false,\n updateWallMapOnFoundation() {\n immerSet((state: CommonStoreState) => {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n });\n },\n\n updateElementOnRoofFlag: false,\n setUpdateElementOnRoofFlag(b) {\n immerSet((state: CommonStoreState) => {\n state.updateElementOnRoofFlag = b;\n });\n },\n updateElementOnRoofFn() {\n immerSet((state: CommonStoreState) => {\n state.updateElementOnRoofFlag = true;\n });\n },\n\n addedWindowId: null,\n\n addedDoorId: null,\n\n addedRoofId: null,\n deletedRoofId: null,\n autoDeletedRoof: null,\n autoDeletedChild: null,\n getAutoDeletedElements() {\n const autoDeletedRoof = get().autoDeletedRoof;\n const autoDeletedChild = get().autoDeletedChild;\n\n if (!autoDeletedRoof || !autoDeletedChild) return null;\n\n const arr: ElementModel[] = [];\n\n arr.push(autoDeletedRoof, ...autoDeletedChild);\n return arr;\n },\n setAddedRoofId(id: string | null) {\n immerSet((state) => {\n state.addedRoofId = id;\n });\n },\n\n groupActionMode: false,\n setGroupActionMode(b: boolean) {\n immerSet((state) => {\n state.groupActionMode = b;\n });\n },\n groupMasterId: null,\n setGroupMasterId(id: string | null) {\n immerSet((state) => {\n state.groupMasterId = id;\n for (const e of state.elements) {\n e.selected = e.id === id;\n }\n });\n },\n groupActionUpdateFlag: false,\n\n locale: enUS,\n localFileName: 'aladdin.ala',\n createNewFileFlag: false,\n setCreateNewFileFlag(b) {\n immerSet((state) => {\n state.createNewFileFlag = b;\n });\n },\n openLocalFileFlag: false,\n setOpenLocalFileFlag(b) {\n immerSet((state) => {\n state.openLocalFileFlag = b;\n });\n },\n localFileDialogRequested: false,\n pvModelDialogVisible: false,\n loggable: false,\n actionInfo: undefined,\n currentUndoable: undefined,\n showCloudFileTitleDialog: false,\n showCloudFileTitleDialogFlag: false,\n localContentToImportAfterCloudFileUpdate: undefined,\n\n enableFineGrid: false,\n setEnableFineGrid(b) {\n immerSet((state: CommonStoreState) => {\n state.enableFineGrid = b;\n });\n },\n };\n },\n {\n name: 'aladdin-storage',\n getStorage: () => {\n const params = new URLSearchParams(window.location.search);\n const viewOnly = params.get('viewonly') === 'true';\n return viewOnly ? sessionStorage : localStorage;\n },\n whitelist: [\n 'language',\n 'animate24Hours',\n 'floatingWindowOpacity',\n 'selectedFloatingWindow',\n 'locale',\n 'cloudFile',\n 'latestModelSite',\n 'modelSites',\n 'modelsMapLatitude',\n 'modelsMapLongitude',\n 'modelsMapAddress',\n 'modelsMapZoom',\n 'modelsMapType',\n 'modelsMapTilt',\n 'world',\n 'elements',\n 'viewState',\n 'graphState',\n 'actionState',\n 'modelType',\n 'modelAuthor',\n 'modelLabel',\n 'modelDescription',\n 'projectView',\n 'projectInfo',\n 'designProjectType',\n 'notes',\n 'user',\n 'sceneRadius',\n 'weatherData',\n 'solarPanelArrayLayoutParams',\n 'solarPanelArrayLayoutConstraints',\n 'economicsParams',\n 'evolutionMethod',\n 'evolutionaryAlgorithmState',\n 'geneticAlgorithmWizardSelectedTab',\n 'particleSwarmOptimizationWizardSelectedTab',\n 'minimumNavigationMoveSpeed',\n 'minimumNavigationTurnSpeed',\n ],\n },\n ),\n ),\n);\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);\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.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);\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.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","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n UNIT_VECTOR_POS_Z,\n} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\nimport { Util } from '../Util';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { ParabolicCylinder } from './shapes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst ParabolicTrough = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n absorberTubeRadius = 0.05,\n latusRectum = 2,\n tiltAngle,\n relativeAzimuth,\n moduleLength,\n poleHeight,\n poleRadius,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n}: ParabolicTroughModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [numberOfModules, setNumberOfModules] = useState(1);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const frontSideRef = useRef();\n const backSideRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const parabolaSegments = 16;\n const night = sunlightDirection.z <= 0;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n }\n\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\n const focalLength = 0.25 * latusRectum;\n const positionLL = new Vector3(-hx, -hy, hz + depth);\n const positionUL = new Vector3(-hx, hy, hz + depth);\n const positionLR = new Vector3(hx, -hy, hz + depth);\n const positionUR = new Vector3(hx, hy, hz + depth);\n const trough = useMemo(() => getElementById(id) as ParabolicTroughModel, [id]);\n\n useEffect(() => {\n if (trough && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(trough.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\n }, [ly, moduleLength]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (trough?.label ? trough.label : i18n.t('shared.ParabolicTroughElement', lang)) +\n (trough?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (trough?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [trough?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (sunDirection.z > 0) {\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), 0, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [rot, sunDirection, tiltAngle, relativeAzimuth]);\n\n // FIXME: This only works when the foundation has zero azimuth or the time is at noon\n const reflectedLightShift = useMemo(() => {\n if (sunDirection.z > 0) {\n const cosRot = rot ? Math.cos(rot) : 1;\n const sinRot = rot ? Math.sin(rot) : 0;\n // how much the reflected light should shift in the direction of the receiver tube?\n return (\n (-focalLength * (sunDirection.x * sinRot + sunDirection.y * cosRot)) /\n Math.hypot(sunDirection.x, sunDirection.z)\n );\n }\n return 0;\n }, [sunDirection, rot, focalLength]);\n\n const focusPoint = new Vector3(0, reflectedLightShift, focalLength).applyEuler(relativeEuler);\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength).applyEuler(new Euler(-euler.x, 0, -euler.z));\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n\n const poles = useMemo(() => {\n const array: Vector3[] = [];\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\n const i2 = numberOfModules / 2 - 0.5;\n for (let i = 0; i < numberOfModules; i++) {\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\n }\n return array;\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\n\n const moduleLines = useMemo(() => {\n const array: LineData[] = [];\n const dy = ly / numberOfModules;\n const t0 = -lx / latusRectum;\n const dt = (-2 * t0) / parabolaSegments;\n for (let i = 0; i <= numberOfModules; i++) {\n const line: Vector3[] = [];\n for (let j = 0; j <= parabolaSegments; j++) {\n const t = t0 + j * dt;\n line.push(new Vector3((latusRectum * t) / 2, -hy + i * dy, (latusRectum * t * t) / 4));\n }\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, numberOfModules, latusRectum]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const detailed = elements.length < 50 && moduleLines.length < 10;\n const radialSegmentsPole = detailed ? 4 : 2;\n\n return (\n \n \n {/* draw front side parabolic cylinder */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n\n {/* draw back side parabolic cylinder */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n\n {moduleLines &&\n moduleLines.map((lineData, index) => {\n return (\n \n {detailed && (\n \n )}\n {(index === 0 || index === moduleLines.length - 1 || detailed) && (\n \n )}\n \n );\n })}\n {detailed && (\n \n )}\n {detailed && (\n \n )}\n\n {/* absorber tube along the focal line (focal length = latus rectum / 4) */}\n \n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 &&\n poles.map((p, i) => {\n if (i % 5 !== 0 && !detailed) return ;\n return (\n \n \n \n );\n })}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(ParabolicTrough);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Circle, Cylinder, Line, Sphere, useTexture } from '@react-three/drei';\nimport { AdditiveBlending, BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n TWO_PI,\n UNIT_VECTOR_POS_Z,\n} from '../constants';\nimport {\n ActionType,\n MoveHandleType,\n ObjectType,\n ParabolicDishStructureType,\n ResizeHandleType,\n RotateHandleType,\n} from '../types';\nimport { Util } from '../Util';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { Paraboloid } from './shapes';\nimport GlowImage from '../resources/glow.png';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst ParabolicDish = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n structureType = ParabolicDishStructureType.CentralPole,\n receiverRadius = 0.25,\n receiverPoleRadius = 0.1,\n latusRectum = 2,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius = 0.2,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.25,\n showLabel = false,\n locked = false,\n parentId,\n}: ParabolicDishModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const frontSideRef = useRef();\n const backSideRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const radialSegments = 32;\n const depthSegments = 8;\n const night = sunlightDirection.z <= 0;\n\n const hx = lx / 2; // lx and ly both represent the diameter of the dish, so they are identical\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n }\n\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\n const focalLength = 0.25 * latusRectum;\n const positionLL = new Vector3(-hx, -hy, hz + depth);\n const positionUL = new Vector3(-hx, hy, hz + depth);\n const positionLR = new Vector3(hx, -hy, hz + depth);\n const positionUR = new Vector3(hx, hy, hz + depth);\n const dish = useMemo(() => getElementById(id) as ParabolicDishModel, [id]);\n const glowTexture = useTexture(GlowImage);\n const haloRadius = receiverRadius + 1;\n\n useEffect(() => {\n if (dish && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(dish.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (dish?.label ? dish.label : i18n.t('shared.ParabolicDishElement', lang)) +\n (dish?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (dish?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [dish?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (sunDirection.z > 0) {\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\n return new Euler(\n Math.atan2(r, rotatedSunDirection.z),\n 0,\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\n 'ZXY',\n );\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [sunDirection, tiltAngle, relativeAzimuth]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n const detailed = elements.length < 50;\n\n const wireframeLines = useMemo(() => {\n const array: LineData[] = [];\n if (detailed) {\n // draw rim lines\n const outer: Vector3[] = [];\n const inner: Vector3[] = [];\n let angle, cos, sin;\n const depth4 = 0.25 * depth;\n for (let i = 0; i <= radialSegments; i++) {\n angle = (TWO_PI * i) / radialSegments;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n outer.push(new Vector3(hx * cos, hx * sin, depth));\n inner.push(new Vector3((hx * cos) / 2, (hx * sin) / 2, depth4));\n }\n array.push({ points: outer } as LineData);\n array.push({ points: inner } as LineData);\n // draw radial lines\n for (let i = 0; i < 12; i++) {\n angle = (TWO_PI * i) / 12;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n const line: Vector3[] = [];\n for (let j = 0; j <= depthSegments; j++) {\n const dx = j === 0 ? 0 : (j / depthSegments) * hx;\n line.push(new Vector3(dx * cos, dx * sin, (dx * dx) / latusRectum + 0.01));\n }\n array.push({ points: line } as LineData);\n }\n }\n return array;\n }, [hx, latusRectum]);\n\n const tripodLines = useMemo(() => {\n if (structureType === ParabolicDishStructureType.CentralPoleWithTripod) {\n const array: LineData[] = [];\n let angle;\n for (let i = 0; i < 3; i++) {\n angle = (TWO_PI * i) / 3;\n const line: Vector3[] = [];\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\n line.push(new Vector3(0, 0, focalLength));\n array.push({ points: line } as LineData);\n }\n return array;\n }\n return undefined;\n }, [hx, latusRectum, structureType]);\n\n const quadrupodLines = useMemo(() => {\n if (structureType === ParabolicDishStructureType.Quadrupod) {\n const array: LineData[] = [];\n let angle;\n for (let i = 0; i < 4; i++) {\n angle = (TWO_PI * i) / 4;\n const line: Vector3[] = [];\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\n line.push(new Vector3(0, 0, focalLength));\n array.push({ points: line } as LineData);\n }\n return array;\n }\n return undefined;\n }, [hx, latusRectum, structureType]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 3;\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength);\n const focalPoint = new Vector3(0, 0, focalLength).applyEuler(relativeEuler);\n\n return (\n \n \n {/* draw front side parabolic dish */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicDish;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n\n {/* draw back side parabolic dish */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicDish;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n\n {wireframeLines &&\n wireframeLines.length > 0 &&\n wireframeLines.map((lineData, index) => {\n return (\n \n \n \n );\n })}\n\n {/* receiver at the focus (focal length = latus rectum / 4) */}\n \n \n \n {/* simple glow effect to create a halo */}\n {sunDirection.z > 0 && (\n \n \n \n \n \n )}\n {(structureType === ParabolicDishStructureType.CentralPole ||\n structureType === ParabolicDishStructureType.CentralPoleWithTripod) && (\n \n \n \n )}\n {structureType === ParabolicDishStructureType.CentralPoleWithTripod &&\n tripodLines &&\n tripodLines.map((lineData, index) => {\n return (\n \n \n \n \n \n \n );\n })}\n {structureType === ParabolicDishStructureType.Quadrupod &&\n quadrupodLines &&\n quadrupodLines.map((lineData, index) => {\n return (\n \n \n \n \n \n \n );\n })}\n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 && (\n \n \n \n )}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(ParabolicDish);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst FresnelReflector = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n tiltAngle,\n relativeAzimuth,\n moduleLength,\n poleHeight,\n poleRadius = 0.1,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n receiverId,\n}: FresnelReflectorModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [numberOfModules, setNumberOfModules] = useState(1);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const fresnelReflector = useMemo(() => getElementById(id) as FresnelReflectorModel, [id]);\n\n useEffect(() => {\n if (fresnelReflector && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(fresnelReflector.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\n }, [ly, moduleLength]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (fresnelReflector?.label ? fresnelReflector.label : i18n.t('shared.FresnelReflectorElement', lang)) +\n (fresnelReflector?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (fresnelReflector?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [fresnelReflector?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = parent?.rotation[2];\n\n // TODO: how to get an updated version of the memorized receiver\n const receiver = receiverId && receiverId !== parentId ? getElementById(receiverId) : null;\n\n const receiverCenter = useMemo(() => {\n if (receiver) {\n if (receiver.type === ObjectType.Foundation) {\n const foundation = receiver as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\n // convert the receiver's coordinates into those relative to the center of this reflector\n return new Vector3(\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\n );\n }\n }\n } else {\n if (parent) {\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\n // convert the receiver's coordinates into those relative to the center of this reflector\n return new Vector3(\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\n );\n }\n }\n }\n }\n return null;\n }, [parent, cx, cy, cz, receiverId, receiver?.cx, receiver?.cy, receiver?.cz]);\n\n const shiftedReceiverCenter = useRef(new Vector3());\n\n const relativeEuler = useMemo(() => {\n if (receiverCenter && sunDirection.z > 0) {\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 = rot ? new Vector3(Math.sin(rot), Math.cos(rot), 0) : new Vector3(0, 1, 0);\n shiftedReceiverCenter.current.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 sunDirection.z < ZERO_TOLERANCE\n ? 0\n : (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.current.x += shift * rotationAxis.x;\n shiftedReceiverCenter.current.y -= shift * rotationAxis.y;\n const reflectorToReceiver = shiftedReceiverCenter.current.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 const sunDirectionClone = sunDirection.clone();\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n sunDirectionClone.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n const delta = (sunDirectionClone.y / sunDirectionClone.z) * receiverCenter.z;\n shiftedReceiverCenter.current.x -= (shift - delta) * rotationAxis.x;\n shiftedReceiverCenter.current.y += (shift - delta) * rotationAxis.y;\n return new Euler(0, Math.atan2(normalVector.x, normalVector.z), 0, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, receiver?.cx, receiver?.cy, receiver?.cz]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n\n const poles = useMemo(() => {\n const array: Vector3[] = [];\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\n const i2 = numberOfModules / 2 - 0.5;\n for (let i = 0; i < numberOfModules; i++) {\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\n }\n return array;\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\n\n const moduleLines = useMemo(() => {\n const array: LineData[] = [];\n const dy = ly / numberOfModules;\n for (let i = 0; i <= numberOfModules; i++) {\n const line: Vector3[] = [];\n line.push(new Vector3(-hx, -hy + i * dy, hz));\n line.push(new Vector3(hx, -hy + i * dy, hz));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, numberOfModules]);\n\n const baseSize = Math.max(1, Math.min(lx * 5, ly * 5, (lx + ly) / 16));\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n\n return (\n \n \n {/* draw the upper side of the reflector */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.FresnelReflector;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n\n {moduleLines &&\n moduleLines.map((lineData, index) => {\n return (\n \n );\n })}\n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 &&\n poles.map((p, i) => {\n const radialSegments = elements.length < 100 ? 4 : 2;\n return (\n \n \n \n );\n })}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(FresnelReflector);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport { HALF_PI, LOCKED_ELEMENT_SELECTION_COLOR, MOVE_HANDLE_RADIUS, UNIT_VECTOR_POS_Z } from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst Heliostat = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius = Math.min(lx, ly) / 20,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n towerId,\n}: HeliostatModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + Math.max(hx, hy);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n\n const heliostat = useMemo(() => getElementById(id) as HeliostatModel, [id]);\n\n useEffect(() => {\n if (heliostat && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(heliostat.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (heliostat?.label ? heliostat.label : i18n.t('shared.HeliostatElement', lang)) +\n (heliostat?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (heliostat?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [heliostat?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n domElement.style.cursor = handle === MoveHandleType.Default ? 'move' : 'pointer';\n }\n }\n };\n\n const noHoverHandle = () => {\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = parent?.rotation[2];\n\n // TODO: how to get an updated version of the memorized tower\n const tower = towerId && towerId !== parentId ? getElementById(towerId) : null;\n\n const receiverCenter = useMemo(() => {\n if (tower) {\n if (tower.type === ObjectType.Foundation) {\n const foundation = tower as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\n // convert the receiver's coordinates into those relative to the center of this heliostat\n return new Vector3(\n foundation.cx - cx,\n foundation.cy - cy,\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\n );\n }\n }\n } else {\n if (parent) {\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\n // convert the receiver's coordinates into those relative to the center of this heliostat\n return new Vector3(\n foundation.cx - cx,\n foundation.cy - cy,\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\n );\n }\n }\n }\n }\n return null;\n }, [parent, cx, cy, cz, towerId, tower?.cx, tower?.cy, tower?.cz]);\n\n const relativeEuler = useMemo(() => {\n if (receiverCenter && sunDirection.z > 0) {\n const heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.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 return new Euler(Math.atan2(r, normalVector.z), 0, Math.atan2(normalVector.y, normalVector.x) + HALF_PI, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, tower?.cx, tower?.cy, tower?.cz]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n const baseSize = Math.max(1, (lx + ly) / 8);\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 4;\n\n return (\n \n \n {/* draw the upper side of the heliostat */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Heliostat;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move handle */}\n {selected && !locked && (\n {\n hoverHandle(e, MoveHandleType.Default);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 && (\n \n \n \n )}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Heliostat);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\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 {\n ActionType,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n TrackerType,\n} from '../../types';\nimport { Util } from '../../Util';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { getSunDirection } from '../../analysis/sunTools';\nimport RotateHandle from '../../components/rotateHandle';\nimport { UndoableChange } from '../../undo/UndoableChange';\nimport i18n from '../../i18n/i18n';\nimport { LineData } from '../LineData';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { PvModel } from 'src/models/PvModel';\nimport { useSelected } from '../hooks';\n\nconst SolarPanel = ({\n id,\n pvModelName = 'SPR-X21-335-BLK',\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n tiltAngle,\n relativeAzimuth,\n trackerType = TrackerType.NO_TRACKER,\n poleHeight,\n poleRadius,\n poleSpacing,\n drawSunBeam,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.1,\n showLabel = false,\n locked = false,\n parentId,\n orientation = Orientation.landscape,\n}: SolarPanelModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const rotateHandleType = useStore(Selector.rotateHandleType);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const pvModules = useStore(Selector.pvModules);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n camera,\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [faceUp, setFaceUp] = useState();\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const tiltHandleRef = useRef();\n const pointerDown = useRef(false);\n const oldTiltAngleRef = useRef(0);\n const newTiltAngleRef = useRef(0);\n const solarPanelLinesRef = useRef();\n const ray = useMemo(() => new Raycaster(), []);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const panelNormal = new Vector3().fromArray(normal);\n const pvModel = pvModules[pvModelName] as PvModel;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = poleHeight + lz / 2 + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Cuboid:\n const { pos, rot } = Util.getWorldDataById(parent.id);\n if (Util.isZero(rotation[2])) {\n cx = pos.x + cx * parent.lx;\n cy = pos.y + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, cz * parent.lz);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = pos.x + v.x;\n cy = pos.y + v.y;\n }\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\n cz = poleHeight + lz / 2 + parent.lz;\n } else {\n cz = pos.z + cz * parent.lz;\n }\n break;\n }\n }\n }\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const radialSegmentsPole = elements.length < 100 ? 4 : 2;\n const solarPanel = getElementById(id) as SolarPanelModel;\n\n useEffect(() => {\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n solarPanelLinesRef.current = [];\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n }, [orientation, pvModelName, lx, ly, lz]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n setShowTiltAngle(false);\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n useEffect(() => {\n setFaceUp(Util.isSame(panelNormal, UNIT_VECTOR_POS_Z));\n }, [normal]);\n\n const labelText = useMemo(() => {\n return (\n (solarPanel?.label ? solarPanel.label : i18n.t('shared.SolarPanelElement', lang)) +\n (solarPanel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (solarPanel?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [solarPanel?.label, locked, language, cx, cy, cz]);\n\n const euler = useMemo(() => {\n // east face in model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_X)) {\n return new Euler(HALF_PI, 0, rotation[2] + HALF_PI, 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_X)) {\n return new Euler(HALF_PI, 0, rotation[2] - HALF_PI, 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Y)) {\n return new Euler(HALF_PI, 0, rotation[2] + Math.PI, 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [normal, rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = getElementById(parentId)?.rotation[2];\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\n if (sunDirection.z > 0) {\n switch (trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\n return new Euler(\n Math.atan2(r, rotatedSunDirection.z),\n 0,\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\n 'ZXY',\n );\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), lx < ly ? 0 : HALF_PI, 'XYZ');\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n return new Euler(tiltAngle, 0, Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI, 'ZXY');\n }\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }\n return new Euler();\n }, [trackerType, sunDirection, tiltAngle, relativeAzimuth, normal]);\n\n const normalVector = useMemo(() => {\n const v = new Vector3();\n return drawSunBeam\n ? v\n .fromArray(normal)\n .applyEuler(\n new Euler(\n relativeEuler.x,\n relativeEuler.y,\n relativeEuler.z + rotation[2] + (lx < ly ? 0 : HALF_PI),\n lx < ly ? 'ZXY' : 'XYZ',\n ),\n )\n : v;\n }, [drawSunBeam, normal, euler, relativeEuler]);\n\n const poleZ = -poleHeight / 2 - lz / 2;\n\n const poles = useMemo(() => {\n const poleArray: Vector3[] = [];\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\n const sinTilt = 0.5 * Math.sin(tiltAngle);\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\n for (let ix = -poleNx; ix <= poleNx; ix++) {\n for (let iy = -poleNy; iy <= poleNy; iy++) {\n const xi = ix * cosAz - iy * sinAz;\n const yi = ix * sinAz + iy * cosAz;\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\n }\n }\n return poleArray;\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const rotateHandleSize = (baseSize * 2) / 3;\n const tiltHandleSize = rotateHandleSize;\n\n const degree = new Array(13).fill(0);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n\n const texture = useSolarPanelTexture(\n lx,\n ly,\n pvModel,\n orientation,\n solarPanel?.frameColor,\n solarPanel?.backsheetColor,\n );\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n const renderTopTextureMaterial = () => {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return null;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n };\n\n const renderBotTextureMaterial = () => {\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n };\n\n return (\n \n \n {/* draw panel */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLinesRef.current &&\n solarPanelLinesRef.current.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n\n {/*{!selected && }*/}\n \n\n {/* draw rotate handles */}\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && (\n \n {/* rotate handles */}\n \n \n \n )}\n\n {/* draw tilt handles */}\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && Math.abs(poleHeight) > 0.1 && (\n <>\n {/* ring handles */}\n {\n hoverHandle(e, RotateHandleType.Tilt);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n setShowTiltAngle(true);\n if (hoveredHandle) {\n useRefStore.getState().setEnableOrbitController(false);\n pointerDown.current = true;\n const sp = getElementById(id) as SolarPanelModel;\n oldTiltAngleRef.current = sp.tiltAngle;\n }\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {}}\n onPointerUp={(e) => {\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltAngleRef.current,\n newValue: newTiltAngleRef.current,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n }}\n onPointerMove={(e) => {\n if (pointerDown.current) {\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 if (tiltHandleRef.current) {\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n const parent = tiltHandleRef.current.parent;\n if (parent) {\n const ov = parent.position; // rotate point in world coordinate\n const cv = new Vector3().subVectors(p, ov);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const touch = 0.5 * solarPanel.ly * Math.abs(Math.sin(angle)) > solarPanel.poleHeight;\n if (!touch) {\n const wr = relativeAzimuth + rotation[2];\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle *= sign;\n updateSolarPanelTiltAngleById(id, angle);\n newTiltAngleRef.current = angle;\n }\n }\n }\n }\n }\n }}\n >\n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n )}\n\n {/* draw poles */}\n {poleHeight > 0 &&\n faceUp &&\n poles.map((p, i) => {\n return (\n \n \n \n );\n })}\n\n {/*draw sun beam*/}\n {drawSunBeam && sunDirection.z > 0 && (\n \n \n \n \n \n \n \n \n \n \n )}\n\n {/*draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(SolarPanel);\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);\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.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 });\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\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 const groupMasterId = useStore(Selector.groupMasterId);\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 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) {\r\n return;\r\n }\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 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 state.groupMasterId = null;\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 selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n if (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 }\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;\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 && !groupMasterId) {\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 && !groupMasterId) {\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 if (baseGroupRelPosMapRef.current.size > 0) {\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 setElementPosition(grabRef.current!.id, p.x, p.y);\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 setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Lower:\r\n x0 = p.x - sinAngle * hy;\r\n y0 = p.y + cosAngle * hy;\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Left:\r\n x0 = p.x + cosAngle * hx;\r\n y0 = p.y + sinAngle * hx;\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Right:\r\n x0 = p.x - cosAngle * hx;\r\n y0 = p.y - sinAngle * hx;\r\n setElementPosition(grabRef.current!.id, x0, y0);\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,iVBORw0KGgoAAAANSUhEUgAAACIAAAAgCAYAAAB3j6rJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHACYiC1wBMwAACO9JREFUWIXNmGuMlFcZx3/nvJeZd+47Ozt7v7HLsgsUSClLS7lKAdvai7GlRtuaNCYa4wVjTdXULwb9Yoxo75rGorVpLSIBKa1QDRVIaUspt3JZFpbt3tidnd3Z2ZnZnfdy/LCAQI02SmP/ycnznA/nnN+5Pe/zHqGU4pMg+f8GuCj9Wnc4b968WDwef9g1gp92Hfs3e15/9YmP0k5cq61paGjwNzc3f1chvp+l1EmLhnCVd9jztMDOvTv/+BmllPOxgggh9JUrV35bIR/NEdV6aQ3GSuKsaa/iyOkUmc43kNgjhUDyvoNbn955zUGEEPrq1asfsl3WTxII9ao2K5ZIcuvCSu5c1krIMig6Hjv2drJ9+w6MiV7SRtMLDfHi1//8+ydHrgnILbcsvc/F+oWtfLEeZvnKKiq57cZqbrt5Ok21SYKBIIdOdlGVjBOyDI519vHUxm0MdOyn264d0kMl605s+8kL/zXIqlWrbneU9rSj9GS/aDWT1Y3csaiG1Tc1UVeZIBwIoGuCbMHmxNkeqspKqK9Okh0vkMmOsW3Xfja/+Dzn7STDonx7VMs98v6rPz/2kUFWrFixBiPwmOvSMCinG+W1Ldy1pJ6V7dOoKY8TCljoUnC4s59nXznG/JZyll2X5JltR0iWxnlgdRtlJSFGxsbp7PqAn214koGRIkdSpR8Mv7mh7j+CrFq1/IaiCv9aKPu6Ia1Fq2qcxd1L6ll+QwMViTjhoAXK4+3jPby8u5PdR4b4IDXJjx6cy53t5fxw47vseG+U2XVB7llcx103NxGPBEhnsjzz7O94a/9bntBZsn3Lln3/Mo6sWbO8teBFfqt5vuvTWp1W1zKPLy5pYMn1DSTjMSJBP0XbYfe7Z3h5dyf7jg8z6UpClklJRCAFOJ6LrgniYT/nM4qfbj7Fpj3nuHdxPXcsmsYj677Ca6+3yU2bt7wGhK8AWbp0aaNnRp/XlW/hmF6lNc68nodWtHDTnFpKYxEiQYtcYYLte0/yhzfOcOB0Bg+NkOXHLwUgKDpQdDwkUJh0mHQUJUGBz7gI1MGmPedYu7SBzy5ZzBNPPBmCC5G1vb29IhAIPaoZ/q/m9QqtaVY7X1vZxg0zqymNRQhbPkbG8ry46wib/t7FsXNZpGYQDPgRQuB6gmzBQXkulVFBfTJI0YV5TSV0D6cYGJ1ACA3LbxAL+xnIePz4pZPseT91aRF0gFAotE5IbXndgrXa3bfMZX5rBbFwiKBl0p/K8OKuY2zZ101HXx7TNAmHAiggX/RwbJvSsMaNs2Msm1PBwrYKyhMxjnR084XVc3jwVp19R3t5/WAvBzrSDI056LpOKOBjaMy5EiQcja6d0dKafPg7dxML+jFNna7eFL/a+h7b3uymO1XE8plEwgEmbY9MrkjEkiyYFmbJdeUsmllBfWUMXdOZsD08JdCkhqcEiXiMu5ZGuH1RM2d70+w92svuwwO8c3qUwoS89LHTAfLj443rvvUNkokop7vO89JfT7D9rV7OjzoELJOA5aNQdBDCo7UqyOJZZSyeXcn0mhL8PpOJokvRASkh4DewXdA0yWA6i+X3URLyIYWkoSpOY1UJn1s6nePnhunozbDx+GUgAHnX4AdP/Y2d7/YxklOYpoGmKxzHpiHpZ1FbJcvmVNLWUEo44KfoKJRSKMBnSNLZAgdO9tPRM8LalbOIBk0e/9N7vNOZZ0FLnDnT4rTVlVCXDBMLWyycVcvCec1s3HAVyLrHd3PwTAa/oaEJj2RYsXBGkmVzKpnbVEZpNICnBBfDjuc59AyOcfjMMO+cSnHsXIYz5wskwhr3LG9FoPCUoCftMPD2IFv3DxDyS2oSfmbURJjTGGfBzOorzwhAJlekMqpzY1uc5XMqmN9STmVpGE3TUErhui4jYzk6ekY5eDrFgY5hOvrHGRl3QUj8po7f7yMSkHieN1WUwtQlIUubglfQNWRzsm+Qzfv6aSw/fSkzuwTyvc/PpaUmSlNlDGlouEWb8fwEvak0R89OzfpI1yg9qUkKDpi6hs/QiQR1lALHU+QKLmOGg1IKhECXiqI9ScbVQAgMXcPQJWHLwFUGjicxrwa5ffEswGY4NcqJcykOnBrkQMcwp/rGSY87KKZmbZo+dENhOx65CRulPCxDkIiYzKsPM396HMvvYzCd4f7Vs7nnU5KOnjQdPRnODmTpGy6QHi+SnVDgScquBtl76Ayv7DvNobNpugcL5IsKw9AxdYnPNLEdl8KkjS0V0YBGY5mf5qowM2qiNFdHqSuPkIgGsPw+HE/ieIpkPEJtdQWL5jWA45ArTJDOFOgbznK2P0vfcI4dz10FsmHTIfYdHyYSNAGJEC6OXcQUkmTUpCEZYXp1mBm1MaZVRqhKhIgG/RjGVBe241GYtBlIZdB0A00K0pkcAWsUy9QxDY2g5ScYClBbU8bCuQLQ2fHc+itBJm0XXbrE/B7VpRbNVWHaaqPMqC2hoSJCIhZAN3WU45HNT5LOTtA1MMZAOk/fcI6eVJ7eVJ5TvVnuvKmWB1ZO4+mth9l1eJSaRIB42CQR8VEW9ZOIWSQifqrKIh++NV++rZWopTOjNkoi4kPXJYUJm6FMga7zWfYc7adnaJyeVJ6+dIGhTJHRnE1u0sNxFQiJJiW5CRvPEwg8io5H/6jLSD6H647jeh6gEIAUkIjoWFeDrG5v5lTXAHuPDdDZO0r34DgDI1MDjuUdCrbC9UBKiaZJdCnQNR3LD4J/ynFdTEOglEITU8HOMjWuluMJ3MtSoUsg3/zlLv5yoA8pBB4CKSS6JtG0i75C10ApUMrFccB24GJipQCUIpObxHU9NKlRdFxGsnmK9pUgAnA9cExB6GoQgSJi6UQDJlKCJsSUlQJdCjQp0LQLvibRNYF+wRoXfEMT2K7H3KYE2QmXm2dXM7OpBl2TCCEQgBBTBQSWT+ex9S9dCfLol5Ywnp9A16YG1KS4ACMv1aWUU1YI5FVWXPSlxENyunuA9rktVCRKPrQtl+ux9ZetSCAUPffQ/ffW/9sWH5OisZJzcA1/Of9XfWJeA/4BXtiyCkQf29YAAAAASUVORK5CYII=\"","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,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==\"","/*\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 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.groupMasterId = null;\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.groupMasterId = null;\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.groupMasterId = null;\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.ifNeedListenToAutoDeletion(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 state.groupMasterId = null;\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.groupMasterId = null;\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 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 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.groupMasterId = null;\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.ifNeedListenToAutoDeletion(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.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 updateColor = (value: string) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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.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.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 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.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 {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.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.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.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 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 {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.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 setLz = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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.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 updateAzimuth = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QsYFRUL0qow9wAAHIFJREFUeJxdXEuPJGl1PfHFF++MiMzKzO6ahxkkYMF4hHdIhsESC2TZ3rPlH7IyG7OxZXnAgDzCg2TPjJlWj7qnqyuz8hXv1xdeRJ5bUZSEhq5HZsT97j3n3HNvpPXLX/5yBIBXr14hSRKM4wjHceD7Ps7nMwAgSRJEUYS3b99iHEfw6/b2Fvv9HsYYKKXQ9z2iKEJd12iaBo7jYBgGNE0Dz/NgWRaKokAcx7AsC19++SV+//vf4yc/+Ql+9KMf4bPPPsM4jijLEn3fIwxDtG2LKIpwc3ODb775Bn3fY7PZIMsyhGGIYRiQZRmSJMHxeEQYhqiqCp9//jmeP3+On//858iyDHd3dyiKQn4OAFpreJ4H3/dRVRWOxyMAYBxHeJ4n1x7HMYIgwG63w2effYa+7/GLX/wCDw8POJ1O2G63KMsSeZ5Da41xHGGMwTiOUEohiiKM44i2bWGMgW3bGIYBxhicz2cEQQDP81BVFdQ4jkjTFL7voyxLNE2DpmlwuVygtYbjOFBK4eHhAbZto2kaDMMAAHjz5g3atoXrumjbFkopXC4XGGPkwizLksOxbRs3NzewbRvjOMK2bRhj0Pc9XNfFYrGA1hq+72O5XGIYBvi+D9u2cXd3BwBPvl/XNdq2heM4qKoK6/UanuehrmsURQFjDBzHwf39Peq6hud56LoOtm1DKSVB2+12uLu7Q5qmcr+e58HzPKRpKvdQ1zXqusYw9BJQ13Xl+77vI45j3N7ewnEceU8eRl3X6LoOWmtEUYSmabBcLqGUQl3XWCwWUJZlXd9keHIxPNWmaZBlGYZhgOd5WC6XkkFKKTnA1WoFrTXSNJUqsm1b/qYsS1RVJRmyWq0Qx7FUDgDkeY6yLAEA5/MZXdehKAr0fQ+tNZbLJTzPw+l0wuFwkJur61oCbFkWfN+H7/vo+x5d18m1LxYL2LYN13UxDAOWyyUAwHVd+L6Ptm2x2WyQpqncl9Yafd8DABzHQde3GMdB4mSMweVykeSrqgpZlqHrOriuK6jAr77v5TqZgKvVClEUTYmitUbTNCjLEpZlwbZtWJYlAbRtG0EQQCklQY7jGFprLBYL3NzcQCklQR3HEXEcwxgjbxwEARzHQdu2yLIM4zjicsmw3+/gODbCMJCS5wHN4dN1XRhjcDwecX9/D621vNc4jkiSBAAk8KxQy7JgjMEwTAEchkGqHoAELssyRFGEruvkNYdhwDiOOBwOKMsSy+USQRDAsiz0Qy9IwIPSWku11nUNrTXCMJQqDcMQrutiHEfUdY0sy+TflmVJpSnyBW9Kaw3btuVg2rZFURSC1Xyzy+WCpmkkew+HA+q6RlVVkl1ZlgnENU2DIAgQRREAoG2nrG7bFmVZYhgGydwgCKRisyzDbreT92HGsUr55TgOWO2Xy0Wy0nVdPH/+XGCNP1ssFgKznufBcRyM44iHhwcYY+B5HsIwhFIKvu9fEwAI/AC2miCvLEsopRAEgcAgoc2yLEkW27ZxPp/Rti1WqxVc10XTNFLhYRjCtm20bQvN0orjWLKC+M6LGoZBcN73fblIx3FQFAVs28ZyucTpdJILS9MUtm0LTG02G1iWBaUUjsfj9TUC9L2BbWvEcSJV2Pe9XEMQBHBdVw7PdV04jiPwQwI1xuBwOCCOYwAQuCFH8HUvl4twRRzHGMcRWmsYYxBFkZB+GIY4nU6SHN988w0sS8FxPBRFIYnb9z2CIECe55Iky+USxhg8PDygLEsRPbwG8lhZlvB9Hw8PD1BKQWsNPQwT05/PZyiloJSa2P76AlmWoe97Kbs8zyUQx+MRZVnCdV3J8rZtEQSBvCnhkDDWdR3KskRdN+i6Fo5jo65rnE5HwXtmFyHg4eEBbdsiDENRbGVZ4nA4AAC22y32+z3O57NAQRRFaNsWlmVhtVqhbVukaSpkXBSFEKsxRriLnNF1HYwxWK1WAn273Q5NU8OyFGzbRhiGGMcRRVFIslAAMCnnScrqJ4/Zto3j8SiJDgD6D3/4LfJ8Ug78w77vUdc1zuez4DhVkjEDjBmvnKNgzADbtuUFu65DEASoqgpd18FxHAkiVZVlWVcCnHjq669foq4nZQeM6PsOStlwHAfGGGRZhqqqBFaYaX3fw/M8vHz5ckb+DqJFJMqubVvhiWEYBIqJ5QAQhiHIpVRnfd8jTVNRkJTIfT8AsAS2edB1XUsSsVLJOUwycjQFjO/7WCwWkrxhGEL/+c//h6ZpES0WGI0lN9q2Lfq+l6qZvqbyJon3fQcAkvlFUcCyLHieC2MGtG0Py1JQasL2iQRHaK0wjhaMGXF7+y7G0eB//ve/oW0PjuPCcRRgKfSdwTgaUWbEfEKr53kiJ33fh9YORvS4nA8YhhHPnz+TimcfBQBRFMlh9X0vvREPLI5jZFmGsixxPp/RNA2iKMLhcIAxPcZxqiBWv+u66LoOXdcJx7IKtdaiBMnJrBBK6zdv3ohq1T/84d/io48+gud5aJpWLgoA6rqWLJy+N0nKCd+nSpoOppdA/elPf8Kvf/0v+P73v4+PP/4Yxkwqghk4ZSigtXNVQAbG9GjbBlo7cBwX/lVp2dpB09RSGZfLRZSJ53mibKiqbK3Rdy3atsWvfvXPguu+70uVUl6+fPkSNzc3uLm5wfl8lp6CPLNarUQgsBdi32JGI5VVFIXIbqUUNpuNCAg2gBROxhg0TSOwPgwD9vu9iJ6u66A//PAjfOc738XxeMRiMUlXqgWqDAaezSMlZhzHUEqJXI3jGF9//TWqqsZ2+wwffvjXePnypWQwBQN/lxfd9z2yLIdSFqIoQlXV2GzWwmW2bctNn04n4SMmCwAEQTAJD8fB4XCE43gYBiN8UhSFqBp27ABwOBygtcYwDAIdfd8L9r/zzjvSh0x9gwPX9YRvmKy+7wtv9X0vvRer++bmBqfTSSQ4eZC8w7jrpqlxf38vQSVZEttc10VVVcIlhChqdWbv8XjE6XRCXdditRwOB3z11VcStCzLYNu2ZMw4juj7XvqHYRhwOp3gei7yfPrdLMvgOA7KshTNrpTC4XAQJchgUZ2RLwgRhBPeS1VVwnPkFPIfJfEwDCiKQjKfjedU0dP/CD/snZqmEe4kP9zf3wukMyEneNUCW3Q+0jSFIvPzl7uuQxRFEijCDcuWJMeLprIhYe33e+k9pszP5EAJhQCExNq2FSijhh/NdFBUQOxR2E2XZSnX/PbtWyHUvu8lW/l3xHpyBwM5jiOWyyXCMEQQBE/6LR4Qk4gHMx3EIL/j+74oSpL2MAxYLBa4XC54eHgQTias27YtjsQ8Qbqum0QJIYkBTNMUfd/LH9BWWS6XUsps+YmH5BFWTlVV8nfvvvuuZGQYhpIphEEGidn5/PlzSYjXr18jCAKxQajkGGD2KJP6eVSJk6yun8hM3vRmsxHviDzJXoYwRgkfx7GIBgDX6w1Ri/QFiqIQaKVYeOTK6YDY91wuF+R5LhVGEcAe6+HhAZplblmWGIqUpvw+Jd4wDAjDEJ7niXXw7NkzWJaFPM+lj6ASm1sEAKTXod9FC4Qle3t7K/YKMLnM7G2oqGjjKKVmqs4T2fv+++9jGAYJ6ryDpqOwXC6htZYkUEqJymLPwSRjU8qDnUzNStBkGAbc3t4iz3OcTicYY4Tj2MmzeSbsswL53kmSSKuhCB/kBgadPg0xP4oiIfg8z+UAKBvpOVEIMFA0KHe7nRAcu3c2aaxQVhcPLggC3NzcSLNWFIXwAy16qjti8W63g9ZaIE1u9HqItEfyPBflxevlv9mXBEGA4/EIy7JwPB6vwVSwbQeOqwWm2eXzOs7ns1g95BMeQhiGIkbCMJSkY6LqiRStJ/pZKSWVQGyl18/DW6/XItcIF/yivCNvuK6L1WolPEWb33Ec0eK8eMIGYYn4bIxBkiTI81xuiFzAbB6GQWYxtFh4PTyMMAzh+z5Op5NcH+16KiMeMi0a/n8aruM4QlkKXddBKSU9DT2x3W4nfiChnEnNVoJynffGAtDGDKiq6kllMJjkhDAMUZalqBWtNeI4xuVyETfXsiwxEz3Pg+u6cojsHZjZ5CC6rQwcFQjtFR5OnudIkgRdNzWidFdZZZfLBbZtY7FYwLIsnE4naWZp8LEn4f3R1qDym8PenB83m43I9jRNJVku5zNOpxPO5/OT17YsSzwyNsPH41Fg6Xg8imXCaiGfXB0BF841wAyObdsoikJwd+7T0AqvqkoqgxeSpilWqxW22y3SNEWSJDgcDuj7HnEci6lIxbJareSQ8jwHMA2gbNuW96UcZP/DQyPe02ejlKbp+OrVK/m5bdtI0/SxsbsGSSmF999/XzKf1cP7ocNNHhjHEY52UNcV/vXf/hVt08K5JtvpdBIzk4qOVczXpZ3ftjWACSZZXfw7bds2un6ShovFAlVVyS9QKRBeqB6qqhJIYNA4B6CaYYZQBlI80EbgeJP/pZJiMAhjlKm+74vkjqJI5iI0IOfN3WRWnnBzc4O+71FVFfb7vfx9kiRi7c8PoKoqeV9KfUJLFEXY7XbT/SqF13ffwAZg2xqWZQtcMtnYCkyNsAtjeliWvsahF+uIfRL7Kz0M/dUknOxi3hwJmdzAselkAD52xuQI8gJn03wjYJpJnM9nIVBKS3bPJDT2GOSW/X4vymQ++9jtdjKypYJar9cyo+a0kUKBiVTXtVQfG1raI2maQmv9xPXmgU4cZCEMI6TLFL3p8A//+E9YJgnO5zN8PxA+JRzz/Sk8jBmmeUoQwJgBStnycwD44x//iE8//RTacRzR+mmaSsCovXnhDC6DShXEalgsFlitVnjx4oVUQpqm0gQtFosnVTEMgxwyv8dEYKYHQSAwxXmBUkp+xoaRMDon+6ZpAYwIglDI+XA4yMw9CAJxI9iEUmCQkEnwRIdJjSm4jotv/9W3UNcNjub0ZKpZFIX0XFSp5ERWW1GUorI4KicP64nlBwk6tX7TNI8e/bVfYANGO5pwxi5+mhc0T8a58y6eSsW2bSRJgqIoUBSF9CUM9mR0TkqJ2Uyrm4GZb6SwStq2xXa7RZI8zsQpramUSNo0Ddkn8feiKBJSP5/P2G63qKoKZVmjritpBLOr9H/9+rVUIHsoKqrj8Yg4jgVZKK9p2SwWC9nMkU0YXjQ7bmYYCZGnR26gZUBrmSVHeCNEsOdgkOmVsTrmFXA4HJAkCZIkwf39vchHQiLhkD0FD5xB4KrOvCHsuhZKTc5y0zQ4nU6SYOQOztI59Ztb4fzdt2/fwrIsrNdrVFUJ256qhPcUx7FskzDA3EmgQKI4olNBu54/m/dsWiklZLder4UvmHVz4p53zSxrYjLtlXlnS38njmPkeS6NE5XRvNls2xb39/dCtlQs+/1eOOQvO12Ogxk8Y8xV53cz83KQpOJ9cZWobVucTie5ThJ5HMdPumsiBPmSipOctdlsZNQ9H0LNhQl7Ktd1xWGoqkpkepZlEx0wU1imrAT2Jcx49hP0XShR33vvPSFcNnMcTxI2CDHkJB7c3d0dqqrCs2fP5LVJgnRQaeDND5rBJwwFQYA4jiUQStkIAg+W9biOpLVGkiQIwxBxHKMsS0ksJiU3YoqikBkJq4WbNlSStObfeecdqUyiBOF8zr10DTj25piYPp84D4QhboPMZe7cZs/zXMaoNzc3QmDsIdI0FfzlMIm+Fm1q+mWctD2SXCE9Ducr8zk3m7lJoRiRljx8YwzyPJcgVFV5VVhGKoGTw67rcDgcBDYZrLkHR1OSiRQEAS6XC47HI5qmFXX28PAgvhuFAQBRj0QJcjMXQ+I4FlTiYVM8KRpwVVXJBbG8uTLDvoGnTO3fdR2Ox6P4TyRG3uRisRCBYNs21uu1OMnslmnLzGGQuM4ehEHiMGm+3chDYsPH18+yHHXToOs7gV/yYp7nUsVJkmC73T6ZlG42G3zrW98StURoYjV6nivTQF4ntxypqnjtc7EwFyN0r58/fy7WyTiO0PwDBoMBnEMWs5SkROzjmLMoCuz3e0RRJDBDH4fVsdvtxLSjI8DGse/76yrMRMKcq3Dkmuc5nj17JuYiK5k3zCkgBYasgroucN0sLMsSSZJI01bXNaIokp6FSdD3Pd68eYMkSWTgRni0LIVh6J84FPMhEw+Uh80+iNYNk4JJzyRnZSulJtlLguVos21bwUn2HfMmkSqMK0I8LJKe1hpffPEFvv76a5G9QRBIFZHcWcJKKZzPZ+n+aXQSClhtPHx6QJSM9MKIy1ReZVXhP3/3O5Hj4wg0TS1TTS7dsQmkkTrtX2kJIPd7z+cT9vsHkeKcCM5XlCzLws3NjaAHZ0p0xMdxFKOVCpPzlL7voZm1dV3LkJ/VMjcbaavUdS3eEbGc2+zsBYARL168gDEjgFEymofBbJANEjPAdhQCP4LWjiQACb4oclRVfQ28QV23oox4Y3NeUcqCdhS6vsV/fPLvuGIo6vpxjHp39w1sW8G2Jy/q9evXsKxpBcnzwicrp23bwvMdDEOPtq0RJ2tkWS6NLBO4qipZqKArQKXGVVL+HquGCxqO46Lvh6kP4QuQAElqLFVKNs4xeHDc72WHzL2k0+mEH/zgb/DjH3+MrmulL2GXTAnN709elncN7uM+LhUQAByPB/zmN79FGPr4+OO/E0zmdRFCCLuOo+FojX7mCEzj3PZqdi4k4FNX/3io89G1yFdHo2s7fPLJJ/jyy8+vwffE9qEhywkj+xomCQUMH30g7M8Vmdb2ZC6ya5w3gpR/1OSUZ3meSy/CiiCRRVF0LW/ggw/ex/e+9128evVKFI4xBovFQhojThW5iv+X2y3U/FprkZXPn7+Dn/70pzJXYCB5Y3QChmHa6SKWD8MAx51WjAgt9OCYFIRSKiAuoM8X6aIogu+HSNNEeIyynw7v/f29xJIN4DAMYmpSmW42G3GKpwXEfhrhMmOpoflvkhVJkx0rSbkoCnFLWWFTB+8CmCTuV199JQ0Zs48QN4emy+UispRGIecEnK14nofVaoW+7/Hy5Ut5XZIoq4WQyudHuFhNG55zGwaHhiq5jJ4WD5drtBw5UIXSJmHr4DjOk20Yjq6BaXzNBnocR0RRJPc1oYAFx/EmUmfnS+iiTGOpcZbMtck8z59sl1PG2coW4m+aDk1Ti+LhwZPskiRBEASyqxQEAbbbLQCIy8sJJV+fDSthlJ07l5ZpFDLInINzkMbAENYIo+TQuSPBzOb8hb8PAJfLRe6H3DhfKORUFMCTpvVyuchzKhRFnITa9lShar4uwxJkCc+/uOBWFIWoIR4ap4iu50LbGsYMcFyNvjcCTXO7I4oilGWJ/X4vlUIFwoOmYnMcB0mSiAXBnoevt9vtBM6iKJKbZSbOx86ERlpErCwOxyjTwzDEer0We4SNY9u2T1ZBeRBsB8hVbLTZUpRlKQ8chWEo/RCfsJpbUJqlTvLijcydXCoqqixO5TiQCcNQhkKP3fWAIPDFfGNfw2VmBoCSlgfLAdJ8jEzbhjY4q2K+H0b5yoAxWITX+bI375cOLKufNjq5jZzHHoKjbl4/k4iQNued9XotXMKhGUcQFD9z6cvxuJqCZwR/ecIsWZIu1dd8sYEkTB4IggDKnrri0Uzyc75SRPuDM/nVaiUw43mePOpACU6DkDc5f1yB1zGf21C1jOMoK6TzkQHhhONYXjM9Ls4m2BvQEmdDycRgMnEwVlWVuN9pmmK9XkvVEV3Yp7AR5QDvcDhIC9C2LRQlIwmHN8wDoK1C1zYMQ8k4qg9uYlAQABZc14NlKVEnjuPIev9isZAb4EIAK3QuoanueA3sS6gEb29vZXJJlTRvwuYTOUIwvTWOeOu6xt3dnag6PvDD96EDMJ9/i81xXdQgJNV1LaTOmHLzPkkSpGkq83Uufc8X9FzXnVTWfGrGdRpucDOj54c0d3O5Luo402zEup425xae54kqIQazy7ZtG5vNBvv9/smTTeQ0ztE5ZmWfwerkTXF2QiudTxWT/Lm4FkURLpeL4Dg9JwoTQhMPY7PZ4O7uTjhjvqVIqD4cDgJBfGRvt9sJx9A1YNLZto3T6SRx4XYklZ5+8eIrvHlzh7u7N1dOsDAMRm6I3hMAhFGIoiyhYMnPWL7L1QpDN+Bhv4dSgG0rMQ65RsTlCGPMkwdJyVHsDchj3Bzk4dCyIfzREGUwzuezyEnu/yZJIlw3fyx5GAY8PDxI/zNfvpgc40qeLM6yDKvV6smDS77vy4yH2zNEEooAJhdNT+4jkM84wyeEDcMA/emn/4WqqtG2HdquggUFy3rcZJyywULXNWjaDsrWsMZJ7rmejb4bEIYxwjDAaAy0BXz72x/g3ffekdkFrWiS4dwvox1Ngp/b6YQG13XFeSUEmatpOF/I2G63WCwWOJ/PTxwEQkOe5wJxXF5jQ0vr/NmzZyJeuq6TVSYmheM8PpxDQp+7CvwvVSlVH9+PaMG5ymazeeIb6p/97O8Fzxn8abXFEhUy4XN/Dagl3TOl58QTk4Q7Hg74/IsvcDycEYUHyXSSJO0WQt5+v5eJH6XpXMEwc9ikEWKoxOaPvbHsufxGJ4EZz8oTmT6rxjmPUvXxZ9vt9nof3XVD/rGnGsdpNZUP6pC36JqTX9nUch7ExpsHIT3Rer3BBx98IJ04yZGjTvYRE1FpDEMvm/DDMK3H5HkOx9lcV4kOOB5Pkv3U3PNGK89zsVBYwnSFeTN0AlgB886bHljXddhutzIocxxH1ngACOSw0jiFpHDhpglXSOfqi8nBe58grZLDmHMOl8QpsQlfhE4as4wBuY+DOl7X5XKZnjGcT/RoWfDfc1k7Dxi/KDP5Zm/fvhWVQWjhkCmOY3kyiUGyLEuq4nK5yAYi5x609ck5c17jwSwWC+mZeFB0rQlri8VCzEjK07n1QplNTKe9w8Z5giV9dW2nAHKNiCNupZQ8dkfeXK/X8ngEK4/9FQ+aEGiMgZ5vcTBz2GkSamiwMXBcAyKhknD5PUo5ZgIDNh98EQ548XNYohohgQ7DgPP5IgGkYuFcns7vvMoByKICOWOeWFz/IS/RIeA9kej5RW6YEsOSpKFoqetaJDMPh1YQZTnVKat8bojy40AUg88sYjdJ+TtfcGYQ5pYJFQ8t+fnDMlzNZCZxFYcykrBwOp2kyRrHEefzWT51gYvTvu8BGK+4bxDHC5k9EPZ446wCruXwfSi7KUfn1jizlAt0c5nPQyQfsHlm0wtAGjvGrG1b+ViOJElErHDgRwTiKNfzrp8GtFwun6yP0gzMskyynxMz3jgVAx8z4DPt8033vn8kLc7C+QA/AJGnDCBn9wCkCQuCYLbYYF0PnQ9mDuIEc+DFj7Hg/TBQtMfn8Dj3uigIkiQRw4/bKYQrStfpAB/dBd4jexkeLH/edZ18UgP5hUlkWZYcFmWyZsNDe4Lyc7VayQyD2TRXEGzYuBlPpcK9JK0fOYifrkNl0bat7FtxjZUZtl6v8fbt2ydrpRNB38B1PSg1lTw/LipJEtlc50iVfJFlmay7MpnY71BG03WgWuNg6XGca4lfRhKm2OAzNPNBGhvWuV0y77fYLDNWRA55pp3LBF3X4XK5CLzwBanH50P8+fZHWZaS7fzAM9tWGMceVVnJtgazgnwxH0zVdY2yLJGmKfb7vdwgG6nlcinNHw+btjlvmFv7DB4f7OFQqe973N3dIQxDbDYbHA4HmfF7njc933d1ZAnX7Fn47+12Kw4ELRf2J1yBZVz4wW488K7rZAOfbcP8SQOKg/8HHM2xxesLNnYAAAAASUVORK5CYII=\"","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) {\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 updateTexture = (value: FoundationTexture) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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 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) {\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.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 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 {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 needChange = (absorptance: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (apertureWidth: 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.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.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 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 {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 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.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.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 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 {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 needChange = (chimneyHeight: 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.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.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 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 {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 needChange = (chimneyRadius: 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.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.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 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 {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 needChange = (collectorRadius: 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.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.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 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 {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 needChange = (collectorHeight: 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.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.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 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 {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 needChange = (towerHeight: 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.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.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 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 {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 needChange = (towerRadius: 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.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.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 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 {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 needChange = (absorptance: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (transmissivity: 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.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.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 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 {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 needChange = (coefficient: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (emissivity: 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.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.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 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 {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.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.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 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 {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.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.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.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 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 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 \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.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.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 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.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 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 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 \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.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 setLz = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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.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.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 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 setAzimuth = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 // 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 \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 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) {\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.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 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 {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,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QsaEigCbtge4wAAIABJREFUeJxVnNuvJVly1n8RsVbm3udUVVd1V99nembsGbBlg22QLeQ3SxiQECAhJN75w3jmnScLmYvAFojBWHgwM8Zuz326e7qqursuZ+/MtSJ4iNi7h5ZKXZe982SutSLii+/7IuX//s//Gt/+9n/njdff5L333mfMwRyD3hpBYKbs+xmPYLGOO4QABCJC4IQHiIAYKsLcTliv7+vCnBP3SYQjGqh0fDrrsjDmABEiBqrGPnZUG0tfWHrnv/zRH/PL3/omjx7eI0IgIHzS2koI7NsOMhFVTBoRAQQqikeAKJDfEVV8TsyMCHB3FEGaINpgTMYcWFPmdMIH1joAvTV+8uMf8fTz5/zmb/4G23nDCYhARAFn3zeWfsDxvA8PRv08UcHnJCLyzwgRjrsTBL2v7PuGqihPnjxjAH0xwFl63oSp4TFRM3prTBFcApGgNUOtASAiNGs0CQzHloUgUDVQUFVEjGU5IDRUG713wgMTAcnPhjuqRmtGxGSOM88++xyfgllHVYDA2gKSi6waNO2YGogjCiKKtoYQeB0GUUFU0NbwcDwckQCDiMDHIARCnDnz88vhiFkDUawbr84nfvbRz+nLARHFEGIOPBzThXU55jU8oM7o0hdMG90OqBi9dSIiD6AZgSL17KaCWu8MD3x6XsRh+CDCQQAndxNBVTAVnCAcfAxaWwhgzkEg7GNgYgiKWcPHwGPkqQhAAo+ZJ0sFNUMxYk6k9TzJgIjR+gqmiACh4BmF7g4RgCKqBOAzELHc2HDG2EEMU8EUCGeMDer6KoJay0ecjpjgDJr1XGxRFMnrRK4NYexjEO74nBCOiqIiDB+IGooioogIIo05Jngwx0YEzOkAtLbiY6CmNGtELg6Kf5lyIhzp+ZAiMN3Jr1dYBpkGAMcRFSIydV3+PkJwMhXs+8YcA3eYcwcVCKmToCDB9IEotPWIBjRbiOn4HAhCt86YO7gDGU1BMB1UFAlDTTEziMv9aEZTONProElGWRB4eB2EINwRgZiDZo2575gpQbCPgVbKExH2cQbVfIy5I9Zp/YAESDgewZwjN1s1o4Vg3zcCEFMiApVcmwjAHd93JMBDaOvhQGuNdekcDwvzbmddFgTBXVAJQoLwelDxys2Gap6uoUJrBgiHw4F9DPqq4IGvkjnb/Zr6JCqFNMP3iZhhankaAeaOWqd3w0y5Od5yOKzsPjLkZz4olYdFFMGJ2gDpSu+NOQbb2CCE3nsukueioQqhtKWjmdwAYblnzJm1R0TAA8I5HG9oXVnXzmFRtsPCPjesr/T1FmJmEPXGHBtSEbhLHtRM20pYpSgJ8InPwNQIcVZdaN/9P9/lhz/8EfuYvHrxnOETiZknzBZ8H8TcmO6odtw33CetHbIoVXEEvZ6MLMxU6GqGuINIoJDhbooAiCESuSCJFup0C9N3/vy736X3zpO3H+MuxAxs6bjvQOCX6B4TsYaPHRBEYfpEwrHWGGNDxBDtSEycmb/3yLoyZ0ZgTEQazZQxTgVWOsva+PDDH/GDn/yMP/2z73A+bfiYeDi9LczINN/7wvl0zuhRwcPZ9xPWVlSMfWxV45Sx7ZUujW4LPs+01lc8hOV4y737D9lHPijh9L4yhjP3l5j1DH+9X2GniDTACZ+AETjTJ0cJVLJ4NmuZN0UhHFPNFKiKj50ZE8FQs8xKOGYdRDAc7bfc3H+Nm9sHqC2MMRDNkNcsDvgI1DICLnVvjBMakpEUA7FHELlJZlw339rC8J2+LMSMTHnOFRQgwb5Pbu/d5/bBZ/SfP+PRo7e4O91BZJxGbaqK4L6zHgfWO00zWtwnaj1rIcK+n7GmQMsIlEC1owrtax+8yzvvvM6vfOuX+KVvfJXT6S6/KJlfFUPMmGPPWjETdV3qhoggaOZOTahpZqgoUUVvzoS82nrWBs1UYK0x50SrflnrjLHnBmlwPKz87+99j1/++td56/Ej3Lc6xTBnYMuCRNUBs6wFkVA0YfZkTqf3A4jgY6/PQIgkNAY0gpAEL2rGHBuqLQ+aAijHdeWLzz/lxfOnvPv2G5xPOyOiFjkzoPuse0u4nM8FRKCmjDnpvXE+n2mtQaXQPNACKG2OiYhx9/Ilp7sT+z7yprk8TCf2cc3VKsI+JoIjYnjVFvdReFyY0wsEVJ4ETBtjnuu01Ibtg23fK7UF5lWTfGftndN5Z+wb235m7BsewZh7Hgo1tj3Tk5mhHplC50A0oxFR9jGZsWEiTB8oZI1bjuxsyKWCzIloQ+dk3zfMJk2NMQZqnX0f7NsAlOHOBHo7MGfWi3BHZcGZVR8EV81UGU4MpbXG6XQiIjif96o7iViXdUGARlV8mtLXzpyesJRGb3FFNpJHgOGBaQMUj4kjqCeyCAwIYg5CJ6qtPg+B4179xgxcA5rUycjFlLqmFsJbpSWsjUuK2xIKt7rezKjKh6poVcHnYPpkXVaW1hlzEpdDQNDakgV+zir0k94PzHCQfL7shQpKF9JsLRdV1UAGY94xN0ebMX1PCKyGqWYUVqS4T2RKoUentZYABMVQJBeI6RPNLjox9tw3PBLqKYpKNWMSCAZYRUUeflNLBKUG0hCyRrS+QGR6s6aFxx1VSRit+YhEYM2uuXXMjWDmDZOpz7xytGb04TO72zEx1epZBBHwMQnPKGpiiGSxFipYyT5gjp1tv8tNppCZSX7O8558OlLgILcDpo/s7kWZ+0g43AsdOmjrmZoRYGZUjx0VAZnYsqDSEuWh/189NWl062iuRYactRVRYfpMDK3Bvu/VFHl15B0zQTThYXgUvndCEuOPsdP7kv0MyoyJ9X59SA+n9YWY+ahJsST0VSILtwgegxDPfmIOBNi2LXH/pTa5M7cdRNBmqHa6LogIY9sS/WmiP7nk/GpGs/6BWmOOvQqwfxmVIhnRRDaRIkzPTr61XvVholaJhGCOnX3br9B5jJ193xFVxtzRli3AGDM3dWbT6ATb3NDwoPWW0HDfiOms65q7WigJyZuO8PyMZ+Fs1rFCT0T2mRF5mt2rT5hefA+guQBCFjIzqU1qIJIQmUwJQsFpEbQ6fxFjWY+IZT1ofQURWmu5QZ5RqNYS1VThJCSpkZj0tmSzJ9TPEZiTmPldUYh56Wn27O5FmKOa3DlZ15tEhXPkc0c2usmxLbRlwVqjL2uhv4aQNVXwBAwxsdZovQMJgJo2VM0wyRsRBdOsI4lWMsVky7+hqkWf5MIPH4wrjUHVlajwnsVTCa31BAFMkORs3AfDdzQ/gvuo/iVTTUTSJ3PmRlpr9WMqxFvPgwDsc2T608z7IcGMmfUAYewDbZ3WVwJY2kLv67V2QaabC2gJZkL4fRBzMPaN1nqmqjGZc2ffz5maBaxZRozAZLJtd8QczLlXlEmhwI57ECKsyzGj15R1bYQ7EaDJOE7m2H6BlRyJLhNuZccqCfCzb6nTlAk8Hx6Ss2qZCkyVMQZOXv/CavqcBTkNKUgdc4AHrXWIic8dUUPCOZ/vGPvOmJ70iM8k9Hywn0+oWOL9fVQtSd7NrCGRvJu2hpii1pn74Hy+w+dMngmyDjKJSPY4PAlL1QahSJAR4qPgbaLOCDBRfN8Z+84cEysS9QL/zXq2CeHE3DBrrEuuIQ6n84kxPCmncLT3JTvYpLVQEfp6uHa5l/+a5QkZ2wnEiOzhUATf57UIx5wV3luxwUXThyPSEhW5Z8iqFpckieIIRBtBUg1eNLqaYWSxRoSxnZK87AsRs/I9SVAWwedjolIR406MceXsRC1h+fBEfHGJhmyGhUwXAdkzXYgaMfq6IiZ5MH2y7yfGHHnPkvVh+iz2OnLzxryyGV7UTSI1qhYXRS9K+0XyLSKYEVgES+/V6ORCjn1DxZJqZoArZp19nFBLRjXZS0M0ubBMCRlFEnl6iUgE11oyxtW/hAfgV7olkQQZHedTkY1azZ0V6Ve1QSTTmhlz7oyxZ9NZUJTqmRLVZUc8t3OyVwLhyUxnSjZG9V2mClXPhIzgbTsVxPYEHUiBgygQI4jPL6mgi3ZkC+Bs+4luHY+diPklr6Uwtg1N2jyLp5Boa9/3gpq5USqWTCVBW9bij5L5VW0wJ3NkmptzFuuaG920xCDkymvNmImQmNcI1GJoMz3mdURgXZNycNOMBs9iqNYwu9DvgWkW9QtqEtXiBR3tuVHbfqp6lzkdrQNgYJZpKZnZYPoO4qgmCyGqIMUou2cEamo7bVnxmIyxJUIt4SmbEWfW/yNGboZEpvDU0hIM+c5xvUdbDgvLstBb5+b2WBwqWfWtMTVpiQit1NXw2RljYK0hsuKHY7b/7nlaCdpywzifMzSjwG14RVP/EnWtt8y5ZZMmSkiqjPt+pi8L2hr9cMiItUbEgvtkWRbm2LO4izDnRrdEUPvcrvk9awosJoxtsKwHUGUOoXmiu7Fnx74s6/WUOx2zVA7XZWE93CAMmhnHm1vGGMn1+cC04b5ktF/5q0zFvS3sY88IbB1Emb7Tb+8xi932imDDaD/+wV/w+ZOP+dlPb+lyx3lPRXCOkTm+QjF8EjOyuSsgoNKIkGykqqtFJnPfWdZb5hgFI2f2OjPTU1/Xa9MV1YSOuVEMOGaNbWy8fHDk7uULPv7pj5B54nQ60XojXEq/IambIjXN+hU5RaTWEtOzM7fUG+bYKs1chK/Ug0STim/Wswb5zj53elvxsbGunWeffsQXn33KX//V93j+4mWCn1nycU95W7Uxi8IZc8PHRkT2M6qKWMt1nYOBJruM0LQzY0P+1b/4B/Gdv/yIfT/zz/7x7/P1D77C3d1dFUpn7ANTq+5ZGHMk/W6pI2xz1EYkbJ5jEHvWHjusiAtmicG9VMh8YM8+hKQZVIVmSoSwnc/cv3+PP/jDf8+HP/gpKsI//yf/iLcev86rly+wZYEZaOtMnyx9YY7BaTvTWwecfdvo6w3b+Q41A3da7+wlIJkI1huj0jMiWV+6ISPBw/SZ0nQzPv7Zx/zbf/efePXyzK/96rf4h//o77Pd3RE+2MZgWQoWVxOLKDOC/dWrZIGrOQ61RIRemktJCMuyQBPkX/7T34979x/jPjifXmAqGR296Gd3IrU1lt5Ry/zbe7t23glnswiOfSTErMaLoiMQIUTYTudEZuHslwKtSit9JAq+Cc7zu8HDR49QH7x8+TLFr31DLmnQnUk+TFI0+YCqyvQoPirrxAWmZp8R15TsDmNsmKUB4nQ+M/bJ2pMjK1YHd6OvN4gKnz17ys1xqUMWV6SICn1pVwbA6/tSvVESmRndw52Y2ZPNgEnV3EcPHyI46+HA9z/9hJcvX/Hg9j7aEx7GTJRipvy3//GnfPLkU47HQyp+KCJeUCV56OwnS4jyy995QkMPCmOx7Tvf/MbX+eo7b2W+tZZSbAgonLYTv/LNr3FcGoTz9Mkznr/caG0FdgLorfOd7/0FH/7wBxyPx0KEmffM8jBIszoypBhGiWUFYLK5DMYMtvPGNz/4gF/+2ge8eHGHWE+kFZMHt43X76/cbRv31pWPPnnKzf37deiMpsKzZ5/zR9/+NmYL1qxAEUjolabPjZGiaIRwmF66ypi0X/3GB/zkk2c8uH/Lo/tH1qXz+qPXsb4mERgJ+Q6tcefBB+0eDx/cT7LPKj5E0KB4H6lfiYjCrRrPpNl/+tcfcn72Kajy937r1/mNX/km53MW574eyqIz2U+vaE346Mkzbm9v+L133+dwcw+0ERNEg3VduH/viFrDx+TeW+/x1te+jhI01eqOkxxFwVE0SDuRaDZr5QCJUL54+gVvtxO/9zt/m9M+0bbQl46pQ0w+/fQTnr8687V33+O31pWb23tX+L70xvd/+GPu1ke889WvJ0ITQUtDR7XuobwACmMmNDaPtF950Kw3jscD67owcR7cf8DhcERtqUOfqaRJ8Pqb7/Nrf/f3eOPhfaK64uzGJ4qg1tPXVGEYPhOBzMm+7fTjgT/7z3/I9//kj1HrHNaVdV1ThzCjL4eyyUw6k27KoS8clwVtyvF4kw2b56KuS+f+/VsePnjA+XTmb/zW7/I3f/t3knUIpWlp5aK4QFflZjnw/OUrrBmLGef9nKjQOk8+fcLT//Ufadbo0tC2sB4WTIIx71jXlTGEtXfu33/AshxTZEJYrNPbyq//9u/yrb/1d/AxkIAYgxmDdemsx0MyxpXO9/OO9nTTbOczrTdaa8aypDFNFY43t1hfELOk3j0LreLcHG945903eeP11y6JNXuSJslJIclskhvi0+lmDJ+cTxttXbi5Ka+TFvJohhYKMU2vl6lhHGjiLK0QEWmQiNIafFTvQqM1ZfbGvQf3eO/NNxmeolFToakl5S7BsS/c3hx5+uxzXOG4LJxO5yRRW8fZ+XxZEJMEMqpJ+ElSG2opNYsls7CunRmZEbL4L7zx6BGP33iITCdUyiTorIeFe4eV8MFEWFrnxcuXKSEIvDptqAitmbCYYmJYPyRT2fuVxANBw5BQ1ttb3n/3bd56/TVEYCv9oXdLlKLKdj5T/Q5jOM2yf7m7O6PLyoPXXsu8bHqtPSpZ7rQSrVpHlpXGOZsvSwNfCJmGHDCK0CvFUJ2Hj17nq195h5hp5Rlz0tcl6Zw56a1xPKyshwVEuDmsnE/n1GqaEjH4SV8JsbwfrYMmUshMaa02REj06OB+YReUN15/nQ/efYu0xmjSK3NyPBxYesu+hWyYX9weaKqoKnennTmdlpR5NlDWrXiePJVIERiln/dl4fWHD3h07waA3R0TxQS26ay9M44r06uKRFSDJpyPK6Gd29ubfEC7cEW5wEmJJzqhkJJpqmmtZTEWcZoYk0D0QlWUS0Xg9uaGNx7cx31jUWOfM9W4QjoiyqGn21LJ3+/rwhgTVLh7dT99VpWmtZgAYZRxLopfE0TLmpgXy+dQ5d7tkdcf3E+Kx5KnmmNy6J3WixyNbJ7Xnka9EOG4OHf7mdZao2mmp74kn3MVaOLCR0XKm8BxXfKhAswT6ioQMjk0ZUZP1BCJrrx+oEhqzMuyZNdqWs6VMs5pmt2SLQ4UzwW5CEWiRMFGKTh5pc4TmHFcO+uhM8/O2tLT1YpS0bqHtSnH3mmqLKY0Ec61sce101rqJ1KHIVFAVlKrqBbJHCC1JxeVB1P60liWTkgCi1G/Lj9PVEqecJpZQWJwSyK0NVNU8we0bolILt1uoSzFrs1bb0XCFakG2RD2yMauBQzJ6ODSAKpyCpiqLC3tnum1bZhY1hPrxU81RBwJo1mA2jWd5VZkxEb9YKE2s1l22s2QXeimudGSaedi+TQVFjXMhG525bZclGYp/QWpzcfFfROBCUg9N5OyyJaOn9IRoUKzhMCoJtdWXuiMeONCmroHZuVKIdftbELzSGsQUjIncvVdXTelUlfUA5kqJld0n453vViChKZ++blJk2t2xphlTlaqh9FEKZE9z2WjuMqrcm26LvZOIG2+CFFp1Ym8thq9Up+poM6XtP6lOxfBLAt+KoRKi2CKEbXRqobXoY/IvoHqu2ImHxdVW9JX/eWfW60N5YOOyEjJA1HRJKTbsxpYRTINI7SsRcUrhV5v6JqySkpUyRMvkimqmTA8g7WpMPxqYUqqfZYfuPC4aQledVKzgAvQME3X+1U/wdEitvL6illS93UXGA5SIw7I9TOqGR0qgqtQ5DumFwBf3680ZZVKTWCx1F5y8aWU6ShA4aQApCwtU16y1VYdX+r7rTbmoj5eOn2tawpRLhYq/XG9D1WjXZQ1gXJBVBG85CKXypc5atAAE0hJi2sEaV1cS1cxqubV35koQ6TohC+j0Szdj2pfOlGydGWuvly/1SIrSVeI/0IqQBLbVwRcapYmzXytQVY94pf3K8WtyVXltIqcS7MrQc205L3jg8Ws0uXMAwZYQEQaMfJ6fMlo+wWsXO4x1++ahGvjRKBdvEymlnLktWBlLotfsGNOvwhIcl3tGlQoeFi2HAQXqU1J6Hz5TqCpRnqZ4zSygy5GGU1Tan2rNtnp0oB5jRKPHGuISB7NPVOYXPiKQnch5dasJbk4LU3SfS91UrneZ0F9UlsRBZXckFbuyHSgpE8NGXjVR2b+HhXCpUiirEO5zlxroVYal8s9VlpsVgvh6ZrGfU9mkoAZmafDkNiZ+5aaxvUkZYKxSg9WYWk4M3KRteTV4bm4Y+w8+/wl66GXzSf1cfGGhJa5wXGdhGcNGRHQyEzrW1WSxPn7dseLlyeG5+ltqgyqAEsiMYlkLqyUSKuFqTXIQxUJ1YOJ6biaNRStKNGroio16jBmmja2fcP2U0rLkhuYi0/BEE/wcs0/GXoq11KLVgaSP/g3/zqePPuMdT3y5uNHLMvK9DyJao1Q0Mhwf34aPHzzLY5rL/P1YN9H2k2jVLs5imDMFJNUdOrJc05+/sknPH/2HFHh4e2R43G5UvIqkrYboC8rL58/4yc/+5T7D17j8eOH9IuBzXqFPzz94jl3d/mdN959l0evPbg2qXNMZuRUVW9rLuIYzDmuU1AXA4YqnM87L54+5WbVZGB9sPQFxmDbzjz57DOeP3/J248f8+C1R4jBHHvp5A7aaMd73N67yfTaLGds5oTpyXsVZM9SETk9UPagMR35k//wB/Hxxz/j9uaWew9u0/nhVfNtKaTlxJws1tj2gQPtEmo+mR4sNSPHBUmEXze29c5FY2+9cXM8pod3TsaYv9D3wLxQ431hbDsfffQJD157jXu3N7TW0s4PWF+Z01mWlqdfG6eXLxnbGSz5pShdIm1DC7iz7ef0TLWF83a6wnkjCb/WWnb4y4qIsI2dGBuqxuk0ePLk57zxxhupX5STEUBa47AeefXiOaGKXjxnaojnQdB2abpTC/Fy0mzbiXW9wd1pN/fu8fM//4z15j7NGqMcESJlfylTQohkB66GioEViznLVC1KWw6pETBRXWmJGyFGFspyyd9teUpb60wmSuZlyuh2UQKPN7f8/OlTjvfu5UGhoGc4Ko3hJ/ZtMGdwOKbAtO/pkLdlRVjwMUvnB+md3oz0HwjL4YAPcrSu5km20s/TPRLMkea3w7ry6ZOf8vTzF3zjl77Jq1cvuMxOWst0tO871lfamp6v8+mUi2yNtS/M8BTnGJWncl37suIBfb1FW2s8efqEl69eZhhXwUp6oyCkJn1hfamTt6eMUA6/i+9WKg5MDCk3utWw5fTyVQnpXDFLLSLKFDC3zK0RXzaCInz88ceM6eXwS1TVD0eQmfp86Q7bdsqRM7kclJle3ytiTN1DC4DkWJoTjNRQ5qBJjtCxj/KRZSPcLCmlbd958uwz+lI0iArSpEx7lw48U+C+b7SWw60igUcewm2c00CCXW2q6d0SwjfUZxbgMVMw0asNJ2F3jJRjfd9SeDJBTGCOcm5c/FSJuDzKDEcu+vScssq5ulO6Vzw157ntGAozrkisMkDGgsDmDpKe33TltCqN+gtK4JZ6QkQaMshTj2UdCE0uLieeUt+fl6lXzVKufSVIJdL6xQZaymQh0XBhO59SPyEQadeNQNKIl8NErxJCW8eWiyNS6b2zHA5l/HBaWzFtmJY6i6DWW+keUqeCRA+hZcdUqDECHznToEWkERcZsl/FfjEpy1Ce+jHPSf4FgKGSN+gh6Xm6GsbKMGFWAywJF+d2wisiVTsXbxfh14do/YAWxTGrxU49Jptca72YgCsGvo48qGYfNrat3IkbIVrz+lsexnmZvN2K0UjKJ0eeUyb22BPGW1qD0oW/MfdZDXeNUI+ss5MgfKBi7HPPeU5tNCXoCuu6pAx69xJZ1nTDV5uTgNCr2UkFkOo/1mXN/qQljOzSy6KZvE2GexJ1F0Z0TGe1Y7nXB+tyqLxexL3kZG3vOX++9MZyaOzbwJZ8OYAG7COwZWWOEyJLOj7K3GetE/uWBbbmNkQcn2nEsGbQc2y5mWFrkpdz32mtYc0YKmSXLiy9sR6OLOtKU1AcHynzakBfF8bIMQhtHVTKEXNpPhvIIddOas5SJN07GiklxqR9+OGH/OjHP2afk307pctEKheOQVt6wbJE0dmIjbJLLkjMJBJViLGz9PQhNTtc0ZOPnAfc/UKj5GlADS4gQoUoj3CUH/hwOPD9n/yY2z/7Di9evmR79YIgeyPTctZrDnSq5oz81QhHzd6rlWRa5r0iXkRG2njIAUwkitG1SjGdMU5crmYW/OVff5+/+v5P+cYH7wPB2Hd8jiRfybmT6UJbFqQpPmrWX2oUkMgsUxxYqxG+i6pJOO32tUccb+7z9rtf5fHjt+v1DpZ1oMbPwrMQ54lVztteZupJa4aTMw6g18KdLvrL6zRAvGgTTc1cBcwWIqih+lLjW1LS7nA8LDy4/5C33/sKbzx+h7uXXxTNEMVPZb1Q6/g4JxMwS/3z1Mv7csRjlEE6QYeKsJ/ucoyh5j6Sy8vxvpyVWfKZKp12C558ccejF5P3v/I1Xrx4nqaE3olIe1Qzxcu4IJGDUNZqXEMN1cbYz3RrV/O56OWejDHPtK+89w7vv/Mu77z1mPfeeczdq7s0DXguJEFGTW1GzJwrv1g64dIMzutciE+nLwvD8/QrVGRFpY7s2LXe9KDNrgLVtp2vBbC3xjtvPeb9tx7y9psP2R8ciJrwQnMUOV30cn2XSpSDxa5esfy3HFhNU5wW7a5EjlMg9DXn2iE9VAKoPqgJYri5ueGzL77g+Ys7Hj96jcOqEGm+kwi0mlaK4bU6HKNeUtDLBTP95krRjDnIMY0c654stDmdOXd8H2w1+TN8S5TjhfnNEkJazgFS7w/xSMolh1XAYyZPhebkFXJ9G8TFzT7GGUFZ2sI+99yofZRc2mpxB8OVLp3T6cy+O2PbSaNe0iHdEkZOTS9xbu5lxsLTNRjpPofkoYZPVDuLpNZNNbCtd7bzzhiDdT1w8Zl5Tcf6GIxtcD6f2c7n/PO5DlRcXJmk/+yiPBRSTVekpNxd4EC01wFOWDL2M2oD7Ry8AAACgElEQVTZZzU8/Ug5RpacTZ6uElJGTQmVMpgbsaNk65+7nlJuRFoktUmZ49K9buWNkkuPYZrvBhHKpZ4b66TBWVRz3rH36kdaXWsk7A2u49Q5ZSTp87WLi77GB1Rpmn5dTVgFkM1vFXr3ywsGMt2nG18IzVdxiCi7J4LDnbYckJbUUfZl6cj0uraXYeKq9bCzb+eMCgU01dKcMxS0r9nItpznb5luAusL1hZsnjO0I2GnlrQoSFlBAy1KPiNgVtOZubJryxlyU/aRzZGVtgw5AixSsuUY7JEP21tPFFQjCn05ABeThF/JPpOE6WFKjKR0Ek7nfaLpQGy916hzNq046WQUGNueRTdSS/exIaWKzno7g5pCa+UnuzwfCUREywiSrYL7XnIBxZAnoeojRw5ayzcfXV9rdYEd1d9Za8Sc+D5SUw+p1xjNgp0aXOYF82B4ifqWBmpJYcEjcgaRpE9Su668TZTyaHi9IYGi0+cYNV3U0qxWnXTUXGK+xGWi61LaRqv0ktg+FygdJ1h6ZRGpYXwpoSw78rHn1FJQsqm2NIx7gpB0qeck14WKz54m3fJJ8eR8pVhOGvucnE8nWluS6a93pyRbnXUME3zmRuVLaHKASGrGRqwm5NN8kKx5b7TMlaPgmTOHV+dduy2UiFSk35pssNbpSB4rGyInxwCiXhzQer6gTCS1aq2NDKROTOVphTGh9xwxUMvR4X3b2LaNsZ9QJm1ZiQj284lm5dH1/F6QqEo8T2C+qExrVCB1E1Vl288pC0hJSZLoTsttE3MSkQYJyOKskg1sa5qvd1LJCMymBkiZIFSSUqnDmAGVB+kyFpEdfk4eIx1iZ850bnoI/w8KKWrBuLwZUAAAAABJRU5ErkJggg==\"","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,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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.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 setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setTexture = (value: PolygonTexture) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setLineStyle = (value: LineStyle) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setLineWidth = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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.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 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 {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-2]:'}\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 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.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.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 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 {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 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.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.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 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 {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 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.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.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.lx);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\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 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 {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 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.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.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 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 {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 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.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.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 if (undoableChangeAll.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\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 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 {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.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 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.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 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 {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 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.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.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 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 {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) {\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 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.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 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 {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 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.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.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 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 {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 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.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.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 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 {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 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.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.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 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 {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","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { ObjectType, Scope } from '../../../types';\nimport i18n from '../../../i18n/i18n';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\nimport { Util } from '../../../Util';\nimport { ZERO_TOLERANCE } from '../../../constants';\n\nconst SolarPanelDcToAcRatioInput = ({ 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 getElementById = useStore(Selector.getElementById);\n const getParent = useStore(Selector.getParent);\n const addUndoable = useStore(Selector.addUndoable);\n const actionScope = useStore(Selector.solarPanelActionScope);\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\n const applyCount = useStore(Selector.applyCount);\n const setApplyCount = useStore(Selector.setApplyCount);\n const revertApply = useStore(Selector.revertApply);\n\n const solarPanel = useStore((state) =>\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\n ) as SolarPanelModel;\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 inputDcToAcRatioRef = useRef(solarPanel?.dcToAcRatio ?? 1);\n\n const lang = { lng: language };\n\n useEffect(() => {\n if (solarPanel) {\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [solarPanel.dcToAcRatio]);\n\n const updateDcToAcRatioById = (id: string, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n break;\n }\n }\n });\n };\n\n const updateDcToAcRatioAboveFoundation = (foundationId: string, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n });\n };\n\n const updateDcToAcRatioOnSurface = (parentId: string, normal: number[] | undefined, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n }\n });\n };\n\n const updateDcToAcRatioForAll = (ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n });\n };\n\n const onScopeChange = (e: RadioChangeEvent) => {\n setActionScope(e.target.value);\n setUpdateFlag(!updateFlag);\n };\n\n const needChange = (ratio: number) => {\n switch (actionScope) {\n case Scope.AllObjectsOfThisType:\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n break;\n case Scope.AllObjectsOfThisTypeAboveFoundation:\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n break;\n case Scope.AllObjectsOfThisTypeOnSurface:\n const parent = getParent(solarPanel);\n if (parent) {\n const isParentCuboid = parent.type === ObjectType.Cuboid;\n if (isParentCuboid) {\n for (const e of elements) {\n if (\n e.type === ObjectType.SolarPanel &&\n e.parentId === solarPanel.parentId &&\n Util.isIdentical(e.normal, solarPanel.normal) &&\n !e.locked\n ) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n } else {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n }\n }\n break;\n default:\n if (Math.abs((solarPanel?.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n return false;\n };\n\n const setDcToAcRatio = (value: number) => {\n if (!solarPanel) return;\n if (!needChange(value)) return;\n switch (actionScope) {\n case Scope.AllObjectsOfThisType:\n const oldValuesAll = new Map();\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel) {\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n const undoableChangeAll = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays',\n timestamp: Date.now(),\n oldValues: oldValuesAll,\n newValue: value,\n undo: () => {\n for (const [id, ratio] of undoableChangeAll.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n updateDcToAcRatioForAll(undoableChangeAll.newValue as number);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeAll);\n updateDcToAcRatioForAll(value);\n setApplyCount(applyCount + 1);\n break;\n case Scope.AllObjectsOfThisTypeAboveFoundation:\n if (solarPanel.foundationId) {\n const oldValuesAboveFoundation = new Map();\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n const undoableChangeAboveFoundation = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays Above Foundation',\n timestamp: Date.now(),\n oldValues: oldValuesAboveFoundation,\n newValue: value,\n groupId: solarPanel.foundationId,\n undo: () => {\n for (const [id, ratio] of undoableChangeAboveFoundation.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n if (undoableChangeAboveFoundation.groupId) {\n updateDcToAcRatioAboveFoundation(\n undoableChangeAboveFoundation.groupId,\n undoableChangeAboveFoundation.newValue as number,\n );\n }\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeAboveFoundation);\n updateDcToAcRatioAboveFoundation(solarPanel.foundationId, value);\n setApplyCount(applyCount + 1);\n }\n break;\n case Scope.AllObjectsOfThisTypeOnSurface:\n const parent = getParent(solarPanel);\n if (parent) {\n const oldValuesOnSurface = new Map();\n const isParentCuboid = parent.type === ObjectType.Cuboid;\n if (isParentCuboid) {\n for (const elem of elements) {\n if (\n elem.type === ObjectType.SolarPanel &&\n elem.parentId === solarPanel.parentId &&\n Util.isIdentical(elem.normal, solarPanel.normal)\n ) {\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n } else {\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n }\n const normal = isParentCuboid ? solarPanel.normal : undefined;\n const undoableChangeOnSurface = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays on Surface',\n timestamp: Date.now(),\n oldValues: oldValuesOnSurface,\n newValue: value,\n groupId: solarPanel.parentId,\n normal: normal,\n undo: () => {\n for (const [id, ratio] of undoableChangeOnSurface.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n if (undoableChangeOnSurface.groupId) {\n updateDcToAcRatioOnSurface(\n undoableChangeOnSurface.groupId,\n undoableChangeOnSurface.normal,\n undoableChangeOnSurface.newValue as number,\n );\n }\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeOnSurface);\n updateDcToAcRatioOnSurface(solarPanel.parentId, normal, value);\n setApplyCount(applyCount + 1);\n }\n break;\n default:\n // solar panel selected element may be outdated, make sure that we get the latest\n const sp = getElementById(solarPanel.id);\n const oldValue = sp ? (sp as SolarPanelModel).dcToAcRatio ?? 1 : solarPanel.dcToAcRatio ?? 1;\n const undoableChange = {\n name: 'Set Solar Panel Array DC-AC Ratio',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: value,\n changedElementId: solarPanel.id,\n changedElementType: solarPanel.type,\n undo: () => {\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.oldValue as number);\n },\n redo: () => {\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateDcToAcRatioById(solarPanel.id, value);\n setApplyCount(applyCount + 1);\n }\n setUpdateFlag(!updateFlag);\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 close = () => {\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\n setDialogVisible(false);\n };\n\n const cancel = () => {\n close();\n revertApply();\n };\n\n const ok = () => {\n setDcToAcRatio(inputDcToAcRatioRef.current);\n setDialogVisible(false);\n setApplyCount(0);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)}\n \n }\n footer={[\n {\n setDcToAcRatio(inputDcToAcRatioRef.current);\n }}\n >\n {i18n.t('word.Apply', lang)}\n ,\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={close}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {\n inputDcToAcRatioRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={ok}\n />\n
\n [1.0, 2.0]\n
\n {i18n.t('solarPanelMenu.DcToAcSizeRatioExplained', lang)}\n
\n \n \n \n \n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\n \n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\n \n \n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\n \n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\n \n \n \n
\n \n \n );\n};\n\nexport default SolarPanelDcToAcRatioInput;\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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 setReflectance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setAbsorptance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setOpticalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setThermalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 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.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 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 {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.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 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.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 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 {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.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 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.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 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 {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.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 setReflectance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setAbsorptance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setOpticalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setThermalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setStructureType = (type: ParabolicDishStructureType) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(type)) return;\r\n switch (actionScope) {\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 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 {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.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 setPoleRadius = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 setReflectance = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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\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.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 setReceiverId = (value: string) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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\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.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 setDrawSunBeam = (value: boolean) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 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.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 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 {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.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 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.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 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 {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.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 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.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 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 {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.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 setReflectance = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setDrawSunBeam = (value: boolean) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setTowerId = (value: string) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setPoleRadius = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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 needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 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.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.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 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.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.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.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 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.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 (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.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 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.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 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.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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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. Institute for Future Intelligence, Inc.\n */\n\nimport { Checkbox, Divider, Menu } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from 'src/i18n/i18n';\nimport { WindowModel } from 'src/models/WindowModel';\nimport { ObjectType } from 'src/types';\nimport { UndoableCheckWindowShutter } from 'src/undo/UndoableCheck';\nimport { useState } from 'react';\nimport WindowShutterColorSelection from './windowShutterColorSelection';\nimport WindowShutterWidthInput from './windowShutterWidthInput';\n\nenum ShutterSide {\n left = 'left',\n right = 'right',\n both = 'both',\n}\n\nconst WindowShutterSubMenu = ({ windowId }: { windowId: string }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const setApplyCount = useStore(Selector.setApplyCount);\n\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\n const [shutterWidthDialogVisible, setShutterWidthDialogVisible] = useState(false);\n\n const lang = { lng: language };\n\n const window = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === windowId) {\n return e as WindowModel;\n }\n }\n return null;\n });\n\n const selectShutter = (checked: boolean, side: ShutterSide) => {\n useStore.getState().set((state) => {\n for (const e of state.elements) {\n if (e.id === windowId) {\n const w = e as WindowModel;\n if (w.shutter) {\n switch (side) {\n case ShutterSide.left:\n w.shutter.showLeft = checked;\n break;\n case ShutterSide.right:\n w.shutter.showRight = checked;\n break;\n case ShutterSide.both:\n w.shutter.showLeft = checked;\n w.shutter.showRight = checked;\n break;\n }\n }\n break;\n }\n }\n });\n };\n\n const addUndoable = (checked: boolean, side: ShutterSide) => {\n let newLeft = window?.shutter?.showLeft;\n let newRight = window?.shutter?.showRight;\n\n if (side === ShutterSide.left) {\n newLeft = checked;\n } else if (side === ShutterSide.right) {\n newRight = checked;\n } else {\n newLeft = checked;\n newRight = checked;\n }\n\n const setWindowShutter = (id: string, show: boolean[]) => {\n useStore.getState().set((state) => {\n for (const e of state.elements) {\n if (e.id === id) {\n const [showLeft, showRight] = show;\n const w = e as WindowModel;\n if (w.shutter) {\n w.shutter.showLeft = showLeft;\n w.shutter.showRight = showRight;\n }\n break;\n }\n }\n });\n };\n\n const undoableCheck = {\n name: `${side} shutter`,\n timestamp: Date.now(),\n selectedElementId: windowId,\n selectedElementType: ObjectType.Window,\n oldShow: [window?.shutter?.showLeft, window?.shutter?.showRight],\n newShow: [newLeft, newRight],\n undo() {\n setWindowShutter(this.selectedElementId, this.oldShow);\n },\n redo() {\n setWindowShutter(this.selectedElementId, this.newShow);\n },\n } as UndoableCheckWindowShutter;\n useStore.getState().addUndoable(undoableCheck);\n };\n\n return (\n <>\n {window?.type === ObjectType.Window && (\n \n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.left);\n selectShutter(checked, ShutterSide.left);\n setCommonStore((state) => {\n state.actionState.windowShutterLeft = checked;\n });\n }}\n >\n {i18n.t('windowMenu.LeftShutter', { lng: language })}\n \n \n\n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.right);\n selectShutter(checked, ShutterSide.right);\n setCommonStore((state) => {\n state.actionState.windowShutterRight = checked;\n });\n }}\n >\n {i18n.t('windowMenu.RightShutter', { lng: language })}\n \n \n\n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.both);\n selectShutter(checked, ShutterSide.both);\n setCommonStore((state) => {\n state.actionState.windowShutterLeft = checked;\n state.actionState.windowShutterRight = checked;\n });\n }}\n >\n {i18n.t('windowMenu.BothShutters', { lng: language })}\n \n \n\n \n\n {colorDialogVisible && }\n {\n setApplyCount(0);\n setColorDialogVisible(true);\n }}\n >\n {i18n.t('windowMenu.ShutterColor', lang)} ...\n \n\n {shutterWidthDialogVisible && }\n {\n setApplyCount(0);\n setShutterWidthDialogVisible(true);\n }}\n >\n {i18n.t('windowMenu.ShutterWidth', lang)} ...\n \n \n )}\n \n );\n};\n\nexport default WindowShutterSubMenu;\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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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 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 '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 { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowShutterColorSelection = ({ 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.windowActionScope);\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 windowModel = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(windowModel?.shutter?.color ?? '#808080');\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) {\r\n if (!e.locked) {\r\n const w = e as WindowModel;\r\n if (w.shutter) {\r\n w.shutter.color = color;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateById(id, color);\r\n }\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateById(id, color);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!windowModel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).shutter.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.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel).shutter.color &&\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).shutter.color &&\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?.shutter.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 (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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).shutter?.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Shutter Color 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 string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldValuesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\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).shutter?.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Shutter Color 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 if (undoableChangeAboveFoundation.groupId) {\r\n updateInMap(\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 updateInMap(oldValuesAboveFoundation, 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 const w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValues.set(e.id, w.shutter.color);\r\n }\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Shutter Color 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 string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateInMap(oldValues, value);\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 oldColor = (updatedWindow ? updatedWindow.tint : windowModel.tint) ?? '#808080';\r\n const undoableChange = {\r\n name: 'Set Shutter Color of Selected window',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\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 state.actionState.windowShutterColor = 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 \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.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowShutterColorSelection;\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 { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowShutterWidthInput = ({ 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?.shutter?.width ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, input: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n const w = e as WindowModel;\r\n if (w.shutter) {\r\n w.shutter.width = input;\r\n }\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.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).shutter.width && !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).shutter.width &&\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).shutter.width &&\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?.shutter.width) {\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.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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValuesAll.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Shutter Width 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 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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValuesAboveFoundation.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Shutter Width 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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValues.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Shutter Width 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.shutter?.width ?? windowModel.shutter?.width ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Window Shutter Width',\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.windowShutterWidth = 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 {i18n.t('word.Range', lang)}: [0, 0.5]\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.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WindowShutterWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport { WindowModel, WindowType } from '../../../models/WindowModel';\r\nimport { Checkbox, Divider, Menu, Radio } from 'antd';\r\nimport i18n from 'src/i18n/i18n';\r\nimport WindowShutterSubMenu from './windowShutterSubMenu';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from 'src/types';\r\nimport WindowItemSelection from './windowItemSelection';\r\nimport WindowNumberInput from './windowNumberInput';\r\nimport { radioStyle } from './wallMenu';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport WindowUValueInput from './windowUValueInput';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport enum WindowDataType {\r\n Color = 'Color',\r\n Tint = 'Tint',\r\n Opacity = 'Opacity',\r\n MullionWidth = 'MullionWidth',\r\n MullionSpacing = 'MullionSpacing',\r\n MullionColor = 'MullionColor',\r\n FrameWidth = 'FrameWidth',\r\n SillWidth = 'SillWidth',\r\n Width = 'Width',\r\n Height = 'Height',\r\n}\r\n\r\ntype ItemSelectionSettingType = {\r\n attributeKey: keyof WindowModel;\r\n};\r\n\r\ntype NumberDialogSettingType = {\r\n attributeKey: keyof WindowModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n unit?: string;\r\n note?: string;\r\n digit?: number;\r\n};\r\n\r\nconst SelectionDialogSettings = {\r\n Tint: { attributeKey: 'tint' },\r\n Color: { attributeKey: 'color' },\r\n MullionColor: { attributeKey: 'mullionColor' },\r\n};\r\n\r\nconst NumberDialogSettings = {\r\n Opacity: {\r\n attributeKey: 'opacity',\r\n range: [0, 0.9],\r\n step: 0.1,\r\n note: 'windowMenu.SolarHeatGainCoefficient',\r\n digit: 1,\r\n },\r\n Width: { attributeKey: 'lx', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n MullionWidth: { attributeKey: 'mullionWidth', range: [0, 0.2], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n MullionSpacing: {\r\n attributeKey: 'mullionSpacing',\r\n range: [0.1, 5],\r\n step: 0.01,\r\n unit: 'word.MeterAbbreviation',\r\n digit: 1,\r\n },\r\n FrameWidth: { attributeKey: 'frameWidth', range: [0.05, 0.2], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\r\n SillWidth: { attributeKey: 'sillWidth', range: [0, 0.5], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\r\n};\r\n\r\nexport const WindowMenu = 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 setApplyCount = useStore(Selector.setApplyCount);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const [dataType, setDataType] = useState(null);\r\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\r\n\r\n const window = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n if (!window) return null;\r\n\r\n const lang = { lng: language };\r\n const parent = window ? getParent(window) : null;\r\n\r\n const updateWindowMullionById = (id: string, mullion: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Window && e.id === id) {\r\n (e as WindowModel).mullion = mullion;\r\n state.selectedElement = e;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateWindowTypeById = (id: string, type: WindowType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Window && e.id === id) {\r\n (e as WindowModel).windowType = type;\r\n state.selectedElement = e;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateWindowFrameById = (id: string, checked: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WindowModel).frame = checked;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateEmptyWindowById = (id: string, empty: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Window) {\r\n (e as WindowModel).empty = empty;\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.Window) {\r\n (e as WindowModel).interior = interior;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const renderCut = () => {\r\n if (!window || window.locked) {\r\n return null;\r\n }\r\n return ;\r\n };\r\n\r\n const renderMenuItem = (dataType: WindowDataType) => {\r\n return (\r\n {\r\n setApplyCount(0);\r\n setDataType(dataType);\r\n }}\r\n >\r\n {i18n.t(`windowMenu.${dataType}`, lang)} ...\r\n \r\n );\r\n };\r\n\r\n const renderMullionSubMenu = () => {\r\n if (!window) return null;\r\n\r\n return (\r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Mullion',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateWindowMullionById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateWindowMullionById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateWindowMullionById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowMullion = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Mullion', { lng: language })}\r\n \r\n \r\n\r\n \r\n\r\n {renderMenuItem(WindowDataType.MullionWidth)}\r\n {renderMenuItem(WindowDataType.MullionSpacing)}\r\n {renderMenuItem(WindowDataType.MullionColor)}\r\n \r\n );\r\n };\r\n\r\n const renderFrameSubMenu = () => {\r\n if (!window) return null;\r\n\r\n return (\r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Frame',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateWindowFrameById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateWindowFrameById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateWindowFrameById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowFrame = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Frame', { lng: language })}\r\n \r\n \r\n\r\n \r\n\r\n {renderMenuItem(WindowDataType.FrameWidth)}\r\n {renderMenuItem(WindowDataType.SillWidth)}\r\n {renderMenuItem(WindowDataType.Color)}\r\n \r\n );\r\n };\r\n\r\n const renderTypeSubMenu = () => {\r\n if (!window) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Window Type',\r\n timestamp: Date.now(),\r\n oldValue: window.windowType,\r\n newValue: e.target.value,\r\n changedElementId: window.id,\r\n changedElementType: window.type,\r\n undo: () => {\r\n updateWindowTypeById(undoableChange.changedElementId, undoableChange.oldValue as WindowType);\r\n },\r\n redo: () => {\r\n updateWindowTypeById(undoableChange.changedElementId, undoableChange.newValue as WindowType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateWindowTypeById(window.id, e.target.value);\r\n // todo: can't use it as wall can't have triangle window.\r\n // setCommonStore((state) => {\r\n // state.actionState.windowType = e.target.value;\r\n // });\r\n }}\r\n >\r\n \r\n {i18n.t('windowMenu.Default', lang)}\r\n \r\n \r\n {i18n.t('windowMenu.Arched', lang)}\r\n \r\n \r\n {i18n.t('windowMenu.Polygonal', lang)}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const renderDialogs = () => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n case WindowDataType.MullionColor:\r\n case WindowDataType.Color: {\r\n const setting = SelectionDialogSettings[dataType] as ItemSelectionSettingType;\r\n if (!setting) return null;\r\n return (\r\n setDataType(null)}\r\n />\r\n );\r\n }\r\n case WindowDataType.Opacity:\r\n case WindowDataType.Width:\r\n case WindowDataType.Height:\r\n case WindowDataType.MullionSpacing:\r\n case WindowDataType.MullionWidth:\r\n case WindowDataType.SillWidth:\r\n case WindowDataType.FrameWidth: {\r\n const setting = NumberDialogSettings[dataType] as NumberDialogSettingType;\r\n if (dataType === WindowDataType.Width) {\r\n setting.range[1] =\r\n parent && window && window.parentType !== ObjectType.Roof\r\n ? 2 * parent.lx * Math.min(Math.abs(0.5 - window.cx), Math.abs(-0.5 - window.cx))\r\n : 100;\r\n } else if (dataType === WindowDataType.Height) {\r\n setting.range[1] =\r\n parent && window && window.parentType !== ObjectType.Roof\r\n ? 2 * parent.lz * Math.min(Math.abs(0.5 - window.cz), Math.abs(-0.5 - window.cz))\r\n : 100;\r\n }\r\n if (!setting) return null;\r\n return (\r\n setDataType(null)}\r\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\r\n note={setting.note ? i18n.t(setting.note, lang) : undefined}\r\n digit={setting.digit ?? 0}\r\n />\r\n );\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {renderCut()}\r\n \r\n\r\n {!window.locked && (\r\n <>\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Empty Window',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateEmptyWindowById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateEmptyWindowById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateEmptyWindowById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowEmpty = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Empty', lang)}\r\n \r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Interior Window',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateInteriorById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateInteriorById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateInteriorById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowInterior = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Interior', lang)}\r\n \r\n \r\n {renderMenuItem(WindowDataType.Width)}\r\n {renderMenuItem(WindowDataType.Height)}\r\n {renderMenuItem(WindowDataType.Opacity)}\r\n {renderMenuItem(WindowDataType.Tint)}\r\n {/* u-value has its special UI */}\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 {renderTypeSubMenu()}\r\n {renderMullionSubMenu()}\r\n {renderFrameSubMenu()}\r\n \r\n {renderDialogs()}\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 { 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 WindowItemSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowItemSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowItemSelectionProps) => {\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 = (wId: 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 === wId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: 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 === fId) {\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 undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\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.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 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.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowItemSelection;\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 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.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.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 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.MullionSpacing:\r\n state.actionState.windowMullionSpacing = 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.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.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.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 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.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WindowUValueInput;\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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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 console.log('get', useStore.getState().roofActionScope);\r\n switch (useStore.getState().roofActionScope) {\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 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.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.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.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 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.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,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,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=\"","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 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 { QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME } 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: 99;\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 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\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 \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 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","/*\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.groupMasterId = null;\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.groupMasterId = null;\r\n } else {\r\n if (state.selectedElement) {\r\n if (isGroupable(state.selectedElement)) {\r\n state.groupMasterId = Util.getBaseId(state.selectedElement.id);\r\n } else {\r\n const baseId = Util.getBaseId(state.selectedElement.foundationId ?? state.selectedElement.parentId);\r\n state.groupMasterId = baseId;\r\n for (const e of state.elements) {\r\n e.selected = e.id === baseId;\r\n }\r\n state.selectedElementIdSet.clear();\r\n if (baseId) {\r\n state.selectedElementIdSet.add(baseId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElementIdSet.clear();\r\n }\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.groupMasterId = null;\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, 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.clickToAccessCloudTools', lang)}\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 { Input, Modal, Space, Table, Typography } from 'antd';\nimport { QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME } 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';\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: 99;\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\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\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 \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 />\n {\n // @ts-ignore\n return a['title'].localeCompare(b['title']);\n }}\n render={(title) => {\n return (\n \n {title}\n \n );\n }}\n onCell={(r) => {\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 setProjectState(r 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 />\n (\n \n {\n confirmDeleteProject(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 setRenameDialogVisible(true);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n const url =\n HOME_URL + '?client=web&userid=' + user.uid + '&project=' + encodeURIComponent(record.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', 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(ProjectListPanel);\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 { usePrimitiveStore } from './stores/commonPrimitive';\nimport * as Selector from './stores/selector';\nimport { Modal } from 'antd';\nimport dayjs from 'dayjs';\nimport 'antd/dist/antd.css';\nimport firebase from 'firebase/app';\nimport 'firebase/auth';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo, showSuccess } from './helpers';\nimport {\n ClassID,\n CloudFileInfo,\n DataColoring,\n Design,\n DesignProblem,\n FirebaseName,\n ModelSite,\n ObjectType,\n ProjectInfo,\n SchoolID,\n User,\n} from './types';\nimport CloudFilePanel from './panels/cloudFilePanel';\nimport Spinner from './components/spinner';\nimport AccountSettingsPanel from './panels/accountSettingsPanel';\nimport i18n from './i18n/i18n';\nimport { ExclamationCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';\nimport { Util } from './Util';\nimport { HOME_URL } from './constants';\nimport ModelsMapWrapper from './modelsMapWrapper';\nimport MainToolBar from './mainToolBar';\nimport SaveCloudFileModal from './saveCloudFileModal';\nimport ModelsGallery from './modelsGallery';\nimport ProjectListPanel from './panels/projectListPanel';\nimport { loadCloudFile } from './cloudFileUtil';\nimport { changeDesignTitles, copyDesign, createDesign, fetchProject, getImageData } from './cloudProjectUtil';\nimport { ProjectUtil } from './panels/ProjectUtil';\n\nexport interface CloudManagerProps {\n viewOnly: boolean;\n canvas?: HTMLCanvasElement | null;\n}\n\nconst useFlag = (flag: boolean, fn: Function, setFlag: () => void) => {\n useEffect(() => {\n if (flag) {\n fn();\n setFlag();\n }\n }, [flag]);\n};\n\nconst CloudManager = ({ viewOnly = false, canvas }: CloudManagerProps) => {\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 latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const address = useStore(Selector.world.address);\n const countryCode = useStore(Selector.world.countryCode);\n const exportContent = useStore(Selector.exportContent);\n const showCloudFilePanel = usePrimitiveStore(Selector.showCloudFilePanel);\n const showProjectListPanel = usePrimitiveStore(Selector.showProjectListPanel);\n const showModelsGallery = usePrimitiveStore(Selector.showModelsGallery);\n const showAccountSettingsPanel = usePrimitiveStore(Selector.showAccountSettingsPanel);\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n const cloudFile = useStore(Selector.cloudFile);\n const saveCloudFileFlag = usePrimitiveStore(Selector.saveCloudFileFlag);\n const modelsMapFlag = usePrimitiveStore(Selector.modelsMapFlag);\n const leaderboardFlag = usePrimitiveStore(Selector.leaderboardFlag);\n const publishOnMapFlag = usePrimitiveStore(Selector.publishOnModelsMapFlag);\n const listCloudFilesFlag = usePrimitiveStore(Selector.listCloudFilesFlag);\n const showCloudFileTitleDialog = useStore(Selector.showCloudFileTitleDialog);\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\n const importContent = useStore(Selector.importContent);\n const createEmptyFile = useStore(Selector.createEmptyFile);\n const changed = usePrimitiveStore(Selector.changed);\n const localContentToImportAfterCloudFileUpdate = useStore(Selector.localContentToImportAfterCloudFileUpdate);\n const peopleModels = useStore(Selector.peopleModels);\n const createProjectFlag = usePrimitiveStore(Selector.createProjectFlag);\n const saveProjectFlag = usePrimitiveStore(Selector.saveProjectFlag);\n const curateDesignToProjectFlag = usePrimitiveStore(Selector.curateDesignToProjectFlag);\n const showProjectsFlag = usePrimitiveStore(Selector.showProjectsFlag);\n const updateProjectsFlag = usePrimitiveStore(Selector.updateProjectsFlag);\n\n const [loading, setLoading] = useState(false);\n const [updateFlag, setUpdateFlag] = useState(false);\n const [cloudFileArray, setCloudFileArray] = useState([]);\n const [projectArray, setProjectArray] = useState([]);\n const [updateProjectArrayFlag, setUpdateProjectArrayFlag] = useState(false);\n const [title, setTitle] = useState(cloudFile ?? 'My Aladdin File');\n const [titleDialogVisible, setTitleDialogVisible] = useState(false);\n const cloudFiles = useRef();\n const myProjects = useRef(); // Not sure why I need to use ref to store this\n const authorModelsRef = useRef>();\n const firstAccountSettings = useRef(true);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\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_DATABASE_URL,\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\n };\n let initialize = firebase.apps.length === 0; // no app, should initialize\n if (firebase.apps.length === 1 && firebase.apps[0].name === FirebaseName.LOG_DATA) {\n initialize = true; // if there is only the logger app, should initialize\n }\n if (initialize) {\n firebase.initializeApp(config);\n } else {\n firebase.app(); // if already initialized, use the default one\n }\n\n // don't enable persistence as we often need to open multiple tabs\n // firebase.firestore().enablePersistence()\n // .catch((err) => {\n // if (err.code === 'failed-precondition') {\n // showWarning('Firestore: Multiple tabs open, persistence can only be enabled in one tab at a time.', 10);\n // } else if (err.code === 'unimplemented') {\n // showWarning('Firestore: The current browser does not support offline persistence, 10');\n // }\n // });\n\n // do not use firebase.auth().currentUser - currentUser might be null because the auth object has not finished initializing.\n // If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.\n firebase.auth().onAuthStateChanged((u) => {\n const params = new URLSearchParams(window.location.search);\n const title = params.get('title');\n if (u) {\n setCommonStore((state) => {\n if (state.user) {\n state.user.uid = u.uid;\n state.user.displayName = u.displayName;\n state.user.email = u.email;\n state.user.photoURL = u.photoURL;\n }\n state.cloudFile = title ?? undefined;\n });\n } else {\n setCommonStore((state) => {\n state.cloudFile = title ?? undefined;\n });\n }\n });\n init();\n window.addEventListener('popstate', handlePopStateEvent);\n return () => {\n window.removeEventListener('popstate', handlePopStateEvent);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handlePopStateEvent = () => {\n if (viewOnly) return;\n const p = new URLSearchParams(window.location.search);\n const userid = p.get('userid');\n const title = p.get('title');\n if (userid && title) {\n openCloudFile(userid, title, true);\n }\n };\n\n useEffect(() => {\n if (cloudFiles.current) {\n const arr: any[] = [];\n cloudFiles.current.forEach((f, i) => {\n arr.push({\n key: i.toString(),\n title: f.fileName,\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\n timestamp: f.timestamp,\n userid: f.userid,\n action: '',\n });\n });\n arr.sort((a, b) => b.timestamp - a.timestamp);\n setCloudFileArray(arr);\n }\n // FIXME: React says that the dependency of the mutable cloudFiles.current is unnecessary,\n // but we need this for the code to work.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cloudFiles.current]);\n\n useEffect(() => {\n if (myProjects.current) {\n const arr: any[] = [];\n myProjects.current.forEach((f, i) => {\n arr.push({\n key: i.toString(),\n owner: f.owner,\n title: f.title,\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\n timestamp: f.timestamp,\n description: f.description,\n dataColoring: f.dataColoring,\n selectedProperty: f.selectedProperty,\n sortDescending: f.sortDescending,\n xAxisNameScatteredPlot: f.xAxisNameScatteredPlot,\n yAxisNameScatteredPlot: f.yAxisNameScatteredPlot,\n dotSizeScatteredPlot: f.dotSizeScatteredPlot,\n thumbnailWidth: f.thumbnailWidth,\n type: f.type,\n designs: f.designs,\n ranges: f.ranges ?? [],\n hiddenParameters: f.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(f.type),\n counter: f.counter,\n action: '',\n });\n });\n arr.sort((a, b) => b.timestamp - a.timestamp);\n setProjectArray(arr);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [myProjects.current, updateProjectArrayFlag]);\n\n // fetch all the models that belong to the current user, including those published under all aliases\n useEffect(() => {\n authorModelsRef.current = new Map();\n if (user.aliases && user.aliases.length > 0) {\n for (const a of user.aliases) {\n if (a !== user.displayName) {\n const m = peopleModels.get(a);\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\n }\n }\n }\n if (user.displayName) {\n const m = peopleModels.get(user.displayName);\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\n }\n }, [peopleModels, user.displayName, user.aliases]);\n\n useFlag(saveCloudFileFlag, updateCloudFile, () => setPrimitiveStore('saveCloudFileFlag', false));\n\n useFlag(modelsMapFlag, fetchModelSitesFn, () => setPrimitiveStore('modelsMapFlag', false));\n\n useFlag(leaderboardFlag, fetchPeopleModelsFn, () => setPrimitiveStore('leaderboardFlag', false));\n\n useFlag(publishOnMapFlag, publishOnModelsMap, () => setPrimitiveStore('publishOnModelsMapFlag', false));\n\n useFlag(createProjectFlag, createNewProject, () => setPrimitiveStore('createProjectFlag', false));\n\n useFlag(saveProjectFlag, saveProjectAs, () => setPrimitiveStore('saveProjectFlag', false));\n\n useFlag(showProjectsFlag, showMyProjectsList, () => setPrimitiveStore('showProjectsFlag', false));\n\n useFlag(updateProjectsFlag, hideMyProjectsList, () => setPrimitiveStore('updateProjectsFlag', false));\n\n useFlag(listCloudFilesFlag, listMyCloudFiles, () => setPrimitiveStore('listCloudFilesFlag', false));\n\n useFlag(curateDesignToProjectFlag, curateDesignToProject, () =>\n setPrimitiveStore('curateDesignToProjectFlag', false),\n );\n\n useEffect(() => {\n setTitleDialogVisible(showCloudFileTitleDialog);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showCloudFileTitleDialogFlag]);\n\n useEffect(() => {\n setTitle(cloudFile ?? 'My Aladdin File');\n }, [cloudFile]);\n\n useEffect(() => {\n if (firstAccountSettings.current) {\n firstAccountSettings.current = false;\n } else {\n saveAccountSettings(user);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user.signFile, user.schoolID, user.classID]);\n\n const init = () => {\n const params = new URLSearchParams(window.location.search);\n const userid = params.get('userid');\n if (userid) {\n const title = params.get('title');\n const project = params.get('project');\n if (project) {\n setLoading(true);\n fetchProject(userid, project, setProjectState).finally(() => {\n setLoading(false);\n });\n if (title) {\n openDesignFile(userid, title);\n }\n } else {\n if (title) {\n openCloudFile(userid, title);\n }\n }\n } else {\n setCommonStore((state) => {\n // make sure that the cloud file state is consistent with the URL\n state.cloudFile = undefined;\n });\n }\n };\n\n const resetToSelectMode = () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n });\n };\n\n const signIn = () => {\n const provider = new firebase.auth.GoogleAuthProvider();\n firebase\n .auth()\n .signInWithPopup(provider)\n .then((result) => {\n setCommonStore((state) => {\n if (result.user) {\n state.user.uid = result.user.uid;\n state.user.email = result.user.email;\n state.user.displayName = result.user.displayName;\n state.user.photoURL = result.user.photoURL;\n registerUser({ ...state.user }).then(() => {\n // ignore\n });\n }\n });\n })\n .catch((error) => {\n if (error.code !== 'auth/popup-closed-by-user' && error.code !== 'auth/cancelled-popup-request') {\n showError(i18n.t('message.CannotSignIn', lang) + ': ' + error);\n }\n });\n resetToSelectMode();\n };\n\n const registerUser = async (user: User): Promise => {\n const firestore = firebase.firestore();\n let signFile = false;\n let noLogging = false;\n let userCount = 0;\n let schoolID = SchoolID.UNKNOWN;\n let classID = ClassID.UNKNOWN;\n let likes: string[] = [];\n let published: string[] = [];\n let aliases: string[] = [];\n const found = await firestore\n .collection('users')\n .get()\n .then((querySnapshot) => {\n userCount = querySnapshot.size;\n for (const doc of querySnapshot.docs) {\n if (doc.id === user.uid) {\n const docData = doc.data();\n signFile = !!docData.signFile;\n noLogging = !!docData.noLogging;\n schoolID = docData.schoolID ? (docData.schoolID as SchoolID) : SchoolID.UNKNOWN;\n classID = docData.classID ? (docData.classID as ClassID) : ClassID.UNKNOWN;\n if (docData.likes) likes = docData.likes;\n if (docData.published) published = docData.published;\n if (docData.aliases) aliases = docData.aliases;\n return true;\n }\n }\n return false;\n });\n if (found) {\n setCommonStore((state) => {\n state.user.signFile = signFile;\n state.user.noLogging = noLogging;\n state.user.schoolID = schoolID;\n state.user.classID = classID;\n state.user.likes = likes;\n state.user.published = published;\n state.user.aliases = aliases;\n });\n usePrimitiveStore.setState((state) => {\n state.userCount = userCount;\n });\n user.signFile = signFile;\n user.noLogging = noLogging;\n user.schoolID = schoolID;\n user.classID = classID;\n user.likes = likes;\n user.published = published;\n user.aliases = aliases;\n } else {\n if (user.uid) {\n firestore\n .collection('users')\n .doc(user.uid)\n .set({\n uid: user.uid,\n signFile: !!user.signFile, // don't listen to WebStorm's suggestion to simplify it\n noLogging: !!user.noLogging,\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\n classID: user.classID ?? ClassID.UNKNOWN,\n since: dayjs(new Date()).format('MM/DD/YYYY hh:mm A'),\n os: Util.getOS(),\n })\n .then(() => {\n showInfo(i18n.t('message.YourAccountWasCreated', lang));\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateAccount', lang) + ': ' + error);\n });\n }\n }\n };\n\n const signOut = () => {\n firebase\n .auth()\n .signOut()\n .then(() => {\n setCommonStore((state) => {\n state.user.uid = null;\n state.user.email = null;\n state.user.displayName = null;\n state.user.photoURL = null;\n state.user.signFile = false;\n state.user.likes = [];\n state.user.published = [];\n state.user.aliases = [];\n state.cloudFile = undefined; // if there is a current cloud file\n });\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = false;\n state.showAccountSettingsPanel = false;\n state.showModelsGallery = false;\n state.showProjectListPanel = false;\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSignOut', lang) + ': ' + error);\n });\n };\n\n const saveAccountSettings = (user: User) => {\n if (user.uid) {\n const firestore = firebase.firestore();\n firestore\n .collection('users')\n .doc(user.uid)\n .update({\n signFile: !!user.signFile,\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\n classID: user.classID ?? ClassID.UNKNOWN,\n })\n .then(() => {\n showInfo(i18n.t('message.YourAccountSettingsWereSaved', lang));\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSaveYourAccountSettings', lang) + ': ' + error);\n });\n }\n };\n\n const fetchModelSites = async () => {\n setLoading(true);\n await firebase\n .firestore()\n .collection('models')\n .get()\n .then((querySnapshot) => {\n const models = new Map>();\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n if (data) {\n const m = new Map();\n for (const k in data) {\n if (!data[k].countryCode) {\n if (data[k].address?.endsWith('USA')) data[k]['countryCode'] = 'US';\n }\n m.set(k, data[k]);\n }\n models.set(doc.id, m);\n }\n });\n setCommonStore((state) => {\n state.modelSites = models;\n });\n return models;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLoadModelsOnMap', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n // get latest submission\n const fetchLatest = async () => {\n await firebase\n .firestore()\n .collection('board')\n .doc('info')\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data && data.latestModel) {\n setCommonStore((state) => {\n // if it has been deleted, don't show\n let existing = false;\n const m = data.latestModel as ModelSite;\n if (m.author) {\n existing = !!state.peopleModels.get(m.author)?.get(Util.getModelKey(m));\n }\n state.latestModelSite = existing ? m : undefined;\n });\n }\n }\n })\n .catch((error) => {\n console.log(error);\n });\n };\n\n const fetchPeopleModels = async () => {\n setLoading(true);\n await firebase\n .firestore()\n .collection('board')\n .doc('people')\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n const peopleModels = new Map>();\n for (const k in data) {\n peopleModels.set(k, new Map(Object.entries(data[k])));\n }\n setCommonStore((state) => {\n state.peopleModels = peopleModels;\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLoadLeaderboard', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const deleteFromModelsMap = (model: ModelSite, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({ [Util.getModelKey(model)]: firebase.firestore.FieldValue.delete() })\n .then(() => {\n showSuccess(i18n.t('message.ModelDeletedFromMap', lang));\n if (successCallback) successCallback();\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteModelFromMap', lang) + ': ' + error);\n });\n // remove the record from the leaderboard\n firebase\n .firestore()\n .collection('board')\n .doc('people')\n .update({\n [(model.author ?? 'Anonymous') + '.' + Util.getModelKey(model)]: firebase.firestore.FieldValue.delete(),\n })\n .then(() => {\n // also remove the cached record\n setCommonStore((state) => {\n if (state.peopleModels) {\n state.peopleModels.delete(Util.getModelKey(model));\n usePrimitiveStore.setState((state) => {\n state.leaderboardFlag = true;\n });\n }\n });\n });\n // remove the record in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update({\n published: firebase.firestore.FieldValue.arrayRemove(model.title),\n })\n .then(() => {\n // also remove the cached record\n setCommonStore((state) => {\n if (state.user && state.user.published) {\n if (state.user.published.includes(model.title)) {\n const index = state.user.published.indexOf(model.title);\n if (index >= 0) {\n state.user.published.splice(index, 1);\n }\n }\n }\n });\n });\n }\n };\n\n const likeModelsMap = (model: ModelSite, like: boolean, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n const modelKey = Util.getModelKey(model);\n // keep or remove a record of like in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update(\n like\n ? {\n likes: firebase.firestore.FieldValue.arrayUnion(modelKey),\n }\n : {\n likes: firebase.firestore.FieldValue.arrayRemove(modelKey),\n },\n )\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\n });\n // increment or decrement the likes counter\n const likeCountPath = modelKey + '.likeCount';\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update(\n like\n ? {\n [likeCountPath]: firebase.firestore.FieldValue.increment(1),\n }\n : {\n [likeCountPath]: firebase.firestore.FieldValue.increment(-1),\n },\n )\n .then(() => {\n if (successCallback) successCallback();\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\n });\n }\n };\n\n const pinModelsMap = (model: ModelSite, pinned: boolean, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({\n [Util.getModelKey(model) + '.pinned']: pinned,\n })\n .then(() => {\n if (successCallback) successCallback();\n })\n .catch((error) => {\n // ignore\n });\n }\n };\n\n // TODO:\n // unfortunately, this throws an error for users who do not log in\n // because of write access is only granted to registered users who log in.\n const countClicksModelsMap = (model: ModelSite) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({\n [Util.getModelKey(model) + '.clickCount']: firebase.firestore.FieldValue.increment(1),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n // ignore\n });\n }\n };\n\n // fetch owner's projects from the cloud\n const fetchMyProjects = async (silent: boolean) => {\n if (!user.uid) return;\n if (!silent) setLoading(true);\n myProjects.current = await firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .get()\n .then((querySnapshot) => {\n const a: ProjectInfo[] = [];\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n a.push({\n owner: user.uid,\n title: doc.id,\n timestamp: data.timestamp,\n description: data.description,\n dataColoring: data.dataColoring,\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 type: data.type,\n designs: data.designs ?? [],\n ranges: data.ranges ?? [],\n hiddenParameters: data.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(data.type),\n counter: data.counter ?? 0,\n } as ProjectInfo);\n });\n return a;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenYourProjects', lang) + ': ' + error);\n })\n .finally(() => {\n if (!silent) setLoading(false);\n });\n };\n\n const listMyProjects = (show: boolean) => {\n if (user.uid) {\n fetchMyProjects(!show).then(() => {\n if (show) {\n usePrimitiveStore.setState((state) => {\n state.showProjectListPanel = true;\n });\n }\n setUpdateProjectArrayFlag(!updateProjectArrayFlag);\n });\n }\n };\n\n const deleteProject = (title: string) => {\n if (!user.uid) return;\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(title)\n .delete()\n .then(() => {\n if (myProjects.current && user.uid) {\n // also delete the designs of the deleted project\n for (const p of myProjects.current) {\n if (p.title === title && p.designs) {\n for (const d of p.designs) {\n setCommonStore((state) => {\n if (d.title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('designs')\n .doc(d.title)\n .delete()\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n }\n break;\n }\n }\n myProjects.current = myProjects.current.filter((e) => {\n return e.title !== title;\n });\n setUpdateFlag(!updateFlag);\n }\n setCommonStore((state) => {\n if (title === state.projectInfo.title) {\n state.projectInfo.title = null;\n state.projectInfo.description = null;\n state.projectInfo.dataColoring = DataColoring.ALL;\n state.projectInfo.selectedProperty = null;\n state.projectInfo.sortDescending = false;\n state.projectInfo.xAxisNameScatteredPlot = null;\n state.projectInfo.yAxisNameScatteredPlot = null;\n state.projectInfo.dotSizeScatteredPlot = 5;\n state.projectInfo.thumbnailWidth = 200;\n state.projectInfo.counter = 0;\n state.projectInfo.designs = [];\n state.projectInfo.ranges = [];\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\n state.designProjectType = null;\n state.projectView = false;\n }\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteProject', lang) + ': ' + error);\n });\n };\n\n const renameProject = (oldTitle: string, newTitle: string) => {\n // check if the new project title is already taken\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === newTitle) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + newTitle);\n } else {\n if (!user.uid) return;\n const files = firebase.firestore().collection('users').doc(user.uid).collection('projects');\n files\n .doc(oldTitle)\n .get()\n .then((doc) => {\n if (doc && doc.exists) {\n const data = doc.data();\n if (data && user.uid) {\n const newData = { ...data };\n if (data.designs && data.designs.length > 0) {\n const newDesigns: Design[] = changeDesignTitles(newTitle, data.designs) ?? [];\n for (const [i, d] of data.designs.entries()) {\n copyDesign(d.title, newDesigns[i].title, data.owner, user.uid);\n }\n newData.designs = newDesigns;\n setCommonStore((state) => {\n state.projectInfo.designs = newDesigns;\n });\n }\n files\n .doc(newTitle)\n .set(newData)\n .then(() => {\n files\n .doc(oldTitle)\n .delete()\n .then(() => {\n // TODO\n });\n if (myProjects.current) {\n const newArray: ProjectInfo[] = [];\n for (const p of myProjects.current) {\n if (p.title === oldTitle) {\n newArray.push({\n owner: p.owner,\n timestamp: p.timestamp,\n title: newTitle,\n description: p.description,\n type: p.type,\n designs: p.designs,\n ranges: p.ranges ?? null,\n hiddenParameters: p.hiddenParameters,\n counter: p.counter,\n } as ProjectInfo);\n } else {\n newArray.push(p);\n }\n }\n myProjects.current = newArray;\n setUpdateFlag(!updateFlag);\n }\n setCommonStore((state) => {\n if (state.projectInfo.title === oldTitle) {\n state.projectInfo.title = newTitle;\n }\n });\n // TODO\n // change the address field of the browser when the project is currently open\n // const params = new URLSearchParams(window.location.search);\n // if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\n // const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\n // window.history.pushState({}, document.title, newUrl);\n // }\n });\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRenameProject', lang) + ': ' + error);\n });\n }\n });\n };\n\n const setProjectState = (projectInfo: ProjectInfo) => {\n setCommonStore((state) => {\n state.projectInfo = { ...projectInfo };\n state.projectImages.clear();\n state.projectView = true;\n });\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n state.updateProjectsFlag = true;\n });\n };\n\n const openDesignFile = (userid: string, title: string) => {\n if (userid && title) {\n setLoading(true);\n loadCloudFile(userid, title, true, true, viewOnly).finally(() => {\n setLoading(false);\n });\n }\n };\n\n const addDesignToProject = (\n projectType: string,\n projectTitle: string,\n designTitle: string,\n thumbnailWidth: number,\n ) => {\n if (!user.uid || !canvas) return;\n // create a thumbnail image of the design in Base64 format\n // (don't create a PNG and then store in Firebase storage as I can't get the blob data correctly)\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\n const design = createDesign(projectType, designTitle, thumbnail);\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n designs: firebase.firestore.FieldValue.arrayUnion(design),\n counter: firebase.firestore.FieldValue.increment(1),\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectInfo.designs?.push(design);\n // increment the local counter to be consistent with the database counter\n state.projectInfo.counter++;\n // store the project type in the design for linking it with the right type of project later\n state.designProjectType = state.projectInfo.type;\n state.cloudFile = design.title;\n });\n // regardless of where the design is, make a copy on the cloud\n saveToCloudWithoutCheckingExistence(designTitle, true, true);\n })\n .catch((error) => {\n showError(i18n.t('message.CannotAddDesignToProject', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const saveToCloud = (title: string, silent: boolean, checkExistence: boolean) => {\n if (!user.uid) return;\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidTitle', lang) + '.');\n return;\n }\n setLoading(true);\n if (checkExistence) {\n fetchMyCloudFiles().then(() => {\n let exist = false;\n if (cloudFiles.current) {\n for (const p of cloudFiles.current) {\n if (p.fileName === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n Modal.confirm({\n title: i18n.t('message.CloudFileWithTitleExistsDoYouWantToOverwrite', lang),\n icon: ,\n onOk: () => {\n saveToCloudWithoutCheckingExistence(t, silent);\n },\n onCancel: () => {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n saveToCloudWithoutCheckingExistence(t, silent);\n }\n });\n } else {\n saveToCloudWithoutCheckingExistence(t, silent);\n }\n setTitleDialogVisible(false);\n };\n\n const saveToCloudWithoutCheckingExistence = (title: string, silent: boolean, ofProject?: boolean) => {\n if (!user.uid) return;\n try {\n const doc = firebase.firestore().collection('users').doc(user.uid);\n if (doc) {\n if (localContentToImportAfterCloudFileUpdate) {\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n }\n doc\n .collection(ofProject ? 'designs' : 'files')\n .doc(title)\n .set(exportContent())\n .then(() => {\n if (!silent) {\n setCommonStore((state) => {\n state.cloudFile = title;\n });\n usePrimitiveStore.getState().setChanged(false);\n }\n if (localContentToImportAfterCloudFileUpdate) {\n if (localContentToImportAfterCloudFileUpdate === 'CREATE_NEW_FILE') {\n createEmptyFile();\n } else {\n importContent(localContentToImportAfterCloudFileUpdate);\n }\n } else {\n if (!ofProject) {\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(title);\n window.history.pushState({}, document.title, newUrl);\n }\n }\n if (showCloudFilePanel) {\n fetchMyCloudFiles().then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n }\n } catch (error) {\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\n setLoading(false);\n }\n };\n\n const openCloudFileWithSaveReminder = (userid: string, title: string) => {\n if (changed) {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\n icon: ,\n onOk: () => {\n if (cloudFile) {\n saveToCloud(cloudFile, true, false);\n openCloudFile(userid, title);\n } else {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n }\n },\n onCancel: () => {\n openCloudFile(userid, title);\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n openCloudFile(userid, title);\n }\n };\n\n const openCloudFileWithSaveReminderFromMap = (model: ModelSite) => {\n if (changed) {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\n icon: ,\n onOk: () => {\n if (cloudFile) {\n saveToCloud(cloudFile, true, false);\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n } else {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n }\n },\n onCancel: () => {\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n }\n };\n\n const openCloudFile = (userid: string, title: string, popState?: boolean) => {\n if (userid && title) {\n setLoading(true);\n loadCloudFile(userid, title, false, popState, viewOnly).finally(() => {\n setLoading(false);\n });\n }\n };\n\n const fetchMyCloudFiles = async () => {\n if (!user.uid) return;\n setLoading(true);\n // fetch owner's file information from the cloud\n cloudFiles.current = await firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('files')\n .get()\n .then((querySnapshot) => {\n const a: CloudFileInfo[] = [];\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n a.push({\n timestamp: data.timestamp,\n fileName: doc.id,\n userid: user.uid,\n uuid: data.docid,\n } as CloudFileInfo);\n });\n return a;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenCloudFolder', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const deleteCloudFile = (userid: string, title: string) => {\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('files')\n .doc(title)\n .delete()\n .then(() => {\n setCloudFileArray(\n cloudFileArray.filter((e) => {\n return e.userid !== userid || e.title !== title;\n }),\n );\n setCommonStore((state) => {\n if (title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n };\n\n const renameCloudFile = (userid: string, oldTitle: string, newTitle: string) => {\n const files = firebase.firestore().collection('users').doc(userid).collection('files');\n files\n .doc(oldTitle)\n .get()\n .then((doc) => {\n if (doc && doc.exists) {\n const data = doc.data();\n if (data) {\n files\n .doc(newTitle)\n .set(data)\n .then(() => {\n files\n .doc(oldTitle)\n .delete()\n .then(() => {\n // TODO\n });\n for (const f of cloudFileArray) {\n if (f.userid === userid && f.title === oldTitle) {\n f.title = newTitle;\n break;\n }\n }\n setCloudFileArray([...cloudFileArray]);\n setCommonStore((state) => {\n if (state.cloudFile === oldTitle) {\n state.cloudFile = newTitle;\n }\n });\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') === oldTitle && params.get('userid') === user.uid) {\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\n window.history.pushState({}, document.title, newUrl);\n }\n });\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRenameCloudFile', lang) + ': ' + error);\n });\n };\n\n function updateCloudFile() {\n if (cloudFile) {\n saveToCloud(cloudFile, false, false);\n setTitle(cloudFile);\n }\n }\n\n function fetchModelSitesFn() {\n fetchModelSites().then(() => {\n fetchLatest().then(() => {\n // ignore for now\n });\n });\n }\n\n function fetchPeopleModelsFn() {\n fetchPeopleModels().then(() => {\n fetchLatest().then(() => {\n // ignore for now\n });\n });\n }\n\n function publishOnModelsMap() {\n if (user && user.uid && title) {\n // check if the user is the owner of the current model\n const params = new URLSearchParams(window.location.search);\n if (params.get('userid') === user.uid && params.get('title') === title) {\n const m = {\n latitude,\n longitude,\n address: address ?? null,\n countryCode: countryCode ?? null,\n type: useStore.getState().modelType,\n author: useStore.getState().modelAuthor ?? user.displayName,\n userid: user.uid,\n title,\n label: useStore.getState().modelLabel,\n description: useStore.getState().modelDescription,\n timeCreated: Date.now(),\n } as ModelSite;\n const modelKey = Util.getModelKey(m);\n const collection = firebase.firestore().collection('models');\n if (collection) {\n // first we upload a thumbnail of the model to Firestore Cloud Storage\n const storageRef = firebase.storage().ref();\n if (canvas) {\n const thumbnail = Util.resizeCanvas(canvas, 200);\n thumbnail.toBlob((blob) => {\n if (blob) {\n const metadata = { contentType: 'image/png' };\n const uploadTask = storageRef.child('images/' + modelKey + '.png').put(blob, metadata);\n // Listen for state changes, errors, and completion of the upload.\n uploadTask.on(\n firebase.storage.TaskEvent.STATE_CHANGED,\n (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n if (progress > 0) {\n showInfo(i18n.t('word.Upload', lang) + ': ' + progress + '%');\n }\n },\n (error) => {\n showError('Storage: ' + error);\n },\n () => {\n uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {\n const m2 = { ...m, thumbnailUrl: downloadURL } as ModelSite;\n // after we get a download URL for the thumbnail image, we then go on to upload other data\n const document = collection.doc(Util.getLatLngKey(latitude, longitude));\n document\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data && data[modelKey]) {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.UpdatedOnModelsMap', lang) + '.');\n });\n } else {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\n });\n }\n } else {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotPublishModelOnMap', lang) + ': ' + error);\n });\n // add to the leaderboard\n firebase\n .firestore()\n .collection('board')\n .doc('people')\n .update({\n [(m2.author ?? 'Anonymous') + '.' + Util.getModelKey(m2)]: m2,\n })\n .then(() => {\n // update the cache\n setCommonStore((state) => {\n if (state.peopleModels) {\n const models = state.peopleModels.get(m2.author ?? 'Anonymous');\n if (models) {\n models.set(Util.getModelKey(m2), m2);\n }\n }\n });\n });\n // notify info\n firebase\n .firestore()\n .collection('board')\n .doc('info')\n .set({ latestModel: m2 }, { merge: true })\n .then(() => {\n // TODO\n });\n });\n },\n );\n }\n });\n }\n }\n // keep a record of the published model in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update(\n useStore.getState().modelAuthor === user.displayName\n ? {\n published: firebase.firestore.FieldValue.arrayUnion(title),\n }\n : {\n published: firebase.firestore.FieldValue.arrayUnion(title),\n aliases: firebase.firestore.FieldValue.arrayUnion(useStore.getState().modelAuthor),\n },\n )\n .then(() => {\n // update the cache\n setCommonStore((state) => {\n if (state.user) {\n if (!state.user.published) state.user.published = [];\n if (!state.user.published.includes(title)) {\n state.user.published.push(title);\n }\n if (!state.user.aliases) state.user.aliases = [];\n if (\n state.modelAuthor &&\n !state.user.aliases.includes(state.modelAuthor) &&\n state.modelAuthor !== user.displayName\n ) {\n state.user.aliases.push(state.modelAuthor);\n }\n }\n });\n });\n }\n }\n }\n\n function createNewProject() {\n if (!user || !user.uid) return;\n const title = usePrimitiveStore.getState().projectTitle;\n if (!title) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n // check if the project title is already used\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\n } else {\n if (user && user.uid) {\n const type = usePrimitiveStore.getState().projectType ?? DesignProblem.SOLAR_PANEL_ARRAY;\n const description = usePrimitiveStore.getState().projectDescription ?? null;\n const timestamp = new Date().getTime();\n const counter = 0;\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(t)\n .set({\n owner: user.uid,\n timestamp,\n type,\n description,\n counter,\n designs: [],\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(type),\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectView = true;\n // update the local copy as well\n state.projectInfo.owner = user.uid;\n state.projectInfo.type = type;\n state.projectInfo.title = title;\n state.projectInfo.description = description;\n state.projectInfo.counter = 0;\n state.projectInfo.dataColoring = DataColoring.ALL;\n state.projectInfo.selectedProperty = null;\n state.projectInfo.sortDescending = false;\n state.projectInfo.xAxisNameScatteredPlot = null;\n state.projectInfo.yAxisNameScatteredPlot = null;\n state.projectInfo.dotSizeScatteredPlot = 5;\n state.projectInfo.thumbnailWidth = 200;\n state.projectInfo.designs = [];\n state.projectInfo.ranges = [];\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\n })\n .finally(() => {\n // if the project list panel is open, update it\n if (showProjectListPanel) {\n fetchMyProjects(false).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n setLoading(false);\n });\n }\n }\n });\n }\n\n function saveProjectAs() {\n if (!user || !user.uid) return;\n const title = usePrimitiveStore.getState().projectTitle;\n if (!title) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n // check if the project title is already taken\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\n } else {\n if (user && user.uid) {\n const designs = useStore.getState().projectInfo.designs;\n if (designs) {\n const type = usePrimitiveStore.getState().projectType;\n const description = usePrimitiveStore.getState().projectDescription;\n const owner = useStore.getState().projectInfo.owner;\n const timestamp = new Date().getTime();\n const counter = useStore.getState().projectInfo.counter;\n const dataColoring = useStore.getState().projectInfo.dataColoring ?? null;\n const selectedProperty = useStore.getState().projectInfo.selectedProperty ?? null;\n const sortDescending = !!useStore.getState().projectInfo.sortDescending;\n const xAxisNameScatteredPlot = useStore.getState().projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\n const yAxisNameScatteredPlot = useStore.getState().projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\n const dotSizeScatteredPlot = useStore.getState().projectInfo.dotSizeScatteredPlot ?? 5;\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\n const newDesigns: Design[] = changeDesignTitles(t, designs) ?? [];\n for (const [i, d] of designs.entries()) {\n copyDesign(d.title, newDesigns[i].title, owner, user.uid);\n }\n const projectImages = useStore.getState().projectImages;\n if (projectImages && projectImages.size > 0) {\n for (const [i, d] of designs.entries()) {\n const image = projectImages.get(d.title);\n if (image) {\n newDesigns[i].thumbnail = getImageData(image);\n }\n }\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(t)\n .set({\n owner: user.uid,\n timestamp,\n type,\n description,\n counter,\n dataColoring,\n selectedProperty,\n sortDescending,\n xAxisNameScatteredPlot,\n yAxisNameScatteredPlot,\n dotSizeScatteredPlot,\n thumbnailWidth,\n designs: newDesigns,\n ranges: useStore.getState().projectInfo.ranges ?? null,\n hiddenParameters: useStore.getState().projectInfo.hiddenParameters,\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectView = true;\n state.projectInfo.owner = user.uid;\n state.projectInfo.type = type;\n state.projectInfo.title = title;\n state.projectInfo.description = description;\n state.projectInfo.designs = newDesigns;\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\n })\n .finally(() => {\n if (showProjectListPanel) {\n fetchMyProjects(false).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n setLoading(false);\n });\n }\n }\n }\n }\n });\n }\n\n function curateDesignToProject() {\n const projectOwner = useStore.getState().projectInfo.owner;\n if (user.uid !== projectOwner) {\n showInfo(i18n.t('message.CannotAddDesignToProjectOwnedByOthers', lang));\n } else {\n const projectTitle = useStore.getState().projectInfo.title;\n if (projectTitle) {\n setLoading(true);\n const projectType = useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY;\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\n const counter = useStore.getState().projectInfo.counter ?? 0;\n addDesignToProject(projectType, projectTitle, projectTitle + ' ' + counter, thumbnailWidth);\n }\n }\n }\n\n function listMyCloudFiles() {\n if (!user.uid) return;\n fetchMyCloudFiles().then(() => {\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = true;\n });\n });\n }\n\n function showMyProjectsList() {\n listMyProjects(true);\n }\n\n function hideMyProjectsList() {\n listMyProjects(false);\n setUpdateFlag(!updateFlag);\n }\n\n return viewOnly ? (\n <>\n {openModelsMap && (\n \n )}\n \n ) : (\n <>\n {loading && }\n loading}\n setTitle={setTitle}\n getTitle={() => title}\n setTitleDialogVisible={setTitleDialogVisible}\n isTitleDialogVisible={() => titleDialogVisible}\n />\n \n {showCloudFilePanel && cloudFiles.current && (\n \n )}\n {showProjectListPanel && myProjects.current && (\n \n )}\n {showModelsGallery && (\n {\n setPrimitiveStore('showModelsGallery', false);\n authorModelsRef.current = undefined;\n }}\n />\n )}\n {showAccountSettingsPanel && }\n {openModelsMap && (\n \n )}\n \n );\n};\n\nexport default React.memo(CloudManager);\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { ActionInfo, ObjectType } from './types';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { UndoableDelete } from './undo/UndoableDelete';\nimport { UndoablePaste } from './undo/UndoablePaste';\nimport { UndoableCheck } from './undo/UndoableCheck';\nimport { UndoableResetView } from './undo/UndoableResetView';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { UndoableMoveInX } from './undo/UndoableMoveInX';\nimport { UndoableMoveInY } from './undo/UndoableMoveInY';\nimport KeyboardEventHandler from 'react-keyboard-event-handler';\nimport { WallModel } from './models/WallModel';\nimport { useRefStore } from './stores/commonRef';\nimport { SolarPanelModel } from './models/SolarPanelModel';\nimport { Util } from './Util';\nimport { ElementModel } from './models/ElementModel';\nimport { GRID_RATIO, GROUND_ID, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\nimport { RoofUtil } from './views/roof/RoofUtil';\nimport { RoofModel } from './models/RoofModel';\nimport { spBoundaryCheck, spCollisionCheck } from './views/roof/roofRenderer';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { debounce } from 'lodash';\n\nexport interface KeyboardListenerProps {\n canvas?: HTMLCanvasElement | null;\n set2DView: (selected: boolean) => void;\n setNavigationView: (selected: boolean) => void;\n resetView: () => void;\n zoomView: (scale: number) => void;\n}\n\nconst AutoDeletionListener = React.memo(() => {\n const setCommonStore = useStore(Selector.set);\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\n const addUndoable = useStore(Selector.addUndoable);\n\n const listenToAutoDeletionByDeleteRef = useRef(false);\n const listenToAutoDeletionByCutRef = useRef(false);\n\n useStore(Selector.autoDeletedRoof);\n useStore(Selector.autoDeletedChild);\n\n useEffect(() => {\n useRefStore.setState((state) => {\n state.listenToAutoDeletionByDeleteRef = listenToAutoDeletionByDeleteRef;\n state.listenToAutoDeletionByCutRef = listenToAutoDeletionByCutRef;\n });\n }, []);\n\n const handleUndoAutoDeletion = debounce(() => {\n const selectedElementId = usePrimitiveStore.getState().selectedElementId;\n if (!selectedElementId) return;\n\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\n if (!autoDeletedElements) return;\n\n const manualDeletedElements = useStore.getState().deletedElements;\n const manualCutElements = useStore.getState().elementsToPaste;\n\n const listenToAutoDeletionByCut = useRefStore.getState().listenToAutoDeletionByCutRef?.current;\n const listenToAutoDeletionByDelete = useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\n\n let combined: ElementModel[] = [];\n let undoName: string = '';\n if (listenToAutoDeletionByCut) {\n useRefStore.getState().setListenToAutoDeletionByCut(false);\n combined = [...manualCutElements, ...autoDeletedElements];\n undoName = 'Cut';\n } else if (listenToAutoDeletionByDelete) {\n useRefStore.getState().setListenToAutoDeletionByDelete(false);\n combined = [...manualDeletedElements, ...autoDeletedElements];\n undoName = 'Delete';\n }\n\n const undoableDelete = {\n name: undoName,\n timestamp: Date.now(),\n deletedElements: [...combined],\n selectedElementId: selectedElementId,\n undo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length > 0) {\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\n }\n if (wall.rightJoints.length > 0) {\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\n }\n }\n setCommonStore((state) => {\n state.elements.push(...deletedElements);\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n });\n },\n redo: () => {\n if (undoableDelete.deletedElements.length === 0) return;\n\n const set = new Set(undoableDelete.deletedElements.map((e) => e.id));\n setCommonStore((state) => {\n state.elements = state.elements.filter((e) => !set.has(e.id));\n const deletedRoof = undoableDelete.deletedElements.find((e) => e.type === ObjectType.Roof);\n if (deletedRoof) {\n state.deletedRoofId = deletedRoof.id;\n }\n });\n },\n } as UndoableDelete;\n addUndoable(undoableDelete);\n\n setCommonStore((state) => {\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n });\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', null);\n }, 50);\n\n const listenToAutoDeletion =\n useRefStore.getState().listenToAutoDeletionByCutRef?.current ||\n useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\n\n if (listenToAutoDeletion && useStore.getState().getAutoDeletedElements()) {\n handleUndoAutoDeletion();\n }\n\n return null;\n});\n\nconst handleKeys = [\n 'left',\n 'up',\n 'right',\n 'down',\n 'shift+left',\n 'shift+up',\n 'shift+right',\n 'shift+down',\n 'ctrl+shift+left',\n 'ctrl+shift+up',\n 'ctrl+shift+right',\n 'ctrl+shift+down',\n 'meta+shift+left',\n 'meta+shift+up',\n 'meta+shift+right',\n 'meta+shift+down',\n 'ctrl+f',\n 'meta+f',\n 'ctrl+o',\n 'meta+o',\n 'ctrl+s',\n 'meta+s',\n 'ctrl+c',\n 'meta+c',\n 'ctrl+x',\n 'meta+x',\n 'ctrl+v',\n 'meta+v',\n 'ctrl+[',\n 'meta+[',\n 'ctrl+]',\n 'meta+]',\n 'ctrl+z',\n 'meta+z',\n 'ctrl+y',\n 'meta+y',\n 'ctrl+m',\n 'meta+m',\n 'ctrl+u', // navigation controls\n 'meta+u',\n 'ctrl+b',\n 'meta+b',\n 'shift',\n 'esc',\n 'ctrl+home',\n 'ctrl+alt+h',\n 'ctrl+shift+o',\n 'meta+shift+o',\n 'ctrl+shift+s',\n 'meta+shift+s',\n 'delete',\n 'backspace',\n 'alt+backspace',\n 'f2',\n 'f4',\n 'ctrl',\n];\n\nconst KeyboardListener = ({ canvas, set2DView, setNavigationView, resetView, zoomView }: KeyboardListenerProps) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const selectNone = useStore(Selector.selectNone);\n const language = useStore(Selector.language);\n const undoManager = useStore(Selector.undoManager);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getElementById = useStore(Selector.getElementById);\n const copyElementById = useStore(Selector.copyElementById);\n const removeElementById = useStore(Selector.removeElementById);\n const pasteElements = useStore(Selector.pasteElementsByKey);\n const getParent = useStore(Selector.getParent);\n const updateElementCxById = useStore(Selector.updateElementCxById);\n const updateElementCyById = useStore(Selector.updateElementCyById);\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\n const setEnableFineGrid = useStore(Selector.setEnableFineGrid);\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\n const groupMasterId = useStore(Selector.groupMasterId);\n\n const moveStepAbsolute = 0.1;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const removeElement = (elemId: string, cut: boolean) => {\n if (canvas) {\n canvas.style.cursor = 'default'; // if an element is deleted but the cursor is not default\n }\n return removeElementById(elemId, cut);\n };\n\n const toggle2DView = () => {\n if (useStore.getState().viewState.navigationView) return;\n const undoableCheck = {\n name: 'Set 2D View',\n timestamp: Date.now(),\n checked: !orthographic,\n undo: () => {\n set2DView(!undoableCheck.checked);\n },\n redo: () => {\n set2DView(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n set2DView(!orthographic);\n setCommonStore((state) => {\n state.viewState.autoRotate = false;\n });\n };\n\n const toggleNatigationView = () => {\n if (orthographic) return;\n const undoableCheck = {\n name: 'Set Navigation View',\n timestamp: Date.now(),\n checked: !useStore.getState().viewState.navigationView,\n undo: () => {\n setNavigationView(!undoableCheck.checked);\n },\n redo: () => {\n setNavigationView(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setNavigationView(!useStore.getState().viewState.navigationView);\n setCommonStore((state) => {\n state.viewState.autoRotate = false;\n });\n };\n\n const toggleAutoRotate = () => {\n if (orthographic) return;\n const undoableCheck = {\n name: 'Auto Rotate',\n timestamp: Date.now(),\n checked: !useStore.getState().viewState.autoRotate,\n undo: () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = !state.viewState.autoRotate;\n });\n };\n\n const isNewPositionOk = (elem: ElementModel, cx: number, cy: number) => {\n const clone = JSON.parse(JSON.stringify(elem)) as ElementModel;\n clone.cx = cx;\n clone.cy = cy;\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType === ObjectType.Roof) {\n if (elem.parentId && elem.foundationId) {\n const roof = getElementById(elem.parentId) as RoofModel;\n const foundation = getElementById(elem.foundationId);\n if (roof && foundation) {\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(clone as SolarPanelModel, foundation);\n if (\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\n !spCollisionCheck(clone as SolarPanelModel, foundation, solarPanelVertices)\n ) {\n return false;\n }\n }\n }\n return true;\n }\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (clone.type === ObjectType.SolarPanel) {\n const parent = getParent(elem);\n if (parent && !Util.isSolarCollectorWithinHorizontalSurface(clone as SolarPanelModel, parent)) {\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\n return false;\n }\n }\n return true;\n };\n\n const moveLeft = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = -moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = -moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = -moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLx = selectedElement.lx / (2 * parent.lx);\n const x = Math.max(-0.5 + halfLx, selectedElement.cx - moveStepAbsolute / parent.lx);\n displacement = x - selectedElement.cx;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = -moveStepAbsolute / parent.lx;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveLeft = {\n name: 'Move Left',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx - undoableMoveLeft.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx + undoableMoveLeft.displacement);\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveLeft);\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = -moveStepAbsolute * scale;\n const undoableMoveAllLeft = {\n name: 'Move All Left',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx - undoableMoveAllLeft.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + undoableMoveAllLeft.displacement);\n }\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveAllLeft);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + displacement);\n }\n }\n }\n }\n };\n\n const moveRight = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLx = parent ? selectedElement.lx / (2 * parent.lx) : 0;\n const x = Math.min(0.5 - halfLx, selectedElement.cx + moveStepAbsolute / parent.lx);\n displacement = x - selectedElement.cx;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = moveStepAbsolute / parent.lx;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveRight = {\n name: 'Move Right',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx - undoableMoveRight.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx + undoableMoveRight.displacement);\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveRight);\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = moveStepAbsolute * scale;\n const undoableMoveAllRight = {\n name: 'Move All Right',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx - undoableMoveAllRight.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + undoableMoveAllRight.displacement);\n }\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveAllRight);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + displacement);\n }\n }\n }\n }\n };\n\n const moveUp = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\n const y = Math.min(0.5 - halfLy, selectedElement.cy + moveStepAbsolute / parent.ly);\n displacement = y - selectedElement.cy;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = moveStepAbsolute / parent.ly;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveUp = {\n name: 'Move Up',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy - undoableMoveUp.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy + undoableMoveUp.displacement);\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveUp);\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = moveStepAbsolute * scale;\n const undoableMoveAllUp = {\n name: 'Move All Up',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy - undoableMoveAllUp.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + undoableMoveAllUp.displacement);\n }\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveAllUp);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + displacement);\n }\n }\n }\n }\n };\n\n const moveDown = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = -moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = -moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = -moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\n const y = Math.max(-0.5 + halfLy, selectedElement.cy - moveStepAbsolute / parent.ly);\n displacement = y - selectedElement.cy;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = -moveStepAbsolute / parent.ly;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveDown = {\n name: 'Move Down',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy - undoableMoveDown.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy + undoableMoveDown.displacement);\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveDown);\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = -moveStepAbsolute * scale;\n const undoableMoveAllDown = {\n name: 'Move All Down',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy - undoableMoveAllDown.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + undoableMoveAllDown.displacement);\n }\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveAllDown);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + displacement);\n }\n }\n }\n }\n };\n\n const setMultiSelectionMode = (b: boolean) => {\n useStore.getState().set((state) => {\n state.multiSelectionsMode = b;\n });\n };\n\n const handleKeyDown = (key: string) => {\n const selectedElement = getSelectedElement();\n const step = 1;\n switch (key) {\n case 'left':\n moveLeft(step);\n break;\n case 'shift+left':\n moveLeft(step / GRID_RATIO);\n break;\n case 'ctrl+shift+left':\n case 'meta+shift+left':\n moveLeft(step * GRID_RATIO);\n break;\n case 'right':\n moveRight(step);\n break;\n case 'shift+right':\n moveRight(step / GRID_RATIO);\n break;\n case 'ctrl+shift+right':\n case 'meta+shift+right':\n moveRight(step * GRID_RATIO);\n break;\n case 'down':\n moveDown(step);\n break;\n case 'shift+down':\n moveDown(step / GRID_RATIO);\n break;\n case 'ctrl+shift+down':\n case 'meta+shift+down':\n moveDown(step * GRID_RATIO);\n break;\n case 'up':\n moveUp(step);\n break;\n case 'shift+up':\n moveUp(step / GRID_RATIO);\n break;\n case 'ctrl+shift+up':\n case 'meta+shift+up':\n moveUp(step * GRID_RATIO);\n break;\n case 'ctrl+[':\n case 'meta+[': // for Mac\n zoomView(0.9);\n break;\n case 'ctrl+]':\n case 'meta+]': // for Mac\n zoomView(1.1);\n break;\n case 'ctrl+c':\n case 'meta+c': // for Mac\n if (selectedElement && selectedElement.type !== ObjectType.Roof) {\n copyElementById(selectedElement.id);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Copy',\n timestamp: new Date().getTime(),\n elementId: selectedElement.id,\n elementType: selectedElement.type,\n } as ActionInfo;\n });\n }\n }\n break;\n case 'ctrl+x':\n case 'meta+x': // for Mac\n if (!selectedElement || selectedElement.type === ObjectType.Roof) break;\n if (selectedElement.locked) {\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\n } else {\n const cutElements = removeElement(selectedElement.id, true);\n if (cutElements.length === 0) break;\n\n if (Util.ifNeedListenToAutoDeletion(selectedElement)) {\n useRefStore.getState().setListenToAutoDeletionByCut(true);\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\n } else {\n const undoableCut = {\n name: 'Cut',\n timestamp: Date.now(),\n deletedElements: cutElements,\n selectedElementId: selectedElement.id,\n undo: () => {\n const cutElements = undoableCut.deletedElements;\n if (cutElements.length === 0) return;\n\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\n if (!selectedElement) return;\n\n setCommonStore((state) => {\n state.elements.push(...cutElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(selectedElement.id);\n state.selectedElement = selectedElement;\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n let leftWallId: string | null = null;\n let rightWallId: string | null = null;\n if (wall.leftJoints.length > 0) {\n leftWallId = wall.leftJoints[0];\n }\n if (wall.rightJoints.length > 0) {\n rightWallId = wall.rightJoints[0];\n }\n if (leftWallId || rightWallId) {\n for (const e of state.elements) {\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\n (e as WallModel).rightJoints[0] = wall.id;\n }\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\n (e as WallModel).leftJoints[0] = wall.id;\n }\n }\n }\n }\n });\n },\n redo: () => {\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\n removeElement(undoableCut.deletedElements[0].id, true);\n }\n },\n } as UndoableDelete;\n addUndoable(undoableCut);\n }\n }\n break;\n case 'ctrl+v':\n case 'meta+v': // for Mac\n const pastedElements = pasteElements();\n if (pastedElements.length > 0) {\n const undoablePaste = {\n name: 'Paste by Key',\n timestamp: Date.now(),\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\n undo: () => {\n for (const elem of undoablePaste.pastedElements) {\n removeElementById(elem.id, false);\n }\n },\n redo: () => {\n setCommonStore((state) => {\n state.elements.push(...undoablePaste.pastedElements);\n state.selectedElement = undoablePaste.pastedElements[0];\n });\n },\n } as UndoablePaste;\n addUndoable(undoablePaste);\n }\n break;\n case 'ctrl+alt+h': // for Mac and Chrome OS\n case 'ctrl+home':\n if (!orthographic) {\n const cameraPosition = useStore.getState().viewState.cameraPosition;\n const panCenter = useStore.getState().viewState.panCenter;\n\n // if not already reset\n if (\n cameraPosition[0] !== cameraPosition[1] ||\n cameraPosition[1] !== cameraPosition[2] ||\n cameraPosition[0] !== cameraPosition[2] ||\n panCenter[0] !== 0 ||\n panCenter[1] !== 0 ||\n panCenter[2] !== 0\n ) {\n const undoableResetView = {\n name: 'Reset View',\n timestamp: Date.now(),\n oldCameraPosition: [...cameraPosition],\n oldPanCenter: [...panCenter],\n undo: () => {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n orbitControlsRef.current.object.position.set(\n undoableResetView.oldCameraPosition[0],\n undoableResetView.oldCameraPosition[1],\n undoableResetView.oldCameraPosition[2],\n );\n orbitControlsRef.current.target.set(\n undoableResetView.oldPanCenter[0],\n undoableResetView.oldPanCenter[1],\n undoableResetView.oldPanCenter[2],\n );\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n const v = state.viewState;\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\n v.panCenter = [...undoableResetView.oldPanCenter];\n });\n }\n },\n redo: () => {\n resetView();\n },\n } as UndoableResetView;\n addUndoable(undoableResetView);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.orthographic = false;\n });\n resetView();\n }\n }\n break;\n case 'f2':\n case 'ctrl+b':\n case 'meta+b':\n toggle2DView();\n break;\n case 'ctrl+u':\n case 'meta+u':\n toggleNatigationView();\n break;\n case 'f4':\n case 'ctrl+m':\n case 'meta+m':\n toggleAutoRotate();\n break;\n case 'ctrl+f':\n case 'meta+f': // for Mac\n setCommonStore((state) => {\n state.createNewFileFlag = true;\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n window.history.pushState({}, document.title, HOME_URL);\n if (loggable) {\n state.actionInfo = {\n name: 'Create New File',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n break;\n case 'ctrl+s':\n case 'meta+s': // for Mac\n usePrimitiveStore.setState((state) => {\n state.saveLocalFileDialogVisible = true;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Local File',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'ctrl+shift+o':\n case 'meta+shift+o': // for Mac\n usePrimitiveStore.setState((state) => {\n state.listCloudFilesFlag = true;\n state.openModelsMap = false;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'List Cloud Files',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'ctrl+shift+s':\n case 'meta+shift+s': // for Mac\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Cloud File',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'alt+backspace':\n case 'backspace':\n case 'delete':\n if (!selectedElement) break;\n if (selectedElement.locked) {\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\n } else {\n const deletedElements = removeElement(selectedElement.id, false);\n if (deletedElements.length === 0) break;\n\n if (Util.ifNeedListenToAutoDeletion(selectedElement)) {\n useRefStore.getState().setListenToAutoDeletionByDelete(true);\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\n } else {\n const undoableDelete = {\n name: 'Delete',\n timestamp: Date.now(),\n deletedElements: deletedElements,\n selectedElementId: selectedElement.id,\n undo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n setCommonStore((state) => {\n state.elements.push(...deletedElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(selectedElement.id);\n state.selectedElement = selectedElement;\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedRoofId = null;\n });\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length > 0) {\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\n }\n if (wall.rightJoints.length > 0) {\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\n }\n }\n },\n redo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n removeElement(selectedElement.id, false);\n },\n } as UndoableDelete;\n addUndoable(undoableDelete);\n }\n }\n break;\n case 'ctrl+z':\n case 'meta+z': // for Mac\n if (undoManager.hasUndo()) {\n const commandName = undoManager.undo();\n if (groupMasterId === selectedElement?.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n if (commandName) showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Undo',\n timestamp: new Date().getTime(),\n } as ActionInfo;\n });\n }\n }\n break;\n case 'ctrl+y':\n case 'meta+y': // for Mac\n if (undoManager.hasRedo()) {\n const commandName = undoManager.redo();\n if (commandName) showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\n if (groupMasterId === selectedElement?.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Redo',\n timestamp: new Date().getTime(),\n } as ActionInfo;\n });\n }\n }\n break;\n case 'shift':\n if (useStore.getState().viewState.navigationView) {\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = 5 * useStore.getState().minimumNavigationMoveSpeed;\n state.navigationTurnSpeed = 5 * useStore.getState().minimumNavigationTurnSpeed;\n });\n }\n setEnableFineGrid(true);\n break;\n case 'esc': {\n const addedFoundationID = useStore.getState().addedFoundationId;\n const addedCuboidId = useStore.getState().addedCuboidId;\n const addedWallId = useStore.getState().addedWallId;\n const addedWindowId = useStore.getState().addedWindowId;\n const addedDoorId = useStore.getState().addedDoorId;\n if (addedFoundationID) {\n removeElementById(addedFoundationID, false);\n } else if (addedCuboidId) {\n removeElementById(addedCuboidId, false);\n } else if (addedWallId) {\n removeElementById(addedWallId, false);\n } else if (addedWindowId) {\n removeElementById(addedWindowId, false);\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedWindowId);\n } else if (addedDoorId) {\n removeElementById(addedDoorId, false);\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedDoorId);\n }\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.actionModeLock = false;\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.groupMasterId = null;\n state.groupActionMode = false;\n });\n useRefStore.getState().setEnableOrbitController(true);\n selectNone();\n break;\n }\n case 'ctrl': {\n setMultiSelectionMode(true);\n break;\n }\n }\n };\n\n const handleKeyUp = (key: string) => {\n switch (key) {\n case 'shift':\n if (useStore.getState().viewState.navigationView) {\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = useStore.getState().minimumNavigationMoveSpeed;\n state.navigationTurnSpeed = useStore.getState().minimumNavigationTurnSpeed;\n });\n }\n setEnableFineGrid(false);\n break;\n case 'ctrl+o':\n case 'meta+o': // for Mac\n // this must be handled as a key-up event because it brings up a native file dialog\n // when the key is down and the corresponding key-up event would never be processed as the focus is lost\n if (!useStore.getState().localFileDialogRequested) {\n setCommonStore((state) => {\n state.localFileDialogRequested = true;\n state.openLocalFileFlag = true;\n if (loggable) {\n state.actionInfo = {\n name: 'Open Local File',\n timestamp: new Date().getTime(),\n };\n }\n });\n }\n break;\n case 'ctrl': {\n setMultiSelectionMode(false);\n break;\n }\n }\n };\n\n useEffect(\n () => () => {\n keyNameRef.current = null;\n },\n [],\n );\n\n const keyNameRef = useRef(null);\n\n return (\n <>\n {\n e.preventDefault();\n if (keyNameRef.current === key) return;\n keyNameRef.current = key;\n handleKeyDown(key);\n }}\n />\n {\n e.preventDefault();\n keyNameRef.current = null;\n handleKeyUp(key);\n }}\n />\n \n \n );\n};\n\nexport default React.memo(KeyboardListener);\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\r\n const enabldeNavigationControls = 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 }, []);\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 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 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 orbitControlRef.current.update();\r\n }\r\n setCompassRotation(get().camera);\r\n }, [fileChanged]);\r\n\r\n // switch camera\r\n useEffect(() => {\r\n if (!orthCameraRef.current || !persCameraRef.current || !orbitControlRef.current) {\r\n 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 }\r\n setCompassRotation(get().camera);\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) {\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 {\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\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 (enabldeNavigationControls) {\r\n orbitControlRef.current.listenToKeyEvents(window);\r\n } else {\r\n orbitControlRef.current.removeKeyEvents();\r\n }\r\n }, [enabldeNavigationControls]);\r\n\r\n //switch to navigation controls\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n if (enabldeNavigationControls) {\r\n const camera = get().camera;\r\n camera.position.z = 3;\r\n camera.lookAt(0, 0, 2);\r\n } else {\r\n orbitControlRef.current.update();\r\n }\r\n }, [enabldeNavigationControls]);\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';\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 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 return (\n \n \n {!orthographic && (\n \n {i18n.t('instructionPanel.Rotate', lang)}: {i18n.t('instructionPanel.DragMouse', lang)}\n \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 {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.Move', lang)}: {i18n.t('instructionPanel.MoveInstruction', lang)}\n \n \n {i18n.t('instructionPanel.Turn', lang)}: {i18n.t('instructionPanel.TurnInstruction', lang)}\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\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 && !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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n * @author Charles Xie, Xiaotong Ding\n */\n\nimport React, { Suspense, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { Canvas } from '@react-three/fiber';\nimport Sky from './views/sky';\nimport Axes from './views/axes';\nimport ElementsRenderer from './elementsRenderer';\nimport Ground from './views/ground';\nimport Heliodon from './views/heliodonWrapper';\nimport ifiLogo from './assets/ifi-logo.png';\nimport MainMenu from './mainMenu';\nimport { DEFAULT_FAR, DEFAULT_FOV, VERSION } from './constants';\nimport { visitHomepage, visitIFI } from './helpers';\nimport AcceptCookie from './acceptCookie';\nimport GroundImage from './views/groundImage';\nimport DropdownContextMenu from './components/contextMenu';\nimport { DesignProblem, EvolutionMethod } from './types';\nimport CloudManager from './cloudManager';\nimport ActionLogger from './actionLogger';\nimport Lights from './lights';\nimport { Auxiliary } from './auxiliary';\nimport Compass from './compassContainer';\nimport i18n from './i18n/i18n';\nimport KeyboardListener from './keyboardListener';\nimport CloudImage from './assets/cloud.png';\nimport SceneRadiusCalculator from './sceneRadiusCalculator';\nimport { UndoableChange } from './undo/UndoableChange';\nimport CameraController from './cameraController';\nimport { useRefStore } from './stores/commonRef';\nimport { UndoableCameraChange } from './undo/UndoableCameraChange';\nimport ShareLink from './shareLinks';\nimport SolarPanelTiltAngleGa from './ai/ga/solarPanelTiltAngleGa';\nimport SolarPanelArrayGa from './ai/ga/solarPanelArrayGa';\nimport SolarPanelTiltAnglePso from './ai/pso/solarPanelTiltAnglePso';\nimport SolarPanelArrayPso from './ai/pso/solarPanelArrayPso';\nimport NavigationController from './navigationController';\nimport Waiting from './waiting';\nimport Panels from './panels';\nimport Simulations from './simulations';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { Button } from 'antd';\nimport ProjectGallery from './panels/projectGallery';\nimport SplitPane from 'react-split-pane';\nimport { throttle } from 'lodash';\n\nexport interface AppCreatorProps {\n viewOnly: boolean;\n}\n\nconst AppCreator = ({ viewOnly = false }: AppCreatorProps) => {\n const user = useStore(Selector.user);\n const loggable = useStore(Selector.loggable);\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const changed = usePrimitiveStore(Selector.changed);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n const cloudFile = useStore(Selector.cloudFile);\n const projectView = useStore(Selector.projectView);\n const axes = useStore(Selector.viewState.axes);\n const theme = useStore(Selector.viewState.theme);\n const groundImage = useStore(Selector.viewState.groundImage);\n const groundImageType = useStore(Selector.viewState.groundImageType) ?? 'roadmap';\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const evolutionaryAlgorithmState = useStore(Selector.evolutionaryAlgorithmState);\n\n const [initializing, setInitializing] = useState(true);\n const [canvasRelativeWidth, setCanvasRelativeWidth] = useState(50);\n\n const canvasRef = useRef(null);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n setInitializing(false);\n }, []);\n\n useEffect(() => {\n setCommonStore((state) => {\n // state.loggable = false; // temporarily disabled\n state.loggable = user && user.uid ? !user.email?.endsWith('@intofuture.org') : false;\n if (\n user &&\n (user.noLogging ||\n !user.schoolID ||\n user.schoolID === 'UNKNOWN SCHOOL' ||\n !user.classID ||\n user.classID === 'UNKNOWN CLASS')\n ) {\n state.loggable = false;\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user]);\n\n const zoomView = (scale: number) => {\n if (orthographic) {\n // Previously, we declared this in the header: const cameraZoom = useStore(Selector.viewState.cameraZoom) ?? 20;\n // But it causes the app to be re-rendered every time zoom is called.\n const cameraZoom = useStore.getState().viewState.cameraZoom ?? 20;\n const oldZoom = cameraZoom;\n const newZoom = cameraZoom / scale;\n const undoableChange = {\n name: 'Zoom',\n timestamp: Date.now(),\n oldValue: oldZoom,\n newValue: newZoom,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.cameraZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.cameraZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.cameraZoom = newZoom;\n });\n } else {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n const p = orbitControlsRef.current.object.position;\n const x = p.x * scale;\n const y = p.y * scale;\n const z = p.z * scale;\n const undoableCameraChange = {\n name: 'Zoom',\n timestamp: Date.now(),\n oldCameraPosition: [p.x, p.y, p.z],\n newCameraPosition: [x, y, z],\n undo: () => {\n const oldX = undoableCameraChange.oldCameraPosition[0];\n const oldY = undoableCameraChange.oldCameraPosition[1];\n const oldZ = undoableCameraChange.oldCameraPosition[2];\n orbitControlsRef.current?.object.position.set(oldX, oldY, oldZ);\n orbitControlsRef.current?.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [oldX, oldY, oldZ];\n });\n },\n redo: () => {\n const newX = undoableCameraChange.newCameraPosition[0];\n const newY = undoableCameraChange.newCameraPosition[1];\n const newZ = undoableCameraChange.newCameraPosition[2];\n orbitControlsRef.current?.object.position.set(newX, newY, newZ);\n orbitControlsRef.current?.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [newX, newY, newZ];\n });\n },\n } as UndoableCameraChange;\n addUndoable(undoableCameraChange);\n orbitControlsRef.current.object.position.set(x, y, z);\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [x, y, z];\n });\n }\n }\n };\n\n const resetView = () => {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n // I don't know why the reset method results in a black screen.\n // So we are resetting it here to a predictable position.\n const z = Math.min(50, useStore.getState().sceneRadius * 4);\n orbitControlsRef.current.object.position.set(z, z, z);\n orbitControlsRef.current.target.set(0, 0, 0);\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n const v = state.viewState;\n v.cameraPosition = [z, z, z];\n v.panCenter = [0, 0, 0];\n });\n }\n };\n\n const set2DView = (selected: boolean) => {\n setCommonStore((state) => {\n state.viewState.orthographic = selected;\n state.viewState.enableRotate = !selected;\n if (selected) {\n state.viewState.navigationView = false;\n }\n });\n };\n\n const setNavigationView = (selected: boolean) => {\n if (navigation === selected) return;\n setCommonStore((state) => {\n state.viewState.navigationView = selected;\n state.viewState.enableRotate = !selected;\n if (selected) {\n state.viewState.orthographic = false;\n }\n });\n };\n\n console.log('x');\n\n const isCloudFileOwner = user.uid && new URLSearchParams(window.location.search).get('userid') === user.uid;\n\n const createCanvas = () => {\n return (\n \n \n \n \n \n \n {/* somehow we have to use two suspense wrappers as follows */}\n \n \n \n \n {axes && }\n \n \n {groundImage && }\n {/* */}\n \n \n \n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE && (\n \n )}\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\n \n )}\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem ===\n DesignProblem.SOLAR_PANEL_TILT_ANGLE && }\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\n \n )}\n \n );\n };\n\n return (\n // disable the default context menu for the entire app\n
e.preventDefault()}>\n {/* Spinner, Simulation and Evolution control panels */}\n \n\n \n \n {i18n.t('name.Aladdin', lang)}\n \n {cloudFile && !openModelsMap && (\n \n \n {cloudFile + (isCloudFileOwner && changed ? ' *' : '')}\n {!viewOnly && isCloudFileOwner && changed && (\n {\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Cloud File',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n >\n {i18n.t('word.Save', lang)}\n \n )}\n \n )}\n
\n {viewOnly ? (\n \n \n {' V ' + VERSION}\n \n ) : (\n <>\n \n \n    ©{new Date().getFullYear()} {i18n.t('name.IFI', lang)}\n  \n {i18n.t('word.VersionInitial', lang) + VERSION + '. ' + i18n.t('word.AllRightsReserved', lang) + '. '}\n \n \n )}\n {!viewOnly && (\n \n )}\n \n \n \n \n {/* must specify the height here for the floating window to have correct boundary check*/}\n
\n {\n setCanvasRelativeWidth(Math.round(100 - (size / window.innerWidth) * 100));\n }, 5)}\n // must specify the height again for the split pane to resize correctly with the window\n style={{ height: 'calc(100vh - 72px)', display: 'flex' }}\n pane1Style={{\n width: projectView ? 100 - canvasRelativeWidth + '%' : '0',\n minWidth: projectView ? '25%' : 0,\n maxWidth: projectView ? '75%' : 0,\n }}\n pane2Style={{ width: projectView ? canvasRelativeWidth + '%' : '100%' }}\n resizerStyle={{\n cursor: 'col-resize',\n width: projectView ? '6px' : 0,\n minWidth: projectView ? '6px' : 0,\n maxWidth: projectView ? '6px' : 0,\n backgroundImage: 'linear-gradient(to right, white, gray)',\n }}\n >\n {projectView ? (\n \n ) : (\n <>\n )}\n {createCanvas()}\n \n \n
\n
\n \n {!viewOnly && }\n {!viewOnly && loggable && }\n \n );\n};\n\nexport default React.memo(AppCreator);\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","models/Groupable.ts","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/parapet.tsx","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","components/groupMaster.tsx","analysis/SunMinutes.ts","analysis/sunTools.ts","views/solarUpdraftTower.tsx","resources/glow.png","views/solarPowerTower.tsx","views/solarReceiverPipe.tsx","models/DoorModel.ts","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/wall/wall.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/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/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/windowShutterSubMenu.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/windowShutterColorSelection.tsx","components/contextMenu/elementMenu/windowShutterWidthInput.tsx","components/contextMenu/elementMenu/windowMenu.tsx","components/contextMenu/elementMenu/windowItemSelection.tsx","components/contextMenu/elementMenu/windowNumberInput.tsx","components/contextMenu/elementMenu/windowUValueInput.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/rename.png","assets/delete.png","assets/create_link.png","panels/cloudFilePanel.tsx","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/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","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","AllCuboids","OnlyThisSide","AllSidesOfThisCuboid","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","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","AllSolarPanels","pvModelPanel","SolarPanelSpecs","PanelSize","Cells","CellType","Monocrystalline","Polycrystalline","ThinFilm","Bifacial","BifacialityFactor","Black","Blue","ShadeTolerance","SolarCellEfficiency","NominalOperatingCellTemperature","TemperatureCoefficientOfPmax","parabolicTroughMenu","ModuleLength","Modules","ModulesLong","LatusRectum","OnlyThisParabolicTrough","AllParabolicTroughsAboveFoundation","AllParabolicTroughs","fresnelReflectorMenu","AbsorberPipe","SelectAbsorberToReflectSunlightTo","OnlyThisFresnelReflector","AllFresnelReflectorsAboveFoundation","AllFresnelReflectors","heliostatMenu","Tower","SelectTowerToReflectSunlightTo","OnlyThisHeliostat","AllHeliostatsAboveFoundation","AllHeliostats","parabolicDishMenu","ReceiverStructure","CentralPole","CentralPoleWithTripod","Quadrupod","RimDiameter","ExtraPoleHeightInAdditionToRadius","OnlyThisParabolicDish","AllParabolicDishesAboveFoundation","AllParabolicDishes","wallMenu","TextureDefault","SizeOfWall","OnlyThisWall","AllConnectedWalls","AllWallsAboveFoundation","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","AllWindows","Mullion","MullionWidth","MullionSpacing","MullionColor","Tint","SolarHeatGainCoefficient","Shutter","LeftShutter","RightShutter","BothShutters","ShutterWidth","ShutterColor","Frame","FrameWidth","SillWidth","WindowType","Default","Arched","Polygonal","Interior","roofMenu","OnlyThisRoof","AllRoofsAboveFoundation","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","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","EnableNavigation","DisableNavigation","Move","MoveInstruction","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","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","clickToAccessCloudTools","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","shutter","showLeft","windowShutterLeft","showRight","windowShutterRight","windowShutterColor","windowShutterWidth","Window","mullion","windowMullion","mullionWidth","windowMullionWidth","mullionSpacing","windowMullionSpacing","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","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","autoDeletedRoof","autoDeletedChild","groupActionMode","groupMasterId","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","spacingX","spacingY","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","shutterWidth","shutterHeight","shutterPosX","shutterPosZ","glassShape","getArchedWindowShape","renderSealPlane","showMullion","showFrame","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","_","isGroupable","useGroupMaster","elementModel","enableGroupMaster","buildingResizerUpdateFlag","baseGroupSetRef","Set","baseVerticesRef","childCuboidSetRef","groupMasterDimension","setGroupMasterDimension","groupMasterPosition","setGroupMasterPosition","groupMasterRotation","setGroupMasterRotation","isCuboid","setBaseVertices","checkOverlapWithAllBases","size","setGroupedBasesData","setSingleBaseData","base","zero","getWorldDataById","pos","rot","center","rotateAround","setAllChildBases","el","has","isChild","areTwoBasesOverlapped","maxHeight","maxTopZ","elem","wall","roofId","topZ","bound","calculatePolygonBounds","parentWorldPos","parentTopZ","boundCenterWorldPos","relativePosition","setZ","maxChildHeight","maxBaseZ","baseGroupSet","childCuboidSet","useSelected","selectedElementIdSet","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","useMultiCurrWallArray","currentWallArray","isLoopRef","useRoofHeight","highestWallHeight","useUpdateOldRoofFiles","centerPoint","wallArray","getWallPoint","calculatePolygonCentroid","Number","isNaN","centerPointV3","overhangs","res","getWallNormal","wallPointsAfterOffset","overhangHeight","dLeft","overhangHeightLeft","dRight","overhangHeightRight","getOverhangHeight","getWallHeight","lh","rh","wallLeftPointAfterOverhang","wallRightPointAfterOverhang","leftPointAfterOverhang","rightPointAfterOverhang","addVectors","divideScalar","ceilingPoints","isFirstRender","useIsFirstRender","addIdRoofId","addedRoofId","wallsIdSet","needUpdateWallsId","newWallsIdArray","newWallsIdSet","leftRoofHeight","rightRoofHeight","setAddedRoofId","useUpdateRooftopElements","checkIsFlatRoof","isFlatRoof","setIsFlatRoof","heatmapTextures","setHeatmapTextures","flatHeatmapTexture","setFlatHeatmapTexture","updateSegmentVertices","useUpdateSegmentVerticesMap","fetchHeatmapTexture","segmentVertices","minX","MAX_VALUE","minY","maxX","vcx","vcy","wrapT","wrapS","RepeatWrapping","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","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","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","DEFAULT_PARAPET_SETTINGS","display","parapetHeight","copingsWidth","copingsHeight","wallData","parapetZ","currWallPointData","leftWallPointData","rightWallPointData","bodyHeight","useWallTexture","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","intersection","intersections","eventObject","stopPropagation","wallPointData","innerOffset","outerOffset","leftPointV3","rightPointV3","v3","v4","k1","k2","x0","y0","useHandleSize","handleSize","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","oldParent","newParent","absLx","absLz","WALL_OUTSIDE_SURFACE_MESH_NAME","addUndoableAddRooftopElement","undoableAdd","addedElement","handleAddElementOnRoof","includes","getPointerOnRoof","posRelToFoundation","posRelToCentroid","computeState","makeSolarPanel","solarPanelModelName","solarPanelOrientation","solarPanelPoleHeight","solarPanelPoleSpacing","solarPanelTiltAngle","solarPanelRelativeAzimuth","solarPanelFrameColor","makeWindow","makeSensor","makeLight","lightDistance","lightIntensity","lightColor","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","walls","lw","rw","leftMostWall","rightMostWall","highestLz","longestEavesLength","composedWallArray","isGabled","getHighestComposedWallHeight","ignoreSide","getHighestWallHeight","riseInnerState","setRiseInnerState","mansardTop","relToFoundation","getRoofPointsOfGambrelRoof","gambrelRoof","frontRidgeRightPoint","backRidgeRightPoint","topRidgeRightPoint","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","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","Operation","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","ResizeHandle","MoveHandle","mesh","initalPosition","initalDimension","initalRotation","aspectRatio","lockAspectRatio","intersectionPlanePositionRef","intersectionPlaneRotationRef","resizeAnchorRef","elementHeightMapRef","wallRelPointsMapRef","partialWallHeightMapRef","skylightRelPosMapRef","baseRelPosMapRef","baseRotationMapRef","basePosRatioMapRef","baseDmsRatioMapRef","resizerCenterRelPosRef","foundatonOldDataMapRef","wallOldPointsMapRef","elementOldHeightMapRef","oldPartialWallHeightMapRef","oldSkyligthPosMapRef","setHx","setHy","setHeight","operation","setOperation","getThree","setDimension","initPointerDown","setCommonStoreHandleType","updateUndoableResizeXY","foundationDataMap","wallPointsMap","skyligthPosMap","updateUndoableResizeZ","heightMap","partialWallHeightMap","partialWallHeight","upperLeft","upperRight","lowerLeft","lowerRight","updateFoundationGroupPosition","pointerDownBottomResizeHandle","positionV2","ResizeXY","currLx","currLy","leftPointRelative","rightPointRelative","pointerDonwTopResizeHandle","cameraX","cameraY","ResizeZ","bottomHanldeZ","topHanldeZ","moveHanldeX","moveHnadleY","resizeHandleY","UpperLeftTop","UpperRightTop","LowerLeftTop","LowerRightTop","Upper","Lower","RotateLower","RotateUpper","resizerCenter","elemCenter","pointer2D","anchor","diagonalVector","diagonalDistance","tempWorldDataMap","posRatio","dmsRatio","newLx","newLy","parentWorldData","worldCenter","relativeCenter","leftRelPoint","rightRelPoint","diagonal","updateElementOnRoofFn","resizeXY","heightRatio","newHeight","resizeZ","rotateAngle","groupSize","oldCenter","newCenter","rotate","oldPositionMap","newPositionMap","foundationNewDataMap","wallNewPointsMap","newSkylightPosMap","undoableReizeXY","oldFoundationDataMap","newFoundationDataMap","oldWallPointsMap","newWallPointsMap","oldSkylightPosMap","addUndoableResizeXY","newHeightMap","newPartialWallHeightMap","undoableResizeZ","oldElementHeightMap","newElementHeightMap","oldPartialWallHeightMap","addUndoableReseizeZ","InnerCommonStoreState","action","obj","startsWith","Resize","useSolarPanelHeatmapTexture","useSolarPanelTexture","customizedFrameColor","customizedBacksheetColor","cellType","backsheetColor","canvasTexture","portrait","drawSolarPanelCanvasTexture","ny","ctx","getContext","fillStyle","fillRect","padding","gap","cellSizeX","cellSizeY","beginPath","CanvasTexture","dms","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","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","structureSpacing","structureWidth","structureColor","unfilledHeight","useUpdateOldFiles","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","setGroupMasterId","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","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","detachId","targetWallId","addedWall","isPlantOrHuman","wp","resizeAnchor2D","rp","wbc","dyl","wcx","rc","dxl","parabolicTroughWidth","fresnelReflectorWidth","diameter","parabolicDishRimDiameter","wallAuxToWall","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","insideBoundary","noCollision","pointerOnRoof","anchorWorldPos","pointerRelToFoundation","diffVector","getNewResizedData","whx","whz","lowerLeftPoint","lowerRightPoint","pointerRelToLowerLeft","botNormal","topXRelToLeft","projectOnVector","newTopX","topToBotDist2D","topToBotDist","newPolygonTop","anchorRelToFoundation","rectHeight","anchorToCenterNormal","addUndoableReizePolygonTop","mullionSpacingX","mullionSpacingY","wireframeRadius","RectangleWindow","RulerOnWall","yOffset","defaultShutter","WINDOW_GROUP_NAME","GROUP_NAME","isAllowedToSelectMe","onClickResizeHandle","dimensionData","positionData","positionY","isClickedOnHandles","renderWindow","WallWireFrame","showParapet","leftHeight","rightHeight","cl","cr","ElBeingAddedStatus","DoorWireFrame","ul","ur","ll","lr","DoorFrame","RectangleDoor","doorShape","ArchedDoor","ihx","ihz","iah","DoorHandleWrapper","DoorSealPlanes","doorModel","isFileChangedFlag","door","useUpdateOldDoors","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","WallHeatFlux","isPartialWallFull","frameVertices","getWallVertices","partialWallVertices","getPartialWallVertices","frameArea","doors","getHighestPointOfWall","halfDif","isWall","WALL_BLOCK_PLANE","WALL_INTERSECTION_PLANE_NAME","WALL_PADDING","InsideWallMaterial","night","BackSide","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","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","dimensionXZ","positionXZ","isValidToAddRoof","rect","sameHeight","isSettingElementStartPoint","status","SettingStartPoint","getPointer","object3D","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","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","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","currWorldPosition","currWorldRotation","childWorldPosition","relPos","NS","EW","resizeLx","isYResizeHandle","resizeLy","handleRotate","parentWorldRot","worldPos","handleObject","topHandleWorldPosition","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","baseId","getBaseId","legalAddToCuboid","diff","handleAddElement","legalOnCuboid","isSolarPanelNewAzimuthOk","sensorModel","light","heatFlux","applyAxisAngle","absoluteCoordinates","lit","lightModel","parentThickness","CUBOID_WRAPPER_NAME","CUBOID_STACKABLE_CHILD","CuboidRenderer","showGroupMaster","isStackableChild","design","yearlyYield","sellingPrice","panelCount","unitCost","lat","model","title","userid","newWidth","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","childId","checkLock","ifNeedListenToAutoDeletion","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","newRoof","ceilingRValue","newGambrelRoof","oldGambrelRoof","DefaultViewState","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","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","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","cut","autoDeleted","removed","currentWall","observer","cache","countAllElements","countAllElementsByType","ancestorId","includingLocked","idOk","copyCutElements","copiedElements","elementsMapOldToNew","elementsMapNewToOld","oldElem","newElem","oldRoofId","oldWallId","elemToPaste","isPositionRelative","approved","getAllChildren","elementMap","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","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","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","Ground","setElementRotation","groundModel","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","isRoofTopElement","updateBaseGroupPosition","moveElementOnPointerUp","newHumanOrPlantParentId","rotatedElementId","rotatedElementType","rotateElementOnPointerUp","setBasePosMap","currElem","handleGroupMaster","handleTempHumanPlantChild","getFirstStackableCuboid","firstIntersectedCuboidObject","intersect","firstIntersectedCuboidObjectId","legalOnGround","handleHumanAndPlantPositionFixedOnParent","handleResize","sizeOk","centerPointAbsPos","leftPointAbsPos","rightPointAbsPos","centerPointRelativePos","leftPointRelativePos","rightPointRelativePos","verticesAbsPos","centerPos","relPosToFoundation","handleMove","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","updateColor","AllObjectsOfThisType","needChange","oldColorsAll","undoableChangeAll","oldValues","onChangeComplete","paddingTop","FoundationLengthInput","inputValue","setInputValue","denormalizedPosMapRef","oldChildrenVerticesMapRef","newChildrenVerticesMapRef","denormalizedVerticesMapRef","rejectRef","rejectedValue","rejectChange","doesNewSizeContainAllChildren","containsAllChildren","updateLxWithChildren","newX","newY","attachToObjectGroup","setLx","oldLxsAll","oldSizes","oldChildrenVerticesMap","newChildrenVerticesMap","ps","vs","FoundationWidthInput","denormalizedPositionMapRef","updateLyWithChildren","updateLy","oldLysAll","FoundationHeightInput","updateLzAndCzById","updateLzAndCzForAll","updateCzOfChildren","setLz","oldLzsAll","FoundationAzimuthInput","updateAzimuth","oldAzimuthsAll","oldAzimuth","FoundationTextureSelection","selectedTexture","setSelectedTexture","updateFoundationTextureById","updateFoundationTextureForAll","updateTexture","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","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","updateInMap","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","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","solarPanels","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","oldLineStylesAll","oldLineStylesOnSurface","oldLineStylesAboveFoundation","oldStyle","Dotted","PolygonLineWidthSelection","selectedLineWidth","setSelectedLineWidth","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","oldModelsAll","oldModelsAboveFoundation","oldModelsOnSurface","isParentCuboid","oldModel","SolarPanelOrientationSelection","selectedOrientation","setSelectedOrientation","updateSolarPanelOrientationById","updateSolarPanelOrientationAboveFoundation","updateSolarPanelOrientationOnSurface","updateSolarPanelOrientationForAll","checkElementOnRoofState","withinParent","setOrientation","oldOrientationsAll","oldOrientationsAboveFoundation","oldOrientationsOnSurface","oldOrientation","SolarPanelLengthInput","setDx","updateSolarPanelLxById","panelizeLx","updateSolarPanelLxAboveFoundation","updateSolarPanelLxOnSurface","updateSolarPanelLxForAll","setLength","oldLengthsAll","oldLengthsAboveFoundation","oldLengthsOnSurface","oldLength","panelize","SolarPanelWidthInput","setDy","updateSolarPanelLyById","panelizeLy","updateSolarPanelLyAboveFoundation","updateSolarPanelLyOnSurface","updateSolarPanelLyForAll","oldWidthsAll","oldWidthsAboveFoundation","oldWidthsOnSurface","SolarPanelTiltAngleInput","isOnWall","updateSolarPanelTiltAngleAboveFoundation","isReverse","updateSolarPanelTiltAngleOnSurface","updateSolarPanelTiltAngleForAll","setTiltAngle","oldTiltAnglesAll","oldTiltAnglesAboveFoundation","oldTiltAnglesOnSurface","oldTiltAngle","SolarPanelRelativeAzimuthInput","updateRelativeAzimuthById","updateRelativeAzimuthOnSurface","updateRelativeAzimuthAboveFoundation","updateRelativeAzimuthForAll","setRelativeAzimuth","oldRelativeAzimuthsAll","ra","oldRelativeAzimuthsAboveFoundation","oldRelativeAzimuthsOnSurface","oldRelativeAzimuth","SolarPanelTrackerSelection","selectedTrackerType","setSelectedTrackerType","updateSolarPanelTrackerTypeById","updateSolarPanelTrackerTypeAboveFoundation","updateSolarPanelTrackerTypeOnSurface","updateSolarPanelTrackerTypeForAll","setTrackerType","tracker","oldTrackerTypesAll","tt","oldTrackerTypesAboveFoundation","oldTrackerTypesOnSurface","oldTrackerType","SolarPanelPoleHeightInput","updatePoleHeightById","updatePoleHeightOnSurface","updatePoleHeightAboveFoundation","updatePoleHeightForAll","setPoleHeight","oldPoleHeightsAll","oldPoleHeightsAboveFoundation","oldPoleHeightsOnSurface","oldPoleHeight","SolarPanelPoleSpacingInput","updateSolarPanelPoleSpacingById","updateSolarPanelPoleSpacingAboveFoundation","updateSolarPanelPoleSpacingOnSurface","updateSolarPanelPoleSpacingForAll","setPoleSpacing","oldPoleSpacingsAll","oldPoleSpacingsAboveFoundation","oldPoleSpacingsOnSurface","oldPoleSpacing","SolarPanelFrameColorSelection","updateSolarPanelFrameColorById","updateSolarPanelFrameColorAboveFoundation","updateSolarPanelFrameColorOnSurface","updateSolarPanelFrameColorForAll","setFrameColor","oldFrameColorsAll","fc","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","oldLatusRectumsAll","oldLatusRectumsAboveFoundation","oldLatusRectum","ParabolicTroughModuleLengthInput","setModuleLength","oldModuleLengthsAll","ml","oldModuleLengthsAboveFoundation","oldModuleLength","ParabolicTroughReflectanceInput","updateAboveFoundation","setReflectance","oldReflectancesAll","rf","oldReflectancesAboveFoundation","oldReflectance","ParabolicTroughAbsorptanceInput","oldAbsorptancesAll","oldAbsorptancesAboveFoundation","oldAbsorptance","ParabolicTroughOpticalEfficiencyInput","oldOpticalEfficienciesAll","oldOpticalEfficienciesAboveFoundation","oldOpticalEfficiency","ParabolicTroughThermalEfficiencyInput","oldThermalEfficienciesAll","oldThermalEfficienciesAboveFoundation","oldThermalEfficiency","ParabolicTroughMenu","moduleLengthDialogVisible","setModuleLengthDialogVisible","latusRectumDialogVisible","setLatusRectumDialogVisible","reflectanceDialogVisible","setReflectanceDialogVisible","absorptanceDialogVisible","setAbsorptanceDialogVisible","opticalEfficiencyDialogVisible","setOpticalEfficiencyDialogVisible","thermalEfficiencyDialogVisible","setThermalEfficiencyDialogVisible","ParabolicDishDiameterInput","setDiameter","oldDiametersAll","di","oldDiametersAboveFoundation","oldDiameter","ParabolicDishPoleHeightInput","ParabolicDishLatusRectumInput","ParabolicDishReflectanceInput","ParabolicDishAbsorptanceInput","pd","ParabolicDishOpticalEfficiencyInput","ParabolicDishThermalEfficiencyInput","ParabolicDishStructureTypeInput","inputStructureType","setInputStructureType","setStructureType","oldStructureTypesAll","st","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","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","ShutterSide","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","updateTextureInMap","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","WindowShutterColorSelection","updatedWindow","WindowShutterWidthInput","WindowDataType","WindowShutterSubMenu","shutterWidthDialogVisible","setShutterWidthDialogVisible","selectShutter","both","setWindowShutter","oldShow","newShow","WindowItemSelection","selectedItem","onItemChange","updateOnSameWall","WindowNumberInput","note","digit","oldValuesOnSameWall","undoableChangeOnSameParent","WindowUValueInput","_defs","_path","_path2","_path3","_path4","_path5","_path6","SelectionDialogSettings","NumberDialogSettings","WindowMenu","updateWindowMullionById","updateWindowTypeById","updateWindowFrameById","updateEmptyWindowById","renderTypeSubMenu","RoofTextureSelection","updatedRoof","RoofTexture01Icon","RoofTexture02Icon","RoofTexture03Icon","RoofTexture04Icon","RoofTexture05Icon","RoofTexture06Icon","RoofTexture07Icon","RoofColorSelection","RoofThicknessInput","inputLength","setInputLength","setThickness","oldThicknessAll","oldThicknessAboveFoundation","oldThickness","RoofRafterSpacingInput","updateRoofRafterSpacingById","setRafterSpacing","oldSpacingAll","oldSpacingAboveFoundation","oldSpacing","RoofOpacityInput","GlassTintSelection","selectedTint","setSelectedTint","updateTintById","undoTintInMap","setTint","oldTintsAll","oldTintsAboveFoundation","oldTint","RoofRafterWidthInput","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","RenameImage","LinkImage","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","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","changeProjectTitle","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","restore","pointerEvents","AutoDeletionListener","handleUndoAutoDeletion","manualDeletedElements","manualCutElements","listenToAutoDeletionByCut","listenToAutoDeletionByDelete","combined","undoName","undoableDelete","handleKeys","KeyboardListener","moveStepAbsolute","removeElement","isNewPositionOk","moveLeft","displacement","halfLx","undoableMoveLeft","undoableMoveAllLeft","undoableMoveRight","undoableMoveAllRight","halfLy","undoableMoveUp","undoableMoveAllUp","moveDown","undoableMoveDown","undoableMoveAllDown","setMultiSelectionMode","toggle2DView","toggleNatigationView","toggleAutoRotate","keyNameRef","handleEventType","onKeyEvent","handleKeyUp","SceneRadiusCalculator","components","fetchAabbElements","boxes","setFromObject","box","getWorldDirection","setCompassRotation","dircXY","deg","transform","CameraController","enabldeNavigationControls","cameraPositionLength","panRadius","minPan","maxPan","initialOrbitCamera","initialOrbitDomElement","orbitControlRef","persCameraRef","orthCameraRef","onInteractionStart","onInteractionEnd","oc","getVector","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","onMouseEnter","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","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","xMinMax","yMinMax","xUnit","getUnit","yUnit","RenderDot","Dot","CloseOutlined","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":"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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,cAKAxjB,O,mCAAAA,I,4BAAAA,M,cAKAG,O,qEAAAA,I,uEAAAA,I,kEAAAA,M,cAMA1D,O,iBAAAA,I,mBAAAA,I,oBAAAA,M,cAMAnX,O,aAAAA,I,aAAAA,I,iBAAAA,I,eAAAA,I,gBAAAA,M,cAoBAm+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,cAwBAvxB,K,kBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,sBAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,eAAAA,M,cAYAwxB,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,cAMAnrB,O,eAAAA,I,yBAAAA,I,2BAAAA,I,gCAAAA,M,cAOAorB,K,gBAAAA,E,YAAAA,E,gBAAAA,E,iBAAAA,M,cAOAC,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,4B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","file":"static/js/main.eb054a75.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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_en = {\n translation: {\n name: {\n IFI: 'Institute for Future Intelligence',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\n },\n\n cookie: {\n Statement: 'By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.',\n Accept: 'Accept',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'This product is brought to you by',\n TermsOfService: 'Terms of Service',\n PrivacyPolicy: 'Privacy Policy',\n Software: 'Software',\n Content: 'Content',\n Research: 'Research',\n Support: 'Support',\n Acknowledgment: 'Acknowledgment',\n FundingInformation:\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.',\n Contact: 'For more information, please contact Charles Xie (charles@intofuture.org).',\n Translators: 'Translators',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'All Rights Reserved',\n MeterAbbreviation: 'm',\n Version: 'Version',\n VersionInitial: 'V',\n Options: 'Options',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Maximum Number',\n MinimumNumber: 'Minimum Number',\n MaximumValue: 'Maximum Value',\n MinimumValue: 'Minimum Value',\n Or: 'Or',\n None: 'None',\n High: 'High',\n Partial: 'Partial',\n Teacher: 'Teacher',\n Class: 'Class',\n Total: 'Total',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Range',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Press',\n Open: 'Open',\n Save: 'Save',\n SaveAsImage: 'Save as Image',\n SaveAsCsv: 'Save as CSV',\n Update: 'Update',\n Paste: 'Paste',\n Copy: 'Copy',\n Cut: 'Cut',\n Delete: 'Delete',\n Lock: 'Lock',\n Translucent: 'Translucent',\n Color: 'Color',\n Texture: 'Texture',\n Size: 'Size',\n Thickness: 'Thickness',\n Yes: 'Yes',\n No: 'No',\n OK: 'OK',\n Cancel: 'Cancel',\n Apply: 'Apply',\n Close: 'Close',\n ApplyTo: 'Apply to',\n Run: 'Run',\n Pause: 'Pause',\n Resume: 'Resume',\n Clear: 'Clear',\n Warning: 'Warning',\n Caution: 'Caution',\n Reminder: 'Reminder',\n Length: 'Length',\n Width: 'Width',\n Height: 'Height',\n Radius: 'Radius',\n Angle: 'Angle',\n Azimuth: 'Azimuth',\n Coordinates: 'Coordinates',\n Weather: 'Weather',\n Show: 'Show',\n Animate: 'Animate',\n Date: 'Date',\n Time: 'Time',\n Title: 'Title',\n Owner: 'Owner',\n Action: 'Action',\n Rename: 'Rename',\n Location: 'Location',\n Latitude: 'Latitude',\n Month: 'Month',\n Day: 'Day',\n Hour: 'Hour',\n Daylight: 'Daylight',\n Radiation: 'Radiation',\n Temperature: 'Temperature',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'W',\n Fixed: 'Fixed',\n Elements: 'Elements',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'No Texture',\n FoundationElement: 'Foundation',\n CuboidElement: 'Cuboid',\n PolygonElement: 'Polygon',\n SensorElement: 'Sensor',\n SolarPanelElement: 'Solar Panel',\n WaterHeaterElement: 'Water Heater',\n ParabolicDishElement: 'Parabolic Dish',\n ParabolicTroughElement: 'Parabolic Trough',\n FresnelReflectorElement: 'Fresnel Reflector',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Locked',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Cannot sign in',\n CannotSignOut: 'Cannot sign out',\n YourAccountWasCreated: 'Your account was created.',\n CannotCreateAccount: 'Cannot create an account',\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'The cloud file was not found',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Cannot open the cloud file',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\n CannotRenameCloudFile: 'Cannot rename the cloud file',\n DoYouWantToSaveChanges: 'Do you want to save changes?',\n NotApplicableToSelectedAction: 'Not Applicable to Selected Action',\n ThisElementIsLocked: 'This element is locked.',\n ThisCannotBeUndone: 'This cannot be undone.',\n AzimuthOfNorthIsZero: 'Azimuth of north is 0°',\n CounterclockwiseAzimuthIsPositive: 'Counter-clockwise is positive',\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\n CannotPasteOutsideBoundary: 'Cannot paste outside the boundary.',\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\n CannotMoveObjectTooFar: 'Cannot move object too far.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Existing solar panels will be removed before applying the new layout.',\n DoYouWantToContinue: 'Do you want to continue?',\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\n ScreenshotSaved: 'A screenshot was saved.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simulation started.',\n SimulationCompleted: 'Simulation completed.',\n SimulationAborted: 'Simulation aborted.',\n SimulationPaused: 'Simulation paused.',\n CancelSimulation: 'Cancel simulation',\n PauseSimulation: 'Pause simulation',\n ResumeSimulation: 'Resume simulation',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evolution started.',\n EvolutionCompleted: 'Evolution completed.',\n EvolutionAborted: 'Evolution aborted.',\n EvolutionPaused: 'Evolution paused.',\n EncounterEvolutionError: 'Encountered an evolution error.',\n CancelEvolution: 'Cancel evolution',\n PauseEvolution: 'Pause evolution',\n ResumeEvolution: 'Resume evolution',\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\n ObjectiveFunctionTypeError:\n 'The current objective function is not supported by this operation. Please start from the menu.',\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analysis Options',\n option: {\n GridCellSize: 'Grid Cell Size',\n SamplingFrequency: 'Sampling Frequency',\n TimesPerHour: 'Times per Hour',\n DaysPerYear: 'Days per Year',\n },\n mainMenu: 'Main Menu',\n cloudMenu: 'Cloud Menu',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'File',\n file: {\n CreateNewFile: 'Create New File',\n OpenLocalFile: 'Open Local File',\n SaveAsLocalFile: 'Save as Local File',\n SavingAbortedMustHaveValidFileName: 'Saving aborted! You must have a valid file name',\n OpenCloudFile: 'Open Cloud File',\n SaveCloudFile: 'Save Cloud File',\n SaveAsCloudFile: 'Save as Cloud File',\n SavingAbortedMustHaveValidTitle: 'Saving aborted! You must have a valid title for a cloud file',\n ToSaveYourWorkPleaseSignIn: 'To save your work, please sign in.',\n TakeScreenshot: 'Take Screenshot',\n UseCloudFileName: 'Use Cloud File Name',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Edit',\n edit: {\n Undo: 'Undo',\n Redo: 'Redo',\n },\n viewSubMenu: 'View',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D View',\n ResetView: 'Reset',\n ZoomIn: 'Zoom In',\n ZoomOut: 'Zoom Out',\n AutoRotate: 'Auto rotate',\n ShowShadow: 'Show Shadow',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Translucent Floating Windows',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Site Information',\n DesignInformation: 'Design Information',\n Instruction: 'Instruction',\n StickyNote: 'Sticky Note',\n Note: 'Note',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Weather Data',\n DiurnalTemperature: 'Diurnal Temperature',\n Heliodon: 'Heliodon',\n SunAndTime: 'Sun & Time',\n },\n benchmarksSubMenu: 'Benchmarks',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Line Width',\n SymbolSize: 'Symbol Size',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\n },\n analysisSubMenu: 'Analysis',\n physicsSubMenu: 'Physics',\n physics: {\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\n ReflectionHeatmap: 'Reflection Heatmap',\n },\n sensorSubMenu: 'Sensor',\n sensor: {\n CollectDailyData: 'Collect Daily Data',\n CollectYearlyData: 'Collect Yearly Data',\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Solar Panel',\n solarPanel: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n AnalyzeVisibility: 'Analyze Visibility',\n PanelDiscretization: 'Panel Discretization',\n Exact: 'Exact',\n Approximate: 'Approximate',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\n },\n parabolicTroughSubMenu: 'Parabolic Trough',\n parabolicTrough: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n parabolicDishSubMenu: 'Parabolic Dish',\n parabolicDish: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n fresnelReflectorSubMenu: 'Fresnel Reflector',\n fresnelReflector: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\n },\n\n tutorialsSubMenu: 'Tutorials',\n\n solarEnergyScienceSubMenu: 'Solar Science',\n solarEnergyScienceTutorials: {\n SunAngles: 'Sun Angles Relative to an Observer on the Ground',\n InsolationAndClimate: 'Insolation and Climate',\n SolarRadiationToBox: 'Solar Radiation to a Box',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Building Design',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'All Basic Roof Types',\n },\n\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle of a Solar Panel',\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth of a Solar Panel',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Solar Trackers',\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\n SolarPowerTower: 'Solar Power Tower',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Examples',\n\n solarEnergySubMenu: 'Solar Energy',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Sun Beam and Heliodon',\n RooftopSolarPanels: 'Rooftop Solar Panels',\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Bus Stop',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Vegetative Buffer',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\n },\n\n builtEnvironmentSubMenu: 'Built Environment',\n residentialBuildingsSubMenu: 'Residential Buildings',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Dutch Colonial House',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solarium',\n Church1: 'Church 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Barn Style House',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Commercial Buildings',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Office Building',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Urban Planning',\n urbanPlanningExamples: {\n Heatmap1: 'Heatmap',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Greenhouse',\n Pavilion: 'Pavilion in a Park',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\n },\n\n languageSubMenu: 'Language',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'About Us',\n },\n\n avatarMenu: {\n AccountSettings: 'Account Settings',\n PrivacyStatementTitle: 'User Privacy Protection Statement',\n PrivacyStatement:\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 ',\n SignIn: 'Sign In',\n SignOut: 'Sign Out',\n IfYouAreAStudent: 'If you are a student',\n },\n\n skyMenu: {\n Axes: 'Axes',\n Theme: 'Theme',\n ThemeDefault: 'Default',\n ThemeDesert: 'Desert',\n ThemeDune: 'Dune',\n ThemeForest: 'Forest',\n ThemeGrassland: 'Grassland',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\n ShowAzimuthAngle: 'Show Azimuth Angle',\n ShowElevationAngle: 'Show Elevation Angle',\n ShowZenithAngle: 'Show Zenith Angle',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Image on Ground',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Remove All Unlocked People',\n RemoveAllUnlockedFoundations: 'Remove All Unlocked Foundations',\n RemoveAllUnlockedCuboids: 'Remove All Unlocked Cuboids',\n DoYouReallyWantToRemoveAllPeople: 'Do you really want to remove all the people who are not locked',\n DoYouReallyWantToRemoveAllTrees: 'Do you really want to remove all the trees that are not locked',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Do you really want to remove all the foundations that are not locked',\n DoYouReallyWantToRemoveAllCuboids: 'Do you really want to remove all the cuboids that are not locked',\n LockAllElements: 'Lock All Elements',\n UnlockAllElements: 'Unlock All Elements',\n },\n\n labelSubMenu: {\n Label: 'Label',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Keep Showing Label',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Remove All Unlocked Walls',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Racks',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n SolarPanels: 'Solar Panels',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Do you really want to remove all the solar panels on this foundation that are not locked',\n ParabolicTroughs: 'Parabolic Troughs',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\n ParabolicDishes: 'Parabolic Dishes',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\n FresnelReflectors: 'Fresnel Reflectors',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\n Heliostats: 'Heliostats',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\n Sensors: 'Sensors',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Do you really want to remove all the sensors on this foundation that are not locked',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Walls',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Do you really want to remove all the walls on this foundation that are not locked',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Polygons',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Do you really want to remove all the polygons on this foundation that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Do you really want to remove all the humans on this foundation who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Do you really want to remove all the trees on this foundation that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Only This Foundation',\n AllConnectedFoundations: 'All Connected Foundations',\n AllFoundations: 'All Foundations',\n AddPolygon: 'Add Polygon',\n SolarStructure: 'Solar Structure',\n GroupMaster: 'Group Master',\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\n ReceiverTowerHeight: 'Height of Receiver Tower',\n ReceiverTowerRadius: 'Radius of Receiver Tower',\n ReceiverAbsorptance: 'Absorptance of Receiver',\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\n AbsorberHeight: 'Height of Absorber Pipe',\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\n AbsorberAbsorptance: 'Absorptance of Absorber',\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\n },\n\n cuboidMenu: {\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Racks',\n SolarPanels: 'Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Do you really want to remove all the solar panels on this cuboid that are not locked',\n Sensors: 'Sensors',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Do you really want to remove all the sensors on this cuboid that are not locked',\n Polygons: 'Polygons',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Do you really want to remove all the polygons on this cuboid that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Do you really want to remove all the humans on this cuboid who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Do you really want to remove all the trees on this cuboid that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Only This Cuboid',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids Above Same Base',\n AllCuboids: 'All Cuboids',\n OnlyThisSide: 'Only This Side',\n AllSidesOfThisCuboid: 'All Sides of This Cuboid',\n AllSidesOfAllCuboids: 'All Sides of All Cuboids',\n AddPolygon: 'Add Polygon',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Filled',\n FillTexture: 'Fill Texture',\n FillColor: 'Fill Color',\n Opacity: 'Opacity',\n LineColor: 'Line Color',\n LineWidth: 'Line Width',\n LineStyle: 'Line Style',\n SolidLine: 'Solid Line',\n DashedLine: 'Dashed Line',\n DottedLine: 'Dotted Line',\n InsertVertexBeforeIndex: 'Insert Vertex Before Index',\n InsertVertexAfterIndex: 'Insert Vertex After Index',\n DeleteVertex: 'Delete Vertex',\n OnlyThisPolygon: 'Only This Polygon',\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\n AllPolygonsAboveFoundation: 'All Polygons Above Foundation',\n AllPolygons: 'All Polygons',\n Layout: 'Layout',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\n SolarPanelArrayModel: 'Solar Panel Model',\n SolarPanelArrayOrientation: 'Orientation',\n SolarPanelArrayTiltAngle: 'Tilt Angle',\n SolarPanelArrayRowWidth: 'Row Width',\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Row Axis',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Pole Height',\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimization',\n Parameters: 'Parameters',\n Variables: 'Variables',\n Constants: 'Constants',\n GeneticAlgorithm: 'Genetic Algorithm',\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n Generation: 'Generation',\n Gene: 'Gene',\n NormalizedVariables: 'Normalized Variables',\n Objective: 'Objective',\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\n ObjectiveFunctionDailyProfit: 'Daily Profit',\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\n RouletteWheel: 'Roulette Wheel',\n Tournament: 'Tournament',\n SearchMethod: 'Search Method',\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\n PopulationSize: 'Population Size',\n MaximumGenerations: 'Maximum Generations',\n SelectionRate: 'Selection Rate',\n CrossoverRate: 'Crossover Rate',\n MutationRate: 'Mutation Rate',\n Step: 'Step',\n SwarmSize: 'Swarm Size',\n MaximumSteps: 'Maximum Steps',\n MaximumVelocity: 'Maximum Velocity',\n InertiaWeight: 'Inertia Weight',\n CognitiveCoefficient: 'Cognitive Coefficient',\n SocialCoefficient: 'Social Coefficient',\n ConvergenceThreshold: 'Convergence Threshold for Termination',\n LocalSearchRadius: 'Local Search Radius',\n RowsPerRackRange: 'Range for Rows per Rack',\n TiltAngleRange: 'Range for Tilt Angle',\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\n },\n\n treeMenu: {\n ShowModel: 'Show Model',\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Change Person',\n Flip: 'Flip',\n Observer: 'Observer',\n ViewFromThisPerson: 'View from This Person',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Relative Azimuth',\n Pole: 'Pole',\n PoleHeight: 'Pole Height',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Extra Pole Height',\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\n DrawSunBeam: 'Draw Sun Beam',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflector Reflectance',\n ReceiverAbsorptance: 'Receiver Absorptance',\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Change PV Model',\n Orientation: 'Orientation',\n Portrait: 'Portrait',\n Landscape: 'Landscape',\n FrameColor: 'Frame Color',\n Panels: 'panels',\n PanelsWide: 'panels wide',\n PanelsLong: 'panels long',\n TiltAngle: 'Tilt Angle',\n SouthFacingIsPositive: 'South facing is positive',\n Tracker: 'Tracker',\n SolarTrackerFollowsSun: 'A tracker follows the sun to increase solar panel outputs.',\n PoleSpacing: 'Pole Spacing',\n NoTracker: 'No Tracker',\n HorizontalSingleAxisTracker: 'Horizontal Single Axis Tracker',\n VerticalSingleAxisTracker: 'Vertical Single Axis Tracker',\n AltazimuthDualAxisTracker: 'Altazimuth Dual Axis Tracker',\n OnlyThisSolarPanel: 'Only This Solar Panel',\n AllSolarPanelsOnSurface: 'All Solar Panels on the Same Surface',\n AllSolarPanelsAboveFoundation: 'All Solar Panels Above the Same Foundation',\n AllSolarPanels: 'All Solar Panels',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Solar Panel Specs',\n Model: 'Model',\n PanelSize: 'Panel Size',\n Cells: 'Cells',\n CellType: 'Cell Type',\n Monocrystalline: 'Monocrystalline',\n Polycrystalline: 'Polycrystalline',\n ThinFilm: 'Thin Film',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Black',\n Blue: 'Blue',\n ShadeTolerance: 'Shade Tolerance',\n SolarCellEfficiency: 'Solar Cell Efficiency',\n NominalOperatingCellTemperature: 'Nominal Operating Cell Temperature',\n TemperatureCoefficientOfPmax: 'Temperature Coefficient of Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n LatusRectum: 'Latus Rectum',\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\n AllParabolicTroughs: 'All Parabolic Troughs',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Absorber Pipe',\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\n AllFresnelReflectors: 'All Fresnel Reflectors',\n },\n\n heliostatMenu: {\n Tower: 'Tower',\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\n OnlyThisHeliostat: 'Only This Heliostat',\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\n AllHeliostats: 'All Heliostats',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Receiver Structure',\n CentralPole: 'Central Pole',\n CentralPoleWithTripod: 'Central Pole with Tripod',\n Quadrupod: 'Quadrupod',\n RimDiameter: 'Rim Diameter',\n LatusRectum: 'Latus Rectum',\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\n AllParabolicDishes: 'All Parabolic Dishes',\n },\n\n wallMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n SizeOfWall: 'Size of Wall',\n OnlyThisWall: 'Only This Wall',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: 'All Walls Above the Same Foundation',\n AllWalls: 'All Walls',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\n Doors: 'Doors',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\n WallStructure: 'Wall Structure',\n DefaultStructure: 'Default',\n StudStructure: 'Stud',\n PillarStructure: 'Pillar',\n Opacity: 'Opacity',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Height',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Only This Window',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\n AllWindows: 'All Windows',\n Width: 'Width',\n Height: 'Height',\n Mullion: 'Mullion',\n MullionWidth: 'Mullion Width',\n MullionSpacing: 'Mullion Spacing',\n MullionColor: 'Mullion Color',\n Tint: 'Tint',\n Opacity: 'Opacity',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Shutter',\n LeftShutter: 'Left Shutter',\n RightShutter: 'Right Shutter',\n BothShutters: 'Both Shutters',\n ShutterWidth: 'Relative Width',\n ShutterColor: 'Shutter Color',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n OnlyThisRoof: 'Only This Roof',\n AllRoofsAboveFoundation: 'All Roofs Above the Same Foundation',\n AllRoofs: 'All Roofs',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Rafter Spacing',\n RafterWidth: 'Rafter Width',\n RafterThickness: 'Rafter Thickness',\n RafterColor: 'Rafter Color',\n RoofColor: 'Roof Color',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Glass Tint',\n Opacity: 'Opacity',\n RoofStructure: 'Roof Structure',\n DefaultStructure: 'Default',\n RafterStructure: 'Rafter',\n GlassStructure: 'Glass',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Default',\n Texture01: 'Texture 1',\n Texture02: 'Texture 2',\n Texture03: 'Texture 3',\n Texture04: 'Texture 4',\n Texture05: 'Texture 5',\n Texture06: 'Texture 6',\n Texture07: 'Texture 7',\n Texture08: 'Texture 8',\n Texture09: 'Texture 9',\n Texture10: 'Texture 10',\n Texture11: 'Texture 11',\n Texture12: 'Texture 12',\n Texture13: 'Texture 13',\n Texture14: 'Texture 14',\n Texture15: 'Texture 15',\n Texture16: 'Texture 16',\n Texture17: 'Texture 17',\n OnlyThisDoor: 'Only This Door',\n AllDoorsOnWall: 'All Doors on the Same Wall',\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\n AllDoors: 'All Doors',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'High',\n Low: 'Low',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Color Contrast',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\n },\n\n instructionPanel: {\n Rotate: 'Rotate',\n DragMouse: 'Drag mouse',\n Zoom: 'Zoom',\n MouseWheelOrKeys: 'Rotate mouse wheel or press Ctrl+[ or Ctrl+]',\n MouseWheelOrKeysMac: 'Rotate mouse wheel or press ⌘+[ or ⌘+]',\n Pan: 'Pan',\n HoldCtrlDragMouse: 'Hold Ctrl and drag mouse',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Reset',\n AutoRotate: 'Auto rotate',\n StartOrStop: 'Press F4 to start or stop',\n },\n\n mapPanel: {\n ImageOnGround: 'Image on Ground',\n WeatherStations: 'Weather Stations',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Coordinates',\n Zoom: 'Zoom',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Solar Panel Visibility',\n Observer: 'Observer',\n VantagePoint: 'Vantage Point',\n ItemizedVisibilityByFields: 'Itemized by Fields',\n TotalVisibility: 'Total',\n },\n\n sensorPanel: {\n LightSensor: 'Light Sensor',\n WeatherDataFrom: 'Weather Data from',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Solar Panel Daily Yield',\n SolarPanelYearlyYield: 'Solar Panel Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualSolarPanels: 'Show outputs of individual solar panels',\n Profit: 'Profit',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Daily Yield',\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\n ChimneyAirTemperature: 'Chimney Air Temperature',\n ChimneyWindSpeed: 'Chimney Wind Speed',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Sun & Time Settings',\n SunAngles: 'Angles',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'My Cloud Files',\n GenerateLink: 'Generate Link',\n LinkGeneratedInClipBoard: 'A link has been generated in the clip board',\n DoYouReallyWantToDelete: 'Do you really want to delete',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'My Account Settings',\n MyID: 'My 🆔',\n ClickToCopyMyID: 'Click to copy my ID',\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'User Count',\n SchoolID: 'School ID',\n ClassID: 'Class ID',\n },\n\n weatherPanel: {\n SunshineHours: 'Sunshine',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Select Air Temperature Model',\n Sinusoidal: 'Sinusoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Economics Parameters',\n ElectricitySellingPrice: 'Electricity Selling Price',\n OperationalCostPerUnit: 'Operational Cost per Unit',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Clearness',\n ShowDaylightResults: 'Show daylight results',\n ShowSkyClearnessResults: 'Show sky clearness results',\n ShowAverageDailySolarRadiation: 'Show average daily solar radiation',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'There is no sensor for collecting data.',\n NoSolarPanelForAnalysis: 'There is no solar panel for analysis.',\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Cloud file',\n Select: 'Select',\n AddFoundation: 'Add foundation',\n AddWall: 'Add wall',\n AddWindow: 'Add window',\n AddDoor: 'Add door',\n AddPyramidRoof: 'Add pyramid roof',\n AddGableRoof: 'Add gable roof',\n AddHipRoof: 'Add hip roof',\n AddGambrelRoof: 'Add gambrel roof',\n AddMansardRoof: 'Add Mansard roof',\n AddCuboid: 'Add cuboid',\n AddSensor: 'Add sensor',\n AddSolarPanel: 'Add solar panel',\n AddWaterHeater: 'Add water heater',\n AddParabolicDish: 'Add parabolic dish',\n AddParabolicTrough: 'Add parabolic trough',\n AddFresnelReflector: 'Add Fresnel reflector',\n AddHeliostat: 'Add heliostat',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Add tree',\n AddFlower: 'Add flower',\n AddPeople: 'Add people',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Manipulate a group',\n ClearScene: 'Clear scene',\n ShowSunAndTimeSettings: 'Show sun and time settings',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'Do you really want to clear the content',\n ClickForMoreButtons: 'Click for more buttons',\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\n SwitchToAddingWall: 'Switch to Adding Wall',\n SwitchToAddingWindow: 'Switch to Adding Window',\n SwitchToAddingDoor: 'Switch to Adding Door',\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\n SwitchToAddingSensor: 'Switch to Adding Sensor',\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Switch to Adding Tree',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Switch to Adding People',\n },\n\n tooltip: {\n gotoIFI: 'Go to Institute for Future Intelligence',\n visitAladdinHomePage: 'Visit Aladdin Homepage',\n clickToOpenMenu: 'Click to open main menu',\n clickToAccessCloudTools: 'Click to access cloud tools',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Dogwood',\n Elm: 'Elm',\n FanPalm: 'Fan Palm',\n Linden: 'Linden',\n Magnolia: 'Magnolia',\n Maple: 'Maple',\n Oak: 'Oak',\n Pine: 'Pine',\n Spruce: 'Spruce',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Jaah',\n Jack: 'Jack',\n Jacob: 'Jacob',\n Jacqueline: 'Jacqueline',\n Jade: 'Jade',\n Jamelia: 'Jamelia',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Jaya',\n Jaye: 'Jaye',\n Jeanette: 'Jeanette',\n Jedi: 'Jedi',\n Jeff: 'Jeff',\n Jena: 'Jena',\n Jennifer: 'Jennifer',\n Jess: 'Jess',\n Jett: 'Jett',\n Jill: 'Jill',\n Jiya: 'Jiya',\n Joan: 'Joan',\n Jocelyn: 'Jocelyn',\n Joel: 'Joel',\n Joey: 'Joey',\n John: 'John',\n Jonathon: 'Jonathon',\n Jose: 'Jose',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Judd',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Julio',\n Jumapili: 'Jumapili',\n June: 'June',\n Juro: 'Juro',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_zh_cn = {\n translation: {\n name: {\n IFI: '未来智能研究所',\n Aladdin: '阿拉丁',\n Tagline: '阿拉丁: 探索人工智能时代的设计软件 — 未来智能研究所研发',\n },\n\n cookie: {\n Statement: '声明:为了改善您的用户体验,阿拉丁采用cookie储存少量数据。',\n Accept: '同意',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: '未来智能研究所荣誉出品',\n TermsOfService: '服务条款',\n PrivacyPolicy: '隐私政策',\n Software: '软件',\n Content: '课件',\n Research: '研究',\n Support: '服务',\n Acknowledgment: '鸣谢',\n FundingInformation:\n '本产品的研发承蒙美国国家科学基金会慷慨资助(项目号#2105695,#2131097,#2301164)。本产品的任何观点或结论仅代表创作者个人意见。',\n Contact: '如您需要更多信息,请联系 Charles Xie (charles@intofuture.org)。我们会尽快回复。',\n Translators: '翻译',\n },\n\n word: {\n LastUpdate: '上一次更新',\n Small: '小',\n Medium: '中',\n Large: '大',\n Design: '设计',\n Information: '信息',\n Type: '类别',\n Text: '文字',\n FontSize: '字体大小',\n FontColor: '字体颜色',\n Model: '模型',\n Models: '模型',\n Upload: '上传',\n ClickCount: '点击数',\n Share: '分享',\n AlreadyLike: '已点赞',\n Like: '点赞',\n MustLogInToLike: '必须登录才能点赞',\n AllRightsReserved: '版权所有',\n MeterAbbreviation: '米',\n Version: '版本',\n VersionInitial: '版本',\n Options: '选项',\n Maximum: '最大',\n Minimum: '最小',\n MaximumNumber: '最多',\n MinimumNumber: '最少',\n MaximumValue: '最大值',\n MinimumValue: '最小值',\n Or: '或',\n None: '无',\n High: '高',\n Partial: '部分',\n Teacher: '老师',\n Class: '班级',\n Total: '总数',\n Leaderboard: '用戶排行榜',\n Latest: '最新',\n Range: '范围',\n SIUnit: '国际单位制',\n USUnit: '美国单位制',\n ThermalTransmittance: '热透过率',\n ThermalResistance: '热阻',\n UValue: 'U值',\n RValue: 'R值',\n VolumetricHeatCapacity: '容积热容',\n BuildingHVACSystem: '建筑物暖通空调系统',\n ThermostatSetpoint: '恒温器设定值',\n TemperatureToleranceThreshold: '温度忍耐阈值',\n TemperatureToleranceThresholdExplanation:\n '当日最低外面温度高于恒温器设定值减去此阈值,暖气不开。\\n当日最高外面温度低于恒温器设定值加上此阈值,空调不开。',\n Press: '按',\n Open: '打开',\n Save: '保存',\n SaveAsImage: '保存为图像',\n SaveAsCsv: '保存为CSV',\n Update: '刷新',\n Paste: '粘贴',\n Copy: '复制',\n Cut: '剪切',\n Delete: '删除',\n Lock: '固定',\n Translucent: '半透明',\n Color: '颜色',\n Texture: '材质',\n Thickness: '厚度',\n Size: '尺寸',\n Yes: '是',\n No: '不',\n OK: '确定',\n Cancel: '取消',\n Apply: '应用',\n Close: '关闭',\n ApplyTo: '适用于',\n Run: '运行',\n Pause: '暂停',\n Resume: '继续',\n Clear: '清空',\n Warning: '警告',\n Caution: '小心',\n Reminder: '提醒',\n Length: '长度',\n Width: '宽度',\n Height: '高度',\n Radius: '半径',\n Angle: '角度',\n Azimuth: '方位角',\n Coordinates: '坐标',\n Weather: '天气',\n Show: '显示',\n Animate: '动画',\n Date: '日期',\n Time: '时间',\n Title: '标题',\n Owner: '所有者',\n Action: '操作',\n Rename: '改名',\n Location: '位置',\n Latitude: '纬度',\n Month: '月份',\n Day: '天',\n Hour: '小时',\n Daylight: '白天长度',\n Radiation: '辐射',\n Temperature: '温度',\n kWh: '千瓦时',\n dollar: '元',\n MeterPerSecond: '米/秒',\n NorthInitial: '北',\n SouthInitial: '南',\n EastInitial: '东',\n WestInitial: '西',\n Fixed: '固定',\n Elements: '部件',\n Energy: '能量',\n Unknown: '未知',\n Label: '标签',\n Description: '描述',\n NoDescription: '无描述',\n MaximumCharacters: '最多字符数',\n Author: '作者',\n Publisher: '发布者',\n Building: '建筑',\n ResidentialBuilding: '住宅建筑',\n CommercialBuilding: '商用建筑',\n SchoolBuilding: '学校建筑',\n TouristAttraction: '旅游景点',\n UnderConstruction: '在建',\n Photovoltaic: '光伏',\n Anonymous: '无名氏',\n Nickname: '别名',\n Pin: '置顶',\n Unpin: '解除置顶',\n },\n\n shared: {\n NoTexture: '无材质',\n FoundationElement: '地基',\n CuboidElement: '长方体',\n PolygonElement: '多边形',\n SensorElement: '传感器',\n SolarPanelElement: '光伏板',\n WaterHeaterElement: '太阳能热水器',\n ParabolicDishElement: '抛物线碟',\n ParabolicTroughElement: '抛物线槽',\n FresnelReflectorElement: '菲涅耳反射镜',\n HeliostatElement: '定日镜',\n WindTurbineElement: '风力涡轮机',\n LightElement: '电灯',\n ElementLocked: '固定',\n ModelType: '模型类别',\n OutputBreakdown: '分列发电量',\n MoreResults: '更多结果',\n },\n\n message: {\n ModelNotFound: '没有找到模型',\n CannotSignIn: '登录失败',\n CannotSignOut: '退出失败',\n YourAccountWasCreated: '成功建立您的账号。',\n CannotCreateAccount: '无法创建账号',\n YourAccountSettingsWereSaved: '您的账号设定已保存。',\n CannotSaveYourAccountSettings: '您的账号设定无法保存',\n CannotSaveYourFileToCloud: '无法保存您的文件到云端',\n CannotCreateNewProject: '无法创建新项目',\n CannotCreateNewProjectWithoutTitle: '没有标题, 无法创建新项目',\n CannotOpenYourProjects: '无法打开您的项目列表',\n CannotOpenProject: '无法打开项目',\n CannotDeleteProject: '无法删除项目',\n CannotRenameProject: '无法给项目改名',\n CannotAddDesignToProject: '无法把此设计加到项目里',\n CannotAddDesignToProjectOwnedByOthers: '不能把此设计加到别人的项目里',\n DesignRemovedFromProject: '设计被成功地从项目里删除',\n CannotRemoveDesignFromProject: '无法把此设计从项目里删除',\n CannotUpdateProject: '无法更新项目',\n CannotFetchProjectData: '无法取得项目数据',\n TitleUsedChooseDifferentOne: '此标题已经被使用, 请采用不同的标题',\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此标题的云文件已经存在,您确定要覆盖它吗?',\n CloudFileNotFound: '找不到此云端文件',\n CannotLoadModelsOnMap: '无法下载地图上的模型',\n CannotLoadLeaderboard: '无法下载排行榜',\n CannotPublishModelOnMap: '模型无法发布到地图上',\n CannotLikeModelFromMap: '无法点赞地图上的模型',\n CannotDeleteModelFromMap: '无法删除地图上的模型',\n ModelDeletedFromMap: '模型已从地图上删除',\n DoYouWantToDeleteModelFromMap: '您要删除地图上的这个模型吗?',\n CannotOpenCloudFile: '此云端文件无法打开',\n CannotReadCloudFile: '无法读取此云端文件',\n CannotWriteCloudFile: '无法存储此云端文件',\n CloudFileCopied: '拷贝云端文件',\n CannotOpenCloudFolder: '您的云端文件夹无法打开',\n CannotDeleteCloudFile: '无法删除此云端文件',\n CannotRenameCloudFile: '此云端文件的名字无法更改',\n DoYouWantToSaveChanges: '您要保存当前文件吗?',\n NotApplicableToSelectedAction: '此值不适用于当前选择范围',\n ThisElementIsLocked: '这个部件被锁定。',\n ThisCannotBeUndone: '这个操作一旦执行就不能撤销。',\n AzimuthOfNorthIsZero: '正北的方位角为零度',\n CounterclockwiseAzimuthIsPositive: '逆时针为正',\n MoveCancelledBecauseOfOverlap: '位置重叠,移动取消。',\n MoveOutsideBoundaryCancelled: '位置出界,移动取消。',\n RotationCancelledBecauseOfOverlap: '位置重叠,旋转取消。',\n RotationOutsideBoundaryCancelled: '位置出界,旋转取消。',\n ResizingCancelledBecauseOfOverlap: '位置重叠,尺寸调整取消。',\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸调整取消。',\n CannotPasteOutsideBoundary: '位置出界,不能复制。',\n CannotPasteBecauseOfOverlap: '位置重叠,不能复制。',\n CannotMoveObjectTooFar: '位置太远,移动取消。',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '采用新布局之前必须移除现有的光伏板。',\n DoYouWantToContinue: '您想继续吗?',\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接触。',\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重叠。',\n ScreenshotSaved: '截屏图片保存在下载文件夹里。',\n CsvFileSaved: 'CSV保存在下载文件夹里。',\n SimulationStarted: '模拟开始。',\n SimulationCompleted: '模拟结束。',\n SimulationAborted: '模拟取消。',\n SimulationPaused: '模拟暂停。',\n CancelSimulation: '取消模拟',\n PauseSimulation: '暂停模拟',\n ResumeSimulation: '继续模拟',\n SimulationWillNotStartDueToErrors: '由于错误模拟无法运行',\n SimulationWillStartDespiteWarnings: '发现问题,但模拟仍然将运行。',\n EvolutionStarted: '演化开始。',\n EvolutionCompleted: '演化结束。',\n EvolutionAborted: '演化取消。',\n EvolutionPaused: '演化暂停。',\n EncounterEvolutionError: '演化出错。',\n CancelEvolution: '取消演化',\n PauseEvolution: '暂停演化',\n ResumeEvolution: '继续演化',\n ConvergenceThresholdHasBeenReached: '收敛阈值已达到。',\n MaximumNumberOfGenerationsHasBeenReached: '最大世代数已达到。',\n MaximumNumberOfStepsHasBeenReached: '最大步数已达到。',\n ObjectiveFunctionTypeError: '此操作不支持当前的目标函数。请从菜单启动此功能。',\n WallsAreNotAtSameHeight: '墙体高度不同。',\n WallsAreNotPerpendicular: '墙体不垂直。',\n WallsAreNotConnected: '墙体不相连。',\n WallsNumberNeedToBeFour: '墙体数量必须为四个。',\n BuildingContainsEmptyWall: '建筑物有空墙。',\n BuildingRoofMissing: '建筑物没有屋顶。',\n UnknownErrors: '未知错误。',\n },\n\n menu: {\n AnalysisOptions: '分析选项',\n option: {\n GridCellSize: '计算网格的尺寸',\n SamplingFrequency: '采样频率',\n TimesPerHour: '每小时采样次数',\n DaysPerYear: '每一年采样天数',\n },\n mainMenu: '主菜单',\n cloudMenu: '云菜单',\n projectSubMenu: '项目',\n project: {\n CreateNewProject: '创建新项目',\n OpenProject: '打开项目',\n SaveProjectAs: '另存项目为',\n YouMustLogInToCreateProject: '您必须登录才能创建项目',\n YouMustLogInToOpenProject: '您必须登录才能打开项目',\n },\n fileSubMenu: '文件',\n file: {\n CreateNewFile: '创建新文件',\n OpenLocalFile: '打开本地文件',\n SaveAsLocalFile: '保存为本地文件',\n SavingAbortedMustHaveValidFileName: '文件名无效,保存失败',\n OpenCloudFile: '打开云端文件',\n SaveCloudFile: '保存云端文件',\n SaveAsCloudFile: '保存为云端文件',\n SavingAbortedMustHaveValidTitle: '云端文件名无效,保存失败',\n ToSaveYourWorkPleaseSignIn: '为了保存您的云端文件,请您先登录。',\n TakeScreenshot: '截屏',\n UseCloudFileName: '采用云端文件名',\n PublishOnModelsMap: '发布到地图上',\n PublishedOnModelsMap: '您的模型成功发布到地图上',\n UpdatedOnModelsMap: '您的模型更新成功',\n YouMustLogInToPublishYourModel: '您必须登录才能发布模型',\n YouCannotPublishAModelThatYouDoNotOwn: '您不能发布他人的模型',\n YouMustSaveModelOnCloudBeforePublishingIt: '您必须先把此模型保存在云端才能发布它',\n },\n editSubMenu: '编辑',\n edit: {\n Undo: '撤销',\n Redo: '重做',\n },\n viewSubMenu: '视界',\n view: {\n NavigationView: '导航模式',\n TwoDimensionalView: '二维模式',\n ResetView: '重置视角',\n ZoomIn: '放大',\n ZoomOut: '缩小',\n AutoRotate: '自动旋转',\n ShowShadow: '显示阴影',\n ShowSurfaceShininess: '显示表面光泽',\n TranslucentFloatingWindows: '透明浮动窗口',\n accessoriesSubMenu: '配件',\n accessories: {\n SiteInformation: '位置信息',\n DesignInformation: '设计信息',\n Instruction: '操作说明',\n StickyNote: '便签',\n Note: '便签',\n },\n },\n settingsSubMenu: '设置',\n settings: {\n WeatherData: '气象数据',\n DiurnalTemperature: '昼夜温度',\n Heliodon: '日影仪',\n SunAndTime: '太阳和时间',\n },\n benchmarksSubMenu: '基准',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: '太阳能辐射模型预测和实际测量的对比',\n BESTESTCase600: '建筑物能耗模拟测试:BESTEST案例600',\n BESTESTCase610: '建筑物能耗模拟测试:BESTEST案例610',\n BESTESTCase620: '建筑物能耗模拟测试:BESTEST案例620',\n BESTESTCase630: '建筑物能耗模拟测试:BESTEST案例630',\n },\n graph: {\n LineWidth: '线条宽度',\n SymbolSize: '符号大小',\n BarCategoryGap: '直条间隙',\n ShowHorizontalGridLines: '显示格子的水平线条',\n ShowVerticalGridLines: '显示格子的竖直线条',\n },\n analysisSubMenu: '分析',\n physicsSubMenu: '物理',\n physics: {\n DailySolarRadiationHeatmap: '当日太阳辐射总量分布热图',\n SolarRadiationHeatmapOptions: '太阳辐射热图选项',\n SolarRadiationHeatmapGridCellSize: '太阳辐射热图网格的尺寸',\n SolarRadiationHeatmapMaxValue: '太阳辐射热图最大值',\n SolarRadiationHeatmapNoAnimation: '若无移动部件则省略动画',\n ReflectionHeatmap: '反射热图',\n },\n sensorSubMenu: '传感器',\n sensor: {\n CollectDailyData: '收集当天数据',\n CollectYearlyData: '收集全年数据',\n SensorSimulationNoAnimation: '若无移动部件则省略动画',\n },\n buildingSubMenu: '建筑物',\n building: {\n AnalyzeDailyBuildingEnergy: '建筑物当天能耗分析',\n AnalyzeYearlyBuildingEnergy: '建筑物全年能耗分析',\n EnergyAnalysisOptions: '能耗分析选项',\n EnergyGridCellSize: '计算网格的尺寸',\n BuildingEnergySimulationNoAnimation: '若无移动部件则省略动画',\n },\n solarPanelSubMenu: '太阳能光伏板',\n solarPanel: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n AnalyzeVisibility: '分析可见度',\n PanelDiscretization: '光伏板离散化方法',\n Exact: '准确',\n Approximate: '近似',\n EnergyGridCellSize: '计算网格的尺寸',\n VisibilityGridCellSize: '视界因子计算网格的尺寸',\n EnergyAnalysisOptions: '能量分析选项',\n VisibilityAnalysisOptions: '可见度分析选项',\n SolarPanelSimulationNoAnimation: '若无移动部件则省略动画',\n },\n parabolicTroughSubMenu: '抛物线槽',\n parabolicTrough: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n parabolicDishSubMenu: '抛物线碟',\n parabolicDish: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n fresnelReflectorSubMenu: '菲涅尔反射镜',\n fresnelReflector: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n heliostatSubMenu: '定日镜',\n heliostat: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n },\n solarUpdraftTowerSubMenu: '太阳能上升气流塔',\n solarUpdraftTower: {\n AnalyzeDailyYield: '分析当天产出',\n AnalyzeYearlyYield: '分析全年产出',\n SolarUpdraftTowerSimulationNoAnimation: '若无移动部件则省略动画',\n },\n\n tutorialsSubMenu: '教程',\n\n solarEnergyScienceSubMenu: '太阳能科学',\n solarEnergyScienceTutorials: {\n SunAngles: '太阳相对于地面观察者的角度',\n InsolationAndClimate: '太阳辐射和气候的关系',\n SolarRadiationToBox: '一个长方体受到的太阳能辐射分析',\n },\n\n buildingScienceSubMenu: '建筑科学',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: '房屋的热学封套和围护封套',\n EffectOfSizeOnBuildingEnergy: '房屋大小对能耗的影响',\n EffectOfOrientationOnBuildingEnergy: '房屋方位对能耗的影响',\n EffectOfInsulationOnBuildingEnergy: '房屋隔热对能耗的影响',\n EffectOfRoofColorOnBuildingEnergy: '屋顶颜色对建筑物能耗的影响',\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋檐延伸长度对建筑物能耗的影响',\n EffectOfWindowSHGCOnBuildingEnergy: '窗户太阳能输入对房屋能耗的影响',\n EffectOfThermostatSetpointOnBuildingEnergy: '恒温器设定值对房屋能耗的影响',\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板对房屋能耗的影响',\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度对房屋能耗的影响',\n EffectOfTreesOnBuildingEnergy: '树荫对房屋能耗的影响',\n },\n\n buildingDesignSubMenu: '建筑设计',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: '有棚顶窗的科德角风格的住宅',\n MansardRoofWithDormers: '有天窗的折线屋顶',\n GableRoofVsHipRoof: '双坡屋顶和四坡屋顶的对比',\n ColonialVsSaltbox: '殖民地风格和盐盒风格的对比',\n GambrelRoofVsMansardRoof: '复斜屋顶和折线屋顶的对比',\n CombinationRoofVsBonnetRoof: '组合屋顶和帽檐屋顶的对比',\n DutchGableRoof: '荷兰双坡屋顶',\n GableAndValleyRoof: '坡谷屋顶',\n ClerestoryRoof: '天窗屋顶',\n MonitorRoof: '采光屋顶',\n AFrameHouse: 'A字形房子',\n HalfTimberedHouse: '半木骨架房子',\n AllBasicRoofTypes: '所有的基本屋顶类型',\n },\n\n photovoltaicSolarPowerSubMenu: '光伏发电',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: '光伏板倾斜角对发电量的影响',\n EffectOfAzimuthOfSolarPanel: '光伏板方位角对发电量的影响',\n SolarPanelTypes: '光伏板类型',\n VerticalBifacialSolarPanels: '竖直的双面光伏板',\n CompareMonofacialAndBifacialSolarPanels: '单面光伏板和双面光伏板的对比',\n SolarTrackers: '自动追日器',\n CoveringGroundWithSolarPanels: '为什么我们不简单地用光伏板覆盖地面',\n InterRowSpacingOfSolarPanelArray: '光伏板阵列行间距对发电量的影响',\n EffectOfOrientationOfSolarPanels: '光伏板排列方向对发电量的影响',\n SolarPanelArrayAutomaticLayout: '光伏板自动排列',\n },\n\n concentratedSolarPowerSubMenu: '光热发电',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: '抛物线槽方位角对发电量的影响',\n EffectOfLatusRectumOfParabolicTrough: '抛物线槽通径对发电量的影响',\n FocusSunlightWithParabolicDish: '用抛物线碟聚焦陽光',\n LinearFresnelReflectors: '用直线式菲涅尔反射镜聚焦陽光',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸热管的安装高度对直线式菲涅尔反射镜发电量的影响',\n EffectOfAzimuthOfLinearFresnelReflectors: '直线式菲涅尔反射镜方位角对发电量的影响',\n LinearFresnelReflectorsWithTwoAbsorbers: '配备两个吸收管的直线式菲涅尔反射镜阵列',\n CosineEfficiencyOfHeliostats: '定日镜的余弦效率',\n ShadowingAndBlockingOfHeliostats: '定日镜的阴影和遮挡',\n EffectSolarPowerTowerHeight: '吸收塔高度对发电量的影响',\n SolarPowerTower: '塔式光热发电站',\n },\n\n otherTypesOfSolarPowerSubMenu: '其它类型的太阳能发电',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: '太阳能上升气流塔',\n },\n\n generativeDesignSubMenu: '生成式设计',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: '单面光伏板阵列的倾斜角',\n BifacialSolarPanelArrayTiltAngle: '双面光伏板阵列的倾斜角',\n OutputOfSolarPanelArrayInDifferentPlaces: '一个光伏板阵列在不同地区的产出',\n SimpleSolarFarmParetoFront: '简单太阳能农场设计的帕累托前沿',\n },\n\n examplesSubMenu: '例子',\n\n solarEnergySubMenu: '太阳能',\n solarEnergyExamples: {\n SunBeamAndHeliodon: '太阳光束和日影仪',\n RooftopSolarPanels: '屋顶光伏板',\n NevadaSolarOneParabolicTroughArray: '内华达州太阳能一号的抛物线槽阵列',\n TooeleParabolicDishArray: '犹他州图埃勒的抛物线碟阵列',\n PS10SolarPowerTower: '西班牙塞维利亚的PS10太阳能发电塔',\n TucsonLinearFresnelReflectors: '亚利桑那州图森的直线式菲涅尔反射镜阵列',\n SolarCanopyFormFactors: '太阳能天篷外形设计',\n SolarCanopyOverBleachers: '看台太阳能天篷',\n SolarCanopyOverGarage: '车库太阳能天篷',\n SolarBusStop: '太阳能候车亭',\n SolarFacadeTesla: '特斯拉光伏墙',\n BuildingIntegratedPhotovoltaics: '建筑整合光伏',\n Floatovoltaics: '浮动光伏',\n Agrivoltaics: '农业光伏',\n VegetativeBuffer: '太阳能农场绿化带',\n RainbowSwashSolarFarmBostonMA: '马萨诸塞州波士顿彩虹激流旁边的光伏板阵列',\n MickeyMouseSolarFarmOrlandoFL: '佛罗里达州奥兰多的米老鼠形状光伏板阵列',\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亚州贝克斯菲尔德灌溉渠上假想的光伏板阵列',\n SolarNoiseBarrierLexingtonMA: '马萨诸塞州列克星敦高速公路噪音墙上假想的光伏板',\n HSATSolarTrackersRaleighNC: '北卡罗来纳州罗利的一个水平方向单轴旋转追日光伏板阵列(HSAT)',\n AADATSolarTrackersLancasterCA: '加利福尼亚州兰开斯特的一个双轴旋转追日光伏板阵列(AADAT)',\n SolarUpdraftTowerInCity: '太阳能上升气流塔在城市中的应用',\n },\n\n builtEnvironmentSubMenu: '建造环境',\n residentialBuildingsSubMenu: '住宅建筑',\n residentialBuildingExamples: {\n ColonialHouse: '殖民地风格的住宅',\n DutchColonialHouse: '荷兰殖民地风格的住宅',\n TShapedHouse: 'T字型房子',\n CapeCodHouseWithGarage: '有车库的科德角风格的住宅',\n Solarium: '有日光浴室的房子',\n Church1: '教堂例一',\n Cathedral1: '主教座堂例一',\n Cathedral2: '主教座堂例二',\n Mosque1: '清真寺例一',\n AdobeTaosHouse: '陶斯土坯房',\n RanchHouse: '牧场风格的住宅',\n BonnetHouse: '有帽檐屋顶的住宅',\n BarnStyleHouse: '谷仓式风格的住宅',\n ModernHouse: '现代风格的住宅',\n ButterflyRoofHouse: '蝴蝶型屋顶的住宅',\n },\n commercialBuildingsSubMenu: '商用建筑',\n commercialBuildingExamples: {\n WhiteHouse: '白宫',\n BilimMersinTurkiye: '土耳其梅尔辛科学教育中心',\n SpanishStyleHotel: '西班牙风格旅馆',\n ApartmentBuilding: '公寓楼',\n OfficeBuilding: '办公楼',\n Hotel: '旅馆',\n },\n buildingComplexesSubMenu: '建筑群',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯灵顿高中',\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒罗阿帕奇学校',\n },\n urbanPlanningSubMenu: '城市规划',\n urbanPlanningExamples: {\n Heatmap1: '热图例一',\n },\n otherBuildingsSubMenu: '其它建筑',\n otherBuildingExamples: {\n Greenhouse: '温室',\n Pavilion: '公园的亭子',\n OctagonalPagoda: '八角塔',\n OceanFront: '海边',\n EgyptianPyramids: '埃及金字塔',\n MayanPyramid: '玛雅金字塔',\n SiOSePol: '三十三孔桥',\n StackedCuboids: '堆砌长方体',\n },\n\n artificialIntelligenceSubMenu: '人工智能',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: '优化单排光伏板的倾斜角',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '优化多排光伏板的倾斜角',\n SolarFarmGenerativeDesign: '生成式设计太阳能农场',\n SolarFarmGenerativeDesignWithBlock: '生成式设计太阳能农场:周边有建筑物的情况',\n FitchburgSolarFarmGenerativeDesign: '生成式设计太阳能农场:真实世界案例',\n },\n\n languageSubMenu: '语言',\n publicSubMenu: '公共',\n ModelsGallery: '模型画廊',\n ModelsMap: '模型地图',\n AboutUs: '关于我们',\n },\n\n avatarMenu: {\n AccountSettings: '账号设定',\n PrivacyStatementTitle: '用户隐私保护声明',\n PrivacyStatement:\n '登录需要采用您的谷歌ID建立或进入您的阿拉丁账户。 我们只储存一个随机的字符串作为您的ID。 任何关于您的可辨识的个人信息都没有被收集。 详情请参考我们的',\n SignIn: '登录',\n SignOut: '退出账号',\n IfYouAreAStudent: '如果您是一个学生',\n },\n\n skyMenu: {\n Axes: '显示坐标轴',\n Theme: '环境主题',\n ThemeDefault: '默认',\n ThemeDesert: '沙漠',\n ThemeDune: '沙丘',\n ThemeForest: '森林',\n ThemeGrassland: '草原',\n ThemeHill: '丘陵',\n ThemeLake: '湖泊',\n ThemeMountain: '山脉',\n ThemeRural: '田园',\n SunlightAttenuationCoefficientInAir: '阳光在空气中传播的衰减系数',\n ConvectiveCoefficientOfAir: '空气对流传热系数',\n HighestTemperatureTimeInMinutes: '最高气温时间(分钟)',\n SelectSunAnglesToShow: '选择太阳角度显示',\n ShowAzimuthAngle: '显示方位角',\n ShowElevationAngle: '显示高度角',\n ShowZenithAngle: '显示天顶角',\n DirectLightBrightnessAtNoon: '正午直射光照度',\n AmbientLightBrightnessAtNoon: '正午环境光照度',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: '月份辐射度损失比',\n Vegetation: '植被',\n LeafOutDay: '树叶长出的日子',\n LeafOffDay: '树叶脱落的日子',\n Albedo: '反照率',\n ImageOnGround: '地面显示图像',\n WaterSurface: '水面',\n RemoveAllUnlockedTrees: '删除所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\n RemoveAllUnlockedCuboids: '删除所有非固定的长方体',\n DoYouReallyWantToRemoveAllPeople: '你确定删除所有非固定的人物吗',\n DoYouReallyWantToRemoveAllTrees: '你确定删除所有非固定的树木吗',\n DoYouReallyWantToRemoveAllFlowers: '你确定删除所有非固定的花草吗',\n DoYouReallyWantToRemoveAllSolarPanels: '你确定删除所有非固定的光伏板吗',\n DoYouReallyWantToRemoveAllFoundations: '你确定删除所有非固定的地基吗',\n DoYouReallyWantToRemoveAllCuboids: '你确定删除所有非固定的长方体吗',\n LockAllElements: '固定所有的部件',\n UnlockAllElements: '解除所有的固定',\n },\n\n labelSubMenu: {\n Label: '标签',\n LabelText: '标签的内容',\n LabelHeight: '标签的高度',\n LabelSize: '标签的大小',\n LabelFontSize: '字体的大小',\n LabelColor: '标签的颜色',\n KeepShowingLabel: '显示标签',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: '删除此地基上所有非固定的光伏板',\n RemoveAllUnlockedParabolicTroughs: '删除此地基上所有非固定的抛物线槽',\n RemoveAllUnlockedParabolicDishes: '删除此地基上所有非固定的抛物线碟',\n RemoveAllUnlockedFresnelReflectors: '删除此地基上所有非固定的菲涅耳反射镜',\n RemoveAllUnlockedHeliostats: '删除此地基上所有非固定的定日镜',\n RemoveAllUnlockedSensors: '删除此地基上所有非固定的传感器',\n RemoveAllUnlockedLights: '删除此地基上所有非固定的电灯',\n RemoveAllUnlockedWalls: '删除此地基上所有非固定的墙',\n RemoveAllUnlockedWindows: '删除此地基上所有非固定的窗户',\n RemoveAllUnlockedDoors: '删除此地基上所有非固定的门',\n RemoveAllUnlockedPolygons: '删除此地基上所有非固定的多边形',\n RemoveAllUnlockedHumans: '删除此地基上所有非固定的人物',\n RemoveAllUnlockedTrees: '删除此地基上所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除此地基上所有非固定的花草',\n Racks: '支架',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n SolarPanels: '光伏板',\n SolarPanelArray: '光伏板阵列',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你确定删除此地基上所有非固定的光伏板吗',\n ParabolicTroughs: '抛物线槽',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你确定删除此地基上所有非固定的抛物线槽吗',\n ParabolicDishes: '抛物线碟',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你确定删除此地基上所有非固定的抛物线碟吗',\n FresnelReflectors: '菲涅耳反射镜',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你确定删除此地基上所有非固定的菲涅耳反射镜吗',\n Heliostats: '定日镜',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你确定删除此地基上所有非固定的定日镜吗',\n Sensors: '传感器',\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你确定删除此地基上所有非固定的传感器吗',\n Lights: '电灯',\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你确定删除此地基上所有非固定的电灯吗',\n Walls: '墙',\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你确定删除此地基上所有非固定的墙吗',\n Windows: '窗户',\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你确定删除此地基上所有非固定的窗户吗',\n Doors: '门',\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你确定删除此地基上所有非固定的门吗',\n Polygons: '多边形',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你确定删除此地基上所有非固定的多边形吗',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你确定删除此地基上所有非固定的人物吗',\n Trees: '树木',\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你确定删除此地基上所有非固定的树木吗',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你确定删除此地基上所有非固定的花草吗',\n OnlyThisFoundation: '只这块地基',\n AllConnectedFoundations: '所有相连的地基',\n AllFoundations: '所有的地基',\n AddPolygon: '添加多边形',\n SolarStructure: '太阳能构型',\n GroupMaster: '主地基',\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\n GroundFloorRValue: '建筑物地板的R值',\n OnlyThisGroundFloor: '只这个建筑物的地板',\n AllGroundFloors: '所有建筑物的地板',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: '和定日镜配套的吸收塔',\n ReceiverTowerPhysicalProperties: '太阳能吸收塔的物理性质',\n ReceiverTowerHeight: '太阳能吸收塔的高度',\n ReceiverTowerRadius: '太阳能吸收塔的半径',\n ReceiverAbsorptance: '太阳能吸收器的吸收率',\n ReceiverOpticalEfficiency: '太阳能吸收器的光效率',\n ReceiverThermalEfficiency: '太阳能吸收器的热效率',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: '和菲涅尔反射镜配套的吸收管',\n AbsorberPipePhysicalProperties: '太阳能吸收管的物理性质',\n AbsorberHeight: '太阳能吸收管的安装高度',\n AbsorberApertureWidth: '太阳能吸收管的孔径',\n AbsorberPipePoleNumber: '太阳能吸收管的支柱数量',\n AbsorberAbsorptance: '太阳能吸收管的吸收率',\n AbsorberOpticalEfficiency: '太阳能吸收管的光效率',\n AbsorberThermalEfficiency: '太阳能吸收管的热效率',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: '太阳能上升气流塔',\n SolarUpdraftTowerPhysicalProperties: '太阳能上升气流塔的物理性质',\n SolarUpdraftTowerChimneyHeight: '太阳能上升气流塔烟囱的高度',\n SolarUpdraftTowerChimneyRadius: '太阳能上升气流塔烟囱的半径',\n SolarUpdraftTowerCollectorHeight: '太阳能上升气流塔集热棚的高度',\n SolarUpdraftTowerCollectorRadius: '太阳能上升气流塔集热棚的半径',\n SolarUpdraftTowerCollectorTransmissivity: '太阳能上升气流塔集热棚的透射率',\n SolarUpdraftTowerCollectorEmissivity: '太阳能上升气流塔集热棚的发射率',\n SolarUpdraftTowerDischargeCoefficient: '太阳能上升气流塔的流量系数',\n SolarUpdraftTowerTurbineEfficiency: '太阳能上升气流塔的涡轮机效率',\n },\n\n cuboidMenu: {\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n RemoveAllUnlockedSolarPanels: '删除此长方体表面上所有非固定的光伏板',\n RemoveAllUnlockedSensors: '删除此长方体表面上所有非固定的传感器',\n RemoveAllUnlockedPolygons: '删除此长方体表面上所有非固定的多边形',\n RemoveAllUnlockedHumans: '删除此长方体表面上所有非固定的人物',\n RemoveAllUnlockedTrees: '删除此长方体表面上所有非固定的树木',\n RemoveAllUnlockedFlowers: '删除此长方体表面上所有非固定的花草',\n Racks: '支架',\n SolarPanels: '光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你确定删除此长方体表面上所有非固定的光伏板吗',\n Sensors: '传感器',\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你确定删除此长方体表面上所有非固定的传感器吗',\n Polygons: '多边形',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你确定删除此长方体表面上所有非固定的多边形吗',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你确定删除此长方体表面上所有非固定的人物吗',\n Trees: '树木',\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你确定删除此长方体表面上所有非固定的树木吗',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你确定删除此长方体表面上所有非固定的花草吗',\n OnlyThisCuboid: '只这个长方体',\n AllCuboidsOnSameSurface: '同一表面上所有的长方体',\n AllCuboidsAboveSameBase: '同一地基上所有的长方体',\n AllCuboids: '所有的长方体',\n OnlyThisSide: '只这个表面',\n AllSidesOfThisCuboid: '这个长方体所有的侧面',\n AllSidesOfAllCuboids: '所有的长方体所有的侧面',\n AddPolygon: '添加多边形',\n Stackable: '可堆砌',\n GroupMaster: '主长方体',\n },\n\n polygonMenu: {\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n TextBox: '文字框',\n FontOutlineColor: '字体轮廓颜色',\n FontOutlineWidth: '字体轮廓线宽',\n FontStrokeColor: '字体描边颜色',\n FontStrokeWidth: '字体描边线宽',\n NoOutline: '无轮廓线',\n Shiny: '光泽',\n Filled: '填充',\n FillTexture: '填充材质',\n FillColor: '填充颜色',\n Opacity: '遮光度',\n LineColor: '线条颜色',\n LineWidth: '线条宽度',\n LineStyle: '线条样式',\n SolidLine: '实线',\n DashedLine: '虚线',\n DottedLine: '点线',\n InsertVertexBeforeIndex: '前面插入顶点',\n InsertVertexAfterIndex: '后面插入顶点',\n DeleteVertex: '移除顶点',\n OnlyThisPolygon: '只这个多边形',\n AllPolygonsOnSurface: '同一表面上所有的多边形',\n AllPolygonsAboveFoundation: '同一地基上所有的多边形',\n AllPolygons: '所有的多边形',\n Layout: '布局',\n SolarPanelArrayLayout: '光伏板阵列布局',\n SolarPanelArrayLayoutParametricDesign: '光伏板阵列布局参数化设计',\n SolarPanelArrayLayoutGenerativeDesign: '光伏板阵列布局生成式设计',\n SolarPanelArrayModel: '光伏板型号',\n SolarPanelArrayOrientation: '排列方向',\n SolarPanelArrayTiltAngle: '倾斜角度',\n SolarPanelArrayRowWidth: '行宽度',\n SolarPanelArrayInterRowSpacing: '行间距',\n SolarPanelArrayRowSpacing: '行间距',\n SolarPanelArrayRowAxis: '行轴方向',\n SolarPanelArrayLeftRightRowAxis: '左右方向(相对)',\n SolarPanelArrayUpDownRowAxis: '上下方向(相对)',\n SolarPanelArrayEastWestRowAxis: '东西方向(绝对)',\n SolarPanelArrayNorthSouthRowAxis: '南北方向(绝对)',\n SolarPanelArrayMargin: '边缘余地',\n SolarPanelArrayPoleHeight: '支架高度',\n SolarPanelArrayPoleSpacing: '支柱间隔',\n SolarPanelArrayTotalYearlyCost: '全年总成本',\n SolarPanelArrayTotalYearlyRevenue: '全年总收入',\n SolarPanelArrayTotalYearlyYield: '全年总发电量',\n SolarPanelArrayMeanYearlyYield: '平均年发电量',\n SolarPanelArrayYearlyProfit: '全年利润',\n LayoutNotAcceptedCheckYourParameters: '恕不能采用此布局。请检查您的参数设置。',\n },\n\n optimizationMenu: {\n Optimization: '优化',\n Parameters: '参数',\n Variables: '变量',\n Constants: '常量',\n GeneticAlgorithm: '遗传算法',\n GeneticAlgorithmSettings: '遗传算法设定',\n ParticleSwarmOptimization: '粒子群优化',\n ParticleSwarmOptimizationSettings: '粒子群优化设定',\n SolarPanelTiltAngleOptimization: '光伏板倾斜角度优化',\n SolarPanelArrayLayout: '光伏板阵列布局',\n Generation: '世代',\n Gene: '基因',\n NormalizedVariables: '标准化变量',\n Objective: '目标函数',\n ObjectiveFunctionDailyTotalYield: '当日总产出',\n ObjectiveFunctionYearlyTotalYield: '全年总产出',\n ObjectiveFunctionDailyMeanYield: '当日平均产出',\n ObjectiveFunctionYearlyMeanYield: '全年平均产出',\n ObjectiveFunctionDailyProfit: '当日利润',\n ObjectiveFunctionYearlyProfit: '全年利润',\n GeneticAlgorithmSelectionMethod: '遗传算法选择方法',\n RouletteWheel: '轮盘制',\n Tournament: '淘汰制',\n SearchMethod: '搜索方法',\n GlobalSearchUniformSelection: '全局搜索均匀取样',\n LocalSearchRandomOptimization: '局部搜索随机优化',\n PopulationSize: '种群个体数目',\n MaximumGenerations: '最大世代数目',\n SelectionRate: '选择概率',\n CrossoverRate: '交配概率',\n MutationRate: '突变概率',\n Step: '步数',\n SwarmSize: '粒子数目',\n MaximumSteps: '最大步数',\n MaximumVelocity: '最大速度',\n InertiaWeight: '惯性权重',\n CognitiveCoefficient: '认知系数',\n SocialCoefficient: '社会系数',\n ConvergenceThreshold: '终止条件的收敛阈值',\n LocalSearchRadius: '局部搜索的半径',\n RowsPerRackRange: '单个支架上光伏板行数的变化范围',\n TiltAngleRange: '光伏板倾斜角度的变化范围',\n InterRowSpacingRange: '光伏板阵列行间距的变化范围',\n ClickTargetPolygonToActivate: '点击目标多边形激活',\n ClickTargetFoundationToActivate: '点击目标地基激活',\n },\n\n treeMenu: {\n ShowModel: '显示近似模型',\n Flip: '翻转',\n Type: '树种',\n Spread: '树冠直径',\n },\n\n flowerMenu: {\n Flip: '翻转',\n Type: '品种',\n Spread: '直径',\n },\n\n peopleMenu: {\n ChangePerson: '改变人物',\n Flip: '转身',\n Observer: '观察者',\n ViewFromThisPerson: '视角移到此人位置',\n },\n\n lightMenu: {\n Color: '颜色',\n Intensity: '亮度',\n Decay: '衰减',\n MaximumDistance: '最大距离',\n Inside: '内部',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: '相对方位角',\n Pole: '支柱',\n PoleHeight: '支柱高度',\n PoleRadius: '支柱半径',\n ExtraPoleHeight: '额外的支柱高度',\n ExtraPoleHeightInAdditionToHalfWidth: '宽度一半额外的支柱高度',\n DrawSunBeam: '显示光束',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: '反射器镜面反射率',\n ReceiverAbsorptance: '接收器吸收率',\n ReflectorOpticalEfficiency: '反射器光效率',\n ReceiverThermalEfficiency: '接收器热效率',\n },\n\n solarPanelMenu: {\n InverterEfficiency: '逆变器效率',\n InverterEfficiencyExplained: '直流电转换为交流电的效率。',\n DcToAcSizeRatio: '直流-交流容量比例',\n DcToAcSizeRatioExplained: '直流电容量和交流电容量的比例。',\n ChangePvModel: '改变光伏板型号',\n Orientation: '排列方向',\n Portrait: '纵向',\n Landscape: '橫向',\n FrameColor: '框架颜色',\n Panels: '块',\n PanelsWide: '块光伏板宽',\n PanelsLong: '块光伏板长',\n TiltAngle: '倾斜角度',\n SouthFacingIsPositive: '朝南为正',\n Tracker: '追日系统',\n SolarTrackerFollowsSun: '追日系统提高光伏板产出。',\n PoleSpacing: '支柱间隔',\n NoTracker: '无追日系统',\n HorizontalSingleAxisTracker: '水平单轴追日系统',\n VerticalSingleAxisTracker: '竖直单轴追日系统',\n AltazimuthDualAxisTracker: '地平双轴追日系统',\n OnlyThisSolarPanel: '只这个光伏板',\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\n AllSolarPanels: '所有的光伏板',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: '光伏板型号性能',\n Model: '型号',\n PanelSize: '尺寸',\n Cells: '电池組',\n CellType: '光伏电池类型',\n Monocrystalline: '单晶硅',\n Polycrystalline: '多晶硅',\n ThinFilm: '薄膜',\n Bifacial: '双面',\n BifacialityFactor: '双面性因子',\n Black: '黑色',\n Blue: '蓝色',\n ShadeTolerance: '阴影耐受度',\n SolarCellEfficiency: '光伏电池效率',\n NominalOperatingCellTemperature: '名义电池运行温度',\n TemperatureCoefficientOfPmax: 'Pmax温度系数',\n },\n\n parabolicTroughMenu: {\n ModuleLength: '模块长度',\n Modules: '模块',\n ModulesLong: '模块长',\n LatusRectum: '通径',\n OnlyThisParabolicTrough: '只这个抛物线槽',\n AllParabolicTroughsAboveFoundation: '同一地基上所有的抛物线槽',\n AllParabolicTroughs: '所有的抛物线槽',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: '吸收管',\n SelectAbsorberToReflectSunlightTo: '选择阳光反射到的吸收管',\n ModuleLength: '模块长度',\n Modules: '模块',\n ModulesLong: '模块长',\n OnlyThisFresnelReflector: '只这个菲涅耳反射镜',\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射镜',\n AllFresnelReflectors: '所有的菲涅耳反射镜',\n },\n\n heliostatMenu: {\n Tower: '吸收塔',\n SelectTowerToReflectSunlightTo: '选择阳光反射到的吸收塔',\n OnlyThisHeliostat: '只这个定日镜',\n AllHeliostatsAboveFoundation: '同一地基上所有的定日镜',\n AllHeliostats: '所有的定日镜',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: '接收器结构',\n CentralPole: '中心直柱',\n CentralPoleWithTripod: '三脚架和中心直柱',\n Quadrupod: '四脚架',\n RimDiameter: '外圈直径',\n LatusRectum: '通径',\n ExtraPoleHeightInAdditionToRadius: '半径之外额外的支架高度',\n OnlyThisParabolicDish: '只这个抛物线碟',\n AllParabolicDishesAboveFoundation: '同一地基上所有的抛物线碟',\n AllParabolicDishes: '所有的抛物线碟',\n },\n\n wallMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n SizeOfWall: '墙的尺寸',\n OnlyThisWall: '只这堵墙',\n AllConnectedWalls: '所有连接的墙',\n AllWallsAboveFoundation: '同一地基上所有的墙',\n AllWalls: '所有的墙',\n Windows: '窗户',\n LockAllWindows: '固定所有的窗户',\n UnlockAllWindows: '解除所有的窗户固定',\n RemoveAllUnlockedWindows: '删除这堵墙上所有非固定的窗户',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你确定删除这堵墙上所有非固定的窗户吗',\n Doors: '门',\n RemoveAllUnlockedDoors: '删除这堵墙上所有非固定的门',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你确定删除这堵墙上所有非固定的门吗',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '删除这堵墙上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你确定删除这堵墙上所有非固定的光伏板吗',\n Sensors: '传感器',\n LockAllSensors: '固定所有的传感器',\n UnlockAllSensors: '解除所有的传感器固定',\n RemoveAllUnlockedSensors: '删除这堵墙上所有非固定的传感器',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你确定删除这堵墙上所有非固定的传感器吗',\n Lights: '电灯',\n RemoveAllUnlockedLights: '删除这堵墙上所有非固定的电灯',\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你确定删除这堵墙上所有非固定的电灯吗',\n LockAllPolygons: '固定这堵墙上所有的多边形',\n UnlockAllPolygons: '解除这堵墙上所有的多边形固定',\n RemoveAllUnlockedPolygons: '删除这堵墙上所有非固定的多边形',\n WallStructure: '墙结构',\n DefaultStructure: '默认',\n StudStructure: '墙柱',\n PillarStructure: '圆柱',\n Opacity: '遮光度',\n StructureSpacing: '结构间距',\n StructureWidth: '结构宽度',\n StructureThickness: '结构厚度',\n StructureColor: '结构颜色',\n Color: '牆体颜色',\n Height: '高度',\n Thickness: '厚度',\n Texture: '材质',\n AllLightsOnWallInside: '所有电灯在牆内',\n AllLightsOnWallOutside: '所有电灯在牆外',\n Fill: '填充',\n Full: '全部',\n Partial: '部分',\n Empty: '空白',\n OpenToOutside: '对外面开放',\n EavesLength: '屋檐延伸长度',\n Parapet: '女墙',\n ParapetColor: '女墙颜色',\n ParapetTexture: '女墙材质',\n ParapetHeight: '女墙高度',\n CopingsHeight: '顶盖高度',\n CopingsWidth: '顶盖宽度',\n },\n\n windowMenu: {\n OnlyThisWindow: '只这个窗户',\n AllWindowsOnSurface: '同一表面上所有的窗户',\n AllWindowsAboveFoundation: '同一地基上所有的窗户',\n AllWindows: '所有的窗户',\n Width: '宽度',\n Height: '高度',\n Mullion: '直棂',\n MullionWidth: '直棂宽度',\n MullionSpacing: '直棂间距',\n MullionColor: '直棂颜色',\n Tint: '着色',\n Opacity: '不透明度',\n SolarHeatGainCoefficient: '太阳辐射热获取系数(SHGC) = 1 - 不透明度',\n Shutter: '百叶窗',\n LeftShutter: '左侧百叶窗',\n RightShutter: '右侧百叶窗',\n BothShutters: '两侧百叶窗',\n ShutterWidth: '相对宽度',\n ShutterColor: '百叶窗颜色',\n Frame: '边框',\n FrameWidth: '边框宽度',\n SillWidth: '窗台宽度',\n Color: '边框颜色',\n WindowType: '窗户种类',\n Default: '默认',\n Arched: '拱形',\n Polygonal: '多边形',\n Interior: '内窗',\n Empty: '空白',\n },\n\n roofMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n OnlyThisRoof: '只这个屋顶',\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\n AllRoofs: '所有的屋顶',\n OnlyThisCeiling: '只这个天花板',\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\n AllCeilings: '所有的天花板',\n EavesOverhangLength: '屋檐延伸长度',\n RafterSpacing: '屋椽间距',\n RafterWidth: '屋椽宽度',\n RafterThickness: '屋椽厚度',\n RafterColor: '屋椽颜色',\n RoofColor: '屋顶颜色',\n RoofSideColor: '屋顶侧面颜色',\n GlassTint: '玻璃颜色',\n Opacity: '遮光度',\n RoofStructure: '屋顶结构',\n DefaultStructure: '默认',\n RafterStructure: '屋椽',\n GlassStructure: '玻璃',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '删除这个屋顶上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你确定删除这个屋顶上所有非固定的光伏板吗',\n Windows: '天窗',\n LockAllWindows: '固定所有的天窗',\n UnlockAllWindows: '解除所有的天窗固定',\n RemoveAllUnlockedWindows: '删除这个屋顶上所有非固定的天窗',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你确定删除这个屋顶上所有非固定的天窗吗',\n Sensors: '传感器',\n LockAllSensors: '固定所有的传感器',\n UnlockAllSensors: '解除所有的传感器固定',\n RemoveAllUnlockedSensors: '删除这个屋顶上所有非固定的传感器',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你确定删除这个屋顶上所有非固定的传感器吗',\n Lights: '电灯',\n RemoveAllUnlockedLights: '删除这个屋顶上所有非固定的电灯',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你确定删除这个屋顶上所有非固定的电灯吗',\n AllLightsOnRoofInside: '所有电灯在屋顶内',\n AllLightsOnRoofOutside: '所有电灯在屋顶外',\n Rise: '相对高度',\n Ceiling: '天花板',\n RoofRValue: '屋顶R值',\n CeilingRValue: '天花板R值',\n },\n\n doorMenu: {\n TextureDefault: '默认材质',\n Texture01: '一号材质',\n Texture02: '二号材质',\n Texture03: '三号材质',\n Texture04: '四号材质',\n Texture05: '五号材质',\n Texture06: '六号材质',\n Texture07: '七号材质',\n Texture08: '八号材质',\n Texture09: '九号材质',\n Texture10: '十号材质',\n Texture11: '十一号材质',\n Texture12: '十二号材质',\n Texture13: '十三号材质',\n Texture14: '十四号材质',\n Texture15: '十五号材质',\n Texture16: '十六号材质',\n Texture17: '十七号材质',\n OnlyThisDoor: '只这个门',\n AllDoorsOnWall: '同一面墙上所有的门',\n AllDoorsAboveFoundation: '同一地基上所有的门',\n AllDoors: '所有的门',\n DoorType: '门种类',\n Default: '默认',\n Arched: '拱形',\n Filled: '填充',\n FrameColor: '门框颜色',\n Interior: '内门',\n },\n\n siteInfoPanel: {\n High: '最高温度',\n Low: '最低温度',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: '选中的定日镜总数',\n NumberOfSelectedSolarPanels: '选中的光伏板总数',\n ElectricityGeneratedDailyBySolarPanels: '这些光伏板的日发电量',\n SceneDiameter: '场景直径',\n BuildingArea: '建筑面积',\n },\n\n visualizationControlPanel: {\n ColorContrast: '热图颜色对比度',\n FluxScale: '热通量长度',\n ClickUpOrDownArrowButtonsToChange: '点击上下箭头改变参数',\n },\n\n instructionPanel: {\n Rotate: '旋转',\n DragMouse: '拖动鼠标',\n Zoom: '缩放',\n MouseWheelOrKeys: '鼠标滚轮或者Ctrl+[和Ctrl+]',\n MouseWheelOrKeysMac: '鼠标滚轮或者⌘+[和⌘+]',\n Pan: '平移',\n HoldCtrlDragMouse: '按下Ctrl键并拖动鼠标',\n HoldMetaDragMouse: '按下⌘键并拖动鼠标',\n Enter2DMode: '進入二维模式',\n Exit2DMode: '退出二维模式',\n EnableNavigation: '進入导航模式',\n DisableNavigation: '退出导航模式',\n Move: '移动',\n MoveInstruction: '按下W/A/S/D/Z/X键',\n Turn: '拐弯',\n TurnInstruction: '按下方向键',\n ResetView: '重置视角',\n AutoRotate: '自动旋转',\n StartOrStop: '按F4键启动或停止',\n },\n\n mapPanel: {\n ImageOnGround: '地面显示图像',\n WeatherStations: '气象站',\n WeatherStationsNote: '关闭此选项以提高地图速度',\n Coordinates: '经纬度坐标',\n Zoom: '放大程度',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: '光伏板对观察者的可见度',\n Observer: '观察者',\n VantagePoint: '观察位置',\n ItemizedVisibilityByFields: '每个场的可见度',\n TotalVisibility: '总可见度',\n },\n\n sensorPanel: {\n LightSensor: '光传感器',\n WeatherDataFrom: '气象数据来自',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: '建筑物日能耗',\n YearlyBuildingEnergy: '建筑物年能耗',\n Heater: '暖气',\n AC: '空调',\n SolarPanel: '光伏',\n Net: '净能耗',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: '光伏日发电量',\n SolarPanelYearlyYield: '光伏年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualSolarPanels: '显示每行光伏板单独发电量',\n Profit: '利润',\n TotalCost: '总成本',\n TotalRevenue: '总收入',\n TotalYield: '总发电量',\n MeanYield: '平均发电量',\n ModuleCount: '光伏板总数',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: '抛物线槽日发电量',\n ParabolicTroughYearlyYield: '抛物线槽年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualParabolicTroughs: '显示每行抛物线槽单独发电量',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: '抛物线碟日发电量',\n ParabolicDishYearlyYield: '抛物线碟年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualParabolicDishes: '显示每个抛物线碟单独发电量',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: '菲涅耳反射镜日发电量',\n FresnelReflectorYearlyYield: '菲涅耳反射镜年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualFresnelReflectors: '显示每个菲涅耳反射镜单独发电量',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: '定日镜日发电量',\n HeliostatYearlyYield: '定日镜年发电量',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualHeliostats: '显示每个定日镜单独发电量',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: '太阳能上升气流塔日发电量',\n UpdraftTowerYearlyYield: '太阳能上升气流塔年发电量',\n ChimneyAirTemperature: '烟囱空气温度',\n ChimneyWindSpeed: '烟囱风速',\n Yield: '发电量',\n YieldPerHour: '每小时发电量',\n DailyTotal: '日发电总量',\n YearlyTotal: '年发电总量',\n ShowOutputsOfIndividualUpdraftTowers: '显示每个太阳能上升气流塔单独发电量',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: '太阳和时间设置',\n SunAngles: '角度',\n TwentyFourHours: '24小时',\n },\n\n cloudFilePanel: {\n SearchByTitle: '按标题搜索',\n MyLikes: '我喜欢的模型',\n MyCloudFiles: '我的云文件',\n GenerateLink: '生成链接',\n LinkGeneratedInClipBoard: '链接已经复制到剪贴板',\n DoYouReallyWantToDelete: '您确定删除此文件',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文件已被分享或发布, 改名会使已有链接失效',\n },\n\n projectListPanel: {\n SearchByTitle: '按标题搜索',\n MyProjects: '我的项目',\n GenerateProjectLink: '生成项目链接',\n ProjectLinkGeneratedInClipBoard: '项目链接已经复制到剪贴板',\n DoYouReallyWantToDeleteProject: '您确定删除项目',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此项目已被分享或发布, 改名会使已有链接失效',\n },\n\n projectPanel: {\n ProjectSettings: '项目设定',\n ThumbnailImageSize: '缩略图大小',\n ProjectByOtherPeople: '别人的项目',\n Project: '项目',\n ProjectType: '类别',\n ProjectDescription: '描述',\n MakeDescriptionEditable: '编辑描述',\n MakeDescriptionNonEditable: '不编辑描述',\n DoubleClickToMakeDescriptionEditable: '双击此描述激活编辑功能',\n SolarPanelArray: '光伏板阵列设计',\n CurateCurrentDesign: '收藏当前设计',\n UpdateSelectedDesign: '更新选中设计',\n RemoveSelectedDesign: '删除选中设计',\n ClickToFlipSortingOrder: '点击逆转排序方向',\n DesignNotShownInSolutionSpaceClickToShow: '此设计目前不显示在设计空间内,点击显示',\n DesignShownInSolutionSpaceClickToHide: '此设计目前显示在设计空间内,点击隐藏',\n DistributionInSolutionSpace: '方案在设计空间里的分布',\n ChooseSolutionSpace: '选择设计空间',\n ChooseDataColoring: '选择数据着色',\n SameColorForAllDesigns: '所有设计一个颜色',\n OneColorForEachDesign: '每个设计一个颜色',\n SolutionSpaceScreenshot: '设计空间截图',\n ScatteredPlotScreenshot: '散点图截图',\n SingleClickToSelectDoubleClickToOpen: '单击选择,双击打开。',\n SingleClickToDeselectDoubleClickToOpen: '单击取消选择,双击打开。',\n GenerateScatteredPlot: '生成散点图',\n SelectXAxis: '选择X轴',\n SelectYAxis: '选择Y轴',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: '我的账户设定',\n MyID: '我的🆔',\n ClickToCopyMyID: '点击此处拷贝我的ID',\n IDInClipBoard: '您现在可以粘贴ID了。',\n StoreMyNameInMyFilesWhenSaving: '保存文件时签上我的大名',\n DoYouReallyWantToShowYourNameInYourFiles: '您确定在您的文件里保存您的大名吗?',\n SignFileDisclaimer: '如果您选择保存,您的大名可能被所有打开您的文件的人看到。',\n Likes: '点赞总数',\n AllPublished: '发布总数',\n PublishedUnderAliases: '别名发布',\n UserCount: '用户总数',\n SchoolID: '学校编号',\n ClassID: '班级编号',\n },\n\n weatherPanel: {\n SunshineHours: '日照时间',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: '选择气温模型',\n Sinusoidal: '正弦函数',\n },\n\n economicsPanel: {\n EconomicsParameters: '经济学参数',\n ElectricitySellingPrice: '销售电价',\n OperationalCostPerUnit: '单位运行成本',\n SellingPrice: '销售电价',\n UnitCost: '单位成本',\n },\n\n navigationPanel: {\n NavigationParameters: '导航模式参数',\n MinimumMoveSpeed: '最小移动速度',\n MinimumTurnSpeed: '最小拐弯速度',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: '天空清晰度',\n ShowDaylightResults: '显示日照时间结果',\n ShowSkyClearnessResults: '显示天空清晰度结果',\n ShowAverageDailySolarRadiation: '显示日平均辐射结果',\n },\n\n analysisManager: {\n NoSensorForCollectingData: '没有传感器收集数据。',\n NoSolarPanelForAnalysis: '没有光伏板可以分析。',\n NoObserverForVisibilityAnalysis: '没有找到可见度分析的观察者。',\n NoWaterHeaterForAnalysis: '沒有太阳能热水器可以分析。',\n NoParabolicDishForAnalysis: '沒有抛物线碟可以分析。',\n NoParabolicTroughForAnalysis: '沒有抛物线槽可以分析。',\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射镜可以分析。',\n NoHeliostatForAnalysis: '沒有定日镜可以分析。',\n NoSolarUpdraftTowerForAnalysis: '沒有太阳能上升气流塔可以分析。',\n NoBuildingForAnalysis: '沒有建筑物可以分析。',\n },\n\n toolbar: {\n CloudFile: '云文件',\n Select: '选择',\n AddFoundation: '添加地基',\n AddWall: '添加墙体',\n AddWindow: '添加窗户',\n AddDoor: '添加门',\n AddPyramidRoof: '添加金字塔屋顶',\n AddGableRoof: '添加双坡屋顶',\n AddHipRoof: '添加四坡屋顶',\n AddGambrelRoof: '添加复斜屋顶',\n AddMansardRoof: '添加折线屋顶',\n AddCuboid: '添加长方体',\n AddSensor: '添加传感器',\n AddSolarPanel: '添加光伏板',\n AddWaterHeater: '添加太阳能热水器',\n AddParabolicDish: '添加抛物线碟',\n AddParabolicTrough: '添加抛物线槽',\n AddFresnelReflector: '添加菲涅耳反射镜',\n AddHeliostat: '添加定日镜',\n AddWindTurbine: '添加风力涡轮机',\n AddLight: '添加电灯',\n AddTree: '添加树木',\n AddFlower: '添加花草',\n AddPeople: '添加人物',\n DoubleClickToLockThisModeForNextAction: '双击按钮给下个动作锁定此模式',\n ClickToUnlockThisModeForNextAction: '点击按钮让动作完成即离开此模式',\n ManipulateGroup: '整体操作一个组',\n ClearScene: '清空场景',\n ShowSunAndTimeSettings: '显示太阳和时间设置',\n SpatialAnalysisOfEnergy: '能量的空间分析',\n DoYouReallyWantToClearContent: '您确定清空场景吗',\n ClickForMoreButtons: '点击此处切换到更多的按钮模式',\n SwitchToAddingFoundation: '切换到添加地基模式',\n SwitchToAddingCuboid: '切换到添加长方体模式',\n SwitchToAddingWall: '切换到添加墙体模式',\n SwitchToAddingWindow: '切换到添加窗户模式',\n SwitchToAddingDoor: '切换到添加门模式',\n SwitchToAddingPyramidRoof: '切换到添加金字塔屋顶模式',\n SwitchToAddingGableRoof: '切换到添加双坡屋顶模式',\n SwitchToAddingHipRoof: '切换到添加四坡屋顶模式',\n SwitchToAddingGambrelRoof: '切换到添加复斜屋顶模式',\n SwitchToAddingMansardRoof: '切换到添加折线屋顶模式',\n SwitchToAddingSolarPanel: '切换到添加光伏板模式',\n SwitchToAddingSensor: '切换到添加传感器模式',\n SwitchToAddingWaterHeater: '切换到添加太阳能热水器模式',\n SwitchToAddingParabolicDish: '切换到添加抛物线碟模式',\n SwitchToAddingParabolicTrough: '切换到添加抛物线槽模式',\n SwitchToAddingFresnelReflector: '切换到添加菲涅耳反射镜模式',\n SwitchToAddingHeliostat: '切换到添加定日镜模式',\n SwitchToAddingWindTurbine: '切换到添加风力涡轮机模式',\n SwitchToAddingLight: '切换到添加电灯模式',\n SwitchToAddingTree: '切换到添加树木模式',\n SwitchToAddingFlower: '切换到添加花草模式',\n SwitchToAddingPeople: '切换到添加人物模式',\n },\n\n tooltip: {\n gotoIFI: '访问未来智能研究所',\n visitAladdinHomePage: '访问阿拉丁主页',\n clickToOpenMenu: '点击打开主菜单',\n clickToAccessCloudTools: '点击打开云菜单',\n },\n\n tree: {\n Apple: '苹果树',\n Birch: '白桦',\n Coconut: '椰子树',\n Dogwood: '茱萸',\n Elm: '榆树',\n FanPalm: '扇叶棕榈',\n Linden: '菩提',\n Magnolia: '玉兰',\n Maple: '枫树',\n Oak: '橡树',\n Pine: '松树',\n Spruce: '云杉',\n },\n\n flower: {\n Bellflower: '铃兰',\n Boxwood: '黄杨',\n CactusCombo1: '仙人掌组合一',\n CactusCombo2: '仙人掌组合二',\n CactusCombo3: '仙人掌组合三',\n CactusCombo4: '仙人掌组合四',\n Hibiscus: '木槿',\n Hosta: '玉簪',\n Hydrangea: '绣球花',\n Peony: '牡丹',\n RedRose: '红玫瑰',\n Spirea: '绣线菊',\n Sunflower: '向日葵',\n TallBush: '高灌木',\n Tulip: '郁金香',\n WhiteFlower: '白花',\n YellowFlower: '黄花',\n },\n\n people: {\n Jaah: '贾阿',\n Jack: '杰克',\n Jacob: '雅各布',\n Jacqueline: '杰奎琳',\n Jade: '美玉',\n Jamelia: '洁米莉雅',\n James: '詹姆斯',\n Jane: '简',\n Jaya: '佳娅',\n Jaye: '杰伊',\n Jeanette: '珍妮特',\n Jedi: '杰迪',\n Jeff: '杰夫',\n Jena: '珍娜',\n Jennifer: '珍尼弗',\n Jess: '杰西',\n Jett: '杰特',\n Jill: '吉尔',\n Jiya: '吉娅',\n Joan: '琼',\n Jocelyn: '乔斯林',\n Joel: '乔尔',\n Joey: '乔伊',\n John: '约翰',\n Jonathon: '乔纳森',\n Jose: '何塞',\n Joseph: '约瑟夫',\n Joshua: '约书亚',\n Judd: '贾德',\n Judy: '朱蒂',\n Julia: '朱莉娅',\n Julio: '胡里奥',\n Jumapili: '祖玛匹莉',\n June: '准卫',\n Juro: '朱诺',\n Justin: '贾斯汀',\n },\n\n compass: {\n N: '北',\n S: '南',\n W: '西',\n E: '东',\n },\n\n month: {\n January: '一月',\n February: '二月',\n March: '三月',\n April: '四月',\n May: '五月',\n June: '六月',\n July: '七月',\n August: '八月',\n September: '九月',\n October: '十月',\n November: '十一月',\n December: '十二月',\n },\n\n modelsMap: {\n SearchByPublisher: '按发布者搜索',\n SearchByLabel: '按标签搜索',\n MyPublishedModels: '我发布的模型',\n TotalNumberOfUserPublishedModels: '用户发布的模型总数',\n SortFromOldestToNewest: '从早到晚排序',\n SortFromNewestToOldest: '从晚到早排序',\n ModelsFoundOnThisSite: '个模型在此位置',\n ShowModelsPublishedByThisAuthor: '展示此用户发布的模型',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_zh_tw = {\n translation: {\n name: {\n IFI: '未來智能研究所',\n Aladdin: '阿拉丁',\n Tagline: '阿拉丁: 探索人工智慧時代的設計軟體 — 未來智能研究所研發',\n },\n\n cookie: {\n Statement: '聲明:為了改善您的用戶體驗,阿拉丁採用cookie儲存少量數據。',\n Accept: '同意',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: '未來智能研究所榮譽出品',\n TermsOfService: '服務條款',\n PrivacyPolicy: '隱私政策',\n Software: '軟體',\n Content: '課件',\n Research: '研究',\n Support: '服務',\n Acknowledgment: '鳴謝',\n FundingInformation:\n '本產品的研發承蒙美國國家科學基金會慷慨資助(項目號#2105695,#2131097,#2301164)。本產品的任何觀點或結論僅代表創作者個人意見。',\n Contact: '如您需要更多資訊,請聯繫 Charles Xie (charles@intofuture.org)。我們會盡快回复。',\n Translators: '翻譯',\n },\n\n word: {\n LastUpdate: '上一次更新',\n Small: '小',\n Medium: '中',\n Large: '大',\n Design: '設計',\n Information: '資訊',\n Type: '類别',\n Text: '文字',\n FontSize: '字體大小',\n FontColor: '字體顏色',\n Model: '模型',\n Models: '模型',\n Upload: '上傳',\n ClickCount: '點擊數',\n Share: '分享',\n AlreadyLike: '已點贊',\n Like: '點贊',\n MustLogInToLike: '必須登錄才能點贊',\n AllRightsReserved: '版權所有',\n MeterAbbreviation: '米',\n Version: '版本',\n VersionInitial: '版本',\n Options: '選項',\n Maximum: '最大',\n Minimum: '最小',\n MaximumNumber: '最多',\n MinimumNumber: '最少',\n MaximumValue: '最大值',\n MinimumValue: '最小值',\n Or: '或',\n None: '無',\n High: '高',\n Partial: '部分',\n Teacher: '老師',\n Class: '班級',\n Total: '總數',\n Leaderboard: '用戶排行榜',\n Latest: '最新',\n Range: '範圍',\n SIUnit: '國際單位制',\n USUnit: '美國單位制',\n ThermalTransmittance: '熱透過率',\n ThermalResistance: '熱阻',\n UValue: 'U值',\n RValue: 'R值',\n VolumetricHeatCapacity: '容積熱容',\n BuildingHVACSystem: '建築物暖通空調系統',\n ThermostatSetpoint: '恆溫器設定值',\n TemperatureToleranceThreshold: '溫度忍耐閾值',\n TemperatureToleranceThresholdExplanation:\n '當日最低外面溫度高於恆溫器設定值減去此閾值,暖氣不開。\\n當日最高外面溫度低於恆溫器設定值加上此閾值,空調不開。',\n Press: '按',\n Open: '打開',\n Save: '保存',\n SaveAsImage: '保存為圖像',\n SaveAsCsv: '保存為CSV',\n Update: '刷新',\n Paste: '粘貼',\n Copy: '複製',\n Cut: '剪切',\n Delete: '删除',\n Lock: '固定',\n Translucent: '半透明',\n Color: '顏色',\n Texture: '材質',\n Thickness: '厚度',\n Size: '尺寸',\n Yes: '是',\n No: '不',\n OK: '確定',\n Cancel: '取消',\n Apply: '應用',\n Close: '關閉',\n ApplyTo: '適用於',\n Run: '運行',\n Pause: '暫停',\n Resume: '繼續',\n Clear: '清空',\n Warning: '警告',\n Caution: '小心',\n Reminder: '提醒',\n Length: '長度',\n Width: '寬度',\n Height: '高度',\n Radius: '半徑',\n Angle: '角度',\n Azimuth: '方位角',\n Coordinates: '坐標',\n Weather: '天氣',\n Show: '顯示',\n Animate: '動畫',\n Date: '日期',\n Time: '時間',\n Title: '標題',\n Owner: '所有者',\n Action: '操作',\n Rename: '改名',\n Location: '位置',\n Latitude: '緯度',\n Month: '月份',\n Day: '天',\n Hour: '小時',\n Daylight: '白天長度',\n Radiation: '輻射',\n Temperature: '温度',\n kWh: '千瓦時',\n dollar: '元',\n MeterPerSecond: '米/秒',\n NorthInitial: '北',\n SouthInitial: '南',\n EastInitial: '東',\n WestInitial: '西',\n Fixed: '固定',\n Elements: '部件',\n Energy: '能量',\n Unknown: '未知',\n Label: '標籤',\n Description: '描述',\n NoDescription: '無描述',\n MaximumCharacters: '最多字符數',\n Author: '作者',\n Publisher: '發布者',\n Building: '建築',\n ResidentialBuilding: '住宅建築',\n CommercialBuilding: '商用建築',\n SchoolBuilding: '學校建築',\n TouristAttraction: '旅遊景點',\n UnderConstruction: '在建',\n Photovoltaic: '光伏',\n Anonymous: '無名氏',\n Nickname: '别名',\n Pin: '置頂',\n Unpin: '解除置頂',\n },\n\n shared: {\n NoTexture: '無材質',\n FoundationElement: '地基',\n CuboidElement: '長方體',\n PolygonElement: '多邊形',\n SensorElement: '傳感器',\n SolarPanelElement: '光伏板',\n WaterHeaterElement: '太陽能熱水器',\n ParabolicDishElement: '拋物線碟',\n ParabolicTroughElement: '拋物線槽',\n FresnelReflectorElement: '菲涅耳反射鏡',\n HeliostatElement: '定日鏡',\n WindTurbineElement: '風力渦輪機',\n LightElement: '電燈',\n ElementLocked: '固定',\n ModelType: '模型類别',\n OutputBreakdown: '分列發電量',\n MoreResults: '更多結果',\n },\n\n message: {\n ModelNotFound: '沒有找到模型',\n CannotSignIn: '登錄失敗',\n CannotSignOut: '退出失敗',\n YourAccountWasCreated: '成功建立您的賬號。',\n CannotCreateAccount: '無法創建賬號',\n YourAccountSettingsWereSaved: '您的賬號設定已保存。',\n CannotSaveYourAccountSettings: '您的賬號設定無法保存',\n CannotSaveYourFileToCloud: '無法保存您的文檔到雲端',\n CannotCreateNewProject: '無法創建新項目',\n CannotCreateNewProjectWithoutTitle: '沒有標題, 無法創建新項目',\n CannotOpenYourProjects: '無法打開您的項目列表',\n CannotOpenProject: '無法打開項目',\n CannotDeleteProject: '無法刪除項目',\n CannotRenameProject: '無法給項目改名',\n CannotAddDesignToProject: '無法把此設計加到項目裡',\n CannotAddDesignToProjectOwnedByOthers: '不能把此設計加到別人的項目裡',\n DesignRemovedFromProject: '設計被成功地從項目裡刪除',\n CannotRemoveDesignFromProject: '無法把此設計從項目裡刪除',\n CannotUpdateProject: '無法更新項目',\n CannotFetchProjectData: '無法取得項目數據',\n TitleUsedChooseDifferentOne: '此標題已經被使用, 請採用不同的標題',\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此標題的雲文檔已經存在,您確定要覆蓋它嗎?',\n CloudFileNotFound: '找不到此云端文檔',\n CannotLoadModelsOnMap: '無法下載地圖上的模型',\n CannotLoadLeaderboard: '無法下載排行榜',\n CannotPublishModelOnMap: '模型無法發佈到地圖上',\n CannotLikeModelFromMap: '無法點贊地圖上的模型',\n CannotDeleteModelFromMap: '無法删除地圖上的模型',\n ModelDeletedFromMap: '模型已從地圖上刪除',\n DoYouWantToDeleteModelFromMap: '您要删除地圖上的這個模型嗎?',\n CannotOpenCloudFile: '此云端文檔無法打開',\n CannotReadCloudFile: '無法讀取此云端文檔',\n CannotWriteCloudFile: '無法存儲此云端文檔',\n CloudFileCopied: '拷貝云端文檔',\n CannotOpenCloudFolder: '您的雲端文檔夾無法打開',\n CannotDeleteCloudFile: '無法刪除此云端文檔',\n CannotRenameCloudFile: '此云端文檔的名字無法更改',\n DoYouWantToSaveChanges: '您要保存當前文檔嗎?',\n NotApplicableToSelectedAction: '此值不適用於當前選擇範圍',\n ThisElementIsLocked: '這個部件被鎖定。',\n ThisCannotBeUndone: '這個操作一旦執行就不能撤銷。',\n AzimuthOfNorthIsZero: '正北的方位角為零度',\n CounterclockwiseAzimuthIsPositive: '逆時針為正',\n MoveCancelledBecauseOfOverlap: '位置重疊,移動取消。',\n MoveOutsideBoundaryCancelled: '位置出界,移動取消。',\n RotationCancelledBecauseOfOverlap: '位置重疊,旋轉取消。',\n RotationOutsideBoundaryCancelled: '位置出界,旋轉取消。',\n ResizingCancelledBecauseOfOverlap: '位置重疊,尺寸調整取消。',\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸調整取消。',\n CannotPasteOutsideBoundary: '位置出界,不能複制。',\n CannotPasteBecauseOfOverlap: '位置重疊,不能複制。',\n CannotMoveObjectTooFar: '位置太遠,移動取消。',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '採用新佈局之前必須移除現有的光伏板。',\n DoYouWantToContinue: '您想繼續嗎?',\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接觸。',\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重疊。',\n ScreenshotSaved: '截屏圖片保存在下載文檔夾裡。',\n CsvFileSaved: 'CSV保存在下載文檔夾裡。',\n SimulationStarted: '模擬開始。',\n SimulationCompleted: '模擬結束。',\n SimulationAborted: '模擬取消。',\n SimulationPaused: '模擬暫停。',\n CancelSimulation: '取消模擬',\n PauseSimulation: '暫停模擬',\n ResumeSimulation: '繼續模擬',\n SimulationWillNotStartDueToErrors: '由於錯誤模擬無法運行',\n SimulationWillStartDespiteWarnings: '發現問題,但模擬仍然將運行。',\n EvolutionStarted: '演化開始。',\n EvolutionCompleted: '演化結束。',\n EvolutionAborted: '演化取消。',\n EvolutionPaused: '演化暫停。',\n EncounterEvolutionError: '演化出錯。',\n CancelEvolution: '取消演化',\n PauseEvolution: '暫停演化',\n ResumeEvolution: '繼續演化',\n ConvergenceThresholdHasBeenReached: '收斂閾值已達到。',\n MaximumNumberOfGenerationsHasBeenReached: '最大世代數已達到。',\n MaximumNumberOfStepsHasBeenReached: '最大步數已達到。',\n ObjectiveFunctionTypeError: '此操作不支持當前的目標函數。請從菜單啟動此功能。',\n WallsAreNotAtSameHeight: '墻體高度不同。',\n WallsAreNotPerpendicular: '墻體不垂直。',\n WallsAreNotConnected: '墻體不相連。',\n WallsNumberNeedToBeFour: '墻體數量必須為四個。',\n BuildingContainsEmptyWall: '建築物有空牆。',\n BuildingRoofMissing: '建築物沒有屋頂。',\n UnknownErrors: '未知錯誤。',\n },\n\n menu: {\n AnalysisOptions: '分析選項',\n option: {\n GridCellSize: '計算網格的尺寸',\n SamplingFrequency: '採樣頻率',\n TimesPerHour: '每小時採樣次數',\n DaysPerYear: '每一年採樣天數',\n },\n mainMenu: '主菜單',\n cloudMenu: '雲菜單',\n projectSubMenu: '項目',\n project: {\n CreateNewProject: '創建新項目',\n OpenProject: '打開項目',\n SaveProjectAs: '另存項目為',\n YouMustLogInToCreateProject: '您必須登錄才能創建項目',\n YouMustLogInToOpenProject: '您必須登錄才能打開項目',\n },\n fileSubMenu: '文檔',\n file: {\n CreateNewFile: '創建新文檔',\n OpenLocalFile: '打開本地文檔',\n SaveAsLocalFile: '保存為本地文檔',\n SavingAbortedMustHaveValidFileName: '文檔名無效,保存失敗',\n OpenCloudFile: '打開雲端文檔',\n SaveCloudFile: '保存雲端文檔',\n SaveAsCloudFile: '保存為雲端文檔',\n SavingAbortedMustHaveValidTitle: '雲端文檔名無效,保存失敗',\n ToSaveYourWorkPleaseSignIn: '為了保存您的雲端文檔,請您先登錄。',\n TakeScreenshot: '截屏',\n UseCloudFileName: '採用雲端文件名',\n PublishOnModelsMap: '發佈到地圖上',\n PublishedOnModelsMap: '您的模型成功發佈到地圖上',\n UpdatedOnModelsMap: '您的模型更新成功',\n YouMustLogInToPublishYourModel: '您必須登錄才能發布模型',\n YouCannotPublishAModelThatYouDoNotOwn: '您不能發布他人的模型',\n YouMustSaveModelOnCloudBeforePublishingIt: '您必須先把此模型保存在雲端才能發布它',\n },\n editSubMenu: '編輯',\n edit: {\n Undo: '撤銷',\n Redo: '重做',\n },\n viewSubMenu: '視界',\n view: {\n NavigationView: '導航模式',\n TwoDimensionalView: '二維模式',\n ResetView: '重置視角',\n ZoomIn: '放大',\n ZoomOut: '縮小',\n AutoRotate: '自動旋轉',\n ShowShadow: '顯示陰影',\n ShowSurfaceShininess: '顯示表面光澤',\n TranslucentFloatingWindows: '透明浮動窗口',\n accessoriesSubMenu: '配件',\n accessories: {\n SiteInformation: '位置資訊',\n DesignInformation: '設計資訊',\n Instruction: '操作說明',\n StickyNote: '便簽',\n Note: '便簽',\n },\n },\n settingsSubMenu: '設置',\n settings: {\n WeatherData: '氣象數據',\n DiurnalTemperature: '晝夜溫度',\n Heliodon: '日影儀',\n SunAndTime: '太陽和時間',\n },\n benchmarksSubMenu: '基準',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: '太陽能輻射模型預測和實際測量的對比',\n BESTESTCase600: '建築物能耗模擬測試:BESTEST案例600',\n BESTESTCase610: '建築物能耗模擬測試:BESTEST案例610',\n BESTESTCase620: '建築物能耗模擬測試:BESTEST案例620',\n BESTESTCase630: '建築物能耗模擬測試:BESTEST案例630',\n },\n graph: {\n LineWidth: '線條寬度',\n SymbolSize: '符號大小',\n BarCategoryGap: '直條間隙',\n ShowHorizontalGridLines: '顯示格子的水平線條',\n ShowVerticalGridLines: '顯示格子的豎直線條',\n },\n analysisSubMenu: '分析',\n physicsSubMenu: '物理',\n physics: {\n DailySolarRadiationHeatmap: '當日太陽輻射總量分佈熱圖',\n SolarRadiationHeatmapOptions: '太陽輻射熱圖選項',\n SolarRadiationHeatmapGridCellSize: '太陽輻射熱圖網格的尺寸',\n SolarRadiationHeatmapMaxValue: '太陽輻射熱圖最大值',\n SolarRadiationHeatmapNoAnimation: '若無移動部件則省略動畫',\n ReflectionHeatmap: '反射熱圖',\n },\n sensorSubMenu: '傳感器',\n sensor: {\n CollectDailyData: '收集當天數據',\n CollectYearlyData: '收集全年數據',\n SensorSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n buildingSubMenu: '建築物',\n building: {\n AnalyzeDailyBuildingEnergy: '建築物當天能耗分析',\n AnalyzeYearlyBuildingEnergy: '建築物全年能耗分析',\n EnergyAnalysisOptions: '能耗分析選項',\n EnergyGridCellSize: '計算網格的尺寸',\n BuildingEnergySimulationNoAnimation: '若無移動部件則省略動畫',\n },\n solarPanelSubMenu: '太陽能光伏板',\n solarPanel: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n AnalyzeVisibility: '分析可見度',\n PanelDiscretization: '光伏板離散化方法',\n Exact: '準確',\n Approximate: '近似',\n EnergyGridCellSize: '計算網格的尺寸',\n VisibilityGridCellSize: '視界因子計算網格的尺寸',\n EnergyAnalysisOptions: '能量分析選項',\n VisibilityAnalysisOptions: '可見度分析選項',\n SolarPanelSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n parabolicTroughSubMenu: '拋物線槽',\n parabolicTrough: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n parabolicDishSubMenu: '拋物線碟',\n parabolicDish: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n fresnelReflectorSubMenu: '菲涅爾反射鏡',\n fresnelReflector: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n heliostatSubMenu: '定日鏡',\n heliostat: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n },\n solarUpdraftTowerSubMenu: '太陽能上升氣流塔',\n solarUpdraftTower: {\n AnalyzeDailyYield: '分析當天產出',\n AnalyzeYearlyYield: '分析全年產出',\n SolarUpdraftTowerSimulationNoAnimation: '若無移動部件則省略動畫',\n },\n\n tutorialsSubMenu: '教程',\n\n solarEnergyScienceSubMenu: '太陽能科學',\n solarEnergyScienceTutorials: {\n SunAngles: '太陽相對於地面觀察者的角度',\n InsolationAndClimate: '太陽輻射和氣候的關係',\n SolarRadiationToBox: '一個長方體受到的太陽能輻射分析',\n },\n\n buildingScienceSubMenu: '建築科學',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: '房屋的熱學封套和圍護封套',\n EffectOfSizeOnBuildingEnergy: '房屋大小對能耗的影響',\n EffectOfOrientationOnBuildingEnergy: '房屋方位對能耗的影響',\n EffectOfInsulationOnBuildingEnergy: '房屋隔熱對能耗的影響',\n EffectOfRoofColorOnBuildingEnergy: '屋頂顏色對建築物能耗的影響',\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋簷延伸長度對建築物能耗的影響',\n EffectOfWindowSHGCOnBuildingEnergy: '窗戶太陽能輸入對房屋能耗的影響',\n EffectOfThermostatSetpointOnBuildingEnergy: '恆溫器設定值對房屋能耗的影響',\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板對房屋能耗的影響',\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度對房屋能耗的影響',\n EffectOfTreesOnBuildingEnergy: '樹蔭對房屋能耗的影響',\n },\n\n buildingDesignSubMenu: '建築設計',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: '有棚頂窗的科德角風格的住宅',\n MansardRoofWithDormers: '有天窗的折線屋頂',\n GableRoofVsHipRoof: '雙坡屋頂和四坡屋顶的對比',\n ColonialVsSaltbox: '殖民地風格和鹽盒風格的對比',\n GambrelRoofVsMansardRoof: '复斜屋顶和折線屋頂的對比',\n CombinationRoofVsBonnetRoof: '組合屋頂和帽簷屋頂的對比',\n DutchGableRoof: '荷蘭雙坡屋頂',\n GableAndValleyRoof: '坡谷屋頂',\n ClerestoryRoof: '天窗屋頂',\n MonitorRoof: '採光屋頂',\n AFrameHouse: 'A字形房子',\n HalfTimberedHouse: '半木骨架房子',\n AllBasicRoofTypes: '所有的基本屋頂類型',\n },\n\n photovoltaicSolarPowerSubMenu: '光伏發電',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: '光伏板傾斜角對發電量的影響',\n EffectOfAzimuthOfSolarPanel: '光伏板方位角對發電量的影響',\n SolarPanelTypes: '光伏板類型',\n VerticalBifacialSolarPanels: '豎直的雙面光伏板',\n CompareMonofacialAndBifacialSolarPanels: '單面光伏板和雙面光伏板的對比',\n SolarTrackers: '自動追日器',\n CoveringGroundWithSolarPanels: '為什麼我們不簡單地用光伏板覆蓋地面',\n InterRowSpacingOfSolarPanelArray: '光伏板陣列行間距對發電量的影響',\n EffectOfOrientationOfSolarPanels: '光伏板排列方向對發電量的影響',\n SolarPanelArrayAutomaticLayout: '光伏板自動排列',\n },\n\n concentratedSolarPowerSubMenu: '光熱發電',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: '拋物線槽方位角對發電量的影響',\n EffectOfLatusRectumOfParabolicTrough: '拋物線槽通徑對發電量的影響',\n FocusSunlightWithParabolicDish: '用拋物線碟聚焦阳光',\n LinearFresnelReflectors: '用直線式菲涅爾反射鏡聚焦阳光',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸熱管的安装高度對直線式菲涅爾反射鏡發電量的影響',\n EffectOfAzimuthOfLinearFresnelReflectors: '直線式菲涅爾反射鏡方位角對發電量的影響',\n LinearFresnelReflectorsWithTwoAbsorbers: '配備兩個吸收管的直線式菲涅爾反射鏡陣列',\n CosineEfficiencyOfHeliostats: '定日鏡的餘弦效率',\n ShadowingAndBlockingOfHeliostats: '定日鏡的陰影和遮擋',\n EffectSolarPowerTowerHeight: '吸收塔高度對發電量的影響',\n SolarPowerTower: '塔式光熱發電站',\n },\n\n otherTypesOfSolarPowerSubMenu: '其它類型的太陽能發電',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: '太陽能上升氣流塔',\n },\n\n generativeDesignSubMenu: '生成式設計',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: '單面光伏板陣列的傾斜角',\n BifacialSolarPanelArrayTiltAngle: '雙面光伏板陣列的傾斜角',\n OutputOfSolarPanelArrayInDifferentPlaces: '一個光伏板陣列在不同地區的產出',\n SimpleSolarFarmParetoFront: '簡單太陽能農場設計的帕累托前沿',\n },\n\n examplesSubMenu: '例子',\n\n solarEnergySubMenu: '太陽能',\n solarEnergyExamples: {\n SunBeamAndHeliodon: '太陽光束和日影儀',\n RooftopSolarPanels: '屋頂光伏板',\n NevadaSolarOneParabolicTroughArray: '內華達州太陽能一號的拋物線槽陣列',\n TooeleParabolicDishArray: '猶他州圖埃勒的拋物線碟陣列',\n PS10SolarPowerTower: '西班牙塞維利亞的PS10太陽能發電塔',\n TucsonLinearFresnelReflectors: '亞利桑那州圖森的直線式菲涅爾反射鏡陣列',\n SolarCanopyFormFactors: '太陽能天篷外形設計',\n SolarCanopyOverBleachers: '看台太陽能天篷',\n SolarCanopyOverGarage: '車庫太陽能天篷',\n SolarBusStop: '太陽能候車亭',\n SolarFacadeTesla: '特斯拉光伏牆',\n BuildingIntegratedPhotovoltaics: '建築整合光伏',\n Floatovoltaics: '浮動光伏',\n Agrivoltaics: '農業光伏',\n VegetativeBuffer: '太陽能農場绿化带',\n RainbowSwashSolarFarmBostonMA: '馬薩諸塞州波士頓彩虹激流旁邊的光伏板陣列',\n MickeyMouseSolarFarmOrlandoFL: '佛羅里達州奧蘭多的米老鼠形狀光伏板陣列',\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亞州貝克斯菲爾德灌溉渠上假想的光伏板陣列',\n SolarNoiseBarrierLexingtonMA: '馬薩諸塞州列剋星敦高速公路噪音牆上假想的光伏板',\n HSATSolarTrackersRaleighNC: '北卡羅來納州羅利的一個水平方向單軸旋轉追日光伏板陣列(HSAT)',\n AADATSolarTrackersLancasterCA: '加利福尼亞州蘭開斯特的一個雙軸旋轉追日光伏板陣列(AADAT)',\n SolarTrackersInRealWorld: '模擬',\n SolarUpdraftTowerInCity: '太陽能上升氣流塔在城市中的應用',\n },\n\n builtEnvironmentSubMenu: '建造環境',\n residentialBuildingsSubMenu: '住宅建築',\n residentialBuildingExamples: {\n ColonialHouse: '殖民地風格的住宅',\n DutchColonialHouse: '荷蘭殖民地風格的住宅',\n TShapedHouse: 'T字型房子',\n CapeCodHouseWithGarage: '有車庫的科德角風格的住宅',\n Solarium: '有日光浴室的房子',\n Church1: '教堂例一',\n Cathedral1: '主教座堂例一',\n Cathedral2: '主教座堂例二',\n Mosque1: '清真寺例一',\n AdobeTaosHouse: '陶斯土坯房',\n RanchHouse: '牧場風格的住宅',\n BonnetHouse: '有帽簷屋頂的住宅',\n BarnStyleHouse: '穀倉式風格的住宅',\n ModernHouse: '現代風格的住宅',\n ButterflyRoofHouse: '蝴蝶型屋頂的住宅',\n },\n commercialBuildingsSubMenu: '商用建築',\n commercialBuildingExamples: {\n WhiteHouse: '白宫',\n BilimMersinTurkiye: '土耳其梅爾辛科學教育中心',\n SpanishStyleHotel: '西班牙風格旅館',\n ApartmentBuilding: '公寓樓',\n OfficeBuilding: '寫字樓',\n Hotel: '旅館',\n },\n buildingComplexesSubMenu: '建築群',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯靈頓高中',\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒羅阿帕奇學校',\n },\n urbanPlanningSubMenu: '城市規劃',\n urbanPlanningExamples: {\n Heatmap1: '熱圖例一',\n },\n otherBuildingsSubMenu: '其它建築',\n otherBuildingExamples: {\n Greenhouse: '溫室',\n Pavilion: '公園的亭子',\n OctagonalPagoda: '八角塔',\n OceanFront: '海邊',\n EgyptianPyramids: '埃及金字塔',\n MayanPyramid: '瑪雅金字塔',\n SiOSePol: '三十三孔橋',\n StackedCuboids: '堆砌長方體',\n },\n\n artificialIntelligenceSubMenu: '人工智慧',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: '優化單排光伏板的傾斜角',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '優化多排光伏板的傾斜角',\n SolarFarmGenerativeDesign: '生成式設計太陽能農場',\n SolarFarmGenerativeDesignWithBlock: '生成式設計太陽能農場:周邊有建築物的情況',\n FitchburgSolarFarmGenerativeDesign: '生成式設計太陽能農場:真實世界案例',\n },\n\n languageSubMenu: '語言',\n publicSubMenu: '公共',\n ModelsGallery: '模型畫廊',\n ModelsMap: '模型地圖',\n AboutUs: '關於我們',\n },\n\n avatarMenu: {\n AccountSettings: '賬號設定',\n PrivacyStatementTitle: '用戶隱私權保護聲明',\n PrivacyStatement:\n '登錄需要採用您的谷歌ID建立或進入您的阿拉丁賬戶。 我們只儲存一個隨機的字符串作為您的ID。 任何關於您的可辨識的個人信息都沒有被收集。 詳情請參考我們的',\n SignIn: '登錄',\n SignOut: '退出賬號',\n IfYouAreAStudent: '如果您是一個學生',\n },\n\n skyMenu: {\n Axes: '顯示坐標軸',\n Theme: '環境主題',\n ThemeDefault: '默認',\n ThemeDesert: '沙漠',\n ThemeDune: '沙丘',\n ThemeForest: '森林',\n ThemeGrassland: '草原',\n ThemeHill: '丘陵',\n ThemeLake: '湖泊',\n ThemeMountain: '山脈',\n ThemeRural: '田園',\n SunlightAttenuationCoefficientInAir: '陽光在空氣中傳播的衰減係數',\n ConvectiveCoefficientOfAir: '空氣對流傳熱係數',\n HighestTemperatureTimeInMinutes: '最高氣溫時間(分鐘)',\n SelectSunAnglesToShow: '選擇太陽角度顯示',\n ShowAzimuthAngle: '顯示方位角',\n ShowElevationAngle: '顯示高度角',\n ShowZenithAngle: '顯示天頂角',\n DirectLightBrightnessAtNoon: '正午直射光照度',\n AmbientLightBrightnessAtNoon: '正午環境光照度',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: '月份輻射度損失比',\n Vegetation: '植被',\n LeafOutDay: '樹葉長出的日子',\n LeafOffDay: '樹葉脫落的日子',\n Albedo: '反照率',\n ImageOnGround: '地面顯示圖像',\n WaterSurface: '水面',\n RemoveAllUnlockedTrees: '刪除所有非固定的樹木',\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\n RemoveAllUnlockedCuboids: '删除所有非固定的長方體',\n DoYouReallyWantToRemoveAllPeople: '你確定刪除所有非固定的人物嗎',\n DoYouReallyWantToRemoveAllTrees: '你確定刪除所有非固定的樹木嗎',\n DoYouReallyWantToRemoveAllFlowers: '你確定刪除所有非固定的花草嗎',\n DoYouReallyWantToRemoveAllSolarPanels: '你確定刪除所有非固定的光伏板嗎',\n DoYouReallyWantToRemoveAllFoundations: '你確定刪除所有非固定的地基嗎',\n DoYouReallyWantToRemoveAllCuboids: '你確定刪除所有非固定的長方體嗎',\n LockAllElements: '固定所有的部件',\n UnlockAllElements: '解除所有的固定',\n },\n\n labelSubMenu: {\n Label: '標籤',\n LabelText: '標籤的内容',\n LabelHeight: '標籤的高度',\n LabelSize: '標籤的大小',\n LabelFontSize: '字體的大小',\n LabelColor: '標籤的顏色',\n KeepShowingLabel: '顯示標籤',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: '刪除此地基上所有非固定的光伏板',\n RemoveAllUnlockedParabolicTroughs: '刪除此地基上所有非固定的拋物線槽',\n RemoveAllUnlockedParabolicDishes: '刪除此地基上所有非固定的拋物線碟',\n RemoveAllUnlockedFresnelReflectors: '刪除此地基上所有非固定的菲涅耳反射鏡',\n RemoveAllUnlockedHeliostats: '刪除此地基上所有非固定的定日鏡',\n RemoveAllUnlockedSensors: '刪除此地基上所有非固定的傳感器',\n RemoveAllUnlockedLights: '刪除此地基上所有非固定的電燈',\n RemoveAllUnlockedWalls: '刪除此地基上所有非固定的牆',\n RemoveAllUnlockedWindows: '刪除此地基上所有非固定的窗戶',\n RemoveAllUnlockedDoors: '刪除此地基上所有非固定的門',\n RemoveAllUnlockedPolygons: '刪除此地基上所有非固定的多邊形',\n RemoveAllUnlockedHumans: '刪除此地基上所有非固定的人物',\n RemoveAllUnlockedTrees: '刪除此地基上所有非固定的樹木',\n RemoveAllUnlockedFlowers: '刪除此地基上所有非固定的花草',\n Racks: '支架',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n SolarPanels: '光伏板',\n SolarPanelArray: '光伏板陣列',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你確定刪除此地基上所有非固定的光伏板嗎',\n ParabolicTroughs: '拋物線槽',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你確定刪除此地基上所有非固定的拋物線槽嗎',\n ParabolicDishes: '拋物線碟',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你確定刪除此地基上所有非固定的拋物線碟嗎',\n FresnelReflectors: '菲涅耳反射鏡',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你確定刪除此地基上所有非固定的菲涅耳反射鏡嗎',\n Heliostats: '定日鏡',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你確定刪除此地基上所有非固定的定日鏡嗎',\n Sensors: '傳感器',\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你確定刪除此地基上所有非固定的傳感器嗎',\n Lights: '電燈',\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你確定刪除此地基上所有非固定的電燈嗎',\n Walls: '牆',\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你確定刪除此地基上所有非固定的牆嗎',\n Windows: '窗戶',\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你確定刪除此地基上所有非固定的窗戶嗎',\n Doors: '門',\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你確定刪除此地基上所有非固定的門嗎',\n Polygons: '多邊形',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你確定刪除此地基上所有非固定的多邊形嗎',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你確定刪除此地基上所有非固定的人物嗎',\n Trees: '樹木',\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你確定刪除此地基上所有非固定的樹木嗎',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你確定刪除此地基上所有非固定的花草嗎',\n OnlyThisFoundation: '只這塊地基',\n AllConnectedFoundations: '所有相連的地基',\n AllFoundations: '所有的地基',\n AddPolygon: '添加多邊形',\n SolarStructure: '太陽能構型',\n GroupMaster: '主地基',\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\n GroundFloorRValue: '建築物地板的R值',\n OnlyThisGroundFloor: '只這個建築物的地板',\n AllGroundFloors: '所有建築物的地板',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: '和定日鏡配套的吸收塔',\n ReceiverTowerPhysicalProperties: '太陽能吸收塔的物理性質',\n ReceiverTowerHeight: '太陽能吸收塔的高度',\n ReceiverTowerRadius: '太陽能吸收塔的半徑',\n ReceiverAbsorptance: '太陽能吸收器的吸收率',\n ReceiverOpticalEfficiency: '太陽能吸收器的光效率',\n ReceiverThermalEfficiency: '太陽能吸收器的熱效率',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: '和菲涅爾反射鏡配套的吸收管',\n AbsorberPipePhysicalProperties: '太陽能吸收管的物理性質',\n AbsorberHeight: '太陽能吸收管的安装高度',\n AbsorberApertureWidth: '太陽能吸收管的孔徑',\n AbsorberPipePoleNumber: '太陽能吸收管的支柱數量',\n AbsorberAbsorptance: '太陽能吸收管的吸收率',\n AbsorberOpticalEfficiency: '太陽能吸收管的光效率',\n AbsorberThermalEfficiency: '太陽能吸收管的熱效率',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: '太陽能上升氣流塔',\n SolarUpdraftTowerPhysicalProperties: '太陽能上升氣流塔的物理性質',\n SolarUpdraftTowerChimneyHeight: '太陽能上升氣流塔煙囪的高度',\n SolarUpdraftTowerChimneyRadius: '太陽能上升氣流塔煙囪的半徑',\n SolarUpdraftTowerCollectorHeight: '太陽能上升氣流塔集熱棚的高度',\n SolarUpdraftTowerCollectorRadius: '太陽能上升氣流塔集熱棚的半徑',\n SolarUpdraftTowerCollectorTransmissivity: '太陽能上升氣流塔集熱棚的透射率',\n SolarUpdraftTowerCollectorEmissivity: '太陽能上升氣流塔集熱棚的發射率',\n SolarUpdraftTowerDischargeCoefficient: '太陽能上升氣流塔的流量係數',\n SolarUpdraftTowerTurbineEfficiency: '太陽能上升氣流塔的渦輪機效率',\n },\n\n cuboidMenu: {\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n RemoveAllUnlockedSolarPanels: '刪除此長方體表面上所有非固定的光伏板',\n RemoveAllUnlockedSensors: '刪除此長方體表面上所有非固定的傳感器',\n RemoveAllUnlockedPolygons: '刪除此長方體表面上所有非固定的多邊形',\n RemoveAllUnlockedHumans: '刪除此長方體表面上所有非固定的人物',\n RemoveAllUnlockedTrees: '刪除此長方體表面上所有非固定的樹木',\n RemoveAllUnlockedFlowers: '刪除此長方體表面上所有非固定的花草',\n Racks: '支架',\n SolarPanels: '光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你確定刪除此長方體表面上所有非固定的光伏板嗎',\n Sensors: '傳感器',\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你確定刪除此長方體表面上所有非固定的傳感器嗎',\n Polygons: '多邊形',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你確定刪除此長方體表面上所有非固定的多邊形嗎',\n Humans: '人物',\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你確定刪除此長方體表面上所有非固定的人物嗎',\n Trees: '樹木',\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你確定刪除此長方體表面上所有非固定的樹木嗎',\n Flowers: '花草',\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你確定刪除此長方體表面上所有非固定的花草嗎',\n OnlyThisCuboid: '只這個長方體',\n AllCuboidsOnSameSurface: '同一表面上所有的長方體',\n AllCuboidsAboveSameBase: '同一地基上所有的長方體',\n AllCuboids: '所有的長方體',\n OnlyThisSide: '只這個表面',\n AllSidesOfThisCuboid: '這個長方體所有的側面',\n AllSidesOfAllCuboids: '所有的長方體所有的側面',\n AddPolygon: '添加多邊形',\n Stackable: '可堆砌',\n GroupMaster: '主長方體',\n },\n\n polygonMenu: {\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n TextBox: '文字框',\n FontOutlineColor: '字體輪廓顏色',\n FontOutlineWidth: '字體輪廓線寬',\n FontStrokeColor: '字體描邊顏色',\n FontStrokeWidth: '字體描邊線寬',\n NoOutline: '無輪廓線',\n Shiny: '光澤',\n Filled: '填充',\n FillTexture: '填充材質',\n FillColor: '填充顏色',\n Opacity: '遮光度',\n LineColor: '線條顏色',\n LineWidth: '線條寬度',\n LineStyle: '線條樣式',\n SolidLine: '實線',\n DashedLine: '虛線',\n DottedLine: '點線',\n InsertVertexBeforeIndex: '前面插入頂點',\n InsertVertexAfterIndex: '後面插入頂點',\n DeleteVertex: '移除頂點',\n OnlyThisPolygon: '只這個多邊形',\n AllPolygonsOnSurface: '同一表面上所有的多邊形',\n AllPolygonsAboveFoundation: '同一地基上所有的多邊形',\n AllPolygons: '所有的多邊形',\n Layout: '佈局',\n SolarPanelArrayLayout: '光伏板陣列佈局',\n SolarPanelArrayLayoutParametricDesign: '光伏板陣列佈局參數化設計',\n SolarPanelArrayLayoutGenerativeDesign: '光伏板陣列佈局生成式設計',\n SolarPanelArrayModel: '光伏板型號',\n SolarPanelArrayOrientation: '排列方向',\n SolarPanelArrayTiltAngle: '傾斜角度',\n SolarPanelArrayRowWidth: '行寬度',\n SolarPanelArrayInterRowSpacing: '行間距',\n SolarPanelArrayRowSpacing: '行間距',\n SolarPanelArrayRowAxis: '行軸方向',\n SolarPanelArrayLeftRightRowAxis: '左右方向(相對)',\n SolarPanelArrayUpDownRowAxis: '上下方向(相對)',\n SolarPanelArrayEastWestRowAxis: '東西方向(絕對)',\n SolarPanelArrayNorthSouthRowAxis: '南北方向(絕對)',\n SolarPanelArrayMargin: '邊緣餘地',\n SolarPanelArrayPoleHeight: '支架高度',\n SolarPanelArrayPoleSpacing: '支柱間隔',\n SolarPanelArrayTotalYearlyCost: '全年總成本',\n SolarPanelArrayTotalYearlyRevenue: '全年總收入',\n SolarPanelArrayTotalYearlyYield: '全年總發電量',\n SolarPanelArrayMeanYearlyYield: '平均年發電量',\n SolarPanelArrayYearlyProfit: '全年利潤',\n LayoutNotAcceptedCheckYourParameters: '恕不能採用此佈局。請檢查您的參數設置。',\n },\n\n optimizationMenu: {\n Optimization: '優化',\n Parameters: '參數',\n Variables: '變量',\n Constants: '常量',\n GeneticAlgorithm: '遺傳算法',\n GeneticAlgorithmSettings: '遺傳算法設定',\n ParticleSwarmOptimization: '粒子群優化',\n ParticleSwarmOptimizationSettings: '粒子群優化設定',\n SolarPanelTiltAngleOptimization: '光伏板傾斜角度優化',\n SolarPanelArrayLayout: '光伏板陣列佈局',\n Generation: '世代',\n Gene: '基因',\n NormalizedVariables: '標準化變量',\n Objective: '目標函數',\n ObjectiveFunctionDailyTotalYield: '當日總產出',\n ObjectiveFunctionYearlyTotalYield: '全年總產出',\n ObjectiveFunctionDailyMeanYield: '當日平均產出',\n ObjectiveFunctionYearlyMeanYield: '全年平均產出',\n ObjectiveFunctionDailyProfit: '當日利潤',\n ObjectiveFunctionYearlyProfit: '全年利潤',\n GeneticAlgorithmSelectionMethod: '遺傳算法選擇方法',\n RouletteWheel: '輪盤制',\n Tournament: '淘汰制',\n SearchMethod: '搜索方法',\n GlobalSearchUniformSelection: '全局搜索均勻取樣',\n LocalSearchRandomOptimization: '局部搜索隨機優化',\n PopulationSize: '種群個體數目',\n MaximumGenerations: '最大世代數目',\n SelectionRate: '選擇概率',\n CrossoverRate: '交配概率',\n MutationRate: '突變概率',\n Step: '步數',\n SwarmSize: '粒子數目',\n MaximumSteps: '最大步數',\n MaximumVelocity: '最大速度',\n InertiaWeight: '慣性權重',\n CognitiveCoefficient: '認知係數',\n SocialCoefficient: '社會係數',\n ConvergenceThreshold: '終止條件的收斂閾值',\n LocalSearchRadius: '局部搜索的半徑',\n RowsPerRackRange: '單個支架上光伏板行數的變化範圍',\n TiltAngleRange: '光伏板傾斜角度的變化範圍',\n InterRowSpacingRange: '光伏板陣列行間距的變化範圍',\n ClickTargetPolygonToActivate: '點擊目標多邊形激活',\n ClickTargetFoundationToActivate: '點擊目標地基激活',\n },\n\n treeMenu: {\n ShowModel: '顯示近似模型',\n Flip: '翻轉',\n Type: '樹種',\n Spread: '樹冠直徑',\n },\n\n flowerMenu: {\n Flip: '翻轉',\n Type: '品種',\n Spread: '直徑',\n },\n\n peopleMenu: {\n ChangePerson: '改變人物',\n Flip: '轉身',\n Observer: '觀察者',\n ViewFromThisPerson: '視角移到此人位置',\n },\n\n lightMenu: {\n Color: '顏色',\n Intensity: '亮度',\n Decay: '衰减',\n MaximumDistance: '最大距離',\n Inside: '内部',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: '相對方位角',\n Pole: '支柱',\n PoleHeight: '支柱高度',\n PoleRadius: '支柱半徑',\n ExtraPoleHeight: '額外的支柱高度',\n ExtraPoleHeightInAdditionToHalfWidth: '寬度一半額外的支柱高度',\n DrawSunBeam: '顯示光束',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: '反射器鏡面反射率',\n ReceiverAbsorptance: '接收器吸收率',\n ReflectorOpticalEfficiency: '反射器光效率',\n ReceiverThermalEfficiency: '接收器熱效率',\n },\n\n solarPanelMenu: {\n InverterEfficiency: '逆變器效率',\n InverterEfficiencyExplained: '直流電轉換為交流電的效率。',\n DcToAcSizeRatio: '直流-交流容量比例',\n DcToAcSizeRatioExplained: '直流電容量和交流電容量的比例。',\n ChangePvModel: '改變光伏板型號',\n Orientation: '排列方向',\n Portrait: '縱向',\n Landscape: '橫向',\n FrameColor: '框架顏色',\n Panels: '塊',\n PanelsWide: '塊光伏板寬',\n PanelsLong: '塊光伏板長',\n TiltAngle: '傾斜角度',\n SouthFacingIsPositive: '朝南為正',\n Tracker: '追日系統',\n SolarTrackerFollowsSun: '追日系統提高光伏板產出。',\n PoleSpacing: '支柱間隔',\n NoTracker: '無追日系統',\n HorizontalSingleAxisTracker: '水平單軸追日系統',\n VerticalSingleAxisTracker: '豎直單軸追日系統',\n AltazimuthDualAxisTracker: '地平雙軸追日系統',\n OnlyThisSolarPanel: '只這個光伏板',\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\n AllSolarPanels: '所有的光伏板',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: '光伏板型號性能',\n Model: '型號',\n PanelSize: '尺寸',\n Cells: '電池組',\n CellType: '光伏電池類型',\n Monocrystalline: '單晶矽',\n Polycrystalline: '多晶矽',\n ThinFilm: '薄膜',\n Bifacial: '雙面',\n BifacialityFactor: '雙面性因子',\n Black: '黑色',\n Blue: '藍色',\n ShadeTolerance: '陰影耐受度',\n SolarCellEfficiency: '光伏電池效率',\n NominalOperatingCellTemperature: '名義電池運行溫度',\n TemperatureCoefficientOfPmax: 'Pmax溫度係數',\n },\n\n parabolicTroughMenu: {\n ModuleLength: '模塊長度',\n Modules: '模塊',\n ModulesLong: '模塊長',\n LatusRectum: '通徑',\n OnlyThisParabolicTrough: '只這個拋物線槽',\n AllParabolicTroughsAboveFoundation: '同一地基上所有的拋物線槽',\n AllParabolicTroughs: '所有的拋物線槽',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: '吸收管',\n SelectAbsorberToReflectSunlightTo: '選擇陽光反射到的吸收管',\n ModuleLength: '模塊長度',\n Modules: '模塊',\n ModulesLong: '模塊長',\n OnlyThisFresnelReflector: '只這個菲涅耳反射鏡',\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射鏡',\n AllFresnelReflectors: '所有的菲涅耳反射鏡',\n },\n\n heliostatMenu: {\n Tower: '吸收塔',\n SelectTowerToReflectSunlightTo: '選擇陽光反射到的吸收塔',\n OnlyThisHeliostat: '只這個定日鏡',\n AllHeliostatsAboveFoundation: '同一地基上所有的定日鏡',\n AllHeliostats: '所有的定日鏡',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: '接收器結構',\n CentralPole: '中心直柱',\n CentralPoleWithTripod: '三腳架和中心直柱',\n Quadrupod: '四脚架',\n RimDiameter: '外圈直徑',\n LatusRectum: '通徑',\n ExtraPoleHeightInAdditionToRadius: '半徑之外額外的支架高度',\n OnlyThisParabolicDish: '只這個拋物線碟',\n AllParabolicDishesAboveFoundation: '同一地基上所有的拋物線碟',\n AllParabolicDishes: '所有的拋物線碟',\n },\n\n wallMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n SizeOfWall: '牆的尺寸',\n OnlyThisWall: '只這堵牆',\n AllConnectedWalls: '所有連接的牆',\n AllWallsAboveFoundation: '同一地基上所有的牆',\n AllWalls: '所有的牆',\n Windows: '窗戶',\n LockAllWindows: '固定所有的窗戶',\n UnlockAllWindows: '解除所有的窗戶固定',\n RemoveAllUnlockedWindows: '刪除這堵牆上所有非固定的窗戶',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你確定刪除這堵牆上所有非固定的窗戶嗎',\n Doors: '門',\n RemoveAllUnlockedDoors: '刪除這堵牆上所有非固定的門',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你確定刪除這堵牆上所有非固定的門嗎',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '刪除這堵牆上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你確定刪除這堵牆上所有非固定的光伏板嗎',\n Sensors: '傳感器',\n LockAllSensors: '固定所有的傳感器',\n UnlockAllSensors: '解除所有的傳感器固定',\n RemoveAllUnlockedSensors: '刪除這堵牆上所有非固定的傳感器',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你確定刪除這堵牆上所有非固定的傳感器嗎',\n Lights: '電燈',\n RemoveAllUnlockedLights: '刪除這堵牆上所有非固定的電燈',\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你確定刪除這堵牆上所有非固定的電燈嗎',\n LockAllPolygons: '固定這堵牆上所有的多邊形',\n UnlockAllPolygons: '解除這堵牆上所有的多邊形固定',\n RemoveAllUnlockedPolygons: '刪除這堵牆上所有非固定的多邊形',\n WallStructure: '牆結構',\n DefaultStructure: '默認',\n StudStructure: '牆柱',\n PillarStructure: '圓柱',\n Opacity: '遮光度',\n StructureSpacing: '結構間距',\n StructureWidth: '結構寬度',\n StructureThickness: '結構厚度',\n StructureColor: '結構颜色',\n Color: '牆体颜色',\n Height: '高度',\n Thickness: '厚度',\n Texture: '材質',\n AllLightsOnWallInside: '所有電燈在牆內',\n AllLightsOnWallOutside: '所有電燈在牆外',\n Fill: '填充',\n Full: '全部',\n Partial: '部分',\n Empty: '空白',\n OpenToOutside: '對外面開放',\n EavesLength: '屋簷延伸長度',\n Parapet: '女牆',\n ParapetColor: '女牆颜色',\n ParapetTexture: '女牆材質',\n ParapetHeight: '女牆高度',\n CopingsHeight: '頂蓋高度',\n CopingsWidth: '頂蓋寬度',\n },\n\n windowMenu: {\n OnlyThisWindow: '只這個窗戶',\n AllWindowsOnSurface: '同一表面上所有的窗戶',\n AllWindowsAboveFoundation: '同一地基上所有的窗戶',\n AllWindows: '所有的窗戶',\n Width: '寬度',\n Height: '高度',\n Mullion: '直櫺',\n MullionWidth: '直櫺寬度',\n MullionSpacing: '直櫺間距',\n MullionColor: '直櫺颜色',\n Tint: '著色',\n Opacity: '不透明度',\n SolarHeatGainCoefficient: '太陽輻射熱獲取係數(SHGC) = 1 - 不透明度',\n Shutter: '百葉窗',\n LeftShutter: '左側百葉窗',\n RightShutter: '右側百葉窗',\n BothShutters: '兩側百葉窗',\n ShutterWidth: '相對寬度',\n ShutterColor: '百葉窗顏色',\n Frame: '邊框',\n FrameWidth: '邊框寬度',\n SillWidth: '窗台寬度',\n Color: '邊框顔色',\n WindowType: '窗戶種類',\n Default: '默認',\n Arched: '拱形',\n Polygonal: '多邊形',\n Interior: '内窗',\n Empty: '空白',\n },\n\n roofMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n OnlyThisRoof: '只這個屋顶',\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\n AllRoofs: '所有的屋顶',\n OnlyThisCeiling: '只這個天花板',\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\n AllCeilings: '所有的天花板',\n EavesOverhangLength: '屋簷延伸長度',\n RafterSpacing: '屋椽間距',\n RafterWidth: '屋椽寬度',\n RafterThickness: '屋椽厚度',\n RafterColor: '屋椽颜色',\n RoofColor: '屋顶颜色',\n RoofSideColor: '屋顶側面颜色',\n GlassTint: '玻璃顏色',\n Opacity: '遮光度',\n RoofStructure: '屋頂結構',\n DefaultStructure: '默認',\n RafterStructure: '屋椽',\n GlassStructure: '玻璃',\n SolarPanels: '光伏板',\n LockAllSolarPanels: '固定所有的光伏板',\n UnlockAllSolarPanels: '解除所有的光伏板固定',\n RemoveAllUnlockedSolarPanels: '刪除這個屋顶上所有非固定的光伏板',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你確定刪除這個屋顶上所有非固定的光伏板嗎',\n Windows: '天窗',\n LockAllWindows: '固定所有的天窗',\n UnlockAllWindows: '解除所有的天窗固定',\n RemoveAllUnlockedWindows: '刪除這個屋顶上所有非固定的天窗',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你確定刪除這個屋顶上所有非固定的天窗嗎',\n Sensors: '傳感器',\n LockAllSensors: '固定所有的傳感器',\n UnlockAllSensors: '解除所有的傳感器固定',\n RemoveAllUnlockedSensors: '刪除這個屋顶上所有非固定的傳感器',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你確定刪除這個屋顶上所有非固定的傳感器嗎',\n Lights: '電燈',\n RemoveAllUnlockedLights: '刪除這個屋顶上所有非固定的電燈',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你確定刪除這個屋顶上所有非固定的電燈嗎',\n AllLightsOnRoofInside: '所有電燈在屋頂內',\n AllLightsOnRoofOutside: '所有電燈在屋頂外',\n Rise: '相對高度',\n Ceiling: '天花板',\n RoofRValue: '屋顶R值',\n CeilingRValue: '天花板R值',\n },\n\n doorMenu: {\n TextureDefault: '默認材質',\n Texture01: '一號材質',\n Texture02: '二號材質',\n Texture03: '三號材質',\n Texture04: '四號材質',\n Texture05: '五號材質',\n Texture06: '六號材質',\n Texture07: '七號材質',\n Texture08: '八號材質',\n Texture09: '九號材質',\n Texture10: '十號材質',\n Texture11: '十一號材質',\n Texture12: '十二號材質',\n Texture13: '十三號材質',\n Texture14: '十四號材質',\n Texture15: '十五號材質',\n Texture16: '十六號材質',\n Texture17: '十七號材質',\n OnlyThisDoor: '只這個門',\n AllDoorsOnWall: '同一面牆上所有的門',\n AllDoorsAboveFoundation: '同一地基上所有的門',\n AllDoors: '所有的門',\n DoorType: '門種類',\n Default: '默認',\n Arched: '拱形',\n Filled: '填充',\n FrameColor: '門框顏色',\n Interior: '內門',\n },\n\n siteInfoPanel: {\n High: '最高溫度',\n Low: '最低温度',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: '選中的定日鏡總數',\n NumberOfSelectedSolarPanels: '選中的光伏板總數',\n ElectricityGeneratedDailyBySolarPanels: '這些光伏板的日發電量',\n SceneDiameter: '場景直徑',\n BuildingArea: '建築面積',\n },\n\n visualizationControlPanel: {\n ColorContrast: '熱圖顏色對比度',\n FluxScale: '熱通量長度',\n ClickUpOrDownArrowButtonsToChange: '點擊上下箭頭改變參數',\n },\n\n instructionPanel: {\n Rotate: '旋轉',\n DragMouse: '拖動滑鼠',\n Zoom: '缩放',\n MouseWheelOrKeys: '滑鼠滾輪或者Ctrl+[和Ctrl+]',\n MouseWheelOrKeysMac: '滑鼠滾輪或者⌘+[和⌘+]',\n Pan: '平移',\n HoldCtrlDragMouse: '按下Ctrl鍵並拖動滑鼠',\n HoldMetaDragMouse: '按下⌘鍵並拖動滑鼠',\n Enter2DMode: '進入二維模式',\n Exit2DMode: '退出二維模式',\n EnableNavigation: '進入導航模式',\n DisableNavigation: '退出導航模式',\n Move: '移動',\n MoveInstruction: '按下W/A/S/D/Z/X鍵',\n Turn: '拐彎',\n TurnInstruction: '按下方向鍵',\n ResetView: '重置視角',\n AutoRotate: '自動旋轉',\n StartOrStop: '按F4鍵啟動或停止',\n },\n\n mapPanel: {\n ImageOnGround: '地面顯示圖像',\n WeatherStations: '氣象站',\n WeatherStationsNote: '關閉此選項以提高地圖速度',\n Coordinates: '經緯度坐標',\n Zoom: '放大程度',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: '光伏板對觀察者的可見度',\n Observer: '觀察者',\n VantagePoint: '觀察位置',\n ItemizedVisibilityByFields: '每個場的可見度',\n TotalVisibility: '總可見度',\n },\n\n sensorPanel: {\n LightSensor: '光傳感器',\n WeatherDataFrom: '氣象數據來自',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: '建築物日能耗',\n YearlyBuildingEnergy: '建築物年能耗',\n Heater: '暖氣',\n AC: '空調',\n SolarPanel: '光伏',\n Net: '淨能耗',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: '光伏日發電量',\n SolarPanelYearlyYield: '光伏年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualSolarPanels: '顯示每行光伏板單獨發電量',\n Profit: '利潤',\n TotalCost: '總成本',\n TotalRevenue: '總收入',\n TotalYield: '總發電量',\n MeanYield: '平均發電量',\n ModuleCount: '光伏板總數',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: '拋物線槽日發電量',\n ParabolicTroughYearlyYield: '拋物線槽年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualParabolicTroughs: '顯示每行拋物線槽單獨發電量',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: '拋物線碟日發電量',\n ParabolicDishYearlyYield: '拋物線碟年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualParabolicDishes: '顯示每個拋物線碟單獨發電量',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: '菲涅耳反射鏡日發電量',\n FresnelReflectorYearlyYield: '菲涅耳反射鏡年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualFresnelReflectors: '顯示每個菲涅耳反射鏡單獨發電量',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: '定日鏡日發電量',\n HeliostatYearlyYield: '定日鏡年發電量',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualHeliostats: '顯示每個定日鏡單獨發電量',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: '太陽能上升氣流塔日發電量',\n UpdraftTowerYearlyYield: '太陽能上升氣流塔年發電量',\n ChimneyAirTemperature: '煙囪空氣溫度',\n ChimneyWindSpeed: '煙囪風速',\n Yield: '發電量',\n YieldPerHour: '每小時發電量',\n DailyTotal: '日發電總量',\n YearlyTotal: '年發電總量',\n ShowOutputsOfIndividualUpdraftTowers: '顯示每個太陽能上升氣流塔單獨發電量',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: '太陽和時間設置',\n SunAngles: '角度',\n TwentyFourHours: '24小時',\n },\n\n cloudFilePanel: {\n SearchByTitle: '按標題搜索',\n MyLikes: '我喜歡的模型',\n MyCloudFiles: '我的雲文件',\n GenerateLink: '生成鏈接',\n LinkGeneratedInClipBoard: '鏈接已經復製到剪貼板',\n DoYouReallyWantToDelete: '您確定刪除此文檔',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文檔已被分享或發布, 改名會使已有鏈接失效',\n },\n\n projectListPanel: {\n SearchByTitle: '按標題搜索',\n MyProjects: '我的項目',\n GenerateProjectLink: '生成項目鏈接',\n ProjectLinkGeneratedInClipBoard: '項目鏈接已經復製到剪貼板',\n DoYouReallyWantToDeleteProject: '您確定刪除項目',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此項目已被分享或發布, 改名會使已有鏈接失效',\n },\n\n projectPanel: {\n ProjectSettings: '項目設定',\n ThumbnailImageSize: '縮略圖大小',\n ProjectByOtherPeople: '別人的項目',\n Project: '項目',\n ProjectType: '類别',\n ProjectDescription: '描述',\n MakeDescriptionEditable: '編輯描述',\n MakeDescriptionNonEditable: '不編輯描述',\n DoubleClickToMakeDescriptionEditable: '雙擊此描述激活編輯功能',\n SolarPanelArray: '光伏板陣列設計',\n CurateCurrentDesign: '收藏當前設計',\n UpdateSelectedDesign: '更新選中設計',\n RemoveSelectedDesign: '刪除選中設計',\n ClickToFlipSortingOrder: '點擊逆轉排序方向',\n DesignNotShownInSolutionSpaceClickToShow: '此設計目前不顯示在設計空間內,點擊顯示',\n DesignShownInSolutionSpaceClickToHide: '此設計目前顯示在設計空間內,點擊隱藏',\n DistributionInSolutionSpace: '方案在設計空間裡的分佈',\n ChooseSolutionSpace: '選擇設計空間',\n ChooseDataColoring: '選擇數據著色',\n SameColorForAllDesigns: '所有設計一個顏色',\n OneColorForEachDesign: '每個設計一個顏色',\n SolutionSpaceScreenshot: '設計空間截圖',\n ScatteredPlotScreenshot: '散點圖截圖',\n SingleClickToSelectDoubleClickToOpen: '單擊選擇,雙擊打開。',\n SingleClickToDeselectDoubleClickToOpen: '單擊取消選擇,雙擊打開。',\n GenerateScatteredPlot: '生成散點圖',\n SelectXAxis: '選擇X軸',\n SelectYAxis: '選擇Y軸',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: '我的賬戶設定',\n MyID: '我的🆔',\n ClickToCopyMyID: '點擊此處拷貝我的ID',\n IDInClipBoard: '您現在可以粘貼ID了。',\n StoreMyNameInMyFilesWhenSaving: '保存文檔時籤上我的大名',\n DoYouReallyWantToShowYourNameInYourFiles: '您確定在您的文檔裡保存您的大名嗎?',\n SignFileDisclaimer: '如果您選擇保存,您的大名可能被所有打開您的文檔的人看到。',\n Likes: '點贊總數',\n AllPublished: '發佈總數',\n PublishedUnderAliases: '别名發佈',\n UserCount: '用戶總數',\n SchoolID: '學校編號',\n ClassID: '班級編號',\n },\n\n weatherPanel: {\n SunshineHours: '日照時間',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: '選擇氣溫模型',\n Sinusoidal: '正弦函數',\n },\n\n economicsPanel: {\n EconomicsParameters: '經濟學參數',\n ElectricitySellingPrice: '銷售電價',\n OperationalCostPerUnit: '單位運行成本',\n SellingPrice: '銷售電價',\n UnitCost: '單位成本',\n },\n\n navigationPanel: {\n NavigationParameters: '導航模式參數',\n MinimumMoveSpeed: '最小移動速度',\n MinimumTurnSpeed: '最小拐彎速度',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: '天空清晰度',\n ShowDaylightResults: '顯示日照時間結果',\n ShowSkyClearnessResults: '顯示天空清晰度結果',\n ShowAverageDailySolarRadiation: '顯示日平均輻射結果',\n },\n\n analysisManager: {\n NoSensorForCollectingData: '沒有傳感器收集數據。',\n NoSolarPanelForAnalysis: '沒有光伏板可以分析。',\n NoObserverForVisibilityAnalysis: '沒有找到可見度分析的觀察者。',\n NoWaterHeaterForAnalysis: '沒有太陽能熱水器可以分析。',\n NoParabolicDishForAnalysis: '沒有拋物線碟可以分析。',\n NoParabolicTroughForAnalysis: '沒有拋物線槽可以分析。',\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射鏡可以分析。',\n NoHeliostatForAnalysis: '沒有定日鏡可以分析。',\n NoSolarUpdraftTowerForAnalysis: '沒有太陽能上升氣流塔可以分析。',\n NoBuildingForAnalysis: '沒有建築物可以分析。',\n },\n\n toolbar: {\n CloudFile: '雲文檔',\n Select: '選擇',\n AddFoundation: '添加地基',\n AddWall: '添加牆體',\n AddWindow: '添加窗戶',\n AddDoor: '添加門',\n AddPyramidRoof: '添加金字塔屋頂',\n AddGableRoof: '添加雙坡屋頂',\n AddHipRoof: '添加四坡屋顶',\n AddGambrelRoof: '添加复斜屋顶',\n AddMansardRoof: '添加折線屋顶',\n AddCuboid: '添加長方體',\n AddSensor: '添加傳感器',\n AddSolarPanel: '添加光伏板',\n AddWaterHeater: '添加太陽能熱水器',\n AddParabolicDish: '添加拋物線碟',\n AddParabolicTrough: '添加拋物線槽',\n AddFresnelReflector: '添加菲涅耳反射鏡',\n AddHeliostat: '添加定日鏡',\n AddWindTurbine: '添加風力渦輪機',\n AddLight: '添加電燈',\n AddTree: '添加樹木',\n AddFlower: '添加花草',\n AddPeople: '添加人物',\n DoubleClickToLockThisModeForNextAction: '雙擊按鈕給下個動作鎖定此模式',\n ClickToUnlockThisModeForNextAction: '點擊按鈕讓動作完成即離開此模式',\n ManipulateGroup: '整體操作一個組',\n ClearScene: '清空場景',\n ShowSunAndTimeSettings: '顯示太陽和時間設置',\n SpatialAnalysisOfEnergy: '能量的空間分析',\n DoYouReallyWantToClearContent: '您確定清空場景嗎',\n ClickForMoreButtons: '點擊此處切換到更多的按鈕模式',\n SwitchToAddingFoundation: '切換到添加地基模式',\n SwitchToAddingCuboid: '切換到添加長方體模式',\n SwitchToAddingWall: '切換到添加牆體模式',\n SwitchToAddingWindow: '切換到添加窗戶模式',\n SwitchToAddingDoor: '切換到添加門模式',\n SwitchToAddingPyramidRoof: '切換到添加金字塔屋頂模式',\n SwitchToAddingGableRoof: '切換到添加雙坡屋頂模式',\n SwitchToAddingHipRoof: '切換到添加四坡屋頂模式',\n SwitchToAddingGambrelRoof: '切換到添加复斜屋頂模式',\n SwitchToAddingMansardRoof: '切換到添加折線屋頂模式',\n SwitchToAddingSolarPanel: '切換到添加光伏板模式',\n SwitchToAddingSensor: '切換到添加傳感器模式',\n SwitchToAddingWaterHeater: '切換到添加太陽能熱水器模式',\n SwitchToAddingParabolicDish: '切換到添加拋物線碟模式',\n SwitchToAddingParabolicTrough: '切換到添加拋物線槽模式',\n SwitchToAddingFresnelReflector: '切換到添加菲涅耳反射鏡模式',\n SwitchToAddingHeliostat: '切換到添加定日鏡模式',\n SwitchToAddingWindTurbine: '切換到添加風力渦輪機模式',\n SwitchToAddingLight: '切換到添加電燈模式',\n SwitchToAddingTree: '切換到添加樹木模式',\n SwitchToAddingFlower: '切換到添加花草模式',\n SwitchToAddingPeople: '切換到添加人物模式',\n },\n\n tooltip: {\n gotoIFI: '訪問未來智能研究所',\n visitAladdinHomePage: '訪問阿拉丁主頁',\n clickToOpenMenu: '點擊打開主菜單',\n clickToAccessCloudTools: '點擊打開雲菜單',\n },\n\n tree: {\n Apple: '蘋果樹',\n Birch: '白樺',\n Coconut: '椰子樹',\n Dogwood: '茱萸',\n Elm: '榆樹',\n FanPalm: '扇葉棕櫚',\n Linden: '菩提',\n Magnolia: '玉蘭',\n Maple: '楓樹',\n Oak: '橡樹',\n Pine: '松樹',\n Spruce: '雲杉',\n },\n\n flower: {\n Bellflower: '鈴蘭',\n Boxwood: '黃楊',\n CactusCombo1: '仙人掌組合一',\n CactusCombo2: '仙人掌組合二',\n CactusCombo3: '仙人掌組合三',\n CactusCombo4: '仙人掌組合四',\n Hibiscus: '木槿',\n Hosta: '玉簪',\n Hydrangea: '繡球花',\n Peony: '牡丹',\n RedRose: '紅玫瑰',\n Spirea: '繡線菊',\n Sunflower: '向日葵',\n TallBush: '高灌木',\n Tulip: '鬱金香',\n WhiteFlower: '白花',\n YellowFlower: '黄花',\n },\n\n people: {\n Jaah: '賈阿',\n Jack: '傑克',\n Jacob: '雅各布',\n Jacqueline: '杰奎琳',\n Jade: '美玉',\n Jamelia: '潔米莉雅',\n James: '詹姆斯',\n Jane: '簡',\n Jaya: '佳婭',\n Jaye: '傑伊',\n Jeanette: '珍妮特',\n Jedi: '傑迪',\n Jeff: '傑夫',\n Jena: '珍娜',\n Jennifer: '珍尼弗',\n Jess: '傑西',\n Jett: '傑特',\n Jill: '吉爾',\n Jiya: '吉娅',\n Joan: '瓊',\n Jocelyn: '喬斯林',\n Joel: '喬爾',\n Joey: '喬伊',\n John: '約翰',\n Jonathon: '喬納森',\n Jose: '何塞',\n Joseph: '約瑟夫',\n Joshua: '約書亞',\n Judd: '賈德',\n Judy: '朱蒂',\n Julia: '朱莉婭',\n Julio: '胡里奥',\n Jumapili: '祖瑪匹莉',\n June: '準衛',\n Juro: '朱諾',\n Justin: '賈斯汀',\n },\n\n compass: {\n N: '北',\n S: '南',\n W: '西',\n E: '東',\n },\n\n month: {\n January: '一月',\n February: '二月',\n March: '三月',\n April: '四月',\n May: '五月',\n June: '六月',\n July: '七月',\n August: '八月',\n September: '九月',\n October: '十月',\n November: '十一月',\n December: '十二月',\n },\n\n modelsMap: {\n SearchByPublisher: '按發布者搜索',\n SearchByLabel: '按標籤搜索',\n MyPublishedModels: '我發布的模型',\n TotalNumberOfUserPublishedModels: '用戶發布的模型總數',\n SortFromOldestToNewest: '從早到晚排序',\n SortFromNewestToOldest: '從晚到早排序',\n ModelsFoundOnThisSite: '個模型在此位置',\n ShowModelsPublishedByThisAuthor: '展示此用戶發布的模型',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_es = {\n translation: {\n name: {\n IFI: 'Instituto de inteligencia futura',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\n },\n\n cookie: {\n Statement: 'Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin',\n Accept: 'Aceptar',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Este producto esta hecho por',\n TermsOfService: 'Términos de servicio',\n PrivacyPolicy: 'Política de privacidad',\n Software: 'Programa',\n Content: 'Contenido',\n Research: 'Investigación',\n Support: 'Ayuda',\n Acknowledgment: 'Agradecimientos',\n FundingInformation:\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.',\n Contact: 'Para más información, por favor contacte con Charles Xie (charles@intofuture.org).',\n Translators: 'Translators',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'Todos los derechos reservados',\n MeterAbbreviation: 'm',\n Version: 'Versión',\n VersionInitial: 'V',\n Options: 'Opciones',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Número máximo',\n MinimumNumber: 'Minimum Number',\n MaximumValue: 'Maximum Value',\n MinimumValue: 'Minimum Value',\n Or: 'O',\n None: 'Ninguno',\n High: 'High',\n Partial: 'Partial',\n Teacher: 'Profesor',\n Class: 'Clase',\n Total: 'Total',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Rango',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Press',\n Open: 'Abrir',\n Save: 'Guardar',\n SaveAsImage: 'Guardar como imagen',\n SaveAsCsv: 'Save as CSV',\n Update: 'Actualizar',\n Paste: 'Pegar',\n Copy: 'Copiar',\n Cut: 'Cortar',\n Delete: 'Eliminar',\n Lock: 'Cerrar con llave',\n Translucent: 'Translucent',\n Color: 'Color',\n Texture: 'Textura',\n Size: 'Tamaño',\n Thickness: 'Grosor',\n Yes: 'Sí',\n No: 'No',\n OK: 'OK',\n Cancel: 'Cancelar',\n Apply: 'Aplicar',\n Close: 'Cerrar',\n ApplyTo: 'Aplicar a',\n Run: 'Run',\n Pause: 'Pause',\n Resume: 'Resume',\n Clear: 'Limpiar',\n Warning: 'Aviso',\n Caution: 'Caution',\n Reminder: 'Reminder',\n Length: 'Longitud',\n Width: 'Ancho',\n Height: 'Altura',\n Radius: 'Radius',\n Angle: 'Ángulo',\n Azimuth: 'Azimut',\n Coordinates: 'Coordinates',\n Weather: 'Tiempo',\n Show: 'Mostrar',\n Animate: 'Animar',\n Date: 'Fecha',\n Time: 'Tiempo',\n Title: 'Título',\n Owner: 'Propietario',\n Action: 'Acción',\n Rename: 'Renombrar',\n Location: 'Location',\n Latitude: 'Latitud',\n Month: 'Mes',\n Day: 'Día',\n Hour: 'Hora',\n Daylight: 'Luz solar',\n Radiation: 'Radiación',\n Temperature: 'Temperatura',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'O',\n Fixed: 'Fixed',\n Elements: 'Elements',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'Sin textura',\n FoundationElement: 'Bases',\n CuboidElement: 'Cuboide',\n PolygonElement: 'Polígon',\n SensorElement: 'Sensor',\n SolarPanelElement: 'Panel solar',\n WaterHeaterElement: 'Water Heater',\n ParabolicDishElement: 'Parabolic Dish',\n ParabolicTroughElement: 'Parabolic Trough',\n FresnelReflectorElement: 'Fresnel Reflector',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Bloqueado',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Cannot sign in',\n CannotSignOut: 'Cannot sign out',\n YourAccountWasCreated: 'Your account was created.',\n CannotCreateAccount: 'Cannot create an account',\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'The cloud file was not found',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Cannot open the cloud file',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\n CannotRenameCloudFile: 'Cannot rename the cloud file',\n DoYouWantToSaveChanges: '¿Quieres guardar los cambios?',\n NotApplicableToSelectedAction: 'No se aplica a la acción seleccionada',\n ThisElementIsLocked: 'Este elemento está bloqueado',\n ThisCannotBeUndone: 'Esto no se puede deshacer',\n AzimuthOfNorthIsZero: 'Azimut del norte es 0°',\n CounterclockwiseAzimuthIsPositive: 'Hacia la izquierda es positivo',\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\n CannotPasteOutsideBoundary: 'Cannot paste outside this surface.',\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\n CannotMoveObjectTooFar: 'Cannot move object too far.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Existing solar panels will be removed before applying the new layout.',\n DoYouWantToContinue: 'Do you want to continue?',\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\n ScreenshotSaved: 'A screenshot was saved.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simulation started.',\n SimulationCompleted: 'Simulation completed.',\n SimulationAborted: 'Simulation aborted.',\n SimulationPaused: 'Simulation paused.',\n CancelSimulation: 'Cancel simulation',\n PauseSimulation: 'Pause simulation',\n ResumeSimulation: 'Resume simulation',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evolution started.',\n EvolutionCompleted: 'Evolution completed.',\n EvolutionAborted: 'Evolution aborted.',\n EvolutionPaused: 'Evolution paused.',\n EncounterEvolutionError: 'Encountered an evolution error.',\n CancelEvolution: 'Cancel evolution',\n PauseEvolution: 'Pause evolution',\n ResumeEvolution: 'Resume evolution',\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\n ObjectiveFunctionTypeError:\n 'The current objective function is not supported by this operation. Please start from the menu.',\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analysis Options',\n option: {\n GridCellSize: 'Grid Cell Size',\n SamplingFrequency: 'Frecuencia de muestreo',\n TimesPerHour: 'Veces per hora',\n DaysPerYear: 'Days per Year',\n },\n mainMenu: 'Menu principal',\n cloudMenu: 'Menú en la nube',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'Archivo',\n file: {\n CreateNewFile: 'Crear nuevo archivo',\n OpenLocalFile: 'Abrir archivo local',\n SaveAsLocalFile: 'Guardar como archivo local',\n SavingAbortedMustHaveValidFileName: '!Error guardando! Debes tener un nombre de archivo válido',\n OpenCloudFile: 'Abrir archivo en la nube',\n SaveCloudFile: 'Guardar archivo en la nube',\n SaveAsCloudFile: 'Guardar como archivo en la nube',\n SavingAbortedMustHaveValidTitle: '!Error guardando! Debes tener un título válido para el archivo en la nube',\n ToSaveYourWorkPleaseSignIn: 'Para guardar tu trabajo, por favor regístrese.',\n TakeScreenshot: 'Hacer captura de pantalla',\n UseCloudFileName: 'Use Cloud File Name',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Editar',\n edit: {\n Undo: 'Deshacer',\n Redo: 'Repetir',\n },\n viewSubMenu: 'Vista',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: 'Vista 2D',\n ResetView: 'Resetear',\n ZoomIn: 'Acercar',\n ZoomOut: 'Alejar',\n AutoRotate: 'Auto rotación',\n ShowShadow: 'Mostrar sombra',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Translucent Floating Windows',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Información del sitio',\n DesignInformation: 'Información de diseño',\n Instruction: 'Instrucción',\n StickyNote: 'Nota adhesiva',\n Note: 'Nota',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Datos del tiempo',\n DiurnalTemperature: 'Diurnal Temperature',\n Heliodon: 'Heliodon',\n SunAndTime: 'Sun & Time',\n },\n benchmarksSubMenu: 'Benchmarks',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Line Width',\n SymbolSize: 'Symbol Size',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\n },\n analysisSubMenu: 'Análisis',\n physicsSubMenu: 'Physics',\n physics: {\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\n ReflectionHeatmap: 'Reflection Heatmap',\n },\n sensorSubMenu: 'Sensores',\n sensor: {\n CollectDailyData: 'Recoger datos diarios',\n CollectYearlyData: 'Recoger datos anuales',\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Paneles solares',\n solarPanel: {\n AnalyzeDailyYield: 'Analizar el rendimiento diario',\n AnalyzeYearlyYield: 'Analizar el rendimiento anual',\n AnalyzeVisibility: 'Analyze Visibility',\n PanelDiscretization: 'Discretización del panel',\n Exact: 'Exacto',\n Approximate: 'Aproximado',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\n },\n parabolicTroughSubMenu: 'Parabolic Trough',\n parabolicTrough: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n parabolicDishSubMenu: 'Parabolic Dish',\n parabolicDish: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n fresnelReflectorSubMenu: 'Fresnel Reflector',\n fresnelReflector: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Analyze Daily Yield',\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\n },\n\n tutorialsSubMenu: 'Tutorials',\n\n solarEnergyScienceSubMenu: 'Solar Science',\n solarEnergyScienceTutorials: {\n SunAngles: 'Ángulos solares relativos a un observador en el suelo',\n InsolationAndClimate: 'Insolation and Climate',\n SolarRadiationToBox: 'Radiación solar a una caja',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Building Design',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'All Basic Roof Types',\n },\n\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle',\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Seguidores solares',\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\n SolarPowerTower: 'Solar Power Tower',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Ejemplos',\n\n solarEnergySubMenu: 'Energía Solar',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Rayo de sol y heliodon',\n RooftopSolarPanels: 'Rooftop Solar Panels',\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Bus Stop',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Vegetative Buffer',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\n },\n\n builtEnvironmentSubMenu: 'Built Environment',\n residentialBuildingsSubMenu: 'Residential Buildings',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Dutch Colonial House',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solarium',\n Church1: 'Church 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Barn Style House',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Commercial Buildings',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Edificio de oficinas',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Urban Planning',\n urbanPlanningExamples: {\n Heatmap1: 'Heatmap',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Greenhouse',\n Pavilion: 'Pavilion in a Park',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\n },\n\n languageSubMenu: 'Idioma',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'Sobre nosotros',\n },\n\n avatarMenu: {\n AccountSettings: 'Configuraciones de la cuenta',\n PrivacyStatementTitle: 'User Privacy Protection Statement',\n PrivacyStatement:\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 ',\n SignIn: 'Iniciar sesión',\n SignOut: 'Desconectar',\n IfYouAreAStudent: 'Si eres un estudiante',\n },\n\n skyMenu: {\n Axes: 'Ejes',\n Theme: 'Tema',\n ThemeDefault: 'Por defecto',\n ThemeDesert: 'Desierto',\n ThemeDune: 'Dune',\n ThemeForest: 'Bosque',\n ThemeGrassland: 'Campo',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\n ShowAzimuthAngle: 'Show Azimuth Angle',\n ShowElevationAngle: 'Show Elevation Angle',\n ShowZenithAngle: 'Show Zenith Angle',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Imagen en el suelo',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Eliminar todos los árboles',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Eliminar toda la gente',\n RemoveAllUnlockedFoundations: 'Eliminar todos las bases',\n RemoveAllUnlockedCuboids: 'Eliminar todos los cuboides',\n DoYouReallyWantToRemoveAllPeople: 'Estás seguro que quieres eliminar a toda la gente who are not locked',\n DoYouReallyWantToRemoveAllTrees: 'Estás seguro que quieres eliminar todos los árboles that are not locked',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Estás seguro que quieres eliminar todas las bases that are not locked',\n DoYouReallyWantToRemoveAllCuboids: 'Estás seguro que quieres eliminar todos los cuboides that are not locked',\n LockAllElements: 'Lock All Elements',\n UnlockAllElements: 'Unlock All Elements',\n },\n\n labelSubMenu: {\n Label: 'Etiqueta',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Seguir mostrando etiqueta',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Eliminar todas las paredes',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n RemoveAllUnlockedHumans: 'Remove All Humans',\n RemoveAllUnlockedTrees: 'Remove All Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Rejillas',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n SolarPanels: 'Paneles solares',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Estás seguro que quieres eliminar todos los paneles solares en esta base that are not locked',\n ParabolicTroughs: 'Parabolic Troughs',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\n ParabolicDishes: 'Parabolic Dishes',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\n FresnelReflectors: 'Fresnel Reflectors',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\n Heliostats: 'Heliostats',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\n Sensors: 'Sensores',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Estás seguro que quieres eliminar todos los sensores de esta base',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Paredes',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Estás seguro que quieres eliminar todas las paredes de esta base that are not locked',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Polígonos',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Estás seguro que quieres eliminar todos los polígonos de esta base that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Do you really want to remove all the humans on this foundation who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Do you really want to remove all the trees on this foundation that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Solamente esta base',\n AllConnectedFoundations: 'Todas las bases conectadas',\n AllFoundations: 'Todas las bases',\n AddPolygon: 'Añadir polígono',\n SolarStructure: 'Solar Structure',\n GroupMaster: 'Group Master',\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\n ReceiverTowerHeight: 'Height of Receiver Tower',\n ReceiverTowerRadius: 'Radius of Receiver Tower',\n ReceiverAbsorptance: 'Absorptance of Receiver',\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\n AbsorberHeight: 'Height of Absorber Pipe',\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\n AbsorberAbsorptance: 'Absorptance of Absorber',\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Tower',\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\n },\n\n cuboidMenu: {\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n RemoveAllUnlockedHumans: 'Remove All Humans',\n RemoveAllUnlockedTrees: 'Remove All Trees',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Rejillas',\n SolarPanels: 'Paneles solares',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Estás seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked',\n Sensors: 'Sensores',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Estás seguro que quieres eliminar todos los sensores de este cuboide that are not locked',\n Polygons: 'Polígonos',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Estás seguro que quieres eliminar todos los polígonos de este cuboide that are not locked',\n Humans: 'Humans',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Do you really want to remove all the humans on this cuboid who are not locked',\n Trees: 'Trees',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Do you really want to remove all the trees on this cuboid that are not locked',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Solamente este cuboide',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\n AllCuboids: 'Todos los cuboides',\n OnlyThisSide: 'Solamente este lado',\n AllSidesOfThisCuboid: 'Todos los lados en este cuboide',\n AllSidesOfAllCuboids: 'Todos los lados en todos los cuboides',\n AddPolygon: 'Añadir polígono',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Rellenar',\n FillTexture: 'Rellenar textura',\n FillColor: 'Rellenar color',\n Opacity: 'Opacity',\n LineColor: 'Color de la línea',\n LineWidth: 'Line Width',\n LineStyle: 'Line Style',\n SolidLine: 'Solid Line',\n DashedLine: 'Dashed Line',\n DottedLine: 'Dotted Line',\n InsertVertexBeforeIndex: 'Añadir vértice antes del índice',\n InsertVertexAfterIndex: 'Añadir vértice después del índice',\n DeleteVertex: 'Eliminar vértice',\n OnlyThisPolygon: 'Solamente este polígono',\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\n AllPolygonsAboveFoundation: 'Todos los polígonos sobre la base',\n AllPolygons: 'Todos los polígonos',\n Layout: 'Layout',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\n SolarPanelArrayModel: 'Solar Panel Model',\n SolarPanelArrayOrientation: 'Orientation',\n SolarPanelArrayTiltAngle: 'Tilt Angle',\n SolarPanelArrayRowWidth: 'Row Width',\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Row Axis',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Pole Height',\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimization',\n Parameters: 'Parameters',\n Variables: 'Variables',\n Constants: 'Constants',\n GeneticAlgorithm: 'Genetic Algorithm',\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\n Generation: 'Generation',\n Gene: 'Gene',\n NormalizedVariables: 'Normalized Variables',\n Objective: 'Objective',\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\n ObjectiveFunctionDailyProfit: 'Daily Profit',\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\n RouletteWheel: 'Roulette Wheel',\n Tournament: 'Tournament',\n SearchMethod: 'Search Method',\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\n PopulationSize: 'Population Size',\n MaximumGenerations: 'Maximum Generations',\n SelectionRate: 'Selection Rate',\n CrossoverRate: 'Crossover Rate',\n MutationRate: 'Mutation Rate',\n Step: 'Step',\n SwarmSize: 'Swarm Size',\n MaximumSteps: 'Maximum Steps',\n MaximumVelocity: 'Maximum Velocity',\n InertiaWeight: 'Inertia Weight',\n CognitiveCoefficient: 'Cognitive Coefficient',\n SocialCoefficient: 'Social Coefficient',\n ConvergenceThreshold: 'Convergence Threshold for Termination',\n LocalSearchRadius: 'Local Search Radius',\n RowsPerRackRange: 'Range for Rows per Rack',\n TiltAngleRange: 'Range for Tilt Angle',\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\n },\n\n treeMenu: {\n ShowModel: 'Mostrar modelo',\n Flip: 'Flip',\n Type: 'Tipo',\n Spread: 'Extender',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Cambiar persona',\n Flip: 'Flip',\n Observer: 'Observer',\n ViewFromThisPerson: 'View from This Person',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Azimut relativa',\n Pole: 'Pole',\n PoleHeight: 'Altura del poste',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Extra Pole Height',\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\n DrawSunBeam: 'Dibujar rayo del sol',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflector Reflectance',\n ReceiverAbsorptance: 'Receiver Absorptance',\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Cambiar modelo PV',\n Orientation: 'Orientación',\n Portrait: 'Vertical',\n Landscape: 'Horizontal',\n FrameColor: 'Frame Color',\n Panels: 'paneles',\n PanelsWide: 'ancho paneles',\n PanelsLong: 'longitud paneles',\n TiltAngle: 'Inclinar ángulo',\n SouthFacingIsPositive: 'Orientado al sur es positivo',\n Tracker: 'Seguidor',\n SolarTrackerFollowsSun: 'Un seguidor sigue el sol para incrementar las salidas de los paneles solares',\n PoleSpacing: 'Espaciado entre postes',\n NoTracker: 'Sin seguimiento',\n HorizontalSingleAxisTracker: 'Seguidor horizontal de eje único',\n VerticalSingleAxisTracker: 'Seguidor vertical de eje único',\n AltazimuthDualAxisTracker: 'Seguidor de doble eje altazimutal',\n OnlyThisSolarPanel: 'Solamente este panel solar',\n AllSolarPanelsOnSurface: 'Todos los paneles solares en la misma superficie',\n AllSolarPanelsAboveFoundation: 'Todos los paneles solares sobre la misma base',\n AllSolarPanels: 'Todos los paneles solares',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Especificaciones del panel solar',\n Model: 'Modelo',\n PanelSize: 'Tamaño del panel',\n Cells: 'Celdas',\n CellType: 'Tipo de celda',\n Monocrystalline: 'Monocristalino',\n Polycrystalline: 'Policristalino',\n ThinFilm: 'Película delgada',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Negro',\n Blue: 'Azul',\n ShadeTolerance: 'Tolerancia a la sombra',\n SolarCellEfficiency: 'Eficiencia de la célula solar',\n NominalOperatingCellTemperature: 'Temperatura nominal de la celda de funcionamiento',\n TemperatureCoefficientOfPmax: 'Coeficiente de temperatura de Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n LatusRectum: 'Latus Rectum',\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\n AllParabolicTroughs: 'All Parabolic Troughs',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Absorber Pipe',\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\n ModuleLength: 'Module Length',\n Modules: 'modules',\n ModulesLong: 'modules long',\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\n AllFresnelReflectors: 'All Fresnel Reflectors',\n },\n\n heliostatMenu: {\n Tower: 'Tower',\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\n OnlyThisHeliostat: 'Only This Heliostat',\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\n AllHeliostats: 'All Heliostats',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Receiver Structure',\n CentralPole: 'Central Pole',\n CentralPoleWithTripod: 'Central Pole with Tripod',\n Quadrupod: 'Quadrupod',\n RimDiameter: 'Rim Diameter',\n LatusRectum: 'Latus Rectum',\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\n AllParabolicDishes: 'All Parabolic Dishes',\n },\n\n wallMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n SizeOfWall: 'Tamaño de la pared',\n OnlyThisWall: 'Solamente esta pared',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: 'Todas las paredes sobre la misma base',\n AllWalls: 'Todo paredes',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\n Doors: 'Doors',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\n WallStructure: 'Wall Structure',\n DefaultStructure: 'Default',\n StudStructure: 'Stud',\n PillarStructure: 'Pillar',\n Opacity: 'Opacity',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Altura',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Only This Window',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\n AllWindows: 'All Windows',\n Width: 'Ancho',\n Height: 'Altura',\n Mullion: 'Mullion',\n MullionWidth: 'Mullion Width',\n MullionSpacing: 'Mullion Spacing',\n MullionColor: 'Mullion Color',\n Tint: 'Tint',\n Opacity: 'Opacity',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Shutter',\n LeftShutter: 'Left Shutter',\n RightShutter: 'Right Shutter',\n BothShutters: 'Both Shutters',\n ShutterWidth: 'Relative Width',\n ShutterColor: 'Shutter Color',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n OnlyThisRoof: 'Only This Wall',\n AllRoofsAboveFoundation: 'All Walls Above the Same Foundation',\n AllRoofs: 'All Roofs',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Rafter Spacing',\n RafterWidth: 'Rafter Width',\n RafterThickness: 'Rafter Thickness',\n RafterColor: 'Rafter Color',\n RoofColor: 'Roof Color',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Glass Tint',\n Opacity: 'Opacity',\n RoofStructure: 'Roof Structure',\n DefaultStructure: 'Default',\n RafterStructure: 'Rafter',\n GlassStructure: 'Glass',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Por defecto',\n Texture01: 'Textura 1',\n Texture02: 'Textura 2',\n Texture03: 'Textura 3',\n Texture04: 'Textura 4',\n Texture05: 'Textura 5',\n Texture06: 'Textura 6',\n Texture07: 'Textura 7',\n Texture08: 'Textura 8',\n Texture09: 'Textura 9',\n Texture10: 'Textura 10',\n Texture11: 'Textura 11',\n Texture12: 'Textura 12',\n Texture13: 'Textura 13',\n Texture14: 'Textura 14',\n Texture15: 'Textura 15',\n Texture16: 'Textura 16',\n Texture17: 'Textura 17',\n OnlyThisDoor: 'Only This Door',\n AllDoorsOnWall: 'All Doors on the Same Wall',\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\n AllDoors: 'All Doors',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'Alto',\n Low: 'Bajo',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Color Contrast',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\n },\n\n instructionPanel: {\n Rotate: 'Rotar',\n DragMouse: 'Arrastrar el ratón',\n Zoom: 'Zoom',\n MouseWheelOrKeys: 'Girar el mouse o presionar Ctrl+[ o Ctrl+]',\n MouseWheelOrKeysMac: 'Girar el mouse o presionar ⌘+[ o ⌘+]',\n Pan: 'Panorámica',\n HoldCtrlDragMouse: 'Mantener Ctrl y mover el ratón',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Reset',\n AutoRotate: 'Auto rotar',\n StartOrStop: 'Presiona F4 para empezar o parar',\n },\n\n mapPanel: {\n ImageOnGround: 'Imagen en el suelo',\n WeatherStations: 'Weather Stations',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Coordenadas',\n Zoom: 'Zoom',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Solar Panel Visibility',\n Observer: 'Observer',\n VantagePoint: 'Vantage Point',\n ItemizedVisibilityByFields: 'Itemized by Fields',\n TotalVisibility: 'Total',\n },\n\n sensorPanel: {\n LightSensor: 'Sensor de luz',\n WeatherDataFrom: 'Datos metereológicos de',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Rendimiento diario del panel solar',\n SolarPanelYearlyYield: 'Rendimiento anual del panel solar',\n Yield: 'Rendimiento',\n YieldPerHour: 'Rendimiento por hora',\n DailyTotal: 'Total diario',\n YearlyTotal: 'Total anual',\n ShowOutputsOfIndividualSolarPanels: 'Mostrar salidas de paneles solares individuales',\n Profit: 'Profit',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Daily Yield',\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\n ChimneyAirTemperature: 'Chimney Air Temperature',\n ChimneyWindSpeed: 'Chimney Wind Speed',\n Yield: 'Yield',\n YieldPerHour: 'Yield per Hour',\n DailyTotal: 'Daily Total',\n YearlyTotal: 'Yearly Total',\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Sun & Time Settings',\n SunAngles: 'Ángulos',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'Mis archivos en la nube',\n GenerateLink: 'Generar enlace',\n LinkGeneratedInClipBoard: 'Se ha generado un enlace en el portapapeles',\n DoYouReallyWantToDelete: 'Estás seguro que quieres eliminar',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Configuración de mi cuenta',\n MyID: 'My 🆔',\n ClickToCopyMyID: 'Click to copy my ID',\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'User Count',\n SchoolID: 'School ID',\n ClassID: 'Class ID',\n },\n\n weatherPanel: {\n SunshineHours: 'Luz solar',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Select Air Temperature Model',\n Sinusoidal: 'Sinusoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Economics Parameters',\n ElectricitySellingPrice: 'Electricity Selling Price',\n OperationalCostPerUnit: 'Operational Cost per Unit',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Claridad',\n ShowDaylightResults: 'Mostrar resultados de la luz solar',\n ShowSkyClearnessResults: 'Mostrar resultados de claridad del cielo',\n ShowAverageDailySolarRadiation: 'Mostrar la radiación solar diaria promedio',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Sin sensor para recopilar datos',\n NoSolarPanelForAnalysis: 'Sin panel solar para el análisis',\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Archivo en la nube',\n Select: 'Seleccionar',\n AddFoundation: 'Añadir base',\n AddWall: 'Añadir pared',\n AddWindow: 'Añadir ventana',\n AddDoor: 'Añadir door',\n AddPyramidRoof: 'Add pyramid roof',\n AddGableRoof: 'Add gable roof',\n AddHipRoof: 'Add hip roof',\n AddGambrelRoof: 'Add gambrel roof',\n AddMansardRoof: 'Add mansard roof',\n AddCuboid: 'Añadir cuboid',\n AddSensor: 'Añadir sensor',\n AddSolarPanel: 'Añadir panel solar',\n AddWaterHeater: 'Add water heater',\n AddParabolicDish: 'Add parabolic dish',\n AddParabolicTrough: 'Add parabolic trough',\n AddFresnelReflector: 'Add Fresnel reflector',\n AddHeliostat: 'Add heliostat',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Añadir árbol',\n AddFlower: 'Add flower',\n AddPeople: 'Añadir gente',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Manipulate a group',\n ClearScene: 'Clear escena',\n ShowSunAndTimeSettings: 'Show sun and time settings',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'Estás seguro que quieres borrar el contenido',\n ClickForMoreButtons: 'Click for more buttons',\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\n SwitchToAddingWall: 'Switch to Adding Wall',\n SwitchToAddingWindow: 'Switch to Adding Window',\n SwitchToAddingDoor: 'Switch to Adding Door',\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\n SwitchToAddingSensor: 'Switch to Adding Sensor',\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Switch to Adding Tree',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Switch to Adding People',\n },\n\n tooltip: {\n gotoIFI: 'Ver Institute for Future Intelligence',\n visitAladdinHomePage: 'Visita la página de Aladdin',\n clickToOpenMenu: 'Haz clic para abrir el menú principal',\n clickToAccessCloudTools: 'Haz clic para acceder a las herramientas en la nube',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Cerezo silvestre',\n Elm: 'Olmo',\n FanPalm: 'Fan Palm',\n Linden: 'Tilo',\n Magnolia: 'Magnolia',\n Maple: 'Arce',\n Oak: 'Roble',\n Pine: 'Pino',\n Spruce: 'Spruce',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Jaah',\n Jack: 'Jack',\n Jacob: 'Jacob',\n Jacqueline: 'Jacqueline',\n Jade: 'Jade',\n Jamelia: 'Jamelia',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Jaya',\n Jaye: 'Jaye',\n Jeanette: 'Jeanette',\n Jedi: 'Jedi',\n Jeff: 'Jeff',\n Jena: 'Jena',\n Jennifer: 'Jennifer',\n Jess: 'Jess',\n Jett: 'Jett',\n Jill: 'Jill',\n Jiya: 'Jiya',\n Joan: 'Joan',\n Jocelyn: 'Jocelyn',\n Joel: 'Joel',\n Joey: 'Joey',\n John: 'John',\n Jonathon: 'Jonathon',\n Jose: 'Jose',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Judd',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Julio',\n Jumapili: 'Jumapili',\n June: 'June',\n Juro: 'Juro',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_tr = {\n translation: {\n name: {\n IFI: 'Yarının Zekası Enstitüsü',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Açıklanabilir Yapay Zeka ile Tasarımı Yeniden Hayal Et — Yarının Zekası Enstitüsü',\n },\n\n cookie: {\n Statement: 'Kabul Ete tıklayarak, iyi bir Aladdin deneyimi için çerez kullanımını kabul etmiş olursunuz.',\n Accept: 'Kabul Et',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Geliştiriciler',\n TermsOfService: 'Hizmet Şartları',\n PrivacyPolicy: 'Gizlilik Politikası',\n Software: 'Yazılım',\n Content: 'İçerik',\n Research: 'Araştırma',\n Support: 'Destek',\n Acknowledgment: 'Onay',\n FundingInformation:\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.\",\n Contact: 'Daha fazla bilgi için lütfen Charles Xie (charles@intofuture.org) ile iletişime geçiniz.',\n Translators: 'Çevirmenler',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Text',\n FontSize: 'Font Size',\n FontColor: 'Font Color',\n Model: 'Model',\n Models: 'Models',\n Upload: 'Upload',\n ClickCount: 'Click Count',\n Share: 'Share',\n AlreadyLike: 'Already like',\n Like: 'Like',\n MustLogInToLike: 'Must log in to like',\n AllRightsReserved: 'Tüm Hakları Saklıdır.',\n MeterAbbreviation: 'm',\n Version: 'Sürüm',\n VersionInitial: 'S',\n Options: 'Seçenekler',\n Maximum: 'Maximum',\n Minimum: 'Minimum',\n MaximumNumber: 'Maksimum Sayı',\n MinimumNumber: 'Minimum Sayı',\n MaximumValue: 'Maksimum Değer',\n MinimumValue: 'Minimum Değer',\n Or: 'Veya',\n None: 'Hiçbiri',\n High: 'Yüksek',\n Partial: 'Kısmi',\n Teacher: 'Öğretmen',\n Class: 'Sınıf',\n Total: 'Toplam',\n Leaderboard: 'Leaderboard',\n Latest: 'Latest',\n Range: 'Aralık',\n SIUnit: 'SI Unit',\n USUnit: 'US Unit',\n ThermalTransmittance: 'Thermal Transmittance',\n ThermalResistance: 'Thermal Resistance',\n UValue: 'U-Value',\n RValue: 'R-Value',\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\n BuildingHVACSystem: 'Building HVAC System',\n ThermostatSetpoint: 'Thermostat Setpoint',\n TemperatureToleranceThreshold: 'Tolerance Threshold',\n TemperatureToleranceThresholdExplanation:\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.',\n Press: 'Tıkla',\n Open: 'Aç',\n Save: 'Kaydet',\n SaveAsImage: 'Resim Olarak Kaydet',\n SaveAsCsv: 'Save as CSV',\n Update: 'Güncelle',\n Paste: 'Yapıştır',\n Copy: 'Kopyala',\n Cut: 'Kes',\n Delete: 'Sil',\n Lock: 'Kilitle',\n Translucent: 'Yarı Saydam',\n Color: 'Renk',\n Texture: 'Doku',\n Size: 'Boyut',\n Thickness: 'Kalınlık',\n Yes: 'Evet',\n No: 'Hayır',\n OK: 'Tamam',\n Cancel: 'İptal',\n Apply: 'Uygula',\n Close: 'Kapat',\n ApplyTo: 'Uygula',\n Run: 'Çalıştır',\n Pause: 'Duraklat',\n Resume: 'Sürdür',\n Clear: 'Temizle',\n Warning: 'Uyarı',\n Caution: 'Caution',\n Reminder: 'Hatırlatıcı',\n Length: 'Uzunluk',\n Width: 'Genişlik',\n Height: 'Yükseklik',\n Radius: 'Yarıçap',\n Angle: 'Açı',\n Azimuth: 'Azimut',\n Coordinates: 'Koordinatlar',\n Weather: 'Hava Durumu',\n Show: 'Göster',\n Animate: 'Oynat',\n Date: 'Tarih',\n Time: 'Saat',\n Title: 'Başlık',\n Owner: 'Sahibi',\n Action: 'Eylem',\n Rename: 'Yeniden Adlandır',\n Location: 'Konum',\n Latitude: 'Enlem',\n Month: 'Ay',\n Day: 'Gün',\n Hour: 'Saat',\n Daylight: 'Gün Işığı',\n Radiation: 'Işınım',\n Temperature: 'Sıcaklık',\n kWh: 'kWh',\n dollar: 'dollar',\n MeterPerSecond: 'm/s',\n NorthInitial: 'N',\n SouthInitial: 'S',\n EastInitial: 'E',\n WestInitial: 'W',\n Fixed: 'Sabit',\n Elements: 'Öğeler',\n Energy: 'Energy',\n Unknown: 'Unknown',\n Label: 'Label',\n Description: 'Description',\n NoDescription: 'No description',\n MaximumCharacters: 'Maximum characters',\n Author: 'Author',\n Publisher: 'Publisher',\n Building: 'Building',\n ResidentialBuilding: 'Residential Building',\n CommercialBuilding: 'Commercial Building',\n SchoolBuilding: 'School Building',\n TouristAttraction: 'Tourist Attraction',\n UnderConstruction: 'Under Construction',\n Photovoltaic: 'Photovoltaic',\n Anonymous: 'Anonymous',\n Nickname: 'Nickname',\n Pin: 'Pin',\n Unpin: 'Unpin',\n },\n\n shared: {\n NoTexture: 'Doku Yok',\n FoundationElement: 'Temel',\n CuboidElement: 'Kübik',\n PolygonElement: 'Poligon',\n SensorElement: 'Sensör',\n SolarPanelElement: 'Güneş Paneli',\n WaterHeaterElement: 'Su Isıtıcı',\n ParabolicDishElement: 'Parabolik Çanak',\n ParabolicTroughElement: 'Parabolik Oluk',\n FresnelReflectorElement: 'Fresnel Reflektör',\n HeliostatElement: 'Heliostat',\n WindTurbineElement: 'Wind Turbine',\n LightElement: 'Light',\n ElementLocked: 'Kilitli',\n ModelType: 'Model Type',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Model not found',\n CannotSignIn: 'Oturum açılamıyor',\n CannotSignOut: 'Çıkış yapılamıyor',\n YourAccountWasCreated: 'Hesabınız oluşturuldu',\n CannotCreateAccount: 'Hesap oluşturulamıyor',\n YourAccountSettingsWereSaved: 'Hesap ayarlarınız kaydedildi.',\n CannotSaveYourAccountSettings: 'Hesap ayarlarınız kaydedilemiyor',\n CannotSaveYourFileToCloud: 'Dosyanız buluta kaydedilemiyor',\n CannotCreateNewProject: 'Cannot create a new project',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Cannot open your projects',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\n CloudFileNotFound: 'Bulut dosyası bulunamadı',\n CannotLoadModelsOnMap: 'Cannot load models on map',\n CannotLoadLeaderboard: 'Cannot load leaderboard',\n CannotPublishModelOnMap: 'Cannot publish model on map',\n CannotLikeModelFromMap: 'Cannot like model from map',\n CannotDeleteModelFromMap: 'Cannot delete model from map',\n ModelDeletedFromMap: 'Model is deleted from map',\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\n CannotOpenCloudFile: 'Bulut dosyası açılamıyor',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Bulut klasörünüz açılamıyor',\n CannotDeleteCloudFile: 'Bulut dosyası silinemiyor',\n CannotRenameCloudFile: 'Bulut dosyası yeniden adlandırılamıyor',\n DoYouWantToSaveChanges: 'Değişiklikleri kaydetmek istiyor musunuz?',\n NotApplicableToSelectedAction: 'Seçili eyleme uygulanamaz',\n ThisElementIsLocked: 'Bu öğe kilitli.',\n ThisCannotBeUndone: 'Geri alınamaz.',\n AzimuthOfNorthIsZero: 'Kuzey yönünün azimut açısı 0 ° derecedir.',\n CounterclockwiseAzimuthIsPositive: 'Saat yönünün tersi yönde azimut açısı pozitiftir.',\n MoveCancelledBecauseOfOverlap: 'Çakışma nedeniyle taşıma iptal edildi.',\n MoveOutsideBoundaryCancelled: 'Alan dışına çıkan taşıma iptal edildi.',\n RotationCancelledBecauseOfOverlap: 'Çakışma nedeniyle döndürme iptal edildi.',\n RotationOutsideBoundaryCancelled: 'Alan dışı döndürme iptal edildi.',\n ResizingCancelledBecauseOfOverlap: 'Çakışma nedeniyle yeniden boyutlandırma iptal edildi.',\n ResizingOutsideBoundaryCancelled: 'Alan dışında yeniden boyutlandırma iptal edildi.',\n CannotPasteOutsideBoundary: 'Alanın dışına yapıştırılamaz.',\n CannotPasteBecauseOfOverlap: 'Çakışma nedeniyle yapıştırılamıyor.',\n CannotMoveObjectTooFar: 'Nesne buraya taşınamaz.',\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Yeni yerleşim düzeni uygulanmadan önce mevcut güneş panelleri kaldırılacaktır.',\n DoYouWantToContinue: 'Devam etmek istiyor musunuz?',\n SolarPanelsCannotIntersectWithGround: 'Güneş panelleri zeminle kesişemez.',\n SolarPanelsCannotOverlapWithOneAnother: 'Güneş panelleri birbiriyle örtüşemez.',\n ScreenshotSaved: 'Ekran görüntüsü kaydedildi.',\n CsvFileSaved: 'A CSV file was saved.',\n SimulationStarted: 'Simülasyon başladı.',\n SimulationCompleted: 'Simülasyon tamamlandı.',\n SimulationAborted: 'Simülasyon iptal edildi.',\n SimulationPaused: 'Simülasyon duraklatıldı.',\n CancelSimulation: 'Simülasyonu iptal et',\n PauseSimulation: 'Simülasyonu duraklat',\n ResumeSimulation: 'Simülasyonu devam ettir',\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\n EvolutionStarted: 'Evrim başladı.',\n EvolutionCompleted: 'Evrim tamamlandı.',\n EvolutionAborted: 'Evrim iptal edildi.',\n EvolutionPaused: 'Evrim duraklatıldı.',\n EncounterEvolutionError: 'Evrim hatasıyla karşılaşıldı.',\n CancelEvolution: 'Evrimi iptal et',\n PauseEvolution: 'Evrimi duraklat',\n ResumeEvolution: 'Evrime devam et',\n ConvergenceThresholdHasBeenReached: 'Yakınsama eşiğine ulaşıldı.',\n MaximumNumberOfGenerationsHasBeenReached: 'Maksimum nesil sayısına ulaşıldı.',\n MaximumNumberOfStepsHasBeenReached: 'Maksimum adım sayısına ulaşıldı.',\n ObjectiveFunctionTypeError: 'Geçerli işlev desteklenmiyor. Lütfen menüden başlatınız.',\n WallsAreNotAtSameHeight: 'Walls are not at same height.',\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\n WallsAreNotConnected: 'Walls are not connected.',\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\n BuildingRoofMissing: 'Building has a missing roof.',\n UnknownErrors: 'Unknown errors.',\n },\n\n menu: {\n AnalysisOptions: 'Analiz Seçenekleri',\n option: {\n GridCellSize: 'Hücre Boyutu',\n SamplingFrequency: 'Örneklem Frekansı',\n TimesPerHour: 'x 1/saat',\n DaysPerYear: 'Gün Sayısı / Yıl',\n },\n mainMenu: 'Ana Menü',\n cloudMenu: 'Bulut Menüsü',\n projectSubMenu: 'Project',\n project: {\n CreateNewProject: 'Create New Project',\n OpenProject: 'Open Project',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'You must log in to create a new project',\n YouMustLogInToOpenProject: 'You must log in to open a project',\n },\n fileSubMenu: 'Dosya',\n file: {\n CreateNewFile: 'Yeni Dosya Oluştur',\n OpenLocalFile: 'Yerel Dosya Aç',\n SaveAsLocalFile: 'Yerel Dosya Olarak Kaydet',\n SavingAbortedMustHaveValidFileName: 'Kaydetme iptal edildi! Geçerli bir dosya adı kullanınız.',\n OpenCloudFile: 'Bulut Dosyası Aç',\n SaveCloudFile: 'Bulut Dosyasını Kaydet',\n SaveAsCloudFile: 'Bulut Dosyası Olarak Kaydet',\n SavingAbortedMustHaveValidTitle: 'Kaydetme iptal edildi! Dosya adı geçersiz!',\n ToSaveYourWorkPleaseSignIn: 'Çalışmanızı kaydetmek için lütfen oturum açınız.',\n TakeScreenshot: 'Ekran görüntüsü al',\n UseCloudFileName: 'Bulut Dosya Adını Kullan',\n PublishOnModelsMap: 'Publish on Models Map',\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\n },\n editSubMenu: 'Düzen',\n edit: {\n Undo: 'Geri Al',\n Redo: 'Yinele',\n },\n viewSubMenu: 'Görünüm',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D',\n ResetView: 'Yenile',\n ZoomIn: 'Yaklaş',\n ZoomOut: 'Uzaklaş',\n AutoRotate: 'Otomatik Döndür',\n ShowShadow: 'Gölge',\n ShowSurfaceShininess: 'Show Surface Shininess',\n TranslucentFloatingWindows: 'Yüzer Pencere',\n accessoriesSubMenu: 'Accessories',\n accessories: {\n SiteInformation: 'Konum Bilgisi',\n DesignInformation: 'Izgara Hücre Sayısı',\n Instruction: 'Yardım',\n StickyNote: 'Notlar',\n Note: 'Notlar',\n },\n },\n settingsSubMenu: 'Settings',\n settings: {\n WeatherData: 'Hava Durumu',\n DiurnalTemperature: 'Günlük Sıcaklık',\n Heliodon: 'Heliodon',\n SunAndTime: 'Güneş & Zaman',\n },\n benchmarksSubMenu: 'Deneysel',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Güneş Işınım Tahmini Vs. Ölçümü ',\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Çizgi Kalınlığı',\n SymbolSize: 'Sembol Boyutu',\n BarCategoryGap: 'Bar Category Gap',\n ShowHorizontalGridLines: 'Yatay Izgara Çizgilerini Göster',\n ShowVerticalGridLines: 'Dikey Izgara Çizgilerini Göster',\n },\n analysisSubMenu: 'Analiz',\n physicsSubMenu: 'Fizik',\n physics: {\n DailySolarRadiationHeatmap: 'Günlük Isı Haritası',\n SolarRadiationHeatmapOptions: 'Isı Haritası Seçenekleri',\n SolarRadiationHeatmapGridCellSize: 'Hücre Boyutu',\n SolarRadiationHeatmapMaxValue: 'Işınım Maksimum Değer',\n SolarRadiationHeatmapNoAnimation: 'Animasyon Yok',\n ReflectionHeatmap: 'Yansıma Isı Haritası',\n },\n sensorSubMenu: 'Sensörler',\n sensor: {\n CollectDailyData: 'Günlük Veri Topla',\n CollectYearlyData: 'Yıllık Veri Topla',\n SensorSimulationNoAnimation: 'Animasyon Yok',\n },\n buildingSubMenu: 'Building',\n building: {\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\n EnergyAnalysisOptions: 'Energy Analysis Options',\n EnergyGridCellSize: 'Energy Grid Cell Size',\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\n },\n solarPanelSubMenu: 'Güneş Panelleri',\n solarPanel: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n AnalyzeVisibility: 'Görünüm Analizi',\n PanelDiscretization: 'Panel Ayrıklaştırma',\n Exact: 'Kesin',\n Approximate: '\tYaklaşık',\n EnergyGridCellSize: 'Hücre Boyutu',\n VisibilityGridCellSize: 'Hücre Boyutu',\n EnergyAnalysisOptions: 'Enerji Analiz Seçenekleri',\n VisibilityAnalysisOptions: 'Görünüm Analiz Seçenekleri',\n SolarPanelSimulationNoAnimation: 'Animasyon Yok',\n },\n parabolicTroughSubMenu: 'Parabolik Oluk',\n parabolicTrough: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n parabolicDishSubMenu: 'Parabolik Çanak',\n parabolicDish: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n fresnelReflectorSubMenu: 'Fresnel Yansıtıcı',\n fresnelReflector: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n heliostatSubMenu: 'Heliostat',\n heliostat: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n },\n solarUpdraftTowerSubMenu: 'Solar Updraft Kulesi',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\n SolarUpdraftTowerSimulationNoAnimation: 'Animasyon Yok',\n },\n\n tutorialsSubMenu: 'Öğrenme Merkezi',\n\n solarEnergyScienceSubMenu: 'Güneş Bilimi',\n solarEnergyScienceTutorials: {\n SunAngles: 'Gözlemciye Göre Güneş Açıları',\n InsolationAndClimate: 'Güneşlenme ve İklim',\n SolarRadiationToBox: 'Kutu Güneş Işınımı',\n },\n\n buildingScienceSubMenu: 'Building Science',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\n },\n\n buildingDesignSubMenu: 'Bina Tasarımı',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Çatı Pencereli Cape Cod Evi',\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\n GableRoofVsHipRoof: 'Beşik Çatı vs. Kırma Çatı',\n ColonialVsSaltbox: 'Koloni vs. Tuz Kutusu',\n GambrelRoofVsMansardRoof: 'Flemenk Çatı vs. Mansart Çatı',\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\n DutchGableRoof: 'Dutch Gable Roof',\n GableAndValleyRoof: 'Gable and Valley Roof',\n ClerestoryRoof: 'Clerestory Roof',\n MonitorRoof: 'Monitor Roof',\n AFrameHouse: 'A-Frame House',\n HalfTimberedHouse: 'Half-Timbered House',\n AllBasicRoofTypes: 'Tüm Çatı Tipleri',\n },\n\n photovoltaicSolarPowerSubMenu: 'Fotovoltaik Güneş Enerjisi',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Güneş Paneli Eğim Açısı Etkisi',\n EffectOfAzimuthOfSolarPanel: 'Güneş Paneli Azimut Açısı Etkisi',\n SolarPanelTypes: 'Solar Panel Types',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Güneş İzleyiciler',\n CoveringGroundWithSolarPanels:\n 'Sadece güneş panellerini kullanarak yüzeyi kaplamak neden iyi bir fikir değildir?',\n InterRowSpacingOfSolarPanelArray: 'Güneş Paneli Dizi Arası Boşluk Etkisi',\n EffectOfOrientationOfSolarPanels: 'Güneş Panelleri Yön Etkisi',\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\n },\n\n concentratedSolarPowerSubMenu: 'Yoğunlaştırılmış Güneş Enerjisi',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Parabolik Oluk Azimut Açısı Etkisi',\n EffectOfLatusRectumOfParabolicTrough: 'Parabolik Oluk Özkiriş Etkisi',\n FocusSunlightWithParabolicDish: 'Güneş Işığını Parabolik Çanakla Odaklama',\n LinearFresnelReflectors: 'Doğrusal Fresnel Reflektörler',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Doğrusal Fresnel Reflektörlerde Soğurucu Boru Yükseklik Etkisi',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Doğrusal Fresnel Reflektörlerde Azimut Açısı Etkisi',\n LinearFresnelReflectorsWithTwoAbsorbers: 'İki Soğuruculu Doğrusal Fresnel Reflektörler',\n CosineEfficiencyOfHeliostats: 'Heliostatların Kosinüs Verimliliği',\n ShadowingAndBlockingOfHeliostats: 'Heliostatlarda Gölgeleme ve Engellenme',\n EffectSolarPowerTowerHeight: 'Güneş Güç Kulesi Yükseklik Etkisi',\n SolarPowerTower: 'Güneş Güç Kulesi',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Diğer Güneş Gücü Türleri',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Solar Updraft Kulesi',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Örnekler',\n\n solarEnergySubMenu: 'Güneş Enerjisi',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Güneş Işını ve Heliodon',\n RooftopSolarPanels: 'Çatı Üstü Güneş Panelleri',\n NevadaSolarOneParabolicTroughArray: 'Nevada Eyaletinde Parabolik Oluk Dizisi',\n TooeleParabolicDishArray: 'Tooele Şehrinde Parabolik Çanak Dizisi',\n PS10SolarPowerTower: 'PS10 Güneş Güç Kulesi',\n TucsonLinearFresnelReflectors: 'Tucson Şehrinde Doğrusal Fresnel Reflektörleri',\n SolarCanopyFormFactors: 'Solar Gölgelik Biçim Etkileri',\n SolarCanopyOverBleachers: 'Tirübün Üzeri Solar Gölgelik',\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\n SolarBusStop: 'Solar Otobüs Durağı',\n SolarFacadeTesla: 'Tesla Solar Façade',\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\n Floatovoltaics: 'Floatovoltaics',\n Agrivoltaics: 'Agrivoltaics',\n VegetativeBuffer: 'Bitkisel Tampon',\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Bakersfield Şehrinde Kanal Üzerindeki Varsayımsal Güneş Panelleri',\n SolarNoiseBarrierLexingtonMA: 'Lexington Kasabasında Varsayımsal Güneş Gürültü Bariyeri',\n HSATSolarTrackersRaleighNC: 'Raleigh Şehrinde Yatay Tek Eksenli İzleyiciler (HSAT)',\n AADATSolarTrackersLancasterCA: 'Lancaster Şehrinde Azimut–İrtifa Çift Eksenli İzleyiciler (AADAT)',\n SolarUpdraftTowerInCity: 'Şehir Solar Updraft Kulesi',\n },\n\n builtEnvironmentSubMenu: 'Yapılı Çevre',\n residentialBuildingsSubMenu: 'Konut inşaatları',\n residentialBuildingExamples: {\n ColonialHouse: 'Colonial House',\n DutchColonialHouse: 'Flemenk Koloni Evi',\n TShapedHouse: 'T-Shaped House',\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\n Solarium: 'Solaryum',\n Church1: 'Kilise 1',\n Cathedral1: 'Cathedral 1',\n Cathedral2: 'Cathedral 2',\n Mosque1: 'Mosque 1',\n AdobeTaosHouse: 'Adobe Taos House',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Bonnet House',\n BarnStyleHouse: 'Çiftlik Evi',\n ModernHouse: 'Modern House',\n ButterflyRoofHouse: 'Butterfly Roof House',\n },\n commercialBuildingsSubMenu: 'Ticari Binalar',\n commercialBuildingExamples: {\n WhiteHouse: 'White House',\n BilimMersinTurkiye: 'Yenişehir Belediyesi Bilim ve Sanat Merkezi',\n SpanishStyleHotel: 'Spanish Style Hotel',\n ApartmentBuilding: 'Apartment Building',\n OfficeBuilding: 'Ofis Binası',\n Hotel: 'Hotel',\n },\n buildingComplexesSubMenu: 'Building Complexes',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'Güney Burlington Lisesi',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\n },\n urbanPlanningSubMenu: 'Şehir Planlaması',\n urbanPlanningExamples: {\n Heatmap1: 'Isı Haritası',\n },\n otherBuildingsSubMenu: 'Other Buildings',\n otherBuildingExamples: {\n Greenhouse: 'Sera',\n Pavilion: 'Park Kamelyası',\n OctagonalPagoda: 'Octagonal Pagoda',\n OceanFront: 'Ocean Front',\n EgyptianPyramids: 'Egyptian Pyramids',\n MayanPyramid: 'Mayan Pyramid',\n SiOSePol: 'Si-o-se-pol',\n StackedCuboids: 'Stacked Cuboids',\n },\n\n artificialIntelligenceSubMenu: 'Yapay Zeka',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Güneş Paneli Sıra Eğim Açısı Optimize Etme',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Çoklu Güneş Paneli Sıra Eğim Açısı Optimize Etme',\n SolarFarmGenerativeDesign: 'Güneş Tarlası Tasarımı',\n SolarFarmGenerativeDesignWithBlock: 'Blok Varlığında Güneş Tarlası Tasarımı',\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Güneş Tarlası Tasarımı',\n },\n\n languageSubMenu: 'Dil',\n publicSubMenu: 'Public',\n ModelsGallery: 'Models Gallery',\n ModelsMap: 'Models Map',\n AboutUs: 'Hakkımızda',\n },\n\n avatarMenu: {\n AccountSettings: 'Hesap Ayarları',\n PrivacyStatementTitle: 'User Privacy Protection Statement',\n PrivacyStatement:\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 ',\n SignIn: 'Kayıt Ol',\n SignOut: 'Oturum Kapat',\n IfYouAreAStudent: 'Eğer Öğrenciyseniz',\n },\n\n skyMenu: {\n Axes: 'Eksenler',\n Theme: 'Tema',\n ThemeDefault: 'Varsayılan',\n ThemeDesert: 'Çöl',\n ThemeDune: 'Dune',\n ThemeForest: 'Orman',\n ThemeGrassland: 'Çayır',\n ThemeHill: 'Hill',\n ThemeLake: 'Lake',\n ThemeMountain: 'Mountain',\n ThemeRural: 'Rural',\n SunlightAttenuationCoefficientInAir: 'Havan Güneş Işığı Zayıflatma Katsayısı',\n ConvectiveCoefficientOfAir: 'Havan Isı İletkenlik Katsayısı',\n HighestTemperatureTimeInMinutes: 'En Yüksek Sıcaklık Süresi (Dakika)',\n SelectSunAnglesToShow: 'Gösterilecek Güneş Açılarını Seçin',\n ShowAzimuthAngle: 'Azimut Açısını Göster',\n ShowElevationAngle: 'Yükselme Açısını Göster',\n ShowZenithAngle: 'Zenit Açısını Göster',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Vegetation',\n LeafOutDay: 'Leaf-Out Day',\n LeafOffDay: 'Leaf-Off Day',\n Albedo: 'Albedo',\n ImageOnGround: 'Yer Görüntüsü',\n WaterSurface: 'Water Surface',\n RemoveAllUnlockedTrees: 'Tüm Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Tüm Kişileri Kaldır',\n RemoveAllUnlockedFoundations: 'Tüm Temelleri Kaldır',\n RemoveAllUnlockedCuboids: 'Tüm Kübikleri Kaldır',\n DoYouReallyWantToRemoveAllPeople: 'Tüm Kişileri Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllTrees: 'Tüm Ağaçları Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Tüm Temelleri Kaldırmak İstiyor Musunuz?',\n DoYouReallyWantToRemoveAllCuboids: 'Tüm Kübikleri Kaldırmak İstiyor Musunuz?',\n LockAllElements: 'Tüm Öğeleri Kilitle',\n UnlockAllElements: 'Tüm Öğelerin Kilidini Aç',\n },\n\n labelSubMenu: {\n Label: 'Etiket',\n LabelText: 'Label Text',\n LabelHeight: 'Label Height',\n LabelSize: 'Label Size',\n LabelFontSize: 'Font Size',\n LabelColor: 'Label Color',\n KeepShowingLabel: 'Etiketi Göstermeye Devam Et',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\n RemoveAllUnlockedParabolicTroughs: 'Tüm Kilitlenmemiş Parabolik Olukları Kaldır',\n RemoveAllUnlockedParabolicDishes: 'Tüm Kilitlenmemiş Parabolik Çanakları Kaldır',\n RemoveAllUnlockedFresnelReflectors: 'Tüm Kilitlenmemiş Fresnel Reflektörleri Kaldır',\n RemoveAllUnlockedHeliostats: 'Tüm Kilitlenmemiş Heliostatları Kaldır',\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n RemoveAllUnlockedWalls: 'Tüm Kilitlenmemiş Duvarları Kaldır',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Çokgenleri Kaldır',\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş İnsanları Kaldır',\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Çerçeveler',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n SolarPanels: 'Güneş Panelleri',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n ' Seçili temel üzerindeki tüm güneş panellerini kaldırmak istiyor musunuz?',\n ParabolicTroughs: 'Parabolik Oluklar',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik olukları kaldırmak istiyor musunuz?',\n ParabolicDishes: 'Parabolik Çanaklar',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik çanakları kaldırmak istiyor musunuz?',\n FresnelReflectors: 'Fresnel Reflektörler',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm Fresnel reflektörlerini kaldırmak istiyor musunuz?',\n Heliostats: 'Heliostatlar',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm heliostatları kaldırmak istiyor musunuz?',\n Sensors: 'Sensörler',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm sensörleri kaldırmak istiyor musunuz?',\n Lights: 'Lights',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Do you really want to remove all the lights on this foundation that are not locked',\n Walls: 'Duvarlar',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm duvarları kaldırmak istiyor musunuz? ',\n Windows: 'Windows',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Do you really want to remove all the windows on this foundation that are not locked',\n Doors: 'Doors',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Do you really want to remove all the doors on this foundation that are not locked',\n Polygons: 'Poligonlar',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm poligonları kaldırmak istiyor musunuz?',\n Humans: 'Kişiler',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm insanları kaldırmak istiyor musunuz?',\n Trees: 'Ağaçlar',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n ' Seçili temel üzerinde kilitli olmayan tüm ağaçları kaldırmak istiyor musunuz?',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Do you really want to remove all the flowers on this foundation that are not locked',\n OnlyThisFoundation: 'Sadece Seçili Temel',\n AllConnectedFoundations: 'Tüm Bağlantılı Temeller',\n AllFoundations: 'Tüm Temeller',\n AddPolygon: 'Poligon Ekle',\n SolarStructure: 'Solar Yapı Seçin',\n GroupMaster: 'Grup Yöneticisi',\n LockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğeleri kilitle',\n UnlockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğelerin kilidini aç',\n GroundFloorRValue: 'Ground Floor R-Value',\n OnlyThisGroundFloor: 'Only This Ground Floor',\n AllGroundFloors: 'All Ground Floors',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Heliostat Alıcı Kulesi',\n ReceiverTowerPhysicalProperties: 'Alıcı Kule Fiziksel Özellikler',\n ReceiverTowerHeight: 'Alıcı Kule Yükseklik',\n ReceiverTowerRadius: 'Alıcı Kule Yarıçap',\n ReceiverAbsorptance: 'Alıcı Absorbsiyon',\n ReceiverOpticalEfficiency: 'Alıcı Optik Verim',\n ReceiverThermalEfficiency: 'Alıcı Termal Verim',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Fresnel Reflektör Soğurucu Boru',\n AbsorberPipePhysicalProperties: 'Soğurucu Boru Fiziksel Özellikler',\n AbsorberHeight: 'Soğurucu Boru Yükseklik',\n AbsorberApertureWidth: 'Soğurucu boru diyafram genişliği',\n AbsorberPipePoleNumber: 'Soğurucu Boru Sayısı',\n AbsorberAbsorptance: 'Soğurucu Absorbsiyonu',\n AbsorberOpticalEfficiency: 'Soğurucu Optik Verimlilik',\n AbsorberThermalEfficiency: 'Soğurucu Isıl Verimlilik',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Solar Updraft Kulesi',\n SolarUpdraftTowerPhysicalProperties: 'Solar Updraft Kulesi Fiziksel Özellikler',\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Kulesi Baca Yüksekliği',\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Kulesi Baca Yarıçapı',\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Kulesi Collector Height',\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Kulesi Kollektör Yarıçapı',\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Kulesi Kollektör Geçirgenliği',\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Kulesi Kollektör Emisivite',\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Kulesi Deşarj Katsayısı',\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Kulesi Türbin Verimliliği',\n },\n\n cuboidMenu: {\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş Kişileri Kaldır',\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\n Racks: 'Çerçeveler',\n SolarPanels: 'Güneş Panelleri',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm güneş panellerini kaldırmak istiyor musunuz?',\n Sensors: 'Sensörler',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm sensörleri kaldırmak istiyor musunuz?',\n Polygons: 'Poligonlar',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm poligonları kaldırmak istiyor musunuz?',\n Humans: 'İnsanlar',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm insanları kaldırmak istiyor musunuz?',\n Trees: 'Ağaçlar',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n ' Seçili kübik üzerinde kilitlenmemiş tüm ağaçları kaldırmak istiyor musunuz?',\n Flowers: 'Flowers',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\n OnlyThisCuboid: 'Sadece Seçili Kübik',\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\n AllCuboids: 'Tüm Kübikler',\n OnlyThisSide: 'Sadece Seçili Yüzey',\n AllSidesOfThisCuboid: 'Seçili Kübik Tüm Yüzeyler',\n AllSidesOfAllCuboids: 'Bütün Kübik Yüzeyleri ',\n AddPolygon: 'Poligon Ekle',\n Stackable: 'Stackable',\n GroupMaster: 'Group Master',\n },\n\n polygonMenu: {\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n TextBox: 'Text Box',\n FontOutlineColor: 'Font Outline Color',\n FontOutlineWidth: 'Font Outline Width',\n FontStrokeColor: 'Font Stroke Color',\n FontStrokeWidth: 'Font Stroke Width',\n NoOutline: 'No Outline',\n Shiny: 'Shiny',\n Filled: 'Dolgu',\n FillTexture: 'Dolgu Dokusu',\n FillColor: 'Dolgu Rengi',\n Opacity: 'Opaklık',\n LineColor: 'Çizgi Rengi',\n LineWidth: 'Çizgi Kalınlığı',\n LineStyle: 'Çizgi Stili',\n SolidLine: 'Düz çizgi',\n DashedLine: 'Kesik çizgi',\n DottedLine: 'Noktalı çizgi',\n InsertVertexBeforeIndex: 'İndeksten Önce Tepe Noktası Ekle',\n InsertVertexAfterIndex: 'İndeksten Sonra Tepe Noktası Ekle',\n DeleteVertex: 'Tepe Noktası Sil',\n OnlyThisPolygon: 'Sadece Seçili Poligon',\n AllPolygonsOnSurface: 'Tüm Poligonlar Aynı Yüzeyde',\n AllPolygonsAboveFoundation: 'Temel Üzerindeki Tüm Poligonlar',\n AllPolygons: 'Tüm Poligonlar',\n Layout: 'Düzen',\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\n SolarPanelArrayLayoutParametricDesign: 'Güneş Paneli Dizi Düzeni: Parametrik Tasarım',\n SolarPanelArrayLayoutGenerativeDesign: 'Güneş Paneli Dizi Düzeni: Üretici Tasarım',\n SolarPanelArrayModel: 'Güneş Paneli Modeli',\n SolarPanelArrayOrientation: 'Oryantasyon',\n SolarPanelArrayTiltAngle: 'Eğim Açısı',\n SolarPanelArrayRowWidth: 'Dizi Sıra Genişliği',\n SolarPanelArrayInterRowSpacing: 'Dizi Sıra Arası Boşluk',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Dizi Sıra Ekseni',\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\n SolarPanelArrayEastWestRowAxis: 'Doğu-Batı (Absolute)',\n SolarPanelArrayNorthSouthRowAxis: 'Kuzey-Güney (Absolute)',\n SolarPanelArrayMargin: 'Margin',\n SolarPanelArrayPoleHeight: 'Direk Yükseklik',\n SolarPanelArrayPoleSpacing: 'Direk Aralık',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'Bu yerleşim düzeni uygulanamaz. Lütfen parametrelerinizi kontrol edin.',\n },\n\n optimizationMenu: {\n Optimization: 'Optimizasyon',\n Parameters: 'Parametreler',\n Variables: 'Değişkenler',\n Constants: 'Sabitler',\n GeneticAlgorithm: 'Genetik Algoritma',\n GeneticAlgorithmSettings: 'Genetik Algoritma Ayarı',\n ParticleSwarmOptimization: 'Parçacık Sürü Optimizasyon',\n ParticleSwarmOptimizationSettings: 'Parçacık Sürü Optimizasyon Ayarı',\n SolarPanelTiltAngleOptimization: 'Güneş Paneli Eğim Açısı Optimizasyonu',\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\n Generation: 'Nesil',\n Gene: 'Gen',\n NormalizedVariables: 'Normalleştirilmiş Değişkenler',\n Objective: 'Amaç',\n ObjectiveFunctionDailyTotalYield: 'Günlük Toplam Üretim',\n ObjectiveFunctionYearlyTotalYield: 'Yıllık Toplam Üretim',\n ObjectiveFunctionDailyMeanYield: 'Günlük Ortalama Üretim',\n ObjectiveFunctionYearlyMeanYield: 'Yıllık Ortalama Üretim',\n ObjectiveFunctionDailyProfit: 'Günlük Kazanç',\n ObjectiveFunctionYearlyProfit: 'Yıllık Kazanç',\n GeneticAlgorithmSelectionMethod: 'Genetik Algoritma Seçim Yöntemi',\n RouletteWheel: 'Rulet Çarkı',\n Tournament: 'Turnuva',\n SearchMethod: 'Arama Yöntemi',\n GlobalSearchUniformSelection: 'Küresel Arama Standart Seçim',\n LocalSearchRandomOptimization: 'Yerel Arama Rastgele Optimizasyon',\n PopulationSize: 'Popülasyon Boyutu',\n MaximumGenerations: 'Maksimum Nesil',\n SelectionRate: 'Seçim Oranı',\n CrossoverRate: 'Geçiş Oranı',\n MutationRate: 'Mutasyon Oranı',\n Step: 'Adım',\n SwarmSize: 'Sürü Boyutu',\n MaximumSteps: 'Maksimum Adım',\n MaximumVelocity: 'Maksimum Hız',\n InertiaWeight: 'Atalet Ağırlığı',\n CognitiveCoefficient: 'Bilişsel Katsayı',\n SocialCoefficient: 'Sosyal Katsayı',\n ConvergenceThreshold: 'Sonlandırma için Yakınsama Eşiği',\n LocalSearchRadius: 'Yerel Arama Yarıçapı',\n RowsPerRackRange: 'Raf Başına Sıra Aralığı',\n TiltAngleRange: 'Eğim Açısı Aralığı',\n InterRowSpacingRange: 'Sıra Arası Aralık Ranjı',\n ClickTargetPolygonToActivate: 'Etkinleştirmek için Hedef Poligona Tıklayınız',\n ClickTargetFoundationToActivate: 'Etkinleştirmek için Hedef Temele Tıklayınız',\n },\n\n treeMenu: {\n ShowModel: 'Modeli Göster',\n Flip: 'Flip',\n Type: 'Tür',\n Spread: 'Yayılım',\n },\n\n flowerMenu: {\n Flip: 'Flip',\n Type: 'Type',\n Spread: 'Spread',\n },\n\n peopleMenu: {\n ChangePerson: 'Kişi Değiştir',\n Flip: 'Flip',\n Observer: 'Gözlemci',\n ViewFromThisPerson: ' Seçili Kişiye Göre Perspektif',\n },\n\n lightMenu: {\n Color: 'Color',\n Intensity: 'Intensity',\n Decay: 'Decay',\n MaximumDistance: 'Distance',\n Inside: 'Inside',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Göreceli Azimut Açısı',\n Pole: 'Pole',\n PoleHeight: 'Direk Yüksekliği',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Ekstra Direk Yüksekliği',\n ExtraPoleHeightInAdditionToHalfWidth: 'Yarım Genişliğe Ek Ekstra Direk Yüksekliği',\n DrawSunBeam: 'Güneş Işını Çiz',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Reflektör Yansıma',\n ReceiverAbsorptance: 'Alıcı Absorbsiyonu',\n ReflectorOpticalEfficiency: 'Reflektör Optik Verimliliği',\n ReceiverThermalEfficiency: 'Alıcı Termal Verimliliği',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'PV Modelini Değiştir',\n Orientation: 'Oryantasyon',\n Portrait: 'Portre',\n Landscape: 'Peyzaj',\n FrameColor: 'Frame Color',\n Panels: 'Paneller',\n PanelsWide: 'Panel Genişliği',\n PanelsLong: 'Panel Uzunluğu',\n TiltAngle: 'Eğim Açısı',\n SouthFacingIsPositive: 'Güney yönünde açı pozitiftir.',\n Tracker: 'İzleyici',\n SolarTrackerFollowsSun: 'Güneş paneli verimini artırmak için bir güneş izleme sistemi güneşi sürekli takip eder.',\n PoleSpacing: 'Direk Aralığı',\n NoTracker: 'İzleme Sistemi Yok',\n HorizontalSingleAxisTracker: 'Yatay Tek Eksenli İzleme Sistemi',\n VerticalSingleAxisTracker: 'Dikey Tek Eksenli İzleme Sistemi',\n AltazimuthDualAxisTracker: 'Altazimut Çift Eksenli İzleme Sistemi',\n OnlyThisSolarPanel: 'Sadece Seçili Güneş Paneli',\n AllSolarPanelsOnSurface: 'Tüm Güneş Panelleri Aynı Yüzeyde',\n AllSolarPanelsAboveFoundation: 'Tüm Güneş Panelleri Aynı Temel Üzerinde',\n AllSolarPanels: 'Tüm Güneş Panelleri',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Güneş Paneli Özellikleri',\n Model: 'Model',\n PanelSize: 'Panel Boyutu',\n Cells: 'Hücreler',\n CellType: 'Hücre Tipi',\n Monocrystalline: 'Monokristal',\n Polycrystalline: 'Polikristal',\n ThinFilm: 'İnce Katman',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Siyah',\n Blue: 'Mavi',\n ShadeTolerance: 'Gölge Toleransı',\n SolarCellEfficiency: 'Güneş Pili Verimliliği',\n NominalOperatingCellTemperature: 'Nominal Çalışma Hücresi Sıcaklığı',\n TemperatureCoefficientOfPmax: 'Pmax Sıcaklık Katsayısı',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Modül Uzunluğu',\n Modules: 'Modüller',\n ModulesLong: 'Modüllerin Uzunluğu',\n LatusRectum: 'Özkiriş',\n OnlyThisParabolicTrough: 'Sadece Seçili Parabolik Oluk',\n AllParabolicTroughsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Parabolik Oluklar',\n AllParabolicTroughs: 'Tüm Parabolik Oluklar',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Soğurucu Boru',\n SelectAbsorberToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Soğurucuyu Seçin',\n ModuleLength: 'Modül Uzunluğu',\n Modules: 'Modüller',\n ModulesLong: 'Modüllerin Uzunluğu',\n OnlyThisFresnelReflector: 'Sadece Seçili Fresnel Reflektör',\n AllFresnelReflectorsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Fresnel Reflektörler',\n AllFresnelReflectors: 'Tüm Fresnel Reflektörler',\n },\n\n heliostatMenu: {\n Tower: 'Kule',\n SelectTowerToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Kuleyi Seçin',\n OnlyThisHeliostat: 'Sadece Seçili Heliostat',\n AllHeliostatsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Heliostatlar',\n AllHeliostats: 'Tüm Heliostatlar',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Alıcı Yapısı',\n CentralPole: 'Merkez Direk',\n CentralPoleWithTripod: 'Tripodlu Merkez Direk',\n Quadrupod: 'Dört Ayaklı',\n RimDiameter: 'Kasnak Çapı',\n LatusRectum: 'Özkiriş',\n ExtraPoleHeightInAdditionToRadius: 'Yarıçapa Ek Olarak Ekstra Direk Yüksekliği',\n OnlyThisParabolicDish: 'Sadece Seçili Parabolik Çanak',\n AllParabolicDishesAboveFoundation: 'Aynı Temel Üzerindeki Tüm Parabolik Çanaklar',\n AllParabolicDishes: 'Tüm Parabolik Çanaklar',\n },\n\n wallMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n SizeOfWall: 'Duvar Boyutu',\n OnlyThisWall: 'Sadece Seçili Duvar',\n AllConnectedWalls: 'All Connected Walls',\n AllWallsAboveFoundation: ' Aynı Temel Üzerindeki Tüm Duvarlar',\n AllWalls: 'Tüm Duvarlar',\n Windows: 'Pencereler',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Kilitlenmemiş Tüm Pencereleri Kaldır',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: ' Seçili duvardaki tüm pencereleri kaldırmak istiyor musunuz?',\n Doors: 'Kapılar',\n RemoveAllUnlockedDoors: 'Tüm Kilitlenmemiş Kapıları Kaldır',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: ' Seçili duvardaki tüm kapıları kaldırmak istiyor musun?',\n SolarPanels: 'Güneş Panelleri',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Kilitlenmemiş Tüm Güneş Panellerini Kaldır',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:\n ' Seçili duvardaki tüm güneş panellerini kaldırmak istiyor musunuz?',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\n LockAllPolygons: 'Lock All Polygons',\n UnlockAllPolygons: 'Unlock All Polygons',\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\n WallStructure: 'Duvar Yapısı',\n DefaultStructure: 'Varsayılan',\n StudStructure: 'Ahşap Dikme',\n PillarStructure: 'Pillar',\n Opacity: 'Opaklık',\n StructureSpacing: 'Structure Spacing',\n StructureWidth: 'Structure Width',\n StructureThickness: 'Structure Thickness',\n StructureColor: 'Structure Color',\n Color: 'Wall Color',\n Height: 'Height',\n Thickness: 'Thickness',\n Texture: 'Texture',\n AllLightsOnWallInside: 'All Lights on Wall Inside',\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\n Fill: 'Fill',\n Full: 'Full',\n Partial: 'Partial',\n Empty: 'Empty',\n OpenToOutside: 'Open to Outside',\n EavesLength: 'Eaves Overhang Length',\n Parapet: 'Parapet',\n ParapetColor: 'Parapet Color',\n ParapetTexture: 'Parapet Texture',\n ParapetHeight: 'Parapet Height',\n CopingsHeight: 'Copings Height',\n CopingsWidth: 'Copings Width',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Sadece Bu Pencere',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Pencereler',\n AllWindows: 'Tüm Pencereler',\n Width: 'Genişlik',\n Height: 'Yükseklik',\n Mullion: 'Tiriz',\n MullionWidth: 'Tiriz Genişliği',\n MullionSpacing: 'Tiriz Aralığı',\n MullionColor: 'Mullion Color',\n Tint: 'Ton',\n Opacity: 'Opaklık',\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\n Shutter: 'Kepenk',\n LeftShutter: 'Sol Kepenk',\n RightShutter: 'Sağ Kepenk',\n BothShutters: 'Kepenkler',\n ShutterWidth: 'Genişlik',\n ShutterColor: 'Kepenk Rengi',\n Frame: 'Frame',\n FrameWidth: 'Frame Width',\n SillWidth: 'Sill Width',\n Color: 'Frame Color',\n WindowType: 'Window Type',\n Default: 'Default',\n Arched: 'Arched',\n Polygonal: 'Polygonal',\n Interior: 'Interior',\n Empty: 'Empty',\n },\n\n roofMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n OnlyThisRoof: 'Sadece Seçili Çatı',\n AllRoofsAboveFoundation: 'Aynı Temelin Üzerinde Tüm Çatılar',\n AllRoofs: 'Tüm Çatılar',\n OnlyThisCeiling: 'Only This Ceiling',\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\n AllCeilings: 'All Ceilings',\n EavesOverhangLength: 'Eaves Overhang Length',\n RafterSpacing: 'Mertek Aralığı',\n RafterWidth: 'Mertek Genişliği',\n RafterThickness: 'Mertek Kalınlığı',\n RafterColor: 'Mertek Rengi',\n RoofColor: 'Çatı Rengi',\n RoofSideColor: 'Roof Side Color',\n GlassTint: 'Cam Tonu',\n Opacity: 'Opaklık',\n RoofStructure: 'Çatı Yapısı',\n DefaultStructure: 'Varsayılan',\n RafterStructure: 'Mertek',\n GlassStructure: 'Cam',\n SolarPanels: 'Solar Panels',\n LockAllSolarPanels: 'Lock All Solar Panels',\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\n Windows: 'Windows',\n LockAllWindows: 'Lock All Windows',\n UnlockAllWindows: 'Unlock All Windows',\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\n Sensors: 'Sensors',\n LockAllSensors: 'Lock All Sensors',\n UnlockAllSensors: 'Unlock All Sensors',\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\n Lights: 'Lights',\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\n Rise: 'Rise',\n Ceiling: 'Ceiling',\n RoofRValue: 'Roof R-Value',\n CeilingRValue: 'Ceiling R-Value',\n },\n\n doorMenu: {\n TextureDefault: 'Varsayılan',\n Texture01: 'Doku 1',\n Texture02: 'Doku 2',\n Texture03: 'Doku 3',\n Texture04: 'Doku 4',\n Texture05: 'Doku 5',\n Texture06: 'Doku 6',\n Texture07: 'Doku 7',\n Texture08: 'Doku 8',\n Texture09: 'Doku 9',\n Texture10: 'Doku 10',\n Texture11: 'Doku 11',\n Texture12: 'Doku 12',\n Texture13: 'Doku 13',\n Texture14: 'Doku 14',\n Texture15: 'Doku 15',\n Texture16: 'Doku 16',\n Texture17: 'Doku 17',\n OnlyThisDoor: 'Sadece Seçili Kapı',\n AllDoorsOnWall: 'Aynı Duvardaki Tüm Kapılar',\n AllDoorsAboveFoundation: 'Aynı Temelin Üstündeki Tüm Kapılar',\n AllDoors: 'Tüm Kapılar',\n DoorType: 'Door Type',\n Default: 'Default',\n Arched: 'Arched',\n Filled: 'Filled',\n FrameColor: 'Frame Color',\n Interior: 'Interior',\n },\n\n siteInfoPanel: {\n High: 'Yüksek',\n Low: 'Düşük',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Seçilen heliostat sayısı',\n NumberOfSelectedSolarPanels: 'Seçilen güneş paneli sayısı',\n ElectricityGeneratedDailyBySolarPanels: 'Güneş panellerinin günlük elektrik üretimi',\n SceneDiameter: 'Scene diameter',\n BuildingArea: 'Building area',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Renk Kontrastı',\n FluxScale: 'Flux Scale',\n ClickUpOrDownArrowButtonsToChange: 'Değiştirmek için yukarı veya aşağı ok butonlarına tıklayınız',\n },\n\n instructionPanel: {\n Rotate: 'Döndürme',\n DragMouse: 'Sol Tık + Sürükle',\n Zoom: 'Yakınlaştırma',\n MouseWheelOrKeys: 'Tekerlek veya Ctrl+[ veya Ctrl+]',\n MouseWheelOrKeysMac: 'Tekerlek veya ⌘+[ veya ⌘+]',\n Pan: 'Ekran Kaydırma',\n HoldCtrlDragMouse: 'Ctrl + Sürükle',\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Yeniden Başlat',\n AutoRotate: 'Otomatik Döndürme',\n StartOrStop: 'Başlat veya Durdur (F4)',\n },\n\n mapPanel: {\n ImageOnGround: 'Yüzey Görünümü',\n WeatherStations: 'Referans',\n WeatherStationsNote: 'Turn this off to speed up',\n Coordinates: 'Koordinatlar',\n Zoom: 'Büyüt',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Güneş Paneli Görünüm',\n Observer: 'Gözlemci',\n VantagePoint: 'Referans Noktası',\n ItemizedVisibilityByFields: 'Alana Özel Perspektif',\n TotalVisibility: 'Toplam',\n },\n\n sensorPanel: {\n LightSensor: 'Işık Sensörü',\n WeatherDataFrom: 'Hava Durumu',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Daily Building Energy',\n YearlyBuildingEnergy: 'Yearly Building Energy',\n Heater: 'Heater',\n AC: 'AC',\n SolarPanel: 'Solar Panel',\n Net: 'Net',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Güneş Paneli Günlük Üretim',\n SolarPanelYearlyYield: 'Güneş Paneli Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualSolarPanels: 'Herbir güneş panelinin üretimini göster',\n Profit: 'Kazanç',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Parabolik Oluk Günlük Üretim',\n ParabolicTroughYearlyYield: 'Parabolik Oluk Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualParabolicTroughs: 'Herbir parabolik oluğun üretimini göster',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Parabolik Çanak Günlük Üretim',\n ParabolicDishYearlyYield: 'Parabolik Çanak Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualParabolicDishes: 'Herbir parabolik çanağın üretimini göster',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Fresnel Reflektör Günlük Üretim',\n FresnelReflectorYearlyYield: 'Fresnel Reflektör Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualFresnelReflectors: 'Herbir Fresnel yansıtıcısının üretimini göster',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Heliostat Günlük Üretim',\n HeliostatYearlyYield: 'Heliostat Yıllık Üretim',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualHeliostats: 'Herbir heliostatın üretimini göster',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Solar Updraft Kulesi Günlük Üretimi',\n UpdraftTowerYearlyYield: 'Solar Updraft Kulesi Yıllık Üretimi',\n ChimneyAirTemperature: 'Baca Hava Sıcaklığı',\n ChimneyWindSpeed: 'Baca Rüzgar Hızı',\n Yield: 'Üretim',\n YieldPerHour: 'Saatlik Üretim',\n DailyTotal: 'Günlük Toplam',\n YearlyTotal: 'Yıllık Toplam',\n ShowOutputsOfIndividualUpdraftTowers: 'Herbir updraft kulesinin üretimini göster',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Güneş & Saat Ayarları',\n SunAngles: 'Açılar',\n TwentyFourHours: '24 Hours',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Search by title',\n MyLikes: 'My Likes',\n MyCloudFiles: 'Bulut Dosyalarım',\n GenerateLink: 'Link Oluştur',\n LinkGeneratedInClipBoard: 'Klip Panosunda Oluşturulan Link',\n DoYouReallyWantToDelete: 'Gerçekten silmek istiyor musun?',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'If this file has been shared or published, renaming it breaks existing links',\n },\n\n projectListPanel: {\n SearchByTitle: 'Search by title',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Type',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Hesap Ayarlarım',\n MyID: 'Bilgilerim',\n ClickToCopyMyID: 'Bilgilerinizi kopyalamak için tıklayın',\n IDInClipBoard: 'Kişisel bilgileriniz kopyalandı ve yapıştırmaya hazır.',\n StoreMyNameInMyFilesWhenSaving: 'Kaydederken, adımı dosyalarıma ekle',\n DoYouReallyWantToShowYourNameInYourFiles: 'Dosyalarınızda isminizin gösterilmesini istiyor musunuz?',\n SignFileDisclaimer: 'Evet ise, isiminiz dosyalarınıza erişimi olan bütün kişiler tarafından görülebilir.',\n Likes: 'Likes',\n AllPublished: 'All Published',\n PublishedUnderAliases: 'Aliases',\n UserCount: 'Kullanıcı Sayısı',\n SchoolID: 'Okul',\n ClassID: 'Sınıf',\n },\n\n weatherPanel: {\n SunshineHours: 'Gündüz Saatleri',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Model Seç',\n Sinusoidal: 'Sinüzoidal',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Ekonomik Parametreler',\n ElectricitySellingPrice: 'Elektrik Satış Fiyatı',\n OperationalCostPerUnit: 'Birim Başına İşletme Maliyeti',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Gökyüzü Açıklığı',\n ShowDaylightResults: 'Gün Işığı Sonuçlarını Göster',\n ShowSkyClearnessResults: 'Gökyüzü Açıklığı Sonuçlarını Göster',\n ShowAverageDailySolarRadiation: 'Günlük ortalama güneş Işınımını göster',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Veri toplamak için sensör yok.',\n NoSolarPanelForAnalysis: 'Analiz için güneş paneli yok.',\n NoObserverForVisibilityAnalysis: 'Görünürlük analizi için gözlemci yok.',\n NoWaterHeaterForAnalysis: 'Analiz için su ısıtıcısı yok',\n NoParabolicDishForAnalysis: 'Analiz için parabolik çanak yok',\n NoParabolicTroughForAnalysis: 'Analiz için parabolik oluk yok.',\n NoFresnelReflectorForAnalysis: 'Analiz için Fresnel reflektörü yok.',\n NoHeliostatForAnalysis: 'Analiz için heliostat yok.',\n NoSolarUpdraftTowerForAnalysis: 'Analiz için Solar Updraft Kulesi yok.',\n NoBuildingForAnalysis: 'There is no building for analysis.',\n },\n\n toolbar: {\n CloudFile: 'Bulut Dosyası',\n Select: 'Seç',\n AddFoundation: 'Temel Ekle',\n AddWall: 'Duvar Ekle',\n AddWindow: 'Pencere Ekle',\n AddDoor: 'Kapı Ekle',\n AddPyramidRoof: 'Piramit Çatı Ekle',\n AddGableRoof: 'Beşik Çatı Ekle',\n AddHipRoof: 'Kırma Çatı Ekle',\n AddGambrelRoof: 'Flemenk Çatı Ekle',\n AddMansardRoof: 'Mansart Çatı Ekle',\n AddCuboid: 'Kübik Ekle',\n AddSensor: 'Sensör Ekle',\n AddSolarPanel: 'Güneş Paneli Ekle',\n AddWaterHeater: 'Su Isıtıcı Ekle',\n AddParabolicDish: 'Parabolik Çanak Ekle',\n AddParabolicTrough: 'Parabolik Oluk Ekle',\n AddFresnelReflector: 'Fresnel Reflektörü Ekle',\n AddHeliostat: 'Heliostat Ekle',\n AddWindTurbine: 'Add wind turbine',\n AddLight: 'Add light',\n AddTree: 'Ağaç Ekle',\n AddFlower: 'Add flower',\n AddPeople: 'İnsan Ekle',\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\n ManipulateGroup: 'Ölçeklendirme',\n ClearScene: 'Herşeyi Sil',\n ShowSunAndTimeSettings: 'Güneş & Zaman Ayarlarını Göster',\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\n DoYouReallyWantToClearContent: 'İçeriği silmek istiyor musunuz',\n ClickForMoreButtons: 'Daha fazla buton için tıklayın',\n SwitchToAddingFoundation: 'Temel Ekle ',\n SwitchToAddingCuboid: 'Kübik Ekle ',\n SwitchToAddingWall: 'Duvar Ekle',\n SwitchToAddingWindow: \"Pencere Eklemeyi'Aç\",\n SwitchToAddingDoor: 'Kapı Ekle',\n SwitchToAddingPyramidRoof: 'Piramit Çatı Ekle',\n SwitchToAddingGableRoof: 'Beşik Çatı Ekle',\n SwitchToAddingHipRoof: 'Kırma Çatı Ekle',\n SwitchToAddingGambrelRoof: 'Flemenk Çatı Ekle',\n SwitchToAddingMansardRoof: 'Mansart Çatı Ekle',\n SwitchToAddingSolarPanel: 'Güneş Paneli Ekle',\n SwitchToAddingSensor: 'Sensör Ekle',\n SwitchToAddingWaterHeater: 'Su Isıtıcı Ekle',\n SwitchToAddingParabolicDish: 'Parabolik Çanak Ekle',\n SwitchToAddingParabolicTrough: 'Parabolik Oluk Ekle',\n SwitchToAddingFresnelReflector: 'Fresnel Reflektör Ekle',\n SwitchToAddingHeliostat: 'Heliostat Ekle',\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\n SwitchToAddingLight: 'Switch to Adding Light',\n SwitchToAddingTree: 'Ağaç Ekle',\n SwitchToAddingFlower: 'Switch to Adding Flower',\n SwitchToAddingPeople: 'Kişi Ekle',\n },\n\n tooltip: {\n gotoIFI: 'Yarının Zekası Enstitüsüne Git',\n visitAladdinHomePage: 'Aladdin Ana Sayfasını Ziyaret Edin',\n clickToOpenMenu: 'Ana Menüyü Açmak İçin Tıklayınız',\n clickToAccessCloudTools: 'Bulut Araçlarına Erişmek İçin Tıklayınız',\n },\n\n tree: {\n Apple: 'Apple',\n Birch: 'Birch',\n Coconut: 'Coconut',\n Dogwood: 'Kızılcık Ağacı',\n Elm: 'Karaağaç',\n FanPalm: 'Fan Palm',\n Linden: 'Ihlamur Ağacı',\n Magnolia: 'Magnolia',\n Maple: 'Akçaağaç',\n Oak: 'Meşe Ağacı',\n Pine: 'Çam',\n Spruce: 'Alaçam',\n },\n\n flower: {\n Bellflower: 'Bellflower',\n Boxwood: 'Boxwood',\n CactusCombo1: 'Cactus Combo 1',\n CactusCombo2: 'Cactus Combo 2',\n CactusCombo3: 'Cactus Combo 3',\n CactusCombo4: 'Cactus Combo 4',\n Hibiscus: 'Hibiscus',\n Hosta: 'Hosta',\n Hydrangea: 'Hydrangea',\n Peony: 'Peony',\n RedRose: 'Red Rose',\n Spirea: 'Spirea',\n Sunflower: 'Sunflower',\n TallBush: 'Tall Bush',\n Tulip: 'Tulip',\n WhiteFlower: 'White Flower',\n YellowFlower: 'Yellow Flower',\n },\n\n people: {\n Jaah: 'Ata',\n Jack: 'Mete',\n Jacob: 'Jacob',\n Jacqueline: 'Beril',\n Jade: 'Ece',\n Jamelia: 'Bilge',\n James: 'James',\n Jane: 'Jane',\n Jaya: 'Asya',\n Jaye: 'Aylin',\n Jeanette: 'Jeanette',\n Jedi: 'Alp',\n Jeff: 'Kaya',\n Jena: 'Nehir',\n Jennifer: 'Defne',\n Jess: 'Zeynep',\n Jett: 'Umut',\n Jill: 'Jill',\n Jiya: 'Elif',\n Joan: 'Ezgi',\n Jocelyn: 'Jocelyn',\n Joel: 'Cenk',\n Joey: 'Azra',\n John: 'Can',\n Jonathon: 'Jonathon',\n Jose: 'Mert',\n Joseph: 'Joseph',\n Joshua: 'Joshua',\n Judd: 'Ozan',\n Judy: 'Judy',\n Julia: 'Julia',\n Julio: 'Bulut',\n Jumapili: 'Umay',\n June: 'Naz',\n Juro: 'Efe',\n Justin: 'Justin',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Search by publisher',\n SearchByLabel: 'Search by label',\n MyPublishedModels: 'My Published Models',\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\n SortFromOldestToNewest: 'Sort from oldest to newest',\n SortFromNewestToOldest: 'Sort from newest to oldest',\n ModelsFoundOnThisSite: 'models found on this site',\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nexport const i18n_ua = {\n translation: {\n name: {\n IFI: 'Інститут Інтелекту Майбутнього',\n Aladdin: 'Aladdin',\n Tagline: 'Aladdin: Переосмислення Дизайну з Пояснювальним Штучним Інтелектом - Інститут Інтелекту Майбутнього',\n },\n\n cookie: {\n Statement:\n 'Натиснувши «Прийняти», ви погоджуєтеся з використанням файлів cookie для покращення вашого досвіду з Aladdin.',\n Accept: 'Прийняти',\n },\n\n aboutUs: {\n ProductBroughtToYouBy: 'Цей Продукт Було Створено:',\n TermsOfService: 'Умови Використання',\n PrivacyPolicy: 'Політика Конфіденційності',\n Software: 'Програмне Забезпечення',\n Content: 'Матеріали',\n Research: 'Дослідження',\n Support: 'Підтримка',\n Acknowledgment: 'Подяка',\n FundingInformation:\n 'Національний Науковий Фонд (ННФ, Cполучені Штати Америки) надав фінансову підтримку для дослідження та розробки цього продукту за допомогою грантів №2105695, №2131097, та №#2301164. Однак, будь-які погляди, результати та висновки, висловлені у продукті, належать авторам і можуть не повністю відображати погляди ННФ.',\n Contact: 'Для отримання додаткової інформації, будь ласка, зверніться до Charles Xie (charles@intofuture.org).',\n Translators: 'Переклад',\n },\n\n word: {\n LastUpdate: 'Last Update',\n Small: 'Small',\n Medium: 'Medium',\n Large: 'Large',\n Design: 'Design',\n Information: 'Information',\n Type: 'Type',\n Text: 'Текст',\n FontSize: 'Розмір Шрифту',\n FontColor: 'Колір Шрифту',\n Model: ' Модель',\n Models: 'Моделі',\n Upload: 'Завантажити',\n ClickCount: 'Натисніть Підрахувати',\n Share: 'Поділитись',\n AlreadyLike: 'Вподобано',\n Like: 'Вподобати',\n MustLogInToLike: 'Потрібно Увійти, щоб Вподобати',\n AllRightsReserved: 'Усі Права Захищено',\n MeterAbbreviation: 'м',\n Version: 'Версія',\n VersionInitial: 'В',\n Options: 'Опції',\n Maximum: 'Максимум',\n Minimum: 'Мінімум',\n MaximumNumber: 'Максимальне Число',\n MinimumNumber: 'Мінімальне Число',\n MaximumValue: 'Максимальне Значення',\n MinimumValue: 'Мінімальне Значення',\n Or: 'Або',\n None: 'Жоден',\n High: 'Високий',\n Partial: 'Частковий',\n Teacher: 'Вчитель',\n Class: 'Клас',\n Total: 'Всього',\n Leaderboard: 'Таблиця Лідерів',\n Latest: 'Останнє',\n Range: 'Діапазон',\n SIUnit: 'SI Одиниця',\n USUnit: 'US Одиниця',\n ThermalTransmittance: 'Теплопередача',\n ThermalResistance: 'Термічний Опір',\n UValue: 'U-Значення',\n RValue: 'R-Значення',\n VolumetricHeatCapacity: \"Об'ємна Теплоємність\",\n BuildingHVACSystem: 'Побудова Системи Опалення, Вентиляції та Кондиціювання Повітря (ОВК)',\n ThermostatSetpoint: 'Задана Температура Термостата',\n TemperatureToleranceThreshold: 'Порогове Значення Допустимого Відхилення Температури',\n TemperatureToleranceThresholdExplanation:\n 'Обігрівач не працюватиме, якщо найнижча зовнішня температура дня вища за значення отриманe, якщо від заданої температури відняти порогове значення. Кондиціонер не працюватиме, якщо найвища зовнішня температура дня нижча за значення отримане, якщо від заданої температури відняти порогове значення.',\n Press: 'Натиснути',\n Open: 'Відкрити',\n Save: 'Зберегти',\n SaveAsImage: 'Зберегти як Зображення',\n SaveAsCsv: 'Зберегти як CSV',\n Update: 'Оновити',\n Paste: 'Вставити',\n Copy: 'Копіювати',\n Cut: 'Вирізати',\n Delete: 'Видалити',\n Lock: 'Заблокувати',\n Translucent: 'Півпрозорий',\n Color: 'Колір',\n Texture: 'Текстура',\n Size: 'Розмір',\n Thickness: 'Товщина',\n Yes: 'Так',\n No: 'Ні',\n OK: 'ОК',\n Cancel: 'Скасувати',\n Apply: 'Застосувати',\n Close: 'Закрити',\n ApplyTo: 'Застосувати До',\n Run: 'Запустити',\n Pause: 'Пауза',\n Resume: 'Відновити',\n Clear: 'Очистити',\n Warning: 'Попередження',\n Caution: 'Обережно',\n Reminder: 'Нагадування',\n Length: 'Довжина',\n Width: 'Ширина',\n Height: 'Висота',\n Radius: 'Радіус',\n Angle: 'Кут',\n Azimuth: 'Азимут',\n Coordinates: 'Координати',\n Weather: 'Погода',\n Show: 'Показати',\n Animate: 'Анімувати',\n Date: 'Дата',\n Time: 'Час',\n Title: 'Заголовок',\n Owner: 'Власник',\n Action: 'Дія',\n Rename: 'Перейменувати',\n Location: 'Місцезнаходження',\n Latitude: 'Широта',\n Month: 'Місяць',\n Day: 'День',\n Hour: 'Година',\n Daylight: 'Денне світло',\n Radiation: 'Радіаційне Випромінювання',\n Temperature: 'Температура',\n kWh: 'кВт-год',\n dollar: 'долар',\n MeterPerSecond: 'м/с',\n NorthInitial: 'Північ',\n SouthInitial: 'Південь',\n EastInitial: 'Схід',\n WestInitial: 'Захід',\n Fixed: 'Фіксований',\n Elements: 'Елементи',\n Energy: 'Енергія',\n Unknown: 'Невідомо',\n Label: 'Мітка',\n Description: 'Опис',\n NoDescription: 'Без опису',\n MaximumCharacters: 'Максимальна кількість символів',\n Author: 'Автор',\n Publisher: 'Видавець',\n Building: 'Будівля',\n ResidentialBuilding: 'Житлова будівля',\n CommercialBuilding: 'Комерційна будівля',\n SchoolBuilding: 'Шкільна будівля',\n TouristAttraction: \"Туристична визначна пам'ятка\",\n UnderConstruction: 'В стадії будівництва',\n Photovoltaic: 'Фотоелектричний',\n Anonymous: 'Анонімний',\n Nickname: 'Нікнейм',\n Pin: 'Закріпити',\n Unpin: 'Відкріпити',\n },\n\n shared: {\n NoTexture: 'Без текстури',\n FoundationElement: 'Фундамент',\n CuboidElement: 'Паралелепіпед',\n PolygonElement: 'Багатокутник',\n SensorElement: 'Сенсор',\n SolarPanelElement: 'Сонячна панель',\n WaterHeaterElement: 'Водонагрівач',\n ParabolicDishElement: 'Параболічна тарілка',\n ParabolicTroughElement: 'Параболічний сонячний колектор',\n FresnelReflectorElement: 'Відбивач Френеля',\n HeliostatElement: 'Геліостат',\n WindTurbineElement: 'Вітрова турбіна',\n LightElement: 'Світло',\n ElementLocked: 'Заблоковано',\n ModelType: 'Тип моделі',\n OutputBreakdown: 'Breakdown',\n MoreResults: 'More Results',\n },\n\n message: {\n ModelNotFound: 'Модель не знайдено',\n CannotSignIn: 'Не вдається увійти',\n CannotSignOut: 'Не вдається вийти',\n YourAccountWasCreated: 'Ваш обліковий запис був створений',\n CannotCreateAccount: 'Не вдається створити обліковий запис',\n YourAccountSettingsWereSaved: 'Налаштування облікового запису були збережені',\n CannotSaveYourAccountSettings: 'Не вдається зберегти налаштування облікового запису',\n CannotSaveYourFileToCloud: 'Не вдається зберегти ваш файл у хмарному середовищі',\n CannotCreateNewProject: 'Не вдається створити новий проєкт',\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\n CannotOpenYourProjects: 'Не вдається відкрити ваші проєкти',\n CannotOpenProject: 'Cannot open the project',\n CannotDeleteProject: 'Cannot delete the project',\n CannotRenameProject: 'Cannot rename the project',\n CannotAddDesignToProject: 'Cannot add this design to the project',\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\n DesignRemovedFromProject: 'The design was successfully removed from the project',\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\n CannotUpdateProject: 'Cannot update the project',\n CannotFetchProjectData: 'Cannot fetch project data',\n TitleUsedChooseDifferentOne: 'Ця назва була використана. Виберіть іншу',\n CloudFileWithTitleExistsDoYouWantToOverwrite:\n 'Хмарний файл з такою ж назвою вже існує. Ви хочете перезаписати його?',\n CloudFileNotFound: 'Файл у хмарному середовищі не знайдено',\n CannotLoadModelsOnMap: 'Не вдається завантажити моделі на карту',\n CannotLoadLeaderboard: 'Не вдається завантажити таблицю лідерів',\n CannotPublishModelOnMap: 'Не вдається опублікувати модель на карті',\n CannotLikeModelFromMap: 'Не вдається оцінити модель з карти',\n CannotDeleteModelFromMap: 'Не вдається видалити модель з карти',\n ModelDeletedFromMap: 'Модель видалена з карти',\n DoYouWantToDeleteModelFromMap: 'Ви бажаєте видалити модель з карти?',\n CannotOpenCloudFile: 'Не вдається відкрити файл у хмарному середовищі',\n CannotReadCloudFile: 'Cannot read the cloud file',\n CannotWriteCloudFile: 'Cannot write the cloud file',\n CloudFileCopied: 'Cloud file copied',\n CannotOpenCloudFolder: 'Не вдається відкрити папку у хмарному середовищі',\n CannotDeleteCloudFile: 'Не вдається видалити файл у хмарному середовищі',\n CannotRenameCloudFile: 'Не вдається перейменувати файл у хмарному середовищі',\n DoYouWantToSaveChanges: 'Бажаєте зберегти зміни?',\n NotApplicableToSelectedAction: 'Не застосовується до обраної дії',\n ThisElementIsLocked: 'Цей елемент заблокований.',\n ThisCannotBeUndone: 'Це не можна скасувати.',\n AzimuthOfNorthIsZero: 'Азимут півночі дорівнює 0°',\n CounterclockwiseAzimuthIsPositive: 'Азимут є позитивним проти годинникової стрілки.',\n MoveCancelledBecauseOfOverlap: 'Переміщення скасовано через перекриття.',\n MoveOutsideBoundaryCancelled: 'Переміщення за межі скасовано.',\n RotationCancelledBecauseOfOverlap: 'Ротацію скасовано через перекриття.',\n RotationOutsideBoundaryCancelled: 'Ротація за межі скасована.',\n ResizingCancelledBecauseOfOverlap: 'Зміна розміру скасована через перекриття.',\n ResizingOutsideBoundaryCancelled: 'Зміна розміру за межі скасована.',\n CannotPasteOutsideBoundary: 'Не можна вставити за межі.',\n CannotPasteBecauseOfOverlap: 'Не можна вставити через перекриття.',\n CannotMoveObjectTooFar: \"Не можна перемістити об'єкт занадто далеко.\",\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\n 'Існуючі сонячні панелі будуть видалені перед застосуванням нового макету.',\n DoYouWantToContinue: 'Бажаєте продовжити?',\n SolarPanelsCannotIntersectWithGround: 'Сонячні панелі не можуть перетинатися з землею.',\n SolarPanelsCannotOverlapWithOneAnother: 'Сонячні панелі не можуть накладатися одна на одну.',\n ScreenshotSaved: 'Знімок екрана збережено.',\n CsvFileSaved: 'CSV файл збережено.',\n SimulationStarted: 'Розпочато симуляцію.',\n SimulationCompleted: 'Симуляцію завершено.',\n SimulationAborted: 'Симуляцію перервано.',\n SimulationPaused: 'Симуляцію призупинено.',\n CancelSimulation: 'Скасувати симуляцію',\n PauseSimulation: 'Призупинити симуляцію',\n ResumeSimulation: 'Продовжити симуляцію',\n SimulationWillNotStartDueToErrors: 'Симуляція не розпочнеться через помилки',\n SimulationWillStartDespiteWarnings: 'Симуляція розпочнеться незважаючи на попередження.',\n EvolutionStarted: 'Еволюцію розпочато.',\n EvolutionCompleted: 'Еволюцію завершено.',\n EvolutionAborted: 'Еволюцію перервано.',\n EvolutionPaused: 'Еволюцію призупинено.',\n EncounterEvolutionError: 'Сталася помилка еволюції.',\n CancelEvolution: 'Скасувати еволюцію',\n PauseEvolution: 'Призупинити еволюцію',\n ResumeEvolution: 'Продовжити еволюцію',\n ConvergenceThresholdHasBeenReached: 'Досягнуто порогове значення збіжності.',\n MaximumNumberOfGenerationsHasBeenReached: 'Досягнуто максимальну кількість поколінь.',\n MaximumNumberOfStepsHasBeenReached: 'Досягнуто максимальну кількість кроків.',\n ObjectiveFunctionTypeError:\n 'Поточна цільова функція не підтримується цією операцією. Будь ласка, розпочніть з меню.',\n WallsAreNotAtSameHeight: 'Стіни не знаходяться на однаковій висоті.',\n WallsAreNotPerpendicular: 'Стіни не перпендикулярні.',\n WallsAreNotConnected: \"Стіни не з'єднані.\",\n WallsNumberNeedToBeFour: 'Кількість стін має дорівнювати чотири.',\n BuildingContainsEmptyWall: 'Будівля містить одну або кілька порожніх стін.',\n BuildingRoofMissing: 'У будівлі відсутній дах.',\n UnknownErrors: 'Невідомі помилки.',\n },\n\n menu: {\n AnalysisOptions: 'Опції аналізу',\n option: {\n GridCellSize: 'Розмір комірки сітки',\n SamplingFrequency: 'Частота вибірки',\n TimesPerHour: 'Разів на годину',\n DaysPerYear: 'Днів на рік',\n },\n mainMenu: 'Головне Меню',\n cloudMenu: 'Меню Хмарного Середовища',\n projectSubMenu: 'Проєкт',\n project: {\n CreateNewProject: 'Створити Новий Проєкт',\n OpenProject: 'Відкрити Проєкт',\n SaveProjectAs: 'Save Project As',\n YouMustLogInToCreateProject: 'Ви повинні увійти, щоб створити новий проєкт',\n YouMustLogInToOpenProject: 'Ви повинні увійти, щоб відкрити проєкт',\n },\n fileSubMenu: 'Файл',\n file: {\n CreateNewFile: 'Створити новий',\n OpenLocalFile: 'Відкрити локально',\n SaveAsLocalFile: 'Зберегти як',\n SavingAbortedMustHaveValidFileName: \"Збереження перервано! Вам потрібно мати дійсне ім'я файлу\",\n OpenCloudFile: 'Відкрити у хмарному середовищі',\n SaveCloudFile: 'Зберегти у хмарному середовищі',\n SaveAsCloudFile: 'Зберегти у хмарному середовищі',\n SavingAbortedMustHaveValidTitle: 'Збереження перервано! Вам потрібно мати дійсний заголовок для хмарного файлу',\n ToSaveYourWorkPleaseSignIn: 'Щоб зберегти вашу роботу, будь ласка, увійдіть в систему.',\n TakeScreenshot: 'Зробити знімок екрана',\n UseCloudFileName: \"Використовувати ім'я файлу у хмарному середовищі\",\n PublishOnModelsMap: 'Опублікувати на карті моделей',\n PublishedOnModelsMap: 'Вашу модель було опубліковано на карті моделей',\n UpdatedOnModelsMap: 'Ваша модель була оновлена на карті моделей',\n YouMustLogInToPublishYourModel: 'Вам потрібно увійти в систему, щоб опублікувати свою модель',\n YouCannotPublishAModelThatYouDoNotOwn: 'Ви не можете опублікувати модель, якою не володієте',\n YouMustSaveModelOnCloudBeforePublishingIt:\n 'Вам потрібно зберегти модель у хмарному середовищі перед її публікацією',\n },\n editSubMenu: 'Редагувати',\n edit: {\n Undo: 'Скасувати',\n Redo: 'Повторити',\n },\n viewSubMenu: 'Перегляд',\n view: {\n NavigationView: 'Navigation View',\n TwoDimensionalView: '2D Вигляд',\n ResetView: 'Скинути',\n ZoomIn: 'Збільшити масштаб',\n ZoomOut: 'Зменшити масштаб',\n AutoRotate: 'Автоматичний поворот',\n ShowShadow: 'Показати тінь',\n ShowSurfaceShininess: 'Показати блиск поверхні',\n TranslucentFloatingWindows: 'Напівпрозорі плаваючі вікна',\n accessoriesSubMenu: 'Додаткові елементи',\n accessories: {\n SiteInformation: 'Інформація про місце',\n DesignInformation: 'Інформація про дизайн',\n Instruction: 'Інструкція',\n StickyNote: 'Примітка',\n Note: 'Примітка',\n },\n },\n settingsSubMenu: 'Налаштування',\n settings: {\n WeatherData: 'Дані про погоду',\n DiurnalTemperature: 'Добова температура',\n Heliodon: 'Геліодон',\n SunAndTime: 'Сонце та час',\n },\n benchmarksSubMenu: 'Бенчмарки',\n benchmarks: {\n SolarRadiationPredictionVsMeasurement: 'Прогнозування сонячної радіації порівняно з вимірюванням',\n BESTESTCase600: 'Тестування енергоефективності будівель: BESTEST Case 600',\n BESTESTCase610: 'Тестування енергоефективності будівель: BESTEST Case 610',\n BESTESTCase620: 'Тестування енергоефективності будівель: BESTEST Case 620',\n BESTESTCase630: 'Тестування енергоефективності будівель: BESTEST Case 630',\n },\n graph: {\n LineWidth: 'Товщина лінії',\n SymbolSize: 'Розмір символу',\n BarCategoryGap: 'Відступ категорій стовпців',\n ShowHorizontalGridLines: 'Показати горизонтальні лінії сітки',\n ShowVerticalGridLines: 'Показати вертикальні лінії сітки',\n },\n analysisSubMenu: 'Аналіз',\n physicsSubMenu: 'Фізика',\n physics: {\n DailySolarRadiationHeatmap: 'Щоденна карта сонячної радіації',\n SolarRadiationHeatmapOptions: 'Параметри карти сонячної радіації',\n SolarRadiationHeatmapGridCellSize: 'Розмір комірки на карті сонячної радіації',\n SolarRadiationHeatmapMaxValue: 'Максимальне значення на карті',\n SolarRadiationHeatmapNoAnimation: 'Немає анімації для статичної моделі',\n ReflectionHeatmap: 'Карта відображень',\n },\n sensorSubMenu: 'Датчик',\n sensor: {\n CollectDailyData: 'Збирати щоденні дані',\n CollectYearlyData: 'Збирати щорічні дані',\n SensorSimulationNoAnimation: 'Немає анімації для збору даних датчика',\n },\n buildingSubMenu: 'Будівля',\n building: {\n AnalyzeDailyBuildingEnergy: 'Аналізувати щоденну енергію будівлі',\n AnalyzeYearlyBuildingEnergy: 'Аналізувати щорічну енергію будівлі',\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\n EnergyGridCellSize: 'Розмір комірки сітки',\n BuildingEnergySimulationNoAnimation: 'Немає анімації симулювати енергію будівлі',\n },\n solarPanelSubMenu: 'Сонячна панель',\n solarPanel: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n AnalyzeVisibility: 'Аналізувати видимість',\n PanelDiscretization: 'Дискретизація панелі',\n Exact: 'Точний',\n Approximate: 'Наближений',\n EnergyGridCellSize: 'Розмір комірки сітки енергії',\n VisibilityGridCellSize: 'Розмір комірки сітки коефіцієнта видимості',\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\n VisibilityAnalysisOptions: 'Параметри аналізу видимості',\n SolarPanelSimulationNoAnimation: 'Немає анімації для симуляції сонячної панелі',\n },\n parabolicTroughSubMenu: 'Параболічний сонячний колектор',\n parabolicTrough: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n parabolicDishSubMenu: 'Параболічний диск',\n parabolicDish: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n fresnelReflectorSubMenu: 'Відбивач Френеля',\n fresnelReflector: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n heliostatSubMenu: 'Геліостат',\n heliostat: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n },\n solarUpdraftTowerSubMenu: 'Сонячна вежа з використаним повітрям',\n solarUpdraftTower: {\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\n SolarUpdraftTowerSimulationNoAnimation: 'Немає анімації симулювати сонячну вежу з використаним повітрям',\n },\n\n tutorialsSubMenu: 'Посібники',\n\n solarEnergyScienceSubMenu: 'Сонячна наука',\n solarEnergyScienceTutorials: {\n SunAngles: 'Кути сонця відносно спостерігача на землі',\n InsolationAndClimate: 'Інсоляція та клімат',\n SolarRadiationToBox: 'Сонячна радіація в коробку',\n },\n\n buildingScienceSubMenu: 'Наука про будівлі',\n buildingScienceTutorials: {\n ThermalEnvelopeVsBuildingEnvelope: 'Теплозахисна оболонка проти будівельної оболонки',\n EffectOfSizeOnBuildingEnergy: 'Вплив розміру на енергію будівлі',\n EffectOfOrientationOnBuildingEnergy: 'Вплив орієнтації на енергію будівлі',\n EffectOfInsulationOnBuildingEnergy: 'Вплив інсоляції на енергію будівлі',\n EffectOfRoofColorOnBuildingEnergy: 'Вплив кольору даху на енергію будівлі',\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Вплив довжини виступу карнизу на енергію будівлі',\n EffectOfWindowSHGCOnBuildingEnergy: 'Вплив коефіцієнта сонячного теплозиску вікна на енергію будівлі',\n EffectOfThermostatSetpointOnBuildingEnergy: 'Вплив заданої температури на термостаті на енергію будівлі',\n EffectOfSolarPanelsOnBuildingEnergy: 'Вплив сонячних панелей на енергію будівлі',\n EffectOfGroundTemperatureOnBuildingEnergy: 'Вплив температури грунту на енергію будівлі',\n EffectOfTreesOnBuildingEnergy: 'Вплив дерев на енергію будівлі',\n },\n\n buildingDesignSubMenu: 'Дизайн будівлі',\n buildingDesignTutorials: {\n CapeCodStyleHouseWithShedDormer: 'Будинок у стилі Кейп Код з пристроєм типу \"шед-дормер\"',\n MansardRoofWithDormers: 'Мансарда з горизонтальними пристроями',\n GableRoofVsHipRoof: 'Схиловий дах проти двосхилих дахів',\n ColonialVsSaltbox: 'Колоніальний стиль проти стилю Saltbox',\n GambrelRoofVsMansardRoof: 'Півшаровий дах проти мансардного даху',\n CombinationRoofVsBonnetRoof: 'Комбінований дах проти капотного даху',\n DutchGableRoof: 'Голландський дах з рикетом',\n GableAndValleyRoof: 'Схиловий та долинний дах',\n ClerestoryRoof: 'Клересторний дах',\n MonitorRoof: 'Моніторний дах',\n AFrameHouse: 'Будинок у формі літери \"А\"',\n HalfTimberedHouse: \"Будинок з напівдерев'яними стінами\",\n AllBasicRoofTypes: 'Усі основні типи дахів',\n },\n\n photovoltaicSolarPowerSubMenu: 'Фотоелектрична сонячна енергія',\n photovoltaicSolarPowerTutorials: {\n EffectOfTiltAngleOfSolarPanel: 'Вплив кута нахилу сонячної панелі',\n EffectOfAzimuthOfSolarPanel: 'Вплив азимуту сонячної панелі',\n SolarPanelTypes: 'Типи сонячних панелей',\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\n SolarTrackers: 'Сонячні трекери',\n CoveringGroundWithSolarPanels: 'Чому просто покриття землі сонячними панелями - не найкраща ідея',\n InterRowSpacingOfSolarPanelArray: 'Вплив міжрядного простору в масиві сонячних панелей',\n EffectOfOrientationOfSolarPanels: 'Вплив орієнтації сонячних панелей',\n SolarPanelArrayAutomaticLayout: 'Автоматичне розміщення масиву сонячних панелей',\n },\n\n concentratedSolarPowerSubMenu: 'Концентрована сонячна енергія',\n concentratedSolarPowerTutorials: {\n EffectOfAzimuthOfParabolicTrough: 'Вплив азимуту параболічного сонячного колектора',\n EffectOfLatusRectumOfParabolicTrough: 'Вплив прямої лінії на параболічний сонячний колектор',\n FocusSunlightWithParabolicDish: 'Фокусування сонячного світла за допомогою параболічного диску',\n LinearFresnelReflectors: 'Лінійні відбивачі Френеля',\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\n 'Вплив висоти поглинаючої трубки на лінійні відбивачі Френеля',\n EffectOfAzimuthOfLinearFresnelReflectors: 'Вплив азимуту на лінійні відбивачі Френеля',\n LinearFresnelReflectorsWithTwoAbsorbers: 'Лінійні відбивачі Френеля з двома поглинаючими елементами',\n CosineEfficiencyOfHeliostats: 'Косинусна ефективність геліостатів',\n ShadowingAndBlockingOfHeliostats: 'Затінення та блокування геліостатів',\n EffectSolarPowerTowerHeight: 'Вплив висоти сонячної вежі з використаним повітрям',\n SolarPowerTower: 'Сонячна вежа з використаним повітрям',\n },\n\n otherTypesOfSolarPowerSubMenu: 'Інші типи сонячної енергії',\n otherTypesOfSolarPowerTutorials: {\n SolarUpdraftTower: 'Сонячна вежа з використаним повітрям',\n },\n\n generativeDesignSubMenu: 'Generative Design',\n generativeDesignTutorials: {\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\n },\n\n examplesSubMenu: 'Приклади',\n\n solarEnergySubMenu: 'Сонячна енергія',\n solarEnergyExamples: {\n SunBeamAndHeliodon: 'Промінь сонця та геліодон',\n RooftopSolarPanels: 'Сонячні панелі на даху',\n NevadaSolarOneParabolicTroughArray: 'Масив параболічних сонячних колекторів Nevada Solar One',\n TooeleParabolicDishArray: 'Масив параболічних тарілок Tooele',\n PS10SolarPowerTower: 'Сонячна енергетична вежа PS10',\n TucsonLinearFresnelReflectors: 'Лінійні відбивачі Френеля в Tucson',\n SolarCanopyFormFactors: 'Форми сонячних козирків',\n SolarCanopyOverBleachers: 'Сонячний козирок над трибунами',\n SolarCanopyOverGarage: 'Сонячний козирок над гаражем',\n SolarBusStop: 'Сонячна автобусна зупинка',\n SolarFacadeTesla: 'Сонячна фасадна панель Tesla',\n BuildingIntegratedPhotovoltaics: 'Вбудовані фотоелектричні системи в будівлі',\n Floatovoltaics: 'Сонячні панелі на плавучих платформах',\n Agrivoltaics: 'Агровольтаїка',\n VegetativeBuffer: 'Вегетативна зона',\n RainbowSwashSolarFarmBostonMA: 'Сонячна ферма Rainbow Swash в Boston, MA',\n MickeyMouseSolarFarmOrlandoFL: 'Сонячна ферма Міккі Мауса в Orlando, FL',\n SolarPanelsOverCanalBakersfieldCA: 'Сонячні панелі над каналом в Bakersfield, CA',\n SolarNoiseBarrierLexingtonMA: \"Сонячний шумовий бар'єр в Lexington, MA\",\n HSATSolarTrackersRaleighNC: 'Сонячні трекери з горизонтальною віссю в Raleign, NC',\n AADATSolarTrackersLancasterCA: 'Сонячні трекери з азимутальною-вертикальною віссю в Lancaster, CA',\n SolarUpdraftTowerInCity: 'Сонячна вежа з використаним повітрям у місті',\n },\n\n builtEnvironmentSubMenu: 'Забудоване середовище',\n residentialBuildingsSubMenu: 'Житлові будівлі',\n residentialBuildingExamples: {\n ColonialHouse: 'Колоніальний будинок',\n DutchColonialHouse: 'Голландський колоніальний будинок',\n TShapedHouse: 'Будинок у формі літери Т',\n CapeCodHouseWithGarage: 'Будинок у стилі Cape Cod з гаражем',\n Solarium: 'Солярій',\n Church1: 'Церква 1',\n Cathedral1: 'Собор 1',\n Cathedral2: 'Собор 2',\n Mosque1: 'Мечеть 1',\n AdobeTaosHouse: 'Будинок з адобе в стилі Taos',\n RanchHouse: 'Ranch House',\n BonnetHouse: 'Будинок в стилі Bonnet',\n BarnStyleHouse: 'Будинок у стилі амбара',\n ModernHouse: 'Сучасний будинок',\n ButterflyRoofHouse: 'Будинок з метеликовим дахом',\n },\n commercialBuildingsSubMenu: 'Комерційні будівлі',\n commercialBuildingExamples: {\n WhiteHouse: 'Білий Дім',\n BilimMersinTurkiye: 'Bilim, Mersin, Туреччина',\n SpanishStyleHotel: 'Готель в іспанському стилі',\n ApartmentBuilding: 'Багатоквартирний будинок',\n OfficeBuilding: 'Офісна будівля',\n Hotel: 'Готель',\n },\n buildingComplexesSubMenu: 'Будівельні комплекси',\n buildingComplexExamples: {\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, Vermont',\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, New Mexico',\n },\n urbanPlanningSubMenu: 'Міське планування',\n urbanPlanningExamples: {\n Heatmap1: 'Теплова карта',\n },\n otherBuildingsSubMenu: 'Інші будівлі',\n otherBuildingExamples: {\n Greenhouse: 'Теплиця',\n Pavilion: 'Павільйон у парку',\n OctagonalPagoda: 'Восьмикутна пагода',\n OceanFront: 'Будівля біля океану',\n EgyptianPyramids: 'Єгипетські піраміди',\n MayanPyramid: 'Піраміда Мая',\n SiOSePol: 'Si-O-Se-Pol',\n StackedCuboids: 'Стековані кубоїди',\n },\n\n artificialIntelligenceSubMenu: 'Штучний інтелект',\n artificialIntelligenceExamples: {\n OptimizingTiltAngleOfOneSolarPanelRow: 'Оптимізація кута нахилу одного ряду сонячних панелей',\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Оптимізація кутів нахилу декількох рядів сонячних панелей',\n SolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми',\n SolarFarmGenerativeDesignWithBlock: 'Генеративний дизайн сонячної ферми в присутності перешкоди',\n FitchburgSolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми у Fitchburg',\n },\n languageSubMenu: 'Мова',\n publicSubMenu: 'Загальнодоступно',\n ModelsGallery: 'Галерея моделей',\n ModelsMap: 'Карта моделей',\n AboutUs: 'Про нас',\n },\n\n avatarMenu: {\n AccountSettings: 'Налаштування облікового запису',\n PrivacyStatementTitle: 'User Privacy Protection Statement',\n PrivacyStatement:\n \"Коли ви увійдете, ваш Google ID використовується для створення та доступу до вашого облікового запису Aladdin. В нашій базі даних зберігається лише випадковий алфавітно-цифровий рядок як посилання. Ми ніколи не збираємо особисто ідентифіковану інформацію, таку як ваше ім'я або електронна пошта. Для отримання додаткової інформації ознайомтесь з нашою \",\n SignIn: 'Увійти',\n SignOut: 'Вийти',\n IfYouAreAStudent: 'Якщо ви студент',\n },\n\n skyMenu: {\n Axes: 'Вісі',\n Theme: 'Тематика',\n ThemeDefault: 'За замовчуванням',\n ThemeDesert: 'Пустеля',\n ThemeDune: 'Дюна',\n ThemeForest: 'Ліс',\n ThemeGrassland: 'Степ',\n ThemeHill: 'Пагорб',\n ThemeLake: 'Озеро',\n ThemeMountain: 'Гора',\n ThemeRural: 'Сільська місцевість',\n SunlightAttenuationCoefficientInAir: 'Коефіцієнт затухання сонячного світла у повітрі',\n ConvectiveCoefficientOfAir: 'Коефіцієнт конвекції повітря',\n HighestTemperatureTimeInMinutes: 'Час найвищої температури (хвилини)',\n SelectSunAnglesToShow: 'Виберіть кути сонця, які показати',\n ShowAzimuthAngle: 'Показати азимутний кут',\n ShowElevationAngle: 'Показати висотний кут',\n ShowZenithAngle: 'Показати зенітний кут',\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\n },\n\n groundMenu: {\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\n Vegetation: 'Рослинність',\n LeafOutDay: 'День розпускання листя',\n LeafOffDay: 'День опадання листя',\n Albedo: 'Альбедо',\n ImageOnGround: 'Зображення на поверхні',\n WaterSurface: 'Поверхня води',\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\n RemoveAllUnlockedPeople: 'Видалити всіх розблокованих людей',\n RemoveAllUnlockedFoundations: 'Видалити всі розблоковані фундаменти',\n RemoveAllUnlockedCuboids: 'Видалити всі розблоковані кубоїди',\n DoYouReallyWantToRemoveAllPeople: 'Ви дійсно хочете видалити всіх людей, що не заблоковані',\n DoYouReallyWantToRemoveAllTrees: 'Ви дійсно хочете видалити всі дерева, що не заблоковані',\n DoYouReallyWantToRemoveAllFlowers: 'Ви дійсно хочете видалити всі квіти, що не заблоковані',\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\n DoYouReallyWantToRemoveAllFoundations: 'Ви дійсно хочете видалити всі фундаменти, що не заблоковані',\n DoYouReallyWantToRemoveAllCuboids: 'Ви дійсно хочете видалити всі кубоїди, що не заблоковані',\n LockAllElements: 'Заблокувати всі елементи',\n UnlockAllElements: 'Розблокувати всі елементи',\n },\n\n labelSubMenu: {\n Label: 'Мітка',\n LabelText: 'Текст мітки',\n LabelHeight: 'Висота мітки',\n LabelSize: 'Розмір мітки',\n LabelFontSize: 'Розмір шрифту',\n LabelColor: 'Колір мітки',\n KeepShowingLabel: 'Залишати видимою мітку',\n },\n\n foundationMenu: {\n RemoveAllUnlockedSolarPanels: 'Видалити всі незаблоковані сонячні панелі',\n RemoveAllUnlockedParabolicTroughs: 'Видалити всі незаблоковані параболічні сонячні колектори',\n RemoveAllUnlockedParabolicDishes: 'Видалити всі незаблоковані параболічні антени',\n RemoveAllUnlockedFresnelReflectors: 'Видалити всі незаблоковані відбивачі Френеля',\n RemoveAllUnlockedHeliostats: 'Видалити всі незаблоковані геліостати',\n RemoveAllUnlockedSensors: 'Видалити всі незаблоковані датчики',\n RemoveAllUnlockedLights: 'Видалити всі незаблоковані освітлювальні прилади',\n RemoveAllUnlockedWalls: 'Видалити всі незаблоковані стіни',\n RemoveAllUnlockedWindows: 'Видалити всі незаблоковані вікна',\n RemoveAllUnlockedDoors: 'Видалити всі незаблоковані двері',\n RemoveAllUnlockedPolygons: 'Видалити всі незаблоковані полігони',\n RemoveAllUnlockedHumans: 'Видалити всіх незаблокованих людей',\n RemoveAllUnlockedTrees: 'Видалити всі незаблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі незаблоковані квіти',\n Racks: 'Стелажі',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n SolarPanels: 'Сонячні панелі',\n SolarPanelArray: 'Solar Panel Array',\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому фундаменті, які не є заблокованими',\n ParabolicTroughs: 'Параболічні сонячні колектори',\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\n 'Ви дійсно бажаєте видалити всі параболічні сонячні колектори на цьому фундаменті, які не є заблокованими',\n ParabolicDishes: 'Параболічні антени',\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\n 'Ви дійсно бажаєте видалити всі параболічні антени на цьому фундаменті, які не є заблокованими',\n FresnelReflectors: 'Відбивачі Френеля',\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі відбивачі Френеля на цьому фундаменті, які не є заблокованими',\n Heliostats: 'Геліостати',\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\n 'Ви дійсно бажаєте видалити всі геліостати на цьому фундаменті, які не є заблокованими',\n Sensors: 'Датчики',\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі датчики на цьому фундаменті, які не є заблокованими',\n Lights: 'Світильники',\n DoYouReallyWantToRemoveAllLightsOnFoundation:\n 'Ви дійсно бажаєте видалити всі світильники на цьому фундаменті, які не є заблокованими',\n Walls: 'Стіни',\n DoYouReallyWantToRemoveAllWallsOnFoundation:\n 'Ви дійсно бажаєте видалити всі стіни на цьому фундаменті, які не є заблокованими',\n Windows: 'Вікна',\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\n 'Ви дійсно бажаєте видалити всі вікна на цьому фундаменті, які не є заблокованими',\n Doors: 'Двері',\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\n 'Ви дійсно бажаєте видалити всі двері на цьому фундаменті, які не є заблокованими',\n Polygons: 'Багатокутники',\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\n 'Ви дійсно бажаєте видалити всі багатокутники на цьому фундаменті, які не є заблокованими',\n Humans: 'Люди',\n DoYouReallyWantToRemoveAllHumansOnFoundation:\n 'Ви дійсно бажаєте видалити всіх людей на цьому фундаменті, які не є заблокованими',\n Trees: 'Дерева',\n DoYouReallyWantToRemoveAllTreesOnFoundation:\n 'Ви дійсно бажаєте видалити всі дерева на цьому фундаменті, які не є заблокованими',\n Flowers: 'Квіти',\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\n 'Ви дійсно бажаєте видалити всі квіти на цьому фундаменті, які не є заблокованими',\n OnlyThisFoundation: 'Тільки цей фундамент',\n AllConnectedFoundations: 'Всі пов’язані фундаменти',\n AllFoundations: 'Всі фундаменти',\n AddPolygon: 'Додати багатокутник',\n SolarStructure: 'Вибрати сонячну структуру',\n GroupMaster: 'Груповий майстер',\n LockAllElementsOnThisFoundation: 'Заблокувати всі елементи на цьому фундаменті',\n UnlockAllElementsOnThisFoundation: 'Розблокувати всі елементи на цьому фундаменті',\n GroundFloorRValue: 'Теплопровідність перекриття цокольного поверху',\n OnlyThisGroundFloor: 'Тільки цокольний поверх',\n AllGroundFloors: 'Всі цокольні поверхи',\n },\n\n solarPowerTowerMenu: {\n ReceiverTowerForHeliostats: 'Вежа приймача для геліостатів',\n ReceiverTowerPhysicalProperties: 'Фізичні властивості вежі приймача',\n ReceiverTowerHeight: 'Висота вежі приймача',\n ReceiverTowerRadius: 'Радіус вежі приймача',\n ReceiverAbsorptance: 'Поглинання приймача',\n ReceiverOpticalEfficiency: 'Оптична ефективність приймача',\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\n },\n\n solarAbsorberPipeMenu: {\n AbsorberPipeForFresnelReflectors: 'Трубопровід для відбивачів Френеля',\n AbsorberPipePhysicalProperties: 'Фізичні властивості трубопроводу поглинання',\n AbsorberHeight: 'Висота трубопроводу поглинання',\n AbsorberApertureWidth: 'Ширина отвору трубопроводу поглинання',\n AbsorberPipePoleNumber: 'Кількість полюсів для трубопроводу поглинання',\n AbsorberAbsorptance: 'Сила поглинання',\n AbsorberOpticalEfficiency: 'Оптична ефективність поглинача',\n AbsorberThermalEfficiency: 'Теплова ефективність поглинача',\n },\n\n solarUpdraftTowerMenu: {\n SolarUpdraftTower: 'Сонячна вежа з тяговим потоком',\n SolarUpdraftTowerPhysicalProperties: 'Фізичні властивості сонячної вежі з тяговим потоком',\n SolarUpdraftTowerChimneyHeight: 'Висота димової труби сонячної вежі з тяговим потоком',\n SolarUpdraftTowerChimneyRadius: 'Радіус димової труби сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorHeight: 'Висота колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorRadius: 'Радіус колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorTransmissivity: 'Проникність колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerCollectorEmissivity: 'Випромінюваність колектора сонячної вежі з тяговим потоком',\n SolarUpdraftTowerDischargeCoefficient: 'Коефіцієнт викиду сонячної вежі з тяговим потоком',\n SolarUpdraftTowerTurbineEfficiency: 'Ефективність турбіни сонячної вежі з тяговим потоком',\n },\n\n cuboidMenu: {\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\n RemoveAllUnlockedHumans: 'Видалити всіх розблокованих людей',\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\n Racks: 'Стійки',\n SolarPanels: 'Сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому кубоїді, які не заблоковані',\n Sensors: 'Сенсори',\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\n 'Ви дійсно бажаєте видалити всі сенсори на цьому кубоїді, які не заблоковані',\n Polygons: 'Полігони',\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\n 'Ви дійсно бажаєте видалити всі полігони на цьому кубоїді, які не заблоковані',\n Humans: 'Люди',\n DoYouReallyWantToRemoveAllHumansOnCuboid:\n 'Ви дійсно бажаєте видалити всіх людей на цьому кубоїді, які не заблоковані',\n Trees: 'Дерева',\n DoYouReallyWantToRemoveAllTreesOnCuboid:\n 'Ви дійсно бажаєте видалити всі дерева на цьому кубоїді, які не заблоковані',\n Flowers: 'Квіти',\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\n 'Ви дійсно бажаєте видалити всі квіти на цьому кубоїді, які не заблоковані',\n OnlyThisCuboid: 'Тільки цей кубоїд',\n AllCuboidsOnSameSurface: 'Усі кубоїди на одній поверхні',\n AllCuboidsAboveSameBase: 'Усі кубоїди над тією ж основою',\n AllCuboids: 'Всі кубоїди',\n OnlyThisSide: 'Тільки ця сторона',\n AllSidesOfThisCuboid: 'Всі сторони цього кубоїда',\n AllSidesOfAllCuboids: 'Всі сторони всіх кубоїдів',\n AddPolygon: 'Додати полігон',\n Stackable: 'Стекабельне',\n GroupMaster: 'Майстер групи',\n },\n\n polygonMenu: {\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n TextBox: 'Текстове поле',\n FontOutlineColor: 'Колір контуру шрифту',\n FontOutlineWidth: 'Товщина контуру шрифту',\n FontStrokeColor: 'Колір обводки шрифту',\n FontStrokeWidth: 'Товщина обводки шрифту',\n NoOutline: 'Без контуру',\n Shiny: 'Блискучий',\n Filled: 'Заповнений',\n FillTexture: 'Текстура заповнення',\n FillColor: 'Колір заповнення',\n Opacity: 'Прозорість',\n LineColor: 'Колір лінії',\n LineWidth: 'Товщина лінії',\n LineStyle: 'Стиль лінії',\n SolidLine: 'Суцільна лінія',\n DashedLine: 'Пунктирна лінія',\n DottedLine: 'Точкова лінія',\n InsertVertexBeforeIndex: 'Вставити вершину перед індексом',\n InsertVertexAfterIndex: 'Вставити вершину після індексу',\n DeleteVertex: 'Видалити вершину',\n OnlyThisPolygon: 'Тільки цей полігон',\n AllPolygonsOnSurface: 'Всі полігони на цій поверхні',\n AllPolygonsAboveFoundation: 'Всі полігони вище фундаменту',\n AllPolygons: 'Всі полігони',\n Layout: 'Розташування',\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\n SolarPanelArrayLayoutParametricDesign: 'Розташування сонячних панелей: параметричний дизайн',\n SolarPanelArrayLayoutGenerativeDesign: 'Розташування сонячних панелей: генеративний дизайн',\n SolarPanelArrayModel: 'Модель сонячної панелі',\n SolarPanelArrayOrientation: 'Орієнтація',\n SolarPanelArrayTiltAngle: 'Кут нахилу',\n SolarPanelArrayRowWidth: 'Ширина ряду',\n SolarPanelArrayInterRowSpacing: 'Міжрядковий інтервал',\n SolarPanelArrayRowSpacing: 'Row Spacing',\n SolarPanelArrayRowAxis: 'Вісь ряду',\n SolarPanelArrayLeftRightRowAxis: 'Наліво-Направо (відносне)',\n SolarPanelArrayUpDownRowAxis: 'Вгору-Вниз (відносне)',\n SolarPanelArrayEastWestRowAxis: 'Схід-Захід (абсолютне)',\n SolarPanelArrayNorthSouthRowAxis: 'Північ-Південь (абсолютне)',\n SolarPanelArrayMargin: 'Відступ',\n SolarPanelArrayPoleHeight: 'Висота стовпа',\n SolarPanelArrayPoleSpacing: 'Інтервал між стовпами',\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\n SolarPanelArrayYearlyProfit: 'Profit',\n LayoutNotAcceptedCheckYourParameters: 'Це розташування не приймається. Будь ласка, перевірте ваші параметри.',\n },\n\n optimizationMenu: {\n Optimization: 'Оптимізація',\n Parameters: 'Параметри',\n Variables: 'Змінні',\n Constants: 'Константи',\n GeneticAlgorithm: 'Генетичний алгоритм',\n GeneticAlgorithmSettings: 'Налаштування генетичного алгоритму',\n ParticleSwarmOptimization: 'Оптимізація роєм частинок',\n ParticleSwarmOptimizationSettings: 'Налаштування оптимізації роєм частинок',\n SolarPanelTiltAngleOptimization: 'Оптимізація кута нахилу сонячних панелей',\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\n Generation: 'Покоління',\n Gene: 'Ген',\n NormalizedVariables: 'Нормалізовані змінні',\n Objective: 'Ціль',\n ObjectiveFunctionDailyTotalYield: 'Щоденний загальний дохід',\n ObjectiveFunctionYearlyTotalYield: 'Щорічний загальний дохід',\n ObjectiveFunctionDailyMeanYield: 'Щоденний середній дохід',\n ObjectiveFunctionYearlyMeanYield: 'Щорічний середній дохід',\n ObjectiveFunctionDailyProfit: 'Щоденний прибуток',\n ObjectiveFunctionYearlyProfit: 'Щорічний прибуток',\n GeneticAlgorithmSelectionMethod: 'Метод вибору для генетичного алгоритму',\n RouletteWheel: 'Велосипедне колесо',\n Tournament: 'Турнір',\n SearchMethod: 'Метод пошуку',\n GlobalSearchUniformSelection: 'Глобальний пошук з однорідним вибором',\n LocalSearchRandomOptimization: 'Локальний пошук випадкової оптимізації',\n PopulationSize: 'Розмір населення',\n MaximumGenerations: 'Максимальна кількість поколінь',\n SelectionRate: 'Швидкість відбору',\n CrossoverRate: 'Швидкість схрещування',\n MutationRate: 'Швидкість мутації',\n Step: 'Крок',\n SwarmSize: 'Розмір рою',\n MaximumSteps: 'Максимальна кількість кроків',\n MaximumVelocity: 'Максимальна швидкість',\n InertiaWeight: 'Вага інерції',\n CognitiveCoefficient: 'Коефіцієнт когнітивної функції',\n SocialCoefficient: 'Коефіцієнт соціальної взаємодії',\n ConvergenceThreshold: 'Поріг збіжності для завершення',\n LocalSearchRadius: 'Радіус локального пошуку',\n RowsPerRackRange: 'Діапазон для рядів на стелаж',\n TiltAngleRange: 'Діапазон для кута нахилу',\n InterRowSpacingRange: 'Діапазон для міжрядкового проміжку',\n ClickTargetPolygonToActivate: 'Натисніть на цільовий полігон для активації',\n ClickTargetFoundationToActivate: 'Натисніть на цільовий фундамент для активації',\n },\n\n treeMenu: {\n ShowModel: 'Показати модель',\n Flip: 'Перевернути',\n Type: 'Тип',\n Spread: 'Розповсюдження',\n },\n\n flowerMenu: {\n Flip: 'Перевернути',\n Type: 'Тип',\n Spread: 'Розповсюдження',\n },\n\n peopleMenu: {\n ChangePerson: 'Змінити особу',\n Flip: 'Перевернути',\n Observer: 'Спостерігач',\n ViewFromThisPerson: 'Переглянути з цієї особи',\n },\n\n lightMenu: {\n Color: 'Колір',\n Intensity: 'Інтенсивність',\n Decay: 'Затухання',\n MaximumDistance: 'Максимальна відстань',\n Inside: 'Усередині',\n },\n\n solarCollectorMenu: {\n RelativeAzimuth: 'Відносний азимут',\n Pole: 'Стовп',\n PoleHeight: 'Висота стовпа',\n PoleRadius: 'Pole Radius',\n ExtraPoleHeight: 'Додаткова висота стовпа',\n ExtraPoleHeightInAdditionToHalfWidth: 'Додаткова висота стовпа на додаток до половини ширини',\n DrawSunBeam: 'Намалювати промінь сонця',\n },\n\n concentratedSolarPowerCollectorMenu: {\n ReflectorReflectance: 'Відбивання відбивача',\n ReceiverAbsorptance: 'Поглинання приймача',\n ReflectorOpticalEfficiency: 'Оптична ефективність відбивача',\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\n },\n\n solarPanelMenu: {\n InverterEfficiency: 'Inverter Efficiency',\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\n ChangePvModel: 'Змінити модель',\n Orientation: 'Орієнтація',\n Portrait: 'Вертикальна',\n Landscape: 'Горизонтальна',\n FrameColor: 'Колір рамки',\n Panels: 'панелі',\n PanelsWide: 'панелі по ширині',\n PanelsLong: 'панелі по довжині',\n TiltAngle: 'Кут нахилу',\n SouthFacingIsPositive: 'Південь вважається позитивним',\n Tracker: 'Трекер',\n SolarTrackerFollowsSun: 'Трекер слідкує за сонцем для збільшення виходу сонячних панелей.',\n PoleSpacing: 'Відстань між стовпами',\n NoTracker: 'Без трекера',\n HorizontalSingleAxisTracker: 'Трекер з горизонтальною одноосевою орієнтацією',\n VerticalSingleAxisTracker: 'Трекер з вертикальною одноосевою орієнтацією',\n AltazimuthDualAxisTracker: 'Трекер з азимутально-альтазимутальною двоосевою орієнтацією',\n OnlyThisSolarPanel: 'Тільки ця сонячна панель',\n AllSolarPanelsOnSurface: 'Всі сонячні панелі на одній поверхні',\n AllSolarPanelsAboveFoundation: 'Всі сонячні панелі над однією фундаментом',\n AllSolarPanels: 'Всі сонячні панелі',\n },\n\n pvModelPanel: {\n SolarPanelSpecs: 'Технічні характеристики сонячної панелі',\n Model: 'Модель',\n PanelSize: 'Розмір панелі',\n Cells: 'Комірки',\n CellType: 'Тип комірок',\n Monocrystalline: 'Монокристалічні',\n Polycrystalline: 'Полікристалічні',\n ThinFilm: 'Тонкоплівкові',\n Bifacial: 'Bifacial',\n BifacialityFactor: 'Bifaciality Factor',\n Black: 'Чорний',\n Blue: 'Синій',\n ShadeTolerance: 'Стійкість до затінення',\n SolarCellEfficiency: 'Ефективність сонячної комірки',\n NominalOperatingCellTemperature: 'Номінальна робоча температура комірки',\n TemperatureCoefficientOfPmax: 'Температурний коефіцієнт Pmax',\n },\n\n parabolicTroughMenu: {\n ModuleLength: 'Довжина модуля',\n Modules: 'модулі',\n ModulesLong: 'модулів у довжину',\n LatusRectum: 'Велика піввісь',\n OnlyThisParabolicTrough: 'Тільки цей параболічний сонячний колектор',\n AllParabolicTroughsAboveFoundation: 'Усі параболічні сонячні колектори над цим фундаментом',\n AllParabolicTroughs: 'Усі параболічні сонячні колектори',\n },\n\n fresnelReflectorMenu: {\n AbsorberPipe: 'Труба поглинання',\n SelectAbsorberToReflectSunlightTo: 'Виберіть поглинач, до якого буде відбиватися сонячне світло',\n ModuleLength: 'Довжина модуля',\n Modules: 'модулі',\n ModulesLong: 'модулів у довжину',\n OnlyThisFresnelReflector: 'Тільки цей відбивач Френеля',\n AllFresnelReflectorsAboveFoundation: 'Усі відбивачі Френеля над цим фундаментом',\n AllFresnelReflectors: 'Усі відбивачі Френеля',\n },\n\n heliostatMenu: {\n Tower: 'Вежа',\n SelectTowerToReflectSunlightTo: 'Виберіть вежу, до якої буде відбиватися сонячне світло',\n OnlyThisHeliostat: 'Тільки цей геліостат',\n AllHeliostatsAboveFoundation: 'Усі геліостати над цим фундаментом',\n AllHeliostats: 'Усі геліостати',\n },\n\n parabolicDishMenu: {\n ReceiverStructure: 'Структура приймача',\n CentralPole: 'Центральний стовп',\n CentralPoleWithTripod: 'Центральний стовп з триногою',\n Quadrupod: 'Чотиринога',\n RimDiameter: 'Діаметр ободу',\n LatusRectum: 'Велика піввісь',\n ExtraPoleHeightInAdditionToRadius: 'Додаткова висота стовпа плюс радіус',\n OnlyThisParabolicDish: 'Тільки ця параболічна тарілка',\n AllParabolicDishesAboveFoundation: 'Усі параболічні тарілки над цим фундаментом',\n AllParabolicDishes: 'Усі параболічні тарілки',\n },\n\n wallMenu: {\n TextureDefault: 'Типова текстура',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n SizeOfWall: 'Розмір стіни',\n OnlyThisWall: 'Тільки ця стіна',\n AllConnectedWalls: \"Всі пов'язані стіни\",\n AllWallsAboveFoundation: 'Всі стіни над цим фундаментом',\n AllWalls: 'Всі стіни',\n Windows: 'Вікна',\n LockAllWindows: 'Заблокувати всі вікна',\n UnlockAllWindows: 'Розблокувати всі вікна',\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Ви дійсно бажаєте видалити всі вікна на цій стіні',\n Doors: 'Двері',\n RemoveAllUnlockedDoors: 'Видалити всі розблоковані двері',\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Ви дійсно бажаєте видалити всі двері на цій стіні',\n SolarPanels: 'Сонячні панелі',\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Ви дійсно бажаєте видалити всі сонячні панелі на цій стіні',\n Sensors: 'Датчики',\n LockAllSensors: 'Заблокувати всі датчики',\n UnlockAllSensors: 'Розблокувати всі датчики',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані датчики',\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Ви дійсно бажаєте видалити всі датчики на цій стіні',\n Lights: 'Лампи',\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Ви дійсно бажаєте видалити всі лампи на цій стіні',\n LockAllPolygons: 'Заблокувати всі полігони',\n UnlockAllPolygons: 'Розблокувати всі полігони',\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\n WallStructure: 'Структура стіни',\n DefaultStructure: 'Типова',\n StudStructure: 'Студ',\n PillarStructure: 'Пілар',\n Opacity: 'Непрозорість',\n StructureSpacing: 'Відстань між структурами',\n StructureWidth: 'Ширина структури',\n StructureThickness: 'Товщина структури',\n StructureColor: 'Колір структури',\n Color: 'Колір стіни',\n Height: 'Висота',\n Thickness: 'Товщина',\n Texture: 'Текстура',\n AllLightsOnWallInside: 'Всі лампи всередині стіни',\n AllLightsOnWallOutside: 'Всі лампи ззовні стіни',\n Fill: 'Заповнення',\n Full: 'Повне',\n Partial: 'Часткове',\n Empty: 'Порожнє',\n OpenToOutside: 'Відкрите на зовнішню сторону',\n EavesLength: 'Довжина карнизу',\n Parapet: 'Перила',\n ParapetColor: 'Колір перил',\n ParapetTexture: 'Текстура перил',\n ParapetHeight: 'Висота перил',\n CopingsHeight: 'Висота паркану',\n CopingsWidth: 'Ширина паркану',\n },\n\n windowMenu: {\n OnlyThisWindow: 'Тільки це вікно',\n AllWindowsOnSurface: 'All Windows on the Same Surface',\n AllWindowsAboveFoundation: 'Всі вікна над однією фундаментом',\n AllWindows: 'Всі вікна',\n Width: 'Ширина',\n Height: 'Висота',\n Mullion: 'Розділовий стовпець',\n MullionWidth: 'Ширина розділового стовпця',\n MullionSpacing: 'Відстань між розділовими стовпцями',\n MullionColor: 'Колір розділового стовпця',\n Tint: 'Відтінок',\n Opacity: 'Непрозорість',\n SolarHeatGainCoefficient: 'Коефіцієнт сонячного теплового навантаження (SHGC) = 1 - непрозорість',\n Shutter: 'Жалюзі',\n LeftShutter: 'Ліве жалюзі',\n RightShutter: 'Праве жалюзі',\n BothShutters: 'Обидві жалюзі',\n ShutterWidth: 'Відносна ширина',\n ShutterColor: 'Колір жалюзі',\n Frame: 'Рамка',\n FrameWidth: 'Ширина рамки',\n SillWidth: 'Ширина підвіконня',\n Color: 'Колір рамки',\n WindowType: 'Тип вікна',\n Default: 'Типове',\n Arched: 'Аркове',\n Polygonal: 'Багатокутне',\n Interior: \"Інтер'єр\",\n Empty: 'Порожнє',\n },\n\n roofMenu: {\n TextureDefault: 'Типове',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n OnlyThisRoof: 'Тільки цей дах',\n AllRoofsAboveFoundation: 'Всі дахи над одним фундаментом',\n AllRoofs: 'Всі дахи',\n OnlyThisCeiling: 'Тільки ця стеля',\n AllCeilingsAboveFoundation: 'Всі стелі над одним фундаментом',\n AllCeilings: 'Всі стелі',\n EavesOverhangLength: 'Довжина виступу карнизу',\n RafterSpacing: 'Відстань між стропилами',\n RafterWidth: 'Ширина стропила',\n RafterThickness: 'Товщина стропила',\n RafterColor: 'Колір стропила',\n RoofColor: 'Колір даху',\n RoofSideColor: 'Колір бокової частини даху',\n GlassTint: 'Колір скла',\n Opacity: 'Непрозорість',\n RoofStructure: 'Структура даху',\n DefaultStructure: 'Типова',\n RafterStructure: 'Стропило',\n GlassStructure: 'Скло',\n SolarPanels: 'Сонячні панелі',\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому даху',\n Windows: 'Вікна',\n LockAllWindows: 'Заблокувати всі вікна',\n UnlockAllWindows: 'Розблокувати всі вікна',\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Ви дійсно бажаєте видалити всі вікна на цьому даху',\n Sensors: 'Сенсори',\n LockAllSensors: 'Заблокувати всі сенсори',\n UnlockAllSensors: 'Розблокувати всі сенсори',\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Ви дійсно бажаєте видалити всі сенсори на цьому даху',\n Lights: 'Лампи',\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Ви дійсно бажаєте видалити всі лампи на цьому даху',\n AllLightsOnRoofInside: 'Всі лампи на даху всередині',\n AllLightsOnRoofOutside: 'Всі лампи на даху ззовні',\n Rise: 'Піднімання',\n Ceiling: 'Стеля',\n RoofRValue: 'Значення R для даху',\n CeilingRValue: 'Значення R для стелі',\n },\n\n doorMenu: {\n TextureDefault: 'За замовчуванням',\n Texture01: 'Текстура 1',\n Texture02: 'Текстура 2',\n Texture03: 'Текстура 3',\n Texture04: 'Текстура 4',\n Texture05: 'Текстура 5',\n Texture06: 'Текстура 6',\n Texture07: 'Текстура 7',\n Texture08: 'Текстура 8',\n Texture09: 'Текстура 9',\n Texture10: 'Текстура 10',\n Texture11: 'Текстура 11',\n Texture12: 'Текстура 12',\n Texture13: 'Текстура 13',\n Texture14: 'Текстура 14',\n Texture15: 'Текстура 15',\n Texture16: 'Текстура 16',\n Texture17: 'Текстура 17',\n OnlyThisDoor: 'Тільки ці двері',\n AllDoorsOnWall: 'Всі двері на цій стіні',\n AllDoorsAboveFoundation: 'Всі двері над тим самим фундаментом',\n AllDoors: 'Всі двері',\n DoorType: 'Тип дверей',\n Default: 'За замовчуванням',\n Arched: 'Аркові',\n Filled: 'Заповнені',\n FrameColor: 'Колір рамки',\n Interior: \"Інтер'єр\",\n },\n\n siteInfoPanel: {\n High: 'Високо',\n Low: 'Низько',\n },\n\n designInfoPanel: {\n NumberOfSelectedHeliostats: 'Кількість вибраних геліостатів',\n NumberOfSelectedSolarPanels: 'Кількість вибраних сонячних панелей',\n ElectricityGeneratedDailyBySolarPanels: 'Електрика, що генерується щоденно цими сонячними панелями',\n SceneDiameter: 'Діаметр сцени',\n BuildingArea: 'Площа будівлі',\n },\n\n visualizationControlPanel: {\n ColorContrast: 'Контраст кольору',\n FluxScale: 'Шкала потоку',\n ClickUpOrDownArrowButtonsToChange: 'Натисніть кнопки зі стрілками вгору або вниз щоб змінити',\n },\n\n instructionPanel: {\n Rotate: 'Повернути',\n DragMouse: 'Перетягніть мишею',\n Zoom: 'Масштабування',\n MouseWheelOrKeys: 'Обертайте колесо миші або натисніть Ctrl+[ або Ctrl+]',\n MouseWheelOrKeysMac: 'Обертайте колесо миші або натисніть ⌘+[ або ⌘+]',\n Pan: 'Переміщення',\n HoldCtrlDragMouse: 'Натисніть і утримуйте Ctrl, перетягніть мишею',\n HoldMetaDragMouse: 'Натисніть і утримуйте ⌘, перетягніть мишею',\n Enter2DMode: 'Enter 2D mode',\n Exit2DMode: 'Exit 2D mode',\n EnableNavigation: 'Enable navigation',\n DisableNavigation: 'Disable navigation',\n Move: 'Move',\n MoveInstruction: 'Press W/A/S/D/Z/X keys',\n Turn: 'Turn',\n TurnInstruction: 'Press arrow keys',\n ResetView: 'Скинути',\n AutoRotate: 'Автоматичний поворот',\n StartOrStop: 'Натисніть F4, щоб почати або зупинити',\n },\n\n mapPanel: {\n ImageOnGround: 'Зображення на землі',\n WeatherStations: 'Метеостанції',\n WeatherStationsNote: 'Вимкніть це, щоб прискорити',\n Coordinates: 'Координати',\n Zoom: 'Масштабування',\n },\n\n visibilityPanel: {\n SolarPanelVisibility: 'Видимість сонячних панелей',\n Observer: 'Спостерігач',\n VantagePoint: 'Точка огляду',\n ItemizedVisibilityByFields: 'Розгорнутий за полями',\n TotalVisibility: 'Загальна видимість',\n },\n\n sensorPanel: {\n LightSensor: 'Датчик освітленості',\n WeatherDataFrom: 'Метеодані з',\n },\n\n buildingEnergyPanel: {\n DailyBuildingEnergy: 'Щоденна енергія будівлі',\n YearlyBuildingEnergy: 'Річна енергія будівлі',\n Heater: 'Обігрівач',\n AC: 'Кондиціонер',\n SolarPanel: 'Сонячна панель',\n Net: 'Всього',\n },\n\n solarPanelYieldPanel: {\n SolarPanelDailyYield: 'Щоденний дохід сонячних панелей',\n SolarPanelYearlyYield: 'Річний дохід сонячних панелей',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualSolarPanels: 'Показати дохід окремих сонячних панелей',\n Profit: 'Прибуток',\n TotalCost: 'Total Cost',\n TotalRevenue: 'Total Revenue',\n TotalYield: 'Total Yield',\n MeanYield: 'Mean Yield',\n ModuleCount: 'Module Count',\n },\n\n parabolicTroughYieldPanel: {\n ParabolicTroughDailyYield: 'Щоденний дохід параболічних сонячних колекторів',\n ParabolicTroughYearlyYield: 'Річний дохід параболічних сонячних колекторів',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualParabolicTroughs: 'Показати дохід окремих параболічних сонячних колекторів',\n },\n\n parabolicDishYieldPanel: {\n ParabolicDishDailyYield: 'Щоденний дохід параболічних тарілок',\n ParabolicDishYearlyYield: 'Річний дохід параболічних тарілок',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualParabolicDishes: 'Показати дохід окремих параболічних тарілок',\n },\n\n fresnelReflectorYieldPanel: {\n FresnelReflectorDailyYield: 'Щоденний дохід відбивача Френеля',\n FresnelReflectorYearlyYield: 'Річний дохід відбивача Френеля',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualFresnelReflectors: 'Показати дохід окремих відбивачів Френеля',\n },\n\n heliostatYieldPanel: {\n HeliostatDailyYield: 'Щоденний дохід геліостату',\n HeliostatYearlyYield: 'Річний дохід геліостату',\n Yield: 'Дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualHeliostats: 'Показати дохід окремих геліостатів',\n },\n\n updraftTowerYieldPanel: {\n UpdraftTowerDailyYield: 'Щоденний дохід сонячної вежі',\n UpdraftTowerYearlyYield: 'Річний дохід сонячної вежі',\n ChimneyAirTemperature: 'Температура повітря у димовій трубі',\n ChimneyWindSpeed: 'Швидкість вітру у димовій трубі',\n Yield: 'дохід',\n YieldPerHour: 'Дохід за годину',\n DailyTotal: 'Щоденний загальний',\n YearlyTotal: 'Річний загальний',\n ShowOutputsOfIndividualUpdraftTowers: 'Показати дохід окремих сонячних веж',\n },\n\n heliodonPanel: {\n SunAndTimeSettings: 'Налаштування Сонця та Часу',\n SunAngles: 'Кути Сонця',\n TwentyFourHours: '24 Години',\n },\n\n cloudFilePanel: {\n SearchByTitle: 'Пошук за назвою',\n MyLikes: 'Мої вподобання',\n MyCloudFiles: 'Мої файли у хмарному середовищі',\n GenerateLink: 'Створити посилання',\n LinkGeneratedInClipBoard: 'Посилання було створено та скопійовано до буферу обміну',\n DoYouReallyWantToDelete: 'Ви дійсно бажаєте видалити',\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\n 'Якщо цей файл було відкрито або опубліковано, зміна його назви порушить наявні посилання',\n },\n\n projectListPanel: {\n SearchByTitle: 'Пошук за назвою',\n MyProjects: 'My Projects',\n GenerateProjectLink: 'Generate Project Link',\n ProjectLinkGeneratedInClipBoard: 'A link to the project has been generated in the clip board',\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\n 'If this project has been shared or published, renaming it breaks existing links',\n },\n\n projectPanel: {\n ProjectSettings: 'Project Settings',\n ThumbnailImageSize: 'Thumbnail Image Size',\n ProjectByOtherPeople: 'Project by Other People',\n Project: 'Project',\n ProjectType: 'Тип проєкту',\n ProjectDescription: 'Description',\n MakeDescriptionEditable: 'Make this description editable',\n MakeDescriptionNonEditable: 'Make this description non-editable',\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\n SolarPanelArray: 'Solar Panel Array',\n CurateCurrentDesign: 'Curate current design',\n UpdateSelectedDesign: 'Update selected design',\n RemoveSelectedDesign: 'Remove selected design',\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\n ChooseSolutionSpace: 'Choose solution space',\n ChooseDataColoring: 'Choose data coloring',\n SameColorForAllDesigns: 'Same color for all designs',\n OneColorForEachDesign: 'One color for each design',\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\n GenerateScatteredPlot: 'Generate Scattered Plot',\n SelectXAxis: 'Select X Axis',\n SelectYAxis: 'Select Y Axis',\n },\n\n accountSettingsPanel: {\n MyAccountSettings: 'Мої налаштування облікового запису',\n MyID: 'Моє 🆔',\n ClickToCopyMyID: 'Натисніть, щоб скопіювати моє ID',\n IDInClipBoard: 'Ваш ID було скопійоване і готове для вставки.',\n StoreMyNameInMyFilesWhenSaving: \"Зберігати моє ім'я в моїх файлах при збереженні\",\n DoYouReallyWantToShowYourNameInYourFiles: \"Ви дійсно бажаєте відображати ваше ім'я в файлах?\",\n SignFileDisclaimer: \"Якщо так, ваше ім'я зможе бачити будь-хто, хто матиме доступ до ваших файлів.\",\n Likes: 'Вподобання',\n AllPublished: 'Усі опубліковані',\n PublishedUnderAliases: 'Псевдоніми',\n UserCount: 'Кількість користувачів',\n SchoolID: 'ID Школи',\n ClassID: 'ID Класу',\n },\n\n weatherPanel: {\n SunshineHours: 'Сонячні години',\n },\n\n diurnalTemperaturePanel: {\n SelectAirTemperatureModel: 'Виберіть модель повітряної температури',\n Sinusoidal: 'Синусоїдальна',\n },\n\n economicsPanel: {\n EconomicsParameters: 'Параметри економіки',\n ElectricitySellingPrice: 'Ціна продажу електроенергії',\n OperationalCostPerUnit: 'Операційні витрати за одиницю',\n SellingPrice: 'Selling Price',\n UnitCost: 'Unit Cost',\n },\n\n navigationPanel: {\n NavigationParameters: 'Navigation Parameters',\n MinimumMoveSpeed: 'Minimum Move Speed',\n MinimumTurnSpeed: 'Minimum Turn Speed',\n },\n\n yearlyLightSensorPanel: {\n SkyClearness: 'Ясність неба',\n ShowDaylightResults: 'Показати результати денного освітлення',\n ShowSkyClearnessResults: 'Показати результати ясності неба',\n ShowAverageDailySolarRadiation: 'Показати середню щоденну сонячну радіацію',\n },\n\n analysisManager: {\n NoSensorForCollectingData: 'Немає датчика для збору даних.',\n NoSolarPanelForAnalysis: 'Немає сонячної панелі для аналізу.',\n NoObserverForVisibilityAnalysis: 'Немає спостерігача для аналізу видимості.',\n NoWaterHeaterForAnalysis: 'Немає водонагрівача для аналізу.',\n NoParabolicDishForAnalysis: 'Немає параболічної тарілки для аналізу.',\n NoParabolicTroughForAnalysis: 'Немає параболічного сонячного колектора для аналізу.',\n NoFresnelReflectorForAnalysis: 'Немає відбивача Френеля для аналізу.',\n NoHeliostatForAnalysis: 'Немає геліостата для аналізу.',\n NoSolarUpdraftTowerForAnalysis: 'Немає сонячної вежі для аналізу.',\n NoBuildingForAnalysis: 'Немає будівлі для аналізу.',\n },\n\n toolbar: {\n CloudFile: 'Хмарний файл',\n Select: 'Вибрати',\n AddFoundation: 'Додати фундамент',\n AddWall: 'Додати стіну',\n AddWindow: 'Додати вікно',\n AddDoor: 'Додати двері',\n AddPyramidRoof: 'Додати пірамідальний дах',\n AddGableRoof: 'Додати шатровий дах',\n AddHipRoof: 'Додати чотирихилий дах',\n AddGambrelRoof: 'Додати двосхилий дах',\n AddMansardRoof: 'Додати мансардний дах',\n AddCuboid: 'Додати прямокутний паралелепіпед',\n AddSensor: 'Додати датчик',\n AddSolarPanel: 'Додати сонячну панель',\n AddWaterHeater: 'Додати водонагрівач',\n AddParabolicDish: 'Додати параболічну тарілку',\n AddParabolicTrough: 'Додати параболічний сонячний колектор',\n AddFresnelReflector: 'Додати відбивач Френеля',\n AddHeliostat: 'Додати геліостат',\n AddWindTurbine: 'Додати вітрогенератор',\n AddLight: 'Додати світло',\n AddTree: 'Додати дерево',\n AddFlower: 'Додати квітку',\n AddPeople: 'Додати людей',\n DoubleClickToLockThisModeForNextAction: 'Подвійне клацання, щоб заблокувати цей режим для наступної дії',\n ClickToUnlockThisModeForNextAction: 'Клацніть, щоб розблокувати цей режим для наступної дії',\n ManipulateGroup: 'Маніпулювати групою',\n ClearScene: 'Очистити сцену',\n ShowSunAndTimeSettings: 'Показати налаштування Сонця та Часу',\n SpatialAnalysisOfEnergy: 'Просторовий аналіз енергії',\n DoYouReallyWantToClearContent: 'Ви дійсно бажаєте очистити вміст',\n ClickForMoreButtons: 'Натисніть для додаткових кнопок',\n SwitchToAddingFoundation: 'Переключитися на додавання фундаменту',\n SwitchToAddingCuboid: 'Переключитися на додавання прямокутного паралелепіпеду',\n SwitchToAddingWall: 'Переключитися на додавання стіни',\n SwitchToAddingWindow: 'Переключитися на додавання вікна',\n SwitchToAddingDoor: 'Переключитися на додавання дверей',\n SwitchToAddingPyramidRoof: 'Переключитися на додавання пірамідального даху',\n SwitchToAddingGableRoof: 'Переключитися на додавання шатрового даху',\n SwitchToAddingHipRoof: 'Переключитися на додавання чотирихилий даху',\n SwitchToAddingGambrelRoof: 'Переключитися на додавання двосхилий даху',\n SwitchToAddingMansardRoof: 'Переключитися на додавання мансардного даху',\n SwitchToAddingSolarPanel: 'Переключитися на додавання сонячної панелі',\n SwitchToAddingSensor: 'Переключитися на додавання датчика',\n SwitchToAddingWaterHeater: 'Переключитися на додавання водонагрівача',\n SwitchToAddingParabolicDish: 'Переключитися на додавання параболічної тарілки',\n SwitchToAddingParabolicTrough: 'Переключитися на додавання параболічного сонячного колектора',\n SwitchToAddingFresnelReflector: 'Переключитися на додавання відбивача Френеля',\n SwitchToAddingHeliostat: 'Переключитися на додавання геліостата',\n SwitchToAddingWindTurbine: 'Переключитися на додавання вітрогенератора',\n SwitchToAddingLight: 'Переключитися на додавання освітлення',\n SwitchToAddingTree: 'Переключитися на додавання дерева',\n SwitchToAddingFlower: 'Переключитися на додавання квітки',\n SwitchToAddingPeople: 'Переключитися на додавання людей',\n },\n\n tooltip: {\n gotoIFI: 'Перейти до Інституту Інтелекту Майбутнього',\n visitAladdinHomePage: 'Відвідати домашню сторінку Aladdin',\n clickToOpenMenu: 'Натисність, щоб відкрити Головне Меню',\n clickToAccessCloudTools: 'Натисність, щоб отримати доступ до хмарних інструментів',\n },\n\n tree: {\n Apple: 'Яблуня',\n Birch: 'Береза',\n Coconut: 'Кокос',\n Dogwood: 'Дерен',\n Elm: \"В'яз\",\n FanPalm: 'Віяльна пальма',\n Linden: 'Липа',\n Magnolia: 'Магнолія',\n Maple: 'Клен',\n Oak: 'Дуб',\n Pine: 'Сосна',\n Spruce: 'Ялина',\n },\n\n flower: {\n Bellflower: 'Дзвоник',\n Boxwood: 'Самшит',\n CactusCombo1: 'Кактус Комбо 1',\n CactusCombo2: 'Кактус Комбо 2',\n CactusCombo3: 'Кактус Комбо 3',\n CactusCombo4: 'Кактус Комбо 4',\n Hibiscus: 'Гібіскус',\n Hosta: 'Госта',\n Hydrangea: 'Гортензія',\n Peony: 'Півонія',\n RedRose: 'Червона троянда',\n Spirea: 'Спірея',\n Sunflower: 'Соняшник',\n TallBush: 'Високий кущ',\n Tulip: 'Тюльпан',\n WhiteFlower: 'Біла квітка',\n YellowFlower: 'Жовта квітка',\n },\n\n people: {\n Jaah: 'Артем',\n Jack: 'Віталій',\n Jacob: 'Ярослав',\n Jacqueline: 'Олена',\n Jade: 'Ольга',\n Jamelia: 'Олександра',\n James: 'Андрій',\n Jane: 'Вікторія',\n Jaya: 'Ірина',\n Jaye: 'Назар',\n Jeanette: 'Соломія',\n Jedi: 'Євген',\n Jeff: 'Павло',\n Jena: 'Любов',\n Jennifer: 'Тетяна',\n Jess: 'Злата',\n Jett: 'Сергій',\n Jill: 'Надія',\n Jiya: 'Марина',\n Joan: 'Іванна',\n Jocelyn: 'Анастасія',\n Joel: 'Володимир',\n Joey: 'Вероніка',\n John: 'Іван',\n Jonathon: 'Петро',\n Jose: 'Микита',\n Joseph: 'Віктор',\n Joshua: 'Михайло',\n Judd: 'Владислав',\n Judy: 'Марія',\n Julia: 'Юлія',\n Julio: 'Дмитро',\n Jumapili: 'Марта',\n June: 'Анна',\n Juro: 'Юрій',\n Justin: 'Богдан',\n },\n\n compass: {\n N: 'N',\n S: 'S',\n W: 'W',\n E: 'E',\n },\n\n month: {\n January: 'Jan',\n February: 'Feb',\n March: 'Mar',\n April: 'Apr',\n May: 'May',\n June: 'Jun',\n July: 'Jul',\n August: 'Aug',\n September: 'Sep',\n October: 'Oct',\n November: 'Nov',\n December: 'Dec',\n },\n\n modelsMap: {\n SearchByPublisher: 'Пошук за виробником',\n SearchByLabel: 'Пошук за міткою',\n MyPublishedModels: 'Мої опубліковані моделі',\n TotalNumberOfUserPublishedModels: 'Загальна кількість моделей, опублікованих користувачами',\n SortFromOldestToNewest: 'Сортувати від найдавніших до найновіших',\n SortFromNewestToOldest: 'Сортувати від найновіших до найдавніших',\n ModelsFoundOnThisSite: 'моделей знайдено на цьому сайті',\n ShowModelsPublishedByThisAuthor: 'Показати моделі, опубліковані цим автором',\n },\n },\n};\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { extend, Object3DNode } from '@react-three/fiber';\nimport TextSprite from 'three-spritetext';\nimport { MyOrbitControls } from './js/MyOrbitControls';\nimport { ParabolicCylinderGeometry } from './js/ParabolicCylinderGeometry';\nimport { ParaboloidGeometry } from './js/ParaboloidGeometry';\nimport { ConvexGeometry } from './js/ConvexGeometry';\nimport { Vector2 } from 'three';\n\n// Extend makes these JSX elements (with the first character lower-cased)\nextend({ TextSprite });\nextend({ MyOrbitControls });\nextend({ ParabolicCylinderGeometry });\nextend({ ParaboloidGeometry });\nextend({ ConvexGeometry });\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n textSprite: Object3DNode;\n myOrbitControls: Object3DNode;\n parabolicCylinderGeometry: Object3DNode;\n paraboloidGeometry: Object3DNode;\n convexGeometry: Object3DNode;\n }\n }\n}\n\nexport interface User {\n displayName: string | null;\n email: string | null;\n photoURL: string | null;\n uid: string | null;\n signFile: boolean;\n noLogging: boolean;\n schoolID: SchoolID;\n classID: ClassID;\n likes?: string[];\n published?: string[];\n aliases?: string[];\n}\n\nexport enum FirebaseName {\n FILES = 'Files',\n LOG_DATA = 'Log Data',\n}\n\nexport interface ModelSite {\n userid: string;\n title: string;\n latitude: number;\n longitude: number;\n address?: string;\n countryCode?: string;\n type?: string;\n author?: string;\n label?: string;\n description?: string;\n likeCount?: number;\n clickCount?: number;\n timeCreated?: number;\n pinned?: boolean;\n thumbnailUrl?: string;\n hashtags?: string;\n}\n\nexport interface Design {\n timestamp: number;\n title: string;\n thumbnail: string; // PNG Base64 data\n [key: string]: any;\n}\n\nexport enum SchoolID {\n UNKNOWN = 'UNKNOWN SCHOOL',\n SCHOOL1 = 'SCHOOL 1',\n SCHOOL2 = 'SCHOOL 2',\n SCHOOL3 = 'SCHOOL 3',\n SCHOOL4 = 'SCHOOL 4',\n SCHOOL5 = 'SCHOOL 5',\n}\n\nexport enum ClassID {\n UNKNOWN = 'UNKNOWN CLASS',\n CLASS1 = 'CLASS 1',\n CLASS2 = 'CLASS 2',\n CLASS3 = 'CLASS 3',\n CLASS4 = 'CLASS 4',\n CLASS5 = 'CLASS 5',\n CLASS6 = 'CLASS 6',\n CLASS7 = 'CLASS 7',\n CLASS8 = 'CLASS 8',\n CLASS9 = 'CLASS 9',\n}\n\nexport interface CloudFileInfo {\n readonly timestamp: number;\n readonly fileName: string;\n readonly uuid: string;\n readonly userid: string;\n}\n\nexport enum DataColoring {\n ALL = 0,\n INDIVIDUALS = 1,\n GROUPS = 2,\n}\n\nexport interface Range {\n variable: string;\n minimum: number;\n maximum: number;\n}\n\n// use null for undefined, as we need to persist this in Firebase\nexport interface ProjectInfo {\n owner: string | null;\n timestamp: number;\n title: string | null;\n description: string | null;\n type: DesignProblem;\n designs: Design[] | null;\n ranges: Range[] | null;\n hiddenParameters: string[] | null;\n counter: number;\n dataColoring: DataColoring;\n selectedProperty: string | null;\n sortDescending: boolean | null;\n xAxisNameScatteredPlot: string | null;\n yAxisNameScatteredPlot: string | null;\n dotSizeScatteredPlot: number | null;\n thumbnailWidth: number | null;\n}\n\nexport interface ActionInfo {\n readonly timestamp: number;\n readonly name: string;\n readonly elementId?: string;\n readonly elementType?: ObjectType;\n readonly result?: any;\n readonly details?: any;\n readonly steps?: number;\n}\n\nexport enum ModelType {\n UNKNOWN = 'Unknown',\n UNDER_CONSTRUCTION = 'Under Construction',\n RESIDENTIAL_BUILDING = 'Residential Building',\n COMMERCIAL_BUILDING = 'Commercial Building',\n SCHOOL_BUILDING = 'School Building',\n TOURIST_ATTRACTION = 'Tourist Attraction',\n PHOTOVOLTAIC = 'Photovoltaic',\n PARABOLIC_DISH = 'Parabolic Dish',\n PARABOLIC_TROUGH = 'Parabolic Trough',\n FRESNEL_REFLECTOR = 'Fresnel Reflector',\n SOLAR_POWER_TOWER = 'Solar Power Tower',\n}\n\nexport enum BuildingCompletionStatus {\n COMPLETE,\n ROOF_MISSING,\n WALL_DISJOINED,\n WALL_EMPTY,\n}\n\nexport enum DesignProblem {\n SOLAR_PANEL_TILT_ANGLE = 'Solar Panel Tilt Angle',\n SOLAR_PANEL_ARRAY = 'Solar Panel Array',\n}\n\nexport enum ObjectiveFunctionType {\n DAILY_TOTAL_OUTPUT = 1,\n YEARLY_TOTAL_OUTPUT = 2,\n DAILY_AVERAGE_OUTPUT = 3,\n YEARLY_AVERAGE_OUTPUT = 4,\n DAILY_PROFIT = 5,\n YEARLY_PROFIT = 6,\n}\n\nexport enum EvolutionMethod {\n GENETIC_ALGORITHM = 1,\n PARTICLE_SWARM_OPTIMIZATION = 2,\n}\n\nexport enum GeneticAlgorithmSelectionMethod {\n ROULETTE_WHEEL = 1,\n TOURNAMENT = 2,\n}\n\nexport enum SearchMethod {\n GLOBAL_SEARCH_UNIFORM_SELECTION = 1,\n LOCAL_SEARCH_RANDOM_OPTIMIZATION = 2, // https://en.wikipedia.org/wiki/Random_optimization\n GLOBAL_SEARCH_FITNESS_SHARING = 3, // https://stackoverflow.com/questions/13775810/what-is-niching-scheme\n}\n\nexport enum LineStyle {\n Solid = 1,\n Dashed = 2,\n Dotted = 3,\n}\n\nexport enum LineWidth {\n One = 1,\n Two = 2,\n Three = 3,\n Four = 4,\n Five = 5,\n}\n\nexport interface DatumEntry {\n [key: string]: number | undefined | string | boolean;\n}\n\nexport interface EnergyUsage {\n heater: number;\n ac: number;\n solarPanel: number;\n geothermal: number;\n label?: string;\n}\n\nexport enum ChartType {\n Line = 1,\n Area = 2,\n}\n\nexport enum GraphDataType {\n HourlyTemperatures = 1,\n MonthlyTemperatures = 2,\n SunshineHours = 3,\n DaylightData = 4,\n ClearnessData = 5,\n YearlyRadiationSensorData = 6,\n DailyRadiationSensorData = 7,\n YearlyPvYield = 8,\n DailyPvYield = 9,\n YearlyParabolicTroughYield = 10,\n DailyParabolicTroughYield = 11,\n YearlyParabolicDishYield = 12,\n DailyParabolicDishYield = 13,\n YearlyFresnelReflectorYield = 14,\n DailyFresnelReflectorYield = 15,\n YearlyHeliostatYield = 16,\n DailyHeliostatYield = 17,\n YearlyUpdraftTowerYield = 18,\n DailyUpdraftTowerYield = 19,\n YearlyBuildingEnergy = 20,\n DailyBuildingEnergy = 21,\n}\n\nexport enum Theme {\n Default = 'Default',\n Desert = 'Desert',\n Dune = 'Dune',\n Forest = 'Forest',\n Grassland = 'Grassland',\n Hill = 'Hill',\n Lake = 'Lake',\n Mountain = 'Mountain',\n Rural = 'Rural',\n}\n\nexport enum DiurnalTemperatureModel {\n Sinusoidal = 1,\n PartonLogan = 2, // https://www.sciencedirect.com/science/article/abs/pii/0002157181901059\n}\n\nexport enum Language {\n English = 'English',\n ChineseSimplified = '简体中文',\n ChineseTraditional = '繁体中文',\n Turkish = 'Türkçe',\n Spanish = 'Español',\n Ukrainian = 'Українська',\n}\n\nexport enum ObjectType {\n Sky = 'Sky',\n Ground = 'Ground',\n Foundation = 'Foundation',\n Wall = 'Wall',\n Window = 'Window',\n Door = 'Door',\n Roof = 'Roof',\n PyramidRoof = 'Pyramid Roof',\n GableRoof = 'Gable Roof',\n HipRoof = 'Hip Roof',\n GambrelRoof = 'Gambrel Roof',\n MansardRoof = 'Mansard Roof',\n Sensor = 'Sensor',\n SolarPanel = 'Solar Panel',\n WaterHeater = 'Water Heater',\n ParabolicDish = 'Parabolic Dish',\n ParabolicTrough = 'Parabolic Trough',\n FresnelReflector = 'Fresnel Reflector',\n Heliostat = 'Heliostat',\n WindTurbine = 'Wind Turbine',\n Cuboid = 'Cuboid',\n Human = 'Human',\n Tree = 'Tree',\n Flower = 'Flower',\n Polygon = 'Polygon',\n PolygonVertex = 'Polygon Vertex',\n Light = 'Light',\n None = 'None',\n}\n\nexport enum ParabolicDishStructureType {\n CentralPole = 1,\n CentralPoleWithTripod = 2,\n Quadrupod = 3,\n}\n\nexport enum SolarStructure {\n None = 0,\n FocusPipe = 1,\n FocusTower = 2,\n UpdraftTower = 3,\n}\n\nexport enum ActionType {\n Select = 'Select',\n Move = 'Move',\n Resize = 'Resize',\n Rotate = 'Rotate',\n}\n\nexport enum MoveHandleType {\n Default = 'Move Handle', // used when there is only one handle for moving\n Lower = 'Move Handle Lower',\n Upper = 'Move Handle Upper',\n Left = 'Move Handle Left',\n Right = 'Move Handle Right',\n Top = 'Move Handle Top',\n Mid = 'Move Handle Mid',\n}\n\nexport enum ResizeHandleType {\n LowerLeft = 'Resize Handle Lower Left',\n UpperLeft = 'Resize Handle Upper Left',\n LowerRight = 'Resize Handle Lower Right',\n UpperRight = 'Resize Handle Upper Right',\n LowerLeftTop = 'Resize Handle Lower Left Top',\n UpperLeftTop = 'Resize Handle Upper Left Top',\n LowerRightTop = 'Resize Handle Lower Right Top',\n UpperRightTop = 'Resize Handle Upper Right Top',\n Lower = 'Resize Handle Lower',\n Upper = 'Resize Handle Upper',\n Left = 'Resize Handle Left',\n Right = 'Resize Handle Right',\n Top = 'Resize Handle Top',\n Default = 'Resize Handle', // used for resizing a polygon\n Arch = 'Resize Handle Arch',\n WallPartialResizeLeft = 'Wall Partial Resize Handle Left',\n WallPartialResizeRight = 'Wall Partial Resize Handle Right',\n WallPartialResizeLeftTop = 'Wall Partial Resize Handle Left Top',\n WallPartialResizeRightTop = 'Wall Partial Resize Handle Right Top',\n}\n\nexport enum RotateHandleType {\n Lower = 'Rotate Handle Lower',\n Upper = 'Rotate Handle Upper',\n Tilt = 'Rotate Handle Tilt',\n}\n\nexport enum PolygonVertexAction {\n Delete = 'Delete Vertex',\n InsertBeforeIndex = 'Insert Vertex Before Index',\n InsertAfterIndex = 'Insert Vertex After Index',\n}\n\nexport enum IntersectionPlaneType {\n Horizontal = 'Horizontal',\n Vertical = 'Vertical',\n Ground = 'Ground',\n Sky = 'Sky',\n}\n\nexport enum Scope {\n OnlyThisObject = 1,\n AllObjectsOfThisTypeOnSurface = 2,\n AllObjectsOfThisTypeAboveFoundation = 3,\n AllObjectsOfThisType = 4,\n AllConnectedObjects = 5,\n OnlyThisSide = 6, // same wall\n}\n\nexport enum Orientation {\n portrait = 'Portrait',\n landscape = 'Landscape',\n}\n\nexport enum RowAxis {\n eastWest = 'East-West', // absolute\n northSouth = 'North-South', // absolute\n leftRight = 'Left-Right', // relative to the parent\n upDown = 'Up-Down', // relative to the parent\n}\n\nexport enum TrackerType {\n NO_TRACKER = 'None',\n HORIZONTAL_SINGLE_AXIS_TRACKER = 'HSAT',\n ALTAZIMUTH_DUAL_AXIS_TRACKER = 'AADAT',\n VERTICAL_SINGLE_AXIS_TRACKER = 'VSAT',\n TILTED_SINGLE_AXIS_TRACKER = 'TSAT',\n}\n\nexport enum ShadeTolerance {\n NONE = 'None',\n HIGH = 'High',\n PARTIAL = 'Partial',\n}\n\nexport enum Discretization {\n EXACT = 'Exact',\n APPROXIMATE = 'Approximate',\n}\n\nexport enum TreeType {\n Apple = 'Apple',\n Birch = 'Birch',\n Coconut = 'Coconut',\n Dogwood = 'Dogwood',\n Elm = 'Elm',\n FanPalm = 'Fan Palm',\n Linden = 'Linden',\n Magnolia = 'Magnolia',\n Maple = 'Maple',\n Oak = 'Oak',\n Pine = 'Pine',\n Spruce = 'Spruce',\n}\n\nexport enum FlowerType {\n Bellflower = 'Bellflower',\n Boxwood = 'Boxwood',\n CactusCombo1 = 'Cactus Combo 1',\n CactusCombo2 = 'Cactus Combo 2',\n CactusCombo3 = 'Cactus Combo 3',\n CactusCombo4 = 'Cactus Combo 4',\n Hibiscus = 'Hibiscus',\n Hosta = 'Hosta',\n Hydrangea = 'Hydrangea',\n Peony = 'Peony',\n RedRose = 'Red Rose',\n Spirea = 'Spirea',\n Sunflower = 'Sunflower',\n TallBush = 'Tall Bush',\n Tulip = 'Tulip',\n WhiteFlower = 'White Flower',\n YellowFlower = 'Yellow Flower',\n}\n\nexport enum Gender {\n Male = 'Male',\n Female = 'Female',\n Other = 'Other',\n}\n\nexport enum HumanName {\n Jaah = 'Jaah',\n Jack = 'Jack',\n Jacob = 'Jacob',\n Jacqueline = 'Jacqueline',\n Jade = 'Jade',\n Jamelia = 'Jamelia',\n James = 'James',\n Jane = 'Jane',\n Jaya = 'Jaya',\n Jaye = 'Jaye',\n Jeanette = 'Jeanette',\n Jedi = 'Jedi',\n Jeff = 'Jeff',\n Jena = 'Jena',\n Jennifer = 'Jennifer',\n Jess = 'Jess',\n Jett = 'Jett',\n Jill = 'Jill',\n Jiya = 'Jiya',\n Jocelyn = 'Jocelyn',\n Joan = 'Joan',\n Joel = 'Joel',\n Joey = 'Joey',\n John = 'John',\n Jonathon = 'Jonathon',\n Joseph = 'Joseph',\n Jose = 'Jose',\n Joshua = 'Joshua',\n Judd = 'Judd',\n Judy = 'Judy',\n Julia = 'Julia',\n Julio = 'Julio',\n Jumapili = 'Jumapili',\n June = 'June',\n Juro = 'Juro',\n Justin = 'Justin',\n}\n\nexport enum PolygonTexture {\n Texture01 = 'Polygon Texture #1',\n Texture02 = 'Polygon Texture #2',\n Texture03 = 'Polygon Texture #3',\n Texture04 = 'Polygon Texture #4',\n Texture05 = 'Polygon Texture #5',\n Texture06 = 'Polygon Texture #6',\n Texture07 = 'Polygon Texture #7',\n Texture08 = 'Polygon Texture #8',\n Texture09 = 'Polygon Texture #9',\n Texture10 = 'Polygon Texture #10',\n NoTexture = 'No Polygon Texture',\n}\n\nexport enum FoundationTexture {\n Texture01 = 'Foundation Texture #1',\n Texture02 = 'Foundation Texture #2',\n Texture03 = 'Foundation Texture #3',\n Texture04 = 'Foundation Texture #4',\n Texture05 = 'Foundation Texture #5',\n Texture06 = 'Foundation Texture #6',\n Texture07 = 'Foundation Texture #7',\n Texture08 = 'Foundation Texture #8',\n Texture09 = 'Foundation Texture #9',\n Texture10 = 'Foundation Texture #10',\n NoTexture = 'No Foundation Texture',\n}\n\nexport enum CuboidTexture {\n Facade01 = 'Facade #1',\n Facade02 = 'Facade #2',\n Facade03 = 'Facade #3',\n Facade04 = 'Facade #4',\n Facade05 = 'Facade #5',\n Facade06 = 'Facade #6',\n Facade07 = 'Facade #7',\n Facade08 = 'Facade #8',\n Facade09 = 'Facade #9',\n Facade10 = 'Facade #10',\n NoTexture = 'No Facade Texture',\n}\n\nexport enum WallTexture {\n Default = 'Wall Texture Default',\n Texture01 = 'Wall Texture #1',\n Texture02 = 'Wall Texture #2',\n Texture03 = 'Wall Texture #3',\n Texture04 = 'Wall Texture #4',\n Texture05 = 'Wall Texture #5',\n Texture06 = 'Wall Texture #6',\n Texture07 = 'Wall Texture #7',\n Texture08 = 'Wall Texture #8',\n Texture09 = 'Wall Texture #9',\n Texture10 = 'Wall Texture #10',\n NoTexture = 'No Wall Texture',\n}\n\nexport enum DoorTexture {\n Default = 'Door Texture Default',\n Texture01 = 'Door Texture #1',\n Texture02 = 'Door Texture #2',\n Texture03 = 'Door Texture #3',\n Texture04 = 'Door Texture #4',\n Texture05 = 'Door Texture #5',\n Texture06 = 'Door Texture #6',\n Texture07 = 'Door Texture #7',\n Texture08 = 'Door Texture #8',\n Texture09 = 'Door Texture #9',\n Texture10 = 'Door Texture #10',\n Texture11 = 'Door Texture #11',\n Texture12 = 'Door Texture #12',\n Texture13 = 'Door Texture #13',\n Texture14 = 'Door Texture #14',\n Texture15 = 'Door Texture #15',\n Texture16 = 'Door Texture #16',\n Texture17 = 'Door Texture #17',\n NoTexture = 'No Door Texture',\n}\n\nexport enum RoofTexture {\n Default = 'Roof Texture Default',\n Texture01 = 'Roof Texture #1',\n Texture02 = 'Roof Texture #2',\n Texture03 = 'Roof Texture #3',\n Texture04 = 'Roof Texture #4',\n Texture05 = 'Roof Texture #5',\n Texture06 = 'Roof Texture #6',\n Texture07 = 'Roof Texture #7',\n NoTexture = 'No Roof Texture',\n}\n\nexport enum WallSide {\n Left = 'Left',\n Right = 'Right',\n}\n\nexport enum ElementState {\n Valid = 'Valid',\n OverLap = 'OverLap',\n OutsideBoundary = 'OutsideBoundary',\n Invalid = 'Invalid',\n}\n\nexport type WallAbsPos = {\n leftPointAbsPos: Vector2;\n rightPointAbsPos: Vector2;\n centerPointAbsPos: Vector2;\n};\n\nexport enum RoofHandleType {\n Mid = 'Mid',\n Left = 'Left',\n Right = 'Right',\n TopMid = 'TopMid',\n TopLeft = 'TopLeft',\n TopRight = 'TopRight',\n FrontLeft = 'FrontLeft',\n FrontRight = 'FrontRight',\n BackLeft = 'BackLeft',\n BackRight = 'BackRight',\n Top = 'Top',\n Ridge = 'Ridge',\n Null = 'Null',\n}\n\nexport interface OldRooftopElementData {\n parentId: string;\n foundationId?: string;\n position: number[];\n rotation: number[];\n normal: number[];\n}\n\nexport type BoxArgs = [width?: number | undefined, height?: number | undefined, depth?: number | undefined];\n","export default __webpack_public_path__ + \"static/media/weather.dfa085ac.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 {\n Euler,\n EventDispatcher,\n MOUSE,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nclass MyOrbitControls extends EventDispatcher {\n\n constructor( object, domElement ) {\n\n super();\n\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = 'none'; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = - Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.moveSpeed = 1;\n this.turnSpeed = 1;\n this.keys = {\n MOVE_LEFT: 'KeyA',\n MOVE_RIGHT: 'KeyD',\n MOVE_FORWARD: 'KeyW',\n MOVE_BACKWARD: 'KeyS',\n MOVE_UP: 'KeyZ',\n MOVE_DOWN: 'KeyX',\n ROTATE_LEFT: 'ArrowLeft',\n ROTATE_UP: 'ArrowUp',\n ROTATE_RIGHT: 'ArrowRight',\n ROTATE_DOWN: 'ArrowDown'\n };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n\n return spherical.phi;\n\n };\n\n this.getAzimuthalAngle = function () {\n\n return spherical.theta;\n\n };\n\n this.getDistance = function () {\n\n return this.object.position.distanceTo( this.target );\n\n };\n\n this.listenToKeyEvents = function ( domElement ) {\n\n domElement.addEventListener( 'keydown', onKeyDown );\n this._domElementKeyEvents = domElement;\n\n reverse = false;\n oldZ = 0\n\n };\n\n this.removeKeyEvents = function () {\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n }\n\n this.saveState = function () {\n\n scope.target0.copy( scope.target );\n scope.position0.copy( scope.object.position );\n scope.zoom0 = scope.object.zoom;\n\n };\n\n this.reset = function () {\n\n scope.target.copy( scope.target0 );\n scope.object.position.copy( scope.position0 );\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent( _changeEvent );\n\n scope.update();\n\n state = STATE.NONE;\n\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = function () {\n\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n\n const position = scope.object.position;\n\n offset.copy( position ).sub( scope.target );\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion( quat );\n\n // angle from z-axis around y-axis\n spherical.setFromVector3( offset );\n\n if ( scope.autoRotate && state === STATE.NONE ) {\n\n rotateLeft( getAutoRotationAngle() );\n\n }\n\n if ( scope.enableDamping ) {\n\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n } else {\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if ( isFinite( min ) && isFinite( max ) ) {\n\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n if ( min <= max ) {\n\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n } else {\n\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n Math.max( min, spherical.theta ) :\n Math.min( max, spherical.theta );\n\n }\n\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n spherical.makeSafe();\n\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n // move target to panned location\n\n if ( scope.enableDamping === true ) {\n\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n } else {\n\n scope.target.add( panOffset );\n\n }\n\n offset.setFromSpherical( spherical );\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion( quatInverse );\n\n position.copy( scope.target ).add( offset );\n\n scope.object.lookAt( scope.target );\n\n if ( scope.enableDamping === true ) {\n\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n } else {\n\n sphericalDelta.set( 0, 0, 0 );\n\n panOffset.set( 0, 0, 0 );\n\n }\n\n scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if ( zoomChanged ||\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n scope.dispatchEvent( _changeEvent );\n\n lastPosition.copy( scope.object.position );\n lastQuaternion.copy( scope.object.quaternion );\n zoomChanged = false;\n\n return true;\n\n }\n\n return false;\n\n };\n\n }();\n\n this.dispose = function () {\n\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n };\n\n //\n // internals\n //\n\n const scope = this;\n\n const STATE = {\n NONE: - 1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n };\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const pointers = [];\n const pointerPositions = {};\n\n // navigation\n let reverse = false;\n let oldZ = 0;\n\n function getAutoRotationAngle() {\n\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n }\n\n function getZoomScale() {\n\n return Math.pow( 0.95, scope.zoomSpeed );\n\n }\n\n function rotateLeft( angle ) {\n\n sphericalDelta.theta -= angle;\n\n }\n\n function rotateUp( angle ) {\n\n sphericalDelta.phi -= angle;\n\n }\n\n const panLeft = function () {\n\n const v = new Vector3();\n\n return function panLeft( distance, objectMatrix ) {\n\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n v.multiplyScalar( - distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n const panUp = function () {\n\n const v = new Vector3();\n\n return function panUp( distance, objectMatrix ) {\n\n if ( scope.screenSpacePanning === true ) {\n\n v.setFromMatrixColumn( objectMatrix, 1 );\n\n } else {\n\n v.setFromMatrixColumn( objectMatrix, 0 );\n v.crossVectors( scope.object.up, v );\n\n }\n\n v.multiplyScalar( distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = function () {\n\n const offset = new Vector3();\n\n return function pan( deltaX, deltaY ) {\n\n const element = scope.domElement;\n\n if ( scope.object.isPerspectiveCamera ) {\n\n // perspective\n const position = scope.object.position;\n offset.copy( position ).sub( scope.target );\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n // orthographic\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n } else {\n\n // camera neither orthographic nor perspective\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n scope.enablePan = false;\n\n }\n\n };\n\n }();\n\n const moveUp = function() {\n\n const _vector = new Vector3();\n\n return function moveUp( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 1 );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add(_vector)\n\n camera.position.z = Math.max(0, camera.position.z);\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const moveForward = function() {\n\n const _vector = new Vector3();\n\n return function moveForward( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 0 );\n\n _vector.crossVectors( camera.up, _vector );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add(_vector)\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const moveRight = function() {\n\n const _vector = new Vector3();\n\n return function moveRight( distance ) {\n\n const camera = scope.object;\n\n _vector.setFromMatrixColumn( camera.matrix, 0 );\n\n _vector.multiplyScalar( distance * 0.1 );\n\n camera.position.add( _vector );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n }();\n\n const spinUp = function() {\n\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\n\n return function spinUp( distance ) {\n\n const camera = scope.object;\n\n _euler.setFromQuaternion( camera.quaternion );\n\n if ( Math.abs( Math.abs( _euler.z - oldZ ) - Math.PI ) < 0.01 ) {\n\n reverse = !reverse;\n\n }\n\n if ( reverse ) {\n\n _euler.x -= 0.01 * distance;\n\n } else {\n\n _euler.x += 0.01 * distance;\n\n }\n\n _euler.x = Math.max(0.1, _euler.x);\n\n oldZ = _euler.z;\n\n camera.quaternion.setFromEuler( _euler );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n const spinRight = function() {\n\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\n\n return function rotateRight( distance ) {\n\n const camera = scope.object;\n\n _euler.setFromQuaternion( camera.quaternion );\n\n _euler.z -= 0.01 * distance;\n\n camera.quaternion.setFromEuler( _euler );\n\n scope.dispatchEvent( _changeEvent );\n\n }\n\n }();\n\n function dollyOut( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale /= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n function dollyIn( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale *= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate( event ) {\n\n rotateStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownDolly( event ) {\n\n dollyStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownPan( event ) {\n\n panStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseMoveRotate( event ) {\n\n rotateEnd.set( event.clientX, event.clientY );\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n scope.update();\n\n }\n\n function handleMouseMoveDolly( event ) {\n\n dollyEnd.set( event.clientX, event.clientY );\n\n dollyDelta.subVectors( dollyEnd, dollyStart );\n\n if ( dollyDelta.y > 0 ) {\n\n dollyOut( getZoomScale() );\n\n } else if ( dollyDelta.y < 0 ) {\n\n dollyIn( getZoomScale() );\n\n }\n\n dollyStart.copy( dollyEnd );\n\n scope.update();\n\n }\n\n function handleMouseMovePan( event ) {\n\n panEnd.set( event.clientX, event.clientY );\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n scope.update();\n\n }\n\n function handleMouseWheel( event ) {\n\n if ( event.deltaY < 0 ) {\n\n dollyIn( getZoomScale() );\n\n } else if ( event.deltaY > 0 ) {\n\n dollyOut( getZoomScale() );\n\n }\n\n scope.update();\n\n }\n\n function handleKeyDown( event ) {\n\n let needsUpdate = false;\n\n switch ( event.code ) {\n\n case scope.keys.MOVE_FORWARD:\n moveForward(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_BACKWARD:\n moveForward(-scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_UP:\n moveUp(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_DOWN:\n moveUp(-scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_RIGHT:\n moveRight(scope.moveSpeed);\n break;\n\n case scope.keys.MOVE_LEFT:\n moveRight(-scope.moveSpeed);\n break;\n\n case scope.keys.ROTATE_UP:\n spinUp(scope.turnSpeed);\n break;\n\n case scope.keys.ROTATE_DOWN:\n spinUp(-scope.turnSpeed);\n break;\n\n case scope.keys.ROTATE_LEFT:\n spinRight( -scope.turnSpeed );\n break;\n\n case scope.keys.ROTATE_RIGHT:\n spinRight( scope.turnSpeed );\n break;\n\n }\n\n if ( needsUpdate ) {\n\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n\n }\n\n\n }\n\n function handleTouchStartRotate() {\n\n if ( pointers.length === 1 ) {\n\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n rotateStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartPan() {\n\n if ( pointers.length === 1 ) {\n\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n panStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartDolly() {\n\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyStart.set( 0, distance );\n\n }\n\n function handleTouchStartDollyPan() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enablePan ) handleTouchStartPan();\n\n }\n\n function handleTouchStartDollyRotate() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enableRotate ) handleTouchStartRotate();\n\n }\n\n function handleTouchMoveRotate( event ) {\n\n if ( pointers.length === 1 ) {\n\n rotateEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n rotateEnd.set( x, y );\n\n }\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n }\n\n function handleTouchMovePan( event ) {\n\n if ( pointers.length === 1 ) {\n\n panEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n panEnd.set( x, y );\n\n }\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n }\n\n function handleTouchMoveDolly( event ) {\n\n const position = getSecondPointerPosition( event );\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyEnd.set( 0, distance );\n\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n dollyOut( dollyDelta.y );\n\n dollyStart.copy( dollyEnd );\n\n }\n\n function handleTouchMoveDollyPan( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enablePan ) handleTouchMovePan( event );\n\n }\n\n function handleTouchMoveDollyRotate( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.setPointerCapture( event.pointerId );\n\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n }\n\n //\n\n addPointer( event );\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchStart( event );\n\n } else {\n\n onMouseDown( event );\n\n }\n\n }\n\n function onPointerMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchMove( event );\n\n } else {\n\n onMouseMove( event );\n\n }\n\n }\n\n function onPointerUp( event ) {\n\n removePointer( event );\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.releasePointerCapture( event.pointerId );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n }\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onPointerCancel( event ) {\n\n removePointer( event );\n\n }\n\n function onMouseDown( event ) {\n\n let mouseAction;\n\n switch ( event.button ) {\n\n case 0:\n\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n\n mouseAction = - 1;\n\n }\n\n switch ( mouseAction ) {\n\n case MOUSE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseDownDolly( event );\n\n state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n\n // XIE: Default to pan in 2D mode\n if(scope.object.isOrthographicCamera) {\n\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n\n } else {\n\n if (event.ctrlKey || event.metaKey) {\n\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n\n } else {\n\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n state = STATE.ROTATE;\n\n }\n\n }\n\n break;\n\n case MOUSE.PAN:\n\n if ( event.ctrlKey || event.metaKey ) {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n } else {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onMouseMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n switch ( state ) {\n\n case STATE.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseMoveRotate( event );\n\n break;\n\n case STATE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseMoveDolly( event );\n\n break;\n\n case STATE.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleMouseMovePan( event );\n\n break;\n\n }\n\n }\n\n function onMouseWheel( event ) {\n\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n event.preventDefault();\n\n scope.dispatchEvent( _startEvent );\n\n handleMouseWheel( event );\n\n scope.dispatchEvent( _endEvent );\n\n }\n\n function onKeyDown( event ) {\n\n if ( scope.enabled === false || scope.enablePan === false ) return;\n\n handleKeyDown( event );\n\n }\n\n function onTouchStart( event ) {\n\n trackPointer( event );\n\n switch ( pointers.length ) {\n\n case 1:\n\n switch ( scope.touches.ONE ) {\n\n case TOUCH.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchStartRotate();\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchStartPan();\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n case 2:\n\n switch ( scope.touches.TWO ) {\n\n case TOUCH.DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchStartDollyPan();\n\n state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchStartDollyRotate();\n\n state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onTouchMove( event ) {\n\n trackPointer( event );\n\n switch ( state ) {\n\n case STATE.TOUCH_ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchMoveRotate( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchMovePan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchMoveDollyPan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchMoveDollyRotate( event );\n\n scope.update();\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n }\n\n function onContextMenu( event ) {\n\n if ( scope.enabled === false ) return;\n\n event.preventDefault();\n\n }\n\n function addPointer( event ) {\n\n pointers.push( event );\n\n }\n\n function removePointer( event ) {\n\n delete pointerPositions[ event.pointerId ];\n\n for ( let i = 0; i < pointers.length; i ++ ) {\n\n if ( pointers[ i ].pointerId === event.pointerId ) {\n\n pointers.splice( i, 1 );\n return;\n\n }\n\n }\n\n }\n\n function trackPointer( event ) {\n\n let position = pointerPositions[ event.pointerId ];\n\n if ( position === undefined ) {\n\n position = new Vector2();\n pointerPositions[ event.pointerId ] = position;\n\n }\n\n position.set( event.pageX, event.pageY );\n\n }\n\n function getSecondPointerPosition( event ) {\n\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\n\n return pointerPositions[ pointer.pointerId ];\n\n }\n\n //\n\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n // force an update at start\n\n this.update();\n\n }\n\n}\n\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends MyOrbitControls {\n\n constructor( object, domElement ) {\n\n super( object, domElement );\n\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN;\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\n\n this.touches.ONE = TOUCH.PAN;\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\n\n }\n\n}\n\nexport { MyOrbitControls, MapControls };\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.0';\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","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface WindowModel extends ElementModel {\r\n // solar heat gain coefficient (https://en.wikipedia.org/wiki/Solar_gain) = 1 - opacity\r\n opacity: number;\r\n tint: string;\r\n uValue: number;\r\n\r\n shutter: ShutterProps;\r\n\r\n mullion: boolean;\r\n mullionWidth: number;\r\n mullionSpacing: number;\r\n mullionColor: string;\r\n\r\n // frameColor is using color\r\n frame: boolean;\r\n frameWidth: number;\r\n sillWidth: number;\r\n\r\n windowType: WindowType;\r\n archHeight: number;\r\n\r\n parentType?: ObjectType.Wall | ObjectType.Roof;\r\n\r\n // polygonal window top vertex position [x, h], x is relative to center(from -0.5 to 0.5), h is absolute\r\n polygonTop?: number[];\r\n\r\n // if empty, it is a hole on its parent (roof or window)\r\n empty?: boolean;\r\n\r\n // Is this window inside a building? If yes, this will be no heat exchange. By default, it is not.\r\n interior?: boolean;\r\n}\r\n\r\nexport interface ShutterProps {\r\n showLeft: boolean;\r\n showRight: boolean;\r\n color: string;\r\n width: number;\r\n}\r\n\r\nexport enum WindowType {\r\n Default = 'Default',\r\n Arched = 'Arched',\r\n Circular = 'Circular',\r\n Polygonal = 'Polygonal',\r\n}\r\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=\"","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n CuboidTexture,\r\n DoorTexture,\r\n FlowerType,\r\n FoundationTexture,\r\n HumanName,\r\n ObjectType,\r\n Orientation,\r\n ParabolicDishStructureType,\r\n RoofTexture,\r\n TrackerType,\r\n TreeType,\r\n WallTexture,\r\n} from '../types';\r\nimport short from 'short-uuid';\r\nimport { Vector3 } from 'three';\r\nimport { ElementModel } from './ElementModel';\r\nimport { HumanModel } from './HumanModel';\r\nimport { TreeModel } from './TreeModel';\r\nimport { FlowerModel } from './FlowerModel';\r\nimport { SensorModel } from './SensorModel';\r\nimport { CuboidModel } from './CuboidModel';\r\nimport { FoundationModel } from './FoundationModel';\r\nimport { SolarPanelModel } from './SolarPanelModel';\r\nimport { PvModel } from './PvModel';\r\nimport { WallFill, WallModel, WallStructure } from './WallModel';\r\nimport {\r\n GableRoofModel,\r\n GambrelRoofModel,\r\n HipRoofModel,\r\n MansardRoofModel,\r\n PyramidRoofModel,\r\n RoofModel,\r\n RoofStructure,\r\n RoofType,\r\n} from './RoofModel';\r\nimport { GROUND_ID } from '../constants';\r\nimport { WindowModel } from './WindowModel';\r\nimport { Point2 } from './Point2';\r\nimport { PolygonModel } from './PolygonModel';\r\nimport { Util } from '../Util';\r\nimport { HumanData } from '../HumanData';\r\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\r\nimport { ParabolicDishModel } from './ParabolicDishModel';\r\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\r\nimport { HeliostatModel } from './HeliostatModel';\r\nimport { DoorModel } from './DoorModel';\r\nimport { WindTurbineModel } from './WindTurbineModel';\r\nimport { FlowerData } from '../FlowerData';\r\nimport { LightModel } from './LightModel';\r\nimport { HvacSystem } from './HvacSystem';\r\nimport { useStore } from 'src/stores/common';\r\nimport { RoofUtil } from '../views/roof/RoofUtil';\r\n\r\nexport class ElementModelFactory {\r\n static makeHuman(name: HumanName, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Human,\r\n name: name ?? HumanName.Jack,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: HumanData.fetchWidth(name ?? HumanName.Jack),\r\n lz: HumanData.fetchHeight(name ?? HumanName.Jack),\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as HumanModel;\r\n }\r\n\r\n static makeTree(type: TreeType, spread: number, height: number, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Tree,\r\n name: type ?? TreeType.Dogwood,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: spread ?? 3,\r\n lz: height ?? 4,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as TreeModel;\r\n }\r\n\r\n static makeSolarPanel(\r\n parent: ElementModel,\r\n pvModel: PvModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n orientation?: Orientation,\r\n poleHeight?: number,\r\n poleSpacing?: number,\r\n tiltAngle?: number,\r\n relativeAzimuth?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n frameColor?: string,\r\n lx?: number,\r\n ly?: number,\r\n parentType?: ObjectType,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n parentType = ObjectType.Foundation;\r\n break;\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n parentType = ObjectType.Cuboid;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.SolarPanel,\r\n pvModelName: pvModel.name,\r\n trackerType: TrackerType.NO_TRACKER,\r\n relativeAzimuth: relativeAzimuth ?? 0,\r\n tiltAngle: tiltAngle ?? 0,\r\n orientation: orientation ?? Orientation.landscape,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 1,\r\n poleRadius: 0.05,\r\n poleSpacing: poleSpacing ?? 3,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? (orientation === Orientation.landscape ? pvModel.length : pvModel.width),\r\n ly: ly ?? (orientation === Orientation.landscape ? pvModel.width : pvModel.length),\r\n lz: pvModel.thickness,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n color: '#fff',\r\n frameColor: frameColor ?? 'white',\r\n parentType: parentType,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SolarPanelModel;\r\n }\r\n\r\n static makeFlower(name: FlowerType, parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Flower,\r\n name: name ?? FlowerType.YellowFlower,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: FlowerData.fetchSpread(name ?? FlowerType.YellowFlower),\r\n lz: FlowerData.fetchHeight(name ?? FlowerType.YellowFlower),\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as FlowerModel;\r\n }\r\n\r\n static makeCuboid(x: number, y: number, height: number, faceColors: string[], faceTextures: CuboidTexture[]) {\r\n return {\r\n type: ObjectType.Cuboid,\r\n cx: x,\r\n cy: y,\r\n cz: height ? height / 2 : 2,\r\n lx: 0.1,\r\n ly: 0.1,\r\n lz: height ?? 4,\r\n color: '#808080',\r\n faceColors: faceColors ?? ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'],\r\n textureTypes: faceTextures ?? [\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: useStore.getState().actionState.cuboidStackable,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: GROUND_ID,\r\n selected: false,\r\n id: short.generate() as string,\r\n } as CuboidModel;\r\n }\r\n\r\n static makeFoundation(x: number, y: number, height: number, color: string, texture: FoundationTexture) {\r\n return {\r\n type: ObjectType.Foundation,\r\n cx: x,\r\n cy: y,\r\n cz: height ? height / 2 : 0.05,\r\n lx: 0,\r\n ly: 0,\r\n lz: height ?? 0.1,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: GROUND_ID,\r\n selected: false,\r\n color: color ?? '#808080',\r\n textureType: texture ?? FoundationTexture.NoTexture,\r\n solarUpdraftTower: {},\r\n solarAbsorberPipe: {},\r\n solarPowerTower: {},\r\n hvacSystem: { thermostatSetpoint: 20 } as HvacSystem,\r\n id: short.generate() as string,\r\n } as FoundationModel;\r\n }\r\n\r\n static makeParabolicTrough(\r\n parent: ElementModel,\r\n reflectance: number,\r\n absorptance: number,\r\n opticalEfficiency: number,\r\n thermalEfficiency: number,\r\n latusRectum: number,\r\n poleHeight: number,\r\n moduleLength: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicTrough,\r\n reflectance: reflectance ?? 0.9,\r\n absorptance: absorptance ?? 0.95,\r\n opticalEfficiency: opticalEfficiency ?? 0.7,\r\n thermalEfficiency: thermalEfficiency ?? 0.3,\r\n moduleLength: moduleLength ?? 3,\r\n latusRectum: latusRectum ?? 2,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n absorberTubeRadius: 0.05,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\r\n poleRadius: 0.05,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 9, // north-south alignment by default\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicTroughModel;\r\n }\r\n\r\n static makeParabolicDish(\r\n parent: ElementModel,\r\n reflectance: number,\r\n absorptance: number,\r\n opticalEfficiency: number,\r\n thermalEfficiency: number,\r\n latusRectum: number,\r\n poleHeight: number,\r\n receiverStructure: ParabolicDishStructureType,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicDish,\r\n reflectance: reflectance ?? 0.9,\r\n absorptance: absorptance ?? 0.95,\r\n opticalEfficiency: opticalEfficiency ?? 0.7,\r\n thermalEfficiency: thermalEfficiency ?? 0.3,\r\n moduleLength: 3,\r\n latusRectum: latusRectum ?? 8,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n structureType: receiverStructure ?? ParabolicDishStructureType.CentralPole,\r\n receiverRadius: 0.25,\r\n receiverPoleRadius: 0.1,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to the radius (half of lx or ly)\r\n poleRadius: 0.2,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 4, // diameter of the rim\r\n ly: ly ?? 4, // diameter of the rim (identical to lx)\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicDishModel;\r\n }\r\n\r\n static makeFresnelReflector(\r\n parent: ElementModel,\r\n receiverId: string,\r\n reflectance: number,\r\n poleHeight: number,\r\n moduleLength: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.FresnelReflector,\r\n receiverId: receiverId ?? 'None',\r\n reflectance: reflectance ?? 0.9,\r\n moduleLength: moduleLength ?? 3,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\r\n poleRadius: 0.05,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 9, // north-south alignment by default\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as FresnelReflectorModel;\r\n }\r\n\r\n static makeHeliostat(\r\n parent: ElementModel,\r\n towerId: string,\r\n reflectance: number,\r\n poleHeight: number,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n lx?: number,\r\n ly?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Heliostat,\r\n towerId: towerId ?? 'None',\r\n reflectance: reflectance ?? 0.9,\r\n relativeAzimuth: 0,\r\n tiltAngle: 0,\r\n drawSunBeam: false,\r\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width or height, whichever is larger\r\n poleRadius: 0.1,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: lx ?? 2,\r\n ly: ly ?? 4,\r\n lz: 0.1,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as HeliostatModel;\r\n }\r\n\r\n static makeWindTurbine(parentId: string, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.WindTurbine,\r\n bladeRadius: 10,\r\n towerRadius: 0.5,\r\n towerHeight: 20,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 3,\r\n lz: 15,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as WindTurbineModel;\r\n }\r\n\r\n static makePolygon(\r\n parent: ElementModel,\r\n x: number,\r\n y: number,\r\n z: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n parentType?: ObjectType,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const hx = 0.2;\r\n const hy = 0.2;\r\n const hz = 0.2;\r\n let rx = x;\r\n let ry = y;\r\n // if the parent is a cuboid, determine the 2D coordinates within each face\r\n if (parent.type === ObjectType.Cuboid && normal) {\r\n if (Util.isUnitVectorX(normal)) {\r\n // west and east face\r\n rx = z;\r\n } else if (Util.isUnitVectorY(normal)) {\r\n // south and north face\r\n ry = z;\r\n }\r\n } else if (parent.type === ObjectType.Wall) {\r\n ry = z;\r\n }\r\n return {\r\n type: ObjectType.Polygon,\r\n cx: rx,\r\n cy: ry,\r\n cz: 0,\r\n lx: 2 * hx,\r\n ly: 2 * hy,\r\n lz: 2 * hz,\r\n color: '#ffffff',\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n vertices: [\r\n { x: Math.max(-0.5, rx - hx), y: Math.max(-0.5, ry - hy) } as Point2,\r\n { x: Math.max(-0.5, rx - hx), y: Math.min(0.5, ry + hy) } as Point2,\r\n { x: Math.min(0.5, rx + hx), y: Math.min(0.5, ry + hy) } as Point2,\r\n { x: Math.min(0.5, rx + hx), y: Math.max(-0.5, ry - hy) } as Point2,\r\n ],\r\n parentId: parent.id,\r\n parentType: parentType,\r\n foundationId: foundationId,\r\n selected: false,\r\n filled: true,\r\n selectedIndex: -1,\r\n id: short.generate() as string,\r\n } as PolygonModel;\r\n }\r\n\r\n static makeWall(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Wall,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0,\r\n ly: actionState.wallThickness ?? 0.3,\r\n lz: actionState.wallHeight ?? 5,\r\n parapet: actionState.wallParapet,\r\n eavesLength: actionState.wallEavesLength ?? 0.3,\r\n rValue: actionState.wallRValue ?? 3,\r\n fill: WallFill.Full,\r\n leftUnfilledHeight: 0.5,\r\n rightUnfilledHeight: 0.5,\r\n leftTopPartialHeight: actionState.wallHeight - 0.5,\r\n rightTopPartialHeight: actionState.wallHeight - 0.5,\r\n relativeAngle: 0,\r\n leftPoint: [],\r\n rightPoint: [],\r\n leftJoints: [],\r\n rightJoints: [],\r\n textureType: actionState.wallTexture ?? WallTexture.Default,\r\n color: actionState.wallColor ?? '#ffffff',\r\n volumetricHeatCapacity: actionState.wallVolumetricHeatCapacity ?? 0.5,\r\n wallStructure: actionState.wallStructure ?? WallStructure.Default,\r\n studSpacing: actionState.wallStructureSpacing ?? 2,\r\n studWidth: actionState.wallStructureWidth ?? 0.1,\r\n studColor: actionState.wallStructureColor ?? '#ffffff',\r\n opacity: actionState.wallOpacity !== undefined ? actionState.wallOpacity : 0.5,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n windows: [],\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as WallModel;\r\n }\r\n\r\n static makeSensor(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3, rotation?: number[]) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Sensor,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0.1,\r\n ly: 0.1,\r\n lz: 0.01,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n parentType: parent.type,\r\n id: short.generate() as string,\r\n } as SensorModel;\r\n }\r\n\r\n static makeLight(\r\n parent: ElementModel,\r\n decay: number,\r\n distance: number,\r\n intensity: number,\r\n color: string,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n normal?: Vector3,\r\n rotation?: number[],\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Light,\r\n decay: decay ?? 2,\r\n distance: distance ?? 5,\r\n intensity: intensity ?? 3,\r\n color: color ?? '#ffff99',\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: 0.16,\r\n ly: 0.16,\r\n lz: 0.08,\r\n showLabel: false,\r\n normal: normal ? normal.toArray() : [0, 0, 1],\r\n rotation: rotation ? rotation : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n parentType: parent.type,\r\n id: short.generate() as string,\r\n } as LightModel;\r\n }\r\n\r\n static makeWindow(\r\n parent: ElementModel,\r\n cx: number,\r\n cy: number,\r\n cz: number,\r\n parentType: ObjectType,\r\n rotation?: number[],\r\n lx = 0,\r\n lz = 0,\r\n ) {\r\n let foundationId;\r\n let ly = 0;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n ly = parent.ly;\r\n break;\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n ly = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n const actionState = useStore.getState().actionState;\r\n const shutter = {\r\n showLeft: actionState.windowShutterLeft,\r\n showRight: actionState.windowShutterRight,\r\n color: actionState.windowShutterColor,\r\n width: actionState.windowShutterWidth,\r\n };\r\n return {\r\n type: ObjectType.Window,\r\n cx: cx,\r\n cy: cy,\r\n cz: cz,\r\n lx: lx,\r\n ly: ly,\r\n lz: lz,\r\n shutter: shutter,\r\n mullion: actionState.windowMullion,\r\n mullionWidth: actionState.windowMullionWidth,\r\n mullionSpacing: actionState.windowMullionSpacing,\r\n mullionColor: actionState.windowMullionColor,\r\n frame: actionState.windowFrame,\r\n frameWidth: actionState.windowFrameWidth,\r\n sillWidth: RoofUtil.isTypeRoof(parentType) ? 0 : actionState.windowSillWidth,\r\n windowType: actionState.windowType,\r\n empty: actionState.windowEmpty,\r\n interior: actionState.windowInterior,\r\n archHeight: actionState.windowArchHeight,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n color: actionState.windowColor ?? '#ffffff', // frame color\r\n tint: actionState.windowTint ?? '#73D8FF', // glass color\r\n opacity: actionState.windowOpacity !== undefined ? actionState.windowOpacity : 0.5,\r\n uValue: actionState.windowUValue ?? 0.5,\r\n normal: [0, -1, 0],\r\n rotation: rotation ? [...rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n parentType: parentType,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as WindowModel;\r\n }\r\n\r\n static makeDoor(parent: ElementModel) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Door,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n doorType: actionState.doorType,\r\n filled: actionState.doorFilled,\r\n interior: actionState.doorInterior,\r\n archHeight: actionState.doorArchHeight,\r\n textureType: actionState.doorTexture ?? DoorTexture.Default,\r\n color: actionState.doorColor ?? '#ffffff',\r\n uValue: actionState.doorUValue ?? 0.5,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 1, 0],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as DoorModel;\r\n }\r\n\r\n static makePyramidRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Pyramid,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as PyramidRoofModel;\r\n }\r\n\r\n static makeGableRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Gable,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n ridgeLeftPoint: [0, 1],\r\n ridgeRightPoint: [0, 1],\r\n } as GableRoofModel;\r\n }\r\n\r\n static makeHipRoof(wallsId: string[], parent: ElementModel, ridgeLength: number) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Hip,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n leftRidgeLength: (ridgeLength ?? 2) / 2,\r\n rightRidgeLength: (ridgeLength ?? 2) / 2,\r\n } as HipRoofModel;\r\n }\r\n\r\n static makeGambrelRoof(wallsId: string[], parent: ElementModel) {\r\n const xPercent = 0.35;\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Gambrel,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n topRidgePoint: [0, 1],\r\n frontRidgePoint: [xPercent, 0.5],\r\n backRidgePoint: [xPercent, 0.5],\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as GambrelRoofModel;\r\n }\r\n\r\n static makeMansardRoof(wallsId: string[], parent: ElementModel) {\r\n const actionState = useStore.getState().actionState;\r\n return {\r\n type: ObjectType.Roof,\r\n cx: 0,\r\n cy: 0,\r\n cz: 0,\r\n lx: 0,\r\n ly: 0,\r\n lz: 0,\r\n ceiling: actionState.roofCeiling ?? false,\r\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\r\n thickness: actionState.roofThickness ?? 0.2,\r\n rValue: actionState.roofRValue ?? 3,\r\n color: actionState.roofColor ?? '#454769',\r\n sideColor: actionState.roofSideColor ?? '#ffffff',\r\n textureType: actionState.roofTexture ?? RoofTexture.Default,\r\n roofType: RoofType.Mansard,\r\n roofStructure: RoofStructure.Default,\r\n wallsId: [...wallsId],\r\n ridgeWidth: 1,\r\n selected: false,\r\n lineWidth: 0.2,\r\n lineColor: '#000000',\r\n showLabel: false,\r\n normal: [0, 0, 1],\r\n rotation: [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n id: short.generate() as string,\r\n } as MansardRoofModel;\r\n }\r\n}\r\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\nimport { PrimitiveStoreState } from '../commonPrimitive';\nimport { DataStoreState } from '../commonData';\n\nexport const set = (state: CommonStoreState) => state.set;\n\nexport const user = (state: CommonStoreState) => state.user;\n\nexport const userCount = (state: PrimitiveStoreState) => state.userCount;\n\nexport const showEconomicsPanel = (state: PrimitiveStoreState) => state.showEconomicsPanel;\n\nexport const showNavigationPanel = (state: PrimitiveStoreState) => state.showNavigationPanel;\n\nexport const minimumNavigationMoveSpeed = (state: CommonStoreState) => state.minimumNavigationMoveSpeed;\n\nexport const minimumNavigationTurnSpeed = (state: CommonStoreState) => state.minimumNavigationTurnSpeed;\n\nexport const navigationMoveSpeed = (state: PrimitiveStoreState) => state.navigationMoveSpeed;\n\nexport const navigationTurnSpeed = (state: PrimitiveStoreState) => state.navigationTurnSpeed;\n\nexport const getHeatmap = (state: DataStoreState) => state.getHeatmap;\n\nexport const setHeatmap = (state: DataStoreState) => state.setHeatmap;\n\nexport const clearHeatmaps = (state: DataStoreState) => state.clearHeatmaps;\n\nexport const clearDataStore = (state: DataStoreState) => state.clearDataStore;\n\nexport const flagOfDailySimulation = (state: PrimitiveStoreState) => state.flagOfDailySimulation;\n\nexport const hourlyHeatExchangeArrayMap = (state: DataStoreState) => state.hourlyHeatExchangeArrayMap;\n\nexport const setHourlyHeatExchangeArray = (state: DataStoreState) => state.setHourlyHeatExchangeArray;\n\nexport const hourlySolarHeatGainArrayMap = (state: DataStoreState) => state.hourlySolarHeatGainArrayMap;\n\nexport const setHourlySolarHeatGainArray = (state: DataStoreState) => state.setHourlySolarHeatGainArray;\n\nexport const hourlySolarPanelOutputArrayMap = (state: DataStoreState) => state.hourlySolarPanelOutputArrayMap;\n\nexport const setHourlySolarPanelOutputArray = (state: DataStoreState) => state.setHourlySolarPanelOutputArray;\n\nexport const getRoofSegmentVertices = (state: DataStoreState) => state.getRoofSegmentVertices;\n\nexport const getRoofSegmentVerticesWithoutOverhang = (state: DataStoreState) =>\n state.getRoofSegmentVerticesWithoutOverhang;\n\nexport const changed = (state: PrimitiveStoreState) => state.changed;\n\nexport const setChanged = (state: PrimitiveStoreState) => state.setChanged;\n\nexport const setSkipChange = (state: PrimitiveStoreState) => state.setSkipChange;\n\nexport const applyCount = (state: CommonStoreState) => state.applyCount;\n\nexport const setApplyCount = (state: CommonStoreState) => state.setApplyCount;\n\nexport const revertApply = (state: CommonStoreState) => state.revertApply;\n\nexport const elements = (state: CommonStoreState) => state.elements;\n\nexport const notes = (state: CommonStoreState) => state.notes;\n\nexport const pvModules = (state: CommonStoreState) => state.pvModules;\n\nexport const loadPvModules = (state: CommonStoreState) => state.loadPvModules;\n\nexport const getPvModule = (state: CommonStoreState) => state.getPvModule;\n\nexport const floatingWindowOpacity = (state: CommonStoreState) => state.floatingWindowOpacity;\n\nexport const selectedFloatingWindow = (state: CommonStoreState) => state.selectedFloatingWindow;\n\nexport const language = (state: CommonStoreState) => state.language;\n\nexport const locale = (state: CommonStoreState) => state.locale;\n\nexport const loggable = (state: CommonStoreState) => state.loggable;\n\nexport const actionInfo = (state: CommonStoreState) => state.actionInfo;\n\nexport const currentUndoable = (state: CommonStoreState) => state.currentUndoable;\n\nexport const openModelsMap = (state: PrimitiveStoreState) => state.openModelsMap;\n\nexport const modelsMapLatitude = (state: CommonStoreState) => state.modelsMapLatitude;\n\nexport const modelsMapLongitude = (state: CommonStoreState) => state.modelsMapLongitude;\n\nexport const modelsMapZoom = (state: CommonStoreState) => state.modelsMapZoom;\n\nexport const modelsMapTilt = (state: CommonStoreState) => state.modelsMapTilt;\n\nexport const modelsMapType = (state: CommonStoreState) => state.modelsMapType;\n\nexport const modelsMapWeatherStations = (state: PrimitiveStoreState) => state.modelsMapWeatherStations;\n\nexport const showCloudFileTitleDialog = (state: CommonStoreState) => state.showCloudFileTitleDialog;\n\nexport const showCloudFileTitleDialogFlag = (state: CommonStoreState) => state.showCloudFileTitleDialogFlag;\n\nexport const cloudFile = (state: CommonStoreState) => state.cloudFile;\n\nexport const latestModelSite = (state: CommonStoreState) => state.latestModelSite;\n\nexport const modelSites = (state: CommonStoreState) => state.modelSites;\n\nexport const peopleModels = (state: CommonStoreState) => state.peopleModels;\n\nexport const saveCloudFileFlag = (state: PrimitiveStoreState) => state.saveCloudFileFlag;\n\nexport const createProjectFlag = (state: PrimitiveStoreState) => state.createProjectFlag;\n\nexport const saveProjectFlag = (state: PrimitiveStoreState) => state.saveProjectFlag;\n\nexport const curateDesignToProjectFlag = (state: PrimitiveStoreState) => state.curateDesignToProjectFlag;\n\nexport const showProjectsFlag = (state: PrimitiveStoreState) => state.showProjectsFlag;\n\nexport const updateProjectsFlag = (state: PrimitiveStoreState) => state.updateProjectsFlag;\n\nexport const modelsMapFlag = (state: PrimitiveStoreState) => state.modelsMapFlag;\n\nexport const leaderboardFlag = (state: PrimitiveStoreState) => state.leaderboardFlag;\n\nexport const showLeaderboard = (state: PrimitiveStoreState) => state.showLeaderboard;\n\nexport const publishOnModelsMapFlag = (state: PrimitiveStoreState) => state.publishOnModelsMapFlag;\n\nexport const listCloudFilesFlag = (state: PrimitiveStoreState) => state.listCloudFilesFlag;\n\nexport const localContentToImportAfterCloudFileUpdate = (state: CommonStoreState) =>\n state.localContentToImportAfterCloudFileUpdate;\n\nexport const localFileName = (state: CommonStoreState) => state.localFileName;\n\nexport const createNewFileFlag = (state: CommonStoreState) => state.createNewFileFlag;\n\nexport const openLocalFileFlag = (state: CommonStoreState) => state.openLocalFileFlag;\n\nexport const saveLocalFileDialogVisible = (state: PrimitiveStoreState) => state.saveLocalFileDialogVisible;\n\nexport const fileChanged = (state: CommonStoreState) => state.fileChanged;\n\nexport const undoManager = (state: CommonStoreState) => state.undoManager;\n\nexport const addUndoable = (state: CommonStoreState) => state.addUndoable;\n\nexport const importContent = (state: CommonStoreState) => state.importContent;\n\nexport const exportContent = (state: CommonStoreState) => state.exportContent;\n\nexport const clearContent = (state: CommonStoreState) => state.clearContent;\n\nexport const createEmptyFile = (state: CommonStoreState) => state.createEmptyFile;\n\nexport const aabb = (state: CommonStoreState) => state.aabb;\n\nexport const animateSun = (state: PrimitiveStoreState) => state.animateSun;\n\nexport const animate24Hours = (state: CommonStoreState) => state.animate24Hours;\n\nexport const runDailyThermalSimulation = (state: PrimitiveStoreState) => state.runDailyThermalSimulation;\n\nexport const pauseDailyThermalSimulation = (state: PrimitiveStoreState) => state.pauseDailyThermalSimulation;\n\nexport const runYearlyThermalSimulation = (state: PrimitiveStoreState) => state.runYearlyThermalSimulation;\n\nexport const pauseYearlyThermalSimulation = (state: PrimitiveStoreState) => state.pauseYearlyThermalSimulation;\n\nexport const clearDailySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearDailySimulationResultsFlag;\n\nexport const clearYearlySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearYearlySimulationResultsFlag;\n\nexport const runDynamicSimulation = (state: PrimitiveStoreState) => state.runDynamicSimulation;\n\nexport const runStaticSimulation = (state: PrimitiveStoreState) => state.runStaticSimulation;\n\nexport const pauseSimulation = (state: PrimitiveStoreState) => state.pauseSimulation;\n\nexport const runEvolution = (state: PrimitiveStoreState) => state.runEvolution;\n\nexport const pauseEvolution = (state: PrimitiveStoreState) => state.pauseEvolution;\n\nexport const objectiveEvaluationIndex = (state: PrimitiveStoreState) => state.objectiveEvaluationIndex;\n\nexport const evolutionMethod = (state: CommonStoreState) => state.evolutionMethod;\n\nexport const updateSceneRadiusFlag = (state: CommonStoreState) => state.updateSceneRadiusFlag;\n\nexport const updateSceneRadius = (state: CommonStoreState) => state.updateSceneRadius;\n\nexport const sceneRadius = (state: CommonStoreState) => state.sceneRadius;\n\nexport const cameraDirection = (state: CommonStoreState) => state.cameraDirection;\n\nexport const getCameraDirection = (state: CommonStoreState) => state.getCameraDirection;\n\nexport const getElementById = (state: CommonStoreState) => state.getElementById;\n\nexport const getFoundation = (state: CommonStoreState) => state.getFoundation;\n\nexport const getParent = (state: CommonStoreState) => state.getParent;\n\nexport const getChildren = (state: CommonStoreState) => state.getChildren;\n\nexport const getChildrenOfType = (state: CommonStoreState) => state.getChildrenOfType;\n\nexport const selectedElement = (state: CommonStoreState) => state.selectedElement;\n\nexport const getSelectedElement = (state: CommonStoreState) => state.getSelectedElement;\n\nexport const overlapWithSibling = (state: CommonStoreState) => state.overlapWithSibling;\n\nexport const selectedSideIndex = (state: CommonStoreState) => state.selectedSideIndex;\n\nexport const setElementPosition = (state: CommonStoreState) => state.setElementPosition;\n\nexport const setElementSize = (state: CommonStoreState) => state.setElementSize;\n\nexport const setElementNormal = (state: CommonStoreState) => state.setElementNormal;\n\nexport const updateAllElementLocks = (state: CommonStoreState) => state.updateAllElementLocks;\n\nexport const updateElementLockByFoundationId = (state: CommonStoreState) => state.updateElementLockByFoundationId;\n\nexport const updateElementLockByParentId = (state: CommonStoreState) => state.updateElementLockByParentId;\n\nexport const updateElementLockById = (state: CommonStoreState) => state.updateElementLockById;\n\nexport const updateElementReferenceById = (state: CommonStoreState) => state.updateElementReferenceById;\n\nexport const updateElementLabelById = (state: CommonStoreState) => state.updateElementLabelById;\n\nexport const updateElementShowLabelById = (state: CommonStoreState) => state.updateElementShowLabelById;\n\nexport const updateElementCxById = (state: CommonStoreState) => state.updateElementCxById;\n\nexport const updateElementCyById = (state: CommonStoreState) => state.updateElementCyById;\n\nexport const updateElementCzById = (state: CommonStoreState) => state.updateElementCzById;\n\nexport const updateElementCzForAll = (state: CommonStoreState) => state.updateElementCzForAll;\n\nexport const updateElementLxById = (state: CommonStoreState) => state.updateElementLxById;\n\nexport const updateElementLxAboveFoundation = (state: CommonStoreState) => state.updateElementLxAboveFoundation;\n\nexport const updateElementLxForAll = (state: CommonStoreState) => state.updateElementLxForAll;\n\nexport const updateElementLyById = (state: CommonStoreState) => state.updateElementLyById;\n\nexport const updateElementLyAboveFoundation = (state: CommonStoreState) => state.updateElementLyAboveFoundation;\n\nexport const updateElementLyForAll = (state: CommonStoreState) => state.updateElementLyForAll;\n\nexport const updateElementLzById = (state: CommonStoreState) => state.updateElementLzById;\n\nexport const updateElementLzForAll = (state: CommonStoreState) => state.updateElementLzForAll;\n\nexport const updateElementColorById = (state: CommonStoreState) => state.updateElementColorById;\n\nexport const updateElementColorOnSurface = (state: CommonStoreState) => state.updateElementColorOnSurface;\n\nexport const updateElementColorAboveFoundation = (state: CommonStoreState) => state.updateElementColorAboveFoundation;\n\nexport const updateElementColorForAll = (state: CommonStoreState) => state.updateElementColorForAll;\n\nexport const updateElementLineColorById = (state: CommonStoreState) => state.updateElementLineColorById;\n\nexport const updateElementLineColorOnSurface = (state: CommonStoreState) => state.updateElementLineColorOnSurface;\n\nexport const updateElementLineColorAboveFoundation = (state: CommonStoreState) =>\n state.updateElementLineColorAboveFoundation;\n\nexport const updateElementLineColorForAll = (state: CommonStoreState) => state.updateElementLineColorForAll;\n\nexport const updateElementLineWidthById = (state: CommonStoreState) => state.updateElementLineWidthById;\n\nexport const updateElementLineWidthOnSurface = (state: CommonStoreState) => state.updateElementLineWidthOnSurface;\n\nexport const updateElementLineWidthAboveFoundation = (state: CommonStoreState) =>\n state.updateElementLineWidthAboveFoundation;\n\nexport const updateElementLineWidthForAll = (state: CommonStoreState) => state.updateElementLineWidthForAll;\n\nexport const updateElementRotationById = (state: CommonStoreState) => state.updateElementRotationById;\n\nexport const updateElementRotationForAll = (state: CommonStoreState) => state.updateElementRotationForAll;\n\nexport const foundationActionScope = (state: CommonStoreState) => state.foundationActionScope;\n\nexport const setFoundationActionScope = (state: CommonStoreState) => state.setFoundationActionScope;\n\nexport const polygonActionScope = (state: CommonStoreState) => state.polygonActionScope;\n\nexport const setPolygonActionScope = (state: CommonStoreState) => state.setPolygonActionScope;\n\nexport const updatePolygonVertexPositionById = (state: CommonStoreState) => state.updatePolygonVertexPositionById;\n\nexport const updatePolygonVerticesById = (state: CommonStoreState) => state.updatePolygonVerticesById;\n\nexport const cuboidActionScope = (state: CommonStoreState) => state.cuboidActionScope;\n\nexport const setCuboidActionScope = (state: CommonStoreState) => state.setCuboidActionScope;\n\nexport const solarPanelActionScope = (state: CommonStoreState) => state.solarPanelActionScope;\n\nexport const setSolarPanelActionScope = (state: CommonStoreState) => state.setSolarPanelActionScope;\n\nexport const updateSolarCollectorDailyYieldById = (state: CommonStoreState) => state.updateSolarCollectorDailyYieldById;\n\nexport const updateSolarCollectorYearlyYieldById = (state: CommonStoreState) =>\n state.updateSolarCollectorYearlyYieldById;\n\nexport const updateSolarPanelTiltAngleById = (state: CommonStoreState) => state.updateSolarPanelTiltAngleById;\n\nexport const updateSolarCollectorDrawSunBeamById = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamById;\n\nexport const updateSolarCollectorDrawSunBeamAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamAboveFoundation;\n\nexport const updateSolarCollectorDrawSunBeamForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorDrawSunBeamForAll;\n\nexport const updateSolarCollectorRelativeAzimuthById = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthById;\n\nexport const updateSolarCollectorRelativeAzimuthOnSurface = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthOnSurface;\n\nexport const updateSolarCollectorRelativeAzimuthAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthAboveFoundation;\n\nexport const updateSolarCollectorRelativeAzimuthForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorRelativeAzimuthForAll;\n\nexport const updateSolarCollectorPoleHeightById = (state: CommonStoreState) => state.updateSolarCollectorPoleHeightById;\n\nexport const updateSolarCollectorPoleHeightOnSurface = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightOnSurface;\n\nexport const updateSolarCollectorPoleHeightAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightAboveFoundation;\n\nexport const updateSolarCollectorPoleHeightForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleHeightForAll;\n\nexport const updateSolarCollectorPoleRadiusById = (state: CommonStoreState) => state.updateSolarCollectorPoleRadiusById;\n\nexport const updateSolarCollectorPoleRadiusAboveFoundation = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleRadiusAboveFoundation;\n\nexport const updateSolarCollectorPoleRadiusForAll = (state: CommonStoreState) =>\n state.updateSolarCollectorPoleRadiusForAll;\n\nexport const updateCspReflectanceById = (state: CommonStoreState) => state.updateCspReflectanceById;\n\nexport const updateCspReflectanceAboveFoundation = (state: CommonStoreState) =>\n state.updateCspReflectanceAboveFoundation;\n\nexport const updateCspReflectanceForAll = (state: CommonStoreState) => state.updateCspReflectanceForAll;\n\nexport const updateParabolicCollectorAbsorptanceById = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceById;\n\nexport const updateParabolicCollectorAbsorptanceAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceAboveFoundation;\n\nexport const updateParabolicCollectorAbsorptanceForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorAbsorptanceForAll;\n\nexport const updateParabolicCollectorOpticalEfficiencyById = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyById;\n\nexport const updateParabolicCollectorOpticalEfficiencyAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyAboveFoundation;\n\nexport const updateParabolicCollectorOpticalEfficiencyForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorOpticalEfficiencyForAll;\n\nexport const updateParabolicCollectorThermalEfficiencyById = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyById;\n\nexport const updateParabolicCollectorThermalEfficiencyAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyAboveFoundation;\n\nexport const updateParabolicCollectorThermalEfficiencyForAll = (state: CommonStoreState) =>\n state.updateParabolicCollectorThermalEfficiencyForAll;\n\nexport const parabolicTroughActionScope = (state: CommonStoreState) => state.parabolicTroughActionScope;\n\nexport const setParabolicTroughActionScope = (state: CommonStoreState) => state.setParabolicTroughActionScope;\n\nexport const fresnelReflectorActionScope = (state: CommonStoreState) => state.fresnelReflectorActionScope;\n\nexport const setFresnelReflectorActionScope = (state: CommonStoreState) => state.setFresnelReflectorActionScope;\n\nexport const heliostatActionScope = (state: CommonStoreState) => state.heliostatActionScope;\n\nexport const setHeliostatActionScope = (state: CommonStoreState) => state.setHeliostatActionScope;\n\nexport const updateSolarReceiverById = (state: CommonStoreState) => state.updateSolarReceiverById;\n\nexport const updateSolarReceiverAboveFoundation = (state: CommonStoreState) => state.updateSolarReceiverAboveFoundation;\n\nexport const updateSolarReceiverForAll = (state: CommonStoreState) => state.updateSolarReceiverForAll;\n\nexport const parabolicDishActionScope = (state: CommonStoreState) => state.parabolicDishActionScope;\n\nexport const setParabolicDishActionScope = (state: CommonStoreState) => state.setParabolicDishActionScope;\n\nexport const updateParabolaLatusRectumById = (state: CommonStoreState) => state.updateParabolaLatusRectumById;\n\nexport const updateParabolaLatusRectumAboveFoundation = (state: CommonStoreState) =>\n state.updateParabolaLatusRectumAboveFoundation;\n\nexport const updateParabolaLatusRectumForAll = (state: CommonStoreState) => state.updateParabolaLatusRectumForAll;\n\nexport const updateModuleLengthById = (state: CommonStoreState) => state.updateModuleLengthById;\n\nexport const updateModuleLengthAboveFoundation = (state: CommonStoreState) => state.updateModuleLengthAboveFoundation;\n\nexport const updateModuleLengthForAll = (state: CommonStoreState) => state.updateModuleLengthForAll;\n\nexport const updateInsideLightById = (state: CommonStoreState) => state.updateInsideLightById;\n\nexport const updateInsideLightsByParentId = (state: CommonStoreState) => state.updateInsideLightsByParentId;\n\nexport const copyElementById = (state: CommonStoreState) => state.copyElementById;\n\nexport const removeElementById = (state: CommonStoreState) => state.removeElementById;\n\nexport const removeElementsByType = (state: CommonStoreState) => state.removeElementsByType;\n\nexport const clearDeletedElements = (state: CommonStoreState) => state.clearDeletedElements;\n\nexport const countElementsByReferenceId = (state: CommonStoreState) => state.countElementsByReferenceId;\n\nexport const removeElementsByReferenceId = (state: CommonStoreState) => state.removeElementsByReferenceId;\n\nexport const removeAllChildElementsByType = (state: CommonStoreState) => state.removeAllChildElementsByType;\n\nexport const removeAllElementsOnFoundationByType = (state: CommonStoreState) =>\n state.removeAllElementsOnFoundationByType;\n\nexport const pasteElementsToPoint = (state: CommonStoreState) => state.pasteElementsToPoint;\n\nexport const pasteElementsByKey = (state: CommonStoreState) => state.pasteElementsByKey;\n\nexport const elementsToPaste = (state: CommonStoreState) => state.elementsToPaste;\n\nexport const selectMe = (state: CommonStoreState) => state.selectMe;\n\nexport const selectNone = (state: CommonStoreState) => state.selectNone;\n\nexport const addElement = (state: CommonStoreState) => state.addElement;\n\nexport const objectTypeToAdd = (state: CommonStoreState) => state.objectTypeToAdd;\n\nexport const actionModeLock = (state: CommonStoreState) => state.actionModeLock;\n\nexport const countElementsByType = (state: CommonStoreState) => state.countElementsByType;\n\nexport const countSolarStructuresByType = (state: CommonStoreState) => state.countSolarStructuresByType;\n\nexport const countObservers = (state: CommonStoreState) => state.countObservers;\n\nexport const countAllElements = (state: CommonStoreState) => state.countAllElements;\n\nexport const countAllElementsByType = (state: CommonStoreState) => state.countAllElementsByType;\n\nexport const countAllOffspringsByTypeAtOnce = (state: CommonStoreState) => state.countAllOffspringsByTypeAtOnce;\n\nexport const countSolarPanelsOnRack = (state: CommonStoreState) => state.countSolarPanelsOnRack;\n\nexport const selectedElementAngle = (state: CommonStoreState) => state.selectedElementAngle;\n\nexport const selectedElementHeight = (state: CommonStoreState) => state.selectedElementHeight;\n\nexport const waiting = (state: PrimitiveStoreState) => state.waiting;\n\nexport const simulationInProgress = (state: PrimitiveStoreState) => state.simulationInProgress;\n\nexport const simulationPaused = (state: PrimitiveStoreState) => state.simulationPaused;\n\nexport const evolutionInProgress = (state: PrimitiveStoreState) => state.evolutionInProgress;\n\nexport const evolutionPaused = (state: PrimitiveStoreState) => state.evolutionPaused;\n\nexport const contextMenuObjectType = (state: CommonStoreState) => state.contextMenuObjectType;\n\nexport const localFileDialogRequested = (state: CommonStoreState) => state.localFileDialogRequested;\n\nexport const enableFineGrid = (state: CommonStoreState) => state.enableFineGrid;\n\nexport const setEnableFineGrid = (state: CommonStoreState) => state.setEnableFineGrid;\n\nexport const showCloudFilePanel = (state: PrimitiveStoreState) => state.showCloudFilePanel;\n\nexport const projectInfo = (state: CommonStoreState) => state.projectInfo;\n\nexport const projectView = (state: CommonStoreState) => state.projectView;\n\nexport const showProjectListPanel = (state: PrimitiveStoreState) => state.showProjectListPanel;\n\nexport const showModelsGallery = (state: PrimitiveStoreState) => state.showModelsGallery;\n\nexport const showAccountSettingsPanel = (state: PrimitiveStoreState) => state.showAccountSettingsPanel;\n\nexport const showLikesPanel = (state: PrimitiveStoreState) => state.showLikesPanel;\n\nexport const showPublishedModelsPanel = (state: PrimitiveStoreState) => state.showPublishedModelsPanel;\n\n// science\nexport const weatherData = (state: CommonStoreState) => state.weatherData;\n\nexport const loadWeatherData = (state: CommonStoreState) => state.loadWeatherData;\n\nexport const getWeather = (state: CommonStoreState) => state.getWeather;\n\nexport const loadHorizontalSolarRadiationData = (state: CommonStoreState) => state.loadHorizontalSolarRadiationData;\n\nexport const getHorizontalSolarRadiation = (state: CommonStoreState) => state.getHorizontalSolarRadiation;\n\nexport const loadVerticalSolarRadiationData = (state: CommonStoreState) => state.loadVerticalSolarRadiationData;\n\nexport const getVerticalSolarRadiation = (state: CommonStoreState) => state.getVerticalSolarRadiation;\n\nexport const getClosestCity = (state: CommonStoreState) => state.getClosestCity;\n\nexport const sunlightDirection = (state: CommonStoreState) => state.sunlightDirection;\n\nexport const setSunlightDirection = (state: CommonStoreState) => state.setSunlightDirection;\n\nexport const showSolarRadiationHeatmap = (state: PrimitiveStoreState) => state.showSolarRadiationHeatmap;\n\nexport const showHeatFluxes = (state: PrimitiveStoreState) => state.showHeatFluxes;\n\n// solar panels (PV)\n\nexport const runSolarPanelVisibilityAnalysis = (state: PrimitiveStoreState) => state.runSolarPanelVisibilityAnalysis;\n\nexport const solarPanelVisibilityResults = (state: DataStoreState) => state.solarPanelVisibilityResults;\n\nexport const runDailySimulationForSolarPanels = (state: PrimitiveStoreState) => state.runDailySimulationForSolarPanels;\n\nexport const runDailySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\n state.runDailySimulationForSolarPanelsLastStep;\n\nexport const runYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForSolarPanels;\n\nexport const runYearlySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForSolarPanelsLastStep;\n\nexport const pauseDailySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForSolarPanels;\n\nexport const pauseYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForSolarPanels;\n\nexport const dailyPvYield = (state: DataStoreState) => state.dailyPvYield;\n\nexport const dailyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.dailyPvIndividualOutputs;\n\nexport const setDailyPvYield = (state: DataStoreState) => state.setDailyPvYield;\n\nexport const yearlyPvYield = (state: DataStoreState) => state.yearlyPvYield;\n\nexport const yearlyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.yearlyPvIndividualOutputs;\n\nexport const setYearlyPvYield = (state: DataStoreState) => state.setYearlyPvYield;\n\nexport const solarPanelLabels = (state: DataStoreState) => state.solarPanelLabels;\n\nexport const setSolarPanelLabels = (state: DataStoreState) => state.setSolarPanelLabels;\n\nexport const setTotalBuildingHeater = (state: DataStoreState) => state.setTotalBuildingHeater;\n\nexport const setTotalBuildingAc = (state: DataStoreState) => state.setTotalBuildingAc;\n\nexport const setTotalBuildingSolarPanel = (state: DataStoreState) => state.setTotalBuildingSolarPanel;\n\nexport const updateElementOnRoofFlag = (state: CommonStoreState) => state.updateElementOnRoofFlag;\n\n// parabolic troughs (CSP)\n\nexport const runDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.runDailySimulationForParabolicTroughs;\n\nexport const runYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForParabolicTroughs;\n\nexport const pauseDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForParabolicTroughs;\n\nexport const pauseYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForParabolicTroughs;\n\nexport const dailyParabolicTroughYield = (state: DataStoreState) => state.dailyParabolicTroughYield;\n\nexport const dailyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyParabolicTroughIndividualOutputs;\n\nexport const setDailyParabolicTroughYield = (state: DataStoreState) => state.setDailyParabolicTroughYield;\n\nexport const yearlyParabolicTroughYield = (state: DataStoreState) => state.yearlyParabolicTroughYield;\n\nexport const yearlyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyParabolicTroughIndividualOutputs;\n\nexport const setYearlyParabolicTroughYield = (state: DataStoreState) => state.setYearlyParabolicTroughYield;\n\nexport const parabolicTroughLabels = (state: DataStoreState) => state.parabolicTroughLabels;\n\nexport const setParabolicTroughLabels = (state: DataStoreState) => state.setParabolicTroughLabels;\n\n// Fresnel reflectors (CSP)\n\nexport const runDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.runDailySimulationForFresnelReflectors;\n\nexport const runYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForFresnelReflectors;\n\nexport const pauseDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForFresnelReflectors;\n\nexport const pauseYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForFresnelReflectors;\n\nexport const dailyFresnelReflectorYield = (state: DataStoreState) => state.dailyFresnelReflectorYield;\n\nexport const dailyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyFresnelReflectorIndividualOutputs;\n\nexport const setDailyFresnelReflectorYield = (state: DataStoreState) => state.setDailyFresnelReflectorYield;\n\nexport const yearlyFresnelReflectorYield = (state: DataStoreState) => state.yearlyFresnelReflectorYield;\n\nexport const yearlyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyFresnelReflectorIndividualOutputs;\n\nexport const setYearlyFresnelReflectorYield = (state: DataStoreState) => state.setYearlyFresnelReflectorYield;\n\nexport const fresnelReflectorLabels = (state: DataStoreState) => state.fresnelReflectorLabels;\n\nexport const setFresnelReflectorLabels = (state: DataStoreState) => state.setFresnelReflectorLabels;\n\n// heliostats (CSP)\n\nexport const runDailySimulationForHeliostats = (state: PrimitiveStoreState) => state.runDailySimulationForHeliostats;\n\nexport const runYearlySimulationForHeliostats = (state: PrimitiveStoreState) => state.runYearlySimulationForHeliostats;\n\nexport const pauseDailySimulationForHeliostats = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForHeliostats;\n\nexport const pauseYearlySimulationForHeliostats = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForHeliostats;\n\nexport const dailyHeliostatYield = (state: DataStoreState) => state.dailyHeliostatYield;\n\nexport const dailyHeliostatIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyHeliostatIndividualOutputs;\n\nexport const setDailyHeliostatYield = (state: DataStoreState) => state.setDailyHeliostatYield;\n\nexport const yearlyHeliostatYield = (state: DataStoreState) => state.yearlyHeliostatYield;\n\nexport const yearlyHeliostatIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyHeliostatIndividualOutputs;\n\nexport const setYearlyHeliostatYield = (state: DataStoreState) => state.setYearlyHeliostatYield;\n\nexport const heliostatLabels = (state: DataStoreState) => state.heliostatLabels;\n\nexport const setHeliostatLabels = (state: DataStoreState) => state.setHeliostatLabels;\n\n// solar updraft towers\n\nexport const runDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.runDailySimulationForUpdraftTower;\n\nexport const runYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForUpdraftTower;\n\nexport const pauseDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForUpdraftTower;\n\nexport const pauseYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForUpdraftTower;\n\nexport const dailyUpdraftTowerResults = (state: DataStoreState) => state.dailyUpdraftTowerResults;\n\nexport const dailyUpdraftTowerYield = (state: DataStoreState) => state.dailyUpdraftTowerYield;\n\nexport const dailyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyUpdraftTowerIndividualOutputs;\n\nexport const setDailyUpdraftTowerResults = (state: DataStoreState) => state.setDailyUpdraftTowerResults;\n\nexport const setDailyUpdraftTowerYield = (state: DataStoreState) => state.setDailyUpdraftTowerYield;\n\nexport const yearlyUpdraftTowerYield = (state: DataStoreState) => state.yearlyUpdraftTowerYield;\n\nexport const yearlyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyUpdraftTowerIndividualOutputs;\n\nexport const setYearlyUpdraftTowerYield = (state: DataStoreState) => state.setYearlyUpdraftTowerYield;\n\nexport const updraftTowerLabels = (state: DataStoreState) => state.updraftTowerLabels;\n\nexport const setUpdraftTowerLabels = (state: DataStoreState) => state.setUpdraftTowerLabels;\n\n// parabolic dishes (CSP)\n\nexport const runDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.runDailySimulationForParabolicDishes;\n\nexport const runYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.runYearlySimulationForParabolicDishes;\n\nexport const pauseDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.pauseDailySimulationForParabolicDishes;\n\nexport const pauseYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\n state.pauseYearlySimulationForParabolicDishes;\n\nexport const dailyParabolicDishYield = (state: DataStoreState) => state.dailyParabolicDishYield;\n\nexport const dailyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.dailyParabolicDishIndividualOutputs;\n\nexport const setDailyParabolicDishYield = (state: DataStoreState) => state.setDailyParabolicDishYield;\n\nexport const yearlyParabolicDishYield = (state: DataStoreState) => state.yearlyParabolicDishYield;\n\nexport const yearlyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\n state.graphState?.yearlyParabolicDishIndividualOutputs;\n\nexport const setYearlyParabolicDishYield = (state: DataStoreState) => state.setYearlyParabolicDishYield;\n\nexport const parabolicDishLabels = (state: DataStoreState) => state.parabolicDishLabels;\n\nexport const setParabolicDishLabels = (state: DataStoreState) => state.setParabolicDishLabels;\n\n// sensors\n\nexport const runDailyLightSensor = (state: PrimitiveStoreState) => state.runDailyLightSensor;\n\nexport const pauseDailyLightSensor = (state: PrimitiveStoreState) => state.pauseDailyLightSensor;\n\nexport const runYearlyLightSensor = (state: PrimitiveStoreState) => state.runYearlyLightSensor;\n\nexport const pauseYearlyLightSensor = (state: PrimitiveStoreState) => state.pauseYearlyLightSensor;\n\nexport const dailyLightSensorData = (state: DataStoreState) => state.dailyLightSensorData;\n\nexport const setDailyLightSensorData = (state: DataStoreState) => state.setDailyLightSensorData;\n\nexport const yearlyLightSensorData = (state: DataStoreState) => state.yearlyLightSensorData;\n\nexport const setYearlyLightSensorData = (state: DataStoreState) => state.setYearlyLightSensorData;\n\nexport const sensorLabels = (state: DataStoreState) => state.sensorLabels;\n\nexport const setSensorLabels = (state: DataStoreState) => state.setSensorLabels;\n\n// handles\n\nexport const hoveredHandle = (state: CommonStoreState) => state.hoveredHandle;\n\nexport const moveHandleType = (state: CommonStoreState) => state.moveHandleType;\n\nexport const resizeHandleType = (state: CommonStoreState) => state.resizeHandleType;\n\nexport const getResizeHandlePosition = (state: CommonStoreState) => state.getResizeHandlePosition;\n\nexport const rotateHandleType = (state: CommonStoreState) => state.rotateHandleType;\n\nexport const resizeAnchor = (state: CommonStoreState) => state.resizeAnchor;\n\n// elements\n\nexport const isAddingElement = (state: CommonStoreState) => state.isAddingElement;\n\nexport const addedFoundationId = (state: CommonStoreState) => state.addedFoundationId;\n\nexport const deletedFoundationId = (state: CommonStoreState) => state.deletedFoundationId;\n\nexport const addedCuboidId = (state: CommonStoreState) => state.addedCuboidId;\n\nexport const deletedCuboidId = (state: CommonStoreState) => state.deletedCuboidId;\n\nexport const addedWallId = (state: CommonStoreState) => state.addedWallId;\n\nexport const deletedWallId = (state: CommonStoreState) => state.deletedWallId;\n\nexport const deletedRoofId = (state: CommonStoreState) => state.deletedRoofId;\n\nexport const autoDeletedRoof = (state: CommonStoreState) => state.autoDeletedRoof;\n\nexport const autoDeletedChild = (state: CommonStoreState) => state.autoDeletedChild;\n\nexport const groupActionMode = (state: CommonStoreState) => state.groupActionMode;\n\nexport const groupMasterId = (state: CommonStoreState) => state.groupMasterId;\n\nexport const groupActionUpdateFlag = (state: CommonStoreState) => state.groupActionUpdateFlag;\n\nexport const addedWindowId = (state: CommonStoreState) => state.addedWindowId;\n\nexport const addedDoorId = (state: CommonStoreState) => state.addedDoorId;\n\nexport const updateWallMapOnFoundationFlag = (state: CommonStoreState) => state.updateWallMapOnFoundationFlag;\n\nexport const wallActionScope = (state: CommonStoreState) => state.wallActionScope;\n\nexport const roofActionScope = (state: CommonStoreState) => state.roofActionScope;\n\nexport const windowActionScope = (state: CommonStoreState) => state.windowActionScope;\n\nexport const doorActionScope = (state: CommonStoreState) => state.doorActionScope;\n\nexport const setWallActionScope = (state: CommonStoreState) => state.setWallActionScope;\n\nexport const setRoofActionScope = (state: CommonStoreState) => state.setRoofActionScope;\n\nexport const setDoorActionScope = (state: CommonStoreState) => state.setDoorActionScope;\n\nexport const setWindowActionScope = (state: CommonStoreState) => state.setWindowActionScope;\n\nexport const updateWallLeftJointsById = (state: CommonStoreState) => state.updateWallLeftJointsById;\n\nexport const updateWallRightJointsById = (state: CommonStoreState) => state.updateWallRightJointsById;\n\nexport const updateWallLeftPointById = (state: CommonStoreState) => state.updateWallLeftPointById;\n\nexport const updateRoofRiseById = (state: CommonStoreState) => state.updateRoofRiseById;\n\nexport const updateRoofStructureById = (state: CommonStoreState) => state.updateRoofStructureById;\n\nexport * as solarPanelArrayLayoutParams from './solarPanelArrayLayoutParams';\n\nexport const economicsParams = (state: CommonStoreState) => state.economicsParams;\n\n// genetic algorithms and particle swarm optimization\n\nexport const fittestIndividualResults = (state: CommonStoreState) => state.fittestIndividualResults;\n\nexport const setFittestIndividualResults = (state: CommonStoreState) => state.setFittestIndividualResults;\n\nexport const variableLabels = (state: CommonStoreState) => state.variableLabels;\n\nexport const setVariableLabels = (state: CommonStoreState) => state.setVariableLabels;\n\nexport const evolutionaryAlgorithmState = (state: CommonStoreState) => state.evolutionaryAlgorithmState;\n\nexport const solarPanelArrayLayoutConstraints = (state: CommonStoreState) => state.solarPanelArrayLayoutConstraints;\n\nexport const geneticAlgorithmWizardSelectedTab = (state: CommonStoreState) => state.geneticAlgorithmWizardSelectedTab;\n\nexport const particleSwarmOptimizationWizardSelectedTab = (state: CommonStoreState) =>\n state.particleSwarmOptimizationWizardSelectedTab;\n\nexport const setPrimitiveStore = (state: PrimitiveStoreState) => state.setPrimitiveStore;\n\nexport * as viewState from './viewState';\n\nexport * as world from './world';\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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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, spacingX, spacingY, 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 / spacingX) - 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, spacingX]);\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 / spacingY);\n let curr = top;\n for (let i = 0; i < number; i++) {\n arr.push(curr);\n curr -= spacingY;\n }\n return arr;\n }, [lx, lz, ah, width, spacingY]);\n\n const archMullions = useMemo(() => {\n const arr: number[] = [];\n\n const dividers = Math.round(lx / spacingX) - 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);\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, spacingX]);\n\n const renderRadialMullion = (length: number, angle: number) => {\n return (\n \n \n {material}\n \n \n );\n };\n\n return (\n \n {horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\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 shutter,\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 shutterWidth = useMemo(() => shutter.width * lx, [lx, shutter.width]);\n const shutterHeight = useMemo(() => lz - Math.min(archHeight, lz, lx / 2), [lx, lz, archHeight]);\n const shutterPosX = useMemo(\n () => ((shutterWidth + frameData.width + lx) / 2) * 1.025,\n [lx, shutterWidth, frameData.width],\n );\n const shutterPosZ = useMemo(() => -Math.min(archHeight, lz, lx / 2) / 2, [lz, shutterHeight]);\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.showMullion && 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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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 shutter,\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(() => shutter.width * lx, [lx, shutter]);\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","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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\nimport { Point2 } from 'src/models/Point2';\nimport { RoofModel } from 'src/models/RoofModel';\nimport { WallModel } from 'src/models/WallModel';\nimport { useStore } from 'src/stores/common';\nimport { ObjectType } from 'src/types';\nimport { Util } from 'src/Util';\nimport { Vector2, Vector3 } from 'three';\nimport * as Selector from '../stores/selector';\nimport { GROUND_ID } from '../constants';\n\nexport const useGroupMaster = (elementModel: GroupableModel, groupMasterId: string | null) => {\n const { id, cx, cy, lx, ly, lz, selected, enableGroupMaster } = elementModel;\n\n const buildingResizerUpdateFlag = useStore(Selector.groupActionUpdateFlag);\n const baseGroupSetRef = useRef>(new Set());\n const baseVerticesRef = useRef([]);\n const childCuboidSetRef = useRef>(new Set());\n\n const [groupMasterDimension, setGroupMasterDimension] = useState(null);\n const [groupMasterPosition, setGroupMasterPosition] = useState([cx, cy, lz / 2]);\n const [groupMasterRotation, setGroupMasterRotation] = useState(0);\n\n const isCuboid = elementModel.type === ObjectType.Cuboid;\n\n useEffect(() => {\n if (groupMasterId === id) {\n baseGroupSetRef.current.clear();\n childCuboidSetRef.current.clear();\n baseVerticesRef.current = [];\n\n setBaseVertices(elementModel);\n if (elementModel.enableGroupMaster) {\n checkOverlapWithAllBases(elementModel);\n if (baseGroupSetRef.current.size > 1) {\n setGroupedBasesData();\n } else {\n setSingleBaseData();\n }\n } else {\n setSingleBaseData();\n }\n } else {\n setGroupMasterPosition([cx, cy, 0]);\n setGroupMasterDimension(null);\n setGroupMasterRotation(0);\n }\n }, [groupMasterId, buildingResizerUpdateFlag, enableGroupMaster]);\n\n const setBaseVertices = (base: ElementModel) => {\n const hx = base.lx / 2;\n const hy = base.ly / 2;\n const zero = new Vector2();\n const { pos, rot } = Util.getWorldDataById(base.id);\n const center = new Vector2(pos.x, pos.y);\n const v1 = new Vector2(hx, hy);\n const v2 = new Vector2(-hx, hy);\n const v3 = new Vector2(hx, -hy);\n const v4 = new Vector2(-hx, -hy);\n const arr = [v1, v2, v3, v4].map((v) => {\n v.rotateAround(zero, rot).add(center);\n return { x: v.x, y: v.y } as Point2;\n });\n baseGroupSetRef.current.add(base.id);\n baseVerticesRef.current.push(...arr);\n };\n\n const setAllChildBases = (el: ElementModel) => {\n baseGroupSetRef.current.add(el.id);\n childCuboidSetRef.current.add(el.id);\n for (const e of useStore.getState().elements) {\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === el.id) {\n setAllChildBases(e);\n }\n }\n };\n\n const checkOverlapWithAllBases = (base: ElementModel) => {\n for (const el of useStore.getState().elements) {\n if (isGroupable(el) && el.parentId === GROUND_ID && !el.locked && !baseGroupSetRef.current.has(el.id)) {\n const isUnlockedChild = Util.isChild(base.id, el.id, true);\n\n if (isUnlockedChild) {\n setAllChildBases(el);\n } else if (Util.areTwoBasesOverlapped(el, base)) {\n setBaseVertices(el);\n checkOverlapWithAllBases(el);\n }\n }\n }\n };\n\n const setSingleBaseData = () => {\n let maxHeight = isCuboid ? 0 : 3;\n let maxTopZ = maxHeight;\n const map = new Map(); // roofId -> maxWallHeight\n // we can use one loop to get maxWallHeight, because roof is always after wall?\n for (const elem of useStore.getState().elements) {\n if (elem.foundationId === elementModel?.id) {\n if (elem.type === ObjectType.Wall) {\n const wall = elem as WallModel;\n maxHeight = Math.max(maxHeight, wall.lz);\n if (wall.roofId) {\n const maxWallHeight = map.get(wall.roofId) ?? 0;\n if (maxWallHeight < wall.lz) {\n map.set(wall.roofId, wall.lz);\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n maxHeight = Math.max(maxHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\n }\n } else if (elem.type === ObjectType.Cuboid && Util.isChild(elementModel.id, elem.id, true)) {\n setBaseVertices(elem);\n childCuboidSetRef.current.add(elem.id);\n const { topZ } = Util.getWorldDataById(elem.id);\n maxTopZ = Math.max(maxTopZ, topZ);\n }\n }\n\n if (baseGroupSetRef.current.size > 1) {\n const bound = Util.calculatePolygonBounds(baseVerticesRef.current);\n const { pos: parentWorldPos, topZ: parentTopZ } = Util.getWorldDataById(elementModel.parentId);\n const boundCenterWorldPos = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\n const relativePosition = new Vector3().subVectors(boundCenterWorldPos, parentWorldPos).setZ(0);\n setGroupMasterDimension([bound.width, bound.height, maxTopZ - parentTopZ]);\n setGroupMasterPosition(relativePosition.toArray());\n setGroupMasterRotation(0);\n } else {\n setGroupMasterPosition([cx, cy, 0]);\n setGroupMasterRotation(elementModel?.rotation[2]);\n setGroupMasterDimension([lx, ly, maxHeight + lz]);\n }\n };\n\n const setGroupedBasesData = () => {\n const bound = Util.calculatePolygonBounds(baseVerticesRef.current);\n let maxChildHeight = isCuboid ? 0 : 1;\n let maxBaseZ = lz;\n const map = new Map(); // roofId -> maxWallHeight\n for (const elem of useStore.getState().elements) {\n // children\n if (elem.foundationId && baseGroupSetRef.current.has(elem.foundationId)) {\n if (elem.type === ObjectType.Wall) {\n const wall = elem as WallModel;\n maxChildHeight = Math.max(maxChildHeight, wall.lz);\n if (wall.roofId) {\n const maxWallHeight = map.get(wall.roofId) ?? 0;\n if (maxWallHeight < wall.lz) {\n map.set(wall.roofId, wall.lz);\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n maxChildHeight = Math.max(maxChildHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\n }\n }\n // cuboids\n else if (elem.type === ObjectType.Cuboid && baseGroupSetRef.current.has(elem.id)) {\n const { topZ } = Util.getWorldDataById(elem.id);\n maxBaseZ = Math.max(maxBaseZ, topZ);\n }\n }\n const { pos: parentWorldPos, topZ: parentTopZ } = Util.getWorldDataById(elementModel.parentId);\n const boundCenterWorldPos = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\n const relativePosition = new Vector3().subVectors(boundCenterWorldPos, parentWorldPos).setZ(0);\n setGroupMasterDimension([bound.width, bound.height, Math.max(maxChildHeight, maxBaseZ)]);\n setGroupMasterPosition(relativePosition.toArray());\n setGroupMasterRotation(0);\n };\n\n const baseGroupSet = baseGroupSetRef.current;\n const childCuboidSet = childCuboidSetRef.current;\n return { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation };\n};\n\nexport const useSelected = (id: string) => {\n const selected = useStore((state) => state.selectedElementIdSet.has(id));\n return selected;\n};\n\nexport const useLanguage = () => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n return lang;\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 { 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 addIdRoofId = useStore.getState().addedRoofId;\r\n if (addIdRoofId && addIdRoofId === 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 }\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 addedRoofId = useStore.getState().addedRoofId;\r\n if (addedRoofId && addedRoofId === 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().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if ((addIdRoofId && addIdRoofId === 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().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if ((addIdRoofId && addIdRoofId === id) || !isFirstRender) {\r\n updateWalls(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n useStore.getState().setAddedRoofId(null);\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 addIdRoofId = useStore.getState().addedRoofId;\r\n if (addIdRoofId && addIdRoofId === 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().setAddedRoofId(null);\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().addedRoofId === 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().setAddedRoofId(null);\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\";","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.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n if (useStore.getState().groupActionMode) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n e.stopPropagation();\r\n } else 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().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 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 useUpdateOldFiles = (wallModel: WallModel) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (\r\n wallModel.wallStructure === undefined ||\r\n wallModel.structureSpacing === undefined ||\r\n wallModel.structureWidth === undefined ||\r\n wallModel.structureColor === undefined ||\r\n wallModel.opacity === undefined ||\r\n wallModel.fill === undefined ||\r\n wallModel.leftUnfilledHeight === undefined ||\r\n wallModel.rightUnfilledHeight === undefined ||\r\n wallModel.leftTopPartialHeight === undefined ||\r\n wallModel.rightTopPartialHeight === undefined ||\r\n wallModel.eavesLength === undefined ||\r\n wallModel.parapet === undefined\r\n ) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wallModel.id) {\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 const roof = state.elements.find((e) => e.id === wall.roofId && e.type === ObjectType.Roof) as RoofModel;\r\n if (roof) {\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 if (wall.parapet === undefined) {\r\n wall.parapet = { ...DEFAULT_PARAPET_SETTINGS };\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\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 for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n e.selected = true;\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n state.groupMasterId = foundationId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(foundationId);\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 // 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 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\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 while (wall && (!wall.roofId || wall.roofId === roofId)) {\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 while (wall && (!wall.roofId || wall.roofId === roofId)) {\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 (\r\n roofModel.ceiling === undefined ||\r\n roofModel.rise === undefined ||\r\n (roofModel.roofType === RoofType.Gambrel &&\r\n ((roofModel as GambrelRoofModel).frontRidgePoint === undefined ||\r\n (roofModel as GambrelRoofModel).backRidgePoint === undefined ||\r\n (roofModel as GambrelRoofModel).topRidgePoint === undefined))\r\n ) {\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.ceiling === undefined) {\r\n roof.ceiling = false;\r\n }\r\n if (roof.rise === undefined) {\r\n roof.rise = roof.lz - highestWallHeight;\r\n roof.lz = 0;\r\n }\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 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-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Euler, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport { Box, Circle, Cone, Plane, Sphere, Torus } from '@react-three/drei';\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from '../stores/selector';\nimport { GROUND_ID, HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR, TWO_PI } from 'src/constants';\nimport { WallFill, WallModel } from 'src/models/WallModel';\nimport Wireframe from './wireframe';\nimport { UndoableMoveFoundationGroup } from 'src/undo/UndoableMove';\nimport { UndoableResizeBuildingXY, UndoableResizeBuildingZ } from 'src/undo/UndoableResizeBuilding';\nimport { useHandleSize } from 'src/views/wall/hooks';\nimport { RoofModel } from 'src/models/RoofModel';\nimport { isGroupable } from 'src/models/Groupable';\nimport { Util } from 'src/Util';\nimport { WindowModel } from 'src/models/WindowModel';\n\ninterface GroupMasterProps {\n baseGroupSet: Set;\n childCuboidSet: Set;\n initalPosition: number[];\n initalDimension: number[];\n initalRotation: number;\n}\n\ninterface HandleProps {\n args: number[]; // [cx, cy, cz, handleSize];\n handleType: MoveHandleType | ResizeHandleType | RotateHandleType;\n}\n\nenum Operation {\n Move = 'Move',\n ResizeXY = 'Resize XY',\n ResizeZ = 'Resize Z',\n RotateUpper = 'Rotate Upper',\n RotateLower = 'Rotate Lower',\n Null = 'Null',\n}\n\nexport type PartialWallHeight = {\n upperLeft: number;\n upperRight: number;\n lowerLeft: number;\n lowerRight: number;\n};\n\nconst zeroVector2 = new Vector2();\n\nconst ResizeHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n >\n \n \n );\n};\n\nconst MoveHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n >\n \n \n );\n};\n\nconst RotateHandle = ({ args, handleType }: HandleProps) => {\n const [cx, cy, cz, handleSize] = args;\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n const mesh = useMemo(() => , [color]);\n return (\n setColor(HIGHLIGHT_HANDLE_COLOR)}\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\n scale={handleSize * 4}\n >\n \n \n {mesh}\n \n \n {mesh}\n \n \n {mesh}\n \n \n \n \n );\n};\n\nconst GroupMaster = ({\n baseGroupSet,\n childCuboidSet,\n initalPosition,\n initalDimension,\n initalRotation,\n}: GroupMasterProps) => {\n const [cx, cy, cz] = initalPosition;\n const [lx, ly, lz] = initalDimension;\n const aspectRatio = lx === 0 ? 1 : ly / lx;\n const lockAspectRatio = baseGroupSet.size > 1;\n\n const intersectionPlaneRef = useRef(null);\n const intersectionPlanePositionRef = useRef(new Vector3());\n const intersectionPlaneRotationRef = useRef(new Euler());\n const resizeAnchorRef = useRef(new Vector2());\n const elementHeightMapRef = useRef>(new Map());\n const wallRelPointsMapRef = useRef>(new Map());\n const partialWallHeightMapRef = useRef>(new Map());\n const skylightRelPosMapRef = useRef>(new Map());\n const baseRelPosMapRef = useRef>(new Map());\n const baseRotationMapRef = useRef>(new Map());\n const basePosRatioMapRef = useRef>(new Map()); // 2d\n const baseDmsRatioMapRef = useRef>(new Map()); // 2d\n const resizerCenterRelPosRef = useRef(new Vector3());\n const pointerDownRef = useRef(false); // for performance reason\n\n // undo\n const foundatonOldDataMapRef = useRef>(new Map());\n const wallOldPointsMapRef = useRef>(new Map());\n const elementOldHeightMapRef = useRef>(new Map());\n const oldPartialWallHeightMapRef = useRef>(new Map());\n const oldSkyligthPosMapRef = useRef>(new Map());\n\n const [position, setPosition] = useState(new Vector3(cx, cy, cz));\n const [rotation, setRotation] = useState(initalRotation);\n const [hx, setHx] = useState(lx / 2);\n const [hy, setHy] = useState(ly / 2);\n const [height, setHeight] = useState(lz);\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\n const [operation, setOperation] = useState(Operation.Null);\n\n const { get: getThree } = useThree();\n const ray = useMemo(() => new Raycaster(), []);\n const mouse = useMemo(() => new Vector2(), []);\n\n const orthographic = useStore(Selector.viewState.orthographic);\n\n const getElementById = useStore(Selector.getElementById);\n const getCameraDirection = useStore(Selector.getCameraDirection);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n\n useEffect(() => {\n setHeight(lz);\n }, [lz]);\n\n useEffect(() => {\n setPosition(new Vector3(cx, cy, cz));\n setDimension(lx, ly);\n setRotation(initalRotation);\n }, [initalPosition, initalDimension, initalRotation]);\n\n const setRayCast = (e: PointerEvent) => {\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, getThree().camera);\n };\n\n const setDimension = (lx: number, ly: number) => {\n setHx(lx / 2);\n setHy(ly / 2);\n };\n\n const initPointerDown = (event: ThreeEvent) => {\n setShowIntersectionPlane(true);\n useRefStore.getState().setEnableOrbitController(false);\n pointerDownRef.current = true;\n intersectionPlanePositionRef.current.set(0, 0, 0);\n intersectionPlaneRotationRef.current.set(0, 0, 0);\n setCommonStoreHandleType(MoveHandleType.Default);\n event.stopPropagation();\n };\n\n const updateUndoableResizeXY = (\n foundationDataMap: Map,\n wallPointsMap: Map,\n skyligthPosMap: Map,\n ) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && foundationDataMap.has(elem.id)) {\n [elem.cx, elem.cy, elem.lx, elem.ly] = foundationDataMap.get(elem.id)!;\n } else if (foundationDataMap.has(elem.parentId)) {\n switch (elem.type) {\n case ObjectType.Wall: {\n const points = wallPointsMap.get(elem.id);\n if (!points) continue;\n const w = elem as WallModel;\n const leftPoint = points.slice(0, 3);\n const rightPoint = points.slice(3);\n w.cx = (leftPoint[0] + rightPoint[0]) / 2;\n w.cy = (leftPoint[1] + rightPoint[1]) / 2;\n w.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\n w.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n w.leftPoint = [...leftPoint];\n w.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const position = skyligthPosMap.get(elem.id);\n if (!position) continue;\n [window.cx, window.cy] = position;\n break;\n }\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const updateUndoableResizeZ = (\n heightMap: Map,\n partialWallHeightMap: Map,\n ) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (heightMap.has(elem.id)) {\n const height = heightMap.get(elem.id);\n if (height !== undefined) {\n if (elem.type === ObjectType.Roof) {\n (elem as RoofModel).rise = height;\n } else {\n elem.lz = height;\n }\n }\n }\n if (elem.type === ObjectType.Wall && partialWallHeightMap.has(elem.id)) {\n const w = elem as WallModel;\n const partialWallHeight = partialWallHeightMap.get(w.id);\n if (partialWallHeight) {\n w.leftTopPartialHeight = partialWallHeight.upperLeft;\n w.rightTopPartialHeight = partialWallHeight.upperRight;\n w.leftUnfilledHeight = partialWallHeight.lowerLeft;\n w.rightUnfilledHeight = partialWallHeight.lowerRight;\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const updateFoundationGroupPosition = (map: Map) => {\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (map.has(elem.id)) {\n const pos = map.get(elem.id);\n if (pos) {\n elem.cx = pos[0];\n elem.cy = pos[1];\n elem.cz = pos[2];\n elem.rotation[2] = pos[3];\n }\n }\n }\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n };\n\n const addUndoableMove = () => {\n const map = new Map();\n for (const elem of useStore.getState().elements) {\n if ((isGroupable(elem) && baseGroupSet.has(elem.id)) || baseGroupSet.has(elem.parentId)) {\n map.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n const name = operation === Operation.Move ? 'Move' : 'Rotate';\n const undoableMove = {\n name: `${name} Foundation Group`,\n timestamp: Date.now(),\n oldPositionMap: new Map(foundatonOldDataMapRef.current),\n newPositionMap: new Map(map),\n undo: () => {\n updateFoundationGroupPosition(undoableMove.oldPositionMap);\n },\n redo: () => {\n updateFoundationGroupPosition(undoableMove.newPositionMap);\n },\n } as UndoableMoveFoundationGroup;\n addUndoable(undoableMove);\n };\n\n const addUndoableResizeXY = () => {\n const foundationNewDataMap = new Map();\n const wallNewPointsMap = new Map();\n const newSkylightPosMap = new Map();\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && foundatonOldDataMapRef.current.has(elem.id)) {\n foundationNewDataMap.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\n } else if (wallOldPointsMapRef.current.has(elem.id)) {\n const w = elem as WallModel;\n wallNewPointsMap.set(elem.id, [...w.leftPoint, ...w.rightPoint]);\n } else if (oldSkyligthPosMapRef.current.has(elem.id)) {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n newSkylightPosMap.set(window.id, [window.cx, window.cy]);\n }\n }\n const undoableReizeXY = {\n name: 'Resize Building XY',\n timestamp: Date.now(),\n oldFoundationDataMap: new Map(foundatonOldDataMapRef.current),\n newFoundationDataMap: new Map(foundationNewDataMap),\n oldWallPointsMap: new Map(wallOldPointsMapRef.current),\n newWallPointsMap: new Map(wallNewPointsMap),\n oldSkylightPosMap: new Map(oldSkyligthPosMapRef.current),\n newSkylightPosMap: new Map(newSkylightPosMap),\n undo: () => {\n updateUndoableResizeXY(\n undoableReizeXY.oldFoundationDataMap,\n undoableReizeXY.oldWallPointsMap,\n undoableReizeXY.oldSkylightPosMap,\n );\n },\n redo: () => {\n updateUndoableResizeXY(\n undoableReizeXY.newFoundationDataMap,\n undoableReizeXY.newWallPointsMap,\n undoableReizeXY.newSkylightPosMap,\n );\n },\n } as UndoableResizeBuildingXY;\n addUndoable(undoableReizeXY);\n };\n\n const addUndoableReseizeZ = () => {\n const newHeightMap = new Map();\n const newPartialWallHeightMap = new Map();\n\n for (const elem of useStore.getState().elements) {\n if (elementOldHeightMapRef.current.has(elem.id)) {\n if (elem.type === ObjectType.Roof) {\n newHeightMap.set(elem.id, (elem as RoofModel).rise);\n } else {\n newHeightMap.set(elem.id, elem.lz);\n }\n }\n if (elem.type === ObjectType.Wall && oldPartialWallHeightMapRef.current.has(elem.id)) {\n const w = elem as WallModel;\n newPartialWallHeightMap.set(w.id, {\n lowerLeft: w.leftUnfilledHeight,\n lowerRight: w.rightUnfilledHeight,\n upperLeft: w.leftTopPartialHeight,\n upperRight: w.rightTopPartialHeight,\n });\n }\n }\n const undoableResizeZ = {\n name: 'Resize Building Z',\n timestamp: Date.now(),\n oldElementHeightMap: new Map(elementOldHeightMapRef.current),\n newElementHeightMap: new Map(newHeightMap),\n oldPartialWallHeightMap: new Map(oldPartialWallHeightMapRef.current),\n newPartialWallHeightMap: new Map(newPartialWallHeightMap),\n undo: () => {\n updateUndoableResizeZ(undoableResizeZ.oldElementHeightMap, undoableResizeZ.oldPartialWallHeightMap);\n },\n redo: () => {\n updateUndoableResizeZ(undoableResizeZ.newElementHeightMap, undoableResizeZ.newPartialWallHeightMap);\n },\n } as UndoableResizeBuildingZ;\n addUndoable(undoableResizeZ);\n };\n\n const setCommonStoreHandleType = (handleType: MoveHandleType | null) => {\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n });\n };\n\n const resizeXY = (p: Vector3) => {\n const pointer2D = new Vector2(p.x, p.y);\n const anchor = resizeAnchorRef.current.clone();\n\n if (lockAspectRatio) {\n const diagonalVector = new Vector2().subVectors(pointer2D, anchor);\n const diagonalDistance = Math.max(1, diagonalVector.length());\n\n const lx = Math.sqrt(Math.pow(diagonalDistance, 2) / (Math.pow(aspectRatio, 2) + 1));\n const ly = lx * aspectRatio;\n\n const center = new Vector2(lx * Math.sign(diagonalVector.x), ly * Math.sign(diagonalVector.y))\n .normalize()\n .multiplyScalar(diagonalDistance / 2)\n .add(anchor);\n\n setPosition(new Vector3(center.x, center.y));\n setDimension(lx, ly);\n\n setCommonStore((state) => {\n const tempWorldDataMap = new Map();\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const posRatio = basePosRatioMapRef.current.get(elem.id);\n const dmsRatio = baseDmsRatioMapRef.current.get(elem.id);\n if (posRatio && dmsRatio) {\n const newLx = dmsRatio[0] * lx;\n const newLy = dmsRatio[1] * ly;\n\n elem.lx = newLx;\n elem.ly = newLy;\n\n if (elem.parentId !== GROUND_ID) {\n const parentWorldData = tempWorldDataMap.get(elem.parentId);\n if (parentWorldData) {\n const { pos, rot } = parentWorldData;\n const worldCenter = new Vector3(posRatio[0] * lx + center.x, posRatio[1] * ly + center.y);\n const relativeCenter = worldCenter.clone().sub(pos).applyEuler(new Euler(0, 0, -rot));\n elem.cx = relativeCenter.x;\n elem.cy = relativeCenter.y;\n tempWorldDataMap.set(elem.id, { pos: worldCenter.clone(), rot: elem.rotation[2] + rot });\n }\n } else {\n const newCx = posRatio[0] * lx + center.x;\n const newCy = posRatio[1] * ly + center.y;\n elem.cx = newCx;\n elem.cy = newCy;\n tempWorldDataMap.set(elem.id, { pos: new Vector3(newCx, newCy), rot: elem.rotation[2] });\n }\n\n for (const e of state.elements) {\n if (e.foundationId === elem.id) {\n switch (e.type) {\n case ObjectType.Wall: {\n const wall = e as WallModel;\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\n if (!relativePosition) continue;\n const [leftRelPoint, rightRelPoint] = relativePosition;\n const leftPoint = [leftRelPoint.x * newLx, leftRelPoint.y * newLy, elem.lz];\n const rightPoint = [rightRelPoint.x * newLx, rightRelPoint.y * newLy, elem.lz];\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n wall.leftPoint = [...leftPoint];\n wall.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = e as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\n if (!relativePosition) continue;\n window.cx = relativePosition[0] * newLx;\n window.cy = relativePosition[1] * newLy;\n break;\n }\n }\n }\n }\n }\n }\n }\n });\n } else {\n const diagonal = anchor.distanceTo(pointer2D);\n const angle = Math.atan2(pointer2D.x - anchor.x, pointer2D.y - anchor.y) + rotation;\n const lx = Math.abs(diagonal * Math.sin(angle));\n const ly = Math.abs(diagonal * Math.cos(angle));\n const center = new Vector2().addVectors(pointer2D, anchor).multiplyScalar(0.5);\n setPosition(new Vector3(center.x, center.y));\n setDimension(lx, ly);\n setCommonStore((state) => {\n for (const elem of state.elements) {\n // foundationGroupSet only has one element here\n if (baseGroupSet.has(elem.id)) {\n elem.lx = lx;\n elem.ly = ly;\n elem.cx = center.x;\n elem.cy = center.y;\n }\n // child elements\n else if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n switch (elem.type) {\n case ObjectType.Wall: {\n const wall = elem as WallModel;\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\n if (!relativePosition) continue;\n const [leftRelPoint, rightRelPoint] = relativePosition;\n const leftPoint = [leftRelPoint.x * lx, leftRelPoint.y * ly, 0];\n const rightPoint = [rightRelPoint.x * lx, rightRelPoint.y * ly, 0];\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\n wall.leftPoint = [...leftPoint];\n wall.rightPoint = [...rightPoint];\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\n if (!relativePosition) continue;\n window.cx = relativePosition[0] * lx;\n window.cy = relativePosition[1] * ly;\n }\n }\n }\n }\n });\n }\n\n useStore.getState().updateElementOnRoofFn();\n };\n\n const resizeZ = (p: Vector3) => {\n if (p.z < 0.1) return;\n const height = p.z;\n setHeight(height);\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (elementHeightMapRef.current.has(elem.id)) {\n if (elem.type === ObjectType.Wall) {\n elem.lz = height * elementHeightMapRef.current.get(elem.id)!;\n const w = elem as WallModel;\n if (w.fill === WallFill.Partial) {\n const partialWallHeight = partialWallHeightMapRef.current.get(w.id);\n if (partialWallHeight) {\n w.leftTopPartialHeight = height * partialWallHeight.upperLeft;\n w.rightTopPartialHeight = height * partialWallHeight.upperRight;\n w.leftUnfilledHeight = height * partialWallHeight.lowerLeft;\n w.rightUnfilledHeight = height * partialWallHeight.lowerRight;\n }\n }\n } else if (elem.type === ObjectType.Roof) {\n (elem as RoofModel).rise = height * elementHeightMapRef.current.get(elem.id)!;\n } else if (elem.type === ObjectType.Cuboid) {\n const heightRatio = elementHeightMapRef.current.get(elem.id);\n if (heightRatio) {\n const newHeight = heightRatio * height;\n elem.lz = newHeight;\n elem.cz = newHeight / 2;\n }\n }\n }\n }\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const rotate = (p: Vector3) => {\n const resizerCenter = new Vector3(position.x, position.y);\n const r =\n Math.atan2(resizerCenter.x - p.x, p.y - resizerCenter.y) + (operation === Operation.RotateUpper ? 0 : Math.PI);\n const offset = Math.abs(r) > Math.PI ? -TWO_PI : 0;\n const rotateAngle = r + offset;\n const euler = new Euler(0, 0, rotateAngle);\n const groupSize = baseRotationMapRef.current.size;\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\n const oldCenter = baseRelPosMapRef.current.get(elem.id);\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.id) : 0;\n if (oldCenter && oldRotation !== undefined) {\n const newCenter = oldCenter.clone().applyEuler(euler);\n elem.cx = resizerCenter.x + newCenter.x;\n elem.cy = resizerCenter.y + newCenter.y;\n elem.rotation = [0, 0, oldRotation + rotateAngle];\n }\n }\n if (elem.type !== ObjectType.Cuboid && baseGroupSet.has(elem.parentId)) {\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.parentId) : 0;\n if (oldRotation !== undefined) {\n elem.rotation = [0, 0, oldRotation + rotateAngle];\n }\n }\n }\n });\n setRotation(rotateAngle);\n };\n\n const pointerDownBottomResizeHandle = (x: number, y: number) => {\n const positionV2 = new Vector2(position.x, position.y);\n resizeAnchorRef.current.set(x, y).rotateAround(zeroVector2, rotation).add(positionV2);\n setOperation(Operation.ResizeXY);\n\n basePosRatioMapRef.current.clear();\n baseDmsRatioMapRef.current.clear();\n wallRelPointsMapRef.current.clear();\n foundatonOldDataMapRef.current.clear();\n wallOldPointsMapRef.current.clear();\n skylightRelPosMapRef.current.clear();\n oldSkyligthPosMapRef.current.clear();\n\n const [currLx, currLy] = [hx * 2, hy * 2];\n for (const elem of useStore.getState().elements) {\n // base elements\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const { pos } = Util.getWorldDataById(elem.id);\n basePosRatioMapRef.current.set(elem.id, [(pos.x - position.x) / currLx, (pos.y - position.y) / currLy]);\n baseDmsRatioMapRef.current.set(elem.id, [elem.lx / currLx, elem.ly / currLy]);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\n }\n // child elements\n else if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n const foundation = getElementById(elem.foundationId);\n if (!foundation) continue;\n switch (elem.type) {\n case ObjectType.Wall: {\n const wall = elem as WallModel;\n const leftPointRelative = new Vector2(wall.leftPoint[0] / foundation.lx, wall.leftPoint[1] / foundation.ly);\n const rightPointRelative = new Vector2(\n wall.rightPoint[0] / foundation.lx,\n wall.rightPoint[1] / foundation.ly,\n );\n wallRelPointsMapRef.current.set(wall.id, [leftPointRelative, rightPointRelative]);\n wallOldPointsMapRef.current.set(wall.id, [...wall.leftPoint, ...wall.rightPoint]);\n break;\n }\n case ObjectType.Window: {\n const window = elem as WindowModel;\n if (window.parentType !== ObjectType.Roof) continue;\n skylightRelPosMapRef.current.set(window.id, [window.cx / foundation.lx, window.cy / foundation.ly]);\n oldSkyligthPosMapRef.current.set(window.id, [window.cx, window.cy]);\n break;\n }\n }\n }\n }\n };\n\n const pointerDonwTopResizeHandle = (x: number, y: number, z: number) => {\n const { x: cameraX, y: cameraY } = getCameraDirection();\n intersectionPlanePositionRef.current.set(x, y, z);\n intersectionPlaneRotationRef.current.set(-HALF_PI, 0, -Math.atan2(cameraX, cameraY) - rotation, 'ZXY');\n setOperation(Operation.ResizeZ);\n\n elementHeightMapRef.current.clear();\n elementOldHeightMapRef.current.clear();\n partialWallHeightMapRef.current.clear();\n oldPartialWallHeightMapRef.current.clear();\n\n for (const elem of useStore.getState().elements) {\n if (elem.foundationId && baseGroupSet.has(elem.foundationId)) {\n if (elem.type === ObjectType.Wall) {\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\n const w = elem as WallModel;\n if (w.fill === WallFill.Partial) {\n oldPartialWallHeightMapRef.current.set(w.id, {\n upperLeft: w.leftTopPartialHeight,\n upperRight: w.rightTopPartialHeight,\n lowerLeft: w.leftUnfilledHeight,\n lowerRight: w.rightUnfilledHeight,\n });\n partialWallHeightMapRef.current.set(w.id, {\n upperLeft: w.leftTopPartialHeight / height,\n upperRight: w.rightTopPartialHeight / height,\n lowerLeft: w.leftUnfilledHeight / height,\n lowerRight: w.rightUnfilledHeight / height,\n });\n }\n } else if (elem.type === ObjectType.Roof) {\n elementHeightMapRef.current.set(elem.id, (elem as RoofModel).rise / height);\n elementOldHeightMapRef.current.set(elem.id, (elem as RoofModel).rise);\n }\n } else if (baseGroupSet.has(elem.id)) {\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\n }\n }\n };\n\n const handleResizeHandlesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n switch (event.object.name) {\n case ResizeHandleType.UpperLeft: {\n pointerDownBottomResizeHandle(hx, -hy);\n break;\n }\n case ResizeHandleType.UpperRight: {\n pointerDownBottomResizeHandle(-hx, -hy);\n break;\n }\n case ResizeHandleType.LowerLeft: {\n pointerDownBottomResizeHandle(hx, hy);\n break;\n }\n case ResizeHandleType.LowerRight: {\n pointerDownBottomResizeHandle(-hx, hy);\n break;\n }\n case ResizeHandleType.UpperLeftTop: {\n pointerDonwTopResizeHandle(-hx, hy, height);\n break;\n }\n case ResizeHandleType.UpperRightTop: {\n pointerDonwTopResizeHandle(hx, hy, height);\n break;\n }\n case ResizeHandleType.LowerLeftTop: {\n pointerDonwTopResizeHandle(-hx, -hy, height);\n break;\n }\n case ResizeHandleType.LowerRightTop: {\n pointerDonwTopResizeHandle(hx, -hy, height);\n break;\n }\n }\n };\n\n const handleMoveHanldesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n setOperation(Operation.Move);\n if (event.intersections.length > 0) {\n const p = event.intersections[0].point.clone().setZ(0);\n resizerCenterRelPosRef.current.subVectors(position, p);\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const c = new Vector3(elem.cx, elem.cy);\n const v = new Vector3().subVectors(c, p);\n baseRelPosMapRef.current.set(elem.id, v);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n }\n };\n\n const handleRotateHandlesPointerDown = (event: ThreeEvent) => {\n initPointerDown(event);\n if (event.object.name === RotateHandleType.Lower) {\n setOperation(Operation.RotateLower);\n } else if (event.object.name === RotateHandleType.Upper) {\n setOperation(Operation.RotateUpper);\n }\n if (event.intersections.length > 0) {\n const resizerCenter = new Vector3(position.x, position.y);\n for (const elem of useStore.getState().elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id)) {\n const elemCenter = new Vector3(elem.cx, elem.cy);\n const v = new Vector3().subVectors(elemCenter, resizerCenter);\n baseRelPosMapRef.current.set(elem.id, v);\n baseRotationMapRef.current.set(elem.id, elem.rotation[2]);\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n if (baseGroupSet.has(elem.parentId)) {\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\n }\n }\n }\n };\n\n const handleIntersectionPlanePointerUp = (event: ThreeEvent) => {\n switch (operation) {\n case Operation.Move:\n case Operation.RotateLower:\n case Operation.RotateUpper:\n addUndoableMove();\n break;\n case Operation.ResizeXY:\n addUndoableResizeXY();\n break;\n case Operation.ResizeZ:\n addUndoableReseizeZ();\n break;\n }\n setShowIntersectionPlane(false);\n useRefStore.getState().setEnableOrbitController(true);\n pointerDownRef.current = false;\n setOperation(Operation.Null);\n setCommonStoreHandleType(null);\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.updateElementOnRoofFlag = true;\n });\n };\n\n const handleIntersectionPlanePointerMove = (event: ThreeEvent) => {\n if (!intersectionPlaneRef.current || !pointerDownRef.current) return;\n setRayCast(event);\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n switch (operation) {\n case Operation.ResizeXY:\n resizeXY(p);\n break;\n case Operation.ResizeZ:\n resizeZ(p);\n break;\n case Operation.RotateLower:\n case Operation.RotateUpper:\n rotate(p);\n break;\n case Operation.Move:\n setPosition(new Vector3().addVectors(p.clone().setZ(0), resizerCenterRelPosRef.current));\n setCommonStore((state) => {\n for (const elem of state.elements) {\n if (isGroupable(elem) && baseGroupSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\n const v = baseRelPosMapRef.current.get(elem.id);\n if (v) {\n elem.cx = p.x + v.x;\n elem.cy = p.y + v.y;\n }\n }\n }\n });\n break;\n }\n }\n };\n\n const handleSize = useHandleSize();\n const bottomHanldeZ = handleSize / 2;\n const topHanldeZ = height + bottomHanldeZ - handleSize / 2;\n const moveHanldeX = hx + handleSize;\n const moveHnadleY = hy + handleSize;\n const resizeHandleY = hy + handleSize * 4;\n\n return (\n \n \n \n \n \n \n {!orthographic && (\n <>\n \n \n \n \n \n )}\n \n\n \n \n \n \n \n \n\n \n \n \n \n\n {showIntersectionPlane && (\n \n )}\n\n \n \n \n \n );\n};\n\nexport default React.memo(GroupMaster);\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","/*\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","/*\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 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 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.Select);\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\r\n useEffect(() => {\r\n if (deletedRoofId === 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 }, [deletedRoofId]);\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 (useStore.getState().groupActionMode) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n e.stopPropagation();\r\n } else {\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\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\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 { useUpdateOldFiles } from './hooks';\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 useUpdateOldFiles(wallModel);\r\n\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 MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\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 GroupMaster from 'src/components/groupMaster';\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 { useGroupMaster, 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 const groupMasterId = useStore(Selector.groupMasterId);\r\n\r\n const { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation } =\r\n useGroupMaster(foundationModel, groupMasterId);\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 const autoDeletedRoof = useStore(Selector.autoDeletedRoof);\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 }, [autoDeletedRoof, 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.autoDeletedRoof = 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 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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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.autoDeletedRoof = null;\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 (useStore.getState().groupActionMode) {\r\n useStore.getState().setGroupMasterId(id);\r\n }\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.Select);\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 && !groupMasterId && (\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 selectMe(id, e, ActionType.Move);\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 {selected && !locked && groupMasterId === id && foundationModel && groupMasterDimension && (\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 { ShutterProps } from 'src/models/WindowModel';\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 shutter: ShutterProps;\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 {\n width: mullionWidth,\n spacingX: mullionSpacingX,\n spacingY: mullionSpacingY,\n color: mullionColor,\n } = 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 / mullionSpacingX) - 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, mullionSpacingX]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lz / mullionSpacingY) - 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, mullionSpacingY]);\n\n return (\n \n {verticalMullions.map((x, index) => (\n \n {material}\n \n ))}\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 shutter,\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(() => shutter.width * lx, [lx, shutter]);\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.showMullion && (\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, { useEffect, 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 const defaultShutter = { showLeft: false, showRight: false, color: 'grey', width: 0.5 };\r\n\r\nexport type MullionDataType = {\r\n showMullion: boolean;\r\n width: number;\r\n spacingX: number;\r\n spacingY: 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\nconst useUpdateOldFiles = (windowModel: WindowModel) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (\r\n windowModel.mullion === undefined ||\r\n windowModel.mullionWidth === undefined ||\r\n windowModel.mullionSpacing === undefined ||\r\n windowModel.tint === undefined ||\r\n windowModel.opacity === undefined ||\r\n windowModel.shutter === undefined ||\r\n windowModel.mullionColor === undefined ||\r\n windowModel.frame === undefined ||\r\n windowModel.color === undefined ||\r\n windowModel.frameWidth === undefined ||\r\n windowModel.windowType === undefined ||\r\n windowModel.archHeight === undefined\r\n ) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === windowModel.id) {\r\n const w = e as WindowModel;\r\n if (w.mullion === undefined) {\r\n w.mullion = true;\r\n }\r\n if (w.mullionWidth === undefined) {\r\n w.mullionWidth = 0.06;\r\n }\r\n if (w.mullionSpacing === undefined) {\r\n w.mullionSpacing = 0.5;\r\n }\r\n if (w.tint === undefined) {\r\n w.tint = '#73D8FF';\r\n }\r\n if (w.opacity === undefined) {\r\n w.opacity = 0.5;\r\n }\r\n if (w.shutter === undefined) {\r\n w.shutter = defaultShutter;\r\n }\r\n if (w.mullionColor === undefined) {\r\n w.mullionColor = 'white';\r\n }\r\n if (w.frame === undefined) {\r\n w.frame = false;\r\n }\r\n if (w.color === undefined) {\r\n w.color = 'white';\r\n }\r\n if (w.frameWidth === undefined) {\r\n w.frameWidth = 0.1;\r\n }\r\n if (w.windowType === undefined) {\r\n w.windowType = WindowType.Default;\r\n }\r\n if (w.archHeight === undefined) {\r\n w.archHeight = 1;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\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 mullion: showMullion = true,\r\n mullionWidth = 0.06,\r\n mullionSpacing = 0.5,\r\n tint = '#73D8FF',\r\n opacity = 0.5,\r\n shutter = defaultShutter,\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 useUpdateOldFiles(windowModel);\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 = () => {\r\n setCommonStore((state) => {\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 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();\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 showMullion,\r\n width: mullionWidth,\r\n spacingX: mullionSpacing,\r\n spacingY: mullionSpacing,\r\n color: mullionColor,\r\n } as MullionDataType),\r\n [showMullion, mullionWidth, mullionSpacing, 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","/*\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 deletedRoofId = useStore(Selector.deletedRoofId);\r\n const autoDeletedRoof = useStore(Selector.autoDeletedRoof);\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 (deletedRoofId === roofId || autoDeletedRoof?.id === 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 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, deletedRoofId, autoDeletedRoof]);\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 (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 state.groupMasterId = parentId;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\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 = new Vector3((-selectedElement.lx / 2) * lx, 0, (selectedElement.lz / 2) * lz);\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.addedRoofId = 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) {\r\n return;\r\n }\r\n selectMe(id, e, ActionType.Select);\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 }\r\n\r\n function handleWallSideSurfacePointerDown(e: ThreeEvent) {\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 state.groupMasterId = parentId;\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.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.groupMasterId = parentId;\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.Select);\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","/*\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, 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, useUpdateOldDoors } 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 useUpdateOldDoors(doorModel);\r\n\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 const selectMe = () => {\r\n setCommonStore((state) => {\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 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();\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 (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 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\nexport const useUpdateOldDoors = (doorModel: DoorModel) => {\r\n const isFileChangedFlag = useStore(fileChanged);\r\n useEffect(() => {\r\n if (doorModel.doorType === undefined || doorModel.archHeight === undefined || doorModel.filled === undefined) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === doorModel.id && e.type === 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 }\r\n });\r\n }\r\n }, [isFileChangedFlag]);\r\n};\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cone, Line, Plane, Ring, Sphere } from '@react-three/drei';\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../../constants';\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\nimport { Util } from '../../Util';\nimport { SolarPanelModel, SolarPanelModelOnWall } from '../../models/SolarPanelModel';\nimport { LineData } from '../LineData';\nimport { getSunDirection } from 'src/analysis/sunTools';\nimport i18n from 'src/i18n/i18n';\nimport { WallModel } from 'src/models/WallModel';\nimport { FoundationModel } from 'src/models/FoundationModel';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { PvModel } from 'src/models/PvModel';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { useSelected } from '../hooks';\n\ninterface SunbeamProps {\n drawSunbeam: boolean;\n absRotation: number;\n tiltAngle: number;\n}\n\ninterface LabelProps {\n sp: SolarPanelModelOnWall;\n}\n\ninterface TiltHandleProps {\n tiltAngle: number;\n handleSize: number;\n initPointerDown: () => void;\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\n handlePointerUp: () => void;\n}\n\nconst Sunbeam = React.memo(({ drawSunbeam, absRotation, tiltAngle }: SunbeamProps) => {\n const normalVector = new Vector3(0, 0, 1);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const sceneRadius = useStore(Selector.sceneRadius);\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude).applyEuler(new Euler(-HALF_PI - tiltAngle, 0, -absRotation));\n }, [date, latitude, absRotation, tiltAngle]);\n\n return (\n <>\n {drawSunbeam && sunDirection.z > 0 && (\n \n \n \n \n \n \n \n \n \n \n )}\n \n );\n});\n\nconst Label = ({ sp }: LabelProps) => {\n useStore(Selector.elements);\n const getElementById = useStore(Selector.getElementById);\n const language = useStore(Selector.language);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n if (!sp.foundationId || !sp.parentId) {\n return null;\n }\n\n const wall = getElementById(sp.parentId) as WallModel;\n const foundation = getElementById(sp.foundationId) as FoundationModel;\n\n if (!wall || !foundation) {\n return null;\n }\n\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\n const wCenter = new Vector3(wall.cx, wall.cy, wall.cz);\n\n const center = new Vector3(sp.cx * wall.lx, 0, sp.cz * wall.lz)\n .applyEuler(new Euler(0, 0, wall.relativeAngle))\n .add(wCenter)\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\n .add(fCenter);\n\n const labelText =\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\n (sp?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n center.x.toFixed(1) +\n ', ' +\n center.y.toFixed(1) +\n ', ' +\n center.z.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang));\n\n return (\n \n );\n};\n\nconst TiltHandle = ({\n tiltAngle,\n handleSize,\n initPointerDown,\n handlePointerMove,\n handlePointerUp,\n}: TiltHandleProps) => {\n const { gl } = useThree();\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n const [showIntersection, setShowIntersectionPlane] = useState(false);\n const tiltHandleRef = useRef();\n const intersectionPlaneRef = useRef();\n const degree = useMemo(() => new Array(7).fill(0), []);\n const setCommonStore = useStore(Selector.set);\n\n return (\n <>\n {/* ring handles */}\n {\n gl.domElement.style.cursor = 'grab';\n setColor(HIGHLIGHT_HANDLE_COLOR);\n }}\n onPointerOut={() => {\n gl.domElement.style.cursor = 'default';\n setColor(RESIZE_HANDLE_COLOR);\n }}\n onPointerDown={(e) => {\n initPointerDown();\n e.stopPropagation();\n setShowTiltAngle(true);\n setShowIntersectionPlane(true);\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {showIntersection && (\n {\n handlePointerMove(e, intersectionPlaneRef);\n }}\n onPointerUp={() => {\n handlePointerUp();\n setShowIntersectionPlane(false);\n setShowTiltAngle(false);\n }}\n >\n \n \n )}\n\n \n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n );\n};\n\nconst Mount = React.memo(\n ({ tiltAngle, spCy, spLy, lx, nx }: { tiltAngle: number; spCy: number; spLy: number; lx: number; nx: number }) => {\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const mountUnit = useMemo(() => {\n const halfLz = (spLy * Math.cos(tiltAngle)) / 2;\n const startZ = spLy * 0.75 - halfLz;\n const ly = -spCy * 1.5;\n const lz = startZ - halfLz / 2;\n const length = Math.hypot(ly, lz);\n const rotationX = Math.atan2(lz, ly);\n return (\n \n \n \n \n \n );\n }, [tiltAngle, spCy, spLy]);\n\n const arr = useMemo(() => {\n const arr: number[] = [];\n let curr = nx % 2 === 0 ? lx / 2 : 0;\n while (curr < (nx * lx) / 2) {\n arr.push(curr, -curr);\n curr += lx;\n }\n return arr;\n }, [lx, nx]);\n\n return (\n \n {arr.map((val, idx) => (\n \n {mountUnit}\n \n ))}\n \n );\n },\n);\n\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\n\nconst SolarPanelOnWall = ({\n id,\n pvModelName = 'SPR-X21-335-BLK',\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n color = 'white',\n locked = false,\n parentId,\n foundationId,\n orientation = Orientation.portrait,\n showLabel,\n drawSunBeam,\n absRotation,\n tiltAngle,\n relativeAzimuth,\n}: SolarPanelModelOnWall) => {\n tiltAngle = Math.min(0, tiltAngle);\n\n const selected = useSelected(id);\n\n const setCommonStore = useStore(Selector.set);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const pvModules = useStore(Selector.pvModules);\n\n const { camera, gl } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [nx, setNx] = useState(1);\n const baseRef = useRef();\n const solarPanelLinesRef = useRef();\n const pointerDownRef = useRef(false);\n const oldTiltRef = useRef(null);\n\n const ray = useMemo(() => new Raycaster(), []);\n const mouse = useMemo(() => new Vector2(), []);\n\n const pvModel = pvModules[pvModelName] as PvModel;\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const solarPanel = getElementById(id) as SolarPanelModelOnWall;\n\n useEffect(() => {\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n setNx(mx);\n solarPanelLinesRef.current = [];\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n }, [orientation, pvModelName, lx, ly, lz]);\n\n const euler = useMemo(() => {\n return new Euler(HALF_PI, 0, 0);\n }, []);\n\n const relativeEuler = useMemo(() => {\n return new Euler(tiltAngle, 0, 0, 'ZXY');\n }, [tiltAngle]);\n\n const hoverHandle = (e: ThreeEvent) => {\n if (e.intersections.length > 0) {\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\n if (intersected) {\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n gl.domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n gl.domElement.style.cursor = 'grab';\n } else {\n gl.domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n gl.domElement.style.cursor = 'default';\n };\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const tiltHandleSize = (baseSize * 2) / 3;\n\n cy = (ly * Math.sin(tiltAngle)) / 2;\n\n const setRayCast = (e: PointerEvent) => {\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, camera);\n };\n\n const initPointerDown = () => {\n oldTiltRef.current = tiltAngle;\n pointerDownRef.current = true;\n useRefStore.getState().setEnableOrbitController(false);\n };\n\n const tiltHandlePointerMove = (\n e: ThreeEvent,\n intersectionPlaneRef: React.MutableRefObject,\n ) => {\n if (pointerDownRef.current) {\n setRayCast(e);\n if (intersectionPlaneRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects.length > 0) {\n const pointer = intersects[0].point;\n const center = intersectionPlaneRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\n if (center) {\n const cv = new Vector3().subVectors(pointer, center);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const wr = absRotation;\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle = sign * angle - HALF_PI;\n angle = Util.clamp(angle, -HALF_PI, 0);\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\n }\n }\n }\n }\n };\n\n const tiltHandlePointerUp = () => {\n const sp = getElementById(id) as SolarPanelModel;\n if (sp && oldTiltRef.current !== null && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltRef.current,\n newValue: sp.tiltAngle,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n useStore\n .getState()\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\n },\n redo: () => {\n useStore\n .getState()\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\n },\n } as UndoableChange;\n useStore.getState().addUndoable(undoableChange);\n }\n useRefStore.getState().setEnableOrbitController(true);\n pointerDownRef.current = false;\n };\n\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.resizeHandleType = handleType;\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\n });\n };\n\n const clickHandle = (e: ThreeEvent) => {\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\n const handleType = e.object.name;\n switch (handleType) {\n case MoveHandleType.Default: {\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\n });\n break;\n }\n case ResizeHandleType.Left: {\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, 0));\n break;\n }\n case ResizeHandleType.Right: {\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, 0));\n break;\n }\n case ResizeHandleType.Lower: {\n onClickResizeHandle(handleType, new Vector3(0, 0, ly / 2));\n break;\n }\n case ResizeHandleType.Upper: {\n onClickResizeHandle(handleType, new Vector3(0, 0, -ly / 2));\n break;\n }\n }\n }\n };\n\n const texture = useSolarPanelTexture(\n lx,\n ly,\n pvModel,\n orientation,\n solarPanel?.frameColor,\n solarPanel?.backsheetColor,\n );\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n const renderTopTextureMaterial = () => {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return ;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n };\n\n const renderBotTextureMaterial = () => {\n if (pvModel?.bifacialityFactor === 0 || tiltAngle === 0) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n };\n\n return (\n <>\n \n \n {/* draw panel */}\n {\n if (\n e.button === 2 ||\n useStore.getState().isAddingElement() ||\n useStore.getState().objectTypeToAdd !== ObjectType.None\n )\n return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n gl.domElement.style.cursor = 'move';\n setHovered(true);\n }\n }\n }}\n onPointerOut={(e) => {\n gl.domElement.style.cursor = 'default';\n setHovered(false);\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLinesRef.current &&\n solarPanelLinesRef.current.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n\n \n\n {/*draw label */}\n {(hovered || showLabel) && !selected && \n\n {tiltAngle !== 0 && pvModel && (\n \n )}\n \n\n {selected && !locked && (\n \n \n \n )}\n \n );\n};\n\nexport default React.memo(SolarPanelOnWall);\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);\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);\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);\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 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 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 { 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\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 }\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 };\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 // 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 {/* 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?: () => 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, 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 const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === handleType) {\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = 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 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';\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { getSunDirection } from 'src/analysis/sunTools';\nimport RotateHandle from 'src/components/rotateHandle';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from 'src/constants';\nimport i18n from 'src/i18n/i18n';\nimport { ElementModel } from 'src/models/ElementModel';\nimport { PvModel } from 'src/models/PvModel';\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\nimport { useStore } from 'src/stores/common';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { useRefStore } from 'src/stores/commonRef';\nimport {\n ActionType,\n BoxArgs,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n TrackerType,\n} from 'src/types';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport { Util } from 'src/Util';\nimport { Euler, Vector3, Mesh, DoubleSide, Color, FrontSide } from 'three';\nimport * as Selector from '../../stores/selector';\nimport { LineData } from '../LineData';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { useSelected } from '../hooks';\n\ninterface SolarPanelBoxGroupProps {\n solarPanelModel: SolarPanelModel;\n groupRotation: Euler;\n panelRotation: Euler;\n}\n\ninterface SunbeamProps {\n sunDirection: Vector3;\n}\n\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\n\nconst SolarPanelOnCuboid = (solarPanelModel: SolarPanelModel) => {\n const {\n id,\n parentId,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n normal,\n locked,\n trackerType,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius,\n poleSpacing,\n color = 'white',\n } = solarPanelModel;\n\n const selected = useSelected(id);\n\n const isTop = isSolarPanelOnTopFace(normal);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = isTop ? poleHeight : 0;\n const baseSize = Math.max(1, (lx + ly) / 16);\n const rotateHandleSize = (baseSize * 2) / 3;\n const tiltHandleSize = (baseSize * 2) / 3;\n const poleZ = -poleHeight / 2 - lz / 2;\n\n const setCommonStore = useStore(Selector.set);\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\n const addUndoable = useStore(Selector.addUndoable);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n\n const {\n gl: { domElement },\n camera,\n raycaster,\n mouse,\n } = useThree();\n\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n\n const pointerDown = useRef(false);\n const oldTiltAngleRef = useRef(0);\n const newTiltAngleRef = useRef(0);\n const parentWorldPositionRef = useRef(null);\n const parentWorldRotationRef = useRef(null);\n\n const tiltHandleRef = useRef();\n\n const degree = useMemo(() => new Array(13).fill(0), []);\n const dateObject = useMemo(() => new Date(date), [date]);\n\n const poles = useMemo(() => {\n const poleArray: Vector3[] = [];\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\n const sinTilt = 0.5 * Math.sin(tiltAngle);\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\n for (let ix = -poleNx; ix <= poleNx; ix++) {\n for (let iy = -poleNy; iy <= poleNy; iy++) {\n const xi = ix * cosAz - iy * sinAz;\n const yi = ix * sinAz + iy * cosAz;\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\n }\n }\n return poleArray;\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\n\n const groupRotation = useMemo(() => getRotationFromNormal(normal), [normal]);\n\n const panelRotation = useMemo(() => {\n if (isTop) {\n if (trackerType === TrackerType.NO_TRACKER) {\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }\n const sunDirection = getSunDirection(dateObject, latitude);\n const rot = getWorldRotationZ(parentId, groupRotation.z) - groupRotation.z;\n switch (trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const r = Math.hypot(sunDirection.x, sunDirection.y);\n return new Euler(\n Math.atan2(r, sunDirection.z),\n 0,\n Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot,\n 'ZXY',\n );\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n return new Euler(0, Math.atan2(sunDirection.x, sunDirection.z), -rot + (lx < ly ? 0 : HALF_PI), 'XYZ');\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n return new Euler(tiltAngle, 0, Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot, 'ZXY');\n }\n }\n return new Euler();\n }, [isTop, tiltAngle, relativeAzimuth, trackerType, dateObject, latitude]);\n\n const showRotateHandle = selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop;\n const showTiltHandle =\n selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop && Math.abs(actualPoleHeight) > 0.1;\n const showPoles = actualPoleHeight > 0 && isTop;\n\n // handle pointer up\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n setShowTiltAngle(false);\n setCommonStore((state) => {\n state.rotateHandleType = null;\n state.moveHandleType = null;\n state.resizeHandleType = null;\n });\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const getRotateHandleColor = (rotateHandleType: RotateHandleType) => {\n return hoveredHandle === rotateHandleType || useStore.getState().rotateHandleType === rotateHandleType\n ? HIGHLIGHT_HANDLE_COLOR\n : RESIZE_HANDLE_COLOR;\n };\n\n return (\n \n \n\n {/* draw rotate handles */}\n {showRotateHandle && (\n \n {/* rotate handles */}\n \n \n \n )}\n\n {/* draw tilt handles */}\n {showTiltHandle && (\n <>\n {/* ring handles */}\n {\n hoverHandle(e, RotateHandleType.Tilt);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n setShowTiltAngle(true);\n if (hoveredHandle) {\n useRefStore.getState().setEnableOrbitController(false);\n pointerDown.current = true;\n // const sp = getElementById(id) as SolarPanelModel;\n oldTiltAngleRef.current = tiltAngle;\n const { rot } = Util.getWorldDataById(parentId);\n parentWorldRotationRef.current = rot;\n }\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltAngleRef.current,\n newValue: newTiltAngleRef.current,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n }}\n onPointerMove={(e) => {\n if (pointerDown.current) {\n raycaster.setFromCamera(mouse, camera);\n if (tiltHandleRef.current) {\n const intersects = raycaster.intersectObjects([tiltHandleRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n const parent = tiltHandleRef.current.parent;\n if (parent) {\n const ov = parent.localToWorld(new Vector3()); // rotate point in world coordinate\n const cv = new Vector3().subVectors(p, ov);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > actualPoleHeight;\n if (!touch) {\n const wr = relativeAzimuth + (parentWorldRotationRef.current ?? 0);\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle *= sign;\n updateSolarPanelTiltAngleById(id, angle);\n newTiltAngleRef.current = angle;\n }\n }\n }\n }\n }\n }}\n >\n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n )}\n\n {/* draw poles */}\n {showPoles &&\n poles.map((p, i) => {\n return (\n \n \n \n );\n })}\n \n );\n};\n\nconst SolarPanelBoxGroup = ({ solarPanelModel, groupRotation, panelRotation }: SolarPanelBoxGroupProps) => {\n let {\n id,\n parentId,\n lx,\n ly,\n lz,\n cx,\n cy,\n cz,\n normal,\n tiltAngle,\n relativeAzimuth,\n trackerType,\n drawSunBeam,\n selected,\n locked,\n showLabel,\n label,\n pvModelName,\n orientation,\n frameColor,\n backsheetColor,\n color,\n poleHeight,\n } = solarPanelModel;\n\n const setCommonStore = useStore(Selector.set);\n const selectMe = useStore(Selector.selectMe);\n\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const language = useStore(Selector.language);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const pvModules = useStore(Selector.pvModules);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const isTop = isSolarPanelOnTopFace(normal);\n const actualTiltAngle = isTop ? tiltAngle : 0;\n const actualRelativeAzimuth = isTop ? relativeAzimuth : 0;\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const [hx, hy, hz] = [lx, ly, lz].map((v) => v / 2);\n const resizeHandleArgs = [resizeHandleSize, resizeHandleSize, lz * 1.2] as BoxArgs;\n const pvModel = pvModules[pvModelName] as PvModel;\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const dateObject = useMemo(() => new Date(date), [date]);\n const labelText = useMemo(() => {\n return (\n (label ? label : i18n.t('shared.SolarPanelElement', lang)) +\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [label, locked, language, cx, cy, cz]);\n\n const solarPanelLines = useMemo(() => {\n const lines: LineData[] = [];\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n lines.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n lines.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n return lines;\n }, [pvModel, orientation, pvModelName, lx, ly, lz]);\n\n const [relativeSunDirection, setRelativeSunDirection] = useState(getRelativeSunDirection());\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n\n const baseRef = useRef(null);\n\n const { gl } = useThree();\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n useFrame(() => {\n const newRelativeSunDirection = getRelativeSunDirection();\n if (!newRelativeSunDirection.equals(relativeSunDirection)) {\n setRelativeSunDirection(newRelativeSunDirection);\n }\n });\n\n function getRelativeSunDirection(): Vector3 {\n const euler = new Euler();\n const worldRotationZ = getWorldRotationZ(parentId, groupRotation.z);\n if (trackerType === TrackerType.NO_TRACKER) {\n euler.set(-groupRotation.x - actualTiltAngle, 0, -worldRotationZ - actualRelativeAzimuth);\n } else {\n euler.set(-groupRotation.x - panelRotation.x, -panelRotation.y, -worldRotationZ - panelRotation.z);\n }\n return getSunDirection(dateObject, latitude).applyEuler(euler);\n }\n\n function getResizeHandleColor(handleType: ResizeHandleType) {\n return hoveredHandle === handleType || resizeHandleType === handleType\n ? HIGHLIGHT_HANDLE_COLOR\n : RESIZE_HANDLE_COLOR;\n }\n\n function hoverHandle(e: ThreeEvent) {\n if (e.intersections.length > 0) {\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\n if (intersected) {\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n gl.domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n gl.domElement.style.cursor = 'grab';\n } else {\n gl.domElement.style.cursor = 'pointer';\n }\n }\n }\n }\n\n function noHoverHandle() {\n setHoveredHandle(null);\n gl.domElement.style.cursor = 'default';\n }\n\n function onClickResizeHandle(handleType: ResizeHandleType, anchor: Vector3) {\n useRefStore.getState().setEnableOrbitController(false);\n setCommonStore((state) => {\n state.resizeHandleType = handleType;\n state.resizeAnchor.copy(anchor);\n });\n }\n\n function clickHandle(e: ThreeEvent) {\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\n const handleType = e.object.name;\n switch (handleType) {\n case MoveHandleType.Default: {\n useRefStore.getState().setEnableOrbitController(false);\n setCommonStore((state) => {\n state.moveHandleType = handleType;\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\n });\n break;\n }\n case ResizeHandleType.Left: {\n const anchor = e.object.localToWorld(new Vector3(lx, 0, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Right: {\n const anchor = e.object.localToWorld(new Vector3(-lx, 0, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Lower: {\n const anchor = e.object.localToWorld(new Vector3(0, ly, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n case ResizeHandleType.Upper: {\n const anchor = e.object.localToWorld(new Vector3(0, -ly, 0));\n onClickResizeHandle(handleType, anchor);\n break;\n }\n }\n }\n }\n\n function renderTopTextureMaterial() {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return ;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n }\n\n function renderBotTextureMaterial() {\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n }\n\n return (\n <>\n \n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n gl.domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n gl.domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {/* move & resize handles */}\n {selected && !locked && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n\n {/* sun beam */}\n {drawSunBeam && relativeSunDirection.z > 0 && }\n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLines.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n \n\n {/*draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nconst Sunbeam = React.memo(({ sunDirection }: SunbeamProps) => {\n const sceneRadius = useStore(Selector.sceneRadius);\n\n const sunBeamLength = useMemo(() => Math.max(100, 10 * sceneRadius), [sceneRadius]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n});\n\nexport function getRotationFromNormal(normal: number[]) {\n const [x, y, z] = normal;\n if (z === 1) {\n return new Euler(0, 0, 0);\n }\n if (x !== 0) {\n return new Euler(HALF_PI, 0, x * HALF_PI, 'ZXY');\n }\n if (y !== 0) {\n return new Euler(-y * HALF_PI, 0, 0);\n }\n return new Euler();\n}\n\nexport function isSolarPanelOnTopFace(normal: number[]) {\n return Math.abs(normal[2] - 1) < 0.01;\n}\n\nfunction getWorldRotationZ(parentId: string, selfRotation: number) {\n const { rot } = Util.getWorldDataById(parentId);\n return rot + selfRotation;\n}\n\nexport default React.memo(SolarPanelOnCuboid);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport Facade_Texture_00 from '../../resources/tiny_white_square.png';\nimport Facade_Texture_01 from '../../resources/building_facade_01.png';\nimport Facade_Texture_02 from '../../resources/building_facade_02.png';\nimport Facade_Texture_03 from '../../resources/building_facade_03.png';\nimport Facade_Texture_04 from '../../resources/building_facade_04.png';\nimport Facade_Texture_05 from '../../resources/building_facade_05.png';\nimport Facade_Texture_06 from '../../resources/building_facade_06.png';\nimport Facade_Texture_07 from '../../resources/building_facade_07.png';\nimport Facade_Texture_08 from '../../resources/building_facade_08.png';\nimport Facade_Texture_09 from '../../resources/building_facade_09.png';\nimport Facade_Texture_10 from '../../resources/building_facade_10.png';\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Plane } from '@react-three/drei';\nimport { CanvasTexture, Euler, FrontSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from '../../stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { CuboidModel } from '../../models/CuboidModel';\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n ActionType,\n CuboidTexture,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n} from '../../types';\nimport {\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n ORIGIN_VECTOR2,\n TWO_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 UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../../constants';\nimport { Util } from '../../Util';\nimport { ElementModel } from '../../models/ElementModel';\nimport { PolarGrid } from '../polarGrid';\nimport Wireframe from '../../components/wireframe';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { UndoableAdd } from '../../undo/UndoableAdd';\nimport { UndoableMove } from '../../undo/UndoableMove';\nimport { UndoableResize } from '../../undo/UndoableResize';\nimport { UndoableChange } from '../../undo/UndoableChange';\nimport i18n from '../../i18n/i18n';\nimport { Point2 } from '../../models/Point2';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { ElementGrid } from '../elementGrid';\nimport { HorizontalRuler } from '../horizontalRuler';\nimport { showError } from '../../helpers';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\nimport Handles from './handles';\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\nimport { getSolarPanelUnitLength } from '../wall/wall';\nimport { isSolarPanelOnTopFace } from '../solarPanel/solarPanelOnCuboid';\nimport { useSelected } from '../hooks';\n\nconst Cuboid = (cuboidModel: CuboidModel) => {\n const {\n id,\n cx,\n cy,\n lx = 1,\n ly = 1,\n lz = 1,\n color = 'silver',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n textureTypes = [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n stackable,\n } = cuboidModel;\n\n const selected = useSelected(id);\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const orthographic = useStore(Selector.viewState.orthographic);\n const getElementById = useStore(Selector.getElementById);\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const addElement = useStore(Selector.addElement);\n const removeElementById = useStore(Selector.removeElementById);\n const updateElementLxById = useStore(Selector.updateElementLxById);\n const updateElementLyById = useStore(Selector.updateElementLyById);\n const setElementPosition = useStore(Selector.setElementPosition);\n const setElementSize = useStore(Selector.setElementSize);\n const setElementNormal = useStore(Selector.setElementNormal);\n const selectMe = useStore(Selector.selectMe);\n const updateSolarPanelRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\n const getPvModule = useStore(Selector.getPvModule);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const addUndoable = useStore(Selector.addUndoable);\n const isAddingElement = useStore(Selector.isAddingElement);\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const groundImage = useStore(Selector.viewState.groundImage);\n const groupMasterId = useStore(Selector.groupMasterId);\n\n const {\n camera,\n gl: { domElement },\n raycaster,\n mouse,\n } = useThree();\n const [heatmapTextureTop, setHeatmapTextureTop] = useState(null);\n const [heatmapTextureSouth, setHeatmapTextureSouth] = useState(null);\n const [heatmapTextureNorth, setHeatmapTextureNorth] = useState(null);\n const [heatmapTextureWest, setHeatmapTextureWest] = useState(null);\n const [heatmapTextureEast, setHeatmapTextureEast] = useState(null);\n const [hovered, setHovered] = useState(false);\n const [showGrid, setShowGrid] = useState(false);\n const [normal, setNormal] = useState();\n\n const groupRef = useRef(null);\n const baseRef = useRef();\n const grabRef = useRef(null);\n const faceNormalRef = useRef(UNIT_VECTOR_POS_Z);\n const gridPositionRef = useRef(new Vector3(0, 0, 0));\n const gridRotationRef = useRef(new Euler(0, 0, 0));\n const gridDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldPositionRef = useRef(new Vector3());\n const newPositionRef = useRef(new Vector3());\n const oldNormalRef = useRef(new Vector3());\n const newNormalRef = useRef(new Vector3());\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldAzimuthRef = useRef(0);\n const newAzimuthRef = useRef(0);\n const oldVerticesRef = useRef([]);\n const newVerticesRef = useRef([]);\n const intersectPlaneRef = useRef();\n const worldPositionRef = useRef(new Vector3());\n const worldRotationRef = useRef(0);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\n if (grabRef.current && grabRef.current.type === ObjectType.SolarPanel) {\n const isTop = isSolarPanelOnTopFace(grabRef.current.normal);\n const actualPoleHeight = isTop ? (grabRef.current as SolarPanelModel).poleHeight : 0;\n intersectionPlanePosition.set(0, 0, cuboidModel.lz / 2 + actualPoleHeight);\n }\n\n const labelText = useMemo(() => {\n return (\n (cuboidModel?.label ? cuboidModel.label : i18n.t('shared.CuboidElement', lang)) +\n (cuboidModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (cuboidModel?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n (lz / 2).toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [cuboidModel?.label, locked, language, cx, cy, lz]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n grabRef.current = null;\n setShowGrid(false);\n useRefStore.getState().setEnableOrbitController(true);\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n useEffect(() => {\n if (useStore.getState().tempHumanPlant.length > 0) {\n setCommonStore((state) => {\n state.elements.push(...state.tempHumanPlant);\n state.tempHumanPlant = [];\n });\n }\n }, []);\n\n useEffect(() => {\n if (cuboidModel && showSolarRadiationHeatmap) {\n const maxValue = solarRadiationHeatmapMaxValue ?? 5;\n const heatmapTop = getHeatmap(cuboidModel.id + '-top');\n if (heatmapTop) {\n setHeatmapTextureTop(Util.fetchHeatmapTexture(heatmapTop, maxValue));\n }\n const heatmapSouth = getHeatmap(cuboidModel.id + '-south');\n if (heatmapSouth) {\n setHeatmapTextureSouth(Util.fetchHeatmapTexture(heatmapSouth, maxValue));\n }\n const heatmapNorth = getHeatmap(cuboidModel.id + '-north');\n if (heatmapNorth) {\n setHeatmapTextureNorth(Util.fetchHeatmapTexture(heatmapNorth, maxValue));\n }\n const heatmapWest = getHeatmap(cuboidModel.id + '-west');\n if (heatmapWest) {\n setHeatmapTextureWest(Util.fetchHeatmapTexture(heatmapWest, maxValue));\n }\n const heatmapEast = getHeatmap(cuboidModel.id + '-east');\n if (heatmapEast) {\n setHeatmapTextureEast(Util.fetchHeatmapTexture(heatmapEast, maxValue, true));\n }\n // note: unfortunately, setting the rotation of the canvas textures seems to\n // have no effect. so we must do it in a different way.\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n const fetchTextureImage = (textureType: CuboidTexture) => {\n switch (textureType) {\n case CuboidTexture.Facade01:\n return Facade_Texture_01;\n case CuboidTexture.Facade02:\n return Facade_Texture_02;\n case CuboidTexture.Facade03:\n return Facade_Texture_03;\n case CuboidTexture.Facade04:\n return Facade_Texture_04;\n case CuboidTexture.Facade05:\n return Facade_Texture_05;\n case CuboidTexture.Facade06:\n return Facade_Texture_06;\n case CuboidTexture.Facade07:\n return Facade_Texture_07;\n case CuboidTexture.Facade08:\n return Facade_Texture_08;\n case CuboidTexture.Facade09:\n return Facade_Texture_09;\n case CuboidTexture.Facade10:\n return Facade_Texture_10;\n default:\n return Facade_Texture_00;\n }\n };\n\n const fetchRepeatDividers = (textureType: CuboidTexture) => {\n switch (textureType) {\n case CuboidTexture.Facade01:\n return { x: 14, y: 6.5 };\n case CuboidTexture.Facade02:\n return { x: 14, y: 6.5 };\n case CuboidTexture.Facade03:\n return { x: 10, y: 12 };\n case CuboidTexture.Facade04:\n return { x: 20, y: 11 };\n case CuboidTexture.Facade05:\n return { x: 15, y: 10 };\n case CuboidTexture.Facade06:\n return { x: 11, y: 3.5 };\n case CuboidTexture.Facade07:\n return { x: 11, y: 10 };\n case CuboidTexture.Facade08:\n return { x: 16, y: 9 };\n case CuboidTexture.Facade09:\n return { x: 10, y: 9 };\n case CuboidTexture.Facade10:\n return { x: 12, y: 9 };\n default:\n return { x: 1, y: 1 }; // maybe for rooftop\n }\n };\n\n const textureLoaderEast = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[0]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[0]);\n t.repeat.set(ly / param.x, lz / param.y);\n t.rotation = HALF_PI;\n t.center.x = 1;\n t.center.y = 0;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureEast(t);\n });\n }, [textureTypes[0], ly, lz]);\n const [textureEast, setTextureEast] = useState(textureLoaderEast);\n\n const textureLoaderWest = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[1]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[1]);\n t.repeat.set(ly / param.x, lz / param.y);\n t.rotation = -HALF_PI;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureWest(t);\n });\n }, [textureTypes[1], ly, lz]);\n const [textureWest, setTextureWest] = useState(textureLoaderWest);\n\n const textureLoaderNorth = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[2]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[2]);\n t.repeat.set(lx / param.x, lz / param.y);\n t.rotation = Math.PI;\n t.center.x = 0;\n t.center.y = 1;\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureNorth(t);\n });\n }, [textureTypes[2], lx, lz]);\n const [textureNorth, setTextureNorth] = useState(textureLoaderNorth);\n\n const textureLoaderSouth = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[3]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[3]);\n t.repeat.set(lx / param.x, lz / param.y);\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureSouth(t);\n });\n }, [textureTypes[3], lx, lz]);\n const [textureSouth, setTextureSouth] = useState(textureLoaderSouth);\n\n const textureLoaderTop = useMemo(() => {\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[4]) : Facade_Texture_00, (t) => {\n const param = fetchRepeatDividers(textureTypes[4]);\n t.repeat.set(lx / param.x, ly / param.y);\n t.wrapS = t.wrapT = RepeatWrapping;\n setTextureTop(t);\n });\n }, [textureTypes[4], lx, ly]);\n const [textureTop, setTextureTop] = useState(textureLoaderTop);\n\n useEffect(() => {\n invalidate();\n }, [...textureTypes]);\n\n const legalOnCuboid = (type: ObjectType) => {\n switch (type) {\n case ObjectType.Polygon:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.SolarPanel:\n return true;\n }\n return false;\n };\n\n const legalAddToCuboid = (type: ObjectType) => {\n switch (type) {\n case ObjectType.Polygon:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.SolarPanel:\n case ObjectType.Human:\n case ObjectType.Tree:\n case ObjectType.Flower:\n return true;\n }\n return false;\n };\n\n const setupGridParams = (face: Vector3) => {\n faceNormalRef.current = face;\n const aboveDistance = 0.01;\n if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Z)) {\n gridPositionRef.current = new Vector3(0, 0, hz + aboveDistance);\n gridRotationRef.current = new Euler(0, 0, 0);\n gridDimensionRef.current.set(hx, hy, hz);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_X)) {\n // east face in view coordinate system\n gridPositionRef.current = new Vector3(hx + aboveDistance, 0, 0);\n gridRotationRef.current = new Euler(0, HALF_PI, 0);\n gridDimensionRef.current.set(hz, hy, hx);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_X)) {\n // west face in view coordinate system\n gridPositionRef.current = new Vector3(-hx - aboveDistance, 0, 0);\n gridRotationRef.current = new Euler(0, -HALF_PI, 0);\n gridDimensionRef.current.set(hz, hy, hx);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_Y)) {\n // south face in the view coordinate system\n gridPositionRef.current = new Vector3(0, -hy - aboveDistance, 0);\n gridRotationRef.current = new Euler(HALF_PI, 0, 0);\n gridDimensionRef.current.set(hx, hz, hy);\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Y)) {\n // north face in the view coordinate system\n gridPositionRef.current = new Vector3(0, hy + aboveDistance, 0);\n gridRotationRef.current = new Euler(-HALF_PI, 0, 0);\n gridDimensionRef.current.set(hx, hz, hy);\n }\n };\n\n const ratio = Math.max(1, Math.max(lx, ly) / 8);\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\n\n const onTopSurface = Util.isIdentical(grabRef.current?.normal, UNIT_VECTOR_POS_Z_ARRAY);\n\n const handleAddElement = (e: ThreeEvent) => {\n const intersection = e.intersections[0];\n const objectToAdd = useStore.getState().objectTypeToAdd;\n if (objectToAdd === ObjectType.SolarPanel) {\n const pointer = intersection.point;\n const { pos, rot } = Util.getWorldDataById(id);\n const diff = new Vector3().subVectors(pointer, pos).applyEuler(new Euler(0, 0, -rot));\n const addedElement = ElementModelFactory.makeSolarPanel(\n cuboidModel,\n useStore.getState().getPvModule(useStore.getState().actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\n diff.x / lx,\n diff.y / ly,\n diff.z / lz,\n useStore.getState().actionState.solarPanelOrientation ?? Orientation.landscape,\n useStore.getState().actionState.solarPanelPoleHeight ?? 1,\n useStore.getState().actionState.solarPanelPoleSpacing ?? 3,\n useStore.getState().actionState.solarPanelTiltAngle ?? 0,\n useStore.getState().actionState.solarPanelRelativeAzimuth ?? 0,\n intersection.face?.normal,\n [0, 0, 0],\n useStore.getState().actionState.solarPanelFrameColor ?? 'white',\n );\n setCommonStore((state) => {\n state.elements.push(addedElement);\n });\n return addedElement;\n } else {\n return addElement(cuboidModel, intersection.point, intersection.face?.normal);\n }\n };\n\n const handlePointerDown = (e: ThreeEvent) => {\n if (e.button === 2) return; // ignore right-click\n if (!isAddingElement()) {\n selectMe(id, e, ActionType.Select);\n }\n const selectedElement = getSelectedElement();\n let bypass = false;\n if (\n e.intersections[0].object.name === ObjectType.Polygon &&\n useStore.getState().objectTypeToAdd !== ObjectType.None\n ) {\n bypass = true;\n }\n if (selectedElement?.id === id || bypass) {\n if (useStore.getState().groupActionMode) {\n const baseId = Util.getBaseId(id);\n useStore.getState().setGroupMasterId(baseId);\n }\n // no child of this cuboid is clicked\n if (legalAddToCuboid(useStore.getState().objectTypeToAdd) && cuboidModel) {\n setShowGrid(true);\n const addedElement = handleAddElement(e);\n if (addedElement) {\n const undoableAdd = {\n name: 'Add',\n timestamp: Date.now(),\n addedElement: addedElement,\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 } else {\n useRefStore.getState().selectNone();\n useRefStore.setState((state) => {\n state.cuboidRef = groupRef;\n });\n }\n } else {\n // a child of this cuboid is clicked\n if (selectedElement && selectedElement.parentId === id) {\n if (legalOnCuboid(selectedElement.type)) {\n setShowGrid(true);\n const { rot, pos } = Util.getWorldDataById(id);\n worldPositionRef.current.copy(pos);\n worldRotationRef.current = rot;\n grabRef.current = selectedElement;\n let face;\n for (const x of e.intersections) {\n if (x.object === baseRef.current) {\n face = x.face;\n break;\n }\n }\n if (face) {\n setupGridParams(face.normal);\n if (!normal || !normal.equals(face.normal)) {\n setNormal(face.normal);\n }\n }\n useRefStore.getState().setEnableOrbitController(false);\n oldPositionRef.current.x = selectedElement.cx;\n oldPositionRef.current.y = selectedElement.cy;\n oldPositionRef.current.z = selectedElement.cz;\n oldNormalRef.current.fromArray(selectedElement.normal);\n oldDimensionRef.current.x = selectedElement.lx;\n oldDimensionRef.current.y = selectedElement.ly;\n oldDimensionRef.current.z = selectedElement.lz;\n switch (selectedElement.type) {\n case ObjectType.SolarPanel:\n oldAzimuthRef.current = (selectedElement as SolarPanelModel).relativeAzimuth;\n break;\n case ObjectType.Polygon:\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\n break;\n }\n }\n }\n }\n };\n\n const handlePointerMove = (e: ThreeEvent) => {\n if (grabRef.current && cuboidModel) {\n if (grabRef.current.type === ObjectType.SolarPanel && onTopSurface) return;\n if (grabRef.current.parentId === id && grabRef.current.type && !grabRef.current.locked) {\n const mouse = new Vector2(\n (e.offsetX / domElement.clientWidth) * 2 - 1,\n 1 - (e.offsetY / domElement.clientHeight) * 2,\n );\n raycaster.setFromCamera(mouse, camera);\n if (baseRef.current) {\n const intersects = raycaster.intersectObjects([baseRef.current]);\n if (intersects.length > 0) {\n let p = intersects[0].point;\n const face = intersects[0].face;\n if (useStore.getState().moveHandleType) {\n if (face) {\n const n = face.normal;\n if (normal && !normal.equals(n)) {\n setNormal(n);\n }\n setupGridParams(n);\n setElementNormal(grabRef.current.id, n.x, n.y, n.z);\n }\n p = Util.relativeCoordinates(p.x, p.y, p.z, cuboidModel);\n if (grabRef.current.type === ObjectType.Polygon) {\n const polygon = grabRef.current as PolygonModel;\n if (useStore.getState().moveHandleType === MoveHandleType.Default) {\n const centroid = Util.calculatePolygonCentroid(oldVerticesRef.current);\n const n = new Vector3().fromArray(polygon.normal);\n let dx: number, dy: number;\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n // east face\n dx = -(centroid.x + p.z);\n dy = p.y - centroid.y;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n // west face\n dx = p.z - centroid.x;\n dy = p.y - centroid.y;\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n // north face\n dx = p.x - centroid.x;\n dy = -(centroid.y + p.z);\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n // south face\n dx = p.x - centroid.x;\n dy = p.z - centroid.y;\n } else {\n // top face\n dx = p.x - centroid.x;\n dy = p.y - centroid.y;\n }\n const copy = oldVerticesRef.current.map((v) => ({ ...v }));\n copy.forEach((v: Point2) => {\n v.x += dx;\n v.y += dy;\n });\n // update all the vertices at once with the DEEP COPY above\n // do not update each vertex's position one by one (it is slower)\n updatePolygonVerticesById(polygon.id, copy);\n }\n } else {\n setElementPosition(grabRef.current.id, p.x, p.y, p.z);\n }\n } else if (useStore.getState().resizeHandleType) {\n switch (grabRef.current.type) {\n case ObjectType.SolarPanel:\n const solarPanel = grabRef.current as SolarPanelModel;\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\n const resizeAnchor = useStore.getState().resizeAnchor;\n const resizeHandleType = useStore.getState().resizeHandleType;\n\n // z direction\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\n const ny = Math.max(1, Math.round(Math.abs(p.z - resizeAnchor.z) / unitY));\n const length = ny * unitY;\n const v = new Vector3(0, 0, p.z - resizeAnchor.z).normalize().multiplyScalar(length);\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\n setCommonStore((state) => {\n const sp = state.elements.find((e) => e.id === solarPanel.id);\n if (!sp) return;\n sp.cz = (worldCenter.z - worldPositionRef.current.z) / lz;\n sp.ly = Math.abs(v.z);\n });\n }\n // XY direction\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\n const diff = new Vector3().subVectors(p, resizeAnchor).setZ(0);\n const nx = Math.max(1, Math.round(diff.length() / unitX));\n const length = nx * unitX;\n const v = diff.clone().normalize().multiplyScalar(length);\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\n const relativeCenter = new Vector3()\n .subVectors(worldCenter, worldPositionRef.current)\n .applyEuler(new Euler(0, 0, -worldRotationRef.current));\n setCommonStore((state) => {\n const sp = state.elements.find((e) => e.id === solarPanel.id);\n if (!sp) return;\n if (Math.abs(Math.abs(sp.normal[1]) - 1) < 0.01) {\n sp.cx = relativeCenter.x / lx;\n } else {\n sp.cy = relativeCenter.y / ly;\n }\n sp.lx = v.length();\n });\n }\n break;\n case ObjectType.Polygon:\n if (useStore.getState().resizeHandleType === ResizeHandleType.Default) {\n // first, reverse the rotation of p.x and p.y around the center of the cuboid\n let q = new Vector3(\n p.x - worldPositionRef.current.x,\n p.y - worldPositionRef.current.y,\n 0,\n ).applyEuler(new Euler(0, 0, -worldRotationRef.current, 'ZXY'));\n // then do the vertex on each face in the de-rotated coordinate system\n const polygon = grabRef.current as PolygonModel;\n const n = new Vector3().fromArray(polygon.normal);\n let lx, ly;\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n // east face\n lx = cuboidModel.lz;\n ly = cuboidModel.ly;\n q.x = -p.z + worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n // west face\n lx = cuboidModel.lz;\n ly = cuboidModel.ly;\n q.x = p.z - worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n // north face\n lx = cuboidModel.lx;\n ly = cuboidModel.lz;\n q.y = -p.z + worldPositionRef.current.z;\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n // south face\n lx = cuboidModel.lx;\n ly = cuboidModel.lz;\n q.y = p.z - worldPositionRef.current.z;\n } else {\n // top face\n lx = cuboidModel.lx;\n ly = cuboidModel.ly;\n }\n q = useStore.getState().enableFineGrid ? Util.snapToFineGrid(q) : Util.snapToNormalGrid(q);\n q.x /= lx;\n q.y /= ly;\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, q.x, q.y);\n }\n break;\n }\n }\n }\n }\n }\n }\n };\n\n const handleSolarPanelPointerMoveOnTopSurface = (e: ThreeEvent) => {\n if (intersectPlaneRef.current && grabRef.current && cuboidModel) {\n if (grabRef.current.type !== ObjectType.SolarPanel || !onTopSurface) return;\n const solarPanel = grabRef.current as SolarPanelModel;\n if (solarPanel.parentId !== id || solarPanel.locked) return;\n raycaster.setFromCamera(mouse, camera);\n const intersects = raycaster.intersectObjects([intersectPlaneRef.current]);\n if (intersects.length > 0) {\n let p = intersects[0].point.clone();\n if (useStore.getState().moveHandleType) {\n p = Util.relativeCoordinates(p.x, p.y, p.z - solarPanel.poleHeight, cuboidModel);\n setElementPosition(solarPanel.id, p.x, p.y, p.z);\n } else if (\n useStore.getState().rotateHandleType &&\n useStore.getState().rotateHandleType !== RotateHandleType.Tilt\n ) {\n const pr = worldRotationRef.current; //parent rotation\n const pc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); //world parent center\n const cc = new Vector2(cuboidModel.lx * solarPanel.cx, cuboidModel.ly * solarPanel.cy) //local current center\n .rotateAround(ORIGIN_VECTOR2, pr); //add parent rotation\n const wc = new Vector2().addVectors(cc, pc); //world current center\n const rotation =\n -pr +\n Math.atan2(-p.x + wc.x, p.y - wc.y) +\n (useStore.getState().rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\n const newAzimuth = rotation + offset;\n updateSolarPanelRelativeAzimuthById(solarPanel.id, newAzimuth);\n newAzimuthRef.current = newAzimuth;\n } else if (useStore.getState().resizeHandleType) {\n const resizeAnchor = useStore.getState().resizeAnchor;\n const pvModel = getPvModule(solarPanel.pvModelName);\n const wp = new Vector2(p.x, p.y);\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\n const distance = wp.distanceTo(resizeAnchor2D);\n const angle = solarPanel.relativeAzimuth + worldRotationRef.current; // world panel azimuth\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\n switch (useStore.getState().resizeHandleType) {\n case ResizeHandleType.Lower:\n case ResizeHandleType.Upper:\n {\n const sign = useStore.getState().resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\n const theta = rp.angle() - angle + sign * HALF_PI;\n let dyl = distance * Math.cos(theta);\n if (solarPanel.orientation === Orientation.portrait) {\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\n dyl = nx * pvModel.length;\n } else {\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\n dyl = nx * pvModel.width;\n }\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\n const wc = new Vector2(wcx, wcy); // world panel center\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); // world foundation center\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\n const newCx = rc.x / lx;\n const newCy = rc.y / ly;\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, solarPanel.lx, dyl)) {\n updateElementLyById(solarPanel.id, dyl);\n setElementPosition(solarPanel.id, newCx, newCy);\n }\n }\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n {\n let sign = useStore.getState().resizeHandleType === ResizeHandleType.Left ? -1 : 1;\n const theta =\n rp.angle() - angle + (useStore.getState().resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\n let dxl = distance * Math.cos(theta);\n if (solarPanel.orientation === Orientation.portrait) {\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\n dxl = nx * pvModel.width;\n } else {\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\n dxl = nx * pvModel.length;\n }\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\n const wc = new Vector2(wcx, wcy);\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y);\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\n const newCx = rc.x / lx;\n const newCy = rc.y / ly;\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, dxl, solarPanel.ly)) {\n updateElementLxById(solarPanel.id, dxl);\n setElementPosition(solarPanel.id, newCx, newCy);\n }\n }\n break;\n }\n }\n }\n }\n };\n\n const isSolarPanelNewPositionOk = (sp: SolarPanelModel, cx: number, cy: number) => {\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.cx = cx;\n clone.cy = cy;\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n // only check solar panels on top face\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\n return false;\n }\n }\n return true;\n };\n\n const isSolarPanelNewAzimuthOk = (sp: SolarPanelModel, az: number) => {\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.relativeAzimuth = az;\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\n return false;\n }\n return true;\n };\n\n const isSolarPanelNewSizeOk = (sp: SolarPanelModel, cx: number, cy: number, lx: number, ly: number) => {\n // check if the new length will cause the solar panel to intersect with the foundation\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\n return false;\n }\n // check if the new size will be within the foundation\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\n clone.cx = cx;\n clone.cy = cy;\n clone.lx = lx;\n clone.ly = ly;\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\n // showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\n return false;\n }\n return true;\n };\n\n const handlePointerUp = () => {\n if (!grabRef.current) return;\n const elem = getElementById(grabRef.current.id);\n if (!elem || elem.parentId !== id) return;\n if (elem.type === ObjectType.Polygon) {\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\n const undoableEditPolygon = {\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\n timestamp: Date.now(),\n oldValue: oldVerticesRef.current,\n newValue: newVerticesRef.current,\n changedElementId: elem.id,\n changedElementType: elem.type,\n undo: () => {\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\n },\n redo: () => {\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\n },\n } as UndoableChange;\n addUndoable(undoableEditPolygon);\n }\n } else {\n if (useStore.getState().resizeHandleType) {\n newPositionRef.current.x = elem.cx;\n newPositionRef.current.y = elem.cy;\n newPositionRef.current.z = elem.cz;\n newDimensionRef.current.x = elem.lx;\n newDimensionRef.current.y = elem.ly;\n newDimensionRef.current.z = elem.lz;\n if (\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\n ) {\n const undoableResize = {\n name: 'Resize',\n timestamp: Date.now(),\n resizedElementId: grabRef.current.id,\n resizedElementType: grabRef.current.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 oldLx: oldDimensionRef.current.x,\n oldLy: oldDimensionRef.current.y,\n oldLz: oldDimensionRef.current.z,\n newLx: newDimensionRef.current.x,\n newLy: newDimensionRef.current.y,\n newLz: newDimensionRef.current.z,\n undo: () => {\n setElementPosition(\n undoableResize.resizedElementId,\n undoableResize.oldCx,\n undoableResize.oldCy,\n undoableResize.oldCz,\n );\n setElementSize(\n undoableResize.resizedElementId,\n undoableResize.oldLx,\n undoableResize.oldLy,\n undoableResize.oldLz,\n );\n },\n redo: () => {\n setElementPosition(\n undoableResize.resizedElementId,\n undoableResize.newCx,\n undoableResize.newCy,\n undoableResize.newCz,\n );\n setElementSize(\n undoableResize.resizedElementId,\n undoableResize.newLx,\n undoableResize.newLy,\n undoableResize.newLz,\n );\n },\n } as UndoableResize;\n addUndoable(undoableResize);\n }\n } else if (useStore.getState().rotateHandleType) {\n // currently, solar panels are the only type of child that can be rotated\n if (grabRef.current.type === ObjectType.SolarPanel) {\n const solarPanel = grabRef.current as SolarPanelModel;\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\n if (isSolarPanelNewAzimuthOk(solarPanel, newAzimuthRef.current)) {\n setCommonStore((state) => {\n state.selectedElementAngle = newAzimuthRef.current;\n });\n const undoableRotate = {\n name: 'Rotate',\n timestamp: Date.now(),\n oldValue: oldAzimuthRef.current,\n newValue: newAzimuthRef.current,\n changedElementId: solarPanel.id,\n changedElementType: solarPanel.type,\n undo: () => {\n updateSolarPanelRelativeAzimuthById(\n undoableRotate.changedElementId,\n undoableRotate.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelRelativeAzimuthById(\n undoableRotate.changedElementId,\n undoableRotate.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableRotate);\n } else {\n updateSolarPanelRelativeAzimuthById(solarPanel.id, oldAzimuthRef.current);\n }\n }\n }\n } else {\n // for moving sensors, lights, and solar panels\n newPositionRef.current.x = elem.cx;\n newPositionRef.current.y = elem.cy;\n newPositionRef.current.z = elem.cz;\n newNormalRef.current.fromArray(elem.normal);\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\n let accept = true;\n if (elem.type === ObjectType.SolarPanel) {\n accept = isSolarPanelNewPositionOk(elem as SolarPanelModel, elem.cx, elem.cy);\n }\n if (accept) {\n const undoableMove = {\n name: 'Move',\n timestamp: Date.now(),\n movedElementId: grabRef.current.id,\n movedElementType: grabRef.current?.type,\n oldCx: oldPositionRef.current.x,\n oldCy: oldPositionRef.current.y,\n oldCz: oldPositionRef.current.z,\n oldNormal: oldNormalRef.current.clone(),\n newCx: newPositionRef.current.x,\n newCy: newPositionRef.current.y,\n newCz: newPositionRef.current.z,\n newNormal: newNormalRef.current.clone(),\n undo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.oldCx,\n undoableMove.oldCy,\n undoableMove.oldCz,\n );\n if (undoableMove.oldNormal) {\n setElementNormal(\n undoableMove.movedElementId,\n undoableMove.oldNormal.x,\n undoableMove.oldNormal.y,\n undoableMove.oldNormal.z,\n );\n }\n },\n redo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.newCx,\n undoableMove.newCy,\n undoableMove.newCz,\n );\n if (undoableMove.newNormal) {\n setElementNormal(\n undoableMove.movedElementId,\n undoableMove.newNormal.x,\n undoableMove.newNormal.y,\n undoableMove.newNormal.z,\n );\n }\n },\n } as UndoableMove;\n addUndoable(undoableMove);\n } else {\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n }\n }\n }\n }\n grabRef.current = null;\n };\n\n const handlePointerOver = (e: ThreeEvent) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n }\n }\n };\n\n const handlePointerEnter = (e: ThreeEvent) => {\n // TODO: make tree, flower, and human legal\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setShowGrid(true);\n }\n }\n };\n\n const handlePointerOut = () => {\n setHovered(false);\n if (grabRef.current) {\n switch (grabRef.current.type) {\n case ObjectType.Human:\n case ObjectType.Tree:\n case ObjectType.Flower:\n setShowGrid(false);\n break;\n case ObjectType.SolarPanel:\n // Have to get the latest from the store (we may change this to ref in the future)\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarPanelModel;\n if (useStore.getState().moveHandleType && !isSolarPanelNewPositionOk(sp, sp.cx, sp.cy)) {\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n }\n break;\n }\n }\n };\n\n const handleContextMenu = (e: ThreeEvent) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n state.pastePoint.copy(e.intersections[0].point);\n const face = e.intersections[0].face;\n if (face) {\n state.pasteNormal = face.normal.clone();\n if (Util.isSame(face.normal, UNIT_VECTOR_POS_X)) {\n state.selectedSideIndex = 0;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_X)) {\n state.selectedSideIndex = 1;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Y)) {\n state.selectedSideIndex = 2;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_Y)) {\n state.selectedSideIndex = 3;\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Z)) {\n state.selectedSideIndex = 4;\n }\n }\n state.clickObjectType = ObjectType.Cuboid;\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Cuboid;\n }\n }\n });\n };\n\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\n\n const faces: number[] = [0, 1, 2, 3, 4, 5];\n const textures = [\n showSolarRadiationHeatmap && heatmapTextureEast ? heatmapTextureEast : textureEast,\n showSolarRadiationHeatmap && heatmapTextureWest ? heatmapTextureWest : textureWest,\n showSolarRadiationHeatmap && heatmapTextureNorth ? heatmapTextureNorth : textureNorth,\n showSolarRadiationHeatmap && heatmapTextureSouth ? heatmapTextureSouth : textureSouth,\n showSolarRadiationHeatmap && heatmapTextureTop ? heatmapTextureTop : textureTop,\n null,\n ];\n const materials =\n cuboidModel && cuboidModel.faceColors ? (\n faces.map((i) => {\n if (textureTypes && textureTypes[i] !== CuboidTexture.NoTexture) {\n return showSolarRadiationHeatmap ? (\n \n ) : (\n \n );\n } else {\n return showSolarRadiationHeatmap ? (\n \n ) : (\n \n );\n }\n })\n ) : (\n \n );\n\n const handleArgs = useMemo(() => [hx, hy, hz], [hx, hy, hz]);\n\n const showHandles = selected && !locked && !groupMasterId;\n\n return (\n \n {/* draw rectangular cuboid */}\n \n {materials}\n \n\n {/* intersection plane that goes through the center of the selected solar panel */}\n {grabRef.current?.type === ObjectType.SolarPanel && onTopSurface && !grabRef.current.locked && (\n \n )}\n\n {showGrid && (\n <>\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType) && (\n \n )}\n {useStore.getState().rotateHandleType &&\n grabRef.current &&\n grabRef.current.type === ObjectType.SolarPanel && (\n \n )}\n \n )}\n\n {/* ruler */}\n {selected && }\n\n {/* wireFrame */}\n {(!selected || groundImage) && (\n \n )}\n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* handles */}\n {showHandles && }\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Cuboid);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Sphere } from '@react-three/drei';\nimport { Euler, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { SensorModel } from '../models/SensorModel';\nimport { useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\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} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport Wireframe from '../components/wireframe';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\nimport { useSelected } from './hooks';\n\nconst Sensor = (sensorModel: SensorModel) => {\n let {\n id,\n cx,\n cy,\n cz,\n lx = 1,\n ly = 1,\n lz = 0.1,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n parentId,\n foundationId,\n light = true,\n heatFlux = false,\n } = sensorModel;\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const selectMe = useStore(Selector.selectMe);\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n const [hovered, setHovered] = useState(false);\n const baseRef = useRef();\n const handleRef = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n const foundation = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === foundationId) {\n return e;\n }\n }\n });\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = parent.cz + parent.lz / 2;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Wall:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n break;\n case ObjectType.Roof:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n break;\n }\n }\n }\n const hz = lz / 2;\n\n const euler = useMemo(() => {\n if (parent?.type === ObjectType.Wall) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\n }\n if (parent?.type === ObjectType.Roof) {\n return new Euler(\n rotation[0],\n rotation[1],\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\n 'ZXY',\n );\n }\n if (parent?.type === ObjectType.Cuboid) {\n return getRotationFromNormal(normal);\n }\n // the normal below seems to be relative to its parent\n const n = new Vector3().fromArray(normal);\n // east face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2]);\n }, [normal, rotation, foundation?.rotation]);\n\n const labelText = useMemo(() => {\n return (\n (sensorModel?.label ? sensorModel.label : i18n.t('shared.SensorElement', lang)) +\n (sensorModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang)\n );\n }, [sensorModel?.label, locked, language, cx, cy, cz]);\n\n return (\n \n {/* draw rectangle (too small to cast shadow) */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = MoveHandleType.Default;\n });\n }}\n onContextMenu={(e) => {\n selectMe(id, e);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Sensor;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={() => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n \n\n {/* wireFrame */}\n {!selected && }\n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* draw handle */}\n {selected && !locked && (\n {\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n setCommonStore((state) => {\n state.moveHandleType = MoveHandleType.Default;\n });\n }}\n >\n \n \n )}\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Sensor);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { Cylinder, Sphere } from '@react-three/drei';\nimport { Euler, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n TWO_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} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport Wireframe from '../components/wireframe';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { LightModel } from '../models/LightModel';\nimport { RoofModel } from '../models/RoofModel';\nimport { useRefStore } from 'src/stores/commonRef';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\nimport { useSelected } from './hooks';\n\nconst Light = (lightModel: LightModel) => {\n let {\n id,\n cx,\n cy,\n cz,\n lx = 1,\n ly = 1,\n lz = 0.1,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = '#ffff99',\n lineColor = 'black',\n lineWidth = 0.1,\n locked = false,\n showLabel = false,\n parentId,\n foundationId,\n decay = 2,\n distance = 5,\n intensity = 3,\n inside = false,\n } = lightModel;\n\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const selectMe = useStore(Selector.selectMe);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const night = sunlightDirection.z <= 0;\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n const [hovered, setHovered] = useState(false);\n const baseRef = useRef();\n const handleRef = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n const foundation = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === foundationId) {\n return e;\n }\n }\n });\n\n let parentThickness = 0.1;\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = parent.cz + parent.lz / 2;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Wall:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n parentThickness = (parent as WallModel).ly;\n break;\n case ObjectType.Roof:\n if (foundation?.type === ObjectType.Foundation) {\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\n cx = absoluteCoordinates.x;\n cy = absoluteCoordinates.y;\n cz = absoluteCoordinates.z;\n }\n parentThickness = (parent as RoofModel).thickness;\n break;\n }\n }\n }\n const hz = lz / 2;\n\n const euler = useMemo(() => {\n if (parent?.type === ObjectType.Wall) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\n }\n if (parent?.type === ObjectType.Roof) {\n return new Euler(\n rotation[0],\n rotation[1],\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\n 'ZXY',\n );\n }\n if (parent?.type === ObjectType.Cuboid) {\n return getRotationFromNormal(normal);\n }\n // the normal below seems to be relative to its parent\n const n = new Vector3().fromArray(normal);\n // east face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2]);\n }, [normal, rotation, foundation?.rotation]);\n\n const labelText = useMemo(() => {\n return (\n (lightModel?.label ? lightModel.label : i18n.t('shared.LightElement', lang)) +\n (lightModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang)\n );\n }, [lightModel?.label, locked, language, cx, cy, cz]);\n\n return (\n \n {night && (\n \n )}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n }}\n onContextMenu={(e) => {\n selectMe(id, e);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Light;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={() => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n {night ? (\n \n ) : (\n \n )}\n \n\n {/* highlight with a thick wireframe when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* draw handle */}\n {selected && !locked && (\n {\n selectMe(id, e, ActionType.Move);\n useRefStore.getState().setEnableOrbitController(false);\n usePrimitiveStore.setState((state) => {\n state.showWallIntersectionPlaneId = parentId;\n state.oldParentId = parentId;\n state.oldFoundationId = foundationId;\n });\n }}\n >\n \n \n )}\n\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Light);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport GroupMaster from 'src/components/groupMaster';\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 { useGroupMaster } from '../hooks';\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 { id, parentId, cx, cy, lz, rotation, locked } = cuboidModel;\r\n\r\n const groupMasterId = useStore(Selector.groupMasterId);\r\n\r\n const { baseGroupSet, childCuboidSet, groupMasterDimension, groupMasterPosition, groupMasterRotation } =\r\n useGroupMaster(cuboidModel, groupMasterId);\r\n\r\n const hz = lz / 2;\r\n const showGroupMaster = !!(\r\n parentId === GROUND_ID &&\r\n !locked &&\r\n groupMasterId === id &&\r\n cuboidModel &&\r\n groupMasterDimension\r\n );\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 {showGroupMaster && (\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 ifNeedListenToAutoDeletion = (el: ElementModel) => {\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","/*\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","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport short from 'short-uuid';\r\nimport { HumanModel } from './HumanModel';\r\nimport { CuboidTexture, ObjectType } from '../types';\r\nimport { TreeModel } from './TreeModel';\r\nimport { SensorModel } from './SensorModel';\r\nimport { FoundationModel } from './FoundationModel';\r\nimport { CuboidModel } from './CuboidModel';\r\nimport { ElementModel } from './ElementModel';\r\nimport { SolarPanelModel } from './SolarPanelModel';\r\nimport { WallModel } from './WallModel';\r\nimport { WindowModel } from './WindowModel';\r\nimport { GableRoofModel, GambrelRoofModel, HipRoofModel, MansardRoofModel, RoofModel, RoofType } from './RoofModel';\r\nimport { PolygonModel } from './PolygonModel';\r\nimport { Util } from '../Util';\r\nimport { Vector3 } from 'three';\r\nimport {\r\n DEFAULT_CEILING_R_VALUE,\r\n DEFAULT_GROUND_FLOOR_R_VALUE,\r\n GROUND_ID,\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 ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\r\nimport { ParabolicDishModel } from './ParabolicDishModel';\r\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\r\nimport { HeliostatModel } from './HeliostatModel';\r\nimport { DoorModel } from './DoorModel';\r\nimport { WindTurbineModel } from './WindTurbineModel';\r\nimport { FlowerModel } from './FlowerModel';\r\nimport { LightModel } from './LightModel';\r\n\r\nexport class ElementModelCloner {\r\n static clone(\r\n parent: ElementModel | null,\r\n e: ElementModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n noMove?: boolean,\r\n normal?: Vector3,\r\n oldParent?: ElementModel | null,\r\n ) {\r\n let clone = null;\r\n switch (e.type) {\r\n case ObjectType.Polygon:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.clonePolygon(parent, e as PolygonModel, x, y, z, noMove, normal);\r\n }\r\n break;\r\n case ObjectType.Sensor:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneSensor(parent, e as SensorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Light:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneLight(parent, e as LightModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneSolarPanel(parent, e as SolarPanelModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneParabolicTrough(parent, e as ParabolicTroughModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneParabolicDish(parent, e as ParabolicDishModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.FresnelReflector:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneFresnelReflector(parent, e as FresnelReflectorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Heliostat:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneHeliostat(parent, e as HeliostatModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.WindTurbine:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneWindTurbine(parent, e as WindTurbineModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (parent) {\r\n clone = ElementModelCloner.cloneWall(parent, e as WallModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Window:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneWindow(parent, e as WindowModel, x, y, z, oldParent);\r\n }\r\n break;\r\n case ObjectType.Door:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneDoor(parent, e as DoorModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Roof:\r\n if (parent) {\r\n // must have a parent\r\n clone = ElementModelCloner.cloneRoof(parent, e as RoofModel, x, y, z);\r\n }\r\n break;\r\n case ObjectType.Human:\r\n clone = ElementModelCloner.cloneHuman(e as HumanModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Tree:\r\n clone = ElementModelCloner.cloneTree(e as TreeModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Flower:\r\n clone = ElementModelCloner.cloneFlower(e as FlowerModel, x, y, z, parent);\r\n break;\r\n case ObjectType.Foundation:\r\n clone = ElementModelCloner.cloneFoundation(e as FoundationModel, x, y);\r\n break;\r\n case ObjectType.Cuboid:\r\n const parentId = parent ? parent.id : GROUND_ID;\r\n clone = ElementModelCloner.cloneCuboid(parentId, e as CuboidModel, x, y);\r\n break;\r\n }\r\n return clone;\r\n }\r\n\r\n private static cloneHuman(human: HumanModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Human,\r\n name: human.name,\r\n flip: human.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: human.lx,\r\n ly: human.ly,\r\n lz: human.lz,\r\n normal: [...human.normal],\r\n rotation: [...human.rotation],\r\n parentId: parent?.id ?? human.parentId,\r\n id: short.generate() as string,\r\n } as HumanModel;\r\n }\r\n\r\n private static cloneTree(tree: TreeModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Tree,\r\n name: tree.name,\r\n flip: tree.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: tree.lx,\r\n ly: tree.ly,\r\n lz: tree.lz,\r\n normal: [...tree.normal],\r\n rotation: [...tree.rotation],\r\n parentId: parent?.id ?? tree.parentId,\r\n id: short.generate() as string,\r\n } as TreeModel;\r\n }\r\n\r\n private static cloneFlower(flower: FlowerModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\r\n return {\r\n type: ObjectType.Flower,\r\n name: flower.name,\r\n flip: flower.flip,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: flower.lx,\r\n ly: flower.ly,\r\n lz: flower.lz,\r\n normal: [...flower.normal],\r\n rotation: [...flower.rotation],\r\n parentId: parent?.id ?? flower.parentId,\r\n id: short.generate() as string,\r\n } as FlowerModel;\r\n }\r\n\r\n private static clonePolygon(\r\n parent: ElementModel,\r\n polygon: PolygonModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n noMove?: boolean,\r\n normal?: Vector3,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n const vertices = polygon.vertices.map((v) => ({ ...v })); // deep copy;\r\n const pm = {\r\n type: ObjectType.Polygon,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: polygon.lx,\r\n ly: polygon.ly,\r\n lz: polygon.lz,\r\n filled: polygon.filled,\r\n noOutline: polygon.noOutline,\r\n color: polygon.color,\r\n lineColor: polygon.lineColor,\r\n lineWidth: polygon.lineWidth,\r\n opacity: polygon.opacity,\r\n textureType: polygon.textureType,\r\n text: polygon.text,\r\n fontSize: polygon.fontSize,\r\n fontColor: polygon.fontColor,\r\n normal: [...polygon.normal],\r\n rotation: polygon.parentId ? [...parent.rotation] : [0, 0, 0],\r\n vertices: vertices,\r\n parentId: parent.id,\r\n parentType: parent.type,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as PolygonModel;\r\n if (!noMove) {\r\n let x1 = x;\r\n let y1 = y;\r\n if (parent.type === ObjectType.Cuboid && normal) {\r\n if (Util.isSame(normal, UNIT_VECTOR_NEG_X)) {\r\n x1 = z ?? 0;\r\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_X)) {\r\n x1 = -(z ?? 0);\r\n } else if (Util.isSame(normal, UNIT_VECTOR_NEG_Y)) {\r\n y1 = z ?? 0;\r\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_Y)) {\r\n y1 = -(z ?? 0);\r\n }\r\n const dot = normal.dot(new Vector3().fromArray(polygon.normal));\r\n if (Math.abs(dot) < ZERO_TOLERANCE) {\r\n for (const v of pm.vertices) {\r\n [v.x, v.y] = [v.y, v.x];\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Wall) {\r\n x1 = -x;\r\n y1 = -(z ?? 0);\r\n }\r\n Util.translatePolygonCenterTo(pm, x1, y1);\r\n }\r\n return pm;\r\n }\r\n\r\n private static cloneSensor(parent: ElementModel, sensor: SensorModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Sensor,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: sensor.lx,\r\n ly: sensor.ly,\r\n lz: sensor.lz,\r\n showLabel: sensor.showLabel,\r\n normal: [...sensor.normal],\r\n rotation: sensor.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SensorModel;\r\n }\r\n\r\n private static cloneLight(parent: ElementModel, light: LightModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Light,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: light.lx,\r\n ly: light.ly,\r\n lz: light.lz,\r\n intensity: light.intensity,\r\n distance: light.distance,\r\n decay: light.decay,\r\n color: light.color,\r\n showLabel: light.showLabel,\r\n normal: [...light.normal],\r\n rotation: light.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as LightModel;\r\n }\r\n\r\n private static cloneSolarPanel(parent: ElementModel, solarPanel: SolarPanelModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n let parentType;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n parentType = parent.type;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n parentType = ObjectType.Wall;\r\n break;\r\n case ObjectType.Roof:\r\n parentType = ObjectType.Roof;\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n let rotation;\r\n if (solarPanel.parentType === ObjectType.Roof) {\r\n rotation = [...solarPanel.rotation];\r\n } else {\r\n rotation = solarPanel.parentId ? [...parent.rotation] : [0, 0, 0];\r\n }\r\n return {\r\n type: ObjectType.SolarPanel,\r\n pvModelName: solarPanel.pvModelName,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: solarPanel.lx,\r\n ly: solarPanel.ly,\r\n lz: solarPanel.lz,\r\n trackerType: solarPanel.trackerType,\r\n tiltAngle: solarPanel.tiltAngle,\r\n relativeAzimuth: solarPanel.relativeAzimuth,\r\n orientation: solarPanel.orientation,\r\n poleRadius: solarPanel.poleRadius,\r\n poleHeight: solarPanel.poleHeight,\r\n poleSpacing: solarPanel.poleSpacing,\r\n showLabel: solarPanel.showLabel,\r\n normal: [...solarPanel.normal],\r\n rotation: rotation,\r\n parentType: parentType,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as SolarPanelModel;\r\n }\r\n\r\n private static cloneParabolicTrough(\r\n parent: ElementModel,\r\n trough: ParabolicTroughModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicTrough,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: trough.lx,\r\n ly: trough.ly,\r\n lz: trough.lz,\r\n reflectance: trough.reflectance,\r\n absorptance: trough.absorptance,\r\n opticalEfficiency: trough.opticalEfficiency,\r\n thermalEfficiency: trough.thermalEfficiency,\r\n absorberTubeRadius: trough.absorberTubeRadius,\r\n moduleLength: trough.moduleLength,\r\n latusRectum: trough.latusRectum,\r\n tiltAngle: trough.tiltAngle,\r\n relativeAzimuth: trough.relativeAzimuth,\r\n poleRadius: trough.poleRadius,\r\n poleHeight: trough.poleHeight,\r\n showLabel: trough.showLabel,\r\n normal: [...trough.normal],\r\n rotation: trough.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicTroughModel;\r\n }\r\n\r\n private static cloneParabolicDish(parent: ElementModel, dish: ParabolicDishModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.ParabolicDish,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: dish.lx,\r\n ly: dish.ly,\r\n lz: dish.lz,\r\n reflectance: dish.reflectance,\r\n absorptance: dish.absorptance,\r\n opticalEfficiency: dish.opticalEfficiency,\r\n thermalEfficiency: dish.thermalEfficiency,\r\n receiverRadius: dish.receiverRadius,\r\n structureType: dish.structureType,\r\n latusRectum: dish.latusRectum,\r\n tiltAngle: dish.tiltAngle,\r\n relativeAzimuth: dish.relativeAzimuth,\r\n poleRadius: dish.poleRadius,\r\n poleHeight: dish.poleHeight,\r\n showLabel: dish.showLabel,\r\n normal: [...dish.normal],\r\n rotation: dish.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as ParabolicDishModel;\r\n }\r\n\r\n private static cloneFresnelReflector(\r\n parent: ElementModel,\r\n reflector: FresnelReflectorModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.FresnelReflector,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: reflector.lx,\r\n ly: reflector.ly,\r\n lz: reflector.lz,\r\n reflectance: reflector.reflectance,\r\n moduleLength: reflector.moduleLength,\r\n tiltAngle: reflector.tiltAngle,\r\n relativeAzimuth: reflector.relativeAzimuth,\r\n poleRadius: reflector.poleRadius,\r\n poleHeight: reflector.poleHeight,\r\n showLabel: reflector.showLabel,\r\n normal: [...reflector.normal],\r\n rotation: reflector.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n receiverId: reflector.receiverId,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as FresnelReflectorModel;\r\n }\r\n\r\n private static cloneHeliostat(parent: ElementModel, heliostat: HeliostatModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Heliostat,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: heliostat.lx,\r\n ly: heliostat.ly,\r\n lz: heliostat.lz,\r\n reflectance: heliostat.reflectance,\r\n tiltAngle: heliostat.tiltAngle,\r\n relativeAzimuth: heliostat.relativeAzimuth,\r\n poleRadius: heliostat.poleRadius,\r\n poleHeight: heliostat.poleHeight,\r\n showLabel: heliostat.showLabel,\r\n normal: [...heliostat.normal],\r\n rotation: heliostat.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n towerId: heliostat.towerId,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as HeliostatModel;\r\n }\r\n\r\n private static cloneWindTurbine(\r\n parent: ElementModel,\r\n windTurbine: WindTurbineModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n ) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n foundationId = parent.id;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.WindTurbine,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: windTurbine.lx,\r\n ly: windTurbine.ly,\r\n lz: windTurbine.lz,\r\n bladeRadius: windTurbine.bladeRadius,\r\n towerRadius: windTurbine.towerRadius,\r\n towerHeight: windTurbine.towerHeight,\r\n showLabel: windTurbine.showLabel,\r\n normal: [...windTurbine.normal],\r\n rotation: windTurbine.parentId ? [...parent.rotation] : [0, 0, 0],\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n id: short.generate() as string,\r\n } as WindTurbineModel;\r\n }\r\n\r\n private static cloneFoundation(foundation: FoundationModel, x: number, y: number) {\r\n return {\r\n type: ObjectType.Foundation,\r\n cx: x,\r\n cy: y,\r\n cz: foundation.cz,\r\n lx: foundation.lx,\r\n ly: foundation.ly,\r\n lz: foundation.lz,\r\n normal: [...foundation.normal],\r\n rotation: [...foundation.rotation],\r\n parentId: foundation.parentId,\r\n color: foundation.color,\r\n textureType: foundation.textureType,\r\n solarStructure: foundation.solarStructure,\r\n solarUpdraftTower: { ...foundation.solarUpdraftTower },\r\n solarAbsorberPipe: { ...foundation.solarAbsorberPipe },\r\n solarPowerTower: { ...foundation.solarPowerTower },\r\n hvacSystem: { ...foundation.hvacSystem },\r\n labelHeight: foundation.labelHeight,\r\n labelSize: foundation.labelSize,\r\n showLabel: foundation.showLabel,\r\n rValue: foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE,\r\n id: short.generate() as string,\r\n } as FoundationModel;\r\n }\r\n\r\n private static cloneCuboid(parentId: string, cuboid: CuboidModel, x: number, y: number) {\r\n return {\r\n type: ObjectType.Cuboid,\r\n cx: x,\r\n cy: y,\r\n cz: cuboid.cz,\r\n lx: cuboid.lx,\r\n ly: cuboid.ly,\r\n lz: cuboid.lz,\r\n color: cuboid.color,\r\n faceColors: cuboid.faceColors ? [...cuboid.faceColors] : ['gray', 'gray', 'gray', 'gray', 'gray', 'gray'],\r\n textureTypes: cuboid.textureTypes\r\n ? [...cuboid.textureTypes]\r\n : [\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 normal: [...cuboid.normal],\r\n rotation: [...cuboid.rotation],\r\n stackable: cuboid.stackable,\r\n enableGroupMaster: cuboid.enableGroupMaster,\r\n parentId: parentId,\r\n id: short.generate() as string,\r\n } as CuboidModel;\r\n }\r\n\r\n private static cloneWall(parent: ElementModel, wall: WallModel, x: number, y: number, z?: number) {\r\n return {\r\n type: ObjectType.Wall,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: wall.lx,\r\n ly: wall.ly,\r\n lz: wall.lz,\r\n parapet: { ...wall.parapet },\r\n eavesLength: wall.eavesLength ?? 0,\r\n rValue: wall.rValue,\r\n volumetricHeatCapacity: wall.volumetricHeatCapacity,\r\n fill: wall.fill,\r\n leftUnfilledHeight: wall.leftUnfilledHeight,\r\n rightUnfilledHeight: wall.rightUnfilledHeight,\r\n leftTopPartialHeight: wall.leftTopPartialHeight,\r\n rightTopPartialHeight: wall.rightTopPartialHeight,\r\n leftJoints: [],\r\n rightJoints: [],\r\n leftPoint: [...wall.leftPoint],\r\n rightPoint: [...wall.rightPoint],\r\n relativeAngle: wall.relativeAngle,\r\n textureType: wall.textureType,\r\n color: wall.color,\r\n normal: [...wall.normal],\r\n rotation: [...wall.rotation],\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n wallStructure: wall.wallStructure,\r\n structureSpacing: wall.structureSpacing,\r\n structureColor: wall.structureColor,\r\n structureWidth: wall.structureWidth,\r\n opacity: wall.opacity,\r\n roofId: wall.roofId,\r\n leftRoofHeight: wall.leftRoofHeight,\r\n rightRoofHeight: wall.rightRoofHeight,\r\n centerRoofHeight: wall.centerRoofHeight,\r\n centerLeftRoofHeight: wall.centerLeftRoofHeight,\r\n centerRightRoofHeight: wall.centerRightRoofHeight,\r\n } as WallModel;\r\n }\r\n\r\n private static cloneWindow(\r\n parent: ElementModel,\r\n window: WindowModel,\r\n x: number,\r\n y: number,\r\n z?: number,\r\n oldParent?: ElementModel | null,\r\n ) {\r\n let foundationId;\r\n let [lx, ly, lz] = [window.lx, parent.ly, window.lz];\r\n let cy = 0.1;\r\n let rotation = [...window.rotation];\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n foundationId = parent.parentId;\r\n rotation = [0, -1, 0];\r\n break;\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n cy = y;\r\n ly = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n\r\n // copy to wall\r\n if (parent.type === ObjectType.Wall) {\r\n lx = window.lx / parent.lx;\r\n lz = window.lz / parent.lz;\r\n }\r\n return {\r\n type: ObjectType.Window,\r\n cx: x,\r\n cy: cy,\r\n cz: z,\r\n lx: lx,\r\n ly: ly,\r\n lz: lz,\r\n uValue: window.uValue,\r\n mullion: window.mullion,\r\n mullionWidth: window.mullionWidth,\r\n mullionSpacing: window.mullionSpacing,\r\n mullionColor: window.mullionColor,\r\n frame: window.frame,\r\n frameWidth: window.frameWidth,\r\n sillWidth: window.sillWidth,\r\n windowType: window.windowType,\r\n archHeight: window.archHeight,\r\n color: window.color,\r\n normal: [0, 0, 0],\r\n rotation: rotation,\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n tint: window.tint,\r\n opacity: window.opacity,\r\n shutter: { ...window.shutter },\r\n empty: window.empty,\r\n interior: window.interior,\r\n parentType: parent.type,\r\n polygonTop: window.polygonTop,\r\n } as WindowModel;\r\n }\r\n\r\n private static cloneDoor(parent: ElementModel, door: DoorModel, x: number, y: number, z?: number) {\r\n let foundationId;\r\n switch (parent.type) {\r\n case ObjectType.Cuboid:\r\n foundationId = parent.id;\r\n break;\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n foundationId = parent.parentId;\r\n break;\r\n }\r\n return {\r\n type: ObjectType.Door,\r\n cx: x,\r\n cy: door.cy,\r\n cz: door.cz,\r\n lx: door.lx,\r\n ly: door.ly,\r\n lz: door.lz,\r\n color: door.color,\r\n frameColor: door.frameColor,\r\n opacity: door.opacity,\r\n uValue: door.uValue,\r\n volumetricHeatCapacity: door.volumetricHeatCapacity,\r\n textureType: door.textureType,\r\n filled: door.filled,\r\n interior: door.interior,\r\n doorType: door.doorType,\r\n archHeight: door.archHeight,\r\n normal: [...door.normal],\r\n rotation: [...door.rotation],\r\n id: short.generate() as string,\r\n parentId: parent.id,\r\n foundationId: foundationId,\r\n } as DoorModel;\r\n }\r\n\r\n private static cloneRoof(parent: ElementModel, roof: RoofModel, x: number, y: number, z?: number) {\r\n const newRoof = {\r\n id: short.generate() as string,\r\n type: ObjectType.Roof,\r\n cx: x,\r\n cy: y,\r\n cz: z,\r\n lx: roof.lx,\r\n ly: roof.ly,\r\n lz: roof.lz,\r\n ceiling: roof.ceiling,\r\n rise: roof.rise,\r\n color: roof.color,\r\n rValue: roof.rValue,\r\n ceilingRValue: roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE,\r\n volumetricHeatCapacity: roof.volumetricHeatCapacity,\r\n sideColor: roof.sideColor,\r\n normal: [...roof.normal],\r\n rotation: [...roof.rotation],\r\n parentId: parent.id,\r\n foundationId: parent.id,\r\n roofType: roof.roofType,\r\n roofStructure: roof.roofStructure,\r\n rafterColor: roof.rafterColor,\r\n rafterSpacing: roof.rafterSpacing,\r\n rafterWidth: roof.rafterWidth,\r\n textureType: roof.textureType,\r\n thickness: roof.thickness,\r\n wallsId: [...roof.wallsId], // handled in common store\r\n opacity: roof.opacity,\r\n glassTint: roof.glassTint,\r\n } as RoofModel;\r\n switch (roof.roofType) {\r\n case RoofType.Gable:\r\n (newRoof as GableRoofModel).ridgeLeftPoint = [...(roof as GableRoofModel).ridgeLeftPoint];\r\n (newRoof as GableRoofModel).ridgeRightPoint = [...(roof as GableRoofModel).ridgeRightPoint];\r\n break;\r\n case RoofType.Gambrel:\r\n const newGambrelRoof = newRoof as GambrelRoofModel;\r\n const oldGambrelRoof = roof as GambrelRoofModel;\r\n newGambrelRoof.topRidgePoint = [...oldGambrelRoof.topRidgePoint];\r\n newGambrelRoof.frontRidgePoint = [...oldGambrelRoof.frontRidgePoint];\r\n newGambrelRoof.backRidgePoint = [...oldGambrelRoof.backRidgePoint];\r\n break;\r\n case RoofType.Hip:\r\n (newRoof as HipRoofModel).rightRidgeLength = (roof as HipRoofModel).rightRidgeLength;\r\n (newRoof as HipRoofModel).leftRidgeLength = (roof as HipRoofModel).leftRidgeLength;\r\n break;\r\n case RoofType.Mansard:\r\n (newRoof as MansardRoofModel).ridgeWidth = (roof as MansardRoofModel).ridgeWidth;\r\n break;\r\n }\r\n return newRoof as ElementModel;\r\n }\r\n}\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ViewState } from './ViewState';\nimport { immerable } from 'immer';\nimport { Rectangle } from '../models/Rectangle';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n DEFAULT_SOLAR_PANEL_SHININESS,\n DEFAULT_WINDOW_SHININESS,\n} from '../constants';\n\nexport class DefaultViewState implements ViewState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n navigationView: boolean;\n orthographic: boolean;\n enableRotate: boolean;\n directLightIntensity: number;\n ambientLightIntensity: number;\n cameraPosition: number[];\n cameraPosition2D: number[];\n panCenter: number[];\n panCenter2D: number[];\n cameraZoom: number;\n\n axes: boolean;\n heatFluxScaleFactor: number;\n heatFluxColor: string;\n heatFluxWidth: number;\n solarRadiationHeatMapMaxValue: number;\n solarRadiationHeatMapReflectionOnly: boolean; // for heliostats and Fresnel reflectors\n shadowEnabled: boolean;\n theme: string;\n heliodon: boolean;\n showSunAngles: boolean;\n showAzimuthAngle: boolean;\n showElevationAngle: boolean;\n showZenithAngle: boolean;\n groundImage: boolean;\n groundImageType: string;\n groundColor: string;\n waterSurface: boolean;\n solarPanelShininess: number;\n windowShininess: number;\n\n showMapPanel: boolean;\n showHeliodonPanel: boolean;\n showWeatherPanel: boolean;\n showDiurnalTemperaturePanel: boolean;\n showStickyNotePanel: boolean;\n showSiteInfoPanel: boolean;\n showDesignInfoPanel: boolean;\n showInstructionPanel: boolean;\n showDailyLightSensorPanel: boolean;\n showYearlyLightSensorPanel: boolean;\n showDailyPvYieldPanel: boolean;\n showYearlyPvYieldPanel: boolean;\n showSolarPanelVisibilityResultsPanel: boolean;\n showDailyParabolicTroughYieldPanel: boolean;\n showYearlyParabolicTroughYieldPanel: boolean;\n showDailyParabolicDishYieldPanel: boolean;\n showYearlyParabolicDishYieldPanel: boolean;\n showDailyFresnelReflectorYieldPanel: boolean;\n showYearlyFresnelReflectorYieldPanel: boolean;\n showDailyHeliostatYieldPanel: boolean;\n showYearlyHeliostatYieldPanel: boolean;\n showDailyUpdraftTowerYieldPanel: boolean;\n showYearlyUpdraftTowerYieldPanel: boolean;\n showDailyBuildingEnergyPanel: boolean;\n showYearlyBuildingEnergyPanel: boolean;\n showEvolutionPanel: boolean;\n autoRotate: boolean;\n\n heliodonPanelX: number;\n heliodonPanelY: number;\n mapPanelX: number;\n mapPanelY: number;\n weatherPanelRect: Rectangle;\n diurnalTemperaturePanelRect: Rectangle;\n stickyNotePanelRect: Rectangle;\n dailyLightSensorPanelRect: Rectangle;\n yearlyLightSensorPanelRect: Rectangle;\n yearlyLightSensorPanelShowDaylight: boolean;\n yearlyLightSensorPanelShowClearness: boolean;\n dailyPvYieldPanelRect: Rectangle;\n yearlyPvYieldPanelRect: Rectangle;\n visibilityResultsPanelRect: Rectangle;\n dailyParabolicTroughYieldPanelRect: Rectangle;\n yearlyParabolicTroughYieldPanelRect: Rectangle;\n dailyParabolicDishYieldPanelRect: Rectangle;\n yearlyParabolicDishYieldPanelRect: Rectangle;\n dailyFresnelReflectorYieldPanelRect: Rectangle;\n yearlyFresnelReflectorYieldPanelRect: Rectangle;\n dailyHeliostatYieldPanelRect: Rectangle;\n yearlyHeliostatYieldPanelRect: Rectangle;\n dailyUpdraftTowerYieldPanelRect: Rectangle;\n yearlyUpdraftTowerYieldPanelRect: Rectangle;\n dailyBuildingEnergyPanelRect: Rectangle;\n yearlyBuildingEnergyPanelRect: Rectangle;\n evolutionPanelRect: Rectangle;\n\n mapZoom: number;\n mapType: string;\n mapTilt: number;\n\n constructor() {\n this.navigationView = false;\n this.orthographic = false;\n this.enableRotate = true;\n this.directLightIntensity = 1;\n this.ambientLightIntensity = 0.1;\n this.cameraPosition = [5, -30, 1];\n this.cameraPosition2D = [0, 0, 150];\n this.panCenter = [0, 0, 0];\n this.panCenter2D = [0, 0, 0];\n this.cameraZoom = 20;\n\n this.axes = true;\n this.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\n this.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\n this.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\n this.solarRadiationHeatMapMaxValue = 5;\n this.solarRadiationHeatMapReflectionOnly = false;\n this.shadowEnabled = true;\n this.theme = 'Default';\n this.heliodon = false;\n this.showSunAngles = false;\n this.showAzimuthAngle = true;\n this.showElevationAngle = true;\n this.showZenithAngle = true;\n this.groundImage = false;\n this.groundImageType = 'roadmap';\n this.groundColor = '#16A5A5';\n this.waterSurface = false;\n this.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\n this.windowShininess = DEFAULT_WINDOW_SHININESS;\n\n this.showMapPanel = false;\n this.showHeliodonPanel = false;\n this.showWeatherPanel = false;\n this.showDiurnalTemperaturePanel = false;\n this.showStickyNotePanel = false;\n this.showSiteInfoPanel = true;\n this.showDesignInfoPanel = false;\n this.showInstructionPanel = true;\n this.showDailyLightSensorPanel = false;\n this.showYearlyLightSensorPanel = false;\n this.showDailyPvYieldPanel = false;\n this.showYearlyPvYieldPanel = false;\n this.showSolarPanelVisibilityResultsPanel = false;\n this.showDailyParabolicTroughYieldPanel = false;\n this.showYearlyParabolicTroughYieldPanel = false;\n this.showDailyParabolicDishYieldPanel = false;\n this.showYearlyParabolicDishYieldPanel = false;\n this.showDailyFresnelReflectorYieldPanel = false;\n this.showYearlyFresnelReflectorYieldPanel = false;\n this.showDailyHeliostatYieldPanel = false;\n this.showYearlyHeliostatYieldPanel = false;\n this.showDailyUpdraftTowerYieldPanel = false;\n this.showYearlyUpdraftTowerYieldPanel = false;\n this.showDailyBuildingEnergyPanel = false;\n this.showYearlyBuildingEnergyPanel = false;\n this.showEvolutionPanel = false;\n this.autoRotate = false;\n\n this.heliodonPanelX = 0;\n this.heliodonPanelY = 0;\n this.mapPanelX = 0;\n this.mapPanelY = 0;\n this.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n this.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n this.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n this.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n this.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n this.yearlyLightSensorPanelShowDaylight = false;\n this.yearlyLightSensorPanelShowClearness = false;\n this.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n this.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n this.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n this.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n this.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n this.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n\n this.mapZoom = 18;\n this.mapType = 'roadmap';\n this.mapTilt = 0;\n }\n\n static resetViewState(viewState: ViewState) {\n viewState.navigationView = false;\n viewState.orthographic = false;\n viewState.enableRotate = true;\n viewState.cameraPosition = [5, -30, 1];\n viewState.panCenter = [0, 0, 0];\n viewState.cameraZoom = 20;\n viewState.cameraPosition2D = [0, 0, 20];\n viewState.panCenter2D = [0, 0, 0];\n viewState.directLightIntensity = 1;\n viewState.ambientLightIntensity = 0.1;\n\n viewState.axes = true;\n viewState.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\n viewState.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\n viewState.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\n viewState.solarRadiationHeatMapMaxValue = 5;\n viewState.solarRadiationHeatMapReflectionOnly = false;\n viewState.shadowEnabled = true;\n viewState.theme = 'Default';\n viewState.heliodon = false;\n viewState.showSunAngles = false;\n viewState.showAzimuthAngle = true;\n viewState.showElevationAngle = true;\n viewState.showZenithAngle = true;\n viewState.groundImage = false;\n viewState.groundImageType = 'roadmap';\n viewState.groundColor = '#16A5A5';\n viewState.waterSurface = false;\n viewState.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\n viewState.windowShininess = DEFAULT_WINDOW_SHININESS;\n\n viewState.showMapPanel = false;\n viewState.showHeliodonPanel = false;\n viewState.showWeatherPanel = false;\n viewState.showDiurnalTemperaturePanel = false;\n viewState.showStickyNotePanel = false;\n viewState.showSiteInfoPanel = true;\n viewState.showDesignInfoPanel = true;\n viewState.showInstructionPanel = true;\n viewState.showDailyLightSensorPanel = false;\n viewState.showYearlyLightSensorPanel = false;\n viewState.showDailyPvYieldPanel = false;\n viewState.showYearlyPvYieldPanel = false;\n viewState.showSolarPanelVisibilityResultsPanel = false;\n viewState.showDailyParabolicTroughYieldPanel = false;\n viewState.showYearlyParabolicTroughYieldPanel = false;\n viewState.showDailyParabolicDishYieldPanel = false;\n viewState.showYearlyParabolicDishYieldPanel = false;\n viewState.showDailyFresnelReflectorYieldPanel = false;\n viewState.showYearlyFresnelReflectorYieldPanel = false;\n viewState.showDailyHeliostatYieldPanel = false;\n viewState.showYearlyHeliostatYieldPanel = false;\n viewState.showDailyUpdraftTowerYieldPanel = false;\n viewState.showYearlyUpdraftTowerYieldPanel = false;\n viewState.showDailyBuildingEnergyPanel = false;\n viewState.showYearlyBuildingEnergyPanel = false;\n viewState.showEvolutionPanel = false;\n viewState.autoRotate = false;\n\n viewState.heliodonPanelX = 0;\n viewState.heliodonPanelY = 0;\n viewState.mapPanelX = 0;\n viewState.mapPanelY = 0;\n viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n viewState.yearlyLightSensorPanelShowDaylight = false;\n viewState.yearlyLightSensorPanelShowClearness = false;\n viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\n viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n\n viewState.mapZoom = 18;\n viewState.mapType = 'roadmap';\n viewState.mapTilt = 0;\n }\n}\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 { defaultShutter } from '../views/window/window';\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 windowMullion: boolean;\n windowMullionWidth: number;\n windowMullionSpacing: 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.windowMullion = true;\n this.windowMullionWidth = 0.06;\n this.windowMullionSpacing = 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 = defaultShutter.showLeft;\n this.windowShutterRight = defaultShutter.showRight;\n this.windowShutterColor = defaultShutter.color;\n this.windowShutterWidth = defaultShutter.width;\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport create from 'zustand';\nimport short from 'short-uuid';\nimport dayjs from 'dayjs';\nimport Papa from 'papaparse';\nimport i18n from '../i18n/i18n';\nimport enUS from 'antd/lib/locale/en_US';\nimport weather from '../resources/weather.csv';\nimport solar_radiation_horizontal from '../resources/solar_radiation_horizontal.csv';\nimport solar_radiation_vertical from '../resources/solar_radiation_vertical.csv';\nimport pvmodules from '../resources/pvmodules.csv';\nimport produce, { enableMapSet } from 'immer';\nimport {\n ActionInfo,\n ActionType,\n DataColoring,\n DatumEntry,\n Design,\n DesignProblem,\n ElementState,\n EvolutionMethod,\n ModelSite,\n ModelType,\n MoveHandleType,\n ObjectType,\n Orientation,\n ProjectInfo,\n Range,\n ResizeHandleType,\n RoofHandleType,\n RotateHandleType,\n Scope,\n SolarStructure,\n User,\n} from '../types';\nimport { devtools, persist } from 'zustand/middleware';\nimport { WorldModel } from '../models/WorldModel';\nimport { ElementModel } from '../models/ElementModel';\nimport { WeatherModel } from '../models/WeatherModel';\nimport { Util } from '../Util';\nimport { DefaultWorldModel } from './DefaultWorldModel';\nimport { Box3, Euler, Raycaster, Vector2, Vector3 } from 'three';\nimport { ElementModelCloner } from '../models/ElementModelCloner';\nimport { DefaultViewState } from './DefaultViewState';\nimport { ViewState } from './ViewState';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { GroundModel } from '../models/GroundModel';\nimport { PvModel } from '../models/PvModel';\nimport { ThreeEvent } from '@react-three/fiber';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { WallModel } from '../models/WallModel';\nimport { Locale } from 'antd/lib/locale-provider';\nimport { Undoable } from '../undo/Undoable';\nimport { UndoManager } from '../undo/UndoManager';\nimport { HumanModel } from '../models/HumanModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport {\n DEFAULT_ADDRESS,\n DEFAULT_MODEL_MAP_ZOOM,\n FLOATING_WINDOW_OPACITY,\n GROUND_ID,\n HALF_PI,\n ORIGIN_VECTOR2,\n UNIT_VECTOR_POS_Z_ARRAY,\n} from '../constants';\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Point2 } from '../models/Point2';\nimport { useRefStore } from './commonRef';\nimport { showError } from '../helpers';\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\nimport { DefaultSolarPanelArrayLayoutParams } from './DefaultSolarPanelArrayLayoutParams';\nimport { SolarCollector } from '../models/SolarCollector';\nimport { ConcentratedSolarPowerCollector } from '../models/ConcentratedSolarPowerCollector';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { ElementCounter } from './ElementCounter';\nimport { ParabolicCollector } from '../models/ParabolicCollector';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { SolarRadiationData } from '../models/SolarRadiationData';\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\nimport { DefaultEvolutionaryAlgorithmState } from './DefaultEvolutionaryAlgorithmState';\nimport { RoofModel, RoofStructure } from 'src/models/RoofModel';\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\nimport { DefaultSolarPanelArrayLayoutConstraints } from './DefaultSolarPanelArrayLayoutConstraints';\nimport { EconomicsParams } from './EconomicsParams';\nimport { DefaultEconomicsParams } from './DefaultEconomicsParams';\nimport { RoofUtil } from 'src/views/roof/RoofUtil';\nimport { ActionState } from './ActionState';\nimport { DefaultActionState } from './DefaultActionState';\nimport { LightModel } from '../models/LightModel';\nimport { usePrimitiveStore } from './commonPrimitive';\nimport { useDataStore } from './commonData';\nimport { GraphState } from './GraphState';\nimport { DefaultGraphState } from './DefaultGraphState';\nimport { isStackableModel } from 'src/models/Stackable';\nimport { WindowModel } from 'src/models/WindowModel';\nimport { ProjectUtil } from '../panels/ProjectUtil';\n\nenableMapSet();\n\nexport interface CommonStoreState {\n set: (fn: (state: CommonStoreState) => void) => void;\n\n // only the following properties are persisted (see the whitelist at the end)\n world: WorldModel;\n elements: ElementModel[];\n viewState: ViewState;\n actionState: ActionState;\n graphState: GraphState;\n modelType: ModelType;\n modelAuthor: string | null;\n modelLabel: string | null;\n modelDescription: string | null;\n projectView: boolean;\n projectInfo: ProjectInfo;\n projectImages: Map;\n designProjectType: DesignProblem | null; // this belongs to a design of a project\n notes: string[];\n user: User;\n language: string;\n floatingWindowOpacity: number;\n selectedFloatingWindow: string | null;\n cloudFile: string | undefined;\n latestModelSite?: ModelSite;\n modelSites: Map>; // primary key: 'lat, lng', secondary key: 'title, userid'\n peopleModels: Map>; // primary key: author, secondary key: 'title, userid'\n modelsMapLatitude: number;\n modelsMapLongitude: number;\n modelsMapAddress: string;\n modelsMapZoom: number;\n modelsMapType: string;\n modelsMapTilt: number;\n\n minimumNavigationMoveSpeed: number;\n minimumNavigationTurnSpeed: number;\n\n ray: Raycaster;\n mouse: Vector2;\n\n fileChanged: boolean;\n applyCount: number;\n setApplyCount: (count: number) => void;\n revertApply: () => void;\n\n importContent: (input: any, title?: string) => void;\n exportContent: () => {};\n clearContent: () => void;\n createEmptyFile: () => void;\n undoManager: UndoManager;\n addUndoable: (undoable: Undoable) => void;\n\n weatherData: { [key: string]: WeatherModel };\n getWeather: (location: string) => WeatherModel;\n loadWeatherData: () => void;\n horizontalSolarRadiationData: { [key: string]: SolarRadiationData };\n getHorizontalSolarRadiation: (location: string) => SolarRadiationData;\n loadHorizontalSolarRadiationData: () => void;\n verticalSolarRadiationData: { [key: string]: SolarRadiationData };\n getVerticalSolarRadiation: (location: string) => SolarRadiationData;\n loadVerticalSolarRadiationData: () => void;\n getClosestCity: (lat: number, lng: number) => string | null;\n\n pvModules: { [key: string]: PvModel };\n getPvModule: (name: string) => PvModel;\n loadPvModules: () => void;\n\n aabb: Box3; // axis-aligned bounding box of elements\n animate24Hours: boolean;\n evolutionMethod: EvolutionMethod;\n clickObjectType: ObjectType | null;\n contextMenuObjectType: ObjectType | null;\n hoveredHandle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null;\n moveHandleType: MoveHandleType | null;\n resizeHandleType: ResizeHandleType | null;\n rotateHandleType: RotateHandleType | null;\n resizeAnchor: Vector3;\n selectedElement: ElementModel | null;\n getSelectedElement: () => ElementModel | null;\n findNearestSibling: (id: string) => string | null;\n overlapWithSibling: (me: ElementModel, threshold?: number) => boolean;\n selectedSideIndex: number;\n getResizeHandlePosition: (e: ElementModel, type: ResizeHandleType) => Vector3;\n getElementById: (id: string) => ElementModel | null;\n getParent: (child: ElementModel) => ElementModel | null;\n getFoundation: (elem: ElementModel) => FoundationModel | null;\n selectMe: (id: string, e: ThreeEvent, action?: ActionType, select?: boolean) => void;\n selectNone: () => void;\n setElementPosition: (id: string, x: number, y: number, z?: number) => void;\n setElementNormal: (id: string, x: number, y: number, z: number) => void;\n setElementSize: (id: string, lx: number, ly: number, lz?: number) => void;\n\n selectedElementIdSet: Set;\n multiSelectionsMode: boolean;\n\n // for all types of elements\n updateAllElementLocks: (locked: boolean) => void;\n updateElementLockByFoundationId: (foundationId: string, locked: boolean) => void;\n updateElementLockByParentId: (parentId: string, type: ObjectType, locked: boolean) => void;\n updateElementLockById: (id: string, locked: boolean) => void;\n updateElementReferenceById: (id: string, referenceId: string) => void;\n updateElementLabelById: (id: string, label: string) => void;\n updateElementShowLabelById: (id: string, showLabel: boolean) => void;\n\n updateElementColorById: (id: string, color: string) => void;\n updateElementColorOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n color: string,\n ) => void;\n updateElementColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\n updateElementColorForAll: (type: ObjectType, color: string) => void;\n\n updateElementLineColorById: (id: string, color: string) => void;\n updateElementLineColorOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n color: string,\n ) => void;\n updateElementLineColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\n updateElementLineColorForAll: (type: ObjectType, color: string) => void;\n\n updateElementLineWidthById: (id: string, width: number) => void;\n updateElementLineWidthOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n width: number,\n ) => void;\n updateElementLineWidthAboveFoundation: (type: ObjectType, foundationId: string, width: number) => void;\n updateElementLineWidthForAll: (type: ObjectType, width: number) => void;\n\n updateElementRotationById: (id: string, x: number, y: number, z: number) => void;\n updateElementRotationForAll: (type: ObjectType, x: number, y: number, z: number) => void;\n\n updateElementCxById: (id: string, cx: number) => void;\n updateElementCyById: (id: string, cy: number) => void;\n updateElementCzById: (id: string, cz: number) => void;\n updateElementCzForAll: (type: ObjectType, cz: number) => void;\n\n updateElementLxById: (id: string, lx: number) => void;\n updateElementLxOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lx: number) => void;\n updateElementLxAboveFoundation: (type: ObjectType, foundationId: string, lx: number) => void;\n updateElementLxForAll: (type: ObjectType, lx: number) => void;\n\n updateElementLyById: (id: string, ly: number) => void;\n updateElementLyOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, ly: number) => void;\n updateElementLyAboveFoundation: (type: ObjectType, foundationId: string, ly: number) => void;\n updateElementLyForAll: (type: ObjectType, ly: number) => void;\n\n updateElementLzById: (id: string, lz: number) => void;\n updateElementLzOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lz: number) => void;\n updateElementLzAboveFoundation: (type: ObjectType, foundationId: string, lz: number) => void;\n updateElementLzForAll: (type: ObjectType, lz: number) => void;\n\n // for all types of solar collectors\n updateSolarCollectorDrawSunBeamById: (id: string, draw: boolean) => void;\n updateSolarCollectorDrawSunBeamAboveFoundation: (type: ObjectType, foundationId: string, draw: boolean) => void;\n updateSolarCollectorDrawSunBeamForAll: (type: ObjectType, draw: boolean) => void;\n updateSolarCollectorRelativeAzimuthById: (id: string, relativeAzimuth: number) => void;\n updateSolarCollectorRelativeAzimuthOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n relativeAzimuth: number,\n ) => void;\n updateSolarCollectorRelativeAzimuthAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n relativeAzimuth: number,\n ) => void;\n updateSolarCollectorRelativeAzimuthForAll: (type: ObjectType, relativeAzimuth: number) => void;\n updateSolarCollectorPoleHeightById: (id: string, poleHeight: number) => void;\n updateSolarCollectorPoleHeightOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n poleHeight: number,\n ) => void;\n updateSolarCollectorPoleHeightAboveFoundation: (type: ObjectType, foundationId: string, poleHeight: number) => void;\n updateSolarCollectorPoleHeightForAll: (type: ObjectType, poleHeight: number) => void;\n\n updateSolarCollectorPoleRadiusById: (id: string, poleRadius: number) => void;\n updateSolarCollectorPoleRadiusOnSurface: (\n type: ObjectType,\n parentId: string,\n normal: number[] | undefined,\n poleRadius: number,\n ) => void;\n updateSolarCollectorPoleRadiusAboveFoundation: (type: ObjectType, foundationId: string, poleRadius: number) => void;\n updateSolarCollectorPoleRadiusForAll: (type: ObjectType, poleRadius: number) => void;\n\n clearAllSolarCollectorYields: () => void;\n updateSolarCollectorDailyYieldById: (id: string, dailyYield: number) => void;\n updateSolarCollectorYearlyYieldById: (id: string, yearlyYield: number) => void;\n\n // for all types of concentrated solar power collectors\n updateCspReflectanceById: (id: string, reflectance: number) => void;\n updateCspReflectanceAboveFoundation: (type: ObjectType, foundationId: string, reflectance: number) => void;\n updateCspReflectanceForAll: (type: ObjectType, reflectance: number) => void;\n\n // for all types of parabolic solar collectors (that are standalone units)\n updateParabolicCollectorAbsorptanceById: (id: string, absorptance: number) => void;\n updateParabolicCollectorAbsorptanceAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n absorptance: number,\n ) => void;\n updateParabolicCollectorAbsorptanceForAll: (type: ObjectType, absorptance: number) => void;\n updateParabolicCollectorOpticalEfficiencyById: (id: string, opticalEfficiency: number) => void;\n updateParabolicCollectorOpticalEfficiencyAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n opticalEfficiency: number,\n ) => void;\n updateParabolicCollectorOpticalEfficiencyForAll: (type: ObjectType, opticalEfficiency: number) => void;\n updateParabolicCollectorThermalEfficiencyById: (id: string, thermalEfficiency: number) => void;\n updateParabolicCollectorThermalEfficiencyAboveFoundation: (\n type: ObjectType,\n foundationId: string,\n thermalEfficiency: number,\n ) => void;\n updateParabolicCollectorThermalEfficiencyForAll: (type: ObjectType, thermalEfficiency: number) => void;\n\n // for foundations\n foundationActionScope: Scope;\n setFoundationActionScope: (scope: Scope) => void;\n\n // for cuboids\n cuboidActionScope: Scope;\n setCuboidActionScope: (scope: Scope) => void;\n\n // for polygons\n polygonActionScope: Scope;\n setPolygonActionScope: (scope: Scope) => void;\n updatePolygonVertexPositionById: (id: string, index: number, x: number, y: number) => void;\n updatePolygonVerticesById: (id: string, vertices: Point2[]) => void;\n\n // for solar panels\n solarPanelActionScope: Scope;\n setSolarPanelActionScope: (scope: Scope) => void;\n updateSolarPanelTiltAngleById: (id: string, tiltAngle: number) => void;\n setSolarPanelOrientation: (sp: SolarPanelModel, pvModel: PvModel, orientation: Orientation) => void;\n\n // for parabolic troughs\n parabolicTroughActionScope: Scope;\n setParabolicTroughActionScope: (scope: Scope) => void;\n\n // for Fresnel reflectors\n fresnelReflectorActionScope: Scope;\n setFresnelReflectorActionScope: (scope: Scope) => void;\n\n // for heliostats\n heliostatActionScope: Scope;\n setHeliostatActionScope: (scope: Scope) => void;\n\n // for Fresnel reflectors and heliostats\n updateSolarReceiverById: (id: string, receiverId: string) => void;\n updateSolarReceiverAboveFoundation: (type: ObjectType, foundationId: string, receiverId: string) => void;\n updateSolarReceiverForAll: (type: ObjectType, receiverId: string) => void;\n\n // for parabolic dishes\n parabolicDishActionScope: Scope;\n setParabolicDishActionScope: (scope: Scope) => void;\n\n // for parabolic troughs and Fresnel reflectors\n updateModuleLengthById: (id: string, moduleLength: number) => void;\n updateModuleLengthAboveFoundation: (type: ObjectType, foundationId: string, moduleLength: number) => void;\n updateModuleLengthForAll: (type: ObjectType, moduleLength: number) => void;\n\n // for parabolic troughs and dishes\n updateParabolaLatusRectumById: (id: string, latusRectum: number) => void;\n updateParabolaLatusRectumAboveFoundation: (type: ObjectType, foundationId: string, latusRectum: number) => void;\n updateParabolaLatusRectumForAll: (type: ObjectType, latusRectum: number) => void;\n\n // for walls\n wallActionScope: Scope;\n setWallActionScope: (scope: Scope) => void;\n\n // for roofs\n roofActionScope: Scope;\n setRoofActionScope: (scope: Scope) => void;\n\n // for windows\n windowActionScope: Scope;\n setWindowActionScope: (scope: Scope) => void;\n\n // for doors\n doorActionScope: Scope;\n setDoorActionScope: (scope: Scope) => void;\n\n updateWallRelativeAngleById: (id: string, angle: number) => void;\n updateWallLeftJointsById: (id: string, joints: string[]) => void;\n updateWallRightJointsById: (id: string, joints: string[]) => void;\n updateWallLeftPointById: (id: string, point: number[]) => void;\n updateWallRightPointById: (id: string, point: number[]) => void;\n\n // for roofs\n updateRoofRiseById: (id: string, rise: number, topZ?: number) => void;\n updateRoofStructureById: (id: string, structure: RoofStructure) => void;\n\n // for lights\n updateInsideLightById: (id: string, inside: boolean) => void;\n updateInsideLightsByParentId: (parentId: string, inside: boolean) => void;\n\n actionModeLock: boolean;\n objectTypeToAdd: ObjectType;\n addElement: (parent: ElementModel | GroundModel, position: Vector3, normal?: Vector3) => ElementModel | null;\n\n pastePoint: Vector3;\n pasteNormal: Vector3 | undefined;\n elementsToPaste: ElementModel[]; // this is for undoing cut and pasting\n deletedElements: ElementModel[]; // this is for undoing deletion\n clearDeletedElements: () => void;\n copyElementById: (id: string) => void;\n removeElementById: (id: string, cut: boolean, selectNone?: boolean, auto?: boolean) => ElementModel[]; // set cut to false for deletion\n copyCutElements: () => ElementModel[];\n pasteElementsToPoint: () => ElementModel[];\n pasteElementsByKey: () => ElementModel[];\n countElementsByType: (type: ObjectType, excludeLocked?: boolean) => number;\n countSolarStructuresByType: (type: SolarStructure, excludeLocked?: boolean) => number;\n countObservers: () => number;\n removeElementsByType: (type: ObjectType) => void;\n countElementsByReferenceId: (id: string) => number;\n removeElementsByReferenceId: (id: string, cache: boolean) => void;\n getChildren: (id: string) => ElementModel[];\n getChildrenOfType: (type: ObjectType, id: string) => ElementModel[];\n // the following goes faster than counting individual types of children through multiple loops\n countAllElements: (excludeLocked?: boolean) => number;\n countAllElementsByType: (excludeLocked?: boolean) => ElementCounter;\n countAllOffspringsByTypeAtOnce: (ancestorId: string, includingLocked: boolean) => ElementCounter;\n countSolarPanelsOnRack: (id: string) => number;\n removeAllChildElementsByType: (parentId: string, type: ObjectType) => void;\n removeAllElementsOnFoundationByType: (foundationId: string, type: ObjectType) => void;\n\n // genetic algorithms and particle swarm optimization\n fittestIndividualResults: DatumEntry[];\n setFittestIndividualResults: (data: DatumEntry[]) => void;\n variableLabels: (string | undefined)[];\n setVariableLabels: (labels: (string | undefined)[]) => void;\n\n sunlightDirection: Vector3;\n setSunlightDirection: (vector: Vector3) => void;\n\n cameraDirection: Vector3;\n getCameraDirection: () => Vector3;\n\n updateSceneRadiusFlag: boolean;\n updateSceneRadius: () => void;\n sceneRadius: number;\n setSceneRadius: (radius: number) => void;\n\n selectedElementAngle: number;\n selectedElementHeight: number;\n selectedElementX: number;\n selectedElementY: number;\n\n isAddingElement: () => boolean;\n addedFoundationId: string | null;\n deletedFoundationId: string | null;\n\n addedCuboidId: string | null;\n deletedCuboidId: string | null;\n\n addedWallId: string | null;\n deletedWallId: string | null;\n updateWallMapOnFoundationFlag: boolean;\n updateWallMapOnFoundation: () => void;\n\n updateElementOnRoofFlag: boolean;\n setUpdateElementOnRoofFlag: (b: boolean) => void;\n updateElementOnRoofFn: () => void;\n\n addedWindowId: string | null;\n\n addedDoorId: string | null;\n\n addedRoofId: string | null;\n deletedRoofId: string | null;\n setAddedRoofId: (id: string | null) => void;\n\n autoDeletedRoof: RoofModel | null;\n autoDeletedChild: ElementModel[] | null; // [] means checked but no element, null means haven't check yet.\n getAutoDeletedElements: () => ElementModel[] | null;\n\n groupActionMode: boolean;\n setGroupActionMode: (b: boolean) => void;\n groupMasterId: string | null;\n setGroupMasterId: (id: string | null) => void;\n groupActionUpdateFlag: boolean;\n\n locale: Locale;\n localFileName: string;\n createNewFileFlag: boolean;\n setCreateNewFileFlag: (b: boolean) => void;\n openLocalFileFlag: boolean;\n setOpenLocalFileFlag: (b: boolean) => void;\n enableFineGrid: boolean;\n setEnableFineGrid: (b: boolean) => void;\n\n loggable: boolean;\n actionInfo: ActionInfo | undefined;\n currentUndoable: Undoable | undefined;\n showCloudFileTitleDialog: boolean;\n // we have to use the sure flip of an additional flag to ensure it triggers useEffect hook\n showCloudFileTitleDialogFlag: boolean;\n localContentToImportAfterCloudFileUpdate: any;\n\n solarPanelArrayLayoutParams: SolarPanelArrayLayoutParams;\n solarPanelArrayLayoutConstraints: SolarPanelArrayLayoutConstraints;\n evolutionaryAlgorithmState: EvolutionaryAlgorithmState;\n economicsParams: EconomicsParams;\n\n geneticAlgorithmWizardSelectedTab: string;\n particleSwarmOptimizationWizardSelectedTab: string;\n\n // the following is to fix the bug that when ctrl+o is pressed, the file dialog gets fired up multiple times\n localFileDialogRequested: boolean;\n\n tempHumanPlant: ElementModel[];\n}\n\nexport const useStore = create(\n devtools(\n persist(\n (set, get) => {\n const immerSet: CommonStoreState['set'] = (fn) => set(produce(fn));\n const defaultWorldModel = new DefaultWorldModel();\n const defaultElements = defaultWorldModel.getElements();\n\n return {\n set: (fn) => {\n try {\n immerSet(fn);\n } catch (e) {\n console.log(e);\n }\n },\n world: defaultWorldModel,\n elements: defaultElements,\n user: {} as User,\n viewState: new DefaultViewState(),\n actionState: new DefaultActionState(),\n graphState: new DefaultGraphState(),\n solarPanelArrayLayoutParams: new DefaultSolarPanelArrayLayoutParams(),\n solarPanelArrayLayoutConstraints: new DefaultSolarPanelArrayLayoutConstraints(),\n evolutionaryAlgorithmState: new DefaultEvolutionaryAlgorithmState(),\n economicsParams: new DefaultEconomicsParams(),\n geneticAlgorithmWizardSelectedTab: '1',\n particleSwarmOptimizationWizardSelectedTab: '1',\n modelType: ModelType.UNKNOWN,\n modelAuthor: null,\n modelLabel: null,\n modelDescription: null,\n projectView: false,\n projectInfo: {\n owner: null,\n title: null,\n description: null,\n type: DesignProblem.SOLAR_PANEL_ARRAY,\n designs: new Array(),\n ranges: new Array(),\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(DesignProblem.SOLAR_PANEL_ARRAY),\n counter: 0,\n dataColoring: DataColoring.ALL,\n selectedProperty: null,\n sortDescending: false,\n xAxisNameScatteredPlot: null,\n yAxisNameScatteredPlot: null,\n dotSizeScatteredPlot: 5,\n thumbnailWidth: 200,\n } as ProjectInfo,\n projectImages: new Map(),\n designProjectType: null,\n notes: [],\n language: 'en',\n floatingWindowOpacity: FLOATING_WINDOW_OPACITY,\n selectedFloatingWindow: null,\n cloudFile: undefined,\n latestModelSite: undefined,\n modelSites: new Map>(),\n peopleModels: new Map>(),\n modelsMapLatitude: 42.2844063,\n modelsMapLongitude: -71.3488548,\n modelsMapAddress: DEFAULT_ADDRESS,\n modelsMapZoom: DEFAULT_MODEL_MAP_ZOOM,\n modelsMapType: 'roadmap',\n modelsMapTilt: 0,\n\n minimumNavigationMoveSpeed: 3,\n minimumNavigationTurnSpeed: 3,\n\n tempHumanPlant: [],\n\n ray: new Raycaster(),\n mouse: new Vector2(),\n\n fileChanged: false,\n\n applyCount: 0,\n setApplyCount(count) {\n immerSet((state: CommonStoreState) => {\n state.applyCount = count;\n });\n },\n // Not sure why we cannot do this within immerSet\n revertApply() {\n if (get().applyCount) {\n for (let i = 0; i < get().applyCount; i++) {\n get().undoManager.undo();\n }\n get().setApplyCount(0);\n }\n },\n\n importContent(content, title) {\n immerSet((state: CommonStoreState) => {\n state.world = content.world;\n state.viewState = content.view;\n state.graphState = content.graphState ?? new DefaultGraphState();\n state.elements = content.elements;\n state.notes = content.notes ?? [];\n state.modelType = content.modelType ?? ModelType.UNKNOWN;\n state.modelAuthor = content.modelAuthor ?? null;\n state.modelLabel = content.modelLabel ?? null;\n state.modelDescription = content.modelDescription ?? null;\n state.designProjectType = content.designProjectType ?? null;\n state.cloudFile = title;\n state.currentUndoable = undefined;\n state.actionInfo = undefined;\n state.sceneRadius = content.sceneRadius ?? 100;\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\n state.localContentToImportAfterCloudFileUpdate = undefined;\n state.fileChanged = !state.fileChanged;\n state.evolutionMethod = content.evolutionMethod ?? EvolutionMethod.GENETIC_ALGORITHM;\n state.solarPanelArrayLayoutParams =\n content.solarPanelArrayLayoutParams ?? new DefaultSolarPanelArrayLayoutParams();\n state.solarPanelArrayLayoutConstraints =\n content.solarPanelArrayLayoutConstraints ?? new DefaultSolarPanelArrayLayoutConstraints();\n state.evolutionaryAlgorithmState =\n content.evolutionaryAlgorithmState ?? new DefaultEvolutionaryAlgorithmState();\n state.economicsParams = content.economicsParams ?? new DefaultEconomicsParams();\n state.minimumNavigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\n state.minimumNavigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\n // clear existing data, if any\n state.fittestIndividualResults.length = 0;\n state.undoManager.clear();\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n state.actionState = new DefaultActionState();\n state.multiSelectionsMode = false;\n state.selectedElementIdSet.clear();\n state.groupMasterId = null;\n state.selectedFloatingWindow = null;\n // TODO: fix these bugs that are tentatively corrected here\n for (const e of state.elements) {\n if (e.type === ObjectType.Foundation && e.parentId !== GROUND_ID) {\n console.log('Error: ' + e.parentId + ' is not ground!');\n e.parentId = GROUND_ID;\n }\n }\n });\n usePrimitiveStore.setState((state) => {\n state.changed = false;\n state.skipChange = true;\n state.showSolarRadiationHeatmap = false;\n state.showHeatFluxes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n state.clearDailySimulationResultsFlag = !state.clearDailySimulationResultsFlag;\n state.clearYearlySimulationResultsFlag = !state.clearYearlySimulationResultsFlag;\n state.navigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\n state.navigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n exportContent() {\n const state = get();\n const date = new Date();\n const elements = JSON.parse(JSON.stringify(state.elements));\n Util.fixElements(elements);\n return {\n docid: short.generate(),\n time: dayjs(date).format('MM/DD/YYYY hh:mm A'),\n timestamp: date.getTime(),\n userid: state.user.uid,\n owner: state.user.signFile ? state.user.displayName : null,\n email: state.user.signFile ? state.user.email : null,\n world: JSON.parse(JSON.stringify(state.world)),\n elements: elements,\n sceneRadius: state.sceneRadius,\n view: JSON.parse(JSON.stringify(state.viewState)),\n graphState: JSON.parse(JSON.stringify(state.graphState)),\n evolutionMethod: state.evolutionMethod,\n solarPanelArrayLayoutParams: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutParams)),\n solarPanelArrayLayoutConstraints: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutConstraints)),\n evolutionaryAlgorithmState: JSON.parse(JSON.stringify(state.evolutionaryAlgorithmState)),\n economicsParams: JSON.parse(JSON.stringify(state.economicsParams)),\n modelType: state.modelType,\n modelAuthor: state.modelAuthor,\n modelLabel: state.modelLabel,\n modelDescription: state.modelDescription,\n designProjectType: state.designProjectType,\n notes: state.notes,\n minimumNavigationMoveSpeed: state.minimumNavigationMoveSpeed,\n minimumNavigationTurnSpeed: state.minimumNavigationTurnSpeed,\n };\n },\n clearContent() {\n immerSet((state: CommonStoreState) => {\n state.elements = [];\n state.sceneRadius = 100;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n createEmptyFile() {\n immerSet((state: CommonStoreState) => {\n DefaultWorldModel.resetWorldModel(state.world);\n DefaultViewState.resetViewState(state.viewState);\n // don't create a new instance like this (otherwise some UI elements may not update):\n // state.world = new DefaultWorldModel()\n state.elements = [];\n state.sceneRadius = 100;\n state.cloudFile = undefined;\n state.localContentToImportAfterCloudFileUpdate = undefined;\n state.notes = [];\n state.fileChanged = !state.fileChanged;\n state.currentUndoable = undefined;\n state.actionInfo = undefined;\n state.undoManager.clear();\n state.modelType = ModelType.UNKNOWN;\n state.modelLabel = null;\n state.modelDescription = null;\n state.designProjectType = null;\n state.minimumNavigationMoveSpeed = 3;\n state.minimumNavigationTurnSpeed = 3;\n state.multiSelectionsMode = false;\n state.selectedElementIdSet.clear();\n state.groupMasterId = null;\n state.selectedFloatingWindow = null;\n });\n usePrimitiveStore.setState((state) => {\n state.changed = false;\n state.skipChange = true;\n state.showSolarRadiationHeatmap = false;\n state.showHeatFluxes = false;\n });\n useDataStore.getState().clearDataStore();\n useDataStore.getState().clearRoofVerticesMap();\n },\n undoManager: new UndoManager(),\n addUndoable(undoable: Undoable) {\n immerSet((state: CommonStoreState) => {\n if (state.loggable) {\n state.currentUndoable = undoable;\n }\n state.undoManager.add(undoable);\n });\n },\n\n // genetic algorithms\n fittestIndividualResults: [],\n setFittestIndividualResults(data) {\n immerSet((state: CommonStoreState) => {\n state.fittestIndividualResults = [...data];\n });\n },\n variableLabels: [],\n setVariableLabels(labels) {\n immerSet((state: CommonStoreState) => {\n state.variableLabels = [...labels];\n });\n },\n\n // aabb must be initialized with defined vectors, or it may cause problems as it may be used to\n // determine the scopes of the axes.\n aabb: new Box3(new Vector3(-10, -10, -10), new Vector3(10, 10, 10)),\n animate24Hours: false,\n evolutionMethod: EvolutionMethod.GENETIC_ALGORITHM,\n clickObjectType: null,\n contextMenuObjectType: null,\n hoveredHandle: null,\n moveHandleType: null,\n resizeHandleType: null,\n rotateHandleType: null,\n resizeAnchor: new Vector3(),\n\n selectedElement: null,\n getSelectedElement() {\n if (get().selectedElementIdSet.size === 0) return null;\n const elements = get().elements;\n for (const e of elements) {\n if (get().selectedElementIdSet.has(e.id)) {\n return e;\n }\n }\n return null;\n },\n\n selectedElementIdSet: new Set(),\n multiSelectionsMode: false,\n\n // a sibling is defined as an element of the same type of the same parent\n findNearestSibling(id) {\n let foundId: string | null = null;\n const me = get().getElementById(id);\n if (me) {\n let distanceSquare = Number.MAX_VALUE;\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== id) {\n const dx = me.cx - e.cx;\n const dy = me.cy - e.cy;\n const dz = me.cz - e.cz;\n const sq = dx * dx + dy * dy + dz * dz;\n if (distanceSquare > sq) {\n distanceSquare = sq;\n foundId = e.id;\n }\n }\n }\n }\n return foundId;\n },\n overlapWithSibling(me, threshold) {\n let overlap = false;\n if (threshold === undefined) {\n // when threshold is not set, check overlap of bounding boxes\n const parent = get().getParent(me);\n if (parent) {\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\n if (me.type === ObjectType.SolarPanel) {\n if (Util.doSolarPanelsOverlap(me as SolarPanelModel, e as SolarPanelModel, parent)) {\n overlap = true;\n break;\n }\n } else {\n if (\n Math.abs(me.cx - e.cx) * parent.lx < 0.5 * (me.lx + e.lx) &&\n Math.abs(me.cy - e.cy) * parent.ly < 0.5 * (me.ly + e.ly) &&\n Math.abs(me.cz - e.cz) * parent.lz < 0.5 * (me.lz + e.lz)\n ) {\n overlap = true;\n break;\n }\n }\n }\n }\n }\n } else {\n // when threshold is set, use the distance between centers to detect overlap using it\n const thresholdSquared = threshold * threshold;\n const parent = get().getParent(me);\n for (const e of get().elements) {\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\n const dx = (me.cx - e.cx) * (parent ? parent.lx : 1);\n const dy = (me.cy - e.cy) * (parent ? parent.ly : 1);\n const dz = (me.cz - e.cz) * (parent ? parent.lz : 1);\n const sq = dx * dx + dy * dy + dz * dz;\n if (sq < thresholdSquared) {\n overlap = true;\n break;\n }\n }\n }\n }\n return overlap;\n },\n\n selectedSideIndex: -1,\n\n getResizeHandlePosition(el, handleType) {\n const { cx, cy, lx, ly, lz, type, parentId } = el;\n const p = new Vector3(cx, cy, 0);\n switch (type) {\n case ObjectType.Cuboid: {\n const v = new Vector2();\n switch (handleType) {\n case ResizeHandleType.LowerLeftTop:\n v.set(-lx / 2, -ly / 2);\n break;\n case ResizeHandleType.LowerRightTop:\n v.set(lx / 2, -ly / 2);\n break;\n case ResizeHandleType.UpperLeftTop:\n v.set(-lx / 2, ly / 2);\n break;\n case ResizeHandleType.UpperRightTop:\n v.set(lx / 2, ly / 2);\n break;\n }\n const { pos, rot } = Util.getWorldDataById(el.id);\n v.rotateAround(ORIGIN_VECTOR2, rot);\n p.set(pos.x + v.x, pos.y + v.y, pos.z - lz / 2);\n break;\n }\n case ObjectType.Wall: {\n const wall = el as WallModel;\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n const handlePosition = new Vector3();\n switch (handleType) {\n case ResizeHandleType.UpperLeft: {\n handlePosition.fromArray(wall.leftPoint).setZ(0);\n break;\n }\n case ResizeHandleType.UpperRight: {\n handlePosition.fromArray(wall.rightPoint).setZ(0);\n break;\n }\n }\n p.copy(handlePosition.applyEuler(parentRotation).add(parentPosition));\n }\n break;\n }\n case ObjectType.Roof: {\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n const handlePosition = new Vector3(get().selectedElementX, get().selectedElementY)\n .applyEuler(parentRotation)\n .add(parentPosition);\n p.set(handlePosition.x, handlePosition.y, parent.lz);\n }\n break;\n }\n case ObjectType.Tree: {\n const parent = get().elements.find((e) => e.id === parentId);\n if (parent) {\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.cz + parent.lz / 2);\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\n p.copy(new Vector3(el.cx, el.cy, parent.lz).applyEuler(parentRotation).add(parentPosition));\n }\n break;\n }\n }\n return p;\n },\n getElementById(id) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === id) {\n return e;\n }\n }\n return null;\n },\n getParent(child) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === child.parentId) {\n return e;\n }\n }\n return null;\n },\n getFoundation(elem) {\n const elements = get().elements;\n for (const e of elements) {\n if (e.id === elem.foundationId && e.type === ObjectType.Foundation) {\n return e as FoundationModel;\n }\n }\n return null;\n },\n selectNone() {\n immerSet((state: CommonStoreState) => {\n state.selectedElementIdSet.clear();\n for (const e of state.elements) {\n e.selected = false;\n }\n state.selectedElement = null;\n });\n useRefStore.getState().selectNone();\n },\n selectMe(id, e, action, select) {\n const setEnableOrbitController = useRefStore.getState().setEnableOrbitController;\n if (e.intersections.length > 0) {\n const intersectableObjects = e.intersections.filter(\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\n );\n if (intersectableObjects[0].object === e.eventObject || select) {\n immerSet((state) => {\n if (state.multiSelectionsMode) {\n if (state.selectedElementIdSet.has(id)) {\n state.selectedElementIdSet.delete(id);\n } else {\n state.selectedElementIdSet.add(id);\n }\n } else {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(id);\n }\n\n for (const elem of state.elements) {\n if (elem.id === id) {\n elem.selected = true;\n state.selectedElement = elem;\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\n state.selectedElementHeight = elem.lz;\n } else {\n elem.selected = false;\n }\n }\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.rotateHandleType = null;\n if (action) {\n switch (action) {\n case ActionType.Move:\n if (\n state.selectedElement?.type === ObjectType.Tree ||\n state.selectedElement?.type === ObjectType.Human\n ) {\n // selecting the above two types of object automatically sets them to the moving state\n state.moveHandleType = MoveHandleType.Default;\n } else {\n state.moveHandleType = e.eventObject.name as MoveHandleType;\n }\n setEnableOrbitController(false);\n break;\n case ActionType.Resize:\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\n setEnableOrbitController(false);\n break;\n case ActionType.Rotate:\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\n setEnableOrbitController(false);\n break;\n case ActionType.Select:\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\n setEnableOrbitController(true);\n break;\n default:\n setEnableOrbitController(true);\n }\n }\n });\n }\n }\n },\n\n // for all types of elements\n updateAllElementLocks(locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n e.locked = locked;\n }\n });\n },\n updateElementLockByFoundationId(foundationId, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId || e.parentId === foundationId || e.id === foundationId) {\n e.locked = locked;\n }\n }\n });\n },\n updateElementLockByParentId(parentId, type: ObjectType, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.parentId === parentId && type === e.type) {\n e.locked = locked;\n }\n }\n });\n },\n updateElementLockById(id, locked) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.locked = locked;\n break;\n }\n }\n });\n },\n updateElementReferenceById(id, referenceId) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.referenceId = referenceId;\n break;\n }\n }\n });\n },\n\n updateElementLabelById(id, label) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.label = label;\n break;\n }\n }\n });\n },\n updateElementShowLabelById(id, showLabel) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.showLabel = showLabel;\n break;\n }\n }\n });\n },\n\n // color\n updateElementColorById(id, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.color = color;\n break;\n }\n }\n });\n },\n updateElementColorOnSurface(type, parentId, normal, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementColorAboveFoundation(type, foundationId, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementColorForAll(type, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.color = color;\n }\n }\n });\n },\n updateElementLineColorById(id, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lineColor = color;\n break;\n }\n }\n });\n },\n updateElementLineColorOnSurface(type, parentId, normal, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n updateElementLineColorAboveFoundation(type, foundationId, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n updateElementLineColorForAll(type, color) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lineColor = color;\n }\n }\n });\n },\n\n updateElementLineWidthById(id, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id) {\n e.lineWidth = width;\n break;\n }\n }\n });\n },\n updateElementLineWidthOnSurface(type, parentId, normal, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n updateElementLineWidthAboveFoundation(type, foundationId, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n updateElementLineWidthForAll(type, width) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lineWidth = width;\n }\n }\n });\n },\n\n updateElementCxById(id, cx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cx = cx;\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\n state.updateElementOnRoofFlag = true;\n }\n break;\n }\n }\n });\n },\n updateElementCyById(id, cy) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cy = cy;\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\n state.updateElementOnRoofFlag = true;\n }\n break;\n }\n }\n });\n },\n updateElementCzById(id, cz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.cz = cz;\n break;\n }\n }\n });\n },\n updateElementCzForAll(type, cz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.cz = cz;\n }\n }\n });\n },\n\n // lx\n updateElementLxById(id, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lx = lx;\n break;\n }\n }\n });\n },\n updateElementLxAboveFoundation(type, foundationId, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lx = lx;\n }\n }\n });\n },\n updateElementLxOnSurface(type, parentId, normal, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.lx = lx;\n }\n }\n }\n });\n },\n updateElementLxForAll(type, lx) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lx = lx;\n }\n }\n });\n },\n\n // ly\n updateElementLyById(id, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.ly = ly;\n break;\n }\n }\n });\n },\n updateElementLyAboveFoundation(type, foundationId, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.ly = ly;\n }\n }\n });\n },\n updateElementLyOnSurface(type, parentId, normal, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.ly = ly;\n }\n }\n }\n });\n },\n updateElementLyForAll(type, ly) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.ly = ly;\n }\n }\n });\n },\n\n // lz\n updateElementLzById(id, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.lz = lz;\n break;\n }\n }\n });\n },\n updateElementLzAboveFoundation(type, foundationId, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\n e.lz = lz;\n }\n }\n });\n },\n updateElementLzOnSurface(type, parentId, normal, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n e.lz = lz;\n }\n }\n }\n });\n },\n updateElementLzForAll(type, lz) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n e.lz = lz;\n }\n }\n });\n },\n\n updateElementRotationById(id, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n } else if (e.parentId === id && !isStackableModel(e)) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n }\n state.selectedElementAngle = z;\n });\n },\n updateElementRotationForAll(type, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n if (!e.locked) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n } else {\n // FIXME: I don't understand the logic below\n const parent = state.getParent(e);\n if (parent && !parent.locked && parent.type === type) {\n e.rotation[0] = x;\n e.rotation[1] = y;\n e.rotation[2] = z;\n }\n }\n }\n });\n },\n\n // for solar collectors\n updateSolarCollectorDrawSunBeamById(id, draw) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (Util.isSolarCollector(e)) {\n (e as SolarCollector).drawSunBeam = draw;\n break;\n }\n }\n }\n });\n },\n updateSolarCollectorDrawSunBeamAboveFoundation(type, foundationId, draw) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === type) {\n (e as SolarCollector).drawSunBeam = draw;\n }\n }\n }\n });\n },\n updateSolarCollectorDrawSunBeamForAll(type, draw) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === type) {\n (e as SolarCollector).drawSunBeam = draw;\n }\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthById(id, relativeAzimuth) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n state.selectedElementAngle = relativeAzimuth;\n break;\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthAboveFoundation(type, foundationId, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (\n e.type === type &&\n e.foundationId === foundationId &&\n !e.locked &&\n (e as SolarPanelModel).parentType !== ObjectType.Wall\n ) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthOnSurface(type, parentId, normal, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n }\n });\n },\n updateSolarCollectorRelativeAzimuthForAll(type, relativeAzimuth) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\n }\n }\n });\n },\n\n updateSolarCollectorPoleHeightById(id, poleHeight) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).poleHeight = poleHeight;\n break;\n }\n }\n });\n },\n updateSolarCollectorPoleHeightAboveFoundation(type, foundationId, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n });\n },\n updateSolarCollectorPoleHeightOnSurface(type, parentId, normal, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked && e.type === type) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n }\n });\n },\n updateSolarCollectorPoleHeightForAll(type, poleHeight) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n (e as SolarCollector).poleHeight = poleHeight;\n }\n }\n });\n },\n\n updateSolarCollectorPoleRadiusById(id, poleRadius) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\n (e as SolarCollector).poleRadius = poleRadius;\n break;\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusAboveFoundation(type, foundationId, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusOnSurface(type, parentId, normal, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked && e.type === type) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n }\n });\n },\n updateSolarCollectorPoleRadiusForAll(type, poleRadius) {\n if (!Util.isSolarCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && !e.locked) {\n (e as SolarCollector).poleRadius = poleRadius;\n }\n }\n });\n },\n\n // this should be called if any of the solar collectors changes\n clearAllSolarCollectorYields() {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (Util.isSolarCollector(e)) {\n const sc = e as SolarCollector;\n sc.dailyYield = 0;\n sc.yearlyYield = 0;\n }\n }\n });\n },\n updateSolarCollectorDailyYieldById(id, dailyYield) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isSolarCollector(e)) {\n (e as SolarCollector).dailyYield = dailyYield;\n break;\n }\n }\n });\n },\n updateSolarCollectorYearlyYieldById(id, yearlyYield) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isSolarCollector(e)) {\n (e as SolarCollector).yearlyYield = yearlyYield;\n break;\n }\n }\n });\n },\n\n // for concentrated solar power collectors\n updateCspReflectanceById(id, reflectance) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isCspCollector(e)) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n break;\n }\n }\n });\n },\n updateCspReflectanceAboveFoundation(type, foundationId, reflectance) {\n if (!Util.isCspCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n }\n }\n });\n },\n updateCspReflectanceForAll(type, reflectance) {\n if (!Util.isCspCollectorType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\n }\n }\n });\n },\n\n updateParabolicCollectorAbsorptanceById(id, absorptance) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).absorptance = absorptance;\n break;\n }\n }\n });\n },\n updateParabolicCollectorAbsorptanceAboveFoundation(type, foundationId, absorptance) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).absorptance = absorptance;\n }\n }\n });\n },\n updateParabolicCollectorAbsorptanceForAll(type, absorptance) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).absorptance = absorptance;\n }\n }\n });\n },\n\n updateParabolicCollectorOpticalEfficiencyById(id, opticalEfficiency) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n break;\n }\n }\n });\n },\n updateParabolicCollectorOpticalEfficiencyAboveFoundation(type, foundationId, opticalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n }\n }\n });\n },\n updateParabolicCollectorOpticalEfficiencyForAll(type, opticalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\n }\n }\n });\n },\n\n updateParabolicCollectorThermalEfficiencyById(id, thermalEfficiency) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && Util.isParabolicCollector(e)) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n break;\n }\n }\n });\n },\n updateParabolicCollectorThermalEfficiencyAboveFoundation(type, foundationId, thermalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type && e.foundationId === foundationId) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n }\n }\n });\n },\n updateParabolicCollectorThermalEfficiencyForAll(type, thermalEfficiency) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === type) {\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\n }\n }\n });\n },\n\n // for foundations\n foundationActionScope: Scope.OnlyThisObject,\n setFoundationActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.foundationActionScope = scope;\n });\n },\n\n // for cuboids\n cuboidActionScope: Scope.OnlyThisSide,\n setCuboidActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.cuboidActionScope = scope;\n });\n },\n\n // for polygons\n polygonActionScope: Scope.OnlyThisObject,\n setPolygonActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.polygonActionScope = scope;\n });\n },\n updatePolygonVertexPositionById(id, index, x, y) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Polygon && e.id === id) {\n const p = e as PolygonModel;\n if (index >= 0 && index < p.vertices.length) {\n p.vertices[index].x = x;\n p.vertices[index].y = y;\n }\n break;\n }\n }\n });\n },\n // must feed a deep copy of the vertices\n updatePolygonVerticesById(id, vertices) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Polygon && e.id === id) {\n const p = e as PolygonModel;\n p.vertices = vertices;\n break;\n }\n }\n });\n },\n\n // for solar panels\n solarPanelActionScope: Scope.OnlyThisObject,\n setSolarPanelActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.solarPanelActionScope = scope;\n });\n },\n updateSolarPanelTiltAngleById(id, tiltAngle) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\n const sp = e as SolarPanelModel;\n sp.tiltAngle = tiltAngle;\n break;\n }\n }\n });\n },\n setSolarPanelOrientation(sp, pvModel, orientation) {\n sp.orientation = orientation;\n if (sp.orientation === Orientation.portrait) {\n // calculate the current x-y layout\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\n sp.lx = nx * pvModel.width;\n sp.ly = ny * pvModel.length;\n } else {\n // calculate the current x-y layout\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\n sp.lx = nx * pvModel.length;\n sp.ly = ny * pvModel.width;\n }\n },\n\n // for parabolic troughs\n parabolicTroughActionScope: Scope.OnlyThisObject,\n setParabolicTroughActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.parabolicTroughActionScope = scope;\n });\n },\n\n // for Fresnel reflector\n fresnelReflectorActionScope: Scope.OnlyThisObject,\n setFresnelReflectorActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.fresnelReflectorActionScope = scope;\n });\n },\n\n // for heliostat\n heliostatActionScope: Scope.OnlyThisObject,\n setHeliostatActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.heliostatActionScope = scope;\n });\n },\n updateSolarReceiverById(id, receiverId) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n break;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n break;\n }\n }\n }\n });\n },\n updateSolarReceiverAboveFoundation(type: ObjectType, foundationId, receiverId) {\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n }\n }\n }\n });\n },\n updateSolarReceiverForAll(type, receiverId) {\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.Heliostat) {\n (e as HeliostatModel).towerId = receiverId;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).receiverId = receiverId;\n }\n }\n }\n });\n },\n\n // for parabolic dishes\n parabolicDishActionScope: Scope.OnlyThisObject,\n setParabolicDishActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.parabolicDishActionScope = scope;\n });\n },\n\n // for parabolic troughs and Fresnel reflectors\n updateModuleLengthById(id, moduleLength) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n break;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n break;\n }\n }\n }\n });\n },\n updateModuleLengthAboveFoundation(type, foundationId, moduleLength) {\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n }\n }\n }\n });\n },\n updateModuleLengthForAll(type, moduleLength) {\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).moduleLength = moduleLength;\n } else if (e.type === ObjectType.FresnelReflector) {\n (e as FresnelReflectorModel).moduleLength = moduleLength;\n }\n }\n }\n });\n },\n\n // for parabolic troughs and dishes\n updateParabolaLatusRectumById(id, latusRectum) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n break;\n }\n }\n });\n },\n updateParabolaLatusRectumAboveFoundation(type, foundationId, latusRectum) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.foundationId === foundationId && !e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n }\n }\n });\n },\n updateParabolaLatusRectumForAll(type, latusRectum) {\n if (!Util.isParabolaType(type)) return;\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (!e.locked) {\n if (e.type === ObjectType.ParabolicTrough) {\n (e as ParabolicTroughModel).latusRectum = latusRectum;\n } else if (e.type === ObjectType.ParabolicDish) {\n (e as ParabolicDishModel).latusRectum = latusRectum;\n }\n }\n }\n });\n },\n\n // for walls\n wallActionScope: Scope.OnlyThisObject,\n setWallActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.wallActionScope = scope;\n });\n },\n // for roofs\n roofActionScope: Scope.OnlyThisObject,\n setRoofActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.roofActionScope = scope;\n });\n },\n // for windows\n windowActionScope: Scope.OnlyThisObject,\n setWindowActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.windowActionScope = scope;\n });\n },\n\n // for doors\n doorActionScope: Scope.OnlyThisObject,\n setDoorActionScope(scope) {\n immerSet((state: CommonStoreState) => {\n state.doorActionScope = scope;\n });\n },\n\n updateWallRelativeAngleById(id, angle) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).relativeAngle = angle;\n break;\n }\n }\n });\n },\n updateWallLeftJointsById(id, joints) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id) {\n (e as WallModel).leftJoints = joints;\n break;\n }\n }\n });\n },\n updateWallRightJointsById(id, joints) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id) {\n (e as WallModel).rightJoints = joints;\n break;\n }\n }\n });\n },\n updateWallLeftPointById(id, point) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).leftPoint = [...point];\n break;\n }\n }\n });\n },\n updateWallRightPointById(id, point) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\n (e as WallModel).rightPoint = [...point];\n break;\n }\n }\n });\n },\n\n updateRoofRiseById(id, rise, topZ) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Roof) {\n (e as RoofModel).rise = rise;\n state.actionState.roofRise = rise;\n if (topZ !== undefined) {\n state.selectedElementHeight = topZ;\n }\n break;\n }\n }\n });\n },\n updateRoofStructureById(id, structure) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Roof) {\n const roofModel = e as RoofModel;\n roofModel.roofStructure = structure;\n break;\n }\n }\n });\n },\n\n updateInsideLightById(id, inside) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Light && e.id === id) {\n (e as LightModel).inside = inside;\n break;\n }\n }\n });\n },\n updateInsideLightsByParentId(parentId, inside) {\n immerSet((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.parentId === parentId && e.type === ObjectType.Light) {\n (e as LightModel).inside = inside;\n }\n }\n });\n },\n\n setElementPosition(id, x, y, z?) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id) {\n state.elements[i].cx = x;\n state.elements[i].cy = y;\n if (z !== undefined) {\n state.elements[i].cz = z;\n }\n break;\n }\n }\n });\n },\n setElementNormal(id, x, y, z) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id || e.parentId === id) {\n const elem = state.elements[i];\n elem.normal[0] = x;\n elem.normal[1] = y;\n elem.normal[2] = z;\n }\n }\n });\n },\n setElementSize(id, lx, ly, lz?) {\n immerSet((state: CommonStoreState) => {\n for (const [i, e] of state.elements.entries()) {\n if (e.id === id) {\n state.elements[i].lx = lx;\n state.elements[i].ly = ly;\n if (lz) {\n state.elements[i].lz = lz;\n state.selectedElementHeight = lz;\n }\n break;\n }\n }\n });\n },\n\n actionModeLock: false,\n objectTypeToAdd: ObjectType.None,\n addElement(parent, p, normal) {\n let model: ElementModel | null = null;\n const parentId = 'id' in parent ? parent.id : GROUND_ID;\n immerSet((state: CommonStoreState) => {\n switch (state.objectTypeToAdd) {\n case ObjectType.Human: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const human = ElementModelFactory.makeHuman(\n state.actionState.humanName,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = human;\n state.elements.push(human);\n break;\n }\n case ObjectType.Tree: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const tree = ElementModelFactory.makeTree(\n state.actionState.treeType,\n state.actionState.treeSpread,\n state.actionState.treeHeight,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = tree;\n state.elements.push(tree);\n break;\n }\n case ObjectType.Flower: {\n const position = new Vector3().copy(p);\n if (parentId !== GROUND_ID) {\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\n position\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\n }\n const flower = ElementModelFactory.makeFlower(\n state.actionState.flowerType,\n parentId,\n position.x,\n position.y,\n position.z,\n );\n model = flower;\n state.elements.push(flower);\n break;\n }\n case ObjectType.Polygon:\n const polygonParentModel = parent as ElementModel;\n const polygonRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, polygonParentModel);\n const polygon = ElementModelFactory.makePolygon(\n polygonParentModel,\n polygonRelativeCoordinates.x,\n polygonRelativeCoordinates.y,\n polygonRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n polygonParentModel.type,\n );\n model = polygon;\n state.elements.push(polygon);\n break;\n case ObjectType.Sensor:\n const sensorParentModel = parent as ElementModel;\n const sensorRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, sensorParentModel);\n const sensor = ElementModelFactory.makeSensor(\n sensorParentModel,\n sensorRelativeCoordinates.x,\n sensorRelativeCoordinates.y,\n sensorRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n );\n model = sensor;\n state.elements.push(sensor);\n break;\n case ObjectType.Light:\n const lightParentModel = parent as ElementModel;\n const lightRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, lightParentModel);\n const light = ElementModelFactory.makeLight(\n lightParentModel,\n 2,\n state.actionState.lightDistance,\n state.actionState.lightIntensity,\n state.actionState.lightColor,\n lightRelativeCoordinates.x,\n lightRelativeCoordinates.y,\n lightRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n );\n model = light;\n state.elements.push(light);\n break;\n case ObjectType.SolarPanel:\n const solarPanelParentModel = parent as ElementModel;\n const solarPanelRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, solarPanelParentModel);\n const solarPanel = ElementModelFactory.makeSolarPanel(\n solarPanelParentModel,\n state.getPvModule(state.actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\n solarPanelRelativeCoordinates.x,\n solarPanelRelativeCoordinates.y,\n solarPanelRelativeCoordinates.z,\n state.actionState.solarPanelOrientation ?? Orientation.landscape,\n state.actionState.solarPanelPoleHeight ?? 1,\n state.actionState.solarPanelPoleSpacing ?? 3,\n state.actionState.solarPanelTiltAngle ?? 0,\n state.actionState.solarPanelRelativeAzimuth ?? 0,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.solarPanelFrameColor ?? 'white',\n );\n model = solarPanel;\n state.elements.push(solarPanel);\n break;\n case ObjectType.ParabolicTrough:\n const parabolicTroughParentModel = parent as ElementModel;\n const parabolicTroughRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n parabolicTroughParentModel,\n );\n const parabolicTrough = ElementModelFactory.makeParabolicTrough(\n parabolicTroughParentModel,\n state.actionState.parabolicTroughReflectance,\n state.actionState.parabolicTroughAbsorptance,\n state.actionState.parabolicTroughOpticalEfficiency,\n state.actionState.parabolicTroughThermalEfficiency,\n state.actionState.parabolicTroughLatusRectum,\n state.actionState.parabolicTroughPoleHeight,\n state.actionState.parabolicTroughModuleLength,\n parabolicTroughRelativeCoordinates.x,\n parabolicTroughRelativeCoordinates.y,\n parabolicTroughRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.parabolicTroughWidth,\n );\n model = parabolicTrough;\n state.elements.push(parabolicTrough);\n break;\n case ObjectType.ParabolicDish:\n const parabolicDishParentModel = parent as ElementModel;\n const parabolicDishRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n parabolicDishParentModel,\n );\n const parabolicDish = ElementModelFactory.makeParabolicDish(\n parabolicDishParentModel,\n state.actionState.parabolicDishReflectance,\n state.actionState.parabolicDishAbsorptance,\n state.actionState.parabolicDishOpticalEfficiency,\n state.actionState.parabolicDishThermalEfficiency,\n state.actionState.parabolicDishLatusRectum,\n state.actionState.parabolicDishPoleHeight,\n state.actionState.parabolicDishReceiverStructure,\n parabolicDishRelativeCoordinates.x,\n parabolicDishRelativeCoordinates.y,\n parabolicDishRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.parabolicDishRimDiameter,\n state.actionState.parabolicDishRimDiameter,\n );\n model = parabolicDish;\n state.elements.push(parabolicDish);\n break;\n case ObjectType.FresnelReflector:\n const fresnelReflectorParentModel = parent as ElementModel;\n const fresnelReflectorRelativeCoordinates = Util.relativeCoordinates(\n p.x,\n p.y,\n p.z,\n fresnelReflectorParentModel,\n );\n const fresnelReflector = ElementModelFactory.makeFresnelReflector(\n fresnelReflectorParentModel,\n state.actionState.fresnelReflectorReceiver,\n state.actionState.fresnelReflectorReflectance,\n state.actionState.fresnelReflectorPoleHeight,\n state.actionState.fresnelReflectorModuleLength,\n fresnelReflectorRelativeCoordinates.x,\n fresnelReflectorRelativeCoordinates.y,\n fresnelReflectorRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.fresnelReflectorWidth,\n );\n model = fresnelReflector;\n state.elements.push(fresnelReflector);\n break;\n case ObjectType.Heliostat:\n const heliostatParentModel = parent as ElementModel;\n const heliostatRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, heliostatParentModel);\n const heliostat = ElementModelFactory.makeHeliostat(\n heliostatParentModel,\n state.actionState.heliostatTower,\n state.actionState.heliostatReflectance,\n state.actionState.heliostatPoleHeight,\n heliostatRelativeCoordinates.x,\n heliostatRelativeCoordinates.y,\n heliostatRelativeCoordinates.z,\n normal,\n 'rotation' in parent ? parent.rotation : undefined,\n state.actionState.heliostatLength,\n state.actionState.heliostatWidth,\n );\n model = heliostat;\n state.elements.push(heliostat);\n break;\n case ObjectType.Foundation:\n const foundation = ElementModelFactory.makeFoundation(\n p.x,\n p.y,\n state.actionState.foundationHeight,\n state.actionState.foundationColor,\n state.actionState.foundationTexture,\n );\n model = foundation;\n state.elements.push(foundation);\n break;\n case ObjectType.Cuboid:\n const cuboid = ElementModelFactory.makeCuboid(\n p.x,\n p.y,\n state.actionState.cuboidHeight,\n state.actionState.cuboidFaceColors,\n state.actionState.cuboidFaceTextures,\n );\n model = cuboid;\n state.elements.push(cuboid);\n break;\n case ObjectType.Wall:\n const wallParentModel = parent as ElementModel;\n const relativePos = Util.wallRelativePosition(new Vector3(p.x, p.y), wallParentModel);\n const wall = ElementModelFactory.makeWall(\n wallParentModel,\n relativePos.x,\n relativePos.y,\n relativePos.z,\n normal,\n );\n state.elements.push(wall);\n state.selectedElement = wall;\n model = wall;\n break;\n }\n if (model) {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(model.id);\n }\n });\n return model;\n },\n\n elementsToPaste: [],\n deletedElements: [],\n clearDeletedElements() {\n immerSet((state: CommonStoreState) => {\n state.deletedElements = [];\n });\n },\n pastePoint: new Vector3(),\n pasteNormal: undefined,\n copyElementById(id) {\n immerSet((state: CommonStoreState) => {\n state.elementsToPaste = [];\n // make sure that the first element to paste is the current one when it may be a parent\n for (const e of state.elements) {\n if (e.id === id) {\n if (e.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\n e.cx = centroid.x;\n e.cy = centroid.y;\n state.elementsToPaste.push(e);\n } else if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Wall) {\n const parentWall = state.elements.find(\n (el) => el.id === e.parentId && el.type === ObjectType.Wall,\n ) as WallModel | undefined;\n if (parentWall) {\n const copiedWindow = { ...e };\n copiedWindow.lx = e.lx * parentWall.lx;\n copiedWindow.lz = e.lz * parentWall.lz;\n state.elementsToPaste.push(copiedWindow);\n }\n } else {\n state.elementsToPaste.push(e);\n }\n break;\n }\n }\n for (const e of state.elements) {\n if (Util.isChild(id, e.id)) {\n if (e.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\n e.cx = centroid.x;\n e.cy = centroid.y;\n }\n state.elementsToPaste.push(e);\n }\n }\n });\n },\n removeElementById(id, cut, selectNone = true, autoDeleted) {\n const removed = get().elements.filter((e) => e.id === id || Util.isChild(id, e.id));\n immerSet((state: CommonStoreState) => {\n for (const elem of state.elements) {\n if (elem.id === id) {\n // the first element must be the parent if there are children needed to be removed as well\n if (cut) {\n if (elem.type === ObjectType.Polygon) {\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\n const centroid = Util.calculatePolygonCentroid((elem as PolygonModel).vertices);\n elem.cx = centroid.x;\n elem.cy = centroid.y;\n state.elementsToPaste = [elem];\n } else if (\n elem.type === ObjectType.Window &&\n (elem as WindowModel).parentType === ObjectType.Wall\n ) {\n const parentWall = state.elements.find(\n (el) => el.id === elem.parentId && el.type === ObjectType.Wall,\n ) as WallModel | undefined;\n if (parentWall) {\n const copiedWindow = { ...elem };\n copiedWindow.lx = elem.lx * parentWall.lx;\n copiedWindow.lz = elem.lz * parentWall.lz;\n state.elementsToPaste = [copiedWindow];\n }\n } else {\n state.elementsToPaste = [elem];\n }\n } else if (!autoDeleted) {\n state.deletedElements = [elem];\n }\n elem.selected = false;\n switch (elem.type) {\n case ObjectType.Roof: {\n state.deletedRoofId = elem.id;\n useDataStore.getState().deleteRoofSegmentVertices(id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\n if (autoDeleted) {\n state.autoDeletedRoof = elem as RoofModel;\n }\n break;\n }\n case ObjectType.Wall: {\n const currentWall = elem as WallModel;\n let leftWallId = '';\n let rightWallId = '';\n if (currentWall.leftJoints.length > 0) {\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\n }\n if (currentWall.rightJoints.length > 0) {\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\n }\n for (const e of state.elements) {\n if (e.id === leftWallId) {\n (e as WallModel).rightJoints = [];\n } else if (e.id === rightWallId) {\n (e as WallModel).leftJoints = [];\n }\n }\n state.elements = state.elements.filter(\n (e) => !(e.type === ObjectType.Roof && (e as RoofModel).wallsId.length === 0),\n );\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedWallId = elem.id;\n break;\n }\n case ObjectType.Foundation: {\n state.deletedFoundationId = elem.id;\n break;\n }\n case ObjectType.Cuboid: {\n state.deletedCuboidId = elem.id;\n break;\n }\n }\n break;\n }\n }\n if (autoDeleted) {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n if (state.autoDeletedChild) {\n state.autoDeletedChild.push(child);\n } else {\n state.autoDeletedChild = [child];\n }\n }\n }\n } else {\n if (cut) {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n state.elementsToPaste.push(child);\n }\n }\n } else {\n for (const child of state.elements) {\n if (Util.isChild(id, child.id)) {\n state.deletedElements.push(child);\n }\n }\n }\n }\n state.elements = state.elements.filter((e) => {\n if (e.id === id || e.parentId === id || e.foundationId === id || Util.isChild(id, e.id)) {\n if (e.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\n }\n return false;\n } else {\n return true;\n }\n });\n state.selectedElementIdSet.delete(id);\n if (selectNone) {\n state.selectedElement = null;\n state.selectedElementIdSet.clear();\n }\n });\n return removed;\n },\n removeElementsByType(type) {\n immerSet((state: CommonStoreState) => {\n if (type === ObjectType.Foundation) {\n state.elements = state.elements.filter((x) => {\n if (x.locked || (x.type !== ObjectType.Foundation && !x.foundationId)) {\n return true;\n } else {\n if (x.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\n }\n return false;\n }\n });\n } else {\n state.elements = state.elements.filter((x) => {\n if (x.locked || x.type !== type) {\n return true;\n } else {\n if (x.type === ObjectType.Roof) {\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\n }\n return false;\n }\n });\n }\n });\n },\n countElementsByType(type, excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (e.type === type && !e.locked) {\n count++;\n }\n }\n } else {\n for (const e of get().elements) {\n if (e.type === type) {\n count++;\n }\n }\n }\n return count;\n },\n countSolarStructuresByType(type, excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (e.type === ObjectType.Foundation && !e.locked) {\n if ((e as FoundationModel).solarStructure === type) {\n count++;\n }\n }\n }\n } else {\n for (const e of get().elements) {\n if (e.type === ObjectType.Foundation) {\n if ((e as FoundationModel).solarStructure === type) {\n count++;\n }\n }\n }\n }\n return count;\n },\n countObservers() {\n let count = 0;\n for (const e of get().elements) {\n if (e.type === ObjectType.Human && (e as HumanModel).observer) {\n count++;\n }\n }\n return count;\n },\n removeElementsByReferenceId(id, cache) {\n immerSet((state: CommonStoreState) => {\n if (cache) {\n state.deletedElements = [];\n for (const e of state.elements) {\n if (e.referenceId === id) {\n state.deletedElements.push(e);\n }\n }\n }\n state.elements = state.elements.filter((e) => {\n return e.referenceId !== id;\n });\n });\n },\n countElementsByReferenceId(id) {\n let count = 0;\n for (const e of get().elements) {\n if (e.referenceId === id) {\n count++;\n }\n }\n return count;\n },\n\n getChildren(id) {\n const children: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === id) {\n children.push(e);\n }\n }\n return children;\n },\n getChildrenOfType(type: ObjectType, id) {\n const children: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.type === type && e.parentId === id) {\n children.push(e);\n }\n }\n return children;\n },\n removeAllChildElementsByType(parentId, type) {\n immerSet((state: CommonStoreState) => {\n state.elements = state.elements.filter((x) => x.locked || x.type !== type || x.parentId !== parentId);\n if (type === ObjectType.Wall) {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n }\n });\n },\n removeAllElementsOnFoundationByType(foundationId, type) {\n immerSet((state: CommonStoreState) => {\n state.elements = state.elements.filter(\n (x) => x.locked || x.type !== type || x.foundationId !== foundationId,\n );\n if (type === ObjectType.Wall) {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n }\n });\n },\n countAllElements(excludeLocked) {\n let count = 0;\n if (excludeLocked) {\n for (const e of get().elements) {\n if (!e.locked) {\n count++;\n }\n }\n } else {\n count = get().elements.length;\n }\n return count;\n },\n countAllElementsByType(excludeLocked) {\n const counter = new ElementCounter();\n for (const e of get().elements) {\n if (excludeLocked && e.locked) continue;\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n counter.solarUpdraftTowerCount++;\n }\n counter.foundationCount++;\n break;\n case ObjectType.Cuboid:\n counter.cuboidCount++;\n break;\n case ObjectType.Wall:\n counter.wallCount++;\n break;\n case ObjectType.Window:\n counter.windowCount++;\n break;\n case ObjectType.Door:\n counter.doorCount++;\n break;\n case ObjectType.Human:\n counter.humanCount++;\n break;\n case ObjectType.Tree:\n counter.treeCount++;\n break;\n case ObjectType.Flower:\n counter.flowerCount++;\n break;\n case ObjectType.Polygon:\n counter.polygonCount++;\n break;\n case ObjectType.Sensor:\n counter.sensorCount++;\n break;\n case ObjectType.Light:\n if ((e as LightModel).inside) {\n counter.insideLightCount++;\n } else {\n counter.outsideLightCount++;\n }\n break;\n case ObjectType.SolarPanel:\n counter.solarPanelCount++;\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\n }\n break;\n case ObjectType.ParabolicDish:\n counter.parabolicDishCount++;\n break;\n case ObjectType.ParabolicTrough:\n counter.parabolicTroughCount++;\n break;\n case ObjectType.FresnelReflector:\n counter.fresnelReflectorCount++;\n break;\n case ObjectType.Heliostat:\n counter.heliostatCount++;\n break;\n case ObjectType.WindTurbine:\n counter.windTurbineCount++;\n break;\n }\n }\n return counter;\n },\n countAllOffspringsByTypeAtOnce(ancestorId, includingLocked) {\n const counter = new ElementCounter();\n for (const e of get().elements) {\n // foundationId applies to both foundations and cuboids, should have been named ancestorId\n const idOk = e.parentId === ancestorId || e.foundationId === ancestorId;\n if (includingLocked ? idOk : !e.locked && idOk) {\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n counter.solarUpdraftTowerCount++;\n }\n counter.foundationCount++;\n break;\n case ObjectType.Cuboid:\n counter.cuboidCount++;\n break;\n case ObjectType.Wall:\n counter.wallCount++;\n break;\n case ObjectType.Window:\n counter.windowCount++;\n break;\n case ObjectType.Door:\n counter.doorCount++;\n break;\n case ObjectType.Human:\n counter.humanCount++;\n break;\n case ObjectType.Tree:\n counter.treeCount++;\n break;\n case ObjectType.Flower:\n counter.flowerCount++;\n break;\n case ObjectType.Polygon:\n counter.polygonCount++;\n break;\n case ObjectType.Sensor:\n counter.sensorCount++;\n break;\n case ObjectType.Light:\n if ((e as LightModel).inside) {\n counter.insideLightCount++;\n } else {\n counter.outsideLightCount++;\n }\n break;\n case ObjectType.SolarPanel:\n counter.solarPanelCount++;\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\n }\n break;\n case ObjectType.ParabolicDish:\n counter.parabolicDishCount++;\n break;\n case ObjectType.ParabolicTrough:\n counter.parabolicTroughCount++;\n break;\n case ObjectType.FresnelReflector:\n counter.fresnelReflectorCount++;\n break;\n case ObjectType.Heliostat:\n counter.heliostatCount++;\n break;\n case ObjectType.WindTurbine:\n counter.windTurbineCount++;\n break;\n }\n }\n }\n return counter;\n },\n countSolarPanelsOnRack(id) {\n let count = 0;\n for (const e of get().elements) {\n if (e.id === id && e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n const pvModel = get().getPvModule(sp.pvModelName);\n if (pvModel) {\n count = Util.countSolarPanelsOnRack(sp, pvModel);\n break;\n }\n }\n }\n return count;\n },\n\n // must copy the elements because they may be pasted multiple times.\n // so we must treat them as newly added elements each time.\n // note that the case of deletion is treated differently because the deleted elements cannot be pasted.\n copyCutElements() {\n const copiedElements: ElementModel[] = [];\n const map = new Map(); // oldId => newElement\n const elementsMapOldToNew = new Map();\n const elementsMapNewToOld = new Map();\n for (let i = 0; i < get().elementsToPaste.length; i++) {\n const oldElem = get().elementsToPaste[i];\n let newElem: ElementModel | null = null;\n if (i === 0) {\n // the first element is the parent\n if (get().getElementById(oldElem.id)) {\n // make a clone with a new ID if the old ID is in the elements\n newElem = ElementModelCloner.clone(\n get().getParent(oldElem),\n oldElem,\n oldElem.cx,\n oldElem.cy,\n oldElem.cz,\n );\n } else {\n // preserve the ID if it is not in the elements\n newElem = JSON.parse(JSON.stringify(oldElem));\n }\n if (newElem?.type === ObjectType.Wall) {\n const w = newElem as WallModel;\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n }\n } else {\n const oldParent = get().elementsToPaste.find((el) => el.id === oldElem.parentId);\n if (oldParent) {\n const newParent = map.get(oldParent.id);\n if (newParent) {\n if (get().getElementById(oldElem.id)) {\n // make a clone with a new ID if the old ID is in the elements\n newElem = ElementModelCloner.clone(\n newParent,\n oldElem,\n oldElem.cx,\n oldElem.cy,\n oldElem.cz,\n oldElem.type === ObjectType.Polygon,\n );\n } else {\n // preserve the ID if it is not in the elements\n newElem = JSON.parse(JSON.stringify(oldElem));\n }\n }\n }\n }\n if (newElem) {\n map.set(oldElem.id, newElem);\n elementsMapOldToNew.set(oldElem.id, newElem.id);\n elementsMapNewToOld.set(newElem.id, oldElem.id);\n copiedElements.push(newElem);\n }\n }\n for (const e of copiedElements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n for (const o of get().elementsToPaste) {\n if (o.id === oldRoofId) {\n (e as RoofModel).wallsId = (o as RoofModel).wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of get().elementsToPaste) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n\n return copiedElements;\n },\n\n pasteElementsToPoint() {\n const pastedElements: ElementModel[] = [];\n immerSet((state: CommonStoreState) => {\n if (state.elementsToPaste.length === 1) {\n // only the parent element is included in elementsToPaste when copied,\n // so we have to copy its children and grandchildren from existing elements\n let m = state.pastePoint;\n const elemToPaste = state.elementsToPaste[0];\n let newParent = state.selectedElement;\n const oldParent = state.getParent(elemToPaste);\n if (newParent) {\n if (newParent.type === ObjectType.Polygon) {\n // paste action of polygon is passed to its parent\n const q = state.getParent(newParent);\n if (q) {\n newParent = q;\n elemToPaste.parentId = newParent.id;\n if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n }\n } else if (newParent.type === ObjectType.Roof) {\n if (newParent.parentId) {\n const foundation = state.getElementById(newParent.parentId);\n if (foundation) {\n m.sub(new Vector3(foundation.cx, foundation.cy, foundation.lz)).applyEuler(\n new Euler(0, 0, -foundation.rotation[2]),\n );\n if (elemToPaste.type !== ObjectType.Window) {\n m.setX(m.x / foundation.lx);\n m.setY(m.y / foundation.ly);\n }\n }\n }\n } else if (newParent.type === ObjectType.Cuboid) {\n if (elemToPaste.type === ObjectType.Cuboid) {\n const { pos } = Util.getWorldDataById(newParent.id);\n m.sub(pos);\n } else if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n elemToPaste.parentId = newParent.id;\n } else if (newParent.type === ObjectType.Wall) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n } else {\n // if the old parent is ground, it has no type definition, but we use it to check its type\n if (oldParent && oldParent.type) {\n if (elemToPaste.type !== ObjectType.Foundation) {\n elemToPaste.parentId = newParent.id;\n if (Util.isPositionRelative(elemToPaste.type)) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n }\n }\n }\n }\n if (elemToPaste.type === ObjectType.Wall) {\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\n }\n }\n const e = ElementModelCloner.clone(\n newParent,\n elemToPaste,\n m.x,\n m.y,\n m.z,\n false,\n state.pasteNormal,\n oldParent,\n );\n if (e) {\n if (state.pasteNormal) {\n e.normal = state.pasteNormal.toArray();\n }\n const lang = { lng: state.language };\n let approved = false;\n switch (e.type) {\n case ObjectType.Cuboid: {\n const getAllChildren = (el: ElementModel) => {\n const res: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === el.id) {\n res.push(e);\n switch (e.type) {\n case ObjectType.Cuboid:\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Roof:\n res.push(...getAllChildren(e));\n }\n }\n }\n return res;\n };\n const child = getAllChildren(elemToPaste);\n const elementMap = new Map(); // oldId -> newModel\n pastedElements.push(e);\n elementMap.set(elemToPaste.id, e);\n\n for (const c of child) {\n const parent = elementMap.get(c.parentId);\n if (parent) {\n const newChild = ElementModelCloner.clone(\n parent,\n c,\n c.cx,\n c.cy,\n c.cz,\n c.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...c.normal];\n }\n pastedElements.push(newChild);\n elementMap.set(c.id, newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elementsToPaste = [e];\n approved = false;\n\n break;\n }\n case ObjectType.Foundation: {\n const elementsMapNewToOld = new Map();\n const elementsMapOldToNew = new Map();\n for (const child of state.elements) {\n if (child.parentId === elemToPaste.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\n elementsMapNewToOld.set(newChild.id, child.id);\n elementsMapOldToNew.set(child.id, newChild.id);\n for (const grandChild of state.elements) {\n if (grandChild.parentId === child.id) {\n const newGrandChild = ElementModelCloner.clone(\n newChild,\n grandChild,\n grandChild.cx,\n grandChild.cy,\n grandChild.cz,\n );\n if (newGrandChild) {\n if (child.normal) {\n newGrandChild.normal = [...grandChild.normal];\n }\n pastedElements.push(newGrandChild);\n }\n }\n }\n }\n }\n }\n }\n state.elements.push(...pastedElements);\n approved = true;\n for (const e of state.elements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\n if (oldRoof) {\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of state.elements) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.Sensor:\n case ObjectType.Light:\n case ObjectType.ParabolicDish:\n case ObjectType.Heliostat:\n case ObjectType.FresnelReflector:\n case ObjectType.ParabolicTrough: {\n if (newParent?.type === ObjectType.Wall) {\n if (newParent) {\n switch (Util.checkElementOnWallState(e, newParent)) {\n case ElementState.Valid:\n const angle = (newParent as WallModel).relativeAngle - HALF_PI;\n e.normal = [Math.cos(angle), Math.sin(angle), 0];\n approved = true;\n break;\n case ElementState.OverLap:\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n case ElementState.OutsideBoundary:\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n }\n break;\n }\n if (newParent && newParent.type === ObjectType.Roof) {\n if (e.foundationId) {\n const foundation = state.getElementById(e.foundationId);\n if (foundation) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(newParent as RoofModel);\n\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices)) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n if (\n !RoofUtil.rooftopSPCollisionCheck(e as SolarPanelModel, foundation, solarPanelVertices)\n ) {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n }\n approved = true;\n state.updateElementOnRoofFlag = true;\n }\n }\n break;\n }\n if (state.overlapWithSibling(e)) {\n // overlap, do not approve\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n } else {\n if (newParent) {\n if (\n newParent.type === ObjectType.Foundation ||\n (newParent.type === ObjectType.Cuboid &&\n Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\n ) {\n approved = Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, newParent);\n if (!approved) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n } else {\n // TODO: other surfaces\n approved = true;\n }\n } else {\n approved = true;\n }\n }\n break;\n }\n case ObjectType.Wall: {\n const center = new Vector3(e.cx, e.cy, 0);\n const vrx = new Vector3(e.lx / 2, 0, 0);\n const vlx = new Vector3(-e.lx / 2, 0, 0);\n const w = e as WallModel;\n const euler = new Euler(0, 0, w.relativeAngle);\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n for (const child of state.elements) {\n if (child.parentId === elemToPaste.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n approved = true;\n break;\n }\n case ObjectType.Door:\n case ObjectType.Window: {\n if (newParent?.type === ObjectType.Wall) {\n switch (Util.checkElementOnWallState(e, newParent)) {\n case ElementState.Valid:\n approved = true;\n break;\n case ElementState.OverLap:\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n case ElementState.OutsideBoundary:\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n } else if (newParent?.type === ObjectType.Roof) {\n const rotation = RoofUtil.getRotationOnRoof(newParent.id, m);\n if (rotation) {\n e.rotation = [...rotation];\n }\n const windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n const boundaryVertices = RoofUtil.getRoofSegmentBoundary(newParent.id, m);\n if (!boundaryVertices) break;\n if (!RoofUtil.rooftopElementBoundaryCheck(windowVertices, boundaryVertices)) {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n break;\n }\n if (!RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, newParent.id)) {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n break;\n }\n approved = true;\n }\n break;\n }\n default: {\n approved = true;\n if (Util.isPlantOrHuman(e)) {\n if (newParent) {\n // paste on a parent\n const parent = state.getParent(e);\n if (parent) {\n const p = Util.relativePoint(state.pastePoint, parent);\n e.cx = p.x;\n e.cy = p.y;\n e.cz = p.z;\n }\n } else {\n // paste on the ground\n e.parentId = GROUND_ID;\n }\n }\n }\n }\n if (approved) {\n state.elements.push(e);\n pastedElements.push(e);\n }\n }\n } else if (state.elementsToPaste.length > 1) {\n // when a parent with children is cut, the removed children are no longer in elements array,\n // so we have to restore them from elementsToPaste.\n let m = state.pastePoint;\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n if (cutElements[0].type === ObjectType.Cuboid) {\n const newParent = state.selectedElement;\n if (newParent && newParent.type === ObjectType.Cuboid) {\n const { pos } = Util.getWorldDataById(newParent.id);\n m.sub(pos);\n cutElements[0].parentId = newParent.id;\n }\n } else if (cutElements[0].type === ObjectType.Wall) {\n const newParent = state.selectedElement;\n if (newParent && newParent.type === ObjectType.Foundation) {\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\n cutElements[0].parentId = newParent.id;\n cutElements[0].foundationId = newParent.id;\n }\n }\n cutElements[0].cx = m.x;\n cutElements[0].cy = m.y;\n cutElements[0].cz = m.z;\n if (cutElements[0].type === ObjectType.Foundation) {\n cutElements[0].cz += cutElements[0].lz / 2;\n } else if (cutElements[0].type === ObjectType.Cuboid) {\n cutElements[0].cz = cutElements[0].lz / 2;\n }\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n }\n }\n if (pastedElements.length > 0) {\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(pastedElements[0].id);\n state.selectedElement = pastedElements[0];\n }\n });\n return pastedElements;\n },\n\n pasteElementsByKey() {\n const pastedElements: ElementModel[] = [];\n immerSet((state: CommonStoreState) => {\n if (state.elementsToPaste.length > 0) {\n const elem = state.elementsToPaste[0];\n const parent = state.getParent(elem);\n const e = ElementModelCloner.clone(parent, elem, elem.cx, elem.cy, elem.cz);\n if (e) {\n let approved = false;\n switch (e.type) {\n case ObjectType.Door:\n case ObjectType.Window:\n if (parent) {\n const hx = e.lx / 2;\n e.cx += hx * 3;\n // searching +x direction\n if (parent.type === ObjectType.Wall) {\n while (e.cx + hx < 0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n // state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx += hx;\n }\n }\n } else if (parent.type === ObjectType.Roof) {\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\n if (\n segmentVertices &&\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx / 2;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n }\n }\n }\n\n // searching -x direction\n if (!approved) {\n e.cx = elem.cx - hx * 3;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n if (parent.type === ObjectType.Wall) {\n while (e.cx - hx > -0.5) {\n if (parent.type === ObjectType.Wall) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n // state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx -= hx;\n }\n }\n }\n } else if (parent.type === ObjectType.Roof) {\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\n if (\n segmentVertices &&\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx -= hx;\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\n if (rot) {\n e.rotation = [...rot];\n }\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\n }\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n if (parent.type === ObjectType.Roof && approved) {\n state.updateElementOnRoofFlag = true;\n }\n }\n break;\n case ObjectType.Human:\n e.cx += 1;\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n case ObjectType.Tree:\n case ObjectType.Flower:\n e.cx += e.lx;\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n case ObjectType.SolarPanel:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n if (e.parentId) {\n const parent = state.getParent(e);\n if (parent) {\n if (parent.type === ObjectType.Wall) {\n const hx = e.lx / parent.lx / 2;\n e.cx += hx * 3;\n // searching +x direction\n while (e.cx + hx < 0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx;\n }\n }\n // searching -x direction\n if (!approved) {\n e.cx = elem.cx - hx * 3;\n while (e.cx - hx > -0.5) {\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n break;\n } else {\n e.cx -= hx;\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n } else {\n }\n break;\n } else if (parent.type === ObjectType.Roof) {\n if (elem.foundationId) {\n const foundation = state.getElementById(elem.foundationId);\n if (foundation) {\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\n\n const hx = e.lx / foundation.lx / 2;\n e.cx += hx * 1.25;\n\n while (e.cx + hx < 0.5) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n if (\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\n RoofUtil.rooftopSPCollisionCheck(\n e as SolarPanelModel,\n foundation,\n solarPanelVertices,\n )\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx += hx * 1.25;\n }\n }\n if (!approved) {\n e.cx = elem.cx - hx * 1.25;\n while (e.cx - hx > -0.5) {\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\n e as SolarPanelModel,\n foundation,\n );\n if (\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\n RoofUtil.rooftopSPCollisionCheck(\n e as SolarPanelModel,\n foundation,\n solarPanelVertices,\n )\n ) {\n state.elements.push(e);\n approved = true;\n break;\n } else {\n e.cx -= hx * 1.25;\n }\n }\n }\n if (!approved) {\n const lang = { lng: state.language };\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n } else {\n state.updateElementOnRoofFlag = true;\n }\n }\n }\n break;\n }\n const nearestNeighborId = state.findNearestSibling(elem.id);\n if (nearestNeighborId) {\n const nearestNeighbor = state.getElementById(nearestNeighborId);\n if (nearestNeighbor) {\n const oldX = e.cx;\n const oldY = e.cy;\n const oldZ = e.cz;\n const dx = nearestNeighbor.cx - elem.cx;\n const dy = nearestNeighbor.cy - elem.cy;\n const dz = nearestNeighbor.cz - elem.cz;\n e.cx = nearestNeighbor.cx + dx;\n e.cy = nearestNeighbor.cy + dy;\n e.cz = nearestNeighbor.cz + dz;\n if (state.overlapWithSibling(e)) {\n // try the opposite direction first before giving up\n e.cx = elem.cx - dx;\n e.cy = elem.cy - dy;\n e.cz = elem.cz - dz;\n if (state.overlapWithSibling(e)) {\n // we may need to hop twice in the opposite direction\n e.cx = elem.cx - 2 * dx;\n e.cy = elem.cy - 2 * dy;\n e.cz = elem.cz - 2 * dz;\n if (state.overlapWithSibling(e)) {\n e.cx = oldX - dx;\n e.cy = oldY - dy;\n e.cz = oldZ - dz;\n }\n }\n }\n } else {\n e.cx += e.lx / parent.lx;\n }\n } else {\n // a loner\n e.cx += e.lx / parent.lx;\n }\n const lang = { lng: state.language };\n if (!state.overlapWithSibling(e)) {\n if (\n parent.type === ObjectType.Foundation ||\n (parent.type === ObjectType.Cuboid && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\n ) {\n if (Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n } else {\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\n }\n } else {\n // TODO: For other surfaces, handle out-of-bounds errors here\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n }\n } else {\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\n }\n }\n }\n break;\n case ObjectType.Sensor:\n case ObjectType.Light:\n if (e.parentId) {\n const parent = state.getParent(e);\n if (parent) {\n e.cx += e.lx / parent.lx;\n }\n if (e.cx < 0.5) {\n state.elements.push(e);\n state.elementsToPaste = [e];\n approved = true;\n }\n }\n break;\n case ObjectType.Polygon:\n const polygon = e as PolygonModel;\n for (const v of polygon.vertices) {\n v.x += 0.1;\n }\n polygon.cx += 0.1;\n state.elements.push(polygon);\n state.elementsToPaste = [polygon];\n approved = true;\n break;\n case ObjectType.Cuboid:\n e.cx += e.lx;\n if (state.elementsToPaste.length === 1) {\n const getAllChildren = (el: ElementModel) => {\n const res: ElementModel[] = [];\n for (const e of get().elements) {\n if (e.parentId === el.id) {\n res.push(e);\n switch (e.type) {\n case ObjectType.Cuboid:\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Roof:\n res.push(...getAllChildren(e));\n }\n }\n }\n return res;\n };\n const child = getAllChildren(elem);\n const elementMap = new Map(); // oldId -> newModel\n pastedElements.push(e);\n elementMap.set(elem.id, e);\n\n for (const c of child) {\n const parent = elementMap.get(c.parentId);\n if (parent) {\n const newChild = ElementModelCloner.clone(\n parent,\n c,\n c.cx,\n c.cy,\n c.cz,\n c.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...c.normal];\n }\n pastedElements.push(newChild);\n elementMap.set(c.id, newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elementsToPaste = [e];\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(e.id);\n state.selectedElement = e;\n } else if (state.elementsToPaste.length > 1) {\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += cutElements[0].lx;\n state.elements.push(...cutElements);\n state.elementsToPaste = [...cutElements];\n pastedElements.push(...cutElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n approved = false;\n break;\n case ObjectType.Foundation:\n e.cx += e.lx;\n if (state.elementsToPaste.length === 1) {\n // When copying from an existing container, elementsToPaste stores only the container.\n // So we have to copy its children and grandchildren as well. This differs from the\n // situation of cutting, in which case all the children and grandchildren must be\n // stored in elementsToPaste.\n const elementsMapNewToOld = new Map();\n const elementsMapOldToNew = new Map();\n for (const child of state.elements) {\n // technically, parentId must not be the same as ID, but just to be sure...\n if (child.parentId === elem.id && child.parentId !== child.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\n elementsMapNewToOld.set(newChild.id, child.id);\n elementsMapOldToNew.set(child.id, newChild.id);\n for (const grandChild of state.elements) {\n if (grandChild.parentId === child.id) {\n const newGrandChild = ElementModelCloner.clone(\n newChild,\n grandChild,\n grandChild.cx,\n grandChild.cy,\n grandChild.cz,\n );\n if (newGrandChild) {\n if (child.normal) {\n newGrandChild.normal = [...grandChild.normal];\n }\n pastedElements.push(newGrandChild);\n }\n }\n }\n }\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elements.push(e);\n state.elementsToPaste = [e];\n for (const e of state.elements) {\n // search new roof\n if (e.type === ObjectType.Roof) {\n const oldRoofId = elementsMapNewToOld.get(e.id);\n if (oldRoofId) {\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\n if (oldRoof) {\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\n (v) => elementsMapOldToNew.get(v) as string,\n );\n }\n }\n }\n // search new wall\n if (e.type === ObjectType.Wall) {\n const oldWallId = elementsMapNewToOld.get(e.id);\n if (oldWallId) {\n for (const o of state.elements) {\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\n const w = o as WallModel;\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\n if (left) {\n (e as WallModel).leftJoints = [left];\n }\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\n if (right) {\n (e as WallModel).rightJoints = [right];\n }\n if (w.roofId) {\n const roofId = elementsMapOldToNew.get(w.roofId as string);\n if (roofId) {\n (e as WallModel).roofId = roofId;\n }\n }\n break;\n }\n }\n }\n }\n }\n } else if (state.elementsToPaste.length > 1) {\n // when a parent with children is cut, the removed children are no longer in elements array,\n // so we have to restore them from elementsToPaste.\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += cutElements[0].lx;\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n state.elementsToPaste = cutElements;\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n approved = true;\n break;\n case ObjectType.Wall:\n const w = e as WallModel;\n const step = new Vector3(1, -1, 0).applyEuler(new Euler(0, 0, w.relativeAngle));\n e.cx += step.x;\n e.cy += step.y;\n if (state.elementsToPaste.length === 1) {\n const center = new Vector3(e.cx, e.cy, 0);\n const vrx = new Vector3(e.lx / 2, 0, 0);\n const vlx = new Vector3(-e.lx / 2, 0, 0);\n const euler = new Euler(0, 0, w.relativeAngle);\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\n w.roofId = undefined;\n w.leftRoofHeight = undefined;\n w.rightRoofHeight = undefined;\n w.centerLeftRoofHeight = undefined;\n w.centerRightRoofHeight = undefined;\n w.centerRoofHeight = undefined;\n for (const child of state.elements) {\n if (child.parentId === elem.id) {\n const newChild = ElementModelCloner.clone(\n e,\n child,\n child.cx,\n child.cy,\n child.cz,\n child.type === ObjectType.Polygon,\n );\n if (newChild) {\n if (e.normal) {\n newChild.normal = [...child.normal];\n }\n pastedElements.push(newChild);\n }\n }\n }\n state.elements.push(...pastedElements);\n state.elements.push(e);\n state.elementsToPaste = [e];\n } else if (state.elementsToPaste.length > 1) {\n const cutElements = state.copyCutElements();\n if (cutElements.length > 0) {\n cutElements[0].cx += step.x;\n cutElements[0].cy -= step.y;\n state.elements.push(...cutElements);\n pastedElements.push(...cutElements);\n state.elementsToPaste = cutElements;\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(cutElements[0].id);\n state.selectedElement = cutElements[0];\n }\n }\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n approved = true;\n break;\n }\n if (state.elementsToPaste.length === 1 && approved) {\n pastedElements.push(e);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(e.id);\n state.selectedElement = e;\n }\n }\n }\n });\n return pastedElements;\n },\n\n pvModules: {},\n loadPvModules() {\n const pvModels: PvModel[] = [];\n Papa.parse(pvmodules, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const pv = {\n name: row[0].trim(),\n brand: row[1].trim(),\n cellType: row[2].trim(),\n efficiency: parseFloat(row[3].trim()),\n length: parseFloat(row[4].trim()),\n nominalLength: parseFloat(row[5].trim()),\n width: parseFloat(row[6].trim()),\n nominalWidth: parseFloat(row[7].trim()),\n thickness: parseFloat(row[8].trim()),\n m: parseFloat(row[9].trim()),\n n: parseFloat(row[10].trim()),\n pmax: parseFloat(row[11].trim()),\n vmpp: parseFloat(row[12].trim()),\n impp: parseFloat(row[13].trim()),\n voc: parseFloat(row[14].trim()),\n isc: parseFloat(row[15].trim()),\n pmaxTC: parseFloat(row[16].trim()),\n noct: parseFloat(row[17].trim()),\n weight: parseFloat(row[18].trim()),\n color: row[19].trim(),\n shadeTolerance: row[20].trim(),\n bifacialityFactor: parseFloat(row[21].trim()),\n } as PvModel;\n pvModels.push(pv);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const model of pvModels) {\n state.pvModules[model.name] = model;\n }\n });\n },\n });\n },\n getPvModule(name: string) {\n return get().pvModules[name];\n },\n\n weatherData: {},\n loadWeatherData() {\n const data: WeatherModel[] = [];\n Papa.parse(weather, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const lows: number[] = [];\n const highs: number[] = [];\n const sun: number[] = [];\n for (let i = 5; i < 29; i++) {\n if ((i - 5) % 2 === 0) {\n lows.push(parseFloat(row[i].trim()));\n } else {\n highs.push(parseFloat(row[i].trim()));\n }\n }\n for (let i = 29; i < 41; i++) {\n sun.push(parseFloat(row[i].trim()));\n }\n const wm = {\n city: row[0].trim(),\n country: row[1].trim(),\n longitude: parseFloat(row[2].trim()),\n latitude: parseFloat(row[3].trim()),\n elevation: parseFloat(row[4].trim()),\n lowestTemperatures: lows,\n highestTemperatures: highs,\n sunshineHours: sun,\n } as WeatherModel;\n data.push(wm);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const row of data) {\n state.weatherData[row.city + ', ' + row.country] = row;\n }\n });\n },\n });\n },\n getWeather(location) {\n return get().weatherData[location];\n },\n horizontalSolarRadiationData: {},\n loadHorizontalSolarRadiationData() {\n const radiationData: SolarRadiationData[] = [];\n Papa.parse(solar_radiation_horizontal, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const data: number[] = [];\n for (let i = 2; i < 14; i++) {\n data.push(parseFloat(row[i].trim()));\n }\n const sr = {\n city: row[0].trim(),\n country: row[1].trim(),\n data: data,\n } as SolarRadiationData;\n radiationData.push(sr);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const x of radiationData) {\n state.horizontalSolarRadiationData[x.city + ', ' + x.country] = x;\n }\n });\n },\n });\n },\n getHorizontalSolarRadiation(location) {\n return get().horizontalSolarRadiationData[location];\n },\n verticalSolarRadiationData: {},\n loadVerticalSolarRadiationData() {\n const radiationData: SolarRadiationData[] = [];\n Papa.parse(solar_radiation_vertical, {\n download: true,\n complete: function (results) {\n for (const row of results.data) {\n if (Array.isArray(row) && row.length > 1) {\n const data: number[] = [];\n for (let i = 2; i < 14; i++) {\n data.push(parseFloat(row[i].trim()));\n }\n const sr = {\n city: row[0].trim(),\n country: row[1].trim(),\n data: data,\n } as SolarRadiationData;\n radiationData.push(sr);\n }\n }\n immerSet((state: CommonStoreState) => {\n for (const x of radiationData) {\n state.verticalSolarRadiationData[x.city + ', ' + x.country] = x;\n }\n });\n },\n });\n },\n getVerticalSolarRadiation(location) {\n return get().verticalSolarRadiationData[location];\n },\n getClosestCity(lat, lng) {\n let min: number = Number.MAX_VALUE;\n let city = null;\n let distance: number;\n const wd = get().weatherData;\n for (const name in wd) {\n if (wd.hasOwnProperty(name)) {\n distance = Util.getDistance(lng, lat, wd[name].longitude, wd[name].latitude);\n if (distance < min) {\n min = distance;\n city = name;\n }\n }\n }\n return city;\n },\n\n sunlightDirection: new Vector3(0, 2, 2),\n setSunlightDirection(vector) {\n immerSet((state: CommonStoreState) => {\n state.sunlightDirection = vector.clone();\n });\n },\n\n cameraDirection: new Vector3(),\n getCameraDirection() {\n return get().cameraDirection;\n },\n\n updateSceneRadiusFlag: false,\n updateSceneRadius() {\n immerSet((state: CommonStoreState) => {\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\n });\n },\n sceneRadius: 100,\n setSceneRadius(radius) {\n immerSet((state: CommonStoreState) => {\n state.sceneRadius = radius;\n });\n },\n\n selectedElementAngle: 0,\n selectedElementHeight: 0,\n selectedElementX: 0,\n selectedElementY: 0,\n\n isAddingElement() {\n return !!(\n get().addedCuboidId ||\n get().addedFoundationId ||\n get().addedWallId ||\n get().addedWindowId ||\n get().addedDoorId\n );\n },\n\n addedFoundationId: null,\n deletedFoundationId: null,\n\n addedCuboidId: null,\n deletedCuboidId: null,\n\n addedWallId: null,\n deletedWallId: null,\n updateWallMapOnFoundationFlag: false,\n updateWallMapOnFoundation() {\n immerSet((state: CommonStoreState) => {\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n });\n },\n\n updateElementOnRoofFlag: false,\n setUpdateElementOnRoofFlag(b) {\n immerSet((state: CommonStoreState) => {\n state.updateElementOnRoofFlag = b;\n });\n },\n updateElementOnRoofFn() {\n immerSet((state: CommonStoreState) => {\n state.updateElementOnRoofFlag = true;\n });\n },\n\n addedWindowId: null,\n\n addedDoorId: null,\n\n addedRoofId: null,\n deletedRoofId: null,\n autoDeletedRoof: null,\n autoDeletedChild: null,\n getAutoDeletedElements() {\n const autoDeletedRoof = get().autoDeletedRoof;\n const autoDeletedChild = get().autoDeletedChild;\n\n if (!autoDeletedRoof || !autoDeletedChild) return null;\n\n const arr: ElementModel[] = [];\n\n arr.push(autoDeletedRoof, ...autoDeletedChild);\n return arr;\n },\n setAddedRoofId(id: string | null) {\n immerSet((state) => {\n state.addedRoofId = id;\n });\n },\n\n groupActionMode: false,\n setGroupActionMode(b: boolean) {\n immerSet((state) => {\n state.groupActionMode = b;\n });\n },\n groupMasterId: null,\n setGroupMasterId(id: string | null) {\n immerSet((state) => {\n state.groupMasterId = id;\n for (const e of state.elements) {\n e.selected = e.id === id;\n }\n });\n },\n groupActionUpdateFlag: false,\n\n locale: enUS,\n localFileName: 'aladdin.ala',\n createNewFileFlag: false,\n setCreateNewFileFlag(b) {\n immerSet((state) => {\n state.createNewFileFlag = b;\n });\n },\n openLocalFileFlag: false,\n setOpenLocalFileFlag(b) {\n immerSet((state) => {\n state.openLocalFileFlag = b;\n });\n },\n localFileDialogRequested: false,\n pvModelDialogVisible: false,\n loggable: false,\n actionInfo: undefined,\n currentUndoable: undefined,\n showCloudFileTitleDialog: false,\n showCloudFileTitleDialogFlag: false,\n localContentToImportAfterCloudFileUpdate: undefined,\n\n enableFineGrid: false,\n setEnableFineGrid(b) {\n immerSet((state: CommonStoreState) => {\n state.enableFineGrid = b;\n });\n },\n };\n },\n {\n name: 'aladdin-storage',\n getStorage: () => {\n const params = new URLSearchParams(window.location.search);\n const viewOnly = params.get('viewonly') === 'true';\n return viewOnly ? sessionStorage : localStorage;\n },\n whitelist: [\n 'language',\n 'animate24Hours',\n 'floatingWindowOpacity',\n 'selectedFloatingWindow',\n 'locale',\n 'cloudFile',\n 'latestModelSite',\n 'modelSites',\n 'modelsMapLatitude',\n 'modelsMapLongitude',\n 'modelsMapAddress',\n 'modelsMapZoom',\n 'modelsMapType',\n 'modelsMapTilt',\n 'world',\n 'elements',\n 'viewState',\n 'graphState',\n 'actionState',\n 'modelType',\n 'modelAuthor',\n 'modelLabel',\n 'modelDescription',\n 'projectView',\n 'projectInfo',\n 'designProjectType',\n 'notes',\n 'user',\n 'sceneRadius',\n 'weatherData',\n 'solarPanelArrayLayoutParams',\n 'solarPanelArrayLayoutConstraints',\n 'economicsParams',\n 'evolutionMethod',\n 'evolutionaryAlgorithmState',\n 'geneticAlgorithmWizardSelectedTab',\n 'particleSwarmOptimizationWizardSelectedTab',\n 'minimumNavigationMoveSpeed',\n 'minimumNavigationTurnSpeed',\n ],\n },\n ),\n ),\n);\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);\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.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);\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.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","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n UNIT_VECTOR_POS_Z,\n} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\nimport { Util } from '../Util';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { ParabolicCylinder } from './shapes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst ParabolicTrough = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n absorberTubeRadius = 0.05,\n latusRectum = 2,\n tiltAngle,\n relativeAzimuth,\n moduleLength,\n poleHeight,\n poleRadius,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n}: ParabolicTroughModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [numberOfModules, setNumberOfModules] = useState(1);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const frontSideRef = useRef();\n const backSideRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const parabolaSegments = 16;\n const night = sunlightDirection.z <= 0;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n }\n\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\n const focalLength = 0.25 * latusRectum;\n const positionLL = new Vector3(-hx, -hy, hz + depth);\n const positionUL = new Vector3(-hx, hy, hz + depth);\n const positionLR = new Vector3(hx, -hy, hz + depth);\n const positionUR = new Vector3(hx, hy, hz + depth);\n const trough = useMemo(() => getElementById(id) as ParabolicTroughModel, [id]);\n\n useEffect(() => {\n if (trough && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(trough.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\n }, [ly, moduleLength]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (trough?.label ? trough.label : i18n.t('shared.ParabolicTroughElement', lang)) +\n (trough?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (trough?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [trough?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (sunDirection.z > 0) {\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), 0, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [rot, sunDirection, tiltAngle, relativeAzimuth]);\n\n // FIXME: This only works when the foundation has zero azimuth or the time is at noon\n const reflectedLightShift = useMemo(() => {\n if (sunDirection.z > 0) {\n const cosRot = rot ? Math.cos(rot) : 1;\n const sinRot = rot ? Math.sin(rot) : 0;\n // how much the reflected light should shift in the direction of the receiver tube?\n return (\n (-focalLength * (sunDirection.x * sinRot + sunDirection.y * cosRot)) /\n Math.hypot(sunDirection.x, sunDirection.z)\n );\n }\n return 0;\n }, [sunDirection, rot, focalLength]);\n\n const focusPoint = new Vector3(0, reflectedLightShift, focalLength).applyEuler(relativeEuler);\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength).applyEuler(new Euler(-euler.x, 0, -euler.z));\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n\n const poles = useMemo(() => {\n const array: Vector3[] = [];\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\n const i2 = numberOfModules / 2 - 0.5;\n for (let i = 0; i < numberOfModules; i++) {\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\n }\n return array;\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\n\n const moduleLines = useMemo(() => {\n const array: LineData[] = [];\n const dy = ly / numberOfModules;\n const t0 = -lx / latusRectum;\n const dt = (-2 * t0) / parabolaSegments;\n for (let i = 0; i <= numberOfModules; i++) {\n const line: Vector3[] = [];\n for (let j = 0; j <= parabolaSegments; j++) {\n const t = t0 + j * dt;\n line.push(new Vector3((latusRectum * t) / 2, -hy + i * dy, (latusRectum * t * t) / 4));\n }\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, numberOfModules, latusRectum]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const detailed = elements.length < 50 && moduleLines.length < 10;\n const radialSegmentsPole = detailed ? 4 : 2;\n\n return (\n \n \n {/* draw front side parabolic cylinder */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n\n {/* draw back side parabolic cylinder */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n\n {moduleLines &&\n moduleLines.map((lineData, index) => {\n return (\n \n {detailed && (\n \n )}\n {(index === 0 || index === moduleLines.length - 1 || detailed) && (\n \n )}\n \n );\n })}\n {detailed && (\n \n )}\n {detailed && (\n \n )}\n\n {/* absorber tube along the focal line (focal length = latus rectum / 4) */}\n \n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 &&\n poles.map((p, i) => {\n if (i % 5 !== 0 && !detailed) return ;\n return (\n \n \n \n );\n })}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(ParabolicTrough);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Circle, Cylinder, Line, Sphere, useTexture } from '@react-three/drei';\nimport { AdditiveBlending, BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n TWO_PI,\n UNIT_VECTOR_POS_Z,\n} from '../constants';\nimport {\n ActionType,\n MoveHandleType,\n ObjectType,\n ParabolicDishStructureType,\n ResizeHandleType,\n RotateHandleType,\n} from '../types';\nimport { Util } from '../Util';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { Paraboloid } from './shapes';\nimport GlowImage from '../resources/glow.png';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst ParabolicDish = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n structureType = ParabolicDishStructureType.CentralPole,\n receiverRadius = 0.25,\n receiverPoleRadius = 0.1,\n latusRectum = 2,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius = 0.2,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.25,\n showLabel = false,\n locked = false,\n parentId,\n}: ParabolicDishModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const frontSideRef = useRef();\n const backSideRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const radialSegments = 32;\n const depthSegments = 8;\n const night = sunlightDirection.z <= 0;\n\n const hx = lx / 2; // lx and ly both represent the diameter of the dish, so they are identical\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n }\n\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\n const focalLength = 0.25 * latusRectum;\n const positionLL = new Vector3(-hx, -hy, hz + depth);\n const positionUL = new Vector3(-hx, hy, hz + depth);\n const positionLR = new Vector3(hx, -hy, hz + depth);\n const positionUR = new Vector3(hx, hy, hz + depth);\n const dish = useMemo(() => getElementById(id) as ParabolicDishModel, [id]);\n const glowTexture = useTexture(GlowImage);\n const haloRadius = receiverRadius + 1;\n\n useEffect(() => {\n if (dish && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(dish.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (dish?.label ? dish.label : i18n.t('shared.ParabolicDishElement', lang)) +\n (dish?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (dish?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [dish?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (sunDirection.z > 0) {\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\n return new Euler(\n Math.atan2(r, rotatedSunDirection.z),\n 0,\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\n 'ZXY',\n );\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [sunDirection, tiltAngle, relativeAzimuth]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n const detailed = elements.length < 50;\n\n const wireframeLines = useMemo(() => {\n const array: LineData[] = [];\n if (detailed) {\n // draw rim lines\n const outer: Vector3[] = [];\n const inner: Vector3[] = [];\n let angle, cos, sin;\n const depth4 = 0.25 * depth;\n for (let i = 0; i <= radialSegments; i++) {\n angle = (TWO_PI * i) / radialSegments;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n outer.push(new Vector3(hx * cos, hx * sin, depth));\n inner.push(new Vector3((hx * cos) / 2, (hx * sin) / 2, depth4));\n }\n array.push({ points: outer } as LineData);\n array.push({ points: inner } as LineData);\n // draw radial lines\n for (let i = 0; i < 12; i++) {\n angle = (TWO_PI * i) / 12;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n const line: Vector3[] = [];\n for (let j = 0; j <= depthSegments; j++) {\n const dx = j === 0 ? 0 : (j / depthSegments) * hx;\n line.push(new Vector3(dx * cos, dx * sin, (dx * dx) / latusRectum + 0.01));\n }\n array.push({ points: line } as LineData);\n }\n }\n return array;\n }, [hx, latusRectum]);\n\n const tripodLines = useMemo(() => {\n if (structureType === ParabolicDishStructureType.CentralPoleWithTripod) {\n const array: LineData[] = [];\n let angle;\n for (let i = 0; i < 3; i++) {\n angle = (TWO_PI * i) / 3;\n const line: Vector3[] = [];\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\n line.push(new Vector3(0, 0, focalLength));\n array.push({ points: line } as LineData);\n }\n return array;\n }\n return undefined;\n }, [hx, latusRectum, structureType]);\n\n const quadrupodLines = useMemo(() => {\n if (structureType === ParabolicDishStructureType.Quadrupod) {\n const array: LineData[] = [];\n let angle;\n for (let i = 0; i < 4; i++) {\n angle = (TWO_PI * i) / 4;\n const line: Vector3[] = [];\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\n line.push(new Vector3(0, 0, focalLength));\n array.push({ points: line } as LineData);\n }\n return array;\n }\n return undefined;\n }, [hx, latusRectum, structureType]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 3;\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength);\n const focalPoint = new Vector3(0, 0, focalLength).applyEuler(relativeEuler);\n\n return (\n \n \n {/* draw front side parabolic dish */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicDish;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === frontSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n\n {/* draw back side parabolic dish */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.ParabolicDish;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === backSideRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n\n {wireframeLines &&\n wireframeLines.length > 0 &&\n wireframeLines.map((lineData, index) => {\n return (\n \n \n \n );\n })}\n\n {/* receiver at the focus (focal length = latus rectum / 4) */}\n \n \n \n {/* simple glow effect to create a halo */}\n {sunDirection.z > 0 && (\n \n \n \n \n \n )}\n {(structureType === ParabolicDishStructureType.CentralPole ||\n structureType === ParabolicDishStructureType.CentralPoleWithTripod) && (\n \n \n \n )}\n {structureType === ParabolicDishStructureType.CentralPoleWithTripod &&\n tripodLines &&\n tripodLines.map((lineData, index) => {\n return (\n \n \n \n \n \n \n );\n })}\n {structureType === ParabolicDishStructureType.Quadrupod &&\n quadrupodLines &&\n quadrupodLines.map((lineData, index) => {\n return (\n \n \n \n \n \n \n );\n })}\n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 && (\n \n \n \n )}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(ParabolicDish);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { LineData } from './LineData';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst FresnelReflector = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n tiltAngle,\n relativeAzimuth,\n moduleLength,\n poleHeight,\n poleRadius = 0.1,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n receiverId,\n}: FresnelReflectorModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [numberOfModules, setNumberOfModules] = useState(1);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + hx;\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const fresnelReflector = useMemo(() => getElementById(id) as FresnelReflectorModel, [id]);\n\n useEffect(() => {\n if (fresnelReflector && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(fresnelReflector.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\n }, [ly, moduleLength]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (fresnelReflector?.label ? fresnelReflector.label : i18n.t('shared.FresnelReflectorElement', lang)) +\n (fresnelReflector?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (fresnelReflector?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [fresnelReflector?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = parent?.rotation[2];\n\n // TODO: how to get an updated version of the memorized receiver\n const receiver = receiverId && receiverId !== parentId ? getElementById(receiverId) : null;\n\n const receiverCenter = useMemo(() => {\n if (receiver) {\n if (receiver.type === ObjectType.Foundation) {\n const foundation = receiver as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\n // convert the receiver's coordinates into those relative to the center of this reflector\n return new Vector3(\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\n );\n }\n }\n } else {\n if (parent) {\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\n // convert the receiver's coordinates into those relative to the center of this reflector\n return new Vector3(\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\n );\n }\n }\n }\n }\n return null;\n }, [parent, cx, cy, cz, receiverId, receiver?.cx, receiver?.cy, receiver?.cz]);\n\n const shiftedReceiverCenter = useRef(new Vector3());\n\n const relativeEuler = useMemo(() => {\n if (receiverCenter && sunDirection.z > 0) {\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 = rot ? new Vector3(Math.sin(rot), Math.cos(rot), 0) : new Vector3(0, 1, 0);\n shiftedReceiverCenter.current.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 sunDirection.z < ZERO_TOLERANCE\n ? 0\n : (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.current.x += shift * rotationAxis.x;\n shiftedReceiverCenter.current.y -= shift * rotationAxis.y;\n const reflectorToReceiver = shiftedReceiverCenter.current.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 const sunDirectionClone = sunDirection.clone();\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n sunDirectionClone.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n const delta = (sunDirectionClone.y / sunDirectionClone.z) * receiverCenter.z;\n shiftedReceiverCenter.current.x -= (shift - delta) * rotationAxis.x;\n shiftedReceiverCenter.current.y += (shift - delta) * rotationAxis.y;\n return new Euler(0, Math.atan2(normalVector.x, normalVector.z), 0, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, receiver?.cx, receiver?.cy, receiver?.cz]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n\n const poles = useMemo(() => {\n const array: Vector3[] = [];\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\n const i2 = numberOfModules / 2 - 0.5;\n for (let i = 0; i < numberOfModules; i++) {\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\n }\n return array;\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\n\n const moduleLines = useMemo(() => {\n const array: LineData[] = [];\n const dy = ly / numberOfModules;\n for (let i = 0; i <= numberOfModules; i++) {\n const line: Vector3[] = [];\n line.push(new Vector3(-hx, -hy + i * dy, hz));\n line.push(new Vector3(hx, -hy + i * dy, hz));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, numberOfModules]);\n\n const baseSize = Math.max(1, Math.min(lx * 5, ly * 5, (lx + ly) / 16));\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n\n return (\n \n \n {/* draw the upper side of the reflector */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.FresnelReflector;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n\n {moduleLines &&\n moduleLines.map((lineData, index) => {\n return (\n \n );\n })}\n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 &&\n poles.map((p, i) => {\n const radialSegments = elements.length < 100 ? 4 : 2;\n return (\n \n \n \n );\n })}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(FresnelReflector);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport { HALF_PI, LOCKED_ELEMENT_SELECTION_COLOR, MOVE_HANDLE_RADIUS, UNIT_VECTOR_POS_Z } from '../constants';\nimport { ActionType, MoveHandleType, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { getSunDirection } from '../analysis/sunTools';\nimport i18n from '../i18n/i18n';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { useSelected } from './hooks';\n\nconst Heliostat = ({\n id,\n cx,\n cy,\n cz,\n lx,\n ly,\n lz = 0.1,\n reflectance = 0.9,\n tiltAngle,\n relativeAzimuth,\n poleHeight,\n poleRadius = Math.min(lx, ly) / 20,\n drawSunBeam,\n rotation = [0, 0, 0],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.5,\n showLabel = false,\n locked = false,\n parentId,\n towerId,\n}: HeliostatModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const sceneRadius = useStore(Selector.sceneRadius);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const pointerDown = useRef(false);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const actualPoleHeight = poleHeight + Math.max(hx, hy);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = actualPoleHeight + hz + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n }\n }\n\n const heliostat = useMemo(() => getElementById(id) as HeliostatModel, [id]);\n\n useEffect(() => {\n if (heliostat && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(heliostat.id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const labelText = useMemo(() => {\n return (\n (heliostat?.label ? heliostat.label : i18n.t('shared.HeliostatElement', lang)) +\n (heliostat?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (heliostat?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [heliostat?.label, locked, language, cx, cy, cz]);\n\n // in model coordinate system\n const euler = useMemo(() => {\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n domElement.style.cursor = handle === MoveHandleType.Default ? 'move' : 'pointer';\n }\n }\n };\n\n const noHoverHandle = () => {\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = parent?.rotation[2];\n\n // TODO: how to get an updated version of the memorized tower\n const tower = towerId && towerId !== parentId ? getElementById(towerId) : null;\n\n const receiverCenter = useMemo(() => {\n if (tower) {\n if (tower.type === ObjectType.Foundation) {\n const foundation = tower as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\n // convert the receiver's coordinates into those relative to the center of this heliostat\n return new Vector3(\n foundation.cx - cx,\n foundation.cy - cy,\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\n );\n }\n }\n } else {\n if (parent) {\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\n // convert the receiver's coordinates into those relative to the center of this heliostat\n return new Vector3(\n foundation.cx - cx,\n foundation.cy - cy,\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\n );\n }\n }\n }\n }\n return null;\n }, [parent, cx, cy, cz, towerId, tower?.cx, tower?.cy, tower?.cz]);\n\n const relativeEuler = useMemo(() => {\n if (receiverCenter && sunDirection.z > 0) {\n const heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.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 return new Euler(Math.atan2(r, normalVector.z), 0, Math.atan2(normalVector.y, normalVector.x) + HALF_PI, 'ZXY');\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, tower?.cx, tower?.cy, tower?.cz]);\n\n const poleZ = -(actualPoleHeight + lz) / 2;\n const baseSize = Math.max(1, (lx + ly) / 8);\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 4;\n\n return (\n \n \n {/* draw the upper side of the heliostat */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.Heliostat;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n\n {/* simulation element */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move handle */}\n {selected && !locked && (\n {\n hoverHandle(e, MoveHandleType.Default);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n )}\n \n\n {/* draw poles */}\n {actualPoleHeight > 0 && (\n \n \n \n )}\n\n {/* draw sun beam */}\n {drawSunBeam && sunDirection.z > 0 && (\n \n )}\n\n {/* draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(Heliostat);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\nimport { useStore } from '../../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../../stores/selector';\nimport { ThreeEvent, useThree } from '@react-three/fiber';\nimport {\n DEFAULT_SOLAR_PANEL_SHININESS,\n HALF_PI,\n HIGHLIGHT_HANDLE_COLOR,\n LOCKED_ELEMENT_SELECTION_COLOR,\n MOVE_HANDLE_RADIUS,\n RESIZE_HANDLE_COLOR,\n RESIZE_HANDLE_SIZE,\n SOLAR_PANEL_BLACK_SPECULAR,\n SOLAR_PANEL_BLUE_SPECULAR,\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 {\n ActionType,\n MoveHandleType,\n ObjectType,\n Orientation,\n ResizeHandleType,\n RotateHandleType,\n TrackerType,\n} from '../../types';\nimport { Util } from '../../Util';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { getSunDirection } from '../../analysis/sunTools';\nimport RotateHandle from '../../components/rotateHandle';\nimport { UndoableChange } from '../../undo/UndoableChange';\nimport i18n from '../../i18n/i18n';\nimport { LineData } from '../LineData';\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { PvModel } from 'src/models/PvModel';\nimport { useSelected } from '../hooks';\n\nconst SolarPanel = ({\n id,\n pvModelName = 'SPR-X21-335-BLK',\n cx,\n cy,\n cz,\n lx,\n ly,\n lz,\n tiltAngle,\n relativeAzimuth,\n trackerType = TrackerType.NO_TRACKER,\n poleHeight,\n poleRadius,\n poleSpacing,\n drawSunBeam,\n rotation = [0, 0, 0],\n normal = [0, 0, 1],\n color = 'white',\n lineColor = 'black',\n lineWidth = 0.1,\n showLabel = false,\n locked = false,\n parentId,\n orientation = Orientation.landscape,\n}: SolarPanelModel) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const elements = useStore(Selector.elements);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\n const getElementById = useStore(Selector.getElementById);\n const selectMe = useStore(Selector.selectMe);\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\n const sceneRadius = useStore(Selector.sceneRadius);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const rotateHandleType = useStore(Selector.rotateHandleType);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const pvModules = useStore(Selector.pvModules);\n\n const selected = useSelected(id);\n\n const {\n gl: { domElement },\n camera,\n } = useThree();\n\n const [hovered, setHovered] = useState(false);\n const [hoveredHandle, setHoveredHandle] = useState(null);\n const [faceUp, setFaceUp] = useState();\n const baseRef = useRef();\n const moveHandleRef = useRef();\n const resizeHandleLowerRef = useRef();\n const resizeHandleUpperRef = useRef();\n const resizeHandleLeftRef = useRef();\n const resizeHandleRightRef = useRef();\n const tiltHandleRef = useRef();\n const pointerDown = useRef(false);\n const oldTiltAngleRef = useRef(0);\n const newTiltAngleRef = useRef(0);\n const solarPanelLinesRef = useRef();\n const ray = useMemo(() => new Raycaster(), []);\n\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\n const panelNormal = new Vector3().fromArray(normal);\n const pvModel = pvModules[pvModelName] as PvModel;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // be sure to get the updated parent so that this memorized element can move with it\n const parent = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === parentId) {\n return e;\n }\n }\n });\n if (parentId) {\n if (parent) {\n switch (parent.type) {\n case ObjectType.Foundation:\n cz = poleHeight + lz / 2 + parent.lz;\n if (Util.isZero(rotation[2])) {\n cx = parent.cx + cx * parent.lx;\n cy = parent.cy + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = parent.cx + v.x;\n cy = parent.cy + v.y;\n }\n break;\n case ObjectType.Cuboid:\n const { pos, rot } = Util.getWorldDataById(parent.id);\n if (Util.isZero(rotation[2])) {\n cx = pos.x + cx * parent.lx;\n cy = pos.y + cy * parent.ly;\n } else {\n // we must rotate the real length, not normalized length\n const v = new Vector3(cx * parent.lx, cy * parent.ly, cz * parent.lz);\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\n cx = pos.x + v.x;\n cy = pos.y + v.y;\n }\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\n cz = poleHeight + lz / 2 + parent.lz;\n } else {\n cz = pos.z + cz * parent.lz;\n }\n break;\n }\n }\n }\n\n if (pvModel) {\n lz = Math.max(pvModel.thickness, 0.02);\n }\n\n const hx = lx / 2;\n const hy = ly / 2;\n const hz = lz / 2;\n const positionLL = new Vector3(-hx, -hy, hz);\n const positionUL = new Vector3(-hx, hy, hz);\n const positionLR = new Vector3(hx, -hy, hz);\n const positionUR = new Vector3(hx, hy, hz);\n const radialSegmentsPole = elements.length < 100 ? 4 : 2;\n const solarPanel = getElementById(id) as SolarPanelModel;\n\n useEffect(() => {\n if (pvModel) {\n let mx, my;\n if (orientation === Orientation.portrait) {\n mx = Math.max(1, Math.round(lx / pvModel.width));\n my = Math.max(1, Math.round(ly / pvModel.length));\n } else {\n mx = Math.max(1, Math.round(lx / pvModel.length));\n my = Math.max(1, Math.round(ly / pvModel.width));\n }\n solarPanelLinesRef.current = [];\n const dx = lx / mx;\n const dy = ly / my;\n for (let i = 0; i <= mx; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\n } as LineData);\n }\n for (let i = 0; i <= my; i++) {\n solarPanelLinesRef.current.push({\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\n } as LineData);\n }\n }\n }, [orientation, pvModelName, lx, ly, lz]);\n\n useEffect(() => {\n const handlePointerUp = () => {\n useRefStore.getState().setEnableOrbitController(true);\n pointerDown.current = false;\n setShowTiltAngle(false);\n };\n window.addEventListener('pointerup', handlePointerUp);\n return () => {\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n useEffect(() => {\n setFaceUp(Util.isSame(panelNormal, UNIT_VECTOR_POS_Z));\n }, [normal]);\n\n const labelText = useMemo(() => {\n return (\n (solarPanel?.label ? solarPanel.label : i18n.t('shared.SolarPanelElement', lang)) +\n (solarPanel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\n (solarPanel?.label\n ? ''\n : '\\n' +\n i18n.t('word.Coordinates', lang) +\n ': (' +\n cx.toFixed(1) +\n ', ' +\n cy.toFixed(1) +\n ', ' +\n cz.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang))\n );\n }, [solarPanel?.label, locked, language, cx, cy, cz]);\n\n const euler = useMemo(() => {\n // east face in model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_X)) {\n return new Euler(HALF_PI, 0, rotation[2] + HALF_PI, 'ZXY');\n }\n // west face in model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_X)) {\n return new Euler(HALF_PI, 0, rotation[2] - HALF_PI, 'ZXY');\n }\n // north face in the model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Y)) {\n return new Euler(HALF_PI, 0, rotation[2] + Math.PI, 'ZXY');\n }\n // south face in the model coordinate system\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_Y)) {\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\n }\n // top face in model coordinate system\n return new Euler(0, 0, rotation[2], 'ZXY');\n }, [normal, rotation]);\n\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === e.eventObject;\n if (intersected) {\n setHoveredHandle(handle);\n if (handle === MoveHandleType.Top) {\n domElement.style.cursor = 'move';\n } else if (\n handle === RotateHandleType.Lower ||\n handle === RotateHandleType.Upper ||\n handle === RotateHandleType.Tilt\n ) {\n domElement.style.cursor = 'grab';\n } else {\n domElement.style.cursor = 'pointer';\n }\n }\n }\n };\n\n const noHoverHandle = () => {\n setHoveredHandle(null);\n domElement.style.cursor = 'default';\n };\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n const rot = getElementById(parentId)?.rotation[2];\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\n\n const relativeEuler = useMemo(() => {\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\n if (sunDirection.z > 0) {\n switch (trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\n return new Euler(\n Math.atan2(r, rotatedSunDirection.z),\n 0,\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\n 'ZXY',\n );\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), lx < ly ? 0 : HALF_PI, 'XYZ');\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n return new Euler(tiltAngle, 0, Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI, 'ZXY');\n }\n }\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\n }\n return new Euler();\n }, [trackerType, sunDirection, tiltAngle, relativeAzimuth, normal]);\n\n const normalVector = useMemo(() => {\n const v = new Vector3();\n return drawSunBeam\n ? v\n .fromArray(normal)\n .applyEuler(\n new Euler(\n relativeEuler.x,\n relativeEuler.y,\n relativeEuler.z + rotation[2] + (lx < ly ? 0 : HALF_PI),\n lx < ly ? 'ZXY' : 'XYZ',\n ),\n )\n : v;\n }, [drawSunBeam, normal, euler, relativeEuler]);\n\n const poleZ = -poleHeight / 2 - lz / 2;\n\n const poles = useMemo(() => {\n const poleArray: Vector3[] = [];\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\n const sinTilt = 0.5 * Math.sin(tiltAngle);\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\n for (let ix = -poleNx; ix <= poleNx; ix++) {\n for (let iy = -poleNy; iy <= poleNy; iy++) {\n const xi = ix * cosAz - iy * sinAz;\n const yi = ix * sinAz + iy * cosAz;\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\n }\n }\n return poleArray;\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\n\n const baseSize = Math.max(1, (lx + ly) / 16);\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\n const rotateHandleSize = (baseSize * 2) / 3;\n const tiltHandleSize = rotateHandleSize;\n\n const degree = new Array(13).fill(0);\n const [showTiltAngle, setShowTiltAngle] = useState(false);\n\n const texture = useSolarPanelTexture(\n lx,\n ly,\n pvModel,\n orientation,\n solarPanel?.frameColor,\n solarPanel?.backsheetColor,\n );\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\n\n const renderTopTextureMaterial = () => {\n if (showSolarRadiationHeatmap && heatmapTexture) {\n return ;\n }\n if (!texture) return null;\n if (orthographic || solarPanelShininess === 0) {\n return ;\n }\n return (\n \n );\n };\n\n const renderBotTextureMaterial = () => {\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\n return ;\n }\n if (!texture) return null;\n return (\n \n );\n };\n\n return (\n \n \n {/* draw panel */}\n {\n if (e.button === 2) return; // ignore right-click\n selectMe(id, e, ActionType.Select);\n }}\n onContextMenu={(e) => {\n selectMe(id, e, ActionType.Select);\n setCommonStore((state) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n state.contextMenuObjectType = ObjectType.SolarPanel;\n }\n }\n });\n }}\n onPointerOver={(e) => {\n if (e.intersections.length > 0) {\n const intersected = e.intersections[0].object === baseRef.current;\n if (intersected) {\n setHovered(true);\n domElement.style.cursor = 'move';\n }\n }\n }}\n onPointerOut={(e) => {\n setHovered(false);\n domElement.style.cursor = 'default';\n }}\n >\n \n \n \n \n {renderTopTextureMaterial()}\n {renderBotTextureMaterial()}\n \n\n {showSolarRadiationHeatmap &&\n heatmapTexture &&\n solarPanelLinesRef.current &&\n solarPanelLinesRef.current.map((lineData, index) => {\n return (\n \n );\n })}\n\n {/* simulation panel */}\n \n \n \n\n {/* highlight it when it is selected but locked */}\n {selected && locked && (\n \n )}\n\n {/* move & resize handles */}\n {selected && !locked && (\n <>\n {/* draw move handle */}\n {\n hoverHandle(e, MoveHandleType.Top);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n selectMe(id, e, ActionType.Move);\n }}\n >\n \n \n\n {/* draw resize handles */}\n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Lower);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Upper);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Left);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n {\n selectMe(id, e, ActionType.Resize);\n if (resizeHandleLeftRef.current) {\n setCommonStore((state) => {\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\n state.resizeAnchor.copy(anchor);\n });\n }\n }}\n onPointerOver={(e) => {\n hoverHandle(e, ResizeHandleType.Right);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n >\n \n \n \n \n )}\n\n {/*{!selected && }*/}\n \n\n {/* draw rotate handles */}\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && (\n \n {/* rotate handles */}\n \n \n \n )}\n\n {/* draw tilt handles */}\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && Math.abs(poleHeight) > 0.1 && (\n <>\n {/* ring handles */}\n {\n hoverHandle(e, RotateHandleType.Tilt);\n }}\n onPointerOut={(e) => {\n noHoverHandle();\n }}\n onPointerDown={(e) => {\n setShowTiltAngle(true);\n if (hoveredHandle) {\n useRefStore.getState().setEnableOrbitController(false);\n pointerDown.current = true;\n const sp = getElementById(id) as SolarPanelModel;\n oldTiltAngleRef.current = sp.tiltAngle;\n }\n setCommonStore((state) => {\n state.rotateHandleType = RotateHandleType.Tilt;\n });\n }}\n >\n \n \n {showTiltAngle && (\n <>\n {/* intersection plane */}\n {}}\n onPointerUp={(e) => {\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\n const undoableChange = {\n name: 'Set Solar Panel Tilt Angle',\n timestamp: Date.now(),\n oldValue: oldTiltAngleRef.current,\n newValue: newTiltAngleRef.current,\n changedElementId: id,\n changedElementType: ObjectType.SolarPanel,\n undo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.oldValue as number,\n );\n },\n redo: () => {\n updateSolarPanelTiltAngleById(\n undoableChange.changedElementId,\n undoableChange.newValue as number,\n );\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n }}\n onPointerMove={(e) => {\n if (pointerDown.current) {\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 if (tiltHandleRef.current) {\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\n if (intersects.length > 0) {\n const p = intersects[0].point;\n const parent = tiltHandleRef.current.parent;\n if (parent) {\n const ov = parent.position; // rotate point in world coordinate\n const cv = new Vector3().subVectors(p, ov);\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\n const touch = 0.5 * solarPanel.ly * Math.abs(Math.sin(angle)) > solarPanel.poleHeight;\n if (!touch) {\n const wr = relativeAzimuth + rotation[2];\n const sign =\n wr % Math.PI === 0\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\n angle *= sign;\n updateSolarPanelTiltAngleById(id, angle);\n newTiltAngleRef.current = angle;\n }\n }\n }\n }\n }\n }}\n >\n \n \n {/* pointer */}\n \n {/* scale */}\n {degree.map((e, i) => {\n return (\n \n \n \n \n );\n })}\n {/* show current degree */}\n \n \n \n \n )}\n \n )}\n\n {/* draw poles */}\n {poleHeight > 0 &&\n faceUp &&\n poles.map((p, i) => {\n return (\n \n \n \n );\n })}\n\n {/*draw sun beam*/}\n {drawSunBeam && sunDirection.z > 0 && (\n \n \n \n \n \n \n \n \n \n \n )}\n\n {/*draw label */}\n {(hovered || showLabel) && !selected && (\n \n )}\n \n );\n};\n\nexport default React.memo(SolarPanel);\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);\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.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 });\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\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 const groupMasterId = useStore(Selector.groupMasterId);\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 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) {\r\n return;\r\n }\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 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 state.groupMasterId = null;\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 selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n if (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 }\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;\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 && !groupMasterId) {\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 && !groupMasterId) {\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 if (baseGroupRelPosMapRef.current.size > 0) {\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 setElementPosition(grabRef.current!.id, p.x, p.y);\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 setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Lower:\r\n x0 = p.x - sinAngle * hy;\r\n y0 = p.y + cosAngle * hy;\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Left:\r\n x0 = p.x + cosAngle * hx;\r\n y0 = p.y + sinAngle * hx;\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n break;\r\n case MoveHandleType.Right:\r\n x0 = p.x - cosAngle * hx;\r\n y0 = p.y - sinAngle * hx;\r\n setElementPosition(grabRef.current!.id, x0, y0);\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 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.groupMasterId = null;\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.groupMasterId = null;\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.groupMasterId = null;\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.ifNeedListenToAutoDeletion(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 state.groupMasterId = null;\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.groupMasterId = null;\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 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 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.groupMasterId = null;\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.ifNeedListenToAutoDeletion(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.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 updateColor = (value: string) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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.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.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 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.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 {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.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.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.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 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 {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.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 setLz = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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.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 updateAzimuth = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 {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) {\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 updateTexture = (value: FoundationTexture) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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 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) {\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.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 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 {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 needChange = (absorptance: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (apertureWidth: 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.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.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 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 {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 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.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.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 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 {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 needChange = (chimneyHeight: 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.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.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 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 {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 needChange = (chimneyRadius: 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.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.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 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 {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 needChange = (collectorRadius: 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.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.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 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 {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 needChange = (collectorHeight: 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.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.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 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 {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 needChange = (towerHeight: 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.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.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 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 {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 needChange = (towerRadius: 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.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.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 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 {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 needChange = (absorptance: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (transmissivity: 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.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.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 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 {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 needChange = (coefficient: 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.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.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 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 {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 needChange = (efficiency: 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.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.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 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 {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 needChange = (emissivity: 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.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.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 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 {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.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.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 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 {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.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.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.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 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 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 \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.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.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 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.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 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 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 \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.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 setLz = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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.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.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 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 setAzimuth = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 // 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 \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 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) {\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.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 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 {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,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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.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 setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setTexture = (value: PolygonTexture) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setLineStyle = (value: LineStyle) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setLineWidth = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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.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 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 {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-2]:'}\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 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.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.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 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 {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 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.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.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 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 {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 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.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.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.lx);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\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 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 {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 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.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.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 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 {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 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.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.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 if (undoableChangeAll.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\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 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 {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.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 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.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 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 {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 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.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.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 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 {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) {\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 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.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 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 {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 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.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.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 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 {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 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.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.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 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 {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 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.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.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 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 {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","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { ObjectType, Scope } from '../../../types';\nimport i18n from '../../../i18n/i18n';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\nimport { Util } from '../../../Util';\nimport { ZERO_TOLERANCE } from '../../../constants';\n\nconst SolarPanelDcToAcRatioInput = ({ 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 getElementById = useStore(Selector.getElementById);\n const getParent = useStore(Selector.getParent);\n const addUndoable = useStore(Selector.addUndoable);\n const actionScope = useStore(Selector.solarPanelActionScope);\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\n const applyCount = useStore(Selector.applyCount);\n const setApplyCount = useStore(Selector.setApplyCount);\n const revertApply = useStore(Selector.revertApply);\n\n const solarPanel = useStore((state) =>\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\n ) as SolarPanelModel;\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 inputDcToAcRatioRef = useRef(solarPanel?.dcToAcRatio ?? 1);\n\n const lang = { lng: language };\n\n useEffect(() => {\n if (solarPanel) {\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [solarPanel.dcToAcRatio]);\n\n const updateDcToAcRatioById = (id: string, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n break;\n }\n }\n });\n };\n\n const updateDcToAcRatioAboveFoundation = (foundationId: string, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n });\n };\n\n const updateDcToAcRatioOnSurface = (parentId: string, normal: number[] | undefined, ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n let found;\n if (normal) {\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\n } else {\n found = e.parentId === parentId;\n }\n if (found) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n }\n });\n };\n\n const updateDcToAcRatioForAll = (ratio: number) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n (e as SolarPanelModel).dcToAcRatio = ratio;\n }\n }\n });\n };\n\n const onScopeChange = (e: RadioChangeEvent) => {\n setActionScope(e.target.value);\n setUpdateFlag(!updateFlag);\n };\n\n const needChange = (ratio: number) => {\n switch (actionScope) {\n case Scope.AllObjectsOfThisType:\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n break;\n case Scope.AllObjectsOfThisTypeAboveFoundation:\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n break;\n case Scope.AllObjectsOfThisTypeOnSurface:\n const parent = getParent(solarPanel);\n if (parent) {\n const isParentCuboid = parent.type === ObjectType.Cuboid;\n if (isParentCuboid) {\n for (const e of elements) {\n if (\n e.type === ObjectType.SolarPanel &&\n e.parentId === solarPanel.parentId &&\n Util.isIdentical(e.normal, solarPanel.normal) &&\n !e.locked\n ) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n } else {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\n const sp = e as SolarPanelModel;\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n }\n }\n }\n break;\n default:\n if (Math.abs((solarPanel?.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\n return true;\n }\n }\n return false;\n };\n\n const setDcToAcRatio = (value: number) => {\n if (!solarPanel) return;\n if (!needChange(value)) return;\n switch (actionScope) {\n case Scope.AllObjectsOfThisType:\n const oldValuesAll = new Map();\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel) {\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n const undoableChangeAll = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays',\n timestamp: Date.now(),\n oldValues: oldValuesAll,\n newValue: value,\n undo: () => {\n for (const [id, ratio] of undoableChangeAll.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n updateDcToAcRatioForAll(undoableChangeAll.newValue as number);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeAll);\n updateDcToAcRatioForAll(value);\n setApplyCount(applyCount + 1);\n break;\n case Scope.AllObjectsOfThisTypeAboveFoundation:\n if (solarPanel.foundationId) {\n const oldValuesAboveFoundation = new Map();\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n const undoableChangeAboveFoundation = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays Above Foundation',\n timestamp: Date.now(),\n oldValues: oldValuesAboveFoundation,\n newValue: value,\n groupId: solarPanel.foundationId,\n undo: () => {\n for (const [id, ratio] of undoableChangeAboveFoundation.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n if (undoableChangeAboveFoundation.groupId) {\n updateDcToAcRatioAboveFoundation(\n undoableChangeAboveFoundation.groupId,\n undoableChangeAboveFoundation.newValue as number,\n );\n }\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeAboveFoundation);\n updateDcToAcRatioAboveFoundation(solarPanel.foundationId, value);\n setApplyCount(applyCount + 1);\n }\n break;\n case Scope.AllObjectsOfThisTypeOnSurface:\n const parent = getParent(solarPanel);\n if (parent) {\n const oldValuesOnSurface = new Map();\n const isParentCuboid = parent.type === ObjectType.Cuboid;\n if (isParentCuboid) {\n for (const elem of elements) {\n if (\n elem.type === ObjectType.SolarPanel &&\n elem.parentId === solarPanel.parentId &&\n Util.isIdentical(elem.normal, solarPanel.normal)\n ) {\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n } else {\n for (const elem of elements) {\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\n }\n }\n }\n const normal = isParentCuboid ? solarPanel.normal : undefined;\n const undoableChangeOnSurface = {\n name: 'Set DC-AC Ratio for All Solar Panel Arrays on Surface',\n timestamp: Date.now(),\n oldValues: oldValuesOnSurface,\n newValue: value,\n groupId: solarPanel.parentId,\n normal: normal,\n undo: () => {\n for (const [id, ratio] of undoableChangeOnSurface.oldValues.entries()) {\n updateDcToAcRatioById(id, ratio as number);\n }\n },\n redo: () => {\n if (undoableChangeOnSurface.groupId) {\n updateDcToAcRatioOnSurface(\n undoableChangeOnSurface.groupId,\n undoableChangeOnSurface.normal,\n undoableChangeOnSurface.newValue as number,\n );\n }\n },\n } as UndoableChangeGroup;\n addUndoable(undoableChangeOnSurface);\n updateDcToAcRatioOnSurface(solarPanel.parentId, normal, value);\n setApplyCount(applyCount + 1);\n }\n break;\n default:\n // solar panel selected element may be outdated, make sure that we get the latest\n const sp = getElementById(solarPanel.id);\n const oldValue = sp ? (sp as SolarPanelModel).dcToAcRatio ?? 1 : solarPanel.dcToAcRatio ?? 1;\n const undoableChange = {\n name: 'Set Solar Panel Array DC-AC Ratio',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: value,\n changedElementId: solarPanel.id,\n changedElementType: solarPanel.type,\n undo: () => {\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.oldValue as number);\n },\n redo: () => {\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateDcToAcRatioById(solarPanel.id, value);\n setApplyCount(applyCount + 1);\n }\n setUpdateFlag(!updateFlag);\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 close = () => {\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\n setDialogVisible(false);\n };\n\n const cancel = () => {\n close();\n revertApply();\n };\n\n const ok = () => {\n setDcToAcRatio(inputDcToAcRatioRef.current);\n setDialogVisible(false);\n setApplyCount(0);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)}\n \n }\n footer={[\n {\n setDcToAcRatio(inputDcToAcRatioRef.current);\n }}\n >\n {i18n.t('word.Apply', lang)}\n ,\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={close}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {\n inputDcToAcRatioRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={ok}\n />\n
\n [1.0, 2.0]\n
\n {i18n.t('solarPanelMenu.DcToAcSizeRatioExplained', lang)}\n
\n \n \n \n \n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\n \n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\n \n \n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\n \n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\n \n \n \n
\n \n \n );\n};\n\nexport default SolarPanelDcToAcRatioInput;\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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 setReflectance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setAbsorptance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setOpticalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 setThermalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 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.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 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 {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.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 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.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 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 {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.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 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.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 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 {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.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 setReflectance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setAbsorptance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setOpticalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setThermalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setStructureType = (type: ParabolicDishStructureType) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(type)) return;\r\n switch (actionScope) {\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 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 {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.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 setPoleRadius = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 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.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 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.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.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 setReflectance = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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\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.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 setReceiverId = (value: string) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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\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.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 setDrawSunBeam = (value: boolean) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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.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.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 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.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 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 {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.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 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.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 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 {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.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 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.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 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 {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.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 setReflectance = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setDrawSunBeam = (value: boolean) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setTowerId = (value: string) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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.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 setPoleRadius = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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 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 {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 needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 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.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.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 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.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.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.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 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.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 (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.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 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.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 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.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.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 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.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 needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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 needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\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.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 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.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. Institute for Future Intelligence, Inc.\n */\n\nimport { Checkbox, Divider, Menu } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from 'src/i18n/i18n';\nimport { WindowModel } from 'src/models/WindowModel';\nimport { ObjectType } from 'src/types';\nimport { UndoableCheckWindowShutter } from 'src/undo/UndoableCheck';\nimport { useState } from 'react';\nimport WindowShutterColorSelection from './windowShutterColorSelection';\nimport WindowShutterWidthInput from './windowShutterWidthInput';\n\nenum ShutterSide {\n left = 'left',\n right = 'right',\n both = 'both',\n}\n\nconst WindowShutterSubMenu = ({ windowId }: { windowId: string }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const setApplyCount = useStore(Selector.setApplyCount);\n\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\n const [shutterWidthDialogVisible, setShutterWidthDialogVisible] = useState(false);\n\n const lang = { lng: language };\n\n const window = useStore((state) => {\n for (const e of state.elements) {\n if (e.id === windowId) {\n return e as WindowModel;\n }\n }\n return null;\n });\n\n const selectShutter = (checked: boolean, side: ShutterSide) => {\n useStore.getState().set((state) => {\n for (const e of state.elements) {\n if (e.id === windowId) {\n const w = e as WindowModel;\n if (w.shutter) {\n switch (side) {\n case ShutterSide.left:\n w.shutter.showLeft = checked;\n break;\n case ShutterSide.right:\n w.shutter.showRight = checked;\n break;\n case ShutterSide.both:\n w.shutter.showLeft = checked;\n w.shutter.showRight = checked;\n break;\n }\n }\n break;\n }\n }\n });\n };\n\n const addUndoable = (checked: boolean, side: ShutterSide) => {\n let newLeft = window?.shutter?.showLeft;\n let newRight = window?.shutter?.showRight;\n\n if (side === ShutterSide.left) {\n newLeft = checked;\n } else if (side === ShutterSide.right) {\n newRight = checked;\n } else {\n newLeft = checked;\n newRight = checked;\n }\n\n const setWindowShutter = (id: string, show: boolean[]) => {\n useStore.getState().set((state) => {\n for (const e of state.elements) {\n if (e.id === id) {\n const [showLeft, showRight] = show;\n const w = e as WindowModel;\n if (w.shutter) {\n w.shutter.showLeft = showLeft;\n w.shutter.showRight = showRight;\n }\n break;\n }\n }\n });\n };\n\n const undoableCheck = {\n name: `${side} shutter`,\n timestamp: Date.now(),\n selectedElementId: windowId,\n selectedElementType: ObjectType.Window,\n oldShow: [window?.shutter?.showLeft, window?.shutter?.showRight],\n newShow: [newLeft, newRight],\n undo() {\n setWindowShutter(this.selectedElementId, this.oldShow);\n },\n redo() {\n setWindowShutter(this.selectedElementId, this.newShow);\n },\n } as UndoableCheckWindowShutter;\n useStore.getState().addUndoable(undoableCheck);\n };\n\n return (\n <>\n {window?.type === ObjectType.Window && (\n \n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.left);\n selectShutter(checked, ShutterSide.left);\n setCommonStore((state) => {\n state.actionState.windowShutterLeft = checked;\n });\n }}\n >\n {i18n.t('windowMenu.LeftShutter', { lng: language })}\n \n \n\n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.right);\n selectShutter(checked, ShutterSide.right);\n setCommonStore((state) => {\n state.actionState.windowShutterRight = checked;\n });\n }}\n >\n {i18n.t('windowMenu.RightShutter', { lng: language })}\n \n \n\n \n {\n const checked = e.target.checked;\n addUndoable(checked, ShutterSide.both);\n selectShutter(checked, ShutterSide.both);\n setCommonStore((state) => {\n state.actionState.windowShutterLeft = checked;\n state.actionState.windowShutterRight = checked;\n });\n }}\n >\n {i18n.t('windowMenu.BothShutters', { lng: language })}\n \n \n\n \n\n {colorDialogVisible && }\n {\n setApplyCount(0);\n setColorDialogVisible(true);\n }}\n >\n {i18n.t('windowMenu.ShutterColor', lang)} ...\n \n\n {shutterWidthDialogVisible && }\n {\n setApplyCount(0);\n setShutterWidthDialogVisible(true);\n }}\n >\n {i18n.t('windowMenu.ShutterWidth', lang)} ...\n \n \n )}\n \n );\n};\n\nexport default WindowShutterSubMenu;\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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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 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 '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 { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowShutterColorSelection = ({ 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.windowActionScope);\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 windowModel = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(windowModel?.shutter?.color ?? '#808080');\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) {\r\n if (!e.locked) {\r\n const w = e as WindowModel;\r\n if (w.shutter) {\r\n w.shutter.color = color;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateById(id, color);\r\n }\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateById(id, color);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!windowModel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).shutter.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.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel).shutter.color &&\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).shutter.color &&\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?.shutter.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 (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\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).shutter?.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Shutter Color 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 string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldValuesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\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).shutter?.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Shutter Color 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 if (undoableChangeAboveFoundation.groupId) {\r\n updateInMap(\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 updateInMap(oldValuesAboveFoundation, 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 const w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValues.set(e.id, w.shutter.color);\r\n }\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Shutter Color 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 string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateInMap(oldValues, value);\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 oldColor = (updatedWindow ? updatedWindow.tint : windowModel.tint) ?? '#808080';\r\n const undoableChange = {\r\n name: 'Set Shutter Color of Selected window',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\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 state.actionState.windowShutterColor = 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 \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.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowShutterColorSelection;\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 { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowShutterWidthInput = ({ 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?.shutter?.width ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, input: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n const w = e as WindowModel;\r\n if (w.shutter) {\r\n w.shutter.width = input;\r\n }\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.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).shutter.width && !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).shutter.width &&\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).shutter.width &&\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?.shutter.width) {\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.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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValuesAll.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Shutter Width 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 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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValuesAboveFoundation.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Shutter Width 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 w = e as WindowModel;\r\n if (w.shutter) {\r\n oldValues.set(e.id, w.shutter.width);\r\n updateById(w.id, value);\r\n }\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Shutter Width 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.shutter?.width ?? windowModel.shutter?.width ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Window Shutter Width',\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.windowShutterWidth = 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 {i18n.t('word.Range', lang)}: [0, 0.5]\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.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WindowShutterWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport { WindowModel, WindowType } from '../../../models/WindowModel';\r\nimport { Checkbox, Divider, Menu, Radio } from 'antd';\r\nimport i18n from 'src/i18n/i18n';\r\nimport WindowShutterSubMenu from './windowShutterSubMenu';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from 'src/types';\r\nimport WindowItemSelection from './windowItemSelection';\r\nimport WindowNumberInput from './windowNumberInput';\r\nimport { radioStyle } from './wallMenu';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport WindowUValueInput from './windowUValueInput';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport enum WindowDataType {\r\n Color = 'Color',\r\n Tint = 'Tint',\r\n Opacity = 'Opacity',\r\n MullionWidth = 'MullionWidth',\r\n MullionSpacing = 'MullionSpacing',\r\n MullionColor = 'MullionColor',\r\n FrameWidth = 'FrameWidth',\r\n SillWidth = 'SillWidth',\r\n Width = 'Width',\r\n Height = 'Height',\r\n}\r\n\r\ntype ItemSelectionSettingType = {\r\n attributeKey: keyof WindowModel;\r\n};\r\n\r\ntype NumberDialogSettingType = {\r\n attributeKey: keyof WindowModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n unit?: string;\r\n note?: string;\r\n digit?: number;\r\n};\r\n\r\nconst SelectionDialogSettings = {\r\n Tint: { attributeKey: 'tint' },\r\n Color: { attributeKey: 'color' },\r\n MullionColor: { attributeKey: 'mullionColor' },\r\n};\r\n\r\nconst NumberDialogSettings = {\r\n Opacity: {\r\n attributeKey: 'opacity',\r\n range: [0, 0.9],\r\n step: 0.1,\r\n note: 'windowMenu.SolarHeatGainCoefficient',\r\n digit: 1,\r\n },\r\n Width: { attributeKey: 'lx', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n MullionWidth: { attributeKey: 'mullionWidth', range: [0, 0.2], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\r\n MullionSpacing: {\r\n attributeKey: 'mullionSpacing',\r\n range: [0.1, 5],\r\n step: 0.01,\r\n unit: 'word.MeterAbbreviation',\r\n digit: 1,\r\n },\r\n FrameWidth: { attributeKey: 'frameWidth', range: [0.05, 0.2], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\r\n SillWidth: { attributeKey: 'sillWidth', range: [0, 0.5], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\r\n};\r\n\r\nexport const WindowMenu = 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 setApplyCount = useStore(Selector.setApplyCount);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const [dataType, setDataType] = useState(null);\r\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\r\n\r\n const window = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n if (!window) return null;\r\n\r\n const lang = { lng: language };\r\n const parent = window ? getParent(window) : null;\r\n\r\n const updateWindowMullionById = (id: string, mullion: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Window && e.id === id) {\r\n (e as WindowModel).mullion = mullion;\r\n state.selectedElement = e;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateWindowTypeById = (id: string, type: WindowType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Window && e.id === id) {\r\n (e as WindowModel).windowType = type;\r\n state.selectedElement = e;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateWindowFrameById = (id: string, checked: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WindowModel).frame = checked;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateEmptyWindowById = (id: string, empty: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Window) {\r\n (e as WindowModel).empty = empty;\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.Window) {\r\n (e as WindowModel).interior = interior;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const renderCut = () => {\r\n if (!window || window.locked) {\r\n return null;\r\n }\r\n return ;\r\n };\r\n\r\n const renderMenuItem = (dataType: WindowDataType) => {\r\n return (\r\n {\r\n setApplyCount(0);\r\n setDataType(dataType);\r\n }}\r\n >\r\n {i18n.t(`windowMenu.${dataType}`, lang)} ...\r\n \r\n );\r\n };\r\n\r\n const renderMullionSubMenu = () => {\r\n if (!window) return null;\r\n\r\n return (\r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Mullion',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateWindowMullionById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateWindowMullionById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateWindowMullionById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowMullion = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Mullion', { lng: language })}\r\n \r\n \r\n\r\n \r\n\r\n {renderMenuItem(WindowDataType.MullionWidth)}\r\n {renderMenuItem(WindowDataType.MullionSpacing)}\r\n {renderMenuItem(WindowDataType.MullionColor)}\r\n \r\n );\r\n };\r\n\r\n const renderFrameSubMenu = () => {\r\n if (!window) return null;\r\n\r\n return (\r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Frame',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateWindowFrameById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateWindowFrameById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateWindowFrameById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowFrame = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Frame', { lng: language })}\r\n \r\n \r\n\r\n \r\n\r\n {renderMenuItem(WindowDataType.FrameWidth)}\r\n {renderMenuItem(WindowDataType.SillWidth)}\r\n {renderMenuItem(WindowDataType.Color)}\r\n \r\n );\r\n };\r\n\r\n const renderTypeSubMenu = () => {\r\n if (!window) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Window Type',\r\n timestamp: Date.now(),\r\n oldValue: window.windowType,\r\n newValue: e.target.value,\r\n changedElementId: window.id,\r\n changedElementType: window.type,\r\n undo: () => {\r\n updateWindowTypeById(undoableChange.changedElementId, undoableChange.oldValue as WindowType);\r\n },\r\n redo: () => {\r\n updateWindowTypeById(undoableChange.changedElementId, undoableChange.newValue as WindowType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateWindowTypeById(window.id, e.target.value);\r\n // todo: can't use it as wall can't have triangle window.\r\n // setCommonStore((state) => {\r\n // state.actionState.windowType = e.target.value;\r\n // });\r\n }}\r\n >\r\n \r\n {i18n.t('windowMenu.Default', lang)}\r\n \r\n \r\n {i18n.t('windowMenu.Arched', lang)}\r\n \r\n \r\n {i18n.t('windowMenu.Polygonal', lang)}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const renderDialogs = () => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n case WindowDataType.MullionColor:\r\n case WindowDataType.Color: {\r\n const setting = SelectionDialogSettings[dataType] as ItemSelectionSettingType;\r\n if (!setting) return null;\r\n return (\r\n setDataType(null)}\r\n />\r\n );\r\n }\r\n case WindowDataType.Opacity:\r\n case WindowDataType.Width:\r\n case WindowDataType.Height:\r\n case WindowDataType.MullionSpacing:\r\n case WindowDataType.MullionWidth:\r\n case WindowDataType.SillWidth:\r\n case WindowDataType.FrameWidth: {\r\n const setting = NumberDialogSettings[dataType] as NumberDialogSettingType;\r\n if (dataType === WindowDataType.Width) {\r\n setting.range[1] =\r\n parent && window && window.parentType !== ObjectType.Roof\r\n ? 2 * parent.lx * Math.min(Math.abs(0.5 - window.cx), Math.abs(-0.5 - window.cx))\r\n : 100;\r\n } else if (dataType === WindowDataType.Height) {\r\n setting.range[1] =\r\n parent && window && window.parentType !== ObjectType.Roof\r\n ? 2 * parent.lz * Math.min(Math.abs(0.5 - window.cz), Math.abs(-0.5 - window.cz))\r\n : 100;\r\n }\r\n if (!setting) return null;\r\n return (\r\n setDataType(null)}\r\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\r\n note={setting.note ? i18n.t(setting.note, lang) : undefined}\r\n digit={setting.digit ?? 0}\r\n />\r\n );\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {renderCut()}\r\n \r\n\r\n {!window.locked && (\r\n <>\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Empty Window',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateEmptyWindowById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateEmptyWindowById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateEmptyWindowById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowEmpty = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Empty', lang)}\r\n \r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Interior Window',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: window.id,\r\n selectedElementType: window.type,\r\n undo: () => {\r\n updateInteriorById(window.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateInteriorById(window.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateInteriorById(window.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.windowInterior = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('windowMenu.Interior', lang)}\r\n \r\n \r\n {renderMenuItem(WindowDataType.Width)}\r\n {renderMenuItem(WindowDataType.Height)}\r\n {renderMenuItem(WindowDataType.Opacity)}\r\n {renderMenuItem(WindowDataType.Tint)}\r\n {/* u-value has its special UI */}\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 {renderTypeSubMenu()}\r\n {renderMullionSubMenu()}\r\n {renderFrameSubMenu()}\r\n \r\n {renderDialogs()}\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 { 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 WindowItemSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowItemSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowItemSelectionProps) => {\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 = (wId: 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 === wId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: 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 === fId) {\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 undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\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.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 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.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowItemSelection;\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 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.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.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 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.MullionSpacing:\r\n state.actionState.windowMullionSpacing = 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.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.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.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 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.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WindowUValueInput;\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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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.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 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.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.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 console.log('get', useStore.getState().roofActionScope);\r\n switch (useStore.getState().roofActionScope) {\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 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.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.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.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 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.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,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,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=\"","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 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 { QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME } 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: 99;\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 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\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 \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 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","/*\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,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goYERIAtsSMegAABplJREFUWIXFl1tsHFcdxv/nzHV3dnZnzjlzWW+99qatsSiEGkJBIQSiEEyltkpDiqBcKiokhCK1QqilVUxwWlooUpUq5Yk8tA9tJaRUqC0S9BZogdJyCcRBVSCoSRxj2bu+7tqzl7n8eUiceteJbUpaPmledub7/77znaNZDcD/WdLlGjQ0NEROnjjxpUw6XXC8bOuW0tXB0YmJZC0fuRxwIdguAngvApxBhCwg7iAAo5KkfGeyUjm8mvd/aiCfFx/SNP0xCrCFSMpeSaLHIMFtSOA3VCKPxEnyo0xKLwX1xvOXmvGOGujq6rLDZuMBRNhCCTkgqeRoGEZ7CZAeKtHhycnpXwIAFItFqx7UnsYEaDpj3jw6OjrXOYv+t3BH2HeGrfrvkCRziqbtjiG5KgrjpyjQ1ypTsx9bggMAjI6OzlWmZrcDwaPBYu2vrmt/tHPeurfA8/j1uq4/AQQsRdHvJEmsRFH8CCWkIqv6VyfLlV9fyhvUGy+YRmY8iZODRsaYC4L68aV7a26B7/vvi6PWQ4joESoPExI3ME72I6F1VdXvHR8f/9t6F+E4/BAgfkOS1a0TExO/XTVAf79lzFTovgTgsxIhh2RNfqXRaN1FADZKVH5gslJ5er1g12U3YQTfR8C/y5SOtJLkhpmZ2W0AlzgDrsu/MD0lvQiElGSF3o+IcrMRPikBOfnJrZ/etF6453nXOJz9IolhGCS8f2pm9raJqemHKQXP88TWFQbf9z8smHVEcAsdwWddYf9KCPtlzqyoUCh8cL0r7unpyXHODzrc/ocn2HcRsT2YYHsEt59vayCfd3ZGYfMvCeImCaQ74gRvRiJ/c2pqdjuVyOP1erBrPXAh2J5gcf51SpN0yqBbJ6dmHiKkfae1dOYQIvRcIcQGAgBQLBbVYLF6lAJ9KkHYQQkZSZvm906fPl0FAHBd9/1JHD6jp4wPjI2NNS8G9oXYEUF8HwESECrfUy6X/7RqUGYPA5A+CgDQWFy4mwA9VZ6eefDKq/XrAaBRq83/WQg23N/fr5TL5TcB4K2wGXy9c1BBiCuFsA9HkDxMKTlYmZrZvhbcddmtQGAnpXAcfN9PcW6fzefzfW2DC/wqIezDnLNjjsM+XygUrhPcem3p/sDAQMoV7Iec2/90uL2/WCyqq0EBAHry+Y873H5BcAu7PO8WAAAiBBsmSZKrzMx9+6JVCXsHIO6nIM3FmAxIsvLFOG75lJB9COSYLKv3TExMjK4GzufzBUxa+5rN6PZ6vSGrqgJc5DaeOvXv4yC4NeoK9uBa6X2Hf4uz3CnOrIoj2BHXZZ9ay7N7924l7zl3cWZNGkYaCSEIAJg1M9jbW9gEAACO4/Q4gr3kCPZGt+9/ZrWBhULhGkfYb64FPrdqZyfn7FjWzKAsSwgAF67lAWilUjmTNsxHwzC8rlYPXvQEf7K3t/08LAkRxwFgoa+vL3MpcLGr61rX5c826s2f12q1jdXaQhJF8fJHEkIIICYywPn3AEXMtFohzM1X41oQ3FqbD/6Y95z7SqWSudy5eXN2AQCgWq2yTnCpVHJ8zzmwUF/8Q622eOPsXDVptcILDAAASZLANA2qyNIJSUqNvW0uFr9spFMXKqKUopkxUHD7ZJcnvrYcJAT7ve/7H1nWCvie2MO5dTZjpJFS2lb3+Ss20inkzJr2fb53YGAg1Z7+7QDxcpOiyGjlTHQcduQK3/8EAIDD2XNCnHuPF3x/0BHsjVzWRFmWO/0IAJGuaWhbudhz+ePd3d29nc3JnT8sEw3DCObma7GuaduiVPyqy/lPgKBMKG5xXXZb0AhuD+oNaDZbyfmql+pOFEWm6XRK0lTlFVVT9o2NTb4KML0CIgMAEMSlIBf7d5QazSYAIVQy6B1xFIeE0M81mk0IgnonGCRKIW2kqKaqb6ma8oPx8fJjqyzyXIAEYFbTVAijCFqtcGlomwghEIZRtbawqAAATZJE6nguSadTVNfUmqrIj7p+5scjI2fmV4O3zS/4/i4h2EjWzKAkSSv2M5VKYS5rVgGgBR0HTFNVtK0c+i7/WU+P379e6AoNDg6qec+5mzOrbBjpthDLAjSXwLIsYy5rosP564WCP/iOwZ0qlfxuz+E/ZXYu0nUNASDWdf1CA5RSzBhp5Nw+63tiz9DQ0GX5wFkh3/c3uw57KWtm0DQzmM1marquoW3n6r7nHNiwYYN4V8ArgzhfEcz+F2cWOpw9U+zquvY9AS9XsVi0urvzW95z8Lut/wD5YYsvG5lA0wAAAABJRU5ErkJggg==\"","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.groupMasterId = null;\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.groupMasterId = null;\r\n } else {\r\n if (state.selectedElement) {\r\n if (isGroupable(state.selectedElement)) {\r\n state.groupMasterId = Util.getBaseId(state.selectedElement.id);\r\n } else {\r\n const baseId = Util.getBaseId(state.selectedElement.foundationId ?? state.selectedElement.parentId);\r\n state.groupMasterId = baseId;\r\n for (const e of state.elements) {\r\n e.selected = e.id === baseId;\r\n }\r\n state.selectedElementIdSet.clear();\r\n if (baseId) {\r\n state.selectedElementIdSet.add(baseId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElementIdSet.clear();\r\n }\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.groupMasterId = null;\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.clickToAccessCloudTools', 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 { Input, Modal, Space, Table, Typography } from 'antd';\nimport { QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME } 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';\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: 99;\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\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\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 \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 />\n {\n // @ts-ignore\n return a['title'].localeCompare(b['title']);\n }}\n render={(title) => {\n return (\n \n {title}\n \n );\n }}\n onCell={(r) => {\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 setProjectState(r 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 />\n (\n \n {\n confirmDeleteProject(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 setRenameDialogVisible(true);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n const url =\n HOME_URL + '?client=web&userid=' + user.uid + '&project=' + encodeURIComponent(record.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', 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(ProjectListPanel);\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 { usePrimitiveStore } from './stores/commonPrimitive';\nimport * as Selector from './stores/selector';\nimport { Modal } from 'antd';\nimport dayjs from 'dayjs';\nimport 'antd/dist/antd.css';\nimport firebase from 'firebase/app';\nimport 'firebase/auth';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo, showSuccess } from './helpers';\nimport {\n ClassID,\n CloudFileInfo,\n DataColoring,\n Design,\n DesignProblem,\n FirebaseName,\n ModelSite,\n ObjectType,\n ProjectInfo,\n SchoolID,\n User,\n} from './types';\nimport CloudFilePanel from './panels/cloudFilePanel';\nimport Spinner from './components/spinner';\nimport AccountSettingsPanel from './panels/accountSettingsPanel';\nimport i18n from './i18n/i18n';\nimport { ExclamationCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';\nimport { Util } from './Util';\nimport { HOME_URL } from './constants';\nimport ModelsMapWrapper from './modelsMapWrapper';\nimport MainToolBar from './mainToolBar';\nimport SaveCloudFileModal from './saveCloudFileModal';\nimport ModelsGallery from './modelsGallery';\nimport ProjectListPanel from './panels/projectListPanel';\nimport { loadCloudFile } from './cloudFileUtil';\nimport { changeDesignTitles, copyDesign, createDesign, fetchProject, getImageData } from './cloudProjectUtil';\nimport { ProjectUtil } from './panels/ProjectUtil';\n\nexport interface CloudManagerProps {\n viewOnly: boolean;\n canvas?: HTMLCanvasElement | null;\n}\n\nconst useFlag = (flag: boolean, fn: Function, setFlag: () => void) => {\n useEffect(() => {\n if (flag) {\n fn();\n setFlag();\n }\n }, [flag]);\n};\n\nconst CloudManager = ({ viewOnly = false, canvas }: CloudManagerProps) => {\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 latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const address = useStore(Selector.world.address);\n const countryCode = useStore(Selector.world.countryCode);\n const exportContent = useStore(Selector.exportContent);\n const showCloudFilePanel = usePrimitiveStore(Selector.showCloudFilePanel);\n const showProjectListPanel = usePrimitiveStore(Selector.showProjectListPanel);\n const showModelsGallery = usePrimitiveStore(Selector.showModelsGallery);\n const showAccountSettingsPanel = usePrimitiveStore(Selector.showAccountSettingsPanel);\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n const cloudFile = useStore(Selector.cloudFile);\n const saveCloudFileFlag = usePrimitiveStore(Selector.saveCloudFileFlag);\n const modelsMapFlag = usePrimitiveStore(Selector.modelsMapFlag);\n const leaderboardFlag = usePrimitiveStore(Selector.leaderboardFlag);\n const publishOnMapFlag = usePrimitiveStore(Selector.publishOnModelsMapFlag);\n const listCloudFilesFlag = usePrimitiveStore(Selector.listCloudFilesFlag);\n const showCloudFileTitleDialog = useStore(Selector.showCloudFileTitleDialog);\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\n const importContent = useStore(Selector.importContent);\n const createEmptyFile = useStore(Selector.createEmptyFile);\n const changed = usePrimitiveStore(Selector.changed);\n const localContentToImportAfterCloudFileUpdate = useStore(Selector.localContentToImportAfterCloudFileUpdate);\n const peopleModels = useStore(Selector.peopleModels);\n const createProjectFlag = usePrimitiveStore(Selector.createProjectFlag);\n const saveProjectFlag = usePrimitiveStore(Selector.saveProjectFlag);\n const curateDesignToProjectFlag = usePrimitiveStore(Selector.curateDesignToProjectFlag);\n const showProjectsFlag = usePrimitiveStore(Selector.showProjectsFlag);\n const updateProjectsFlag = usePrimitiveStore(Selector.updateProjectsFlag);\n\n const [loading, setLoading] = useState(false);\n const [updateFlag, setUpdateFlag] = useState(false);\n const [cloudFileArray, setCloudFileArray] = useState([]);\n const [projectArray, setProjectArray] = useState([]);\n const [updateProjectArrayFlag, setUpdateProjectArrayFlag] = useState(false);\n const [title, setTitle] = useState(cloudFile ?? 'My Aladdin File');\n const [titleDialogVisible, setTitleDialogVisible] = useState(false);\n const cloudFiles = useRef();\n const myProjects = useRef(); // Not sure why I need to use ref to store this\n const authorModelsRef = useRef>();\n const firstAccountSettings = useRef(true);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\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_DATABASE_URL,\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\n };\n let initialize = firebase.apps.length === 0; // no app, should initialize\n if (firebase.apps.length === 1 && firebase.apps[0].name === FirebaseName.LOG_DATA) {\n initialize = true; // if there is only the logger app, should initialize\n }\n if (initialize) {\n firebase.initializeApp(config);\n } else {\n firebase.app(); // if already initialized, use the default one\n }\n\n // don't enable persistence as we often need to open multiple tabs\n // firebase.firestore().enablePersistence()\n // .catch((err) => {\n // if (err.code === 'failed-precondition') {\n // showWarning('Firestore: Multiple tabs open, persistence can only be enabled in one tab at a time.', 10);\n // } else if (err.code === 'unimplemented') {\n // showWarning('Firestore: The current browser does not support offline persistence, 10');\n // }\n // });\n\n // do not use firebase.auth().currentUser - currentUser might be null because the auth object has not finished initializing.\n // If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.\n firebase.auth().onAuthStateChanged((u) => {\n const params = new URLSearchParams(window.location.search);\n const title = params.get('title');\n if (u) {\n setCommonStore((state) => {\n if (state.user) {\n state.user.uid = u.uid;\n state.user.displayName = u.displayName;\n state.user.email = u.email;\n state.user.photoURL = u.photoURL;\n }\n state.cloudFile = title ?? undefined;\n });\n } else {\n setCommonStore((state) => {\n state.cloudFile = title ?? undefined;\n });\n }\n });\n init();\n window.addEventListener('popstate', handlePopStateEvent);\n return () => {\n window.removeEventListener('popstate', handlePopStateEvent);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handlePopStateEvent = () => {\n if (viewOnly) return;\n const p = new URLSearchParams(window.location.search);\n const userid = p.get('userid');\n const title = p.get('title');\n if (userid && title) {\n openCloudFile(userid, title, true);\n }\n };\n\n useEffect(() => {\n if (cloudFiles.current) {\n const arr: any[] = [];\n cloudFiles.current.forEach((f, i) => {\n arr.push({\n key: i.toString(),\n title: f.fileName,\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\n timestamp: f.timestamp,\n userid: f.userid,\n action: '',\n });\n });\n arr.sort((a, b) => b.timestamp - a.timestamp);\n setCloudFileArray(arr);\n }\n // FIXME: React says that the dependency of the mutable cloudFiles.current is unnecessary,\n // but we need this for the code to work.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cloudFiles.current]);\n\n useEffect(() => {\n if (myProjects.current) {\n const arr: any[] = [];\n myProjects.current.forEach((f, i) => {\n arr.push({\n key: i.toString(),\n owner: f.owner,\n title: f.title,\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\n timestamp: f.timestamp,\n description: f.description,\n dataColoring: f.dataColoring,\n selectedProperty: f.selectedProperty,\n sortDescending: f.sortDescending,\n xAxisNameScatteredPlot: f.xAxisNameScatteredPlot,\n yAxisNameScatteredPlot: f.yAxisNameScatteredPlot,\n dotSizeScatteredPlot: f.dotSizeScatteredPlot,\n thumbnailWidth: f.thumbnailWidth,\n type: f.type,\n designs: f.designs,\n ranges: f.ranges ?? [],\n hiddenParameters: f.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(f.type),\n counter: f.counter,\n action: '',\n });\n });\n arr.sort((a, b) => b.timestamp - a.timestamp);\n setProjectArray(arr);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [myProjects.current, updateProjectArrayFlag]);\n\n // fetch all the models that belong to the current user, including those published under all aliases\n useEffect(() => {\n authorModelsRef.current = new Map();\n if (user.aliases && user.aliases.length > 0) {\n for (const a of user.aliases) {\n if (a !== user.displayName) {\n const m = peopleModels.get(a);\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\n }\n }\n }\n if (user.displayName) {\n const m = peopleModels.get(user.displayName);\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\n }\n }, [peopleModels, user.displayName, user.aliases]);\n\n useFlag(saveCloudFileFlag, updateCloudFile, () => setPrimitiveStore('saveCloudFileFlag', false));\n\n useFlag(modelsMapFlag, fetchModelSitesFn, () => setPrimitiveStore('modelsMapFlag', false));\n\n useFlag(leaderboardFlag, fetchPeopleModelsFn, () => setPrimitiveStore('leaderboardFlag', false));\n\n useFlag(publishOnMapFlag, publishOnModelsMap, () => setPrimitiveStore('publishOnModelsMapFlag', false));\n\n useFlag(createProjectFlag, createNewProject, () => setPrimitiveStore('createProjectFlag', false));\n\n useFlag(saveProjectFlag, saveProjectAs, () => setPrimitiveStore('saveProjectFlag', false));\n\n useFlag(showProjectsFlag, showMyProjectsList, () => setPrimitiveStore('showProjectsFlag', false));\n\n useFlag(updateProjectsFlag, hideMyProjectsList, () => setPrimitiveStore('updateProjectsFlag', false));\n\n useFlag(listCloudFilesFlag, listMyCloudFiles, () => setPrimitiveStore('listCloudFilesFlag', false));\n\n useFlag(curateDesignToProjectFlag, curateDesignToProject, () =>\n setPrimitiveStore('curateDesignToProjectFlag', false),\n );\n\n useEffect(() => {\n setTitleDialogVisible(showCloudFileTitleDialog);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showCloudFileTitleDialogFlag]);\n\n useEffect(() => {\n setTitle(cloudFile ?? 'My Aladdin File');\n }, [cloudFile]);\n\n useEffect(() => {\n if (firstAccountSettings.current) {\n firstAccountSettings.current = false;\n } else {\n saveAccountSettings(user);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user.signFile, user.schoolID, user.classID]);\n\n const init = () => {\n const params = new URLSearchParams(window.location.search);\n const userid = params.get('userid');\n if (userid) {\n const title = params.get('title');\n const project = params.get('project');\n if (project) {\n setLoading(true);\n fetchProject(userid, project, setProjectState).finally(() => {\n setLoading(false);\n });\n if (title) {\n openDesignFile(userid, title);\n }\n } else {\n if (title) {\n openCloudFile(userid, title);\n }\n }\n } else {\n setCommonStore((state) => {\n // make sure that the cloud file state is consistent with the URL\n state.cloudFile = undefined;\n });\n }\n };\n\n const resetToSelectMode = () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n });\n };\n\n const signIn = () => {\n const provider = new firebase.auth.GoogleAuthProvider();\n firebase\n .auth()\n .signInWithPopup(provider)\n .then((result) => {\n setCommonStore((state) => {\n if (result.user) {\n state.user.uid = result.user.uid;\n state.user.email = result.user.email;\n state.user.displayName = result.user.displayName;\n state.user.photoURL = result.user.photoURL;\n registerUser({ ...state.user }).then(() => {\n // ignore\n });\n }\n });\n })\n .catch((error) => {\n if (error.code !== 'auth/popup-closed-by-user' && error.code !== 'auth/cancelled-popup-request') {\n showError(i18n.t('message.CannotSignIn', lang) + ': ' + error);\n }\n });\n resetToSelectMode();\n };\n\n const registerUser = async (user: User): Promise => {\n const firestore = firebase.firestore();\n let signFile = false;\n let noLogging = false;\n let userCount = 0;\n let schoolID = SchoolID.UNKNOWN;\n let classID = ClassID.UNKNOWN;\n let likes: string[] = [];\n let published: string[] = [];\n let aliases: string[] = [];\n const found = await firestore\n .collection('users')\n .get()\n .then((querySnapshot) => {\n userCount = querySnapshot.size;\n for (const doc of querySnapshot.docs) {\n if (doc.id === user.uid) {\n const docData = doc.data();\n signFile = !!docData.signFile;\n noLogging = !!docData.noLogging;\n schoolID = docData.schoolID ? (docData.schoolID as SchoolID) : SchoolID.UNKNOWN;\n classID = docData.classID ? (docData.classID as ClassID) : ClassID.UNKNOWN;\n if (docData.likes) likes = docData.likes;\n if (docData.published) published = docData.published;\n if (docData.aliases) aliases = docData.aliases;\n return true;\n }\n }\n return false;\n });\n if (found) {\n setCommonStore((state) => {\n state.user.signFile = signFile;\n state.user.noLogging = noLogging;\n state.user.schoolID = schoolID;\n state.user.classID = classID;\n state.user.likes = likes;\n state.user.published = published;\n state.user.aliases = aliases;\n });\n usePrimitiveStore.setState((state) => {\n state.userCount = userCount;\n });\n user.signFile = signFile;\n user.noLogging = noLogging;\n user.schoolID = schoolID;\n user.classID = classID;\n user.likes = likes;\n user.published = published;\n user.aliases = aliases;\n } else {\n if (user.uid) {\n firestore\n .collection('users')\n .doc(user.uid)\n .set({\n uid: user.uid,\n signFile: !!user.signFile, // don't listen to WebStorm's suggestion to simplify it\n noLogging: !!user.noLogging,\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\n classID: user.classID ?? ClassID.UNKNOWN,\n since: dayjs(new Date()).format('MM/DD/YYYY hh:mm A'),\n os: Util.getOS(),\n })\n .then(() => {\n showInfo(i18n.t('message.YourAccountWasCreated', lang));\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateAccount', lang) + ': ' + error);\n });\n }\n }\n };\n\n const signOut = () => {\n firebase\n .auth()\n .signOut()\n .then(() => {\n setCommonStore((state) => {\n state.user.uid = null;\n state.user.email = null;\n state.user.displayName = null;\n state.user.photoURL = null;\n state.user.signFile = false;\n state.user.likes = [];\n state.user.published = [];\n state.user.aliases = [];\n state.cloudFile = undefined; // if there is a current cloud file\n });\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = false;\n state.showAccountSettingsPanel = false;\n state.showModelsGallery = false;\n state.showProjectListPanel = false;\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSignOut', lang) + ': ' + error);\n });\n };\n\n const saveAccountSettings = (user: User) => {\n if (user.uid) {\n const firestore = firebase.firestore();\n firestore\n .collection('users')\n .doc(user.uid)\n .update({\n signFile: !!user.signFile,\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\n classID: user.classID ?? ClassID.UNKNOWN,\n })\n .then(() => {\n showInfo(i18n.t('message.YourAccountSettingsWereSaved', lang));\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSaveYourAccountSettings', lang) + ': ' + error);\n });\n }\n };\n\n const fetchModelSites = async () => {\n setLoading(true);\n await firebase\n .firestore()\n .collection('models')\n .get()\n .then((querySnapshot) => {\n const models = new Map>();\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n if (data) {\n const m = new Map();\n for (const k in data) {\n if (!data[k].countryCode) {\n if (data[k].address?.endsWith('USA')) data[k]['countryCode'] = 'US';\n }\n m.set(k, data[k]);\n }\n models.set(doc.id, m);\n }\n });\n setCommonStore((state) => {\n state.modelSites = models;\n });\n return models;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLoadModelsOnMap', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n // get latest submission\n const fetchLatest = async () => {\n await firebase\n .firestore()\n .collection('board')\n .doc('info')\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data && data.latestModel) {\n setCommonStore((state) => {\n // if it has been deleted, don't show\n let existing = false;\n const m = data.latestModel as ModelSite;\n if (m.author) {\n existing = !!state.peopleModels.get(m.author)?.get(Util.getModelKey(m));\n }\n state.latestModelSite = existing ? m : undefined;\n });\n }\n }\n })\n .catch((error) => {\n console.log(error);\n });\n };\n\n const fetchPeopleModels = async () => {\n setLoading(true);\n await firebase\n .firestore()\n .collection('board')\n .doc('people')\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n const peopleModels = new Map>();\n for (const k in data) {\n peopleModels.set(k, new Map(Object.entries(data[k])));\n }\n setCommonStore((state) => {\n state.peopleModels = peopleModels;\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLoadLeaderboard', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const deleteFromModelsMap = (model: ModelSite, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({ [Util.getModelKey(model)]: firebase.firestore.FieldValue.delete() })\n .then(() => {\n showSuccess(i18n.t('message.ModelDeletedFromMap', lang));\n if (successCallback) successCallback();\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteModelFromMap', lang) + ': ' + error);\n });\n // remove the record from the leaderboard\n firebase\n .firestore()\n .collection('board')\n .doc('people')\n .update({\n [(model.author ?? 'Anonymous') + '.' + Util.getModelKey(model)]: firebase.firestore.FieldValue.delete(),\n })\n .then(() => {\n // also remove the cached record\n setCommonStore((state) => {\n if (state.peopleModels) {\n state.peopleModels.delete(Util.getModelKey(model));\n usePrimitiveStore.setState((state) => {\n state.leaderboardFlag = true;\n });\n }\n });\n });\n // remove the record in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update({\n published: firebase.firestore.FieldValue.arrayRemove(model.title),\n })\n .then(() => {\n // also remove the cached record\n setCommonStore((state) => {\n if (state.user && state.user.published) {\n if (state.user.published.includes(model.title)) {\n const index = state.user.published.indexOf(model.title);\n if (index >= 0) {\n state.user.published.splice(index, 1);\n }\n }\n }\n });\n });\n }\n };\n\n const likeModelsMap = (model: ModelSite, like: boolean, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n const modelKey = Util.getModelKey(model);\n // keep or remove a record of like in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update(\n like\n ? {\n likes: firebase.firestore.FieldValue.arrayUnion(modelKey),\n }\n : {\n likes: firebase.firestore.FieldValue.arrayRemove(modelKey),\n },\n )\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\n });\n // increment or decrement the likes counter\n const likeCountPath = modelKey + '.likeCount';\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update(\n like\n ? {\n [likeCountPath]: firebase.firestore.FieldValue.increment(1),\n }\n : {\n [likeCountPath]: firebase.firestore.FieldValue.increment(-1),\n },\n )\n .then(() => {\n if (successCallback) successCallback();\n })\n .catch((error) => {\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\n });\n }\n };\n\n const pinModelsMap = (model: ModelSite, pinned: boolean, successCallback?: Function) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({\n [Util.getModelKey(model) + '.pinned']: pinned,\n })\n .then(() => {\n if (successCallback) successCallback();\n })\n .catch((error) => {\n // ignore\n });\n }\n };\n\n // TODO:\n // unfortunately, this throws an error for users who do not log in\n // because of write access is only granted to registered users who log in.\n const countClicksModelsMap = (model: ModelSite) => {\n // pass if there is no user currently logged in\n if (user && user.uid) {\n firebase\n .firestore()\n .collection('models')\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\n .update({\n [Util.getModelKey(model) + '.clickCount']: firebase.firestore.FieldValue.increment(1),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n // ignore\n });\n }\n };\n\n // fetch owner's projects from the cloud\n const fetchMyProjects = async (silent: boolean) => {\n if (!user.uid) return;\n if (!silent) setLoading(true);\n myProjects.current = await firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .get()\n .then((querySnapshot) => {\n const a: ProjectInfo[] = [];\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n a.push({\n owner: user.uid,\n title: doc.id,\n timestamp: data.timestamp,\n description: data.description,\n dataColoring: data.dataColoring,\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 type: data.type,\n designs: data.designs ?? [],\n ranges: data.ranges ?? [],\n hiddenParameters: data.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(data.type),\n counter: data.counter ?? 0,\n } as ProjectInfo);\n });\n return a;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenYourProjects', lang) + ': ' + error);\n })\n .finally(() => {\n if (!silent) setLoading(false);\n });\n };\n\n const listMyProjects = (show: boolean) => {\n if (user.uid) {\n fetchMyProjects(!show).then(() => {\n if (show) {\n usePrimitiveStore.setState((state) => {\n state.showProjectListPanel = true;\n });\n }\n setUpdateProjectArrayFlag(!updateProjectArrayFlag);\n });\n }\n };\n\n const deleteProject = (title: string) => {\n if (!user.uid) return;\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(title)\n .delete()\n .then(() => {\n if (myProjects.current && user.uid) {\n // also delete the designs of the deleted project\n for (const p of myProjects.current) {\n if (p.title === title && p.designs) {\n for (const d of p.designs) {\n setCommonStore((state) => {\n if (d.title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('designs')\n .doc(d.title)\n .delete()\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n }\n break;\n }\n }\n myProjects.current = myProjects.current.filter((e) => {\n return e.title !== title;\n });\n setUpdateFlag(!updateFlag);\n }\n setCommonStore((state) => {\n if (title === state.projectInfo.title) {\n state.projectInfo.title = null;\n state.projectInfo.description = null;\n state.projectInfo.dataColoring = DataColoring.ALL;\n state.projectInfo.selectedProperty = null;\n state.projectInfo.sortDescending = false;\n state.projectInfo.xAxisNameScatteredPlot = null;\n state.projectInfo.yAxisNameScatteredPlot = null;\n state.projectInfo.dotSizeScatteredPlot = 5;\n state.projectInfo.thumbnailWidth = 200;\n state.projectInfo.counter = 0;\n state.projectInfo.designs = [];\n state.projectInfo.ranges = [];\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\n state.designProjectType = null;\n state.projectView = false;\n }\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteProject', lang) + ': ' + error);\n });\n };\n\n const renameProject = (oldTitle: string, newTitle: string) => {\n // check if the new project title is already taken\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === newTitle) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + newTitle);\n } else {\n if (!user.uid) return;\n const files = firebase.firestore().collection('users').doc(user.uid).collection('projects');\n files\n .doc(oldTitle)\n .get()\n .then((doc) => {\n if (doc && doc.exists) {\n const data = doc.data();\n if (data && user.uid) {\n const newData = { ...data };\n if (data.designs && data.designs.length > 0) {\n const newDesigns: Design[] = changeDesignTitles(newTitle, data.designs) ?? [];\n for (const [i, d] of data.designs.entries()) {\n copyDesign(d.title, newDesigns[i].title, data.owner, user.uid);\n }\n newData.designs = newDesigns;\n setCommonStore((state) => {\n state.projectInfo.designs = newDesigns;\n });\n }\n files\n .doc(newTitle)\n .set(newData)\n .then(() => {\n files\n .doc(oldTitle)\n .delete()\n .then(() => {\n // TODO\n });\n if (myProjects.current) {\n const newArray: ProjectInfo[] = [];\n for (const p of myProjects.current) {\n if (p.title === oldTitle) {\n newArray.push({\n owner: p.owner,\n timestamp: p.timestamp,\n title: newTitle,\n description: p.description,\n type: p.type,\n designs: p.designs,\n ranges: p.ranges ?? null,\n hiddenParameters: p.hiddenParameters,\n counter: p.counter,\n } as ProjectInfo);\n } else {\n newArray.push(p);\n }\n }\n myProjects.current = newArray;\n setUpdateFlag(!updateFlag);\n }\n setCommonStore((state) => {\n if (state.projectInfo.title === oldTitle) {\n state.projectInfo.title = newTitle;\n }\n });\n // TODO\n // change the address field of the browser when the project is currently open\n // const params = new URLSearchParams(window.location.search);\n // if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\n // const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\n // window.history.pushState({}, document.title, newUrl);\n // }\n });\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRenameProject', lang) + ': ' + error);\n });\n }\n });\n };\n\n const setProjectState = (projectInfo: ProjectInfo) => {\n setCommonStore((state) => {\n state.projectInfo = { ...projectInfo };\n state.projectImages.clear();\n state.projectView = true;\n });\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n state.updateProjectsFlag = true;\n });\n };\n\n const openDesignFile = (userid: string, title: string) => {\n if (userid && title) {\n setLoading(true);\n loadCloudFile(userid, title, true, true, viewOnly).finally(() => {\n setLoading(false);\n });\n }\n };\n\n const addDesignToProject = (\n projectType: string,\n projectTitle: string,\n designTitle: string,\n thumbnailWidth: number,\n ) => {\n if (!user.uid || !canvas) return;\n // create a thumbnail image of the design in Base64 format\n // (don't create a PNG and then store in Firebase storage as I can't get the blob data correctly)\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\n const design = createDesign(projectType, designTitle, thumbnail);\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n designs: firebase.firestore.FieldValue.arrayUnion(design),\n counter: firebase.firestore.FieldValue.increment(1),\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectInfo.designs?.push(design);\n // increment the local counter to be consistent with the database counter\n state.projectInfo.counter++;\n // store the project type in the design for linking it with the right type of project later\n state.designProjectType = state.projectInfo.type;\n state.cloudFile = design.title;\n });\n // regardless of where the design is, make a copy on the cloud\n saveToCloudWithoutCheckingExistence(designTitle, true, true);\n })\n .catch((error) => {\n showError(i18n.t('message.CannotAddDesignToProject', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const saveToCloud = (title: string, silent: boolean, checkExistence: boolean) => {\n if (!user.uid) return;\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidTitle', lang) + '.');\n return;\n }\n setLoading(true);\n if (checkExistence) {\n fetchMyCloudFiles().then(() => {\n let exist = false;\n if (cloudFiles.current) {\n for (const p of cloudFiles.current) {\n if (p.fileName === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n Modal.confirm({\n title: i18n.t('message.CloudFileWithTitleExistsDoYouWantToOverwrite', lang),\n icon: ,\n onOk: () => {\n saveToCloudWithoutCheckingExistence(t, silent);\n },\n onCancel: () => {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n saveToCloudWithoutCheckingExistence(t, silent);\n }\n });\n } else {\n saveToCloudWithoutCheckingExistence(t, silent);\n }\n setTitleDialogVisible(false);\n };\n\n const saveToCloudWithoutCheckingExistence = (title: string, silent: boolean, ofProject?: boolean) => {\n if (!user.uid) return;\n try {\n const doc = firebase.firestore().collection('users').doc(user.uid);\n if (doc) {\n if (localContentToImportAfterCloudFileUpdate) {\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n }\n doc\n .collection(ofProject ? 'designs' : 'files')\n .doc(title)\n .set(exportContent())\n .then(() => {\n if (!silent) {\n setCommonStore((state) => {\n state.cloudFile = title;\n });\n usePrimitiveStore.getState().setChanged(false);\n }\n if (localContentToImportAfterCloudFileUpdate) {\n if (localContentToImportAfterCloudFileUpdate === 'CREATE_NEW_FILE') {\n createEmptyFile();\n } else {\n importContent(localContentToImportAfterCloudFileUpdate);\n }\n } else {\n if (!ofProject) {\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(title);\n window.history.pushState({}, document.title, newUrl);\n }\n }\n if (showCloudFilePanel) {\n fetchMyCloudFiles().then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n }\n } catch (error) {\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\n setLoading(false);\n }\n };\n\n const openCloudFileWithSaveReminder = (userid: string, title: string) => {\n if (changed) {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\n icon: ,\n onOk: () => {\n if (cloudFile) {\n saveToCloud(cloudFile, true, false);\n openCloudFile(userid, title);\n } else {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n }\n },\n onCancel: () => {\n openCloudFile(userid, title);\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n openCloudFile(userid, title);\n }\n };\n\n const openCloudFileWithSaveReminderFromMap = (model: ModelSite) => {\n if (changed) {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\n icon: ,\n onOk: () => {\n if (cloudFile) {\n saveToCloud(cloudFile, true, false);\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n } else {\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = true;\n });\n }\n },\n onCancel: () => {\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n },\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n } else {\n openCloudFile(model.userid, model.title);\n countClicksModelsMap(model);\n }\n };\n\n const openCloudFile = (userid: string, title: string, popState?: boolean) => {\n if (userid && title) {\n setLoading(true);\n loadCloudFile(userid, title, false, popState, viewOnly).finally(() => {\n setLoading(false);\n });\n }\n };\n\n const fetchMyCloudFiles = async () => {\n if (!user.uid) return;\n setLoading(true);\n // fetch owner's file information from the cloud\n cloudFiles.current = await firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('files')\n .get()\n .then((querySnapshot) => {\n const a: CloudFileInfo[] = [];\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n a.push({\n timestamp: data.timestamp,\n fileName: doc.id,\n userid: user.uid,\n uuid: data.docid,\n } as CloudFileInfo);\n });\n return a;\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenCloudFolder', lang) + ': ' + error);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n\n const deleteCloudFile = (userid: string, title: string) => {\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('files')\n .doc(title)\n .delete()\n .then(() => {\n setCloudFileArray(\n cloudFileArray.filter((e) => {\n return e.userid !== userid || e.title !== title;\n }),\n );\n setCommonStore((state) => {\n if (title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n };\n\n const renameCloudFile = (userid: string, oldTitle: string, newTitle: string) => {\n const files = firebase.firestore().collection('users').doc(userid).collection('files');\n files\n .doc(oldTitle)\n .get()\n .then((doc) => {\n if (doc && doc.exists) {\n const data = doc.data();\n if (data) {\n files\n .doc(newTitle)\n .set(data)\n .then(() => {\n files\n .doc(oldTitle)\n .delete()\n .then(() => {\n // TODO\n });\n for (const f of cloudFileArray) {\n if (f.userid === userid && f.title === oldTitle) {\n f.title = newTitle;\n break;\n }\n }\n setCloudFileArray([...cloudFileArray]);\n setCommonStore((state) => {\n if (state.cloudFile === oldTitle) {\n state.cloudFile = newTitle;\n }\n });\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') === oldTitle && params.get('userid') === user.uid) {\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\n window.history.pushState({}, document.title, newUrl);\n }\n });\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRenameCloudFile', lang) + ': ' + error);\n });\n };\n\n function updateCloudFile() {\n if (cloudFile) {\n saveToCloud(cloudFile, false, false);\n setTitle(cloudFile);\n }\n }\n\n function fetchModelSitesFn() {\n fetchModelSites().then(() => {\n fetchLatest().then(() => {\n // ignore for now\n });\n });\n }\n\n function fetchPeopleModelsFn() {\n fetchPeopleModels().then(() => {\n fetchLatest().then(() => {\n // ignore for now\n });\n });\n }\n\n function publishOnModelsMap() {\n if (user && user.uid && title) {\n // check if the user is the owner of the current model\n const params = new URLSearchParams(window.location.search);\n if (params.get('userid') === user.uid && params.get('title') === title) {\n const m = {\n latitude,\n longitude,\n address: address ?? null,\n countryCode: countryCode ?? null,\n type: useStore.getState().modelType,\n author: useStore.getState().modelAuthor ?? user.displayName,\n userid: user.uid,\n title,\n label: useStore.getState().modelLabel,\n description: useStore.getState().modelDescription,\n timeCreated: Date.now(),\n } as ModelSite;\n const modelKey = Util.getModelKey(m);\n const collection = firebase.firestore().collection('models');\n if (collection) {\n // first we upload a thumbnail of the model to Firestore Cloud Storage\n const storageRef = firebase.storage().ref();\n if (canvas) {\n const thumbnail = Util.resizeCanvas(canvas, 200);\n thumbnail.toBlob((blob) => {\n if (blob) {\n const metadata = { contentType: 'image/png' };\n const uploadTask = storageRef.child('images/' + modelKey + '.png').put(blob, metadata);\n // Listen for state changes, errors, and completion of the upload.\n uploadTask.on(\n firebase.storage.TaskEvent.STATE_CHANGED,\n (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n if (progress > 0) {\n showInfo(i18n.t('word.Upload', lang) + ': ' + progress + '%');\n }\n },\n (error) => {\n showError('Storage: ' + error);\n },\n () => {\n uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {\n const m2 = { ...m, thumbnailUrl: downloadURL } as ModelSite;\n // after we get a download URL for the thumbnail image, we then go on to upload other data\n const document = collection.doc(Util.getLatLngKey(latitude, longitude));\n document\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data && data[modelKey]) {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.UpdatedOnModelsMap', lang) + '.');\n });\n } else {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\n });\n }\n } else {\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\n });\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotPublishModelOnMap', lang) + ': ' + error);\n });\n // add to the leaderboard\n firebase\n .firestore()\n .collection('board')\n .doc('people')\n .update({\n [(m2.author ?? 'Anonymous') + '.' + Util.getModelKey(m2)]: m2,\n })\n .then(() => {\n // update the cache\n setCommonStore((state) => {\n if (state.peopleModels) {\n const models = state.peopleModels.get(m2.author ?? 'Anonymous');\n if (models) {\n models.set(Util.getModelKey(m2), m2);\n }\n }\n });\n });\n // notify info\n firebase\n .firestore()\n .collection('board')\n .doc('info')\n .set({ latestModel: m2 }, { merge: true })\n .then(() => {\n // TODO\n });\n });\n },\n );\n }\n });\n }\n }\n // keep a record of the published model in the user's account\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .update(\n useStore.getState().modelAuthor === user.displayName\n ? {\n published: firebase.firestore.FieldValue.arrayUnion(title),\n }\n : {\n published: firebase.firestore.FieldValue.arrayUnion(title),\n aliases: firebase.firestore.FieldValue.arrayUnion(useStore.getState().modelAuthor),\n },\n )\n .then(() => {\n // update the cache\n setCommonStore((state) => {\n if (state.user) {\n if (!state.user.published) state.user.published = [];\n if (!state.user.published.includes(title)) {\n state.user.published.push(title);\n }\n if (!state.user.aliases) state.user.aliases = [];\n if (\n state.modelAuthor &&\n !state.user.aliases.includes(state.modelAuthor) &&\n state.modelAuthor !== user.displayName\n ) {\n state.user.aliases.push(state.modelAuthor);\n }\n }\n });\n });\n }\n }\n }\n\n function createNewProject() {\n if (!user || !user.uid) return;\n const title = usePrimitiveStore.getState().projectTitle;\n if (!title) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n // check if the project title is already used\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\n } else {\n if (user && user.uid) {\n const type = usePrimitiveStore.getState().projectType ?? DesignProblem.SOLAR_PANEL_ARRAY;\n const description = usePrimitiveStore.getState().projectDescription ?? null;\n const timestamp = new Date().getTime();\n const counter = 0;\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(t)\n .set({\n owner: user.uid,\n timestamp,\n type,\n description,\n counter,\n designs: [],\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(type),\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectView = true;\n // update the local copy as well\n state.projectInfo.owner = user.uid;\n state.projectInfo.type = type;\n state.projectInfo.title = title;\n state.projectInfo.description = description;\n state.projectInfo.counter = 0;\n state.projectInfo.dataColoring = DataColoring.ALL;\n state.projectInfo.selectedProperty = null;\n state.projectInfo.sortDescending = false;\n state.projectInfo.xAxisNameScatteredPlot = null;\n state.projectInfo.yAxisNameScatteredPlot = null;\n state.projectInfo.dotSizeScatteredPlot = 5;\n state.projectInfo.thumbnailWidth = 200;\n state.projectInfo.designs = [];\n state.projectInfo.ranges = [];\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\n })\n .finally(() => {\n // if the project list panel is open, update it\n if (showProjectListPanel) {\n fetchMyProjects(false).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n setLoading(false);\n });\n }\n }\n });\n }\n\n function saveProjectAs() {\n if (!user || !user.uid) return;\n const title = usePrimitiveStore.getState().projectTitle;\n if (!title) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n const t = title.trim();\n if (t.length === 0) {\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\n return;\n }\n // check if the project title is already taken\n fetchMyProjects(false).then(() => {\n let exist = false;\n if (myProjects.current) {\n for (const p of myProjects.current) {\n if (p.title === t) {\n exist = true;\n break;\n }\n }\n }\n if (exist) {\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\n } else {\n if (user && user.uid) {\n const designs = useStore.getState().projectInfo.designs;\n if (designs) {\n const type = usePrimitiveStore.getState().projectType;\n const description = usePrimitiveStore.getState().projectDescription;\n const owner = useStore.getState().projectInfo.owner;\n const timestamp = new Date().getTime();\n const counter = useStore.getState().projectInfo.counter;\n const dataColoring = useStore.getState().projectInfo.dataColoring ?? null;\n const selectedProperty = useStore.getState().projectInfo.selectedProperty ?? null;\n const sortDescending = !!useStore.getState().projectInfo.sortDescending;\n const xAxisNameScatteredPlot = useStore.getState().projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\n const yAxisNameScatteredPlot = useStore.getState().projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\n const dotSizeScatteredPlot = useStore.getState().projectInfo.dotSizeScatteredPlot ?? 5;\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\n const newDesigns: Design[] = changeDesignTitles(t, designs) ?? [];\n for (const [i, d] of designs.entries()) {\n copyDesign(d.title, newDesigns[i].title, owner, user.uid);\n }\n const projectImages = useStore.getState().projectImages;\n if (projectImages && projectImages.size > 0) {\n for (const [i, d] of designs.entries()) {\n const image = projectImages.get(d.title);\n if (image) {\n newDesigns[i].thumbnail = getImageData(image);\n }\n }\n firebase\n .firestore()\n .collection('users')\n .doc(user.uid)\n .collection('projects')\n .doc(t)\n .set({\n owner: user.uid,\n timestamp,\n type,\n description,\n counter,\n dataColoring,\n selectedProperty,\n sortDescending,\n xAxisNameScatteredPlot,\n yAxisNameScatteredPlot,\n dotSizeScatteredPlot,\n thumbnailWidth,\n designs: newDesigns,\n ranges: useStore.getState().projectInfo.ranges ?? null,\n hiddenParameters: useStore.getState().projectInfo.hiddenParameters,\n })\n .then(() => {\n setCommonStore((state) => {\n state.projectView = true;\n state.projectInfo.owner = user.uid;\n state.projectInfo.type = type;\n state.projectInfo.title = title;\n state.projectInfo.description = description;\n state.projectInfo.designs = newDesigns;\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\n })\n .finally(() => {\n if (showProjectListPanel) {\n fetchMyProjects(false).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n setLoading(false);\n });\n }\n }\n }\n }\n });\n }\n\n function curateDesignToProject() {\n const projectOwner = useStore.getState().projectInfo.owner;\n if (user.uid !== projectOwner) {\n showInfo(i18n.t('message.CannotAddDesignToProjectOwnedByOthers', lang));\n } else {\n const projectTitle = useStore.getState().projectInfo.title;\n if (projectTitle) {\n setLoading(true);\n const projectType = useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY;\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\n const counter = useStore.getState().projectInfo.counter ?? 0;\n addDesignToProject(projectType, projectTitle, projectTitle + ' ' + counter, thumbnailWidth);\n }\n }\n }\n\n function listMyCloudFiles() {\n if (!user.uid) return;\n fetchMyCloudFiles().then(() => {\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = true;\n });\n });\n }\n\n function showMyProjectsList() {\n listMyProjects(true);\n }\n\n function hideMyProjectsList() {\n listMyProjects(false);\n setUpdateFlag(!updateFlag);\n }\n\n return viewOnly ? (\n <>\n {openModelsMap && (\n \n )}\n \n ) : (\n <>\n {loading && }\n loading}\n setTitle={setTitle}\n getTitle={() => title}\n setTitleDialogVisible={setTitleDialogVisible}\n isTitleDialogVisible={() => titleDialogVisible}\n />\n \n {showCloudFilePanel && cloudFiles.current && (\n \n )}\n {showProjectListPanel && myProjects.current && (\n \n )}\n {showModelsGallery && (\n {\n setPrimitiveStore('showModelsGallery', false);\n authorModelsRef.current = undefined;\n }}\n />\n )}\n {showAccountSettingsPanel && }\n {openModelsMap && (\n \n )}\n \n );\n};\n\nexport default React.memo(CloudManager);\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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { ActionInfo, ObjectType } from './types';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { UndoableDelete } from './undo/UndoableDelete';\nimport { UndoablePaste } from './undo/UndoablePaste';\nimport { UndoableCheck } from './undo/UndoableCheck';\nimport { UndoableResetView } from './undo/UndoableResetView';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { UndoableMoveInX } from './undo/UndoableMoveInX';\nimport { UndoableMoveInY } from './undo/UndoableMoveInY';\nimport KeyboardEventHandler from 'react-keyboard-event-handler';\nimport { WallModel } from './models/WallModel';\nimport { useRefStore } from './stores/commonRef';\nimport { SolarPanelModel } from './models/SolarPanelModel';\nimport { Util } from './Util';\nimport { ElementModel } from './models/ElementModel';\nimport { GRID_RATIO, GROUND_ID, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\nimport { RoofUtil } from './views/roof/RoofUtil';\nimport { RoofModel } from './models/RoofModel';\nimport { spBoundaryCheck, spCollisionCheck } from './views/roof/roofRenderer';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { debounce } from 'lodash';\n\nexport interface KeyboardListenerProps {\n canvas?: HTMLCanvasElement | null;\n set2DView: (selected: boolean) => void;\n setNavigationView: (selected: boolean) => void;\n resetView: () => void;\n zoomView: (scale: number) => void;\n}\n\nconst AutoDeletionListener = React.memo(() => {\n const setCommonStore = useStore(Selector.set);\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\n const addUndoable = useStore(Selector.addUndoable);\n\n const listenToAutoDeletionByDeleteRef = useRef(false);\n const listenToAutoDeletionByCutRef = useRef(false);\n\n useStore(Selector.autoDeletedRoof);\n useStore(Selector.autoDeletedChild);\n\n useEffect(() => {\n useRefStore.setState((state) => {\n state.listenToAutoDeletionByDeleteRef = listenToAutoDeletionByDeleteRef;\n state.listenToAutoDeletionByCutRef = listenToAutoDeletionByCutRef;\n });\n }, []);\n\n const handleUndoAutoDeletion = debounce(() => {\n const selectedElementId = usePrimitiveStore.getState().selectedElementId;\n if (!selectedElementId) return;\n\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\n if (!autoDeletedElements) return;\n\n const manualDeletedElements = useStore.getState().deletedElements;\n const manualCutElements = useStore.getState().elementsToPaste;\n\n const listenToAutoDeletionByCut = useRefStore.getState().listenToAutoDeletionByCutRef?.current;\n const listenToAutoDeletionByDelete = useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\n\n let combined: ElementModel[] = [];\n let undoName: string = '';\n if (listenToAutoDeletionByCut) {\n useRefStore.getState().setListenToAutoDeletionByCut(false);\n combined = [...manualCutElements, ...autoDeletedElements];\n undoName = 'Cut';\n } else if (listenToAutoDeletionByDelete) {\n useRefStore.getState().setListenToAutoDeletionByDelete(false);\n combined = [...manualDeletedElements, ...autoDeletedElements];\n undoName = 'Delete';\n }\n\n const undoableDelete = {\n name: undoName,\n timestamp: Date.now(),\n deletedElements: [...combined],\n selectedElementId: selectedElementId,\n undo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length > 0) {\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\n }\n if (wall.rightJoints.length > 0) {\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\n }\n }\n setCommonStore((state) => {\n state.elements.push(...deletedElements);\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n });\n },\n redo: () => {\n if (undoableDelete.deletedElements.length === 0) return;\n\n const set = new Set(undoableDelete.deletedElements.map((e) => e.id));\n setCommonStore((state) => {\n state.elements = state.elements.filter((e) => !set.has(e.id));\n const deletedRoof = undoableDelete.deletedElements.find((e) => e.type === ObjectType.Roof);\n if (deletedRoof) {\n state.deletedRoofId = deletedRoof.id;\n }\n });\n },\n } as UndoableDelete;\n addUndoable(undoableDelete);\n\n setCommonStore((state) => {\n state.deletedRoofId = null;\n state.autoDeletedRoof = null;\n state.autoDeletedChild = null;\n });\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', null);\n }, 50);\n\n const listenToAutoDeletion =\n useRefStore.getState().listenToAutoDeletionByCutRef?.current ||\n useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\n\n if (listenToAutoDeletion && useStore.getState().getAutoDeletedElements()) {\n handleUndoAutoDeletion();\n }\n\n return null;\n});\n\nconst handleKeys = [\n 'left',\n 'up',\n 'right',\n 'down',\n 'shift+left',\n 'shift+up',\n 'shift+right',\n 'shift+down',\n 'ctrl+shift+left',\n 'ctrl+shift+up',\n 'ctrl+shift+right',\n 'ctrl+shift+down',\n 'meta+shift+left',\n 'meta+shift+up',\n 'meta+shift+right',\n 'meta+shift+down',\n 'ctrl+f',\n 'meta+f',\n 'ctrl+o',\n 'meta+o',\n 'ctrl+s',\n 'meta+s',\n 'ctrl+c',\n 'meta+c',\n 'ctrl+x',\n 'meta+x',\n 'ctrl+v',\n 'meta+v',\n 'ctrl+[',\n 'meta+[',\n 'ctrl+]',\n 'meta+]',\n 'ctrl+z',\n 'meta+z',\n 'ctrl+y',\n 'meta+y',\n 'ctrl+m',\n 'meta+m',\n 'ctrl+u', // navigation controls\n 'meta+u',\n 'ctrl+b',\n 'meta+b',\n 'shift',\n 'esc',\n 'ctrl+home',\n 'ctrl+alt+h',\n 'ctrl+shift+o',\n 'meta+shift+o',\n 'ctrl+shift+s',\n 'meta+shift+s',\n 'delete',\n 'backspace',\n 'alt+backspace',\n 'f2',\n 'f4',\n 'ctrl',\n];\n\nconst KeyboardListener = ({ canvas, set2DView, setNavigationView, resetView, zoomView }: KeyboardListenerProps) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const selectNone = useStore(Selector.selectNone);\n const language = useStore(Selector.language);\n const undoManager = useStore(Selector.undoManager);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getElementById = useStore(Selector.getElementById);\n const copyElementById = useStore(Selector.copyElementById);\n const removeElementById = useStore(Selector.removeElementById);\n const pasteElements = useStore(Selector.pasteElementsByKey);\n const getParent = useStore(Selector.getParent);\n const updateElementCxById = useStore(Selector.updateElementCxById);\n const updateElementCyById = useStore(Selector.updateElementCyById);\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\n const setEnableFineGrid = useStore(Selector.setEnableFineGrid);\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\n const groupMasterId = useStore(Selector.groupMasterId);\n\n const moveStepAbsolute = 0.1;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const removeElement = (elemId: string, cut: boolean) => {\n if (canvas) {\n canvas.style.cursor = 'default'; // if an element is deleted but the cursor is not default\n }\n return removeElementById(elemId, cut);\n };\n\n const toggle2DView = () => {\n if (useStore.getState().viewState.navigationView) return;\n const undoableCheck = {\n name: 'Set 2D View',\n timestamp: Date.now(),\n checked: !orthographic,\n undo: () => {\n set2DView(!undoableCheck.checked);\n },\n redo: () => {\n set2DView(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n set2DView(!orthographic);\n setCommonStore((state) => {\n state.viewState.autoRotate = false;\n });\n };\n\n const toggleNatigationView = () => {\n if (orthographic) return;\n const undoableCheck = {\n name: 'Set Navigation View',\n timestamp: Date.now(),\n checked: !useStore.getState().viewState.navigationView,\n undo: () => {\n setNavigationView(!undoableCheck.checked);\n },\n redo: () => {\n setNavigationView(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setNavigationView(!useStore.getState().viewState.navigationView);\n setCommonStore((state) => {\n state.viewState.autoRotate = false;\n });\n };\n\n const toggleAutoRotate = () => {\n if (orthographic) return;\n const undoableCheck = {\n name: 'Auto Rotate',\n timestamp: Date.now(),\n checked: !useStore.getState().viewState.autoRotate,\n undo: () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.autoRotate = !state.viewState.autoRotate;\n });\n };\n\n const isNewPositionOk = (elem: ElementModel, cx: number, cy: number) => {\n const clone = JSON.parse(JSON.stringify(elem)) as ElementModel;\n clone.cx = cx;\n clone.cy = cy;\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType === ObjectType.Roof) {\n if (elem.parentId && elem.foundationId) {\n const roof = getElementById(elem.parentId) as RoofModel;\n const foundation = getElementById(elem.foundationId);\n if (roof && foundation) {\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(clone as SolarPanelModel, foundation);\n if (\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\n !spCollisionCheck(clone as SolarPanelModel, foundation, solarPanelVertices)\n ) {\n return false;\n }\n }\n }\n return true;\n }\n if (overlapWithSibling(clone)) {\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\n return false;\n }\n if (clone.type === ObjectType.SolarPanel) {\n const parent = getParent(elem);\n if (parent && !Util.isSolarCollectorWithinHorizontalSurface(clone as SolarPanelModel, parent)) {\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\n return false;\n }\n }\n return true;\n };\n\n const moveLeft = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = -moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = -moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = -moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLx = selectedElement.lx / (2 * parent.lx);\n const x = Math.max(-0.5 + halfLx, selectedElement.cx - moveStepAbsolute / parent.lx);\n displacement = x - selectedElement.cx;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = -moveStepAbsolute / parent.lx;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveLeft = {\n name: 'Move Left',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx - undoableMoveLeft.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx + undoableMoveLeft.displacement);\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveLeft);\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = -moveStepAbsolute * scale;\n const undoableMoveAllLeft = {\n name: 'Move All Left',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx - undoableMoveAllLeft.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + undoableMoveAllLeft.displacement);\n }\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveAllLeft);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + displacement);\n }\n }\n }\n }\n };\n\n const moveRight = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLx = parent ? selectedElement.lx / (2 * parent.lx) : 0;\n const x = Math.min(0.5 - halfLx, selectedElement.cx + moveStepAbsolute / parent.lx);\n displacement = x - selectedElement.cx;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = moveStepAbsolute / parent.lx;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveRight = {\n name: 'Move Right',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx - undoableMoveRight.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\n if (elem) {\n updateElementCxById(elem.id, elem.cx + undoableMoveRight.displacement);\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveRight);\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = moveStepAbsolute * scale;\n const undoableMoveAllRight = {\n name: 'Move All Right',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx - undoableMoveAllRight.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + undoableMoveAllRight.displacement);\n }\n }\n },\n } as UndoableMoveInX;\n addUndoable(undoableMoveAllRight);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCxById(e.id, e.cx + displacement);\n }\n }\n }\n }\n };\n\n const moveUp = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\n const y = Math.min(0.5 - halfLy, selectedElement.cy + moveStepAbsolute / parent.ly);\n displacement = y - selectedElement.cy;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = moveStepAbsolute / parent.ly;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveUp = {\n name: 'Move Up',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy - undoableMoveUp.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy + undoableMoveUp.displacement);\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveUp);\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = moveStepAbsolute * scale;\n const undoableMoveAllUp = {\n name: 'Move All Up',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy - undoableMoveAllUp.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + undoableMoveAllUp.displacement);\n }\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveAllUp);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + displacement);\n }\n }\n }\n }\n };\n\n const moveDown = (scale: number) => {\n if (orthographic) {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n let displacement = 0;\n switch (selectedElement.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid: {\n displacement = -moveStepAbsolute;\n if (groupMasterId === selectedElement.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n break;\n }\n case ObjectType.Tree:\n case ObjectType.Flower:\n case ObjectType.Human: {\n displacement = -moveStepAbsolute;\n break;\n }\n case ObjectType.Wall: {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\n displacement = -moveStepAbsolute;\n }\n break;\n }\n case ObjectType.Sensor: {\n const parent = getParent(selectedElement);\n if (parent) {\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\n const y = Math.max(-0.5 + halfLy, selectedElement.cy - moveStepAbsolute / parent.ly);\n displacement = y - selectedElement.cy;\n }\n break;\n }\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicDish:\n case ObjectType.ParabolicTrough:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat: {\n const parent = getParent(selectedElement);\n if (parent) {\n displacement = -moveStepAbsolute / parent.ly;\n }\n break;\n }\n }\n if (displacement !== 0) {\n let accept = true;\n // for the time being, we deal with solar panels only\n if (selectedElement.type === ObjectType.SolarPanel) {\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\n }\n if (accept) {\n displacement *= scale;\n const undoableMoveDown = {\n name: 'Move Down',\n timestamp: Date.now(),\n displacement: displacement,\n movedElementId: selectedElement.id,\n movedElementType: selectedElement.type,\n undo: () => {\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy - undoableMoveDown.displacement);\n }\n },\n redo: () => {\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\n if (elem) {\n updateElementCyById(elem.id, elem.cy + undoableMoveDown.displacement);\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveDown);\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\n }\n }\n } else {\n // if no element is selected, move everything\n const displacement = -moveStepAbsolute * scale;\n const undoableMoveAllDown = {\n name: 'Move All Down',\n timestamp: Date.now(),\n displacement: displacement,\n undo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy - undoableMoveAllDown.displacement);\n }\n }\n },\n redo: () => {\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + undoableMoveAllDown.displacement);\n }\n }\n },\n } as UndoableMoveInY;\n addUndoable(undoableMoveAllDown);\n for (const e of useStore.getState().elements) {\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\n updateElementCyById(e.id, e.cy + displacement);\n }\n }\n }\n }\n };\n\n const setMultiSelectionMode = (b: boolean) => {\n useStore.getState().set((state) => {\n state.multiSelectionsMode = b;\n });\n };\n\n const handleKeyDown = (key: string) => {\n const selectedElement = getSelectedElement();\n const step = 1;\n switch (key) {\n case 'left':\n moveLeft(step);\n break;\n case 'shift+left':\n moveLeft(step / GRID_RATIO);\n break;\n case 'ctrl+shift+left':\n case 'meta+shift+left':\n moveLeft(step * GRID_RATIO);\n break;\n case 'right':\n moveRight(step);\n break;\n case 'shift+right':\n moveRight(step / GRID_RATIO);\n break;\n case 'ctrl+shift+right':\n case 'meta+shift+right':\n moveRight(step * GRID_RATIO);\n break;\n case 'down':\n moveDown(step);\n break;\n case 'shift+down':\n moveDown(step / GRID_RATIO);\n break;\n case 'ctrl+shift+down':\n case 'meta+shift+down':\n moveDown(step * GRID_RATIO);\n break;\n case 'up':\n moveUp(step);\n break;\n case 'shift+up':\n moveUp(step / GRID_RATIO);\n break;\n case 'ctrl+shift+up':\n case 'meta+shift+up':\n moveUp(step * GRID_RATIO);\n break;\n case 'ctrl+[':\n case 'meta+[': // for Mac\n zoomView(0.9);\n break;\n case 'ctrl+]':\n case 'meta+]': // for Mac\n zoomView(1.1);\n break;\n case 'ctrl+c':\n case 'meta+c': // for Mac\n if (selectedElement && selectedElement.type !== ObjectType.Roof) {\n copyElementById(selectedElement.id);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Copy',\n timestamp: new Date().getTime(),\n elementId: selectedElement.id,\n elementType: selectedElement.type,\n } as ActionInfo;\n });\n }\n }\n break;\n case 'ctrl+x':\n case 'meta+x': // for Mac\n if (!selectedElement || selectedElement.type === ObjectType.Roof) break;\n if (selectedElement.locked) {\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\n } else {\n const cutElements = removeElement(selectedElement.id, true);\n if (cutElements.length === 0) break;\n\n if (Util.ifNeedListenToAutoDeletion(selectedElement)) {\n useRefStore.getState().setListenToAutoDeletionByCut(true);\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\n } else {\n const undoableCut = {\n name: 'Cut',\n timestamp: Date.now(),\n deletedElements: cutElements,\n selectedElementId: selectedElement.id,\n undo: () => {\n const cutElements = undoableCut.deletedElements;\n if (cutElements.length === 0) return;\n\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\n if (!selectedElement) return;\n\n setCommonStore((state) => {\n state.elements.push(...cutElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(selectedElement.id);\n state.selectedElement = selectedElement;\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n let leftWallId: string | null = null;\n let rightWallId: string | null = null;\n if (wall.leftJoints.length > 0) {\n leftWallId = wall.leftJoints[0];\n }\n if (wall.rightJoints.length > 0) {\n rightWallId = wall.rightJoints[0];\n }\n if (leftWallId || rightWallId) {\n for (const e of state.elements) {\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\n (e as WallModel).rightJoints[0] = wall.id;\n }\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\n (e as WallModel).leftJoints[0] = wall.id;\n }\n }\n }\n }\n });\n },\n redo: () => {\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\n removeElement(undoableCut.deletedElements[0].id, true);\n }\n },\n } as UndoableDelete;\n addUndoable(undoableCut);\n }\n }\n break;\n case 'ctrl+v':\n case 'meta+v': // for Mac\n const pastedElements = pasteElements();\n if (pastedElements.length > 0) {\n const undoablePaste = {\n name: 'Paste by Key',\n timestamp: Date.now(),\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\n undo: () => {\n for (const elem of undoablePaste.pastedElements) {\n removeElementById(elem.id, false);\n }\n },\n redo: () => {\n setCommonStore((state) => {\n state.elements.push(...undoablePaste.pastedElements);\n state.selectedElement = undoablePaste.pastedElements[0];\n });\n },\n } as UndoablePaste;\n addUndoable(undoablePaste);\n }\n break;\n case 'ctrl+alt+h': // for Mac and Chrome OS\n case 'ctrl+home':\n if (!orthographic) {\n const cameraPosition = useStore.getState().viewState.cameraPosition;\n const panCenter = useStore.getState().viewState.panCenter;\n\n // if not already reset\n if (\n cameraPosition[0] !== cameraPosition[1] ||\n cameraPosition[1] !== cameraPosition[2] ||\n cameraPosition[0] !== cameraPosition[2] ||\n panCenter[0] !== 0 ||\n panCenter[1] !== 0 ||\n panCenter[2] !== 0\n ) {\n const undoableResetView = {\n name: 'Reset View',\n timestamp: Date.now(),\n oldCameraPosition: [...cameraPosition],\n oldPanCenter: [...panCenter],\n undo: () => {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n orbitControlsRef.current.object.position.set(\n undoableResetView.oldCameraPosition[0],\n undoableResetView.oldCameraPosition[1],\n undoableResetView.oldCameraPosition[2],\n );\n orbitControlsRef.current.target.set(\n undoableResetView.oldPanCenter[0],\n undoableResetView.oldPanCenter[1],\n undoableResetView.oldPanCenter[2],\n );\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n const v = state.viewState;\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\n v.panCenter = [...undoableResetView.oldPanCenter];\n });\n }\n },\n redo: () => {\n resetView();\n },\n } as UndoableResetView;\n addUndoable(undoableResetView);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n state.viewState.orthographic = false;\n });\n resetView();\n }\n }\n break;\n case 'f2':\n case 'ctrl+b':\n case 'meta+b':\n toggle2DView();\n break;\n case 'ctrl+u':\n case 'meta+u':\n toggleNatigationView();\n break;\n case 'f4':\n case 'ctrl+m':\n case 'meta+m':\n toggleAutoRotate();\n break;\n case 'ctrl+f':\n case 'meta+f': // for Mac\n setCommonStore((state) => {\n state.createNewFileFlag = true;\n state.objectTypeToAdd = ObjectType.None;\n state.groupActionMode = false;\n state.groupMasterId = null;\n window.history.pushState({}, document.title, HOME_URL);\n if (loggable) {\n state.actionInfo = {\n name: 'Create New File',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n break;\n case 'ctrl+s':\n case 'meta+s': // for Mac\n usePrimitiveStore.setState((state) => {\n state.saveLocalFileDialogVisible = true;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Local File',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'ctrl+shift+o':\n case 'meta+shift+o': // for Mac\n usePrimitiveStore.setState((state) => {\n state.listCloudFilesFlag = true;\n state.openModelsMap = false;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'List Cloud Files',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'ctrl+shift+s':\n case 'meta+shift+s': // for Mac\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Cloud File',\n timestamp: new Date().getTime(),\n };\n });\n }\n break;\n case 'alt+backspace':\n case 'backspace':\n case 'delete':\n if (!selectedElement) break;\n if (selectedElement.locked) {\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\n } else {\n const deletedElements = removeElement(selectedElement.id, false);\n if (deletedElements.length === 0) break;\n\n if (Util.ifNeedListenToAutoDeletion(selectedElement)) {\n useRefStore.getState().setListenToAutoDeletionByDelete(true);\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\n } else {\n const undoableDelete = {\n name: 'Delete',\n timestamp: Date.now(),\n deletedElements: deletedElements,\n selectedElementId: selectedElement.id,\n undo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n setCommonStore((state) => {\n state.elements.push(...deletedElements);\n state.selectedElementIdSet.clear();\n state.selectedElementIdSet.add(selectedElement.id);\n state.selectedElement = selectedElement;\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\n state.deletedRoofId = null;\n });\n if (selectedElement.type === ObjectType.Wall) {\n const wall = selectedElement as WallModel;\n if (wall.leftJoints.length > 0) {\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\n }\n if (wall.rightJoints.length > 0) {\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\n }\n }\n },\n redo: () => {\n const deletedElements = undoableDelete.deletedElements;\n if (!deletedElements || deletedElements.length === 0) return;\n\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\n if (!selectedElement) return;\n\n removeElement(selectedElement.id, false);\n },\n } as UndoableDelete;\n addUndoable(undoableDelete);\n }\n }\n break;\n case 'ctrl+z':\n case 'meta+z': // for Mac\n if (undoManager.hasUndo()) {\n const commandName = undoManager.undo();\n if (groupMasterId === selectedElement?.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n if (commandName) showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Undo',\n timestamp: new Date().getTime(),\n } as ActionInfo;\n });\n }\n }\n break;\n case 'ctrl+y':\n case 'meta+y': // for Mac\n if (undoManager.hasRedo()) {\n const commandName = undoManager.redo();\n if (commandName) showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\n if (groupMasterId === selectedElement?.id) {\n setCommonStore((state) => {\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\n });\n }\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Redo',\n timestamp: new Date().getTime(),\n } as ActionInfo;\n });\n }\n }\n break;\n case 'shift':\n if (useStore.getState().viewState.navigationView) {\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = 5 * useStore.getState().minimumNavigationMoveSpeed;\n state.navigationTurnSpeed = 5 * useStore.getState().minimumNavigationTurnSpeed;\n });\n }\n setEnableFineGrid(true);\n break;\n case 'esc': {\n const addedFoundationID = useStore.getState().addedFoundationId;\n const addedCuboidId = useStore.getState().addedCuboidId;\n const addedWallId = useStore.getState().addedWallId;\n const addedWindowId = useStore.getState().addedWindowId;\n const addedDoorId = useStore.getState().addedDoorId;\n if (addedFoundationID) {\n removeElementById(addedFoundationID, false);\n } else if (addedCuboidId) {\n removeElementById(addedCuboidId, false);\n } else if (addedWallId) {\n removeElementById(addedWallId, false);\n } else if (addedWindowId) {\n removeElementById(addedWindowId, false);\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedWindowId);\n } else if (addedDoorId) {\n removeElementById(addedDoorId, false);\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedDoorId);\n }\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n state.actionModeLock = false;\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.groupMasterId = null;\n state.groupActionMode = false;\n });\n useRefStore.getState().setEnableOrbitController(true);\n selectNone();\n break;\n }\n case 'ctrl': {\n setMultiSelectionMode(true);\n break;\n }\n }\n };\n\n const handleKeyUp = (key: string) => {\n switch (key) {\n case 'shift':\n if (useStore.getState().viewState.navigationView) {\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = useStore.getState().minimumNavigationMoveSpeed;\n state.navigationTurnSpeed = useStore.getState().minimumNavigationTurnSpeed;\n });\n }\n setEnableFineGrid(false);\n break;\n case 'ctrl+o':\n case 'meta+o': // for Mac\n // this must be handled as a key-up event because it brings up a native file dialog\n // when the key is down and the corresponding key-up event would never be processed as the focus is lost\n if (!useStore.getState().localFileDialogRequested) {\n setCommonStore((state) => {\n state.localFileDialogRequested = true;\n state.openLocalFileFlag = true;\n if (loggable) {\n state.actionInfo = {\n name: 'Open Local File',\n timestamp: new Date().getTime(),\n };\n }\n });\n }\n break;\n case 'ctrl': {\n setMultiSelectionMode(false);\n break;\n }\n }\n };\n\n useEffect(\n () => () => {\n keyNameRef.current = null;\n },\n [],\n );\n\n const keyNameRef = useRef(null);\n\n return (\n <>\n {\n e.preventDefault();\n if (keyNameRef.current === key) return;\n keyNameRef.current = key;\n handleKeyDown(key);\n }}\n />\n {\n e.preventDefault();\n keyNameRef.current = null;\n handleKeyUp(key);\n }}\n />\n \n \n );\n};\n\nexport default React.memo(KeyboardListener);\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\r\n const enabldeNavigationControls = 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 }, []);\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 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 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 orbitControlRef.current.update();\r\n }\r\n setCompassRotation(get().camera);\r\n }, [fileChanged]);\r\n\r\n // switch camera\r\n useEffect(() => {\r\n if (!orthCameraRef.current || !persCameraRef.current || !orbitControlRef.current) {\r\n 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 }\r\n setCompassRotation(get().camera);\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) {\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 {\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\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 (enabldeNavigationControls) {\r\n orbitControlRef.current.listenToKeyEvents(window);\r\n } else {\r\n orbitControlRef.current.removeKeyEvents();\r\n }\r\n }, [enabldeNavigationControls]);\r\n\r\n //switch to navigation controls\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n if (enabldeNavigationControls) {\r\n const camera = get().camera;\r\n camera.position.z = 3;\r\n camera.lookAt(0, 0, 2);\r\n } else {\r\n orbitControlRef.current.update();\r\n }\r\n }, [enabldeNavigationControls]);\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';\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 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 return (\n \n \n {!orthographic && (\n \n {i18n.t('instructionPanel.Rotate', lang)}: {i18n.t('instructionPanel.DragMouse', lang)}\n \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 {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.Move', lang)}: {i18n.t('instructionPanel.MoveInstruction', lang)}\n \n \n {i18n.t('instructionPanel.Turn', lang)}: {i18n.t('instructionPanel.TurnInstruction', lang)}\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\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 && !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","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n * @author Charles Xie, Xiaotong Ding\n */\n\nimport React, { Suspense, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { Canvas } from '@react-three/fiber';\nimport Sky from './views/sky';\nimport Axes from './views/axes';\nimport ElementsRenderer from './elementsRenderer';\nimport Ground from './views/ground';\nimport Heliodon from './views/heliodonWrapper';\nimport ifiLogo from './assets/ifi-logo.png';\nimport MainMenu from './mainMenu';\nimport { DEFAULT_FAR, DEFAULT_FOV, VERSION } from './constants';\nimport { visitHomepage, visitIFI } from './helpers';\nimport AcceptCookie from './acceptCookie';\nimport GroundImage from './views/groundImage';\nimport DropdownContextMenu from './components/contextMenu';\nimport { DesignProblem, EvolutionMethod } from './types';\nimport CloudManager from './cloudManager';\nimport ActionLogger from './actionLogger';\nimport Lights from './lights';\nimport { Auxiliary } from './auxiliary';\nimport Compass from './compassContainer';\nimport i18n from './i18n/i18n';\nimport KeyboardListener from './keyboardListener';\nimport CloudImage from './assets/cloud.png';\nimport SceneRadiusCalculator from './sceneRadiusCalculator';\nimport { UndoableChange } from './undo/UndoableChange';\nimport CameraController from './cameraController';\nimport { useRefStore } from './stores/commonRef';\nimport { UndoableCameraChange } from './undo/UndoableCameraChange';\nimport ShareLink from './shareLinks';\nimport SolarPanelTiltAngleGa from './ai/ga/solarPanelTiltAngleGa';\nimport SolarPanelArrayGa from './ai/ga/solarPanelArrayGa';\nimport SolarPanelTiltAnglePso from './ai/pso/solarPanelTiltAnglePso';\nimport SolarPanelArrayPso from './ai/pso/solarPanelArrayPso';\nimport NavigationController from './navigationController';\nimport Waiting from './waiting';\nimport Panels from './panels';\nimport Simulations from './simulations';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { Button } from 'antd';\nimport ProjectGallery from './panels/projectGallery';\nimport SplitPane from 'react-split-pane';\nimport { throttle } from 'lodash';\n\nexport interface AppCreatorProps {\n viewOnly: boolean;\n}\n\nconst AppCreator = ({ viewOnly = false }: AppCreatorProps) => {\n const user = useStore(Selector.user);\n const loggable = useStore(Selector.loggable);\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const changed = usePrimitiveStore(Selector.changed);\n const addUndoable = useStore(Selector.addUndoable);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n const cloudFile = useStore(Selector.cloudFile);\n const projectView = useStore(Selector.projectView);\n const axes = useStore(Selector.viewState.axes);\n const theme = useStore(Selector.viewState.theme);\n const groundImage = useStore(Selector.viewState.groundImage);\n const groundImageType = useStore(Selector.viewState.groundImageType) ?? 'roadmap';\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const evolutionaryAlgorithmState = useStore(Selector.evolutionaryAlgorithmState);\n\n const [initializing, setInitializing] = useState(true);\n const [canvasRelativeWidth, setCanvasRelativeWidth] = useState(50);\n\n const canvasRef = useRef(null);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n setInitializing(false);\n }, []);\n\n useEffect(() => {\n setCommonStore((state) => {\n // state.loggable = false; // temporarily disabled\n state.loggable = user && user.uid ? !user.email?.endsWith('@intofuture.org') : false;\n if (\n user &&\n (user.noLogging ||\n !user.schoolID ||\n user.schoolID === 'UNKNOWN SCHOOL' ||\n !user.classID ||\n user.classID === 'UNKNOWN CLASS')\n ) {\n state.loggable = false;\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user]);\n\n const zoomView = (scale: number) => {\n if (orthographic) {\n // Previously, we declared this in the header: const cameraZoom = useStore(Selector.viewState.cameraZoom) ?? 20;\n // But it causes the app to be re-rendered every time zoom is called.\n const cameraZoom = useStore.getState().viewState.cameraZoom ?? 20;\n const oldZoom = cameraZoom;\n const newZoom = cameraZoom / scale;\n const undoableChange = {\n name: 'Zoom',\n timestamp: Date.now(),\n oldValue: oldZoom,\n newValue: newZoom,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.cameraZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.cameraZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.cameraZoom = newZoom;\n });\n } else {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n const p = orbitControlsRef.current.object.position;\n const x = p.x * scale;\n const y = p.y * scale;\n const z = p.z * scale;\n const undoableCameraChange = {\n name: 'Zoom',\n timestamp: Date.now(),\n oldCameraPosition: [p.x, p.y, p.z],\n newCameraPosition: [x, y, z],\n undo: () => {\n const oldX = undoableCameraChange.oldCameraPosition[0];\n const oldY = undoableCameraChange.oldCameraPosition[1];\n const oldZ = undoableCameraChange.oldCameraPosition[2];\n orbitControlsRef.current?.object.position.set(oldX, oldY, oldZ);\n orbitControlsRef.current?.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [oldX, oldY, oldZ];\n });\n },\n redo: () => {\n const newX = undoableCameraChange.newCameraPosition[0];\n const newY = undoableCameraChange.newCameraPosition[1];\n const newZ = undoableCameraChange.newCameraPosition[2];\n orbitControlsRef.current?.object.position.set(newX, newY, newZ);\n orbitControlsRef.current?.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [newX, newY, newZ];\n });\n },\n } as UndoableCameraChange;\n addUndoable(undoableCameraChange);\n orbitControlsRef.current.object.position.set(x, y, z);\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n state.viewState.cameraPosition = [x, y, z];\n });\n }\n }\n };\n\n const resetView = () => {\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\n if (orbitControlsRef?.current) {\n // I don't know why the reset method results in a black screen.\n // So we are resetting it here to a predictable position.\n const z = Math.min(50, useStore.getState().sceneRadius * 4);\n orbitControlsRef.current.object.position.set(z, z, z);\n orbitControlsRef.current.target.set(0, 0, 0);\n orbitControlsRef.current.update();\n setCommonStore((state) => {\n const v = state.viewState;\n v.cameraPosition = [z, z, z];\n v.panCenter = [0, 0, 0];\n });\n }\n };\n\n const set2DView = (selected: boolean) => {\n setCommonStore((state) => {\n state.viewState.orthographic = selected;\n state.viewState.enableRotate = !selected;\n if (selected) {\n state.viewState.navigationView = false;\n }\n });\n };\n\n const setNavigationView = (selected: boolean) => {\n if (navigation === selected) return;\n setCommonStore((state) => {\n state.viewState.navigationView = selected;\n state.viewState.enableRotate = !selected;\n if (selected) {\n state.viewState.orthographic = false;\n }\n });\n };\n\n console.log('x');\n\n const isCloudFileOwner = user.uid && new URLSearchParams(window.location.search).get('userid') === user.uid;\n\n const createCanvas = () => {\n return (\n \n \n \n \n \n \n {/* somehow we have to use two suspense wrappers as follows */}\n \n \n \n \n {axes && }\n \n \n {groundImage && }\n {/* */}\n \n \n \n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE && (\n \n )}\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\n \n )}\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem ===\n DesignProblem.SOLAR_PANEL_TILT_ANGLE && }\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\n \n )}\n \n );\n };\n\n return (\n // disable the default context menu for the entire app\n
e.preventDefault()}>\n {/* Spinner, Simulation and Evolution control panels */}\n \n\n \n \n {i18n.t('name.Aladdin', lang)}\n \n {cloudFile && !openModelsMap && (\n \n \n {cloudFile + (isCloudFileOwner && changed ? ' *' : '')}\n {!viewOnly && isCloudFileOwner && changed && (\n {\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Save Cloud File',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n >\n {i18n.t('word.Save', lang)}\n \n )}\n \n )}\n
\n {viewOnly ? (\n \n \n {' V ' + VERSION}\n \n ) : (\n <>\n \n \n    ©{new Date().getFullYear()} {i18n.t('name.IFI', lang)}\n  \n {i18n.t('word.VersionInitial', lang) + VERSION + '. ' + i18n.t('word.AllRightsReserved', lang) + '. '}\n \n \n )}\n {!viewOnly && (\n \n )}\n \n \n \n \n {/* must specify the height here for the floating window to have correct boundary check*/}\n
\n {\n setCanvasRelativeWidth(Math.round(100 - (size / window.innerWidth) * 100));\n }, 5)}\n // must specify the height again for the split pane to resize correctly with the window\n style={{ height: 'calc(100vh - 72px)', display: 'flex' }}\n pane1Style={{\n width: projectView ? 100 - canvasRelativeWidth + '%' : '0',\n minWidth: projectView ? '25%' : 0,\n maxWidth: projectView ? '75%' : 0,\n }}\n pane2Style={{ width: projectView ? canvasRelativeWidth + '%' : '100%' }}\n resizerStyle={{\n cursor: 'col-resize',\n width: projectView ? '6px' : 0,\n minWidth: projectView ? '6px' : 0,\n maxWidth: projectView ? '6px' : 0,\n backgroundImage: 'linear-gradient(to right, white, gray)',\n }}\n >\n {projectView ? (\n \n ) : (\n <>\n )}\n {createCanvas()}\n \n \n
\n
\n \n {!viewOnly && }\n {!viewOnly && loggable && }\n \n );\n};\n\nexport default React.memo(AppCreator);\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