-
0
2
2
-
1
0
7
- c7caea22-742b-4af4-ba15-06c101c723d5
- Shaded
- 1
-
100;150;0;0
-
100;0;150;0
- 637569280264443705
- Site Importer - GISMO.ghx
- 0
-
-24986
-2629
- 2.6514678
- 0
- 0
- 6
- GhPython, Version=7.11.21285.13001, Culture=neutral, PublicKeyToken=null
- 7.11.21285.13001
- 00000000-0000-0000-0000-000000000000
- HumanUI, Version=0.8.1.3, Culture=neutral, PublicKeyToken=null
- 0.8.1.3
- Andrew Heumann
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Human UI
- 0.8.1.3
- MetaHopper, Version=1.2.4.0, Culture=neutral, PublicKeyToken=null
- 1.2.4.0
- Andrew Heumann
- a5058970-b442-4922-91a1-9f0f715c9c46
- MetaHopper
- 1.2.4
- Pufferfish, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null
- 3.0.0.0
- Michael Pryor
- 1c9de8a1-315f-4c56-af06-8f69fee80a7a
- Pufferfish
- 3.0.0.0
- Heron, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null
- 0.1.0.0
- Brian Washburn
- 94830583-1656-43fb-8415-6fd290548dd1
- Heron
- 0.2.0.0
- Human, Version=1.7.3.0, Culture=neutral, PublicKeyToken=null
- 1.7.3.0
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- Human
- 1.2.0
- 392
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Gismo
- # this is Gismo's main component
#
# Gismo is a plugin for GIS Environmental Analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2020, Djordje Spasic <djordjedspasic@gmail.com>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
This component contains all Gismo classes. Other Gismo components are being run by referencing these classes.
So in order for any other Gismo component to work, you need to run this component first. If this component is ran successfully you will hear the Gismo penquin peeping!!
-
Provided by Gismo 0.0.3
input:
mapFolder_: Optional folder path for MapWinGIS installation folder.
-
Most of Gismo's components require MapWinGIS application being installed.
If you did that, Gismo Gismo component will automatically find your MapWinGIS installation folder.
However sometimes Gismo Gismo component will fail to find your MapWinGIS installation folder. In that case you need to input it manually by adding it to the mapFolder_ input.
gismoFolder_: Optional folder path for Gismo working folder.
-
If nothing is supplied to this input, then gismoFolder_ will be set to: "c:\gismo" by default.
output:
readMe!: This output will inform whether the component has been successfully ran or not.
"""
ghenv.Component.Name = "Gismo_Gismo"
ghenv.Component.NickName = "Gismo"
ghenv.Component.Message = "VER 0.0.3\nDEC_24_2020"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.icon
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "0 | Gismo"
try: ghenv.Component.AdditionalHelpFromDocStrings = "1"
except: pass
from System.Runtime.InteropServices import Marshal
import ghpythonlib.components as ghc
import rhinoscriptsyntax as rs
import Rhino.Geometry as rg
import scriptcontext as sc
import Grasshopper
import datetime
import System
import shutil
import urllib
import Rhino
import time
import math
import sys
import clr
import os
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
class Check(object):
"""
check component's version and date
"""
def deconstructComponents_versionDate(self, componentMessage):
"""
deconstruct the "ghenv.Component.Message" string to a version and date
"""
versionIncomplete, dateIncomplete = componentMessage.split("\n")
# version
VERstring, version = versionIncomplete.split(" ")
# date
date = dateIncomplete.replace("_","/") # example: JUN/09/2020
date_timeStruct = time.strptime(date, "%b/%d/%Y")
return version, date_timeStruct
def normalizeVersion(self, v):
"""
normalize gismo version string
"""
# from: http://stackoverflow.com/a/1714132/3137724
parts = [int(x) for x in v.split(".")]
while parts[-1] == 0:
parts.pop()
return parts
def versionDate(self, component):
"""
compare GismoGismo component and other component's versions and that component's "#compatibleLBVersion" version and date
"""
gismoGismo_ComponentMessage = ghenv.Component.Message
components_ComponentMessage = component.Message
gismoGismo_version, gismoGismo_date_timeStruct = self.deconstructComponents_versionDate(gismoGismo_ComponentMessage)
component_version, component_date_timeStruct_dummy = self.deconstructComponents_versionDate(components_ComponentMessage)
# a) compare the Gismo_Gismo and components version (date is irrelevant)
versionCompareResult = cmp(self.normalizeVersion(gismoGismo_version), self.normalizeVersion(component_version)) # returns: -1 (smaller than), 0 (equal), 1 (larger than)
if versionCompareResult == -1:
validVersionDate = False
printMsg = "You are using an older version of Gismo_Gismo component.\nDownload the newest one from:\n\n" + \
"https://github.com/stgeorges/gismo/blob/master/userObjects/Gismo_Gismo.ghuser\n\n" + \
"Once you download the Gismo_Gismo.ghuser file, follow these four simple steps:\n\n" + \
"1) Check if Gismo_Gismo.ghuser file has been blocked: right click on it, and choose \"Properties\". If there is an \"Unblock\" button click on it, and then click on \"OK\". If there is no \"Unblock\" button, just click on \"OK\".\n\n" + \
"2) Put this file into your Grasshopper's: \"File->Special Folders->User Object Folder\" folder.\n\n" + \
"3) In your Grasshopper definition, delete the old \"Gismo_Gismo\" component and drag and drop the new one from the \"0 | Gismo\" menu.\n\n" + \
"4) In Grasshopper's top menu, choose: \"Solution->Recompute\". That's it!"
del component
return validVersionDate, printMsg
else:
# Gismo_Gismo component and component's version are equal(versionCompareResult = 0) or GismoGismo is newer(versionCompareResult = 1)
# b) compare the component's "#compatibleLBVersion" version AND date with Gismo_Gismo version AND date
componentsCodeString = component.Code
codePerLine = componentsCodeString.split("\n")
for line in codePerLine:
if "#compatibleGismoVersion" in line:
#dateIncomplete = line.split("\\n")[-1].strip() # example: JUN_09_2020
versionIncomplete, dateIncomplete = line.split("\\n")
# "#compatibleGismoVersion" version
compatibleGismoVersion_version = versionIncomplete.split("VER")[-1].strip()
# "#compatibleGismoVersion" date
dateIncomplete2 = dateIncomplete.strip()
date = dateIncomplete2.replace("_","/") # example: JUN/09/2020
component_date_timeStruct = time.strptime(date, "%b/%d/%Y")
break
else:
# "#compatibleGismoVersion" is not found in the components code
validVersionDate = False
printMsg = "This component does not contain the Gismo_Gismo compatibility tag (\"#compatibleGismoVersion\").\nReport this issue at:" + \
"http://www.grasshopper3d.com/group/gismo" + \
"\n\nby opening a new topic there."
del component
del componentsCodeString
return validVersionDate, printMsg
versionCompareResult2 = cmp(self.normalizeVersion(gismoGismo_version), self.normalizeVersion(compatibleGismoVersion_version)) # returns: -1 (smaller than), 0 (equal), 1 (larger than)
if versionCompareResult2 == -1:
# the "#compatibleGismoVersion" version is newer than Gismo_Gismo version
validVersionDate = False
printMsg = "You are using an older version of Gismo_Gismo component ,\nDownload the newest one from:\n\n" + \
"https://github.com/stgeorges/gismo/blob/master/userObjects/Gismo_Gismo.ghuser\n\n" + \
"Once you download the Gismo_Gismo.ghuser file, follow these four simple steps:\n\n" + \
"1) Check if Gismo_Gismo.ghuser file has been blocked: right click on it, and choose \"Properties\". If there is an \"Unblock\" button click on it, and then click on \"OK\". If there is no \"Unblock\" button, just click on \"OK\".\n\n" + \
"2) Put this file into your Grasshopper's: \"File->Special Folders->User Object Folder\" folder.\n\n" + \
"3) In your Grasshopper definition, delete the old \"Gismo_Gismo\" component and drag and drop the new one from the \"0 | Gismo\" menu.\n\n" + \
"4) In Grasshopper's top menu, choose: \"Solution->Recompute\". That's it!"
del component
del componentsCodeString
return validVersionDate, printMsg
else:
if gismoGismo_date_timeStruct < component_date_timeStruct:
# the "#compatibleGismoVersion" date is newer than Gismo_Gismo date
validVersionDate = False
printMsg = "You are using an older version of Gismo_Gismo component ;\nDownload the newest one from:\n\n" + \
"https://github.com/stgeorges/gismo/blob/master/userObjects/Gismo_Gismo.ghuser\n\n" + \
"Once you download the Gismo_Gismo.ghuser file, follow these four simple steps:\n\n" + \
"1) Check if Gismo_Gismo.ghuser file has been blocked: right click on it, and choose \"Properties\". If there is an \"Unblock\" button click on it, and then click on \"OK\". If there is no \"Unblock\" button, just click on \"OK\".\n\n" + \
"2) Put this file into your Grasshopper's: \"File->Special Folders->User Object Folder\" folder.\n\n" + \
"3) In your Grasshopper definition, delete the old \"Gismo_Gismo\" component and drag and drop the new one from the \"0 | Gismo\" menu.\n\n" + \
"4) In Grasshopper's top menu, choose: \"Solution->Recompute\". That's it!"
del component
del componentsCodeString
return validVersionDate, printMsg
else:
validVersionDate = True
printMsg = "ok"
del component
del componentsCodeString
return validVersionDate, printMsg
class mainComponent(object):
"""
check gismoFolder_ and mapFolder_ inputs of "Gismo Gismo" component
"""
def gismoWorkingFolder(self, gismoFolder):
"""
check gismoFolder_ of Gismo Gismo component
"""
if (gismoFolder == None):
gismoFolder = "c:\gismo"
myPreparation = Preparation()
folderCreated = myPreparation.createFolder(gismoFolder)
if folderCreated:
# gismoFolder successfully created or it already exists
printMsg = "ok"
return gismoFolder, printMsg
else:
# "gismoFolder_" inputted to Gismo Gismo component can not be created
printMsg = "gismoFolder_ is invalid"
return False, printMsg
def mapWinGIS(self, mapFolder=None):
"""
check if mapWinGIS is installed
"""
# identify if Rhino 5 is 32 or 64 bit version
if System.Environment.Is64BitProcess == False:
bitVersion = "Win32"
elif System.Environment.Is64BitProcess == True:
bitVersion = "x64"
if mapFolder == None:
# check if there is a "MapWinGIS" folder present in some well known places
iteropMapWinGIS_dll_folderPathLL = [
"c:\\MapWindow",
"c:\\ProgramData\\MapWindow",
"c:\\Program Files\\MapWindow",
"c:\\Program Files (x86)\\MapWindow",
"D:\\MapWindow",
"D:\\ProgramData\\MapWindow",
"D:\\Program Files\\MapWindow",
"D:\\Program Files (x86)\\MapWindow",
"c:\\MapWinGIS",
"c:\\dev\\MapWinGIS",
"c:\\ProgramData\\MapWinGIS",
"c:\\Program Files\\MapWinGIS",
"c:\\Program Files (x86)\\MapWinGIS",
"D:\\MapWinGIS",
"D:\\dev\\MapWinGIS",
"D:\\ProgramData\\MapWinGIS",
"D:\\Program Files\\MapWinGIS",
"D:\\Program Files (x86)\\MapWinGIS"]
else:
iteropMapWinGIS_dll_folderPathLL = [mapFolder]
iteropMapWinGIS_dll_fileName = "Interop.MapWinGIS.dll"
InteropMapWinGISDll_present = False
for iteropMapWinGIS_dll_folderPath in iteropMapWinGIS_dll_folderPathLL:
iteropMapWinGIS_dll_filePath = os.path.join(iteropMapWinGIS_dll_folderPath, iteropMapWinGIS_dll_fileName)
InteropMapWinGISDll_present = os.path.isfile(iteropMapWinGIS_dll_filePath)
if InteropMapWinGISDll_present != False:
# "Interop.MapWinGIS.dll" file found in the "MapWinGIS" folder
break
else:
# "Interop.MapWinGIS.dll" file was found in the "iteropMapWinGIS_dll_folderPathLL" folders
#InteropMapWinGISDll_present = False
if mapFolder == None:
# nothing inputted into the "mapFolder_"
printMsg = "This component requires the \"MapWinGIS\" application to be installed in order for it to work.\n" + \
"The component could not find the installation folder of the \"MapWinGIS\" application.\n" + \
"-\n" + \
"If you haven't installed the \"MapWinGIS\" application, download its %s version from the link below, and install it:\n" % bitVersion + \
"https://github.com/MapWindow/MapWinGIS/releases\n" + \
"-\n" + \
"If you already downloaded and installed the \"MapWinGIS\" application, then supply its installation folder path to the \"mapFolder_\" input."
else:
# some folder path inputted into the "mapFolder_"
printMsg = "The folder path you added to Gismo_Gismo component's \"mapFolder_\" input is invalid: meaning this is not the MapWinGIS application install folder.\n" + \
"-\n" + \
"You can find the valid \"mapFolder_\" path by using the Start Menu -> Search function (and search for \"MapWinGIS\").\n" + \
"If you do not input the correct folder path to \"mapWindow\" some Gismo components might not be able to work."
iteropMapWinGIS_dll_folderPath = gdalDataPath_folderPath = None
validInputData = False
return iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg
try:
clr.AddReferenceToFileAndPath(iteropMapWinGIS_dll_filePath)
except:
pass
iteropMapWinGIS_dll_loaded_Success = "Interop.MapWinGIS" in [assembly.GetName().Name for assembly in clr.References]
if iteropMapWinGIS_dll_loaded_Success:
# import GDAL libraries and register GDAL drivers
global MapWinGIS # so that other methods in this Gismo Gismo component could use the MapWinGIS module
import MapWinGIS
# testing if the "Retrieving the COM class factory for component with CLSID" error will appear
try:
dummyShape = MapWinGIS.ShapeClass()
sc.sticky["MapWinGIS"] = "" # "" is dummy value. Only the key name "MapWinGIS" is important
except Exception, e:
# the "Retrieving the COM class factory for component with CLSID" error appeared
iteropMapWinGIS_dll_folderPath = gdalDataPath_folderPath = None
validInputData = False
printMsg = "The following error has been raised:\n" + \
" \n" + \
"%s\n" % e + \
" \n \n" + \
"If upper error is:\n" + \
"1) \"Retrieving the COM class factory for component with CLSID...\" then try the following fix:\n" + \
" a) Close Rhino. Restart your PC. Once the PC boots up, double click on the \"regMapWinGIS.cmd\" file in \"MapWinGIS\" installation folder. When it closes the Command Prompt window it opened, try running Rhino, Grasshopper and the component again.\n" + \
" b) If the upper COM class error appears again, then close Rhino, and uninstall the MapWinGIS application. It is advisable to do that with an application which does that by removing not only the installation files but also the leftover files (like those from registry). For example, use the: Revo Uninstaller Pro. A free 30 days full working version can be downloaded from: http://www.revouninstaller.com.\n" + \
" After the Revo Uninstaller Pro uninstalls MapWinGIS, install it again, but this time by running the installation file by right clicking on it, and choosing: Run as -> Administrator. After the installation is complete double click on \"regMapWinGIS.cmd\" file in \"MapWinGIS\" installation folder. When it closes the Command Prompt window it opened, try running Rhino, Grasshopper and the component again.\n" + \
" If after this the COM class error appears again, then post a question about this issue at:\n" + \
" http://www.grasshopper3d.com/group/gismo/forum.\n" + \
" \n \n" + \
"2) If the upper error is not \"Retrieving the COM class factory for component with CLSID...\", please post a question about this issue at:\n" + \
"http://www.grasshopper3d.com/group/gismo/forum."
return iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg
# set the folderpath for "gdal_data" folder
gdalDataPath_folderPath = os.path.join(iteropMapWinGIS_dll_folderPath, "gdal-data")
MapWinGIS.GlobalSettingsClass().GdalDataPath = gdalDataPath_folderPath # added in 4.9.3 version
validInputData = True
printMsg = "ok"
return iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg
else:
# the "MapWinGIS" install folder contains the "Interop.MapWinGIS.dll" file but some other ones are missing
gdalDataPath_folderPath = None
validInputData = False
printMsg = "This component requires the \"MapWinGIS\" application to be installed in order for it to work.\n" + \
" \n" + \
"For some reason it seems that \"MapWinGIS\" is installed but its install folder (\"%s\") does not contain all the necessary files.\n" % iteropMapWinGIS_dll_folderPath + \
"Close Rhino. Uninstall the MapWinGIS application. Then install it again.\n" + \
" \n" + \
"If after this, you still get this same message please post a question about this issue at:\n" + \
"http://www.grasshopper3d.com/group/gismo/forum."
iteropMapWinGIS_dll_folderPath = None # set in here, to prevent the "iteropMapWinGIS_dll_folderPath" being equal to "None" when printed in upper "printMsg"
return iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg
class Transform(object):
"""
methods used to perform transformation
"""
def copy(self, obj):
"""copy the object. Use this func instead of 'ds.CopyObj!'"""
if isinstance(obj, Rhino.Geometry.GeometryBase):
obj2 = obj.Duplicate()
else:
obj2 = System.ICloneable.Clone(obj)
if (obj2 == None):
try:
obj2 = copy.copy(obj) # does not work on Rhino.Geometry.Leader
except Exception, e:
print "%s of type %s couldn't be copied" % (obj, type(obj))
return obj2
def move(self, obj, transVec):
"""moves a copy of obj"""
obj2 = self.copy(obj)
if hasattr(transVec, "__iter__"): # supports list, tuple, Array, List
transVec = rg.Vector3d(transVec[0], transVec[1], transVec[2])
tm = rg.Transform.Translation(transVec)
obj2.Transform(tm)
return obj2
def scale(self, obj, pln, scaleFac):
"""scale the object uniformly in all directions
input:
obj to scale
scaling pln
scaleFactor number"""
obj_c = self.copy(obj)
xform = rg.Transform.Scale(pln, scaleFac, scaleFac, scaleFac)
obj_c.Transform(xform)
return obj_c
class Preparation(object):
"""
methods used to prepare components before performing analysis/running results
"""
def cleanString(self, string):
"""
for a given string, replace "/", "\", " ", "," with "_"
"""
stringCorrected = System.String.Replace( System.String.Replace( System.String.strip(System.String.Replace(System.String.Replace(string,"\\","_"), "/", "_") ) ," ", "_") ,",", "_") # removing "/", "\", " ", ","
return stringCorrected
def checkUnits(self):
"""
calculate unitConversionFactor for appropriate Rhino document Model unit. And check Rhino Model units
"""
unitSystem_id = int(Rhino.RhinoDoc.ActiveDoc.ModelUnitSystem)
if (unitSystem_id == 2):
fromUnitSystem = Rhino.UnitSystem.Millimeters
unitSystem = "Millimeters"
elif (unitSystem_id == 3):
fromUnitSystem = Rhino.UnitSystem.Centimeters
unitSystem = "Centimeters"
elif (unitSystem_id == 4):
fromUnitSystem = Rhino.UnitSystem.Meters
unitSystem = "Meters"
elif (unitSystem_id == 8):
fromUnitSystem = Rhino.UnitSystem.Inches
unitSystem = "Inches"
elif (unitSystem_id == 9):
fromUnitSystem = Rhino.UnitSystem.Feet
unitSystem = "Feet"
elif (unitSystem_id == 10):
fromUnitSystem = Rhino.UnitSystem.Miles
unitSystem = "Miles"
else:
# chosen unit system is not one of the above supported ones
return None, "unknown unit system"
toMeters = Rhino.UnitSystem.Meters
unitConversionFactor = Rhino.RhinoMath.UnitScale(fromUnitSystem, toMeters)
return unitConversionFactor, unitSystem
def createFolder(self, folderPath):
"""
creates a folder for a given folderPath.
Returns "True" if folder is created or it it already exists. And "False" if folderPath is invalid
"""
if os.path.isdir(folderPath):
# "folderPath" exists
folderCreated = True
return folderCreated
else:
# "folderPath" does not exist
try:
# try creating the folder according to "folderPath"
os.mkdir(folderPath)
folderCreated = True
return folderCreated
except Exception, e:
# invalid folderPath
folderCreated = False
return folderCreated
def splitFolderAndFile(self, fileFolderPath):
"""
split joined folder and file string into separate folder and file strings. It can have extension at the end of the filename or not.
input: file with folder string. Example: "C:/libraries/someFolder/someLib.dll"
output:
folder path
fileName
example: print ds.SplitFolderAndFile("C:/libraries/someFolder/someLib.dll") # "C:/libraries/someFolder", "someLib.dll" """
folder = os.path.dirname(fileFolderPath)
filename = os.path.basename(fileFolderPath)
return folder, filename
def checkInternetConnection(self):
"""
check if PC is connected to internet
"""
# connectedToInternet first check
connectedToInternet1 = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
if connectedToInternet1 == False:
# connectedToInternet second check
try:
client = System.Net.WebClient()
client.OpenRead("http://www.google.com")
connectedToInternet = True
except:
connectedToInternet = False
# you are not connected to the Internet
elif connectedToInternet1 == True:
# no need for connectedToInternet second check
connectedToInternet = True
return connectedToInternet
def downloadFile(self, downloadLink, downloadedFilePath):
"""
downloading a file for the given link and filepath location.
Returns "True" is file is successfully downloaded and "False" if download fails
"""
try:
# try "secure http" download
client = System.Net.WebClient()
client.DownloadFile(downloadLink, downloadedFilePath)
except Exception, e:
print "downloadFile_e1: ", e
try:
# "secure http" failed, try "http" download:
filePathDummy, infoHeader = urllib.urlretrieve(downloadLink, downloadedFilePath)
except Exception, e:
print "downloadFile_e2: ", e
# downloading of file failed
fileDownloaded_success = False
return fileDownloaded_success
fileDownloaded_success = True
return fileDownloaded_success
def constructLocation(self, locationName, latitude, longitude, timeZone = 0, elevation = 0):
"""
construct .epw file location
"""
locationString = "Site:Location,\n" + \
"%s,\n" % locationName + \
"%s, !Latitude\n" % latitude + \
"%s, !Longitude\n" % longitude + \
"%s, !Time Zone\n" % timeZone + \
"%s; !Elevation" % elevation
return locationString
def deconstructLocation(self, location):
"""
deconstruct a location string from .epw file
"""
deconstructedLocationStrings = []
splittedStrings = location.split("\n")
for index,item in enumerate(splittedStrings):
splittedStrings2 = item.split(",")
firstItem = splittedStrings2[0].strip()
if index == len(splittedStrings)-1:
firstItem = firstItem.split(";")[0]
deconstructedLocationStrings.append(firstItem)
locationLabel, locationName, latitude, longitude, timeZone, elevation = deconstructedLocationStrings
return locationName, latitude, longitude, timeZone, elevation
def checkLocationData(self, location):
"""
extended version of upper "deconstructLocation" method. Also fixes the locationName
"""
if location:
try:
# location data
locationName, latitude, longitude, timeZone, elevation = self.deconstructLocation(location) # latitude positive towards north, longitude positive towards east
locationNameCorrected = System.String.Replace( System.String.Replace( System.String.strip(System.String.Replace(System.String.Replace(locationName,"\\","_"), "/", "_") ) ," ", "_") ,",", "_") # removing "/", "\", " ", "," from locationName
latitude = float(latitude)
longitude = float(longitude)
timeZone = float(timeZone)
elevation = float(elevation)
validLocationData = True
printMsg = "ok"
except Exception, e:
# something is wrong with "_location" input (the input is not from Ladybug "Import epw" component "location" ouput)
locationNameCorrected = latitude = longitude = timeZone = elevation = None
validLocationData = False
printMsg = "Something is wrong with \"_location\" input."
else:
locationNameCorrected = latitude = longitude = timeZone = elevation = None
validLocationData = False
printMsg = "Please add location from Gismo's \"Create Location\" component, to this component's \"_location\" input."
return locationNameCorrected, latitude, longitude, timeZone, elevation, validLocationData, printMsg
def angle2northClockwise(self, north):
"""
retuns north angle in radians and north vector for given either of these two
this method is entirely copied from Ladybug_Ladybug "angle2northClockwise" method.
"""
try:
northVec = Rhino.Geometry.Vector3d.YAxis
northVec.Rotate(-math.radians(float(north)),Rhino.Geometry.Vector3d.ZAxis)
northVec.Unitize()
return 2*math.pi-math.radians(float(north)), northVec
except Exception, e:
try:
northVec = Rhino.Geometry.Vector3d(north)
northVec.Unitize()
return Rhino.Geometry.Vector3d.VectorAngle(Rhino.Geometry.Vector3d.YAxis, northVec, Rhino.Geometry.Plane.WorldXY), northVec
except Exception, e:
return 0, Rhino.Geometry.Vector3d.YAxis
def checkShapeType(self, shapesLL):
"""
determine which shapeType_ input has been used for "OSM Shapes" component based on its "shapes" output
"""
numOfShapes = 0
numOfShapesClosed = 0
for shapesL in shapesLL:
if (len(shapesL) != 0):
# if branch is not empty
numOfShapes += 1
for shape in shapesL:
if isinstance(shape, Rhino.Geometry.Point):
# shapes_ are points
shapeType = 2
del shapesLL
return shapeType
else:
# check if shapeType = 0 (closed polygon) or 1 (polyline)
if shape.IsClosed:
numOfShapesClosed += 1
if numOfShapes == numOfShapesClosed:
# shapeType = 0 will always have closed polygons!
shapeType = 0
elif numOfShapes != numOfShapesClosed:
# it may happen that shapeType = 1 will sometimes have a couple of closed polygons (those that are not added to "closed_ways_are_polygons=" line in osmconf.ini)
shapeType = 1
del shapesLL
return shapeType
def LiftingOSMshapesHeight(self, shapesDataTree, shapeType, bb_height, bb_bottomLeftCorner):
# OSM shapes need to always be above the terrain in order for the brep created from them to be successfully cut from the terrain.
# check how much OSM shapes need to be lifted above the terrain
# all _shapes are plannar because they come from "OSM shapes" component. Therefor they all have the same Z coordinate.
for shapesL in shapesDataTree.Branches:
if (len(shapesL) > 0) and (shapesL[0] != None):
if (shapeType == 0):
# polygons
OSMshapes_Zcoord = shapesL[0].PointAtStart.Z
break
elif (shapeType == 1):
# polylines
OSMshapes_Zcoord = shapesL[0].PointAtStart.Z
break
elif (shapeType == 2):
# points
OSMshapes_Zcoord = shapesL[0].Location.Z
break
terrainHeighestPt_Zcoord = bb_bottomLeftCorner.Z + bb_height
if (terrainHeighestPt_Zcoord >= OSMshapes_Zcoord):
# highest terrain point is above the shapes plane. Move the shapes upwards
liftingOSMshapesHeight = 2 * (terrainHeighestPt_Zcoord - OSMshapes_Zcoord) # "2" is a dummy value
elif (terrainHeighestPt_Zcoord < OSMshapes_Zcoord):
# highest terrain point is below the shapes plane. This is fine, but still move the shapes upwards in case some unexpected issue arises
liftingOSMshapesHeight = 1.2 * (OSMshapes_Zcoord - terrainHeighestPt_Zcoord) # "1.2" is a dummy value
return liftingOSMshapesHeight
def flatten_dataTree(self, dataTree):
"""
convert a data tree content to a single list
"""
branchesLL = dataTree.Branches
branchesLL_flattened = []
for branchL in branchesLL:
if (len(branchL) > 0):
branchesLL_flattened.extend(branchL)
del dataTree
del branchesLL
return branchesLL_flattened
def modify_dataTree(self, oldDataTree, newBranchIndex, newBranchList):
"""
modify the datatree list on a certain branch index
"""
newDataTree = Grasshopper.DataTree[object]()
oldDataTree_Paths = oldDataTree.Paths
for branchIndex, oldBranchList in enumerate(oldDataTree.Branches):
if (branchIndex == newBranchIndex):
newDataTree.AddRange(newBranchList, oldDataTree_Paths[branchIndex])
else:
newDataTree.AddRange(oldBranchList, oldDataTree_Paths[branchIndex])
del oldDataTree
return newDataTree
def datatree_shiftPaths(self, dataTree):
"""
shifting data tree paths by -1
"""
branches = dataTree.Branches
paths = dataTree.Paths
newPaths = [p.CullElement() for p in paths]
shiftedPathsTree = Grasshopper.DataTree[object]()
for i in xrange(dataTree.BranchCount):
shiftedPathsTree.AddRange(branches[i], newPaths[i])
del dataTree
return shiftedPathsTree
def grasshopperDTtoLL(self, DT):
"""convert grasshoppper data tree to a list of lists"""
LL = []
for i in xrange(DT.BranchCount):
branch_dotNET_L = DT.Branches[i]
branch_L = [DT.Branches[i][g] for g in xrange(DT.Branches[i].Count)]
LL.append(branch_L)
return LL
def flattenLL(self, LL):
"""flatten (convert to a regular list) a list of lists"""
L = [item for subL in LL for item in subL]
return L
def joinMeshes(self, mesh_L):
"""join a list of meshes in to a single mesh"""
joinedMesh = Rhino.Geometry.Mesh()
joinedMesh.Append(mesh_L)
return joinedMesh
def toMesh(self, brep, minEdgeLength=tol, maxEdgeLength=0, jaggedSeams=False, simplePlanes=False):
"""convert brep to mesh"""
meshParam = Rhino.Geometry.MeshingParameters()
# mesh parameters
meshParam.JaggedSeams = jaggedSeams
meshParam.SimplePlanes = simplePlanes
# assign 'minEdgeLength' and 'maxEdgeLength' parameters only if they do not contain default func values (because if I remember correctly they created issues with non default values, at some point in past)
if (minEdgeLength != tol):
meshParam.MinimumEdgeLength = minEdgeLength # in mm
if (maxEdgeLength != 0):
meshParam.MaximumEdgeLength = maxEdgeLength # in mm
if (type(brep) == Rhino.Geometry.Extrusion):
brep = brep.ToBrep()
# convert brep to mesh
meshes = Rhino.Geometry.Mesh.CreateFromBrep(brep, meshParam)
joinedMesh = Rhino.Geometry.Mesh()
for mesh in meshes:
joinedMesh.Append(mesh)
return joinedMesh
def boundingBox_properties(self, geometryL, accurate=True):
"""
getting volume, centroid, corner pts and dimensions of a bounding box created around a "geometry"
"""
####unionBB = geometry.GetBoundingBox(accurate)
#mesh = Rhino.Geometry.Mesh.CreateFromBrep(geometry)[0]
#unionBB = Rhino.Geometry.Mesh.GetBoundingBox(mesh, accurate)
bbL = []
for geo in geometryL:
bbL.append(geo.GetBoundingBox(accurate))
unionBB = bbL[0] # initial value
for i in range(len(bbL)-1):
unionBB = Rhino.Geometry.BoundingBox.Union(unionBB, bbL[i+1])
bb_centroid = unionBB.Center
bb_edges = unionBB.GetEdges()
bb_length = bb_edges[0].Length
bb_depth = bb_edges[1].Length
bb_height = bb_edges[8].Length
bb_corners = unionBB.GetCorners()
bb_bottomLeftCorner = bb_corners[0]
bb_bottomRightCorner = bb_corners[1]
bb_topRightCorner = bb_corners[2]
bb_topLeftCorner = bb_corners[3]
try:
bb_volume = Rhino.Geometry.VolumeMassProperties.Compute(unionBB.ToBrep()).Volume
except:
bb_volume = None
return bb_volume, bb_centroid, bb_length, bb_depth, bb_height, bb_bottomLeftCorner, bb_bottomRightCorner, bb_topRightCorner, bb_topLeftCorner
def textJustificationEnumeration(self, justificationIndex):
"""
get TextJustification type based on justificationIndex
"""
# justificationIndices:
# 0 - bottom left (default)
# 1 - bottom center
# 2 - bottom right
# 3 - middle left
# 4 - center
# 5 - middle right
# 6 - top left
# 7 - top middle
# 8 - top right
constantsList = [0, 2, 4, 131072, 131074, 131076, 262144, 262146, 262148]
try:
justificationConstant = constantsList[justificationIndex]
except:
# if 0 < justificationIndex > 8
justificationConstant = 0
textJustification = System.Enum.ToObject(Rhino.Geometry.TextJustification, justificationConstant)
return textJustification
def text2srfOrMesh(self, returnSrfOrMesh, textL, textStartPt, textSize, fontName="Verdana", bold=True, italic=False, justificationIndex=0):
"""
convert text to surface or mesh
this method is based on "text2srf" method from Ladybug plugin
"""
textObjectIdsL = []
textSrfsL = []
textMeshesL = []
plane = Rhino.Geometry.Plane(textStartPt, Rhino.Geometry.Vector3d(0,0,1))
joinedTextGeometry = Rhino.Geometry.Mesh() # joined final text mesh
textJustification = self.textJustificationEnumeration(justificationIndex)
for text in textL:
#textString = str(text)
textString = unicode(text)
textObjectId = Rhino.RhinoDoc.ActiveDoc.Objects.AddText(textString, plane, textSize, fontName, bold, italic, textJustification)
textObjectIdsL.append(textObjectId)
textObject = Rhino.RhinoDoc.ActiveDoc.Objects.Find(textObjectId)
textCrvs = textObject.Geometry.Explode()
joinedTextCrvs = Rhino.Geometry.Curve.JoinCurves(textCrvs)
textSrfs = Rhino.Geometry.Brep.CreatePlanarBreps(joinedTextCrvs)
if returnSrfOrMesh == "srf":
textSrfsL.extend(textSrfs)
elif returnSrfOrMesh == "mesh":
textSrfsL.extend(textSrfs)
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
if returnSrfOrMesh == "srf":
joinedTextGeometry = Rhino.Geometry.Brep.MergeBreps(textSrfsL, tol)
elif returnSrfOrMesh == "mesh":
for brep in textSrfsL:
brepMeshes = Rhino.Geometry.Mesh.CreateFromBrep(brep)
for brepMesh in brepMeshes:
brepMesh.VertexColors.CreateMonotoneMesh(System.Drawing.Color.Black)
joinedTextGeometry.Append(brepMesh)
del textSrfsL
# deleting
quiet = True
for textObjectId in textObjectIdsL:
Rhino.RhinoDoc.ActiveDoc.Objects.Delete(textObjectId, quiet)
return joinedTextGeometry
def defaultCustomColors(self):
"""
a list of Gismo's default customColors_ (gradient blue-green-red)
"""
defaultCustomColors = [
System.Drawing.Color.FromArgb(2,83,250),
System.Drawing.Color.FromArgb(68,219,226),
System.Drawing.Color.FromArgb(155,253,126),
System.Drawing.Color.FromArgb(173,255,25),
System.Drawing.Color.FromArgb(253,255,16),
System.Drawing.Color.FromArgb(251,192,31),
System.Drawing.Color.FromArgb(248,64,74)]
return defaultCustomColors
def read_legendBakePar(self, legendBakePar):
"""
deconstruct "legendBakePar_" input to its parts
"""
legendBakePar_LL = legendBakePar.Branches
if (len(legendBakePar_LL) == 0) or ((len(legendBakePar_LL) == 1) and (legendBakePar_LL[0][0] == None)):
# a) "legendBakePar_" input is empty, or
# b) "Legend Bake Parameters" component is not ran for some reason (its legendBakePar output returns "None").
legendStyle = 0 # rectangle cells
legendPlane = None # pick bounding box bottom right corner point
maxValue = None # pick the largest value
minValue = None # pick the smallest value
customColors = []
numLegendCells = 12
fontName = "Verdana"
fontSize = None # calculate it according to the bounding box length
numDecimals = 2
legendUnit = None # use the legendUnit defined by the component
customTitle = None # use the title defined by the component
scale = 1
layerName = None # use layerName defined by the component
layerColor = None # use layerColor defined by the component
layerCategoryName = None # no layer category will be created
return legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, fontName, fontSize, numDecimals, legendUnit, customTitle, scale, layerName, layerColor, layerCategoryName
else:
# something inputted to "legendBakePar_"
legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, fontName, fontSize, numDecimals, legendUnit, customTitle, scale, layerName, layerColor, layerCategoryName = legendBakePar_LL # all parts are lists now
return legendStyle[0], legendPlane[0], maxValue[0], minValue[0], list(customColors), numLegendCells[0], fontName[0], fontSize[0], numDecimals[0], legendUnit[0], customTitle[0], scale[0], layerName[0], layerColor[0], layerCategoryName[0]
def createTitle(self, returnSrfOrMesh, geometryL, textL, customTitle=None, textStartPt=None, textSize=None, fontName=None, bold=None, italic=None, textJustification=None):
"""
create title below a certain geometryL
"""
accurate = True
bb_volume, bb_centroid, bb_length, bb_depth, bb_height, bb_bottomLeftCorner, bb_bottomRightCorner, bb_topRightCorner, bb_topLeftCorner = self.boundingBox_properties(geometryL, accurate)
if (textSize == None):
textSize = bb_depth / 25
if (fontName == None):
fontName = "Verdana"
if (bold == None):
bold = False
if (italic == None):
italic = False
if (textStartPt == None):
textStartPt = bb_bottomLeftCorner
if (textJustification == None):
textJustification = 6 # top left
if (customTitle == None):
# nothing inputted into "customTitle_" input of "Legend Bake Parameters" component. Use the upper "textL" as a string for the title text
pass
else:
# something inputted into "customTitle_" input of "Legend Bake Parameters" component. Use the "customTitle_" input as a string for the title text
# fixing the issue with "customTitle_" input not registring the "\n" for a new line
customTitle2 = customTitle.replace("\\n", "\\\n")
customTitle3 = customTitle2.replace("\\", "")
textL = [customTitle3]
textStartPt.Y = textStartPt.Y - textSize
joinedTitleTextGeometry = self.text2srfOrMesh(returnSrfOrMesh, textL, textStartPt, textSize, fontName, bold, italic, textJustification)
return joinedTitleTextGeometry, textStartPt, textSize
def numberToColor(self, values, customColors, minB=None, maxB=None):
"""
interpolate numbers to a gradient between a list of colors
"""
if (len(customColors) == 0):
customColors = self.defaultCustomColors()
if sum(values) == (len(values)*values[0]):
# all items in "values" are the same. Return the bottom most color
return [customColors[0]] * len(values)
# checking for "minB" and "maxB"
minValue = min(values)
maxValue = max(values)
if (minB != None):
if (minB >= minValue): # check in case "minValue_" is smaller than the smallest value in "values"
minValue = minB
if (maxB != None):
if (maxB <= maxValue): # check in case "maxValue_" is larger than the largest value in "values"
maxValue = maxB
# edit all "values" so that they are not smaller than "minValue", and larger than "maxValue"
valuesChangedFor_minB_maxB = []
for value in values:
if value < minValue:
valuesChangedFor_minB_maxB.append(minValue)
elif value > maxValue:
valuesChangedFor_minB_maxB.append(maxValue)
else:
valuesChangedFor_minB_maxB.append(value)
# normalize the "values" to range(0,1)
normalizedValues = [(valueChanged - minValue) / (maxValue - minValue) for valueChanged in valuesChangedFor_minB_maxB]
# divide range(0,1) according to the number of customColors items
stepValueLimit = 1/(len(customColors)-1)
valueLimit = 0
valuesLimits_perEachCustomColor = []
for i in range(len(customColors)-1):
valuesLimits_perEachCustomColor.append(valueLimit)
valueLimit += stepValueLimit
valuesLimits_perEachCustomColor.append(1.0) # this is done to avoid bugs with last value in "valuesLimits_perEachCustomColor" sometimes being 0.999..
# generate legendColors
legendColors = []
for i in range(len(normalizedValues)):
color = None # initial value
normalizedValue = normalizedValues[i]
for index, valueLimit in enumerate(valuesLimits_perEachCustomColor):
if valueLimit >= normalizedValue:
if index == 0:
# if value is between 0 and next valueLimit
color1 = customColors[index]
color2 = customColors[index+1]
minValue = valuesLimits_perEachCustomColor[index]
maxValue = valuesLimits_perEachCustomColor[index+1]
else:
color1 = customColors[index-1]
color2 = customColors[index]
minValue = valuesLimits_perEachCustomColor[index-1]
maxValue = valuesLimits_perEachCustomColor[index]
normalizedValue2 = (normalizedValue - minValue) / (maxValue - minValue) # normalized for a range between two "valuesLimits_perEachCustomColor" numbers
# based on: http://stackoverflow.com/a/22649247/3137724
resultRed = color1.R + normalizedValue2 * (color2.R - color1.R)
resultGreen = color1.G + normalizedValue2 * (color2.G - color1.G)
resultBlue = color1.B + normalizedValue2 * (color2.B - color1.B)
color = System.Drawing.Color.FromArgb(resultRed, resultGreen, resultBlue)
legendColors.append(color)
break
return legendColors
def createLayer(self, layParentName, laySubName, projectName, newLayer, category, laySubName_color=None, category_color=None, legendBakePar=Grasshopper.DataTree[object]() ):
"""
create a layers tree
"""
# read the "legendBakePar_"
legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, fontName, fontSize, numDecimals, customLegendUnit, customTitle, scale, customLayerName, customLayerColor, customLayerCategoryName = self.read_legendBakePar(legendBakePar)
if (customLayerName == None):
# nothing added to "layerName_" input of "Legend Bake Parameters" component
#category = category
pass
else:
# something added to "layerName_" input of "Legend Bake Parameters" component
category = customLayerName
if (customLayerColor == None) and (category_color != None):
# nothing added to "layerColor_" input of "Legend Bake Parameters" component, AND "category_color" has been defined through inputs
#category_color = category_color
pass
elif (customLayerColor != None):
# something added to "layerColor_" input of "Legend Bake Parameters" component
category_color = customLayerColor
elif (customLayerColor == None) and (category_color == None):
# nothing added to "layerColor_" input of "Legend Bake Parameters" component, AND "category_color" has NOT been defined through inputs
category_color = System.Drawing.Color.FromArgb(0,0,0) # default, black
if (customLayerCategoryName == None):
# nothing added to "layerCategoryName_" input of "Legend Bake Parameters" component
#layerCategoryName = layerCategoryName
pass
else:
# something added to "layerCategoryName_" input of "Legend Bake Parameters" component
projectName = customLayerCategoryName
# add "newLayerCategory_ (boolean)" input to "Legend Bake Parameters" component
newLayerCategory = False # default, until "newLayerCategory_ (boolean)" input gets added to the "Legend Bake Parameters" component
if (laySubName_color == None):
laySubName_color = System.Drawing.Color.FromArgb(100,191,70) # green
# setup parent and sublayers
layerT = Rhino.RhinoDoc.ActiveDoc.Layers
layParent = Rhino.DocObjects.Layer.GetDefaultLayerProperties()
laySub = Rhino.DocObjects.Layer.GetDefaultLayerProperties()
laySubPath = layParentName + "::" + laySubName
layParent.Name = layParentName
laySub.Name = laySubName
layParent.Color = System.Drawing.Color.FromArgb(29,42,85)
laySub.Color = laySubName_color
# adding parent/sublayers
layParentIndex = layerT.Find(layParentName, True)
if layParentIndex >= 0:
parent = layerT[layParentIndex]
laySub.ParentLayerId = parent.Id
index = layerT.Add(laySub)
else:
layerT.Add(layParent)
laySubIndex = Rhino.DocObjects.Tables.LayerTable.FindByFullPath(layerT, laySubPath, True)
if laySubIndex < 0:
layParentIndex = layerT.Find(layParentName, True)
parent = layerT[layParentIndex]
laySub.ParentLayerId = parent.Id
index = layerT.Add(laySub)
# check projectName
if projectName:
projectName = str(projectName)
else:
projectName = "Project"
if Rhino.DocObjects.Layer.IsValidName(projectName) == False:
print "Layer name: '" + projectName + "' is not a valid layer name"
return None, None
# setting up and adding projectname_n layers
layerPCAIndex = layerT.Find(laySubName, True)
layerPCA = layerT[layerPCAIndex]
project_n = Rhino.DocObjects.Layer.GetDefaultLayerProperties()
project_n.IsVisible = False
project_n.ParentLayerId = layerPCA.Id
projectNameLayers = layerPCA.GetChildren()
if not projectNameLayers:
projectName_n = projectName + "_0"
project_n.Name = projectName_n
project_nIndex = layerT.Add(project_n)
elif projectNameLayers:
integers = []
try:
for l in projectNameLayers:
if projectName in l.Name:
integers.append(int(l.Name.split(projectName + "_")[-1]))
lastLayer = l.Name
integers.sort()
maxInt = integers[-1]
if newLayer == True:
projectName_n = projectName + "_" + str(maxInt + 1)
project_n.Name = projectName_n
project_nIndex = layerT.Add(project_n)
else:
project_nIndex = layerT.Find(lastLayer, True)
except:
project_n.Name = projectName + "_0"
project_nIndex = layerT.Add(project_n)
# setting up and adding category layers
project_n = layerT[project_nIndex]
categoryL = Rhino.DocObjects.Layer.GetDefaultLayerProperties()
if (category_color == None):
category_color = System.Drawing.Color.FromArgb(0,0,0) # default, black color of the final layer
categoryL.Color = category_color
categoryL.ParentLayerId = project_n.Id
projectNameLayers = project_n.GetChildren()
integers = []
if projectNameLayers:
for l in projectNameLayers:
splittedLayerName = l.Name.split("_")
layerNameWithoutNumber = "_".join(splittedLayerName[:-1])
#layerNameWithoutNumber = l.Name.split("_")[0]
if category == layerNameWithoutNumber:
integers.append(int(l.Name.split(category + "_")[-1]))
try:
integers.sort()
maxInt = integers[-1]
categoryName_n = category + "_" +str(int(maxInt)+1)
categoryL.Name = categoryName_n
categoryIndex = layerT.Add(categoryL)
except Exception, e:
categoryL.Name = category + "_0"
categoryIndex = layerT.Add(categoryL)
maxInt = -1
else:
categoryL.Name = category + "_0"
categoryIndex = layerT.Add(categoryL)
maxInt = -1
return categoryIndex, categoryL.Name
def bakeGeometry(self, geometryToBakeL, layerIndex):
"""
add the geometry to the Rhino scene
"""
# attributes
attr = Rhino.DocObjects.ObjectAttributes()
attr.LayerIndex = layerIndex
attr.ColorSource = Rhino.DocObjects.ObjectColorSource.ColorFromObject
attr.PlotColorSource = Rhino.DocObjects.ObjectPlotColorSource.PlotColorFromObject
# bake
geometryBaseTypes = [Rhino.Geometry.AnnotationBase, Rhino.Geometry.Brep, Rhino.Geometry.BrepLoop, Rhino.Geometry.Curve, Rhino.Geometry.PolyCurve, Rhino.Geometry.NurbsCurve, Rhino.Geometry.DetailView, Rhino.Geometry.Hatch, Rhino.Geometry.Light, Rhino.Geometry.Mesh, Rhino.Geometry.Point, Rhino.Geometry.Point3dGrid, Rhino.Geometry.PointCloud, Rhino.Geometry.Surface, Rhino.Geometry.NurbsSurface, Rhino.Geometry.TextDot]
geometryIds = []
for obj in geometryToBakeL:
if type(obj) in geometryBaseTypes:
id = Rhino.RhinoDoc.ActiveDoc.Objects.Add(obj, attr)
elif type(obj) == Rhino.Geometry.Circle:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddCircle(obj, attr)
elif type(obj) == Rhino.Geometry.Extrusion:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddExtrusion(obj, attr)
elif type(obj) == Rhino.Geometry.Line:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(obj, attr)
elif type(obj) == Rhino.Geometry.Plane:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(obj.Origin, attr)
elif type(obj) == Rhino.Geometry.Point3d:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(obj, attr)
elif type(obj) == Rhino.Geometry.Polyline:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(obj, attr)
elif type(obj) == Rhino.Geometry.Sphere:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddSphere(obj, attr)
elif type(obj) == Rhino.Geometry.TextEntity:
id = Rhino.RhinoDoc.ActiveDoc.Objects.AddText(obj, attr)
else:
#del geometryToBakeL
print "######## no valid type has been found for particular item in \"geometryToBakeL\""
print "type(obj): ", type(obj)
return None # no valid type has been found for particular item in "geometryToBakeL"
geometryIds.append(id)
del geometryToBakeL
return geometryIds
def groupGeometry(self, groupName, geometryIds):
"""
group the rhino geometry based on rhino ids
"""
groupIndex = Rhino.RhinoDoc.ActiveDoc.Groups.Add(groupName + "_" + str(time.time()))
Rhino.RhinoDoc.ActiveDoc.Groups.AddToGroup(groupIndex, geometryIds)
del geometryIds
return groupIndex
def arrayToList2(self, arr):
"""convert a dotNET array (and NOT nested dotNET array!) to a python list.
This function can be used to convert StrongBox[Array[type]] to python list, because 'ds.ArrayToList' fails."""
L = []
enumerator = arr.GetEnumerator()
while enumerator.MoveNext():
item = enumerator.Current
L.append( item )
return L
class CreateGeometry():
"""
methods which create some sort of geometry
"""
def polygonCrv(self, pln, radius=10, numOfSeg=4, filletRadius=0):
"""create a polygon at the 'pln'. Polygon's starting point will be at 'pln's Y+, counter-clockwise oriented.
input:
pln - plane
radius - cirle radius on which polygon points lie
numOfseg - number of polygon segments
filletRadius - the fillet of polygon corners. By default it is set to 0 - no fillet. ## WARNING ## Too big filletRadius (depending on 'radius' value) may create corrupted crv.
output: polygon crv"""
# based on: https://blenderartists.org/t/what-is-a-good-way-to-create-polygons-via-python/589082/2
# create polygon crv in XY plane, then transform it to 'pln' input
angleD_max = 360 # do not change. Full circle
angleD = 0 # initial value
step = angleD_max / numOfSeg # initial value
controlPt_L = []
for i in range(numOfSeg):
angleR = math.radians(angleD)
controlPt = rg.Point3d(math.sin(angleR)*radius, math.cos(angleR)*radius, 0)
angleD += step
controlPt_L.append(controlPt)
controlPt_L.append(controlPt_L[0]) # close the ply
# upper code creates controlPt clockwise starting from Y+ (the starting point is at Y+)
controlPt_L.reverse()
# fillet
polygon_ply = rg.Polyline(controlPt_L)
polygon_crv = polygon_ply.ToPolylineCurve() # conver ply to crv
if (filletRadius > 0):
polygonFillet_crv = rg.Curve.CreateFilletCornersCurve(polygon_crv, filletRadius, tol, tolAngleD)
else: polygonFillet_crv = polygon_crv
# transfrom 'polygonFillet_crv' from XY plane to 'pln'
worldXY = rg.Plane(rg.Point3d(0,0,0), rg.Vector3d(0,0,1))
xform = rg.Transform.PlaneToPlane(worldXY, pln)
polygonFillet_crv.Transform(xform)
return polygonFillet_crv
def explodeCrv(self, crv, returnItselfIfLine=False):
"""Explodes, or un-joins, one curves. Unlike rs.ExplodeCurves this method returns crv objects not guids
## WARNING ## if a crv can not be exploded, and empty list will be returned !!! To prevent this, and return the crv itself, set the input 'returnItselfIfLine=True'.
input: crv's object or guid
output:
a list of exploded crv objects
or if 'crv' is a line then:
and empty list if 'returnItselfIfLine=False'
or the input '[crv]' itself if 'returnItselfIfLine=True'.
"""
if type(crv) == System.Guid:
crv = rs.coercecurve(crv)
if type(crv) == rg.Polyline:
segL = []
for i in range(crv.SegmentCount):
segL.append( crv.SegmentAt(i) )
return segL
else:
segL = crv.DuplicateSegments()
if (len(segL) == 0): # 'crv' is a line
if returnItselfIfLine:
return [transform.Copy(crv)] # return the line itself, instead of an empty list
else:
return []
else:
return segL
def srfDivide(self, BF, U, V):
"""create a grid of pts on a surface.
input:
BF
U - number of divisions in U direction + 1
V - number of divisions in V direction + 1
output:
divPt_L, divPtNormal_L, UV_LL"""
Udomain = BF.Domain(0)
Vdomain = BF.Domain(1)
U_step = 1 / U
V_step = 1 / V
U_t_normalized = 0
V_t_normalized = 0
# output lists
divPt_L = []
divPtNormal_L = []
UV_LL = []
for i in xrange(U + 1):
for g in xrange(V + 1):
U_t = Udomain.ParameterAt(U_t_normalized)
V_t = Vdomain.ParameterAt(V_t_normalized)
divPt = BF.PointAt(U_t, V_t)
isPtOnBF = BF.IsPointOnFace(U_t, V_t)
if (isPtOnBF == rg.PointFaceRelation.Exterior): # add 'None' for divPt which is outside of BF. This is consistent with grasshopper 'Divide Surface' component
# pt is outside of BF. Add 'None'
divPt = None
divPtNormal = None
else:
divPtNormal = BF.NormalAt(U_t, V_t)
# append to lists
divPt_L.append( divPt )
divPtNormal_L.append( divPtNormal )
UV_LL.append( (U_t, V_t) )
V_t_normalized += V_step
V_t_normalized = 0 # reset V_t_normalized
U_t_normalized += U_step
return divPt_L, divPtNormal_L, UV_LL
def explodeMesh(self, mesh):
"""explode a mesh to mesh faces, and then convert them to individual meshes.
input:
mesh to explode
output:
a) a list of exploded mesh faces converted to individual meshes on success.
b) if input mesh has only one mesh face, then the copy itself will be returned
c) if explode failed, then 'None' will be returned."""
mesh_EM_L = rg.Mesh.ExplodeAtUnweldedEdges(mesh)
if (mesh_EM_L.Count == 0): # I think this happens when input mesh has only one mesh face, so the explode is not possible
return [mesh]
return mesh_EM_L
def calculateMeshFaceAreas(self, mesh):
"""
calculate each mesh face area
"""
def triangleMeshFaceArea(A,B,C):
# Heron's formula
a = A.DistanceTo(B)
b = B.DistanceTo(C)
c = A.DistanceTo(C)
s = (a+b+c)/2 # triangle semiperimeter
triangleMeshFaceArea = math.sqrt(s * (s - a) * (s - b) * (s - c))
return triangleMeshFaceArea
meshFaces = mesh.Faces
meshVertices = mesh.Vertices
meshFaceAreas = []
for mFace in meshFaces:
if mFace.IsTriangle:
triangleMeshFaceArea1 = triangleMeshFaceArea(meshVertices[mFace.A], meshVertices[mFace.B], meshVertices[mFace.C])
triangleMeshFaceArea2 = 0
elif mFace.IsQuad:
d1 = meshVertices[mFace.A].DistanceTo(meshVertices[mFace.C])
d2 = meshVertices[mFace.B].DistanceTo(meshVertices[mFace.D])
if d1 > d2:
triangleMeshFaceArea1 = triangleMeshFaceArea(meshVertices[mFace.D], meshVertices[mFace.A], meshVertices[mFace.B])
triangleMeshFaceArea2 = triangleMeshFaceArea(meshVertices[mFace.D], meshVertices[mFace.B], meshVertices[mFace.C])
else:
triangleMeshFaceArea1 = triangleMeshFaceArea(meshVertices[mFace.A], meshVertices[mFace.B], meshVertices[mFace.C])
triangleMeshFaceArea2 = triangleMeshFaceArea(meshVertices[mFace.A], meshVertices[mFace.C], meshVertices[mFace.D])
meshFaceAreas.append(triangleMeshFaceArea1+triangleMeshFaceArea2)
return meshFaceAreas
def meshFromPoints(self, u, v, pts, meshColors=None):
"""
create a mesh from a grid of points
"""
mesh = Rhino.Geometry.Mesh()
if (meshColors == None) or (len(meshColors) == 0):
for pt in pts:
mesh.Vertices.Add(pt)
else:
for i,pt in enumerate(pts):
mesh.Vertices.Add(pt)
mesh.VertexColors.Add(meshColors[i])
for i in xrange(1,u):
for k in xrange(1,v):
mesh.Faces.AddFace(k-1+(i-1)*v, k-1+i*v, k-1+i*v+1, k-1+(i-1)*v+1)
return mesh
def colorMeshVertices(self, mesh, colors):
"""
color the vertices of a mesh in-place!
"""
mesh_numOfVertices = mesh.Vertices.Count
mesh.VertexColors.Clear()
for i in range(mesh_numOfVertices):
mesh.VertexColors.Add(colors[i])
del colors
return mesh # colored mesh
def convertCrvToPolyline(self, crv, explodePolyline = False):
"""
convert a curve to polyline. For a given single curve, it returns a list!
"""
nurbsCrv = crv.ToNurbsCurve()
convertedToPolyline_Success, polyline = nurbsCrv.TryGetPolyline()
if (convertedToPolyline_Success == True):
# conversion succeeded
pass
if (convertedToPolyline_Success == False):
# conversion failed. "crv" is not a polyline nor a polycurve
distanceTol = 0.0
angleTol = 0.0
minimumSegmentLength = 0.5 # in rhino document units
polyline, numOfSegments = ghc.CurveToPolyline(crv, distanceTol, angleTol, minimumSegmentLength)
if (explodePolyline == True):
nurbsCrv2 = polyline.ToNurbsCurve()
explodedLines = nurbsCrv2.DuplicateSegments()
if (len(explodedLines) == 0):
# the "polyline" was a line, it can not be exploded further
return [polyline]
elif (len(explodedLines) > 0):
return explodedLines
else:
return [polyline]
def curveRoundedOrNot(self, crv):
"""
check if the curve has rounded corners, or they are all sharp
"""
continuityType = 2
cornerPts = rs.CurveDiscontinuity(crv, continuityType)
cornerPts.extend(cornerPts)
startPt = crv.PointAtStart
cornerPts.append(startPt)
maximumDistance = 0
for pt in cornerPts:
success, t = crv.ClosestPoint(pt, maximumDistance)
pt, tangent, angleR = ghc.EvaluateCurve(crv, t) # "angleR" - angle between incoming vs outgoing curve at "t"
angleD = math.degrees(angleR)
if angleD >= 90:
curveIsNotRounded = True
break
else:
curveIsNotRounded = False
del cornerPts
return curveIsNotRounded
def cullClosePolylinePts(self, polyline, distance = 0.01):
"""
culling polyline points which are closer than "closeDistance" to the last polyline point
"""
# get polyline pts:
controlPts = list(polyline)
newPolylinePts = []
for i,pt in enumerate(controlPts):
if i == 0:
lastPt = pt
newPolylinePts.append(lastPt)
elif i > 0:
if lastPt.DistanceTo(pt) > distance:
lastPt = pt
newPolylinePts.append(lastPt)
else:
pass
del controlPts
newPolyline = Rhino.Geometry.Polyline(newPolylinePts)
return newPolyline
def createLegend(self, geometryL, values_uncorrected, legendBakePar, legendUnit=None, customCellNumbers=[]):
"""
create a legend for the given "values"
"""
# read the "legendBakePar_"
gismo_preparation = Preparation()
legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, fontName, fontSize, numDecimals, customLegendUnit, customTitle, scale, layerName, layerColor, layerCategoryName = gismo_preparation.read_legendBakePar(legendBakePar)
# modify "values_uncorrected" accorind to "maxValue_" and "minValue_" inputs
maxValue_modified = False
minValue_modified = False
maxValue_uncorrected = max(values_uncorrected)
minValue_uncorrected = min(values_uncorrected)
values = []
for value in values_uncorrected:
if (maxValue != None):
if (maxValue < maxValue_uncorrected): # check in case "maxValue_" is larger than the largest value in "values"
maxValue_modified = True
if value > maxValue:
value = maxValue
if (minValue != None):
if (minValue > minValue_uncorrected): # check in case "minValue_" is smaller than the smallest value in "values"
minValue_modified = True
if value < minValue:
value = minValue
values.append(value)
if (len(customColors) == 0):
customColors = gismo_preparation.defaultCustomColors()
if (customLegendUnit == None) and (legendUnit == None):
# nothing inputted into "legendUnit_" input of "Legend Bake Parameters" component. And no "legendUnit" has been supplied to this method
legendUnit = "unknown unit"
elif (customLegendUnit != None):
# something inputted into "legendUnit_" input of "Legend Bake Parameter" component
legendUnit = customLegendUnit
if sum(values) == (len(values)*values[0]):
# all items in "values" are the same: meaning all colors will be the same. Set the "numLegendCells" to 1
numLegendCells = 1
if (len(customCellNumbers) != 0):
# if "customCellNumbers" list has been added as an input to this method, then limit the "numLegendCells" to the number of items in the "customCellNumbers" list
numLegendCells = len(customCellNumbers)
if (customLegendUnit == None):
# nothing inputted into "legendUnit_" input of "Legend Bake Parameters" component.
legendUnit = "~"
# calculate bounding box properties from the "geometryL"
bb_volume, bb_centroid, bb_length, bb_depth, bb_height, bb_bottomLeftCorner, bb_bottomRightCorner, bb_topRightCorner, bb_topLeftCorner = gismo_preparation.boundingBox_properties(geometryL, accurate=True)
# cell size, text size
legendCellWidth = bb_length/10 * scale
legendCellHeight = legendCellWidth * 0.75
if (fontSize == None):
cellNumber_textSize = legendCellWidth/3.5
else:
# something inputted to "fontSize_"
cellNumber_textSize = fontSize
# cellNumbers, cellColors
valuesMin = min(values)
valuesMax = max(values)
if numLegendCells == 1:
# fix for "Attempted to divide by zero" error
step = (valuesMax-valuesMin)/1
else:
step = (valuesMax-valuesMin)/(numLegendCells-1)
cellNumbers = []
for i in range(numLegendCells):
cellNumber = valuesMin + i*step
cellNumbers.append(cellNumber)
cellColors = gismo_preparation.numberToColor(cellNumbers, customColors, minValue, maxValue)
# create the bottom cell
legendStartPt = Rhino.Geometry.Point3d(bb_bottomRightCorner)
legendStartPlane = Rhino.Geometry.Plane(legendStartPt, Rhino.Geometry.Vector3d(0,0,1))
bottomCellStartPt = Rhino.Geometry.Point3d(legendStartPt.X + (bb_depth * 0.1), legendStartPt.Y, legendStartPt.Z)
bottomCellStartPlane = Rhino.Geometry.Plane(bottomCellStartPt, Rhino.Geometry.Vector3d(0,0,1))
bottomCell = Rhino.Geometry.Rectangle3d(bottomCellStartPlane, legendCellWidth, legendCellHeight).ToNurbsCurve()
if (legendStyle == 0):
# rectangular cells
degree = 3
elif (legendStyle == 1) or (legendStyle == 2) or (legendStyle == 3):
bottomCell.Domain = Rhino.Geometry.Interval(0,1)
if (legendStyle == 1):
# filleted cells
tL = [0, 0.05, 0.20, 0.25, 0.35, 0.40, 0.5, 0.55, 0.7, 0.75, 0.85, 0.90, 1.0]
degree = 3
elif(legendStyle == 2):
# elliptical cells
tL = [0.125, 0.375, 0.625, 0.875, 0.125]
degree = 3
curveKnotStyle = Rhino.Geometry.CurveKnotStyle.UniformPeriodic
elif(legendStyle == 3):
# rhombus cells
tL = [0.125, 0.375, 0.625, 0.875, 0.125]
interpolateCrv_pts = []
for t in tL:
pt = bottomCell.PointAt(t)
interpolateCrv_pts.append(pt)
if(legendStyle == 2):
bottomCell = Rhino.Geometry.Curve.CreateInterpolatedCurve(interpolateCrv_pts, degree, curveKnotStyle)
elif(legendStyle == 3):
bottomCell = Rhino.Geometry.Polyline(interpolateCrv_pts).ToNurbsCurve()
else:
bottomCell = Rhino.Geometry.Curve.CreateControlPointCurve(interpolateCrv_pts, degree)
# create the legend
myGismo_geometry = CreateGeometry()
meshParam = Rhino.Geometry.MeshingParameters()
meshParam.SimplePlanes = True
legendCells_joinedMesh = Rhino.Geometry.Mesh()
cellNumber_joinedMesh = Rhino.Geometry.Mesh()
cellNumber_startPts = []
for i in range(numLegendCells):
transformMatrix = Rhino.Geometry.Transform.Translation(0,legendCellHeight,0)
copied_bottomCell = bottomCell.Duplicate()
moveSuccess = copied_bottomCell.Translate(0,i*legendCellHeight,0)
# create the mesh cell
copied_bottomCell_srf = Rhino.Geometry.Brep.CreatePlanarBreps([copied_bottomCell])[0]
copied_bottomCell_mesh = Rhino.Geometry.Mesh.CreateFromBrep(copied_bottomCell_srf, meshParam)[0]
legendCells_mesh_colors = [cellColors[i]] * copied_bottomCell_mesh.Vertices.Count
copied_bottomCell_mesh_colored = myGismo_geometry.colorMeshVertices(copied_bottomCell_mesh, legendCells_mesh_colors)
legendCells_joinedMesh.Append(copied_bottomCell_mesh_colored)
# create the cell number start point
cellNumber_startPt = Rhino.Geometry.Point3d(bottomCellStartPt.X + legendCellWidth*1.2, bottomCellStartPt.Y + i*legendCellHeight, bottomCellStartPt.Z)
cellNumber_startPts.append(cellNumber_startPt)
# create cellNumber_joinedMesh
if (len(customCellNumbers) != 0):
# the "customCellNumbers" input of this method has been defined
cellNumber_string = customCellNumbers[i]
else:
# the "customCellNumbers" input of this method has NOT been defined
cellNumber_string = cellNumbers[i]
if (numDecimals == 0):
cellNumber_string = "%0.0f" % cellNumber_string
elif (numDecimals == 1):
cellNumber_string = "%0.1f" % cellNumber_string
elif (numDecimals == 2):
cellNumber_string = "%0.2f" % cellNumber_string
elif (numDecimals == 3):
cellNumber_string = "%0.3f" % cellNumber_string
elif (numDecimals == 4):
cellNumber_string = "%0.4f" % cellNumber_string
elif (numDecimals == 5):
cellNumber_string = "%0.5f" % cellNumber_string
elif (numDecimals == 6):
cellNumber_string = "%0.6f" % cellNumber_string
# add "<" to the first legend cell number, and ">" to the last one, in case "minValue_" and "maxValue_" have been defined
if (i == 0) and (minValue_modified == True):
cellNumber_string = "≤ " + cellNumber_string
elif (i == (numLegendCells-1)) and (maxValue_modified == True):
cellNumber_string = "≥ " + cellNumber_string
cellNumber_mesh = gismo_preparation.text2srfOrMesh("mesh", [cellNumber_string], cellNumber_startPt, cellNumber_textSize, fontName, bold=False, italic=False, justificationIndex=0)
cellNumber_joinedMesh.Append(cellNumber_mesh)
legendUnits_startPt = Rhino.Geometry.Point3d(cellNumber_startPts[-1].X, cellNumber_startPts[-1].Y + legendCellHeight, cellNumber_startPts[-1].Z)
legendUnits_mesh = gismo_preparation.text2srfOrMesh("mesh", [legendUnit], legendUnits_startPt, cellNumber_textSize, fontName, bold=False, italic=False, justificationIndex=0)
# join cells and text into a single mesh
legend_allMeshes_joined = Rhino.Geometry.Mesh()
legend_allMeshes_joined.Append(legendCells_joinedMesh)
legend_allMeshes_joined.Append(cellNumber_joinedMesh)
legend_allMeshes_joined.Append(legendUnits_mesh)
# orient the whole legend in case "legendPlane_" has been defined
if (legendPlane != None):
transformMatrix = Rhino.Geometry.Transform.PlaneToPlane(legendStartPlane, legendPlane)
transformSuccess = legend_allMeshes_joined.Transform(transformMatrix)
return legend_allMeshes_joined, legendPlane
else:
return legend_allMeshes_joined, legendStartPlane
def compassDirections(self, originPt, radius, scale, northVec, textSize=None):
"""
create compass directions curves and labels for 30 degrees increment
"""
# create circles
myPreparation = Preparation()
unitConversionFactor, unitSystem = myPreparation.checkUnits()
circleRadius = scale * (radius/unitConversionFactor) # 200 meters is fixed radius
originPt_plane = Rhino.Geometry.Plane(originPt, Rhino.Geometry.Vector3d(0,1,0), Rhino.Geometry.Vector3d(1,0,0))
# rotate originPt_plane for northVec
angleR = Rhino.Geometry.Vector3d.VectorAngle( Rhino.Geometry.Vector3d(0,1,0), northVec, Rhino.Geometry.Plane(originPt, Rhino.Geometry.Vector3d(0,0,-1)) )
rotateSuccess = originPt_plane.Rotate(angleR, Rhino.Geometry.Vector3d(0,0,-1))
circle = Rhino.Geometry.Circle(originPt_plane, circleRadius).ToNurbsCurve()
circle2 = Rhino.Geometry.Circle(originPt, 1.05*circleRadius).ToNurbsCurve()
circle3 = Rhino.Geometry.Circle(originPt, 1.07*circleRadius).ToNurbsCurve()
# divide circle
numOfDiv = 12 # divide 360 by 30 degrees increments
includeEnds = True
divisionParameters = circle.DivideByCount(numOfDiv, includeEnds)
divisionPts = []
moveVectors = [] # vectors for moving the 0,30,60... labels
justificationIndexL = []
for t in divisionParameters:
pt = circle.PointAt(t)
divisionPts.append(pt)
moveVec = pt - originPt
moveVectors.append(moveVec)
angleR2 = Rhino.Geometry.Vector3d.VectorAngle( Rhino.Geometry.Vector3d(0,1,0), moveVec, Rhino.Geometry.Plane(originPt, Rhino.Geometry.Vector3d(0,0,-1)) )
# determine justificationIndex
if (math.degrees(angleR2) == 0) or (math.degrees(angleR2) == 360):
justificationIndex = 1
elif (math.degrees(angleR2) > 0) and (math.degrees(angleR2) < 90):
justificationIndex = 0
elif (math.degrees(angleR2) == 90):
justificationIndex = 3
elif (math.degrees(angleR2) > 90) and (math.degrees(angleR2) < 180):
justificationIndex = 6
elif (math.degrees(angleR2) == 180):
justificationIndex = 7
elif (math.degrees(angleR2) > 180) and (math.degrees(angleR2) < 270):
justificationIndex = 8
elif (math.degrees(angleR2) == 270):
justificationIndex = 5
elif (math.degrees(angleR2) > 270) and (math.degrees(angleR2) < 360):
justificationIndex = 2
justificationIndexL.append(justificationIndex)
# create lines, textLabels
textL = ["N", 30, 60, "E", 120, 150, "S", 210, 240, "W", 300, 330]
if (textSize == None):
# no textSize defined
textSizeL = [circleRadius/20, circleRadius/24, circleRadius/24, circleRadius/20, circleRadius/24, circleRadius/24, circleRadius/20, circleRadius/24, circleRadius/24, circleRadius/20, circleRadius/24, circleRadius/24]
else:
# textSize defined
textSizeL = [textSize, textSize/1.2, textSize/1.2, textSize, textSize/1.2, textSize/1.2, textSize, textSize/1.2, textSize/1.2, textSize, textSize/1.2, textSize/1.2]
fontName = "Verdana"
bold = True
italic = False
lines = []
textLabels = []
for i,pt in enumerate(divisionPts):
line = Rhino.Geometry.Line(pt, pt + 0.1*moveVectors[i]).ToNurbsCurve()
lines.append(line)
textLabel = myPreparation.text2srfOrMesh("mesh", [textL[i]], pt + 0.11*moveVectors[i], textSizeL[i], fontName, bold, italic, justificationIndexL[i])
textLabels.append(textLabel)
compassCrvs = [circle, circle2, circle3] + lines
return divisionPts, compassCrvs, textLabels
def liftingOSMshapes_from_groundTerrain(self, shapesL, groundBrep_singleBrepFace, height, minHeight=None, bottomCrvControlPt_highestZcoord=None):
"""
projecting OSM shapes to groundTerrain_ and then lifting them to a plane for height or minHeight above the highest shape point
"""
topCrvs = []
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
for shapeIndex, shape in enumerate(shapesL):
if (groundBrep_singleBrepFace == None):
projectionPlane = Rhino.Geometry.Plane(Rhino.Geometry.Point3d(0,0,shape.PointAtStart.Z), Rhino.Geometry.Vector3d(0,0,1)) # it always be constant because each shapesL has a constant height (coming from "OSM shapes" component)
projectedShapeCrvs = [Rhino.Geometry.Curve.ProjectToPlane(shape, projectionPlane)]
elif (groundBrep_singleBrepFace != None):
projectionDirection = Rhino.Geometry.Vector3d(0,0,1) # it can be projectionDirection = Rhino.Geometry.Vector3d(0,0,-1) as well, does not matter
projectedShapeCrvs = Rhino.Geometry.Curve.ProjectToBrep(shape, groundBrep_singleBrepFace, projectionDirection, tol)
if len(projectedShapeCrvs) == 0: # the shape is located outside of the "groundTerrain_" ("if groundTerrain_" inputted. If "groundTerrain_" not inputted, len(projectedShapeCrvs) will never be equal to 0)
topCrvPts = []
#topCrvs = [] # its already defined at the start of this method, so an empty list will be returned
elif len(projectedShapeCrvs) != 0:
#joinedProjectedShapeCrvs = Rhino.Geometry.Curve.JoinCurves(projectedShapeCrvs, tol)
if (not shape.IsClosed):
# shape is not closed (probably shapeType = 1), so there is no need to lift it, as it will not be extruded
topCrvs.extend(projectedShapeCrvs)
bottomCrvControlPt_highestZcoord = projectedShapeCrvs[0].PointAtStart.Z
elif shape.IsClosed:
# shape is closed (shapeType = 0)
projectedShapeCrv = projectedShapeCrvs[0] # always take the first curve from the list of shapes projected curves
if (not projectedShapeCrv.IsClosed):
# the projected shape is not a closed curve anymore (it was before the projection). This happens when shape intersects with the "groundTerrain_" bounding box
line = Rhino.Geometry.Line(projectedShapeCrv.PointAtStart, projectedShapeCrv.PointAtEnd).ToNurbsCurve()
joinedPolyCrv = Rhino.Geometry.Curve.JoinCurves([projectedShapeCrv,line], tol)[0]
bottomCrv = joinedPolyCrv.ToNurbsCurve()
else:
# the projected shape is still a closed curve (and it was before the projection)
bottomCrv = projectedShapeCrv.ToNurbsCurve()
# find the highest Z coordinate of the shape edit points
bottomCrvControlPts = bottomCrv.GrevillePoints()
if (bottomCrvControlPt_highestZcoord == None): # it may != None for shapes which are included in other building shapes (like shapes which have valid "building:part" key)
if shapeIndex == 0: # this is a fix in case the "shapesL" has more than one shape. If it does then their topCrv can be created to different Z coordinate, and therefor not being able to be capped together with other topCrv from the same "shapeL".
bottomCrvControlPt_highestZcoord = -10000 # dummy value
for bottomCrvControlPt in bottomCrvControlPts:
if bottomCrvControlPt.Z > bottomCrvControlPt_highestZcoord:
bottomCrvControlPt_highestZcoord = bottomCrvControlPt.Z
# move the shape edit points upwards for: bottomCrvControlPt_highestZcoord + minHeight/height, in order to create the topCrv
topCrvPts = []
for bottomCrvControlPt in bottomCrvControlPts:
if minHeight != "":
# there is a valid "min_height" key. Lift the projected points for this value
topCrvPt = Rhino.Geometry.Point3d(bottomCrvControlPt.X, bottomCrvControlPt.Y, bottomCrvControlPt_highestZcoord + height)
else:
# there is no valid "min_height" key. Lift the projected points for the "height" value
topCrvPt = Rhino.Geometry.Point3d(bottomCrvControlPt.X, bottomCrvControlPt.Y, bottomCrvControlPt_highestZcoord + height)
topCrvPts.append(topCrvPt)
topCrv = Rhino.Geometry.Polyline(topCrvPts).ToNurbsCurve()
topCrvs.append(topCrv)
del shapesL
del groundBrep_singleBrepFace
del topCrvPts
return topCrvs, bottomCrvControlPt_highestZcoord
def projectPlanarClosedCrvsToTerrain(self, planarCrvsL, groundTerrainBrep, groundTerrain_outerEdge_extrusion):
"""
project planar closed curves to a single face brep and make their footprints on terrain
"""
# get unitConversionFactor
gismo_preparation = Preparation()
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
if (groundTerrainBrep == None):
planarSrfs = Rhino.Geometry.Brep.CreatePlanarBreps(planarCrvsL) # returns a list!
validGroundTerrain = True
printMsg = "ok"
return planarSrfs, [], validGroundTerrain, printMsg
elif (groundTerrainBrep != None):
# extract Faces[0] from "groundTerrain_",
# shrink the upper terrain brepface in case it is not shrinked (for example: the terrain surface inputted to _terrain input is not created by Gismo "Terrain Generator" component)
groundTerrainBrepFaces = groundTerrainBrep.Faces
groundTerrainBrepFaces.ShrinkFaces()
duplicateMeshes = False
groundBrep_singleBrepFace = groundTerrainBrepFaces[0].DuplicateFace(duplicateMeshes)
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
# move _roadShapes above so that intersection with groundTerrain_ is fullfiled successfully
#####liftingOSMshapesHeight = 8848/unitConversionFactor # "8848" dummy value
liftingOSMshapesHeight = 260/unitConversionFactor
bb_height = 100/unitConversionFactor # "100" dummy value
moveMatrix = Rhino.Geometry.Transform.Translation(0,0,liftingOSMshapesHeight)
for planarOffsetRoadsCrv in planarCrvsL:
planarOffsetRoadsCrv.Transform(moveMatrix)
extrudedShapeBrepL = []
srfProjectedOnTerainL = []
planarBreps = Rhino.Geometry.Brep.CreatePlanarBreps(planarCrvsL)
for planarBrep in planarBreps:
shapeStartPt = planarOffsetRoadsCrv.PointAtStart
extrudePathCurve = Rhino.Geometry.Line(shapeStartPt, Rhino.Geometry.Point3d(shapeStartPt.X, shapeStartPt.Y, shapeStartPt.Z - (liftingOSMshapesHeight+(2 * bb_height)) )).ToNurbsCurve()
cap = True
extrudedShapeBrep = planarBrep.Faces[0].CreateExtrusion(extrudePathCurve, cap)
extrudedShapeBrepL.append(extrudedShapeBrep)
splittedBreps = Rhino.Geometry.Brep.Split(groundBrep_singleBrepFace, extrudedShapeBrep, tol)
if len(splittedBreps) > 0:
# the planarOffsetRoadsCrv is inside of groundTerrain_ bounding box (a) or it interesect with it (b)
# determine which one of these two is the case
intersectionYes, intersectCrvs, intersectPts = Rhino.Geometry.Intersect.Intersection.BrepBrep(groundTerrain_outerEdge_extrusion, extrudedShapeBrep, tol)
if (len(intersectCrvs) > 0):
#print "terrain edges intersect with road srf"
# planarOffsetRoadsCrv planar srf intersects with groundTerrrain_
# check the planarOffsetRoadsCrv oriention to determine the brep face index in "splittedBreps"
upDirection = Rhino.Geometry.Vector3d(0,0,1)
srfProjectedOnTerrain = splittedBreps[len(splittedBreps)-1] # works!
#srfProjectedOnTerrain = splittedBreps[0]
#print "len(splittedBreps): ", len(splittedBreps)
gotPlane_success, plane = planarOffsetRoadsCrv.TryGetPlane()
if (planarOffsetRoadsCrv.ClosedCurveOrientation(upDirection) == Rhino.Geometry.CurveOrientation.Clockwise):
srfProjectedOnTerrain = splittedBreps[len(splittedBreps)-1] # works?
#srfProjectedOnTerrain = splittedBreps[0]
####print "clockwise"
pass
elif (planarOffsetRoadsCrv.ClosedCurveOrientation(upDirection) == Rhino.Geometry.CurveOrientation.CounterClockwise):
srfProjectedOnTerrain = splittedBreps[0]
####print "counter clockwise"
pass
srfProjectedOnTerrain.Faces.ShrinkFaces() # shrink the cutted srfProjectedOnTerrain
srfProjectedOnTerainL.append(srfProjectedOnTerrain)
elif (len(intersectCrvs) == 0):
####print "terrain edges DO NOT intersect with road srf."
# planarOffsetRoadsCrv planar srf is inside groundTerrain_ and does not intersect it
srfProjectedOnTerrain = splittedBreps[len(splittedBreps)-1]
srfProjectedOnTerrain.Faces.ShrinkFaces() # shrink the cutted srfProjectedOnTerrain
srfProjectedOnTerainL.append(srfProjectedOnTerrain)
else:
# planarOffsetRoadsCrv is outside of groundTerrain_ bounding box, do not add it to the "srfProjectedOnTerainL" list
pass
del planarBrep; del extrudePathCurve; del splittedBreps; del extrudedShapeBrepL; extrudedShapeBrepL = []
# create a single mesh from all surfaces in the "" list
if (len(srfProjectedOnTerainL) == 0):
# the "groundTerrain_" is either too small (has very small radius) or it does not have the same origin as "_roadShapes", meaning the "_roadShapes" can not be projected to "groundBrep_singleBrepFace".
validGroundTerrain = False
printMsg = "Something is wrong with your \"groundTerrain_\" input.\n" + \
"Make sure that when you look at it in Rhino's \"Top\" view, it covers (encapsulates) the whole \"_roadShapes\" geometry or at least some of its parts."
return srfProjectedOnTerainL, extrudedShapeBrepL, validGroundTerrain, printMsg
elif (len(srfProjectedOnTerainL) > 0):
# everything is fine
validGroundTerrain = True
printMsg = "ok"
return srfProjectedOnTerainL, extrudedShapeBrepL, validGroundTerrain, printMsg
def createRenderMesh(self, mesh, u):
"""
create render mesh and its texture image (material diffuse map file).
the code of this method is entirely based on VB.NET components by Vicente Soler:
http://www.grasshopper3d.com/xn/detail/2985220:Comment:663243
"""
mesh.Unweld(0, False)
dt = []
c = mesh.Faces.Count
for i in range(c - 1+1):
sub_dt = []
f = mesh.Faces[i]
color1 = mesh.VertexColors[f.A]
color2 = mesh.VertexColors[f.B]
color3 = mesh.VertexColors[f.C]
color4 = mesh.VertexColors[f.D]
sub_dt.append(System.Drawing.Color.FromArgb(color1.R, color1.G, color1.B))
sub_dt.append(System.Drawing.Color.FromArgb(color2.R, color2.G, color2.B))
sub_dt.append(System.Drawing.Color.FromArgb(color3.R, color3.G, color3.B))
sub_dt.append(System.Drawing.Color.FromArgb(color4.R, color4.G, color4.B))
dt.append(sub_dt)
mesh.TextureCoordinates.Clear()
for i in range(mesh.Vertices.Count):
mesh.TextureCoordinates.Add(0,0)
size = math.ceil(math.sqrt(c))
count = -1
for x in xrange(size - 1+1):
for y in xrange(size - 1+1):
count += 1
if count < c - 1+1:
f = mesh.Faces[count]
sb = size * 2
mesh.TextureCoordinates[f.A] = Rhino.Geometry.Point2f((x * 2 + 0.5) / sb, (y * 2 + 0.5) / sb)
mesh.TextureCoordinates[f.B] = Rhino.Geometry.Point2f((x * 2 + 1.5) / sb, (y * 2 + 0.5) / sb)
mesh.TextureCoordinates[f.C] = Rhino.Geometry.Point2f((x * 2 + 1.5) / sb, (y * 2 + 1.5) / sb)
mesh.TextureCoordinates[f.D] = Rhino.Geometry.Point2f((x * 2 + 0.5) / sb, (y * 2 + 1.5) / sb)
dt_length = len(dt)
size = math.ceil(math.sqrt(dt_length))
sb = size * 2 - 1
bm = System.Drawing.Bitmap(size * 2, size * 2)
bmb = System.Drawing.Bitmap(size * 4, size * 4)
count = -1
for x in xrange(size - 1+1):
for y in xrange(size - 1+1):
count += 1
if count < dt_length - 1+1:
bm.SetPixel(x * 2 + 0, sb - (y * 2 + 0), dt[count][0])
bm.SetPixel(x * 2 + 1, sb - (y * 2 + 0), dt[count][1])
bm.SetPixel(x * 2 + 1, sb - (y * 2 + 1), dt[count][2])
bm.SetPixel(x * 2 + 0, sb - (y * 2 + 1), dt[count][3])
g = System.Drawing.Graphics.FromImage(bmb)
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
g.DrawImage(bm, 0, 0, size * 4 + 1, size * 4 + 1)
bmb.Save(u)
del dt
return mesh
class EnvironmentalAnalysis():
"""
various environmental analysis methods
"""
def noLeavesPeriod(self, criteria, latitude, sunWindowQuadrantIndex, leaflessStartHOY=None, leaflessEndHOY=None):
"""
calculate season(seasonIndex) of the sunWindow Quadrant
"""
if criteria == "perQuadrant":
if latitude > 0: # northern hemisphere
if sunWindowQuadrantIndex < 72:
seasonIndex = 0 # winter/autumn
elif sunWindowQuadrantIndex >= 72:
seasonIndex = 1 # spring/summer
elif latitude < 0: # southern hemisphere
if sunWindowQuadrantIndex < 72:
seasonIndex = 1 # spring/summer
elif sunWindowQuadrantIndex >= 72:
seasonIndex = 0 # winter/autumn
elif criteria == "perHoy":
if leaflessStartHOY < leaflessEndHOY:
if (sunWindowQuadrantIndex >= leaflessStartHOY) and (sunWindowQuadrantIndex <= leaflessEndHOY):
seasonIndex = 0 # leafless period
else:
seasonIndex = 1 # inleaf period
elif leaflessStartHOY > leaflessEndHOY:
if (sunWindowQuadrantIndex >= leaflessStartHOY) or (sunWindowQuadrantIndex <= leaflessEndHOY):
seasonIndex = 0 # leafless period
else:
seasonIndex = 1 # inleaf period
return seasonIndex
def calculateSkyExposureFactor(self, testPt, contextMeshes, latitude, radius, precision, treesTransmissionIndices=[0,[0,0]], leaflessStartHOY=None, leaflessEndHOY=None):
"""
calculate sky exposure factor
"""
# lifting up the testPt due to MeshRay intersection
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
testPtLifted = Rhino.Geometry.Point3d(testPt.X, testPt.Y, testPt.Z+tol)
gismo_geometry = CreateGeometry()
precisionU = precision*5
precisionV = int(precisionU/3.5)
skyDomeHalfSphere = Rhino.Geometry.Sphere(Rhino.Geometry.Plane(Rhino.Geometry.Point3d(testPtLifted),Rhino.Geometry.Vector3d(0,0,1)), radius)
splittedSkyDomeDomainUmin, splittedSkyDomeDomainUmax = [0, 2*math.pi] # sphere diameter
splittedSkyDomeDomainVmin, splittedSkyDomeDomainVmax = [0, 0.5*math.pi] # sphere vertical arc
splittedSkyDomeDomainVmax = 0.995*splittedSkyDomeDomainVmax
stepU = (splittedSkyDomeDomainUmax - splittedSkyDomeDomainUmin)/precisionU
stepV = (splittedSkyDomeDomainVmax - splittedSkyDomeDomainVmin)/precisionV
skyDomePts = []
for i in xrange(0,precisionU):
for k in xrange(0,precisionV):
u = splittedSkyDomeDomainUmin + stepU*i
v = splittedSkyDomeDomainVmin + stepV*k
skyDomePt = skyDomeHalfSphere.PointAt(u,v)
skyDomePts.append(skyDomePt)
skyDomeMeshPts = skyDomePts + skyDomePts[:precisionV] # increases precisionU for 1
skyDomeMesh = gismo_geometry.meshFromPoints(precisionU+1, precisionV, skyDomeMeshPts)
meshFacesCentroids = [skyDomeMesh.Faces.GetFaceCenter(i) for i in xrange(skyDomeMesh.Faces.Count)]
meshFaces = skyDomeMesh.Faces
meshVertices = skyDomeMesh.Vertices
meshFaceAreas = gismo_geometry.calculateMeshFaceAreas(skyDomeMesh)
skyDomeMeshArea = sum(meshFaceAreas)
skyDomeMeshArea2 = Rhino.Geometry.AreaMassProperties.Compute(skyDomeMesh).Area
#print "skyDomeMeshArea: ", skyDomeMeshArea
#print "skyDomeMeshArea2: ", skyDomeMeshArea2
del skyDomeMeshPts
del meshVertices
del meshFaces
del skyDomeMesh
leaflessStartHOYdummy = 0; leaflessEndHOYdummy = 1
skyExposureFactor = 0 # 0 equals to 100% shading, 1 equals to 0% shading
for i,centroid in enumerate(meshFacesCentroids):
raysIntensityWithoutTransmissionIndex = meshFaceAreas[i]/skyDomeMeshArea
vector = Rhino.Geometry.Vector3d(centroid)-Rhino.Geometry.Vector3d(testPtLifted)
ray = Rhino.Geometry.Ray3d(testPtLifted, vector)
for meshIndex,mesh in enumerate(contextMeshes):
intersectParam = Rhino.Geometry.Intersect.Intersection.MeshRay(mesh,ray)
# ray hitted something
if intersectParam >= 0:
seasonIndexDummy = self.noLeavesPeriod("perHoy", latitude, i, leaflessStartHOYdummy, leaflessEndHOYdummy)
if meshIndex == 0: # context mesh hitted
treesTransmissionIndex = 0
elif meshIndex == 1: # coniferousTrees mesh hitted
treesTransmissionIndex = treesTransmissionIndices[0]
elif meshIndex == 2: # deciduousTrees mesh hitted
treesTransmissionIndex = treesTransmissionIndices[1][seasonIndexDummy]
skyExposureFactor += raysIntensityWithoutTransmissionIndex*treesTransmissionIndex
break
# no hitting, the ray only hits the sky dome
else:
treesTransmissionIndex = 1
skyExposureFactor += raysIntensityWithoutTransmissionIndex * treesTransmissionIndex
del meshFacesCentroids
return skyExposureFactor
class GIS():
"""
methods for manipulation of GIS data
"""
def calculate_CRS_UTMzone(self, locationLatitudeD, locationLongitudeD):
"""
calculate CRS UTMzone code based on location's latitude-longitude
"""
# by http://stackoverflow.com/a/9188972/3137724 (link given by Even Rouault)
CRS_UTMzone = (math.floor((locationLongitudeD + 180)/6) % 60) + 1
if locationLatitudeD >= 0:
# for northern hemisphere
northOrsouth = "north"
CRS_EPSG_code = 32600 + CRS_UTMzone
elif locationLatitudeD < 0:
# for southern hemisphere
northOrsouth = "south"
CRS_EPSG_code = 32700 + CRS_UTMzone
return CRS_EPSG_code, int(CRS_UTMzone), northOrsouth
def UTM_CRS_from_latitude(self, locationLatitudeD, locationLongitudeD, originLatitudeD = 0, originLongitudeD = 0):
"""
create UTM CRS from latitude, longitude and anchor latitude, anchor longitude
"""
CRS = MapWinGIS.GeoProjectionClass()
CRS_EPSG_code, CRS_UTMzone, northOrsouth = self.calculate_CRS_UTMzone(locationLatitudeD, locationLongitudeD)
proj4_string = "+proj=utm +zone=%s +%s +datum=WGS84 +ellps=WGS84 +lat_0=%s +lon_0=%s" % (CRS_UTMzone, northOrsouth, originLatitudeD, originLongitudeD)#, resamplingMethod)
CRS.ImportFromProj4(proj4_string)
return CRS
def CRS_from_EPSGcode(self, EPSGcode):
"""
create CRS from EPSG code
"""
CRS = MapWinGIS.GeoProjectionClass()
CRS.ImportFromEPSG(EPSGcode)
return CRS
def convertBetweenTwoCRS(self, inputCRS, outputCRS, firstCoordinate, secondCoordinate):
"""
convert coordinates from one CRS to another
"""
successStartTransform = inputCRS.StartTransform(outputCRS)
secondCoordinate_ref = clr.StrongBox[System.Double](secondCoordinate)
firstCoordinate_ref = clr.StrongBox[System.Double](firstCoordinate)
successTransform = MapWinGIS.GeoProjectionClass.Transform(inputCRS, firstCoordinate_ref, secondCoordinate_ref)
inputCRS.StopTransform()
originPtProjected = Rhino.Geometry.Point3d(firstCoordinate_ref.Value, secondCoordinate_ref.Value, 0)
return originPtProjected
def projectedLocationCoordinates(self, locationLatitudeD, locationLongitudeD):
"""
convert latitude,longitude coordinates to x,y projected coordinates
"""
outputCRS_EPSG_code, CRS_UTMzone, northOrsouth = self.calculate_CRS_UTMzone(locationLatitudeD, locationLongitudeD)
# set the CRS to WGS 84
inputCRS = MapWinGIS.GeoProjectionClass()
inputCRS_EPSG_code = 4326 # WGS 84
inputCRS.ImportFromEPSG(inputCRS_EPSG_code)
# set the output CRS
outputCRS = MapWinGIS.GeoProjectionClass()
outputCRS.ImportFromEPSG(outputCRS_EPSG_code)
successStartTransform = inputCRS.StartTransform(outputCRS)
locationLatitudeD_ref = clr.StrongBox[System.Double](locationLatitudeD)
locationLongitudeD_ref = clr.StrongBox[System.Double](locationLongitudeD)
successTransform = MapWinGIS.GeoProjectionClass.Transform(inputCRS, locationLongitudeD_ref, locationLatitudeD_ref)
inputCRS.StopTransform()
originPtProjected = Rhino.Geometry.Point3d(locationLongitudeD_ref.Value, locationLatitudeD_ref.Value, 0)
return originPtProjected
def projectedLocationCoordinates2(locationLatitudeD, locationLongitudeD, unitConversionFactor):
"""
convert latitude,longitude coordinates to x,y projected coordinates2
this method should be replaced with upper "projectedLocationCoordinates" but only for 4.9.4? > versions of MapWinGIS,
due to lack of MapWinGIS.GeoProjectionClass.Transform method in those MapWinGIS methods
"""
outputCRS_EPSG_code, CRS_UTMzone, northOrsouth = self.calculate_CRS_UTMzone(locationLatitudeD, locationLongitudeD)
# create a dummy point with locationLatitudeD, locationLongitudeD coordinates
dummyShape = MapWinGIS.ShapeClass()
dummyShape.ShapeType = MapWinGIS.ShpfileType.SHP_POINT
dummyShape.AddPoint(locationLongitudeD, locationLatitudeD)
# insert a dummy point to the dummyShapefile
dummyShapefile = MapWinGIS.ShapefileClass()
openShapefileSuccess2 = MapWinGIS.ShapefileClass.CreateNew(dummyShapefile, "", MapWinGIS.ShpfileType.SHP_POINT)
shapeIndex2 = clr.StrongBox[System.Int32]()
success = dummyShapefile.EditInsertShape(dummyShape, shapeIndex2)
# a single field needs to be defined due to inserting of "dummyShape"
fieldName = "5" # dummy name
fieldType = MapWinGIS.FieldType.INTEGER_FIELD
fieldPrecision = 1
fieldWidth = 1
success2 = dummyShapefile.EditAddField(fieldName, fieldType, fieldPrecision, fieldWidth)
# set the CRS of dummyShapefile to WGS 84
inputCRS = MapWinGIS.GeoProjectionClass()
inputCRS_EPSG_code = 4326 # WGS 84
inputCRS.ImportFromEPSG(inputCRS_EPSG_code)
dummyShapefile.GeoProjection = inputCRS
shapeFileFolderPath = "C:\\gismo\\shapefile_example2"
if not os.path.exists(shapeFileFolderPath):
os.makedirs(shapeFileFolderPath)
shapefileFilePath = shapeFileFolderPath + "\\dummyShapefile_%s.shp" % str(time.time())
success = MapWinGIS.ShapefileClass.SaveAs(dummyShapefile, shapefileFilePath, None)
dummyShapefile.Close()
# dummyShapefile2 = dummyShapefile
dummyShapefile2 = MapWinGIS.ShapefileClass()
openShapefileSuccess = MapWinGIS.ShapefileClass.Open(dummyShapefile2, shapefileFilePath, None)
# reproject the dummyShapefile2
outputCRS2 = MapWinGIS.GeoProjectionClass()
outputCRS2.ImportFromEPSG(outputCRS_EPSG_code)
numOfsuccessfullyReprojectedShapes = clr.StrongBox[System.Int32]()
reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(dummyShapefile2, outputCRS2, numOfsuccessfullyReprojectedShapes)
if reprojectedShapefile == None:
reprojectErrorMsg2 = dummyShapefile2.ErrorMsg(dummyShapefile2.LastErrorCode)
print "reprojectErrorMsg2: ", reprojectErrorMsg2
dummyShapefile2.Close()
# delete the dummyShapefile_timetime().shp files and whole its folder
try:
shutil.rmtree(shapeFileFolderPath)
except:
pass
for i in range(reprojectedShapefile.NumShapes):
shape = reprojectedShapefile.Shape[i]
for k in range(shape.numPoints):
pt = shape.Point[k]
longitudeProjectedMeters = pt.x
latitudeProjectedMeters = pt.y
originPtProjected = Rhino.Geometry.Point3d(longitudeProjectedMeters/unitConversionFactor, latitudeProjectedMeters/unitConversionFactor, 0) # in Rhino document units
return originPtProjected
def destinationLatLon(self, latitude1D, longitude1D, radiusM):
"""
calculate latitude-location for cardinal directions around the central latitude1D, longitude1D, for a given geodesic distance (radiusM). By Vincenty solution
"""
# for WGS84:
a = 6378137 # equatorial radius, meters
b = 6356752.314245 # polar radius, meters
f = 0.00335281066474 # flattening (ellipticity, oblateness) parameter = (a-b)/a, dimensionless
bearingAnglesR = [math.radians(0), math.radians(180), math.radians(270), math.radians(90)] # top, bottom, left, right
latitudeLongitudeRegion = []
for bearingAngle1R in bearingAnglesR:
latitude1R = math.radians(latitude1D)
longitude1R = math.radians(longitude1D)
sinbearingAngle1R = math.sin(bearingAngle1R)
cosbearingAngle1R = math.cos(bearingAngle1R)
tanU1 = (1 - f) * math.tan(latitude1R)
cosU1 = 1 / math.sqrt(1 + tanU1 * tanU1)
sinU1 = tanU1 * cosU1
sigma1 = math.atan2(tanU1, cosbearingAngle1R)
sinBearingAngle1R = cosU1 * sinbearingAngle1R
cosSqBearingAngle1R = 1 - (sinBearingAngle1R * sinBearingAngle1R)
uSq = cosSqBearingAngle1R * (a * a - (b * b)) / (b * b)
A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - (175 * uSq))))
B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - (47 * uSq))))
sigma = radiusM / (b * A) # radiusM in meters
sigma_ = 0
while abs(sigma - sigma_) > 1e-12:
cos2sigmaM = math.cos(2 * sigma1 + sigma)
sinsigma = math.sin(sigma)
cossigma = math.cos(sigma)
deltaSigma = B * sinsigma * (cos2sigmaM + B / 4 * (cossigma * (-1 + 2 * cos2sigmaM * cos2sigmaM) - (B / 6 * cos2sigmaM * (-3 + 4 * sinsigma * sinsigma) * (-3 + 4 * cos2sigmaM * cos2sigmaM))))
sigma_ = sigma
sigma = radiusM / (b * A) + deltaSigma
tmp = sinU1 * sinsigma - (cosU1 * cossigma * cosbearingAngle1R)
latitude2R = math.atan2(sinU1 * cossigma + cosU1 * sinsigma * cosbearingAngle1R, (1 - f) * math.sqrt(sinBearingAngle1R * sinBearingAngle1R + tmp * tmp))
longitudeR = math.atan2(sinsigma * sinbearingAngle1R, cosU1 * cossigma - (sinU1 * sinsigma * cosbearingAngle1R))
C = f / 16 * cosSqBearingAngle1R * (4 + f * (4 - (3 * cosSqBearingAngle1R)))
L = longitudeR - ((1 - C) * f * sinBearingAngle1R * (sigma + C * sinsigma * (cos2sigmaM + C * cossigma * (-1 + 2 * cos2sigmaM * cos2sigmaM))))
longitude2R = (longitude1R + L + 3 * math.pi) % (2 * math.pi) - math.pi # normalise to -180...+180
bearingAngle2R = math.atan2(sinBearingAngle1R, -tmp)
latitude2D = math.degrees(latitude2R)
longitude2D = math.degrees(longitude2R)
bearingAngle2D = math.degrees(bearingAngle2R)
if bearingAngle2D < 0:
bearingAngle2D = 360-abs(bearingAngle2D)
latitudeLongitudeRegion.append(latitude2D)
latitudeLongitudeRegion.append(longitude2D)
# latitude positive towards north, longitude positive towards east
latitudeTopD, longitudeTopD, latitudeBottomD, longitudeBottomD, latitudeLeftD, longitudeLeftD, latitudeRightD, longitudeRightD = latitudeLongitudeRegion
return latitudeTopD, longitudeTopD, latitudeBottomD, longitudeBottomD, latitudeLeftD, longitudeLeftD, latitudeRightD, longitudeRightD
def distanceBetweenTwoPoints(self, latitude1D, longitude1D, latitude2D, longitude2D):
"""
calculate geodesic distance between two locations (given through latitude-location coordinates). By Vincenty solution
"""
"""
if latitude1D >= 0:
# northern hemishere:
latitude2D = 60
elif latitude1D < 0:
# southern hemishere:
latitude2D = -56
longitude2D = longitude1D
"""
# for WGS84:
a = 6378137 # equatorial radius, meters
b = 6356752.314245 # polar radius, meters
f = 0.00335281066474 # flattening (ellipticity, oblateness) parameter = (a-b)/a, dimensionless
latitude1R = math.radians(latitude1D)
latitude2R = math.radians(latitude2D)
longitude1R = math.radians(longitude1D)
longitude2R = math.radians(longitude2D)
L = longitude2R - longitude1R
tanU1 = (1-f) * math.tan(latitude1R)
cosU1 = 1 / math.sqrt((1 + tanU1*tanU1))
sinU1 = tanU1 * cosU1
tanU2 = (1-f) * math.tan(latitude2R)
cosU2 = 1 / math.sqrt((1 + tanU2*tanU2))
sinU2 = tanU2 * cosU2
longitudeR = L
longitudeR_ = 0
for i in range(100):
sinLongitudeR = math.sin(longitudeR)
cosLongitudeR = math.cos(longitudeR)
sinSqSigma = (cosU2*sinLongitudeR) * (cosU2*sinLongitudeR) + (cosU1*sinU2-sinU1*cosU2*cosLongitudeR) * (cosU1*sinU2-sinU1*cosU2*cosLongitudeR)
sinSigma = math.sqrt(sinSqSigma)
cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLongitudeR
sigma = math.atan2(sinSigma, cosSigma)
sinBearingAngleR = cosU1 * cosU2 * sinLongitudeR / sinSigma
cosSqBearingAngleR = 1 - sinBearingAngleR*sinBearingAngleR
if cosSqBearingAngleR == 0:
# if distanceM is measured along the equator line (latitude1D = latitude2D = 0, longitude1D != longitude2D != 0)
cos2SigmaM = 0
else:
cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqBearingAngleR
C = f/16*cosSqBearingAngleR*(4+f*(4-3*cosSqBearingAngleR))
longitudeR_ = longitudeR
longitudeR = L + (1-C) * f * sinBearingAngleR * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)))
uSq = cosSqBearingAngleR * (a*a - b*b) / (b*b)
A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)))
B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)))
deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM) - B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)))
distanceM = b*A*(sigma-deltaSigma) # in meters
bearingAngleForwardR = math.atan2(cosU2*sinLongitudeR, cosU1*sinU2-sinU1*cosU2*cosLongitudeR)
bearingAngleReverseR = math.atan2(cosU1*sinLongitudeR, -sinU1*cosU2+cosU1*sinU2*cosLongitudeR)
bearingAngleForwardD = math.degrees(bearingAngleForwardR)
bearingAngleReverseD = math.degrees(bearingAngleReverseR)
return distanceM
def constructLocationFromShapefileMidExtent(self, shpFilePath):
"""
get mid extent coordinate from shapefile
"""
# open shapefile to get its extends
utils = MapWinGIS.UtilsClass()
shapefile = MapWinGIS.ShapefileClass()
openShapefileSuccess = MapWinGIS.ShapefileClass.Open(shapefile, shpFilePath, None)
if (not shapefile) or (not openShapefileSuccess):
printMsg = "Shapefile reading failed. Check: \n" +\
"1) If '_shpFile' file path is correct. If it is: \n" +\
"2) In the same folder where the .shp file is, check if there are .shx,.dbf,.prj files with the same file name. These two files are essential, in order to open the .shx file.\n" +\
"3) If both upper two checks are fine: post a question about this issue on Gismo forum (grasshopper3d.com/group/gismo) with .shp and its files attached, and a screenshot of the message coming from 'readMe!' output."
print "shapefile.ErrorMsg: ", shapefile.ErrorMsg
utils = MapWinGIS.UtilsClass()
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
reprojectErrorMsg = MapWinGIS.GlobalSettingsClass().GdalReprojectionErrorMsg
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
print "reprojectErrorMsg: ", reprojectErrorMsg
print "utils.ErrorMsg: ", utils.ErrorMsg
print "utils.LastErrorCode: ", utils.LastErrorCode
return None, printMsg
elif openShapefileSuccess:
# check1
# if CRS information has been imported as well (this happens when .prj file in the same folder where .shp is missing)
proj4_str = shapefile.Projection
if (len(proj4_str) == 0):
printMsg = "'SHP to location' component failed to extract the middle location from a shapefile (.shp).\nThis happens when .prj file does not exist in the same folder as .shp file, or .prj file is defective.\nUse the 'Gismo_Construct Location' component instead."
return None, printMsg
# check2
# if shapefile .prj is geographic CRS (because we need to create a location at the end of this method, and Gismo's locations are always in geographic coordinates)
if "+proj=longlat" not in proj4_str: # geographic coordinate CRS have '+proj=longlat' in proj4_str
printMsg = "'SHP to location' component can only extract the middle location from a shapefile (.shp) which has geographic coordinate system.\nThis is not the case with the current shapefile.\nUse the 'Gismo_Construct Location' component instead."
return None, printMsg
extents = shapefile.Extents
x_dom = Rhino.Geometry.Interval(extents.xMin, extents.xMax) # latitude degrees or meters, depending on shapefile CRS
y_dom = Rhino.Geometry.Interval(extents.yMin, extents.yMax) # longitude degrees or meters, depending on shapefile CRS
y_dom = Rhino.Geometry.Interval(extents.yMin, extents.yMax) # longitude degrees or meters, depending on shapefile CRS
z_dom = Rhino.Geometry.Interval(extents.zMin, extents.zMax) # longitude degrees or meters, depending on shapefile CRS
#midLocaction = Rhino.Geometry.Point3d(y_dom.Mid, x_dom.Mid, z_dom.Mid)
# locationName
shpFolder, shpFileName = os.path.split(shpFilePath)
shpFileName = shpFileName.replace(".shp", "") # remove .shp at the end
preparation = Preparation()
locationStr = preparation.constructLocation(locationName = shpFileName, latitude = y_dom.Mid, longitude = x_dom.Mid, timeZone = 0, elevation = z_dom.Mid)
shapefile.Close()
printMsg = "ok"
return locationStr, printMsg
def readSHPfile(self, shpFilePath, locationLatitudeD, locationLongitudeD, northRad=0, originPt=rg.Point3d(0,0,0), unitConversionFactor=1, osm_id_Only=[], osm_way_id_Only=[], osm_id_Remove=[], osm_way_id_Remove=[]):
""" read shapefile """
# shapefile is always reprojected to UTM in Gismo
outputCRS = self.UTM_CRS_from_latitude(locationLatitudeD, locationLongitudeD)
# fix invalid shapes, overlapping shape issues, shape vertices direction ...
utils = MapWinGIS.UtilsClass()
shapefile = MapWinGIS.ShapefileClass()
openShapefileSuccess = MapWinGIS.ShapefileClass.Open(shapefile, shpFilePath, None)
if (not openShapefileSuccess) or (not shapefile):
# maybe the 'shpFilePath' is incorrect, or shapefile type is not supported (SHP_MULTIPATCH)
shapefileShapeType = proj4_str = shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "Shapefile reading failed. Check: \n" +\
"1) If '_shpFile' file path is correct. If it is: \n" +\
"2) In the same folder where the .shp file is, check if there are .shx,.dbf,.prj files with the same file name. These two files are essential, in order to open the .shx file.\n" +\
"3) If both upper two checks are fine: post a question about this issue on Gismo forum (grasshopper3d.com/group/gismo) with .shp and its files attached, and a screenshot of the message coming from 'readMe!' output."
print "shapefile.ErrorMsg: ", shapefile.ErrorMsg
utils = MapWinGIS.UtilsClass()
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
reprojectErrorMsg = MapWinGIS.GlobalSettingsClass().GdalReprojectionErrorMsg
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
print "reprojectErrorMsg: ", reprojectErrorMsg
print "utils.ErrorMsg: ", utils.ErrorMsg
print "utils.LastErrorCode: ", utils.LastErrorCode
return shortenedName_keys, values, shapes, shapefileShapeType, proj4_str, validShapes, printMsg
elif openShapefileSuccess:
# direct reprojection
numOfsuccessfullyReprojectedShapes_sb = clr.StrongBox[System.Int32]() # instance of clr.StrongBox
shapefileFixedSuccess, fixedShapefile = MapWinGIS.ShapefileClass.FixUpShapes(shapefile) # fails on MapWinGIS 4.9.4.2. Does not fail on Map Window Lite 32x
"""
print "shapefileFixedSuccess: ", shapefileFixedSuccess
print "fixedShapefile: ", fixedShapefile
"""
if shapefileFixedSuccess:
# shape file has been fixed
#reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(shapefile, outputCRS, numOfsuccessfullyReprojectedShapes_sb)
reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(fixedShapefile, outputCRS, numOfsuccessfullyReprojectedShapes_sb)
else:
# shapefile has NOT been fixed. Use the initial shapefile
reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(shapefile, outputCRS, numOfsuccessfullyReprojectedShapes_sb)
numOfsuccessfullyReprojectedShapes = numOfsuccessfullyReprojectedShapes_sb.Value
"""
print "numOfsuccessfullyReprojectedShapes: ", numOfsuccessfullyReprojectedShapes
print "type(numOfsuccessfullyReprojectedShapes): ", type(numOfsuccessfullyReprojectedShapes)
print "reprojectedShapefile: ", reprojectedShapefile
"""
"""
# testing fixing of shapes
print "reprojectedShapefile: ", reprojectedShapefile
# testing MapWinGIS.ShapefileClass.FixUpShapes
shpFilePath_saved = shpFilePath[:-4] + "_saved_" + str(int(time.time())) + ".shp"
print "shpFilePath_saved: ", shpFilePath_saved
success = MapWinGIS.ShapefileClass.SaveAs(reprojectedShapefile, shpFilePath_saved, None)
print "success: ", success
"""
if (numOfsuccessfullyReprojectedShapes == 0) or (reprojectedShapefile == None):
# reprojection failed
print "REPROJECTION FAILED"
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
reprojectErrorMsg = MapWinGIS.GlobalSettingsClass().GdalReprojectionErrorMsg
print "numOfsuccessfullyReprojectedShapes: ", numOfsuccessfullyReprojectedShapes
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
print "reprojectErrorMsg: ", reprojectErrorMsg
print "utils.ErrorMsg: ", utils.ErrorMsg
print "utils.LastErrorCode: ", utils.LastErrorCode
reprojectionError = fixedShapefile.ErrorMsg(fixedShapefile.LastErrorCode)
shapefileShapeType = proj4_str = shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "The following error emerged while processing the data:\n" + \
" \n" + \
"\"%s\"\n" % reprojectionError + \
"numOfsuccessfullyReprojectedShapes: %s\n" % numOfsuccessfullyReprojectedShapes + \
" \n" + \
"Open new topic about it on: www.grasshopper3d.com/group/gismo/forum, and attached .shp and all its files (.shx, .dbf, .prj)."
return shortenedName_keys, values, shapes, shapefileShapeType, proj4_str, validShapes, printMsg
originPtProjected_meters = self.projectedLocationCoordinates(locationLatitudeD, locationLongitudeD) # in meters!
originPtProjected = Rhino.Geometry.Point3d(originPtProjected_meters.X/unitConversionFactor, originPtProjected_meters.Y/unitConversionFactor, originPtProjected_meters.Z/unitConversionFactor) # in Rhino units
# rotation due to north angle position
#transformMatrixRotate = Rhino.Geometry.Transform.Rotation(-northRad, Rhino.Geometry.Vector3d(0,0,1), originPt) # counter-clockwise
transformMatrixRotate = Rhino.Geometry.Transform.Rotation(northRad, Rhino.Geometry.Vector3d(0,0,1), originPt) # clockwise
# open reprojectedShapefile
# ShapeType of a whole shapefile (.shp) and also of each 'shape' in the shapefile (.shp)
shapeShapeType_dict = {}
shapeShapeType_dict[0] = 'SHP_NULLSHAPE'
shapeShapeType_dict[1] = 'SHP_POINT'
shapeShapeType_dict[3] = 'SHP_POLYLINE'
shapeShapeType_dict[5] = 'SHP_POLYGON'
shapeShapeType_dict[8] = 'SHP_MULTIPOINT'
shapeShapeType_dict[11] = 'SHP_POINTZ'
shapeShapeType_dict[13] = 'SHP_POLYLINEZ'
shapeShapeType_dict[15] = 'SHP_POLYGONZ'
shapeShapeType_dict[18] = 'SHP_MULTIPOINTZ'
shapeShapeType_dict[21] = 'SHP_POINTM'
shapeShapeType_dict[23] = 'SHP_POLYLINEM'
shapeShapeType_dict[23] = 'SHP_POLYGONM'
shapeShapeType_dict[28] = 'SHP_MULTIPOINTM'
shapeShapeType_dict[31] = 'SHP_MULTIPATCH'
# loop through shortenedName_keys (these are shapefile fields (":" is replaced with "_" and maximal size is 10 characters))
shortenedName_keys = []
for i in xrange(reprojectedShapefile.NumFields):
field = reprojectedShapefile.Field(i)
shortenedName_keys.append(field.Name)
values = Grasshopper.DataTree[object]()
shapes = Grasshopper.DataTree[object]()
for i in xrange(reprojectedShapefile.NumShapes):
shape_com = reprojectedShapefile.Shape[i]
shape = Marshal.CreateWrapperOfType(shape_com, MapWinGIS.ShapeClass)
if not shape.IsValid:
fixedShape = MapWinGIS.ShapeClass.FixUp(shape)
if (fixedShape != None):
shape = fixedShape
moveVector = originPt - originPtProjected
if (shape.ShapeType == 0): # NULL_SHAPE
# ShapeType: NULL_SHAPE
# values
subValuesL = []
for g in xrange(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
subValuesL.append(value)
values.AddRange(subValuesL, Grasshopper.Kernel.Data.GH_Path(i))
# pts
ptsPerShape = [None]
shapes.AddRange(ptsPerShape, Grasshopper.Kernel.Data.GH_Path(i))
if (shape.ShapeType == 1): # SHP_POINT
# ShapeType: POINT
# values
subValuesL = []
for g in xrange(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
if value == "yes": value = True # for example: "building=yes"
subValuesL.append(value)
# pts
ptsPerShape = []
for k in xrange(shape.numPoints):
pt = shape.Point[k]
point3dProjected = Rhino.Geometry.Point3d(pt.x/unitConversionFactor, pt.y/unitConversionFactor, pt.z/unitConversionFactor)
point3dMoved = point3dProjected + moveVector
succ = point3dMoved.Transform(transformMatrixRotate)
ptsPerShape.append(point3dMoved)
subValuesL_filtered, ptsPerShape_filtered = self.filterShapes(shortenedName_keys, subValuesL, ptsPerShape, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
values.AddRange(subValuesL_filtered, Grasshopper.Kernel.Data.GH_Path(i))
shapes.AddRange(ptsPerShape_filtered, Grasshopper.Kernel.Data.GH_Path(i))
del ptsPerShape
elif (shape.ShapeType == 3) or (shape.ShapeType == 13) or (shape.ShapeType == 5) or (shape.ShapeType == 15):
# ShapeType: POLYLINE, POLYLINEZ, POLYGON, POLYGONZ
for n in xrange(shape.NumParts):
# values
subValuesL = []
for g in xrange(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
if value == "yes": value = True # for example: "building=yes"
subValuesL.append(value)
# points
ptsPerPart = []
subShape = shape.PartAsShape(n)
for k in xrange(subShape.numPoints):
pt = subShape.Point[k]
X = pt.x/unitConversionFactor
Y = pt.y/unitConversionFactor
Z = pt.z/unitConversionFactor
"""
elif (shape.ShapeType != 13): # POLYLINEZ
## FIX ##
#if (k == 0):
if (k == subShape.numPoints-1):
#Z = subShape.Point[subShape.numPoints-1].z
Z = subShape.Point[0].z
else:
Z = pt.z/unitConversionFactor
## FIX ##
"""
point3dProjected = Rhino.Geometry.Point3d(X, Y, Z) # in Rhino document units
point3dMoved = point3dProjected + moveVector
succ = point3dMoved.Transform(transformMatrixRotate)
ptsPerPart.append(point3dMoved)
polyline = Rhino.Geometry.Polyline(ptsPerPart)
subValuesL_filtered, shapesL_filtered = self.filterShapes(shortenedName_keys, subValuesL, [polyline], osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
values.AddRange(subValuesL_filtered, Grasshopper.Kernel.Data.GH_Path(i,n))
shapes.AddRange(shapesL_filtered, Grasshopper.Kernel.Data.GH_Path(i,n))
del subValuesL
del ptsPerPart
del polyline
del subValuesL_filtered
del shapesL_filtered
subShape = None
elif (shape.ShapeType == 31): # MULTI_PATCH
# ShapeType: MULTI_PATCH
shapefileShapeType = proj4_str = shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "Gismo at the moment does not support MULTI_PATCH shapefile shapes."
return shortenedName_keys, values, shapes, shapefileShapeType, proj4_str, validShapes, printMsg
else:
shapeShapeType = shapeShapeType_dict[shape.ShapeType]
shapefileShapeType = proj4_str = shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "Gismo at the moment does not support {} shapefile type shapes.\nAsk a question on the forum (https://www.grasshopper3d.com/group/gismo/forum) if this type can be added to Gismo.".format(shapeShapeType)
return shortenedName_keys, values, shapes, shapefileShapeType, proj4_str, validShapes, printMsg
shapefileShapeType = shapeShapeType_dict[shapefile.ShapefileType]
proj4_str = shapefile.Projection
shapefile.Close()
reprojectedShapefile.Close()
validShapes = True
printMsg = "ok"
return shortenedName_keys, values, shapes, shapefileShapeType, proj4_str, validShapes, printMsg
def filterShapes(self, shortenedName_keys, subValuesL, shapesL, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove):
"""
filter values and shapes for the four inputs from "OSM ids" component
"""
value__osm_id = "^#-@" # dummy value, in case for some unknown reason there is no "osm_id" key
value__osm_way_id = "^#-@" # dummy value, in case there is no "osm_way_id" key (shapeType = 1,2)
for shortenedName_keysIndex, key in enumerate(shortenedName_keys):
if key == "osm_id":
value__osm_id = subValuesL[shortenedName_keysIndex] # it will always be a string, not float, because shapefile keeps its values as strings
if key == "osm_way_id":
value__osm_way_id = subValuesL[shortenedName_keysIndex] # it will always be a string, not float, because shapefile keeps its values as strings
# removing shapes
if value__osm_id in osm_id_Remove:
return [], []
elif value__osm_way_id in osm_way_id_Remove:
return [], []
# allowing this shapes
if value__osm_id in osm_id_Only:
return subValuesL, shapesL
elif value__osm_way_id in osm_way_id_Only:
return subValuesL, shapesL
else:
if (len(osm_id_Only) == 0) and (len(osm_way_id_Only) == 0):
# "osm_id_Only" and "osm_way_id_Only" are empty. Use ALL shapes except ones whos "osm_id" and "osm_way_id" are defined in either "osm_id_Remove" and "osm_way_id_Remove"
return subValuesL, shapesL
else:
# either "osm_id_Only" and "osm_way_id_Only" are NOT empty. Use ONLY those shapes whos "osm_id" and "osm_way_id" are defined in either "osm_id_Only" and "osm_way_id_Only"
return [], []
def tagEqual_to_requiredTag(self, branchIndex, keys, values_shiftedPaths_LL, requiredKeyL, requiredValuesLL, OSMobjectNameL):
"""
determine if shapes's tags (key=value pairs) correspond to particular requiredTag (key=value pair)
"""
value = "" # dummy values in case requiredKey or requiredValues does not exist
foundShapesSwitch = False # initial value
for keyIndex,key in enumerate(keys):
for requiredKeyIndex,requiredKey in enumerate(requiredKeyL):
if (key == requiredKey):
# requiredKey is found, check if requiredValue can be found
# first check if a value is a multi-value or not (example: "commercial;residential")
values_unsplitted = values_shiftedPaths_LL[branchIndex][keyIndex]
if (type(values_unsplitted) == System.Boolean): # "OSM shapes" component replaces all "building"="yes"/"no" values with "building"=True/False. This is why it is not possible to split(";") the Boolean value, as it is a string
values_stripped = [values_unsplitted]
elif (type(values_unsplitted) != System.Boolean):
values_splitted = values_unsplitted.split(";") # in case a value is not a single item but a multiple-value (wiki.openstreetmap.org/wiki/Multiple_values). If it is a single value, then .strip(";") will not be performed
values_stripped = [value2.strip() for value2 in values_splitted]
for value in values_stripped:
if (value in requiredValuesLL[requiredKeyIndex]) and (value != ""):
foundShapesSwitch = True
OSMobjectName = OSMobjectNameL[requiredKeyIndex] # "requiredKeyL" and "OSMobjectNameL" lists have the same number of items
del values_shiftedPaths_LL
return foundShapesSwitch, value, [OSMobjectName]
elif (key == requiredKey) and (requiredValuesLL[requiredKeyIndex] == ["^"]) and (value != ""):
foundShapesSwitch = True
OSMobjectName = OSMobjectNameL[requiredKeyIndex] # "requiredKeyL" and "OSMobjectNameL" lists have the same number of items
del values_shiftedPaths_LL
return foundShapesSwitch, value, [OSMobjectName]
del values_shiftedPaths_LL
return foundShapesSwitch, value, []
def checkIfShapefilesAreValid(self, keys, values):
"""
check if the .shp files have been created correctly according to the supplied "requiredKeys_" in osmconf.ini file
"""
max_valuesBranch_length = 0
for values_branchL in values.Branches:
if (len(values_branchL) > max_valuesBranch_length):
max_valuesBranch_length = len(values_branchL)
if (len(keys) > 0) and (max_valuesBranch_length > 0):
if (len(keys) != max_valuesBranch_length):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validShapefiles = False
printMsg = "The component generated invalid shapes data.\n" + \
" \n" + \
"To fix this issue, simply rerun the component (set the \"_runIt\" input to \"False\", and then again to \"True\")."
else:
validShapefiles = True
printMsg = "ok"
del keys; del values
return validShapefiles, printMsg
class OSM():
"""
methods for manipulation of OSM and GIS data
"""
def requiredTag_dictionary(self):
"""
tags for particular OSM objects
"""
requiredKeyRequiredValue_dict = {
"""Building""" : ["building", ("^",)], # "^" means there is no specific value for this key
"""Commercial building""" : ["building", ("commercial", "retail",)],
"""Residential building""" : ["building", ("residential", "apartments", "terrace", "house", "detached")],
"""Office building""" : ["building", ("office",)],
"""Office administrative""" : ["office", ("administrative",)],
"""Office government""" : ["office", ("government",)],
"""Post office""" : ["amenity", ("post_office",)],
"""Hospital""" : ["amenity", ("hospital",)],
"""Ambulance station""" : ["emergency", ("ambulance_station",)],
"""Pharmacy""" : ["amenity", ("pharmacy",)],
"""Police""" : ["amenity", ("police",)],
"""Fire station""" : ["amenity", ("fire_station",)],
"""Museum""" : ["tourism", ("museum",)],
"""Theatre""" : ["amenity", ("theatre",)],
"""Library""" : ["amenity", ("library",)],
"""Book store""" : ["shop", ("books",)],
"""College""" : ["amenity", ("college",)],
"""University""" : ["amenity", ("university",)],
"""School""" : ["amenity", ("school",)],
"""Kindergarten""" : ["amenity", ("kindergarten",)],
# -----------------
"""Playground""" : ["leisure", ("playground",)],
"""Sports center""" : ["leisure", ("sports_centre",)],
"""Stadium""" : ["leisure", ("stadium",)],
"""Park""" : ["leisure", ("park",)],
"""Garden""" : ["leisure", ("garden",)],
"""Camping site""" : ["tourism", ("camp_site",)],
"""Tree""" : ["natural", ("tree",)],
"""Forest""" : ["natural", ("wood",)],
"""Forest (managed)""" : ["landuse", ("forest",)],
"""Grassland""" : ["natural", ("grassland",)],
"""Waterway""" : ["waterway", ("^",)], # "^" means there is no specific value for this key
"""Coastline""" : ["natural", ("coastline",)],
# -----------------
"""Cafe""" : ["amenity", ("cafe",)],
"""Bar""" : ["amenity", ("bar",)],
"""Pub""" : ["amenity", ("pub",)],
"""Winery""" : ["craft", ("winery",)],
"""Restaurant""" : ["amenity", ("restaurant",)],
"""Supermarket""" : ["shop", ("supermarket",)],
"""Public market""" : ["amenity", ("marketplace",)],
"""Mall""" : ["shop", ("mall",)],
"""Hostel""" : ["tourism", ("hostel",)],
"""Hotel""" : ["tourism", ("hotel",)],
"""Casino""" : ["amenity", ("casino",)],
# -----------------
"""Road""" : ["highway", ("road", "primary", "secondary", "tertiary", "unclassified", "residential", "service", "track", "junction", "trunk", "motorway", "motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link", "living_street", "bus_guideway", "escape")],
"""Railway""" : ["railway", ("rail", "tram", "light_rail", "subway", "narrow_gauge", "funicular")],
"""Footway""" : ["highway", ("footway",)],
"""Steps""" : ["highway", ("steps",)],
"""Pedestrian zone""" : ["highway", ("pedestrian",)],
"""Aeroway""" : ["aeroway", ("aerodrome",)],
"""Bicycle parking""" : ["amenity", ("bicycle_parking",)],
"""Bicycle rental""" : ["amenity", ("bicycle_rental",)],
"""Fuel""" : ["amenity", ("fuel",)],
"""Parking""" : ["amenity", ("parking",)],
"""Garage""" : ["landuse", ("garages",)],
"""Subway entrance""" : ["railway", ("subway_entrance",)],
# -----------------
"""Construction area""" : ["landuse", ("construction",)],
"""Archaeological site""" : ["historic", ("archaeological_site",)],
"""Fountain""" : ["amenity", ("fountain",)],
"""Wind turbine""" : ["generator:source", ("wind",)],
"""Plant""" : ["power", ("plant",)],
"""Nuclear reactor""" : ["generator:source", ("nuclear",)],
# -----------------
"""Internet access""" : ["internet_access", ("^",)], # "^" means there is no specific value for this key
"""Toilet""" : ["amenity", ("toilets",)],
"""Color""" : ["colour", ("^",)] # "^" means there is no specific value for this key
}
return requiredKeyRequiredValue_dict
def raiseWarning(booleanValue, printMsg):
if not booleanValue:
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
# send classes to sticky
sc.sticky["gismo_check"] = Check()
sc.sticky["gismo_mainComponent"] = mainComponent
sc.sticky["gismo_Transfrom"] = Transform
sc.sticky["gismo_Preparation"] = Preparation
sc.sticky["gismo_CreateGeometry"] = CreateGeometry
sc.sticky["gismo_EnvironmentalAnalysis"] = EnvironmentalAnalysis
sc.sticky["gismo_GIS"] = GIS
sc.sticky["gismo_OSM"] = OSM
sc.sticky["gismo_mapwingisFolder"] = mapFolder_
# check gismoFolder
gismo_mainComponent = mainComponent()
gismoFolder, printMsg = gismo_mainComponent.gismoWorkingFolder(gismoFolder_)
raiseWarning(gismoFolder, printMsg)
sc.sticky["gismo_gismoFolder"] = gismoFolder
# check mapWinGIS
iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInstallFolder, printMsg = gismo_mainComponent.mapWinGIS(mapFolder_)
raiseWarning(validInstallFolder, printMsg)
if gismoFolder and validInstallFolder:
print "The Gismo penguin is peeping!! Gismo Gismo component is ran successfully!\n\ngismoFolder_: %s\nmapFolder_: %s" % (gismoFolder, iteropMapWinGIS_dll_folderPath)
if gismoFolder:
sc.sticky["gismoGismo_released"] = "" # mapWinGIS might not be used for all components, so validInstallFolder = True is not important for all components
# online check of Gismo Gismo version from the github repository
# send the Gismo_Gismo component to the back
ghenv.Component.OnPingDocument().SelectAll()
ghenv.Component.Attributes.Selected = False
ghenv.Component.OnPingDocument().BringSelectionToTop()
ghenv.Component.OnPingDocument().DeselectAll()
- This component contains all Gismo classes. Other Gismo components are being run by referencing these classes.
So in order for any other Gismo component to work, you need to run this component first. If this component is ran successfully you will hear the Gismo penquin peeping!!
-
Provided by Gismo 0.0.3
-
-9
-9
-
759
682
- true
- true
- false
- 2
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAScQAAEnEB89x6jgAABXtJREFUSEvFlXtQVGUYxg8ilyhu67LLsgsLmoy31BBRGM0EkR1BCeKy3GTlsixYmHLJCE1FHJAZdFhDJRSV2woowoIEyFUgKalGrGYyigQjUpsBQ3FAnr5zMU1xxumfnpl3zne+c77f+5z3vOc71P+ugIAAuUql6klKShry9fXVuru7L6XnZTKZhYuLi6OTk5MJc+N/UVBQUFxJSQkePHgAWsPDw0hOTr65bt26tOzs7EGtVgulUtkvlUo3cEteXp6enuYpKSkDk5OTDJwWPe7t7UVCQgLa2trw6NEjTE1NITAwsJcsMWBXvqTkcrljbm4uh2ZFSoTYuK04kJGFFSudcePGDWb+cHYOTE1Nc3g83suVKzg42NzPL6Txk8SDmHj0kIHQqm9sxsG9STixX4Henk5m7q+HfyLZ/xh8RFkQmkivGRgYvM5hppe/v79+qFzRkrG5GqmyGhw9XIDxyXsMrKezHHeKnYAKKer2LEJ6aj5i12cjwvosEue1QzH7NIRGtj8RjISlTSOSIDNNUQp10DdIc+9A5LxTiFl7iLg8ieDFCbiWLsRvakPslS2Bt2ExokU12GpXi7jZWsTPaYJcdByGOsbNBPX8O/Hy8lquCkqZOBL6NdI3tOOjlY3YvqABKkkdIvhVUPCbsNUhBAUqCnLpbsRaX0KMTTVUtlomlNbViLNpwCpzFQgulqU+pU1ePrkZIXXI8r6C1NVN2L74c8TNqUGMVMuAYqxrsUVShgDbBESK6XNunoto6wuIlJyDQqIBX9fuO4J8hSUTrVmzxjJ847bbh/yvYo9bCxId6vGefS1UdiyEdkdHpLAGW3gNiLJkHT8dUdaVxMBZRBATb5oG0E/xLksnIglC4zceRqZnN1OaDxbWkboS9zScRJRIi7BZZdjhUoG9flV436EcoeYViBY/TlTFJFCINQgTF0FmsRs6OrpnODxFOTuvyk/ZQBavvfzEPakrnSBSSB5/rgZN5d9i/OEY01EjIyOoUHdBYVWGaCs2yeMEwaKT8BUewmszBD0cnqJWO7p+sdu9HqkuLdj+BnFP156uK3FIP/aXLd8z4GdVru5AKK8MSomWS1BKOikPfpY5sJhp/yuHJwmWyvp2vd2CZMdGxM+/iFg7NkGY2Tnk7bzE4abTBDLDLiKcV4koSSXCxcUIEB2FjzAbVvqLbnN4inJZuH4oxbkFO5Y8eblKur72Ggz2D3Gw6dXd8APC+BrSWecRZnWGcb9JkAFLPfshDk9RC6TOPycubcC2+U9ebrh5JbKVdRzmxRq9N4L4FRpsFpwl9c/HO4KD8OB/DBNdEd2qrATmNq3KueWIs7vIdg7pijCzcmiP93CY6UXvpvSumhVThQCzU8S9Gp4WaVhptoV00UwNh2eUSrdWrE0d+VgqmA8mZJYGbRd6/9mWnw16fmJiAvfv30f+/lpsMs6BlyCdcS8xdKC/g/UsmpVYpLdoiO6YcHEJNpNe9uN9hpaaqxgdHcXY2Bjz4xkfH2eO9Dk9f/fuXdy6dQt5meXwMN4HGX8Xlhj70O4LOe6/FGhn5IxAy2OQW57ARrMsnC9sQF9fH/r7+zEwMIDBwUHmSJ/T/4Pr16+ju7sbBz78FKuNdmLhqz7Qm6F/hbD4LPJ5efP17e64CiLhYboP6vTTaG5uRnt7Ozo7O9HV1YWOjg60traivr4e1dXVKC0tRYR/IpbzHCA2079DGLYs6gUSmlCX187XhRElvOntETilPpKDoqIiFBcXM1FYWIiCggLk5eUhLS0NISEhUzyeoF1qTn21QDJjmCCsWNKL5UxiFQl6N5Tp6enlSCSSzmXLlv3o5ub2u6ur6x9k/IuNjU03uaYm97xFQocE/Q+g4fSYiKL+Bjns/FvUZVQXAAAAAElFTkSuQmCC
- false
- bd6b3218-575b-4308-86e7-aba7c72d4b16
- false
- true
- Gismo_Gismo
- Gismo
-
305
53
132
44
-
394
75
- 2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 1
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- true
- Optional folder path for MapWinGIS installation folder.
-
Most of Gismo's components require MapWinGIS application being installed.
If you did that, Gismo Gismo component will automatically find your MapWinGIS installation folder.
However sometimes Gismo Gismo component will fail to find your MapWinGIS installation folder. In that case you need to input it manually by adding it to the mapFolder_ input.
- 008117fa-626c-4f99-894a-804d0221cef1
- mapFolder_
- mapFolder_
- true
- 0
- true
- 0
- 37261734-eec7-4f50-b6a8-b8d1f3c4396b
-
307
55
72
20
-
344.5
65
- true
- Optional folder path for Gismo working folder.
-
If nothing is supplied to this input, then gismoFolder_ will be set to: "c:\gismo" by default.
- 27ba17b6-8b1d-4565-88f2-29c212a7e528
- gismoFolder_
- gismoFolder_
- true
- 0
- true
- 0
- 37261734-eec7-4f50-b6a8-b8d1f3c4396b
-
307
75
72
20
-
344.5
85
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_String
- false
- c:\gismo
- This output will inform whether the component has been successfully ran or not.
- e63fb28c-9ebe-467c-8a46-a657892f11d4
- out
- out
- false
- 0
-
409
55
26
40
-
422
75
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 6797d9de-d493-4645-b614-22dc5677302e
- df034980-cfb1-4d84-ad1c-7e2a8bdaf848
- ee93cc86-a126-4f67-81a6-9796990bcf5e
- 23f197d7-6e67-475c-9d48-311419f64b94
- 44270163-375f-4ec0-9c6c-c110438209f4
- d4f61522-53d0-4733-a1ef-910f20c5d5db
- 3ff361b6-c4ac-4967-b34b-bb2773107a92
- eedc58db-6914-4e05-907b-d4da09c576e5
- addbb3a4-6f64-4ae0-b4dd-412131e2b64f
- 3e14d35e-91ef-4005-b7d1-ad7050887af7
- 853ff553-2e31-4063-8736-31d5ae347767
- 51e6fb3e-efea-44bb-b97d-6c917bd34459
- f65033bc-3e31-421e-958b-2caee82f8e7b
- bf97e387-bffd-4d35-aed7-02dc8ee09917
- 9fe88ced-d621-42e7-aef9-03e75bc88ef3
- 9e064246-d7d6-4781-b9b0-b7708f337fa8
- a040873d-0ba5-4f74-b5cd-908cacb6e0be
- b8777943-d3cc-482b-b1f3-aa942da1a33c
- 3d44772b-f683-4f6e-ad5d-5c5eebc33a9e
- 2b42d477-12e4-4e1f-b3c2-37960e9956e9
- 20
- 86525790-a221-4276-aac5-ae5297427b67
- Group
- Display Geometry
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 2aaecc35-d41a-4260-80d5-274c817b14ee
- 2611af1f-6168-45eb-ae02-1f3968b0bc28
- b0be9898-a343-4094-8279-cf607063de01
- e0046a64-8cc6-4356-a4b6-42138f6be5a3
- 71829324-09ff-44a7-b827-791d5bee52d4
- a4f4d9b8-d24b-46b1-81a5-e16f53258a5e
- c39461e0-e22c-4c21-ad51-d4aa5b7b2d23
- eaa54df0-51c4-403e-9030-6987622c8eba
- d10e5eca-c208-4bf5-b327-264964a21ff1
- 570ac161-09f8-4975-a797-8b20d9204f73
- 1fc23413-7f73-49d9-9fc4-b86273dce8d7
- 0a1bb4c7-a282-4641-a105-5d5db4ee9563
- c34098c9-904f-4bb0-b201-f54e017f36a7
- 8c1f378d-31ac-4f56-a7ae-e3189bd29adc
- b0d2ba7c-462b-4b8d-85cd-a1edbb7b9770
- bcf6dad3-b829-4d8f-88e2-a1389d5492b5
- 2fcaedf3-3005-43af-8851-74647ddc3067
- 17
- 26765e72-7f39-489a-9f72-c1e9a9c1bb78
- Group
- Get Aerial Image
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 85fefb26-3575-4e7e-a609-3c8ea0d586b6
- 532028e2-2457-4e5e-86bd-73af17fa5369
- b9a32241-7cd7-41d8-b17f-f482ccceb16b
- 4e074b1f-0382-421a-9315-4fd60112a946
- 43337699-2dec-4ffe-80c2-537a9e8414d2
- e43929a1-0100-41c4-b7fd-6037e57db6b2
- 3d6bcf60-ab08-4bf3-a3ae-aff87b6648db
- 6bcfff72-eba3-4876-9f3e-704b12376eb6
- 73232f19-277e-48c5-8803-cf3712836cbd
- fe2b1e23-d53e-4f90-baa4-2de75691b046
- bb43699d-5a2e-4373-9171-c27f98349cf9
- 78b27c9f-72f8-4d2f-81f8-ed57369d1e59
- feff88a5-f7df-4db7-9da5-b68d7f3addcc
- bef8d5b7-b32c-4ec9-99c3-6472dfbb5191
- 75b0c2ee-61c4-41f9-a300-4c68fc7d6e78
- bcabb822-a379-4c50-9238-39c1f64ebb04
- ad12a014-f45d-4fa7-b566-e67f5ece9c48
- 0317a295-0589-41f5-bb44-539f9ce8d183
- e08b77de-4188-4cd7-aed4-0f937f5a204e
- ecd9311a-ab28-43a7-a0a6-301d4250fa09
- 3f916cb0-35f0-4bbc-9ed1-6fbb18303f62
- 21
- f4b3d9dd-657a-448f-9184-4ab3b6e684b3
- Group
- GISMO
- 0a6b8a40-57a4-4d8d-9f09-f34869655d1e
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Launch Window
- 1
- This component launches a new blank control window.
- false
- e4b05d27-dcd4-4627-bfd6-fc6932343ddf
- Launch Window
- Launch Window
-
6604
2772
182
104
-
6684
2824
- Set this boolean to true to display the control window.
- 6149b0ec-eb10-415e-bbcc-4ea4a3d3978b
- Show
- Show
- false
- 2241519d-5a46-4342-9df2-9f05ae583cf0
- 1
-
6606
2774
63
20
-
6639
2784
- The name of the window to display.
- a171c467-525d-48ba-9bd4-84340fbe57ff
- Name
- Name
- false
- 7d6f053a-6146-4c1b-9fe6-b869546a9fe1
- 1
-
6606
2794
63
20
-
6639
2804
- 1
- 1
- {0}
- false
- Control Window
- Starting Width of the window.
- 34a1c98c-a481-4386-aa8a-270cbdf20bc5
- Width
- Width
- false
- 7334b6b3-a219-40cb-aad2-e8f4ce7882d3
- 1
-
6606
2814
63
20
-
6639
2824
- 1
- 1
- {0}
- 370
- Starting Height of the window.
- 7f544a9d-eb82-4279-9ee9-ee8c846fff53
- Height
- Height
- false
- 764565ec-9c85-4260-b61b-229a802b4d1d
- 1
-
6606
2834
63
20
-
6639
2844
- 1
- 1
- {0}
- 400
- Optional Font family for UI elements in this window.
- 7fb6eb02-cd5d-4b3a-a8fe-dd264e6d2815
- Font Family
- Font Family
- true
- e5901de6-507a-40c4-8bcd-6af79c7ecc50
- 1
-
6606
2854
63
20
-
6639
2864
- The window object. Other components can access this to add controls or gather data from the window.
- 6508d7e4-1f74-4f17-a1f7-bced3825e6e5
- Window Object
- Window Object
- false
- 0
-
6699
2774
85
100
-
6741.5
2824
- a067cebe-045c-4f4a-8d77-cd4fb0075a5a
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Make Child Window
- Make one window a child of another
- b884701a-e7cb-4ecd-b36f-94bf1a07a816
- Make Child Window
- Make Child Window
-
6849
3158
112
64
-
6947
3190
- The parent window
- 2873a8ec-31e2-44d6-9eae-524a7137d49b
- Parent Window
- Parent Window
- false
- 6508d7e4-1f74-4f17-a1f7-bced3825e6e5
- 1
-
6851
3160
81
20
-
6893
3170
- The child window
- df6414d5-75f7-4127-ad17-3a02a9a3b5f6
- Child Window
- Child Window
- false
- 01b93687-bb7d-4401-a6e7-2954501cb391
- 1
-
6851
3180
81
20
-
6893
3190
- Use this if you want to reset the child window to one of the default modes and break its relationship with the parent.
- 0c0728bb-4533-46a1-8928-41a249ac7898
- Default Option
- Default Option
- true
- 0
-
6851
3200
81
20
-
6893
3210
- 0a6b8a40-57a4-4d8d-9f09-f34869655d1e
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Launch Window
- 1
- This component launches a new blank control window.
- false
- fff5588e-b5af-46db-a64e-adba52a6afaf
- Launch Window
- Launch Window
-
6594
3175
198
104
-
6690
3227
- Set this boolean to true to display the control window.
- b8b9b874-d907-4f84-bd95-171a9341587f
- Show
- Show
- false
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
- 2
-
6596
3177
79
20
-
6645
3187
- The name of the window to display.
- 85990905-9d92-4b6e-9ef5-2517bcf2d00f
- Name
- Name
- false
- faf6dafb-a2c1-4848-953e-b2099155a48b
- 1
-
6596
3197
79
20
-
6645
3207
- 1
- 1
- {0}
- false
- Control Window
- Starting Width of the window.
- 25d4bfae-bc11-49fa-aaf8-9ca4c2265b18
- Width
- Width
- false
- 148a616a-f5b1-40cf-a785-df2df7554d26
- 1
-
6596
3217
79
20
-
6645
3227
- 1
- 1
- {0}
- 370
- Starting Height of the window.
- ff249255-c498-4392-8a3c-62b0fadbacb1
- x*1.75
- Height
- Height
- false
- 2037544a-782e-47fa-908f-b3335aff5b12
- 1
-
6596
3237
79
20
-
6645
3247
- 1
- 1
- {0}
- 400
- Optional Font family for UI elements in this window.
- bc2d332d-c1bb-46a3-82f8-a642e5f9352f
- Font Family
- Font Family
- true
- e5901de6-507a-40c4-8bcd-6af79c7ecc50
- 1
-
6596
3257
79
20
-
6645
3267
- The window object. Other components can access this to add controls or gather data from the window.
- 01b93687-bb7d-4401-a6e7-2954501cb391
- Window Object
- Window Object
- false
- 0
-
6705
3177
85
100
-
6747.5
3227
- 73b5e187-b35d-45bd-8495-9e06b429bc07
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Add Elements
- Add WPF Controls to a window
- true
- c2d0d6d8-67cc-4d00-8a1e-351595353eb9
- Add Elements
- Add Elements
-
6835
2932
190
44
-
6919
2954
- The window to which to add the elements
- 7e677107-f98a-4a51-9b0a-196649a4c971
- Window
- Window
- false
- 6508d7e4-1f74-4f17-a1f7-bced3825e6e5
- 1
-
6837
2934
67
20
-
6880
2944
- 1
- The Controls and other elements you want to add to the window
- 0fc09057-c3a6-4db6-a751-e7863097cbb6
- 1
- Elements
- Elements
- false
- 59536bd8-7b87-4669-800a-b438fd9959e3
- 1
-
6837
2954
67
20
-
6880
2964
- 1
- The elements added.
- 01082809-aa96-433f-90a7-d7b7706bec13
- Added Elements
- Added Elements
- false
- 0
-
6934
2934
89
20
-
6978.5
2944
- 1
- The names of the added elements.
- f8e12b95-7f53-48d4-ab6a-76e1628e9325
- Element Names
- Element Names
- false
- 0
-
6934
2954
89
20
-
6978.5
2964
- 73b5e187-b35d-45bd-8495-9e06b429bc07
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Add Elements
- Add WPF Controls to a window
- true
- 1c95a1ae-d52f-492b-8c0d-cec7907d550a
- Add Elements
- Add Elements
-
6848
3299
190
44
-
6932
3321
- The window to which to add the elements
- ff6577ea-f35e-4dc3-a4ed-db41c93a8c5d
- Window
- Window
- false
- 01b93687-bb7d-4401-a6e7-2954501cb391
- 1
-
6850
3301
67
20
-
6893
3311
- 1
- The Controls and other elements you want to add to the window
- e50aa6a1-d955-4525-b8eb-507d95a77ad5
- 1
- Elements
- Elements
- false
- 0526ff01-511f-4d9e-8cf0-04ede46182ca
- 1
-
6850
3321
67
20
-
6893
3331
- 1
- The elements added.
- d78e46e0-92ae-43cd-ba2d-401e6b379d74
- Added Elements
- Added Elements
- false
- 0
-
6947
3301
89
20
-
6991.5
3311
- 1
- The names of the added elements.
- 35b7a537-b6f6-488d-bb0d-51d068ee18e8
- Element Names
- Element Names
- false
- 0
-
6947
3321
89
20
-
6991.5
3331
- cf49dbbd-93b5-4f9f-81ea-f585f20a5843
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Browser
- Creates a web browser window.
- 924977b1-84e7-4dca-b665-dc5665995c5c
- Create Browser
- Create Browser
-
6017
3816
123
64
-
6074
3848
- The URI/URL of the page to display
- d9b32c62-07e2-4719-8843-7f649df85b03
- URL
- URL
- false
- eaa455c2-1654-4b37-ac2c-cad8507d319b
- 1
-
6019
3818
40
20
-
6040.5
3828
- Width of the window
- 4480fd1a-1caa-4d5e-aaeb-514600896ed6
- Width
- Width
- true
- 148a616a-f5b1-40cf-a785-df2df7554d26
- 1
-
6019
3838
40
20
-
6040.5
3848
- Height of the window
- da6b38c4-489f-4888-bb24-ab1a096eda8b
- Height
- Height
- true
- 2037544a-782e-47fa-908f-b3335aff5b12
- 1
-
6019
3858
40
20
-
6040.5
3868
- The created Web Browser
- 552eeadf-22fa-4710-8936-9e3572c6a032
- Browser
- Browser
- false
- 0
-
6089
3818
49
60
-
6113.5
3848
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- a72dedeb-188e-43b8-a97f-fb0006f95ba9
- Panel
- false
- 0
- 0
- https://google.com/maps/place/
-
5681
3633
221
38
- 0
- 0
- 0
-
5681.798
3633.306
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 2013e425-8713-42e2-a661-b57e78840337
- Concatenate
- Concatenate some fragments of text
- 74b9af32-7d99-42f5-a432-8179fec731d0
- Concatenate
- Concatenate
-
5989
3705
138
44
-
6070
3727
- 2
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 1
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- First text fragment
- 65b0b963-1be4-43d0-85ba-8ec99a449c07
- Fragment A
- Fragment A
- true
- a72dedeb-188e-43b8-a97f-fb0006f95ba9
- 1
-
5991
3707
64
20
-
6024.5
3717
- Second text fragment
- 190f6af9-f93c-4228-bf90-2991b7a6c7ca
- Fragment B
- Fragment B
- true
- f62c3539-236b-4602-a935-275952f9143e
- 1
-
5991
3727
64
20
-
6024.5
3737
- Resulting text consisting of all the fragments
- ed883f95-6dfd-4c09-9426-91045aabc54c
- Result
- Result
- false
- 0
-
6085
3707
40
40
-
6105
3727
- fc6ae741-ecd1-432f-abb4-36b3f439c6f5
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Pulldown Menu
- Creates a pulldown menu from which items can be selected.
- 08fe893d-7a39-4862-b5e4-0482ec6e4b53
- Create Pulldown Menu
- Create Pulldown Menu
- true
-
1052
1780
166
64
-
1146
1812
- Optional label for the Text Box
- 99a632fd-cca0-4fa1-93d6-0ef4690de14a
- Label
- Label
- false
- 7029f54e-4ba2-4006-8fe0-1a27f7e65d02
- 1
-
1054
1782
77
20
-
1094
1792
- 1
- 1
- {0}
- false
- 1
- The initial list of options to display in the list.
- 82237f97-71f4-4c21-8f3d-216ce4a24fa7
- List Items
- List Items
- false
- 5281cc1a-c6a0-4d8b-bc66-c95824d23eba
- 1
-
1054
1802
77
20
-
1094
1812
- The initially selected index. Defaults to the first item.
- 09c889f7-ff32-43e0-9c27-c7e089da17bc
- Selected Index
- Selected Index
- true
- 6aa3540b-0399-40ba-9146-cd0e6de920d0
- 1
-
1054
1822
77
20
-
1094
1832
- 1
- The pulldown object
- 1b1cad79-da55-40f6-ab7d-aeddd7a9a1a5
- Pulldown
- Pulldown
- false
- 0
-
1161
1782
55
60
-
1188.5
1812
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5281cc1a-c6a0-4d8b-bc66-c95824d23eba
- Panel
- false
- 0
- 0
- AL
AK
AZ
AR
CA
CO
CT
DE
DC
FL
GA
HI
ID
IL
IN
IA
KS
KY
LA
ME
MD
MA
MI
MN
MS
MO
MT
NE
NV
NH
NJ
NM
NY
NC
ND
OH
OK
OR
PA
RI
SC
SD
TN
TX
UT
VT
VA
WA
WV
WI
WY
-
1254
1918
160
97
- 0
- 0
- 0
-
1254.146
1918.074
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 7029f54e-4ba2-4006-8fe0-1a27f7e65d02
- Panel
- false
- 0
- 0
- State
-
967
1773
56
38
- 0
- 0
- 0
-
967.2036
1773.947
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d98497d6-c164-4499-aedb-78d04c09eba4
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set List Contents
- Use this to set the contents of either a List Box or a Pulldown Menu
- 3990a0ae-ffec-4449-b5b8-d76e586eb67d
- Set List Contents
- Set List Contents
-
1468
1800
121
64
-
1575
1832
- The list object to modify
- d59abcd2-6c58-4c55-8a90-13f50ec946c7
- List to modify
- List to modify
- false
- 1b1cad79-da55-40f6-ab7d-aeddd7a9a1a5
- 1
-
1470
1802
90
20
-
1516.5
1812
- 1
- The new items to display in the label
- 9a701f6e-ea65-478f-b63d-2328e11f2f92
- New list contents
- New list contents
- false
- 5281cc1a-c6a0-4d8b-bc66-c95824d23eba
- 1
-
1470
1822
90
20
-
1516.5
1832
- The optional index to select in the updated list
- ed4c0f55-60d1-482c-9020-82dd3ad4cadf
- Selected Index
- Selected Index
- true
- af9880fa-a372-4755-9ae7-e63a8539d99a
- 1
-
1470
1842
90
20
-
1516.5
1852
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 4d646e7a-a388-45ee-b1b4-8be6e23c78fa
- Value Listener
- Value Listener
- false
-
1256
1823
152
64
-
1347
1855
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 66a2d85b-7ffd-4524-beea-6aab2a877229
- Elements
- Elements
- false
- 1b1cad79-da55-40f6-ab7d-aeddd7a9a1a5
- 1
-
1258
1825
74
20
-
1296.5
1835
- 1
- The optional filter(s) for the elements you want to listen for.
- 24f2b18b-5cf3-4f4d-ae57-f3a6b04e7aee
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1258
1845
74
20
-
1296.5
1855
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 4dad8d61-0a9a-4ed3-a8a7-b352680cc793
- Trigger
- T
- true
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
-
1258
1865
74
20
-
1296.5
1875
- 2
- The values of the listened elements
- 813041ee-60d0-44b4-aefe-15934b3e0e88
- Values
- Values
- false
- 0
-
1362
1825
44
30
-
1384
1840
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- af9880fa-a372-4755-9ae7-e63a8539d99a
- Indices
- Indices
- false
- 0
-
1362
1855
44
30
-
1384
1870
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- 1dcb88c1-bc1b-48b7-913f-55f3c86d68d1
- Create Text Box
- Create Text Box
- true
-
1077
1440
163
64
-
1172
1472
- Optional label for the Text Box
- 28d9363b-519f-4668-b699-8d2c5479b089
- Label
- Label
- false
- 8c5b096a-4e1a-4f15-b52e-2b56b2a8b910
- 1
-
1079
1442
78
20
-
1119.5
1452
- 1
- 1
- {0}
- false
- The starting text in the text box
- a5cd1117-490b-47aa-8726-a684ff3d2a56
- Default Text
- Default Text
- false
- ae9f5ace-2e48-4afa-a967-07b57efc2d42
- 1
-
1079
1462
78
20
-
1119.5
1472
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- 7e78473d-449c-440c-bcf5-1533e4024a37
- Update Button
- Update Button
- false
- 0
-
1079
1482
78
20
-
1119.5
1492
- 1
- 1
- {0}
- false
- The created text box.
- 94a1ede9-eb16-47e1-9c90-7d44b3faf751
- Text Box
- Text Box
- false
- 0
-
1187
1442
51
60
-
1212.5
1472
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 60eef9dc-ca04-41ed-aa29-1b2998f69386
- Panel
- false
- 0
- 0
- Confirm Address and Open Google Maps
-
378
2198
115
38
- 0
- 0
- 0
-
378.4346
2198.937
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 1781268d-0b86-4743-afa3-f6b3d399d430
- Value Listener
- Value Listener
- true
-
712
2210
152
44
-
803
2232
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- d66a4442-ef30-48f5-a933-f8f7777aaa00
- Elements
- Elements
- false
- 4938af70-4864-4d0a-b4ef-2a3de78091c6
- 1
-
714
2212
74
20
-
752.5
2222
- 1
- The optional filter(s) for the elements you want to listen for.
- e66142a3-8008-448e-b183-a801f4d13910
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
714
2232
74
20
-
752.5
2242
- 2
- The values of the listened elements
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- Values
- Values
- false
- 0
-
818
2212
44
20
-
840
2222
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 1ed8e426-21e9-4ecf-bc13-4874be14b75a
- Indices
- Indices
- false
- 0
-
818
2232
44
20
-
840
2242
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 2cd71327-3ec3-4d21-aee4-959bdee5857d
- Entwine
- Entwine
-
2008
8283
118
104
-
2053
8335
- 5
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- aa0a5500-8b58-4222-b682-848128599714
- false
- Branch {0;0}
- {0;0}
- true
- ca712486-a0f4-469a-b0ad-150278da264f
- 1
-
2010
8285
28
20
-
2025.5
8295
- 2
- Data to entwine
- 09da9bfc-c909-4b91-b6b1-d8e3ba429a62
- false
- Branch {0;1}
- {0;1}
- true
- 789f4e3c-486a-4409-a63b-47b85410bcae
- 1
-
2010
8305
28
20
-
2025.5
8315
- 2
- Data to entwine
- 681480ca-7717-46e1-834b-7381e9e17c4c
- false
- Branch {0;2}
- {0;2}
- true
- d5bdd8d2-b753-4125-9ce8-ef3bc6c928be
- 1
-
2010
8325
28
20
-
2025.5
8335
- 2
- Data to entwine
- f19b2394-1d48-4b67-b06b-92f88a8f02aa
- false
- Branch {0;3}
- {0;3}
- true
- f5e24607-83cb-4dd1-931d-7233ddde5117
- 1
-
2010
8345
28
20
-
2025.5
8355
- 2
- Data to entwine
- 166cd259-4c73-4e3d-9786-1a8d38b7c180
- false
- Branch {0;4}
- {0;4}
- true
- db07bf26-d1dd-4f91-a95e-4e567840b30f
- 1
-
2010
8365
28
20
-
2025.5
8375
- Entwined result
- 7d133164-6dd5-4cc2-baca-fff8f507743d
- 1
- Result
- Result
- false
- 0
-
2068
8285
56
100
-
2088
8335
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- 7bd0a005-5314-4768-beb3-95a4a7679bc6
- Create Text Box
- Create Text Box
- true
-
1065
1625
163
64
-
1160
1657
- Optional label for the Text Box
- 499c286a-85c4-4a4a-a598-ceedc1c08632
- Label
- Label
- false
- f008d5e2-b800-4399-ac7f-d17b80009914
- 1
-
1067
1627
78
20
-
1107.5
1637
- 1
- 1
- {0}
- false
- The starting text in the text box
- e0b0048a-fccf-46f3-89b9-68fdb7a928c9
- Default Text
- Default Text
- false
- d8c134ca-984c-477c-93d8-c2cf597e0271
- 1
-
1067
1647
78
20
-
1107.5
1657
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- b80e945a-5ff2-471b-8e34-466f558c20cc
- Update Button
- Update Button
- false
- 0
-
1067
1667
78
20
-
1107.5
1677
- 1
- 1
- {0}
- false
- The created text box.
- 73dcb207-f110-49bb-a5b7-67a9bce3a34c
- Text Box
- Text Box
- false
- 0
-
1175
1627
51
60
-
1200.5
1657
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- 629335b4-f673-4c79-969f-e827f75251e8
- Create Text Box
- Create Text Box
- true
-
1054
2044
163
64
-
1149
2076
- Optional label for the Text Box
- e2adff96-b076-4401-99c8-ba8e62ad4bfd
- Label
- Label
- false
- a335f27b-698b-4255-88f4-78200f26b34f
- 1
-
1056
2046
78
20
-
1096.5
2056
- 1
- 1
- {0}
- false
- The starting text in the text box
- b3441f5c-fda4-4b16-af11-fc6578f1ba59
- Default Text
- Default Text
- false
- c21f982f-a8b4-4c51-aec6-8504d405c288
- 1
-
1056
2066
78
20
-
1096.5
2076
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- 7514c62a-b5c8-41d7-9790-86caecc43c55
- Update Button
- Update Button
- false
- 0
-
1056
2086
78
20
-
1096.5
2096
- 1
- 1
- {0}
- false
- The created text box.
- 1a16fced-0d55-4e1e-8aaa-6d813b96bb31
- Text Box
- Text Box
- false
- 0
-
1164
2046
51
60
-
1189.5
2076
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 8c5b096a-4e1a-4f15-b52e-2b56b2a8b910
- Panel
- false
- 0
- 0
- Street Address
-
915
1435
115
38
- 0
- 0
- 0
-
915.7295
1435.295
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- f008d5e2-b800-4399-ac7f-d17b80009914
- Panel
- false
- 0
- 0
- City
-
991
1624
49
38
- 0
- 0
- 0
-
991.9902
1624.203
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- a335f27b-698b-4255-88f4-78200f26b34f
- Panel
- false
- 0
- 0
- Zip Code
-
952
2041
76
38
- 0
- 0
- 0
-
952.0068
2041.518
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- da45f475-7225-4805-acb1-e29b9875d4af
- Set TextBox Contents
- Set TextBox Contents
-
1450
1460
149
44
-
1585
1482
- The text box object to modify
- d497bb4b-ff0a-4ae9-8d9d-cc984c8cf879
- Text Box to modify
- Text Box to modify
- false
- 94a1ede9-eb16-47e1-9c90-7d44b3faf751
- 1
-
1452
1462
118
20
-
1512.5
1472
- The new text to display in the text box
- ecafcca7-a498-4e29-ade3-7b40fc668900
- New Text Box contents
- New Text Box contents
- false
- c14bef65-7e43-4f6f-ade3-216c05d47a6f
- 1
-
1452
1482
118
20
-
1512.5
1492
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 80a1d6bf-5f00-41ac-a5df-37e89c06dcca
- Value Listener
- Value Listener
- false
-
1277
1488
152
64
-
1368
1520
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- b66454dc-27ca-4119-bb77-0046a39c89f9
- Elements
- Elements
- false
- 94a1ede9-eb16-47e1-9c90-7d44b3faf751
- 1
-
1279
1490
74
20
-
1317.5
1500
- 1
- The optional filter(s) for the elements you want to listen for.
- a0259e6a-d7fc-4ce9-8c47-da3b4f946209
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1279
1510
74
20
-
1317.5
1520
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 119167b9-28db-46ad-bad2-c700757ce3da
- Trigger
- T
- true
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
-
1279
1530
74
20
-
1317.5
1540
- 2
- The values of the listened elements
- c14bef65-7e43-4f6f-ade3-216c05d47a6f
- Values
- Values
- false
- 0
-
1383
1490
44
30
-
1405
1505
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- e61fcb0a-281c-48c8-9e35-6d64aea712cd
- Indices
- Indices
- false
- 0
-
1383
1520
44
30
-
1405
1535
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- 57d320e3-01a9-444b-bdf9-8d6f9b92cb0b
- Set TextBox Contents
- Set TextBox Contents
-
1447
1645
149
44
-
1582
1667
- The text box object to modify
- 5720a5e5-8bcd-401a-aa78-ee9d6f9b4f6d
- Text Box to modify
- Text Box to modify
- false
- 73dcb207-f110-49bb-a5b7-67a9bce3a34c
- 1
-
1449
1647
118
20
-
1509.5
1657
- The new text to display in the text box
- 88509385-5f2b-47d9-b9b7-0e944c8616ae
- New Text Box contents
- New Text Box contents
- false
- 6f81785a-51a3-4ad9-8b06-6e6e326f9f7f
- 1
-
1449
1667
118
20
-
1509.5
1677
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- c495eb29-06b7-4424-aa7d-5d64efa53b73
- Value Listener
- Value Listener
- false
-
1268
1669
152
64
-
1359
1701
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- f6c11eca-291d-435b-a4bc-804a734aee7b
- Elements
- Elements
- false
- 73dcb207-f110-49bb-a5b7-67a9bce3a34c
- 1
-
1270
1671
74
20
-
1308.5
1681
- 1
- The optional filter(s) for the elements you want to listen for.
- f1a4572b-49f1-4053-94bb-38d71fbe64fb
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1270
1691
74
20
-
1308.5
1701
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- a4942dc3-50d4-4caa-8da7-076ea2c95982
- Trigger
- T
- true
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
-
1270
1711
74
20
-
1308.5
1721
- 2
- The values of the listened elements
- 6f81785a-51a3-4ad9-8b06-6e6e326f9f7f
- Values
- Values
- false
- 0
-
1374
1671
44
30
-
1396
1686
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 399c3fd5-be46-4178-8f9d-4751165debba
- Indices
- Indices
- false
- 0
-
1374
1701
44
30
-
1396
1716
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- 8f9d91bf-119c-44d4-a01e-4967e9ad9660
- Set TextBox Contents
- Set TextBox Contents
-
1441
2057
149
44
-
1576
2079
- The text box object to modify
- 8ee187eb-14bf-4847-be09-90456017d202
- Text Box to modify
- Text Box to modify
- false
- 1a16fced-0d55-4e1e-8aaa-6d813b96bb31
- 1
-
1443
2059
118
20
-
1503.5
2069
- The new text to display in the text box
- dc3f1f02-4aa0-463d-b4a8-1b6cfeefd5aa
- New Text Box contents
- New Text Box contents
- false
- d0861a52-b959-4ce9-9579-da23997648e1
- 1
-
1443
2079
118
20
-
1503.5
2089
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 1c218f54-c244-4b62-88d7-61768ed392e1
- Value Listener
- Value Listener
- false
-
1262
2081
152
64
-
1353
2113
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 1e973a3f-7296-4ef7-aa9e-8d45962bfec2
- Elements
- Elements
- false
- 1a16fced-0d55-4e1e-8aaa-6d813b96bb31
- 1
-
1264
2083
74
20
-
1302.5
2093
- 1
- The optional filter(s) for the elements you want to listen for.
- 76529c30-b87d-47f2-a73c-c2a8804f0761
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1264
2103
74
20
-
1302.5
2113
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 1450fbc7-119d-4232-aae3-21c4926f9624
- Trigger
- T
- true
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
-
1264
2123
74
20
-
1302.5
2133
- 2
- The values of the listened elements
- d0861a52-b959-4ce9-9579-da23997648e1
- Values
- Values
- false
- 0
-
1368
2083
44
30
-
1390
2098
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- d5833e5c-f0c2-4038-bb13-54490329cad2
- Indices
- Indices
- false
- 0
-
1368
2113
44
30
-
1390
2128
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
- Boolean (true/false) toggle
- 2241519d-5a46-4342-9df2-9f05ae583cf0
- Boolean Toggle
- Boolean Toggle
- false
- 0
- true
-
6382
2716
146
22
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- aef46266-7eca-4177-bc84-14300355d702
- Panel
- false
- 0
- 0
-
-
5601
3721
53
43
- 0
- 0
- 0
-
5601.239
3721.241
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 4df8df00-3635-45bd-95e6-f9206296c110
- Replace Text
- Replace all occurences of a specific text fragment with another
- e2807eeb-9f9c-4f23-8681-e52fa76dd859
- Replace Text
- Replace Text
- false
-
5692
3695
119
64
-
5754
3727
- Text to operate on.
- 0c36bfcc-2e75-4b7d-91bb-e231bc477f65
- Text
- Text
- false
- ab5b4302-b6e9-488b-beb1-b6a49be5e2e0
- 1
-
5694
3697
45
20
-
5718
3707
- Fragment to replace.
- a09ede6a-221b-4a6a-a0c9-f78fbe93fffd
- Find
- Find
- true
- aef46266-7eca-4177-bc84-14300355d702
- 1
-
5694
3717
45
20
-
5718
3727
- Optional fragment to replace with. If blank, all occurences of F will be removed.
- f9231cc7-a924-46b2-89ad-d8fec7dc4f06
- Replace
- Replace
- true
- be9942f9-eb89-438c-a2d4-057d27eb0b34
- 1
-
5694
3737
45
20
-
5718
3747
- Result of text replacement
- 1e9cba52-a8e1-4d67-96f2-185210d7108a
- Result
- Result
- false
- 0
-
5769
3697
40
60
-
5789
3727
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- be9942f9-eb89-438c-a2d4-057d27eb0b34
- Panel
- false
- 0
- 0
- +
-
5616
3771
30
38
- 0
- 0
- 0
-
5616.052
3771.891
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 1274d51a-81e6-4ccf-ad1f-0edf4c769cac
- Text Join
- Join a collection of text fragments into one
- 0e7b47b7-d31c-4f1b-a482-07ea0554f8f7
- Text Join
- Text Join
-
5850
3715
101
44
-
5894
3737
- 1
- Text fragments to join.
- 3e7bb73b-d277-448b-8752-595310e53506
- Text
- Text
- false
- 1e9cba52-a8e1-4d67-96f2-185210d7108a
- 1
-
5852
3717
27
20
-
5867
3727
- Fragment separator.
- b53e641d-852b-4bb0-8cb3-b71de6435c02
- Join
- Join
- true
- be9942f9-eb89-438c-a2d4-057d27eb0b34
- 1
-
5852
3737
27
20
-
5867
3747
- Resulting text
- f62c3539-236b-4602-a935-275952f9143e
- Result
- Result
- false
- 0
-
5909
3717
40
40
-
5929
3737
- a880cc82-b5df-45bc-a730-afa8352c4679
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Browser
- Control the Browser element - with back/forward buttons, and control over the displayed site etc.
- 0cce266e-3476-4154-acea-09d2d06c0404
- Set Browser
- Set Browser
-
6212
3635
77
104
-
6275
3687
- The Browser UI Element to modify
- c8800c9a-f81e-4468-83a5-57e95b30f8de
- Browser
- Browser
- false
- 552eeadf-22fa-4710-8936-9e3572c6a032
- 1
-
6214
3637
46
20
-
6238.5
3647
- Set to true in order to send the browser back a page
- bdf9d51e-2c3a-478e-b48b-18888e46858e
- Back
- Back
- true
- 0
-
6214
3657
46
20
-
6238.5
3667
- Set to true to send the browser forward a page
- e84c322b-e843-424d-9935-89a46f3916a0
- Forward
- Forward
- true
- 0
-
6214
3677
46
20
-
6238.5
3687
- Set to true to refresh the current window
- 1be2ed7f-b35e-4e90-b2e7-a548c8220e79
- Refresh
- Refresh
- true
- 0
-
6214
3697
46
20
-
6238.5
3707
- The URL to set the current browser to access.
- 3086bc13-234f-486d-a4a3-6a5d6fa4a110
- URL
- URL
- true
- ed883f95-6dfd-4c09-9426-91045aabc54c
- 1
-
6214
3717
46
20
-
6238.5
3727
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 2037544a-782e-47fa-908f-b3335aff5b12
- Number Slider
- Number Slider
- false
- 0
-
5792
3869
203
20
-
5792.087
3869.225
- 3
- 1
- 1
- 1000
- 0
- 0
- 500
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- 9f88bf58-ce70-4272-87f9-4b34d03f7bd5
- Create Text Box
- Create Text Box
- true
-
979
2386
163
64
-
1074
2418
- Optional label for the Text Box
- d8557f1f-9d06-4d10-b242-964701bf87b6
- Label
- Label
- false
- de95539b-a4e5-4cb3-a44f-4ed9e4e9a468
- 1
-
981
2388
78
20
-
1021.5
2398
- 1
- 1
- {0}
- false
- The starting text in the text box
- fbb10221-0fa0-4a64-8ab7-37ea7cb075ef
- Default Text
- Default Text
- false
- 2d5e245d-37e7-45a2-9c93-195e72ce47dc
- 1
-
981
2408
78
20
-
1021.5
2418
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- dbd9cba2-b259-478d-b24b-3fbc63ca4a2e
- Update Button
- Update Button
- false
- 0
-
981
2428
78
20
-
1021.5
2438
- 1
- 1
- {0}
- false
- The created text box.
- cee80eec-501c-42df-8d87-29481638b090
- Text Box
- Text Box
- false
- 0
-
1089
2388
51
60
-
1114.5
2418
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- de95539b-a4e5-4cb3-a44f-4ed9e4e9a468
- Panel
- false
- 0
- 0
- Lat/Long
-
813
2307
76
38
- 0
- 0
- 0
-
813.084
2307.044
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- b0fae450-7d60-4908-8c2a-0b207f8d19a6
- Set TextBox Contents
- Set TextBox Contents
-
1384
2377
149
44
-
1519
2399
- The text box object to modify
- 873038fd-849d-45ed-999a-c0b2162f77aa
- Text Box to modify
- Text Box to modify
- false
- cee80eec-501c-42df-8d87-29481638b090
- 1
-
1386
2379
118
20
-
1446.5
2389
- The new text to display in the text box
- ac75b6c3-e4a8-4948-837b-5b3a8c975cbf
- New Text Box contents
- New Text Box contents
- false
- da6ad759-3e7e-4f9d-9ed9-2677d39da640
- 1
-
1386
2399
118
20
-
1446.5
2409
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 5b302cdd-ced8-4764-ba1d-62fb4fe14a83
- Value Listener
- Value Listener
- false
-
1186
2424
152
64
-
1277
2456
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 6ddfa523-d844-4bda-aff6-b1172bb2d44f
- Elements
- Elements
- false
- cee80eec-501c-42df-8d87-29481638b090
- 1
-
1188
2426
74
20
-
1226.5
2436
- 1
- The optional filter(s) for the elements you want to listen for.
- af50c657-3f97-4b75-8d10-834ac0e52416
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1188
2446
74
20
-
1226.5
2456
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 39b7a38f-ebb5-46cb-aaa9-cfca68f22dab
- Trigger
- T
- true
- c2874ca4-f248-434f-af2d-8d539d2d2724
- 1
-
1188
2466
74
20
-
1226.5
2476
- 2
- The values of the listened elements
- da6ad759-3e7e-4f9d-9ed9-2677d39da640
- Values
- Values
- false
- 0
-
1292
2426
44
30
-
1314
2441
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 4f286355-3268-4685-ba33-88f6ad16bcc6
- Indices
- Indices
- false
- 0
-
1292
2456
44
30
-
1314
2471
- 04887d01-504c-480e-b2a2-01ea19cc5922
- Text Split
- Split some text into fragments using separators
- true
- 473cb663-66f3-4abe-bd28-6e3963774e12
- Text Split
- Text Split
-
9181
894
133
44
-
9257
916
- Text to split.
- 5cbf6ebd-cd4b-4acd-ae1f-7646bc29c668
- Text
- Text
- false
- 4f9426bc-05a9-4d20-9d88-8facd7277486
- 1
-
9183
896
59
20
-
9214
906
- Separator characters.
- 6d05cc53-dd3e-453d-b3f6-3565ccb34498
- Separators
- Separators
- false
- 4dd91265-37ac-4962-a2c4-4bf93c55d463
- 1
-
9183
916
59
20
-
9214
926
- 1
- Resulting text fragments
- 4a57032a-4cd2-4734-add4-47c86e50891d
- Result
- Result
- false
- 0
-
9272
896
40
40
-
9292
916
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 4dd91265-37ac-4962-a2c4-4bf93c55d463
- Panel
- false
- 0
- 0
- ,
-
9128
915
30
38
- 0
- 0
- 0
-
9128.957
915.1401
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- true
- 231ebbb2-ca57-46d0-bf3d-774b1b2591ba
- List Item
- List Item
-
9354
904
90
64
-
9404
936
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- ce8a431c-1be7-4f84-8acb-4df984c93653
- List
- List
- false
- 4a57032a-4cd2-4734-add4-47c86e50891d
- 1
-
9356
906
33
20
-
9374
916
- Item index
- 7f978feb-2091-4b37-9289-069364f9dc42
- Index
- Index
- false
- 0
-
9356
926
33
20
-
9374
936
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- 4bf8254e-52a7-4203-93e9-c6d3f94f2bf2
- Wrap
- Wrap
- false
- 0
-
9356
946
33
20
-
9374
956
- 1
- 1
- {0}
- true
- Item at {i'}
- 6d0489ba-13d6-4090-93ae-b7af5d55ee42
- false
- Item
- i
- false
- 0
-
9419
906
23
20
-
9430.5
916
- Item at {+1'}
- 4406dc68-0c7d-4d26-a933-be5d41bf1695
- false
- Item +1
- +1
- false
- 0
-
9419
926
23
20
-
9430.5
936
- Item at {+2'}
- 76f516f1-c863-436a-b8ab-660f051bf4c0
- false
- Item +2
- +2
- false
- 0
-
9419
946
23
20
-
9430.5
956
- 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312
- Number
- Contains a collection of floating point numbers
- 1
- c3a6758a-e9ca-48ed-a938-ba870174bfe8
- Number
- Latitude
- false
- 6d0489ba-13d6-4090-93ae-b7af5d55ee42
- 1
-
9485
908
52
20
-
9511.75
918.3364
- 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312
- Number
- Contains a collection of floating point numbers
- 1
- 9040aaba-f616-44e6-80b6-252996d1aec4
- Number
- Longitude
- false
- 76f516f1-c863-436a-b8ab-660f051bf4c0
- 1
-
9476
949
62
20
-
9507.662
959.2729
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 148a616a-f5b1-40cf-a785-df2df7554d26
- Number Slider
- Number Slider
- false
- 0
-
5763
3840
203
20
-
5763.511
3840.156
- 3
- 1
- 1
- 1000
- 0
- 0
- 1000
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- cdf2e11f-6fe6-4d60-86f6-34a5efb38c8a
- Entwine
- Entwine
-
5679
3353
118
44
-
5724
3375
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- bd5dd620-e78c-472c-bdbb-c62377ff3b36
- false
- Branch {0;0}
- {0;0}
- true
- 372d2239-3019-49a1-a4ac-bc8fdc6f434f
- 1
-
5681
3355
28
20
-
5696.5
3365
- 2
- Data to entwine
- ee95ec47-bfba-45dd-8608-a399a67c93a0
- false
- Branch {0;1}
- {0;1}
- true
- 6542ceca-3b61-4a2c-974d-fb95a3fac4d1
- 1
-
5681
3375
28
20
-
5696.5
3385
- Entwined result
- 58002c48-fe90-49aa-8d5f-48590a7caafa
- 1
- Result
- Result
- false
- 0
-
5739
3355
56
40
-
5759
3375
- 3c76e033-c9a8-4b6d-94c4-8ccdfac09834
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Image
- Creates an image object to be added to the window
- 688d3616-8cff-43e5-8e63-c753ac141c0c
- Create Image
- Create Image
-
5427
3327
163
64
-
5533
3359
- The file location of the image to add.
- 547c9a3f-4f97-4a21-ac34-6bf92fa050ed
- Image Source
- Image Source
- false
- 34a8155b-529f-4b14-816c-6c5d588f792f
- 1
-
5429
3329
89
20
-
5483
3339
- The width of the image
- e6f2f4a3-e33c-4d7a-923a-3df451b52dbc
- x/2
- Image Width
- Image Width
- false
- 148a616a-f5b1-40cf-a785-df2df7554d26
- 1
-
5429
3349
89
20
-
5483
3359
- 1
- 1
- {0}
- 300
- The height of the image. Set to 0 or leave blank to scale image proportionally to its width.
- c90c8694-c0ba-4f94-a6fe-e14fe13b3553
- x/2
- Image Height
- Image Height
- true
- 2037544a-782e-47fa-908f-b3335aff5b12
- 1
-
5429
3369
89
20
-
5483
3379
- The image object. Use in conjunction with an "Add Elements" component.
- 372d2239-3019-49a1-a4ac-bc8fdc6f434f
- Image
- Image
- false
- 0
-
5548
3329
40
60
-
5568
3359
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 4c6367e3-8f26-4de0-9084-ce41db3437ca
- Create Text Block
- Create Text Block
-
5433
3422
157
64
-
5514
3454
- The text to display in the text block
- 45b6b93e-bcba-4c19-a178-a1c3cc4f32bb
- Text
- Text
- false
- 06fa9381-80ae-4027-b45f-6857b8f1fc6f
- 1
-
5435
3424
64
20
-
5468.5
3434
- The size of the label to display
- aa064be8-83f2-49c3-8d10-c75040e5e5bb
- Text Size
- Text Size
- false
- 0
-
5435
3444
64
20
-
5468.5
3454
- 1
- 1
- {0}
- 16
- Text justification
- da07f03b-941b-42e8-ac29-38cf12aae56f
- Justification
- Justification
- false
- 0
-
5435
3464
64
20
-
5468.5
3474
- 1
- 1
- {0}
- 0
- The created text block.
- 6542ceca-3b61-4a2c-974d-fb95a3fac4d1
- Text Block
- Text Block
- false
- 0
-
5529
3424
59
60
-
5558.5
3454
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 06fa9381-80ae-4027-b45f-6857b8f1fc6f
- Panel
- false
- 0
- 0
-
1. Right-Click on Google Maps Pin.
2. Left-Click on the Lat/Long to copy the value
to your clipboard.
3. Paste this value into the "Lat/Long" box on
the previous window.
4. You may close this window after copying
the Lat/Long info.
-
5195
3448
174
160
- 0
- 0
- 0
-
5195.116
3448.066
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 00f0e6df-7227-42a7-b148-a9a4e245c928
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create WrapPanel
- Creates a group of UI elements WrapPaneled vertically or horizontally.
- bc99243d-2c5d-40b4-9360-937a192cdc20
- Create WrapPanel
- Create WrapPanel
-
6063
3408
161
44
-
6144
3430
- 1
- The UI elements to group together
- 35a28fcd-01df-49db-83d3-047244063422
- UI Elements
- UI Elements
- false
- b574f49d-f75b-4757-b8f9-af00d2d324ef
- 1
-
6065
3410
64
20
-
6098.5
3420
- Set to true for horizontal arrangement; false for vertical.
- c0cc1931-228b-4840-9e31-6b52ddcae81f
- Horizontal
- Horizontal
- false
- 0
-
6065
3430
64
20
-
6098.5
3440
- 1
- 1
- {0}
- true
- The combined group of elements
- 34c90063-22b8-4bd2-9edc-12d5d56e1096
- WrapPanel
- WrapPanel
- false
- 0
-
6159
3410
63
40
-
6190.5
3430
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- fad66439-a507-4c7f-acb1-dc5fc30ab780
- Entwine
- Entwine
-
6414
3539
118
44
-
6459
3561
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 5efdae3f-f3cf-42ba-a896-dd137f16437b
- false
- Branch {0;0}
- {0;0}
- true
- 34c90063-22b8-4bd2-9edc-12d5d56e1096
- 1
-
6416
3541
28
20
-
6431.5
3551
- 2
- Data to entwine
- 6adf874f-e352-4f92-88d1-a431acfd21e5
- false
- Branch {0;1}
- {0;1}
- true
- 552eeadf-22fa-4710-8936-9e3572c6a032
- 1
-
6416
3561
28
20
-
6431.5
3571
- Entwined result
- 0526ff01-511f-4d9e-8cf0-04ede46182ca
- 1
- Result
- Result
- false
- 0
-
6474
3541
56
40
-
6494
3561
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- eaa455c2-1654-4b37-ac2c-cad8507d319b
- Panel
- false
- 0
- 0
- https://google.com
-
5833
3804
134
30
- 0
- 0
- 0
-
5833.259
3804.461
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- dfb1703a-45fd-44e6-be50-e2a4a3c415b4
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Border
- Wrap Elements with a border.
- aef487f3-d06a-46b2-97b0-b6d9430de961
- Create Border
- Create Border
-
5863
3378
166
84
-
5969
3420
- The UI element to include
- fa6f4507-52c6-4305-9631-c0087bfdc6e7
- UI Element
- UI Element
- false
- 58002c48-fe90-49aa-8d5f-48590a7caafa
- 1
-
5865
3380
89
20
-
5911
3390
- Border thickness
- 69501b10-b35c-453c-b00f-f5d4064fe0f5
- Border Thickness
- Border Thickness
- false
- 0
-
5865
3400
89
20
-
5911
3410
- 1
- 1
- {0}
- 3
- Border color
- c5f74733-2737-4a74-a30d-859eb5146abd
- Border Color
- Border Color
- false
- 8c2467b8-77e4-4227-bec6-8edeae349ce0
- 1
-
5865
3420
89
20
-
5911
3430
- 1
- 1
- {0}
-
255;0;0;0
- Border corner radius
- 34a45b32-6e0c-4989-aea8-e4879484cc00
- Corner Radius
- Corner Radius
- false
- cb0b3abc-d37a-48f4-a397-3c902ba88c2a
- 1
-
5865
3440
89
20
-
5911
3450
- 1
- 1
- {0}
- 0
- The Border
- b574f49d-f75b-4757-b8f9-af00d2d324ef
- Border
- Border
- false
- 0
-
5984
3380
43
80
-
6005.5
3420
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- cb0b3abc-d37a-48f4-a397-3c902ba88c2a
- Number Slider
- Number Slider
- false
- 0
-
5641
3447
203
20
-
5641.292
3447.115
- 3
- 1
- 1
- 100
- 0
- 0
- 10
- 9a5b87d6-046e-4c33-9aca-5af2f7503047
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Button
- 0
- Create a Button object.
- 616d3887-75f6-4e0d-975a-102222125683
- Create Button
- Create Button
-
805
2466
149
44
-
894
2488
- The text to display on the button
- 7a4e42b6-1d9d-4114-b0ec-47f8a50572b7
- Button Name
- Button Name
- true
- 5812aecb-ba38-4369-a149-8c3531137056
- 1
-
807
2468
72
20
-
844.5
2478
- The image to display on the button.
- d987d736-25e7-4b15-ba49-d9a5149c0f17
- Image Path
- Image Path
- true
- 0
-
807
2488
72
20
-
844.5
2498
- The created Button
- 094ddc65-3d05-46d7-bd06-edc14a272ab8
- Button
- Button
- false
- 0
-
909
2468
43
40
-
930.5
2488
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5812aecb-ba38-4369-a149-8c3531137056
- Panel
- false
- 0
- 0
- Confirm Lat/Long
-
666
2466
115
38
- 0
- 0
- 0
-
666.832
2466.441
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 58b7c385-e893-486e-a496-5a2dd6f59e55
- Value Listener
- Value Listener
- true
-
990
2473
152
44
-
1081
2495
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 95d17b58-8484-42dd-8126-63e9ffb8c9d0
- Elements
- Elements
- false
- 094ddc65-3d05-46d7-bd06-edc14a272ab8
- 1
-
992
2475
74
20
-
1030.5
2485
- 1
- The optional filter(s) for the elements you want to listen for.
- e8666f44-069f-463e-948f-17ff88a4e515
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
992
2495
74
20
-
1030.5
2505
- 2
- The values of the listened elements
- c2874ca4-f248-434f-af2d-8d539d2d2724
- Values
- Values
- false
- 0
-
1096
2475
44
20
-
1118
2485
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 3331cfef-5667-471b-ac75-9bd34bcd8adb
- Indices
- Indices
- false
- 0
-
1096
2495
44
20
-
1118
2505
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Create Location
- # create location
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to construct a location based on latitude, longitude coordinates.
-
Provided by Gismo 0.0.3
input:
locationName_: A name of the location.
-
If nothing added to this input, "unknown location" will be used as default locationName_.
latitude_: Location's latitude coordinate.
It ranges from -90 for locations south of equator, to 90 for locations above the equator.
-
If nothing added to this input, "40" will be used as default latitude_.
longitude_: Location's longitude coordinate.
It ranges from -180 for locations west of Prime Meridian, to 180 for locations east of Prime Meridian.
-
If nothing added to this input, "0" will be used as default longitude_.
output:
readMe!: ...
location: Joined string containing information about location's components: locationName, latitude, longitude, timeZone and elevation.
timeZone and elevation are always set to "0" as they do not affect Gismo components.
"""
ghenv.Component.Name = "Gismo_Create Location"
ghenv.Component.NickName = "CreateLocation"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "0 | Gismo"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "2"
except: pass
import scriptcontext as sc
import Grasshopper
def checkInputs(locationName, latitude, longitude):
# check inputs
if (locationName == None):
locationString = None
validInputData = False
printMsg = "Please define the \"locationName_\" input."
return location, validInputData, printMsg
if (latitude == None):
locationString = None
validInputData = False
printMsg = "Please define the \"latitude_\" input."
return location, validInputData, printMsg
elif (latitude < -90) or (latitude > 90):
locationString = None
validInputData = False
printMsg = "\"latitude_\" input can not be larger than 90 nor smaller than -90."
return location, validInputData, printMsg
if (longitude == None):
locationString = None
validInputData = False
printMsg = "Please define the \"latitude_\" input."
return location, validInputData, printMsg
elif (longitude < -180) or (longitude > 180):
locationString = None
validInputData = False
printMsg = "\"longitude_\" input can not be larger than 180 nor smaller than -180."
return location, validInputData, printMsg
correctedLocationName = gismo_preparation.cleanString(locationName) # removing "/", "\", " ", "," from locationName_
timeZone = 0; elevation = 0 # default. These two inputs are not important for OSM and terrain components
locationString = gismo_preparation.constructLocation(correctedLocationName, latitude, longitude, timeZone, elevation)
validInputData = True
printMsg = "ok"
return locationString, validInputData, printMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning # [do not change this line
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_preparation = sc.sticky["gismo_Preparation"]()
location, validInputData, printMsg = checkInputs(locationName_, latitude_, longitude_)
if not validInputData:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to construct a location based on latitude, longitude coordinates.
-
Provided by Gismo 0.0.3
-
-9
-9
-
550
575
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAFKElEQVRIS82TZ1BUVxhA39vH7rqsVIXYoihoImLBbiIYUDODLdjAEkBNAFEhCBGzBgsKAQtWLIkoKiqWUVEcbBEkaGSUjEoENajYsGGbaBQQOLlk9481jvmTM3Pnzrv3+85325P+7/hY6jXHXZpblzVupC+RZXmJGLM3Tv13YoK8zLmz2R4ONaTmgCPpP7TDzkpXKOYaGkPen06eLmZV7FO4uU4mdpTEpnBJFLImY54zkiSnmOLem+/WhSmQqaJ/Z7NH4jtZSK+sHl9bpBFtHPUlxrB3x0K03pKkCZMkXbgkqY5sjZSpSK9PE3vtb8YQaVr0MBkO63Frr7ljGvtXmqv1VisbdOlV2tp3Ah7TI+k5awWaroGM7y1We9CG+ImtatQaXW5nR/PSG2sUriYrWJqrjpny34IiDWzW3aXMa8ZcfNfvJWhfOosvriQ4+yKu8/Oxtrbg8ExRJMuOsu2OVGTY/HNkAR5m4g6k4UbJm1BJASNmf0xoRgwJv6SQ+PsxhuQ8JuBkFUGnajCc/guPQH+cG0icThRFMo1ttq9Se8GLTJY30qNPSItn258EkFcRS9b9vUQX3WPyFYi6XkP4RVhRUsr64v04uXnQpZnEtZ8kNkxSoejMnov8TkbNG2jSxuLn5RcGkVM1kd1l6xh9/BGBf4ChVBQQRYLO1LDzaiGbSwrwSTuLrYsbbepJOLXVM2BBC6ybareZVK/FY/iMNqwqDiDmSCyDdp+h//FqxpdA2C0IFr2h6AmXy/dxnRSOlq9lxck4vL7xwm+hN2NTe9DRr16F8LQz6l5BWe4V6kb4zlBaGtLou/USA/Kq+LIYxokdjBI7SL11nvts4EL1RvKrlpH5YA7zjsUx8/BoGnv2o4NfczR1pWiT8CXUmqPmnXsxKHYCo1I3MHBHEUPznjG4EMZcBT+xg6Tr57lBEudrfiSvPIl996aTfDaK3tOjkFp709i9NZaNtbtNxheRdeYX1B37oPsigk5xqaSVJrDnz1WEFt1n5DlxRJcgpLCS+LOFLCg4StaDuey5OY2NJSF8YpiK7DoUdTMXVBpNrkn5InKdugVaVw/MB4XTLT6JnXfDyX46mb0PV2I4V0qg2MnXBeCdCwP3PGRzcTwZt8MwHJyJbkg8dboPRWnWFklWZ5mUL6HWZmraumHuFcxHUxax9txE0m9HcOB+GOuubGbMSXEX+dWMzK2k394KkgqWkn5zHIb90diNnoe2h48o0E4UUNaajK/wrZlTB/Sfj8F63FJ81i9l08Xx4lkGEns6mxG/gv/xSnxznzPk4FNWnZ1FarE/wdti6RjxPUrXkSgNW9X+yf5G3au0UNVv+Ej32QgsR8fRes4uVhV8RXJRFH45Dxglnqx/XiUjj1XS/2A1c/MXsPBkCK2m7cDGJxp1lyHIdetfFR5bo+51yPJCdVt39N6ROEQsY/EJfyZnp+GZUc3grHKGHSnH+/AzPPdU4rMri76rN2AZsgndgCkoTt1rVz/NKHozlrLeKk/rPhxb/xkEp0XgujgH1zWX+XTLLdy33xX9HTqlXMEp8RT2U3djGZCApttgJHWdDJFvZtS8HQfZwvaM1t2X9pOjcYhMxnH6DpwTDuGSmIPz/GwcZ2fSKGoLNoGL0PYcjqzWHxB5Nsb0d8NCUjTLFafOzyy9ArEPmE2TCUtoGr6SJqHLsRubQN1+kzBz6PJYHGuMiH+nlb+OlpKijlfZNTohXtg1dcsetxTHDiUqqw+OSiqVQcx/aAx7HZL0N5XJ2TrjYfTUAAAAAElFTkSuQmCC
- false
- 85fefb26-3575-4e7e-a609-3c8ea0d586b6
- false
- true
- Gismo_Create Location
- CreateLocation
-
9332
1313
162
64
-
9428
1345
- 3
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- A name of the location.
-
If nothing added to this input, "unknown location" will be used as default locationName_.
- fc1d989d-1f71-4edf-ae57-0be62978b51c
- locationName_
- locationName_
- true
- 0
- true
- 0
- 37261734-eec7-4f50-b6a8-b8d1f3c4396b
-
9334
1315
79
20
-
9375
1325
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_String
- false
- unknown location
- true
- Location's latitude coordinate.
It ranges from -90 for locations south of equator, to 90 for locations above the equator.
-
If nothing added to this input, "40" will be used as default latitude_.
- 1e3435d4-6223-4d46-89a5-d8dae127e5c2
- latitude_
- latitude_
- true
- 0
- true
- c3a6758a-e9ca-48ed-a938-ba870174bfe8
- 1
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
9334
1335
79
20
-
9375
1345
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_String
- false
- 40
- true
- Location's longitude coordinate.
It ranges from -180 for locations west of Prime Meridian, to 180 for locations east of Prime Meridian.
-
If nothing added to this input, "0" will be used as default longitude_.
- 0c8036fc-accc-4fd6-9817-249e13346326
- longitude_
- longitude_
- true
- 0
- true
- 9040aaba-f616-44e6-80b6-252996d1aec4
- 1
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
9334
1355
79
20
-
9375
1365
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_String
- false
- 0
- Joined string containing information about location's components: locationName, latitude, longitude, timeZone and elevation.
timeZone and elevation are always set to "0" as they do not affect Gismo components.
- 42d83886-87be-4d48-9a47-5dac2333352f
- location
- location
- false
- 0
-
9443
1315
49
60
-
9467.5
1345
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_OSM Shapes
- # OSM shapes
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# with assistance of Paul Meems <bontepaarden@gmail.com>
# Component icon based on free OSM icon from: <https://icons8.com/web-app/13398/osm>
#
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to generate Open Street Map shapes for the chosen _location and radius_.
OSM shapes represent linear or point map elements from openstreetmap.org service - the largest free map online service.
Linear OSM shapes include: buildings footprints, park footprints, roads axes, rivers, lake boundaries, and any other linear map element ...
Point OSM shapes include: trees, bus stations, restaurants, pubs, markets, address plates ...
-
Component requires that you are connected to the Internet, as it has to download osm data.
It also requires MapWinGIS application to be installed in order for it to work. Download the MapWinGIS from:
https://github.com/MapWindow/MapWinGIS/releases
If you are using Rhino 5 x86, then download the "Win32" version.
If you are using Rhino 5 x64, then download the "x64" version.
-
Provided by Gismo 0.0.3
input:
_location: Output from Gismo's \"Create Location\" component. This is essentially a text containing information (latitude, longitude, name...) about a location on the Earth.
radius_: Horizontal distance to which the surrounding terrain will be taken into account.
-
It can not be shorter than 50 meters.
It can not be larger than from 5000 to 27000 meters. This depends on _location's latitude. The higher it is, the closer it is to 5000.
-
The component itself might inform the user to alter the initial radius_ inputted by the user.
This is due to restriction of downloadable OSM data being limited to 0.5 latitude x 0.5 longitude range. If radius_ value for the chosen _location is equal to the mentioned range, or larger than it, the component will inform the user to shrink the radius_ for a certain amount.
-
If not supplied, default value of 100 meters will be used.
-
In meters.
north_: Input a vector to be used as a true North direction, or a number between 0 and 360 that represents the clockwise degrees off from the Y-axis.
-
If not supplied, default North direction will be set to the Y-axis (0 degrees).
origin_: Origin for the final "shapes" output.
-
If not supplied, default point of (0,0,0) will be used.
shapeType_: There are four shape geometry types:
-
0 - polygons: anything consisted of closed polygons: buildings, grass areas, forests, lakes, etc
1 - polylines: non closed polylines as: streets, roads, highways, rivers, canals, train tracks ...
2 - points: any point features, like:
Trees, building entrances, junctions between roads ...
Store locations: restaurants, bars, pharmacies, post offices ...
-
If nothing supplied, 0 will be used as a default value (polygons).
requiredKeys_: A list of specific OpenStreetMap keys that you would like to use for each "shapeType_" input.
-
There are thousands of OpenStreetMap keys describing various map elements. You can find them listed in here: www.taginfo.openstreetmap.org/keys
-
However due to their enormous number it is suggested that you use the "OSM keys" component, which will automatically generate specific keys for specific object type.
Either that, or simply leave this input empty. It that way the component will take only those keys which are attached to all shapeType_ shapes.
-
If not supplied, only those keys that appear at that particular "location_" and "radius_" will be used.
onlyRemove_Ids_: Use this input to define lists of Open Street Map ids. "OSM ids" component will generate them.
-
These lists can be used to define:
1) only those ids which will be included (isolated) when "OSM shapes" component is ran (use "osm_id_Only" and "osm_way_id_Only" inputs for this).
2) ids which will be removed when "OSM shapes" component is ran (use "osm_id_Remove" and "osm_way_id_Remove" inputs for this).
3) you can combine 1) and 2) and both define the: included and removed ids.
-
If nothing supplied to this input, then no OSM ids will be isolated nor removed: meaning all of them will be included.
bakeIt_: Set to "True" to bake the shapes geometry into the Rhino scene.
-
If not supplied default value "False" will be used.
_runIt: ...
output:
readMe!: ...
shapes: Geometry of each shape.
-
Depening on the shapeType_ input this can be either a polygon (shapeType_ = 0), a polyline (shapeType_ = 1) or a point (shapeType_ = 2)
keys: Each upper shape contains certain information (keys) attached to it (example: address, type of the building, area etc.).
This output lists the available keys for all the shapes, or
in case some specific keys have been supplied to the "requiredKeys_" output, then they will be listed here.
values: Each upper shape contains a value which corresponds to a certain key (example: "key=addr_stree; value=Second Avenue 14/2", "key=building; value=yes", "key:area; value=100" etc.)
This ouput lists all values corresponding to each key, for each shape.
titleOriginPt: Title base point, which can be used to move the "title" geometry with grasshopper's "Move" component.
-
Connect this output to a Grasshopper's "Point" parameter in order to preview the point in the Rhino scene.
title: Title geometry with information about location, radius, north angle and shapeType.
"""
ghenv.Component.Name = "Gismo_OSM Shapes"
ghenv.Component.NickName = "OSMshapes"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "1 | OpenStreetMap"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "1"
except: pass
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Grasshopper
import System
import shutil
import Rhino
import math
import time
import clr
import os
import gc
def checkInputData(radiusM, north, originPt, shapeType, requiredKeys, onlyRemove_Ids):
# check if MapWinGIS is properly installed
gismoGismoComponentNotRan = False # initial value
if sc.sticky.has_key("gismo_mapwingisFolder"):
mapFolder_ = sc.sticky["gismo_mapwingisFolder"]
iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg = gismo_mainComponent.mapWinGIS(mapFolder_)
if not validInputData:
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
if sc.sticky.has_key("MapWinGIS"):
global MapWinGIS
import MapWinGIS
else:
gismoGismoComponentNotRan = True
else:
gismoGismoComponentNotRan = True
if (gismoGismoComponentNotRan == True):
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "The \"Gismo Gismo\" component has not been run. Run it before running this component."
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
# check inputs
if (radiusM == None):
radiusM = 100 # default in meters
elif (radiusM < 50): # values of 10 or 20 meters can download an invalid .osm file from http://api.openstreetmap.org
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "radius_ input only supports values equal or larger than 50 meters."
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
#arcAngleD = math.degrees( math.atan( radiusM / (6371000+elevation) ) ) # assumption of Earth being a sphere
#arcLength = (arcAngleD*math.pi*R)/180
# correction of radiusM length due to light refraction can not be calculated, so it is assumed that arcLength = radiusM. radiusM variable will be used from now on instead of arcLength.
if (north == None):
northRad = 0 # default, in radians
northVec = Rhino.Geometry.Vector3d(0,1,0)
else:
try: # check if it's a number
north = float(north)
if north < 0 or north > 360:
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "Please input north angle value from 0 to 360."
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
except Exception, e: # check if it's a vector
north.Unitize()
northRad, northVec = gismo_preparation.angle2northClockwise(north)
northVec.Unitize()
northDeg = int(360-math.degrees(northRad))
if northDeg == 360: northDeg = 0
if (originPt == None):
originPt = Rhino.Geometry.Point3d(0,0,0)
# send the origin of this component ("OSM shapes") to sc.sticky, in order for it be used in the "OSM 3D" and "OSM search" components
sc.sticky["gismo_OSMshapesComp_origin"] = originPt
if (len(requiredKeys) == 0):
requiredKeys = []
elif (len(requiredKeys) > 250):
# .dbf files require maximal number of fields to be 255 (254 if one of the fields contains None values)
# source: https://msdn.microsoft.com/en-us/library/3kfd3hw9
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "requiredKeys_ input accepts maximum 250 keys.\n" + \
"You inputted %s keys. Remove some of them." % len(requiredKeys)
requiredKeys = None # set in here so that it can be printed in the printMsg
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
if (shapeType == None):
shapeType = 0 # polygons
shapeTypeLabel = "polygons"
elif (shapeType == 0):
shapeTypeLabel = "polygons"
elif (shapeType == 1):
shapeTypeLabel = "polylines"
elif (shapeType == 2):
shapeTypeLabel = "points"
elif (shapeType < 0) or (shapeType > 2):
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "shapeType_ input can not be smaller than 0, nor larger than 2.\n" + \
"Please input some of the following values:\n" + \
"0 (polygons)\n" + \
"1 (polylines)\n" + \
"2 (points)."
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
if (onlyRemove_Ids.BranchCount == 1) and (onlyRemove_Ids.Branches[0][0] == None):
# in "OSM ids" component, an id exists both in "osm_id_Only_" and "osm_id_Remove_" inputs, or an id exists both in "osm_way_id_Only_" and "osm_way_id_Remove_" inputs
radiusM = northRad = northDeg = originPt = requiredKeys = shapeType = shapeTypeLabel = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = iteropMapWinGIS_dll_folderPath = unitConversionFactor = None
validInputData = False
printMsg = "Your \"_onlyRemove_Ids\" input is invalid. Check the \"readMe!\" output of \"OSM ids\" component to see what's wrong with it."
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
elif (onlyRemove_Ids.BranchCount == 0):
# nothing inputted to "OSM ids" component's four inputs
osm_id_Only = []; osm_way_id_Only = []; osm_id_Remove = []; osm_way_id_Remove = []
else:
# something inputted to at least one input of "OSM ids" component
onlyRemove_IdsLL = onlyRemove_Ids.Branches
osm_id_Only = list(onlyRemove_IdsLL[0])
osm_way_id_Only = list(onlyRemove_IdsLL[1])
osm_id_Remove = list(onlyRemove_IdsLL[2])
osm_way_id_Remove = list(onlyRemove_IdsLL[3])
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
validInputData = True
printMsg = "ok"
return radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg
def setupOsmconf_ini_File(requiredKeys, shapeType, overpassFile_filePathL, osmconf_ini_filePath):
# identify unique keys from overpassFile_filePathL files
if (len(requiredKeys) == 0):
# nothing supplied to "requiredKeys_" input. Use the keys provided in the .osm file
fullName_keysL = []
for overpassFile_filePath in overpassFile_filePathL:
requiredKeys = []
# open the overpassFile files (4 of them) one by one
with open(overpassFile_filePath) as overpassFile:
foundTags = False
lines = overpassFile.readlines()
for line in lines:
if "tags" in line:
# " "tags": {" line found
foundTags = True
continue # start extracting the tags below it
if (foundTags == True) and ("}" not in line):
strippedLine = line.strip()
splittedLine = strippedLine.split(": ")
fieldName = splittedLine[0].replace("\"", "")
requiredKeys.append(fieldName)
else:
foundTags = False
foundTags = False
overpassFile.close()
del lines; del overpassFile
#print "requiredKeys: ", requiredKeys
requiredKeysSet = set(requiredKeys)
uniqueKeys = list(requiredKeysSet)
uniqueKeys.sort() # sort the keys alphabetically
fullName_keysL.append(uniqueKeys)
elif (len(requiredKeys) != 0):
# something supplied to "requiredKeys_" input. Use those keys
fullName_keysL = [requiredKeys, requiredKeys, requiredKeys, requiredKeys, requiredKeys] # polygons, points, polylines, polylines2, irrelevant
# create lines for the new osmconf.ini file by inserting the fullName_keysL to each section ([points], [lines], [multipolygons], [multilinestrings], [other_relations])
osmconf_ini_newFileLines = []
points_tagPassed = False; lines_tagPassed = False; multipolygons_tagPassed = False; multilinestrings_tagPassed = False; other_relations_tagPassed = False # initial values
# open the current "osmconf.ini" file and iterate through its lines in order to create the new "osmconf.ini" file
with open(osmconf_ini_filePath) as osmconf_ini_File:
lines = osmconf_ini_File.readlines()
for line in lines:
# setting keys are considered to be polygons. This puts all shapes with these keys into the multipolygons.shp file. Otherwise (their key is not listed in this line) if they are closed ways, they will be put into the lines.shp file
if line.startswith("closed_ways_are_polygons="):
line = "closed_ways_are_polygons=aeroway,amenity,boundary,building,building:levels,building:part,craft,geological,historic,landuse,leisure,military,natural,office,place,shop,sport,tourism\n"
# checking for switches
if (line == "[points]\n"):
points_tagPassed = True
elif (line == "[lines]\n"):
lines_tagPassed = True
elif (line == "[multipolygons]\n"):
multipolygons_tagPassed = True
elif (line == "[multilinestrings]\n"):
multilinestrings_tagPassed = True
elif (line == "[other_relations]\n"):
other_relations_tagPassed = True
# set "other_tags" and "all_tags" to "no"
if (line == "#other_tags=no\n") or (line == "#other_tags=yes\n") or (line == "other_tags=yes\n"):
line = "other_tags=no\n"
if (line == "#all_tags=no\n") or (line == "#all_tags=yes\n") or (line == "all_tags=yes\n"):
line = "all_tags=no\n"
# set "attribute_name_laundering" to "no" (do not change ":" to "_" in key names)
if (line == "#attribute_name_laundering=yes\n") or (line == "attribute_name_laundering=no\n") or (line == "attribute_name_laundering=yes\n"):
line = "#attribute_name_laundering=no\n"
# comment-out certain 3 lines to remove the "z_order" key from [lines].
if line.startswith("computed_attributes="):
line = "#" + line
if line.startswith("z_order_type="):
line = "#" + line
if line.startswith("z_order_sql="):
line = "#" + line
if (points_tagPassed == True) and (lines_tagPassed == False) and (multipolygons_tagPassed == False) and (multilinestrings_tagPassed == False) and (other_relations_tagPassed == False):
if line.startswith("attributes="):
line = "attributes="
for index, key in enumerate(fullName_keysL[2]): # [points] (points) keys
if index != len(fullName_keysL[2])-1:
line = line + key + ","
else:
# last key in fullName_keysL[1]
line = line + key + "\n"
elif (points_tagPassed == True) and (lines_tagPassed == True) and (multipolygons_tagPassed == False) and (multilinestrings_tagPassed == False) and (other_relations_tagPassed == False):
if line.startswith("attributes="):
line = "attributes="
for index, key in enumerate(fullName_keysL[1]): # [lines] (polylines) keys
if index != len(fullName_keysL[1])-1:
line = line + key + ","
else:
# last key in fullName_keysL[2]
line = line + key + "\n"
elif (points_tagPassed == True) and (lines_tagPassed == True) and (multipolygons_tagPassed == True) and (multilinestrings_tagPassed == False) and (other_relations_tagPassed == False):
if line.startswith("attributes="):
line = "attributes="
for index, key in enumerate(fullName_keysL[0]): # [multipolygons] (polygons) keys
if index != len(fullName_keysL[0])-1:
line = line + key + ","
else:
# last key in fullName_keysL[0]
line = line + key + "\n"
elif (points_tagPassed == True) and (lines_tagPassed == True) and (multipolygons_tagPassed == True) and (multilinestrings_tagPassed == True) and (other_relations_tagPassed == False):
if line.startswith("attributes="):
line = "attributes="
for index, key in enumerate(fullName_keysL[3]): # [multilinestrings] (polylines2) keys
if index != len(fullName_keysL[3])-1:
line = line + key + ","
else:
# last key in fullName_keysL[3]
line = line + key + "\n"
elif (points_tagPassed == True) and (lines_tagPassed == True) and (multipolygons_tagPassed == True) and (multilinestrings_tagPassed == True) and (other_relations_tagPassed == True):
if line.startswith("attributes="):
line = "attributes="
for index, key in enumerate(fullName_keysL[4]): # [other_relations] keys
if index != len(fullName_keysL[4])-1:
line = line + key + ","
else:
# last key in fullName_keysL[4]
line = line + key + "\n"
osmconf_ini_newFileLines.append(line)
points_tagPassed = False; lines_tagPassed = False; multipolygons_tagPassed = False; multilinestrings_tagPassed = False; other_relations_tagPassed = False # setting them back to "False" values
osmconf_ini_File.close()
os.remove(osmconf_ini_filePath) # delete the original "osmconf.ini" file
# create the new osmconf.ini file
new_osmconf_ini_FilePath = osmconf_ini_filePath
with open(new_osmconf_ini_FilePath, "w") as new_osmconf_ini_File:
for line in osmconf_ini_newFileLines:
new_osmconf_ini_File.write(line)
new_osmconf_ini_File.close()
# deleting
del lines
del osmconf_ini_File
del new_osmconf_ini_File
del osmconf_ini_newFileLines
# return fullName_keysL (unlike those from the shapefiles ("shortenedName_keys") these are not limited to 10 characters and do not have ":" replaced with "_")
if shapeType == 0:
return ["osm_id", "osm_way_id"] + fullName_keysL[shapeType]
else:
return ["osm_id"] + fullName_keysL[shapeType]
def checkOsmShpFiles(locationLatitudeD, locationLongitudeD, fileNameIncomplete, radiusM, requiredKeys, shapeType):
latitudeTopD, longitudeTopD, latitudeBottomD, longitudeBottomD, latitudeLeftD, longitudeLeftD, latitudeRightD, longitudeRightD = gismo_gis.destinationLatLon(locationLatitudeD, locationLongitudeD, radiusM)
# check if osm region is 0.5x0.5 degrees
validRadiusM = True # initial value
if ((latitudeTopD - latitudeBottomD) >= 0.5):
validRadiusM = False
latitude2D = locationLatitudeD - 0.24 # 0.24 is 0.25*2 (0.25 from both sides of the _location) - 0.01 (for safety)
longitude2D = locationLongitudeD
distanceM = gismo_gis.distanceBetweenTwoPoints(locationLatitudeD, locationLongitudeD, latitude2D, longitude2D)
correctedRadiusM_for_latitude = int(distanceM) # int(distanceM) will always perform the math.floor(distanceM)
if ((longitudeRightD - longitudeLeftD) >= 0.5):
validRadiusM = False
latitude2D = locationLatitudeD
longitude2D = locationLongitudeD - 0.24 # 0.24 is 0.25*2 (0.25 from both sides of the _location) - 0.01 (for safety)
distanceM = gismo_gis.distanceBetweenTwoPoints(locationLatitudeD, locationLongitudeD, latitude2D, longitude2D)
correctedRadiusM_for_longitude = int(distanceM) # int(distanceM) will always perform the math.floor(distanceM)
if (validRadiusM == False):
#print "correctedRadiusM_for_latitude, correctedRadiusM_for_longitude: ", correctedRadiusM_for_latitude, ",", correctedRadiusM_for_longitude
shapeFile_filePath = fullName_keys = None
printMsg = "This component downloads map data from openstreetmap.org in order to create the shapes for the chosen _location.\n" + \
"But mentioned openstreetmap.org download data has limits: the radius can not be longer than 0.25 degrees of latitude and longitude.\n" + \
"This is why the inputted radius_ value, needs to be shrank.\n" + \
" \n" + \
"Please supply the \"radius_\" input with the value not larger than: %s.\n" % min(correctedRadiusM_for_latitude, correctedRadiusM_for_longitude) # always choose the smallest corrected radius
return shapeFile_filePath, fullName_keys, validRadiusM, printMsg
# create "gismoFolder_\osm_files" folder
# always use the "gismoFolder_" input of Gismo_Gismo component + "\osm_files" as the working folder for downloaded .osm files and converted shapefiles
gismoFolder = sc.sticky["gismo_gismoFolder"] # "gismoFolder_" input of Gismo_Gismo component
osm_files_folderPath = os.path.join(gismoFolder, "osm_files")
if not os.path.isdir(osm_files_folderPath):
os.mkdir(osm_files_folderPath)
# fileNames
fileName = fileNameIncomplete + "_radius=" + str(round(radiusM/1000, 2)) + "KM"
osm_shp_file_folderPath = os.path.join(osm_files_folderPath, fileName)
if not os.path.isdir(osm_shp_file_folderPath):
os.mkdir(osm_shp_file_folderPath)
osmFile_filePath = os.path.join(osm_shp_file_folderPath, fileName + ".osm")
osmconf_ini_filePath = os.path.join(iteropMapWinGIS_dll_folderPath, "gdal-data\\osmconf.ini") # for MapWinGIS
osmconf_ini_present = os.path.isfile(osmconf_ini_filePath)
if osmconf_ini_present == False:
osmconf_ini_filePath = os.path.join(iteropMapWinGIS_dll_folderPath, "MapWinGIS\\gdal-data\\osmconf.ini") # for Map Window GIS Light
overpassFile_nodeTags_filePath = os.path.join(osm_shp_file_folderPath, fileName + "_nodeTags" + ".txt")
overpassFile_wayTags_filePath = os.path.join(osm_shp_file_folderPath, fileName + "_wayTags" + ".txt")
overpassFile_filePathL = [overpassFile_wayTags_filePath, overpassFile_wayTags_filePath, overpassFile_nodeTags_filePath, overpassFile_wayTags_filePath, overpassFile_wayTags_filePath] # [ [multipolygons] (polygons) keys, [lines] (polylines) key, [points] (points) key, [multilinestrings] (we use polylines again) key, [other_relations] (we use polylines again) keys ]
shpMultipolygonsFile_filePath = os.path.join(osm_shp_file_folderPath, "multipolygons" + ".shp")
shpLinesFile_filePath = os.path.join(osm_shp_file_folderPath, "lines" + ".shp")
shpPointsFile_filePath = os.path.join(osm_shp_file_folderPath, "points" + ".shp")
shpMultilinestringsFile_filePath = os.path.join(osm_shp_file_folderPath, "multilinestrings" + ".shp")
# check internet connection
connectedToInternet = gismo_preparation.checkInternetConnection()
# always delete the .shp/.shx/.dbg/.prj files, whenever the "OSM Shapes" component is run
files = os.listdir(osm_shp_file_folderPath)
for fileNameWithExtension in files:
fileExtension = fileNameWithExtension[-4:]
if (fileExtension != ".osm") and (fileExtension != ".txt"): # delete only .shp/.shx/.dbf/.prj files
filePath = os.path.join(osm_shp_file_folderPath, fileNameWithExtension)
os.remove(filePath)
if len(requiredKeys) != 0:
# something supplied to the "requiredKeys_" input, use those keys for the osmconf.ini file
pass
else:
# nothing supplied to the "requiredKeys_" input
# 2) check if overpassNodeTags....txt, overpassWayTags....txt, overpassRelationTags....txt files exist in "osm_files\osm_shp_file_folderPath\" folder
if os.path.isfile(overpassFile_nodeTags_filePath) and os.path.isfile(overpassFile_wayTags_filePath):
# 2) overpassNodeTags....txt, overpassWayTags....txt, overpassRelationTags....txt files EXIST in "osm_files\osm_shp_file_folderPath\" folder. Extract the "requiredKeys" from them
requiredKeys = []
else:
# overpassNodeTags....txt, overpassWayTags....txt, overpassRelationTags....txt files DO NOT exist in "osm_files\osm_shp_file_folderPath\" folder
downloadOverpassNodeFile_link = "http://overpass-api.de/api/interpreter?data=[out:json];node[~\".\"~\".\"](%s,%s,%s,%s);out;" % (latitudeBottomD, longitudeLeftD, latitudeTopD, longitudeRightD)
downloadOverpassWayFile_link = "http://overpass-api.de/api/interpreter?data=[out:json];way[~\".\"~\".\"](%s,%s,%s,%s);out;" % (latitudeBottomD, longitudeLeftD, latitudeTopD, longitudeRightD)
overpassNodeFileDownloaded = gismo_preparation.downloadFile(downloadOverpassNodeFile_link, overpassFile_nodeTags_filePath)
overpassWayFileDownloaded = gismo_preparation.downloadFile(downloadOverpassWayFile_link, overpassFile_wayTags_filePath)
if (overpassNodeFileDownloaded == True) and (overpassWayFileDownloaded == True):
# overpassNodeTags....txt, overpassWayTags....txt, overpassRelationTags....txt files SUCCESSFULLY DOWNLOADED in "osm_files\osm_shp_file_folderPath\" folder. Extract the "requiredKeys" from them
requiredKeys = []
else:
# one of the overpass .txt files has NOT BEEN DOWNLOADED. Use default requiredKeys:
requiredKeys = ["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"height",
"building:levels",
"min_height",
"building",
"natural",
"leaf_type",
"leaf_cycle",
"diameter_crown"]
if connectedToInternet == True:
print "Component failed to retrieve keys from the .osm file.\n" + \
"The following default list of keys will be used instead:\n" + \
"%s\n" % requiredKeys + \
" \n" + \
"You can also define your own keys through \"requiredKeys_\" input."
elif connectedToInternet == False:
print "This component requires internet access in order to retrieve the keys from the .osm file.\n" + \
"As there's no internet access, default list of keys will be used instead:\n" + \
"%s\n" % requiredKeys + \
" \n" + \
"You can also define your own keys through \"requiredKeys_\" input."
fullName_keys = setupOsmconf_ini_File(requiredKeys, shapeType, overpassFile_filePathL, osmconf_ini_filePath)
# 1) check if lines.shp, multilinestrings....shp, multipolygons....shp, points....shp files exist in "osm_files\osm_shp_file_folderPath\" folder
if os.path.isfile(shpMultipolygonsFile_filePath) and os.path.isfile(shpLinesFile_filePath) and os.path.isfile(shpPointsFile_filePath) and os.path.isfile(shpMultilinestringsFile_filePath):
#print "_1_SHP files exist!"
# lines.shp, multilinestrings.shp, multipolygons.shp, points.shp files EXIST in "osm_files\osm_shp_file_folderPath\" folder. Disregard the .osm file
valid_osm_or_shp_files = True
osmToShpSwitch = False # dummy value
printMsg = "ok"
else:
#print "_1_SHP files DO NOT exist"
# lines.shp, multilinestrings.shp, multipolygons.shp, points.shp files do NOT exist in "osm_files\osm_shp_file_folderPath\" folder
# check if .osm file exists in "osm_files\osm_shp_file_folderPath\" folder
if os.path.isfile(osmFile_filePath):
####print "_2_OSM files exist!"
# the .osm file exists. Convert it to 4 .shp files
osmToShpSwitch = True
else:
####print "_2_OSM file DOES NOT exist"
# the .osm file does NOT exist. Download it first
if connectedToInternet == False:
# you are NOT connected to the Internet, exit this function
shpLinesFile_filePath = shpMultilinestringsFile_filePath = shpMultipolygonsFile_filePath = shpPointsFile_filePath = None
valid_osm_or_shp_files = osmToShpSwitch = False
printMsg = "This component requires you to be connected to the Internet, in order to download the OSM shape data.\n" + \
"Please do connect, then rerun the component (set \"_runIt\" to False, then to True)."
elif connectedToInternet == True:
# you ARE connected to the Internet
# download .osm file
# based on: http://wiki.openstreetmap.org/wiki/Downloading_data
downloadOSMfile_link = "http://overpass-api.de/api/map?bbox=%s,%s,%s,%s" % (longitudeLeftD,latitudeBottomD,longitudeRightD,latitudeTopD)
osmFileDownloaded = gismo_preparation.downloadFile(downloadOSMfile_link, osmFile_filePath)
if osmFileDownloaded == False:
# .osm file has NOT been downloaded
shpLinesFile_filePath = shpMultilinestringsFile_filePath = shpMultipolygonsFile_filePath = shpPointsFile_filePath = None
valid_osm_or_shp_files = osmToShpSwitch = False
printMsg = "This component requires OSM data to be downloaded from openstreetmap.org. It has just failed to do that. Try the following two fixes:\n" + \
" \n" + \
"1) Sometimes due to large number of requests, the component fails to download the OSM data even if openstreetmap.org website and their services are up and running.\n" + \
"In this case, wait a couple of seconds and try rerunning the component.\n" + \
" \n" + \
"2) Try lowering the \"radius_\" input.\n" + \
" \n" + \
"If each of two mentioned advices fails, open a new topic about this issue on: www.grasshopper3d.com/group/gismo/forum."
elif osmFileDownloaded == True:
####print "_OSM successfully downloaded!!!"
# .osm file has been downloaded. Convert it to 4 .shp files
osmToShpSwitch = True
if osmToShpSwitch == True:
# .osm file exists or has been downloaded. Convert it to 4 .shp files
utils = MapWinGIS.UtilsClass()
bstrOptions = '--config OSM_USE_CUSTOM_INDEXING NO -skipfailures -f "ESRI Shapefile"'
convertToShapefilesResult = MapWinGIS.UtilsClass.OGR2OGR(utils, osmFile_filePath, osm_shp_file_folderPath, bstrOptions, None)
if convertToShapefilesResult == False:
# converting an .osm file to a .shp file failed. Possible "HTTP" error
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
print "utils.ErrorMsg: ", utils.ErrorMsg
print "utils.LastErrorCode: ", utils.LastErrorCode
del utils
del convertToShapefilesResult
shpLinesFile_filePath = shpMultilinestringsFile_filePath = shpMultipolygonsFile_filePath = shpPointsFile_filePath = None
valid_osm_or_shp_files = False
printMsg = "An error:\n" + \
" \n" + \
"%s\n" % convertErrorMsg + \
" \n" + \
"emerged while processing the OSM shape data.\n" + \
"Restart Rhino and Grasshopper (close them, then run again) and run this component again.\n" + \
"If this same message appears again open a new topic about it on: www.grasshopper3d.com/group/gismo/forum."
else:
# converting an .osm file to a .shp file SUCCESSFUL
del utils
valid_osm_or_shp_files = True
printMsg = "ok"
if shapeType == 0:
shapeFile_filePath = shpMultipolygonsFile_filePath
elif shapeType == 1:
shapeFile_filePath = shpLinesFile_filePath
elif shapeType == 2:
shapeFile_filePath = shpPointsFile_filePath
elif shapeType == 3:
shapeFile_filePath = shpMultilinestringsFile_filePath
return shapeFile_filePath, fullName_keys, valid_osm_or_shp_files, printMsg
def createShapesKeysValues(locationName, locationLatitudeD, locationLongitudeD, shapeFile_filePath, northRad, originPt, shapeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, unitConversionFactor):
# this is the "main" function. It extracts shapes from the .shp file
outputCRS = gismo_gis.UTM_CRS_from_latitude(locationLatitudeD, locationLongitudeD)
# fix invalid shapes, overlapping shape issues, shape vertices direction ...
shapefile = MapWinGIS.ShapefileClass()
openShapefileSuccess = MapWinGIS.ShapefileClass.Open(shapefile, shapeFile_filePath, None)
if openShapefileSuccess:
numOfsuccessfullyReprojectedShapes = clr.StrongBox[System.Int32]()
shapefileFixedSuccess, fixedShapefile = MapWinGIS.ShapefileClass.FixUpShapes(shapefile) # fails on MapWinGIS 4.9.4.2. Does not fail on Map Window Lite 32x
if shapefileFixedSuccess:
# shape file has been fixed
reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(shapefile, outputCRS, numOfsuccessfullyReprojectedShapes)
#reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(fixedShapefile, outputCRS, numOfsuccessfullyReprojectedShapes)
else:
# shapefile has NOT been fixed. Use the initial shapefile
reprojectedShapefile = MapWinGIS.ShapefileClass.Reproject(shapefile, outputCRS, numOfsuccessfullyReprojectedShapes)
"""
# testing fixing of shapes
print "numOfsuccessfullyReprojectedShapes: ", numOfsuccessfullyReprojectedShapes
print "reprojectedShapefile: ", reprojectedShapefile
# testing MapWinGIS.ShapefileClass.FixUpShapes
shapeFile_filePath_saved = shapeFile_filePath[:-4] + "_saved_" + str(int(time.time())) + ".shp"
print "shapeFile_filePath_saved: ", shapeFile_filePath_saved
#success = MapWinGIS.ShapefileClass.SaveAs(reprojectedShapefile, shapeFile_filePath_saved, None)
#print "success: ", success
"""
if reprojectedShapefile == None:
# reprojection failed
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
reprojectErrorMsg = MapWinGIS.GlobalSettingsClass().GdalReprojectionErrorMsg
print "numOfsuccessfullyReprojectedShapes: ", numOfsuccessfullyReprojectedShapes
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
print "reprojectErrorMsg: ", reprojectErrorMsg
print "utils.ErrorMsg: ", utils.ErrorMsg
print "utils.LastErrorCode: ", utils.LastErrorCode
reprojectionError = fixedShapefile.ErrorMsg(fixedShapefile.LastErrorCode)
shpLinesFile_filePath = shpMultilinestringsFile_filePath = shpMultipolygonsFile_filePath = shpPointsFile_filePath = None
validShapes = False
printMsg = "The following error emerged while processing the data:\n" + \
" \n" + \
"\"%s\"\n" % reprojectionError + \
"numOfsuccessfullyReprojectedShapes: %s\n" % numOfsuccessfullyReprojectedShapes + \
" \n" + \
"Restart Rhino and Grasshopper (close them, then run again) and run this component again.\n" + \
"If this same message appears again open a new topic about it on: www.grasshopper3d.com/group/gismo/forum."
originPtProjected_meters = gismo_gis.projectedLocationCoordinates(locationLatitudeD, locationLongitudeD) # in meters!
originPtProjected = Rhino.Geometry.Point3d(originPtProjected_meters.X/unitConversionFactor, originPtProjected_meters.Y/unitConversionFactor, originPtProjected_meters.Z/unitConversionFactor) # in Rhino units
# rotation due to north angle position
#transformMatrixRotate = Rhino.Geometry.Transform.Rotation(-northRad, Rhino.Geometry.Vector3d(0,0,1), originPt) # counter-clockwise
transformMatrixRotate = Rhino.Geometry.Transform.Rotation(northRad, Rhino.Geometry.Vector3d(0,0,1), originPt) # clockwise
# open reprojectedShapefile
# loop through shortenedName_keys (these are shapefile fields (":" is replaced with "_" and maximal size is 10 characters))
shortenedName_keys = []
for i in range(reprojectedShapefile.NumFields):
field = reprojectedShapefile.Field(i)
shortenedName_keys.append(field.Name)
values = Grasshopper.DataTree[object]()
shapes = Grasshopper.DataTree[object]()
for i in range(reprojectedShapefile.NumShapes):
shape = reprojectedShapefile.Shape[i]
moveVector = originPt - originPtProjected
if (shape.ShapeType == 0): # NULL_SHAPE
# ShapeType: NULL_SHAPE
# values
subValuesL = []
for g in range(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
subValuesL.append(value)
values.AddRange(subValuesL, Grasshopper.Kernel.Data.GH_Path(i))
# pts
ptsPerShape = [None]
shapes.AddRange(ptsPerShape, Grasshopper.Kernel.Data.GH_Path(i))
if (shape.ShapeType == 1): # SHP_POINT
# ShapeType: POINT
# values
subValuesL = []
for g in range(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
if value == "yes": value = True # for example: "building=yes"
subValuesL.append(value)
# pts
ptsPerShape = []
for k in range(shape.numPoints):
pt = shape.Point[k]
point3dProjected = Rhino.Geometry.Point3d(pt.x/unitConversionFactor, pt.y/unitConversionFactor, pt.z/unitConversionFactor)
point3dMoved = point3dProjected + moveVector
transformBoolSuccess = point3dMoved.Transform(transformMatrixRotate)
ptsPerShape.append(point3dMoved)
subValuesL_filtered, ptsPerShape_filtered = gismo_gis.filterShapes(shortenedName_keys, subValuesL, ptsPerShape, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
values.AddRange(subValuesL_filtered, Grasshopper.Kernel.Data.GH_Path(i))
shapes.AddRange(ptsPerShape_filtered, Grasshopper.Kernel.Data.GH_Path(i))
del ptsPerShape
if (shape.ShapeType == 3) or (shape.ShapeType == 5): # POLYLINE and
# ShapeType: POLYLINE OR POLYGON
for n in range(shape.NumParts):
# values
subValuesL = []
for g in range(reprojectedShapefile.NumFields):
value = reprojectedShapefile.CellValue(g,i)
if value == "yes": value = True # for example: "building=yes"
subValuesL.append(value)
# points
ptsPerPart = []
subShape = shape.PartAsShape(n)
for k in range(subShape.numPoints):
pt = subShape.Point[k]
point3dProjected = Rhino.Geometry.Point3d(pt.x/unitConversionFactor, pt.y/unitConversionFactor, pt.z/unitConversionFactor) # in Rhino document units
point3dMoved = point3dProjected + moveVector
transformBoolSuccess = point3dMoved.Transform(transformMatrixRotate)
ptsPerPart.append(point3dMoved)
polyline = Rhino.Geometry.Polyline(ptsPerPart)
subValuesL_filtered, shapesL_filtered = gismo_gis.filterShapes(shortenedName_keys, subValuesL, [polyline], osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
values.AddRange(subValuesL_filtered, Grasshopper.Kernel.Data.GH_Path(i,n))
shapes.AddRange(shapesL_filtered, Grasshopper.Kernel.Data.GH_Path(i,n))
del subValuesL
del ptsPerPart
del polyline
del subValuesL_filtered
del shapesL_filtered
subShape = None
shapefile.Close() # naknadno dodat - proveriti da li pravi neke probleme
fixedShapefile.Close()
reprojectedShapefile.Close()
if (shapes.DataCount == 0) and (onlyRemove_Ids_.DataCount == 0):
# no data was added to the "shapes" list, AND nothing has been added to "onlyRemove_Ids_" input.
# this may happen when there is literally no geometry generated inside the specific .shp file for the chosen "shapeType_" input (you have shapeType_ = 2 in a place where there are no points on openstreetmap.org)
if shapeType_ == 0: shapeTypeLabel = "polygons"
elif shapeType_ == 1: shapeTypeLabel = "polylines"
elif shapeType_ == 2: shapeTypeLabel = "points"
shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "No %s geometry exist for that location/radius/shapeType.\n" % shapeTypeLabel + \
"Either change the \"_location\" input, or increase the \"radius_\" input, or change the \"shapeType_\" input."
return shortenedName_keys, values, shapes, validShapes, printMsg
elif (shapes.DataCount == 0) and (onlyRemove_Ids_.DataCount != 0):
# this may happen if ids supplied to the "osm_id_Only_" and/or "osm_way_id_Only_" inputs of "OSM ids" component can not be found in this _location and/or radius_ (they may correspond to other _location and/or radius_)
shortenedName_keys = values = shapes = None
validShapes = False
printMsg = "The ids you supplied through \"osm_id_Only_\" and/or \"osm_way_id_Only_\" inputs do not exist for this \"_location\" and/or \"radius_\" inputs.\nTry removing the ids from the \"osm_id_Only_\" and/or \"osm_way_id_Only_\" inputs of \"OSM ids\" component."
return shortenedName_keys, values, shapes, validShapes, printMsg
validShapes = True
printMsg = "ok"
return shortenedName_keys, values, shapes, validShapes, printMsg
def titleAndBaking(locationName, locationLatitudeD, locationLongitudeD, radiusM, northDeg, originPt, shapeType, shapeTypeLabel, shapes):
# title
titleLabelText = "OSM shapes for: %s\nLatitude: %s, Longitude: %s\nRadius: %sm, North: %s, GeometryType: %s" % (locationName, locationLatitudeD, locationLongitudeD, radiusM, northDeg, shapeTypeLabel)
customTitle = None # "legendBakePar_" input does not exist
shapesFlattenedList = []
ptcloud = Rhino.Geometry.PointCloud() # use it for shapeType = 2 (because Point3d class does not contain the "GetBoundingBox" method)
for subL in shapes.Branches:
if len(subL) > 0:
for shape in subL:
if shapeType == 2:
# points (shapeType = 2)
ptcloud.Add(shape)
else:
# polygons, polyline (shapeType = 0, 1)
curve = shape.ToNurbsCurve()
shapesFlattenedList.append(curve)
if (shapeType == 2):
titleLabelMesh, titleStartPt, titleTextSize = gismo_preparation.createTitle("mesh", [ptcloud], [titleLabelText])
else:
titleLabelMesh, titleStartPt, titleTextSize = gismo_preparation.createTitle("mesh", shapesFlattenedList, [titleLabelText])
# hide titleOriginPt
ghenv.Component.Params.Output[5].Hidden = True
# baking
if bakeIt_:
layerName = locationName + "_" + str(locationLatitudeD) + "_" + str(locationLongitudeD) + "_RADIUS=" + str(radiusM) + "M" + "_NORTH=" + str(northDeg) + "_SHAPETYPE=" + str(shapeType)
layParentName = "GISMO"; laySubName = "OSM"; layerCategoryName = "SHAPES"
newLayerCategory = False
laySubName_color = System.Drawing.Color.FromArgb(100,191,70) # green
layerColor = System.Drawing.Color.FromArgb(0,0,0) # black
layerIndex, layerName_dummy = gismo_preparation.createLayer(layParentName, laySubName, layerCategoryName, newLayerCategory, layerName, laySubName_color, layerColor)
if (shapeType == 2):
geometryToBakeL = [ptcloud, originPt]
else:
geometryToBakeL = shapesFlattenedList + [originPt]
geometryIds = gismo_preparation.bakeGeometry(geometryToBakeL, layerIndex)
geometryToBakeL2 = [titleLabelMesh]
geometryIds2 = gismo_preparation.bakeGeometry(geometryToBakeL2, layerIndex)
# grouping
groupIndex = gismo_preparation.groupGeometry("OSM_SHAPES" + "_" + layerName + "_shapesOnly", geometryIds)
groupIndex2 = gismo_preparation.groupGeometry("OSM_SHAPES" + "_" + layerName + "_shapesAndTitleOrigin_", geometryIds2)
# deleting
del shapes; del ptcloud; del shapesFlattenedList
return titleLabelMesh, titleStartPt
def printOutput(locationName, locationLatitudeD, locationLongitudeD, radiusM, northDeg, originPt, requiredKeys, shapeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove):
if bakeIt_ == True:
bakedOrNot = "and baked "
elif bakeIt_ == False:
bakedOrNot = ""
resultsCompletedMsg = "OSM shapes component results successfully completed %s!" % bakedOrNot
printOutputMsg = \
"""
Input data:
Location (deg.): %s
Latitude (deg.): %s
Longitude (deg.): %s
North (deg.): %s
Radius (m): %s
Origin: %s
Shape type: %s
Required keys: %s
Only remove Ids: %s, %s, %s, %s
""" % (locationName, locationLatitudeD, locationLongitudeD, northDeg, radiusM, originPt, shapeType, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
print resultsCompletedMsg
print printOutputMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_mainComponent = sc.sticky["gismo_mainComponent"]()
gismo_preparation = sc.sticky["gismo_Preparation"]()
gismo_geometry = sc.sticky["gismo_CreateGeometry"]()
gismo_gis = sc.sticky["gismo_GIS"]()
locationName, locationLatitudeD, locationLongitudeD, timeZone, elevation, validLocationData, printMsg = gismo_preparation.checkLocationData(_location)
if validLocationData:
fileNameIncomplete = locationName + "_" + str(locationLatitudeD) + "_" + str(locationLongitudeD) # incomplete due to missing "_radius=100KM" part
radiusM, northRad, northDeg, originPt, shapeType, shapeTypeLabel, requiredKeys, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, iteropMapWinGIS_dll_folderPath, unitConversionFactor, validInputData, printMsg = checkInputData(radius_, north_, origin_, shapeType_, requiredKeys_, onlyRemove_Ids_)
if validInputData:
if _runIt:
shapeFile_filePath, fullName_keys, valid_osm_or_shp_files, printMsg = checkOsmShpFiles(locationLatitudeD, locationLongitudeD, fileNameIncomplete, radiusM, requiredKeys, shapeType)
if valid_osm_or_shp_files:
shortenedName_keys, values, shapes, validShapes, printMsg = createShapesKeysValues(locationName, locationLatitudeD, locationLongitudeD, shapeFile_filePath, northRad, originPt, shapeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, unitConversionFactor)
#keys = shortenedName_keys
keys = fullName_keys
if validShapes:
validShapefiles, printMsg = gismo_gis.checkIfShapefilesAreValid(keys, values)
if validShapefiles:
title, titleOriginPt = titleAndBaking(locationName, locationLatitudeD, locationLongitudeD, radiusM, northDeg, originPt, shapeType, shapeTypeLabel, shapes)
printOutput(locationName, locationLatitudeD, locationLongitudeD, radiusM, northDeg, originPt, requiredKeys, shapeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
gc.collect()
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print "All inputs are ok. Please set \"_runIt\" to True, in order to run the OSM Shapes component"
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to generate Open Street Map shapes for the chosen _location and radius_.
OSM shapes represent linear or point map elements from openstreetmap.org service - the largest free map online service.
Linear OSM shapes include: buildings footprints, park footprints, roads axes, rivers, lake boundaries, and any other linear map element ...
Point OSM shapes include: trees, bus stations, restaurants, pubs, markets, address plates ...
-
Component requires that you are connected to the Internet, as it has to download osm data.
It also requires MapWinGIS application to be installed in order for it to work. Download the MapWinGIS from:
https://github.com/MapWindow/MapWinGIS/releases
If you are using Rhino 5 x86, then download the "Win32" version.
If you are using Rhino 5 x64, then download the "x64" version.
-
Provided by Gismo 0.0.3
-
-9
-9
-
612
513
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAADG0lEQVRIS72WWUiUURTHFUpNH7TNJXNcMjS30QjF3TBEc0lTUdOcUXMZU6ICjQgsC9sgyw2X0XEhLStoo4cIl4rGNbMyocc2qCfBNkP7d891iHJmmttDHfgz936Xc373nnPu943RfzdjY6MOsxUmM2bmTPSrT3x9+Qxz6WOScGcRM7Mw+XLmdgbqH+SgdkCmVzVMLWoFUvb5g7lNMolBaHcNLHjncwVUTwr1qnlchqF33Rh634GkUl9xCAFohxREOZavVw3DWRh+3Yu5hVkMvm0Uh/wNQP2qB3PznzH77cNSiDMPpsvEAZkYeXMVC9/nGeQTvi58ZOnq5DVhjdKvCadtooCm0RzcnK7ikEfsJJQuqomSFd7MfNmsJpy2iQKUYwVoGpHzk1C66JcKXzuQDYqhCadtWoDx3wO3Lpn/KvIhX8OAfhlv064XxeiaKkb7ZBFaHxfwceeUgs0L+bznZQk6nil+ji9O70UN8zUIaHiYg+p7uxGZ4YWwJHecuJaKltF8JCq2IDRxcU47jc/fjLKWONTdlyOBjcuV8WhS5xkAmJvONA/nITLdE35bnRCevAlBsRuRWxEOZ8+1iEjxQCCbV/amUksijAHLmuP4OEYuhWqiwADAwnSGjukd5IAD9bE4dSsdrlIblFZHwdbREpnlwfwEFd07YeNgiZAEN6QfDMQqWwvE7fFDG0uXQcCFvkXA/rrtqLqeBon7GtQNylFyLgp2TlY8YGVvCjZ4WyMg2hXewQ6QhkmwXe4rBqAa+IY7QnYklOU4Hl5B67GN1YNqQOmwc7ZCOXvu4W+P6GwpXH2sEcFSGZXlIwBgi1SDotORsHWyxDqXlcg6FILD7TsgcVsNFy9rvtOjl5LhEWCPHFabGJmUP4sROgFbpA6hNj15Iw3Hr6TyNmx/WoSzd3bh2OUUfhca1blsPZ291uW8NavvZuE867x61lFCABXrdep3fgc0l4suEoFaxwu4aJ123MY6RzVRyDcldtEIYPBVoS3xm/yvASJfNF0iH/L9M0Dwm6xL5EO+FEMTTtuE/1XoksaHYixGMzL6AUxlkSQyAzFkAAAAAElFTkSuQmCC
- false
- 532028e2-2457-4e5e-86bd-73af17fa5369
- false
- true
- Gismo_OSM Shapes
- OSMshapes
-
9797
1352
193
204
-
9904
1454
- 10
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 6
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- Output from Gismo's \"Create Location\" component. This is essentially a text containing information (latitude, longitude, name...) about a location on the Earth.
- a0eeea6c-61f7-401e-aef6-bec19cc1728f
- _location
- _location
- true
- 0
- true
- 42d83886-87be-4d48-9a47-5dac2333352f
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9799
1354
90
20
-
9845.5
1364
- true
- Horizontal distance to which the surrounding terrain will be taken into account.
-
It can not be shorter than 50 meters.
It can not be larger than from 5000 to 27000 meters. This depends on _location's latitude. The higher it is, the closer it is to 5000.
-
The component itself might inform the user to alter the initial radius_ inputted by the user.
This is due to restriction of downloadable OSM data being limited to 0.5 latitude x 0.5 longitude range. If radius_ value for the chosen _location is equal to the mentioned range, or larger than it, the component will inform the user to shrink the radius_ for a certain amount.
-
If not supplied, default value of 100 meters will be used.
-
In meters.
- 1b672ae2-f2a4-47de-b62c-167a3b6f8f81
- radius_
- radius_
- true
- 0
- true
- 7dd65638-e494-4425-abac-9868383a5d20
- 1
- 48d01794-d3d8-4aef-990e-127168822244
-
9799
1374
90
20
-
9845.5
1384
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 100
- true
- Input a vector to be used as a true North direction, or a number between 0 and 360 that represents the clockwise degrees off from the Y-axis.
-
If not supplied, default North direction will be set to the Y-axis (0 degrees).
- cdfc44d7-dcd6-42fa-ae0d-72bbd61bd25e
- north_
- north_
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9799
1394
90
20
-
9845.5
1404
- true
- Origin for the final "shapes" output.
-
If not supplied, default point of (0,0,0) will be used.
- 16efd8ca-3ffb-4057-94f5-daa5c6194386
- origin_
- origin_
- true
- 0
- true
- 0
- e1937b56-b1da-4c12-8bd8-e34ee81746ef
-
9799
1414
90
20
-
9845.5
1424
- true
- There are four shape geometry types:
-
0 - polygons: anything consisted of closed polygons: buildings, grass areas, forests, lakes, etc
1 - polylines: non closed polylines as: streets, roads, highways, rivers, canals, train tracks ...
2 - points: any point features, like:
Trees, building entrances, junctions between roads ...
Store locations: restaurants, bars, pharmacies, post offices ...
-
If nothing supplied, 0 will be used as a default value (polygons).
- c7002461-1bcc-4d82-a58b-f10184fb8a7c
- shapeType_
- shapeType_
- true
- 0
- true
- 0
- 48d01794-d3d8-4aef-990e-127168822244
-
9799
1434
90
20
-
9845.5
1444
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 0
- 1
- true
- A list of specific OpenStreetMap keys that you would like to use for each "shapeType_" input.
-
There are thousands of OpenStreetMap keys describing various map elements. You can find them listed in here: www.taginfo.openstreetmap.org/keys
-
However due to their enormous number it is suggested that you use the "OSM keys" component, which will automatically generate specific keys for specific object type.
Either that, or simply leave this input empty. It that way the component will take only those keys which are attached to all shapeType_ shapes.
-
If not supplied, only those keys that appear at that particular "location_" and "radius_" will be used.
- 3a16a5ec-a47a-409b-98d9-4e15a5f163bc
- requiredKeys_
- requiredKeys_
- true
- 1
- true
- edc4928d-bbe7-4747-a906-b9d0e241620b
- 1
- 37261734-eec7-4f50-b6a8-b8d1f3c4396b
-
9799
1454
90
20
-
9845.5
1464
- 2
- true
- Use this input to define lists of Open Street Map ids. "OSM ids" component will generate them.
-
These lists can be used to define:
1) only those ids which will be included (isolated) when "OSM shapes" component is ran (use "osm_id_Only" and "osm_way_id_Only" inputs for this).
2) ids which will be removed when "OSM shapes" component is ran (use "osm_id_Remove" and "osm_way_id_Remove" inputs for this).
3) you can combine 1) and 2) and both define the: included and removed ids.
-
If nothing supplied to this input, then no OSM ids will be isolated nor removed: meaning all of them will be included.
- b00c8be3-f426-4a03-90cc-110fdc9c381b
- onlyRemove_Ids_
- onlyRemove_Ids_
- true
- 2
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9799
1474
90
20
-
9845.5
1484
- true
- Script variable TerrainGenerator2
- 8924ebb4-d355-4a23-8e1c-ff8ab8ecb477
- _______________
- _______________
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9799
1494
90
20
-
9845.5
1504
- true
- Set to "True" to bake the shapes geometry into the Rhino scene.
-
If not supplied default value "False" will be used.
- 99cf2510-0db3-4388-af95-0ddca02641a6
- bakeIt_
- bakeIt_
- true
- 0
- true
- 0
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
9799
1514
90
20
-
9845.5
1524
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- true
- ...
- 2e6ba0e9-4271-4a3b-9079-c25235373ca0
- _runIt
- _runIt
- true
- 0
- true
- bcabb822-a379-4c50-9238-39c1f64ebb04
- 1
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
9799
1534
90
20
-
9845.5
1544
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- Geometry of each shape.
-
Depening on the shapeType_ input this can be either a polygon (shapeType_ = 0), a polyline (shapeType_ = 1) or a point (shapeType_ = 2)
- 34262690-63f7-48ad-99f9-c08ae3fe5f82
- shapes
- shapes
- false
- 0
-
9919
1354
69
33
-
9953.5
1370.667
- Each upper shape contains certain information (keys) attached to it (example: address, type of the building, area etc.).
This output lists the available keys for all the shapes, or
in case some specific keys have been supplied to the "requiredKeys_" output, then they will be listed here.
- 8ba81b83-17fb-4453-be8a-03f1f28c83ce
- keys
- keys
- false
- 0
-
9919
1387
69
33
-
9953.5
1404
- Each upper shape contains a value which corresponds to a certain key (example: "key=addr_stree; value=Second Avenue 14/2", "key=building; value=yes", "key:area; value=100" etc.)
This ouput lists all values corresponding to each key, for each shape.
- 48c344ec-645b-4343-8618-329c86d9d99d
- values
- values
- false
- 0
-
9919
1420
69
34
-
9953.5
1437.333
- Script variable OSMshapes
- 4d23e4fe-f879-4123-b907-cceefb49b396
- ___________
- ___________
- false
- 0
-
9919
1454
69
33
-
9953.5
1470.667
- Title base point, which can be used to move the "title" geometry with grasshopper's "Move" component.
-
Connect this output to a Grasshopper's "Point" parameter in order to preview the point in the Rhino scene.
- true
- ab44e4c8-d330-4d6d-8679-321511141f8a
- titleOriginPt
- titleOriginPt
- false
- 0
-
9919
1487
69
33
-
9953.5
1504
- Title geometry with information about location, radius, north angle and shapeType.
- true
- fb6b6567-8b62-4934-8f03-be3872e8c076
- title
- title
- false
- 0
-
9919
1520
69
34
-
9953.5
1537.333
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Rhino Unit To Meters
- # Rhino unit to meters
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
input:
_valueRhinoUnit: A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
output:
unitFactor: Unit conversion factor.
-
Unitless.
valueMeters: _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
"""
ghenv.Component.Name = "Gismo_Rhino Unit To Meters"
ghenv.Component.NickName = "RhinoUnitToMeters"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "3 | More"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "2"
except: pass
import scriptcontext as sc
import Grasshopper
def main(valueRhinoUnit):
# check inputs
if (valueRhinoUnit == None):
unitConversionFactor = valueMeters = None
validInputData = False
printMsg = "Please add a number to \"_valueRhinoUnit\" input."
return unitConversionFactor, valueMeters, validInputData, printMsg
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
valueMeters = valueRhinoUnit * unitConversionFactor
validInputData = True
printMsg = "ok"
return unitConversionFactor, valueMeters, validInputData, printMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_preparation = sc.sticky["gismo_Preparation"]()
unitFactor, valueMeters, validInputData, printMsg = main(_valueRhinoUnit)
if not validInputData:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
-
-9
-9
-
550
575
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEdElEQVRIS+1Te1BUZRy9e3eXXV4KLctjeYokSU0SYEhQ5MDAJo81o2F4JEK2YxCvEZZHw0g2PXiojYAMMwHlxIQGyFMxEGwTBOw5mGOKUfLQIRRtbJJ09/S7966TpdT0X810Zs5893zf73fO97t7l/kf/37k5+erCgsLc3Q6XU9ubu653JysmYwM7fnU1NQjiYmJeREREa6m0n+GzMxMWUlJyc6iQt31+qosDHdsxcRgAi6e2ITz/Ruhb96Iyh0aPKuJvBEaGlrm5ORkYWr9e2i1WruCggJ9dcUrmB1NBb5/DpjUAN8RJ2OBCzHARDS/XtKrsX3rWnh5eY0pFAqVyWJpJCcnW2ZnZx9vqt1GhonAt9EwnovC/HA4BhvWomW3L0aaAnHjVBhwNgI4HU5rJPbofMGy7ChZ2ApOS4Buv7u6bCuZx1NzJBZGw5C3xQMqpew2yzLfUMkxlhWNuzvLb72d6YnFz54CPn8SOLMeuUkeoPM63uh+iI+PX/1yWsLPcyNkPh6OhaFQPBOi4JpGiKFElqsjiIhPEPVJajssDgUCY4G4OrAOrk5mv9K+P1d0DzQazesNlWR+lsYeD0XeZhfO/CTRmi+4F+bEgfIMZxjH/GgSP5S+6Mj17OFP/wy1Wj00eiAK+DoYl3sD4GJvZqRt7qZLQiqV+q5UyRavdXsDww9jpJZ/TV8S70wrICUlxSbx+U2XZ3vpnX7xOD6tXUU/muiU6fgvERAQoB+p9gD0Xphv9YDCUrxA247CKSE9PT2Mvpy9aZtjFn/qo1HH1mC4xhNisXiCmovpP1GakZFxX+bk5BTHxcWd0b/jAwy64WaHC3zcZbfs7OxqlUplJB+wJSVp4t234nCyPpiKfGDs98bNow/hwx0Pou7VQDRXxqK5IkZgebSJUWgu24AP3lCjvSwIv3R4Ap0OQLc9hisd8GaaM8zFokk+YH1I0NR01yPA0Crc7vWE4cgKIo18fAXwCbe6U7ArMOBCdAaOqYB+J6CPDPvsgaNKGA8pYGy1hbHFBjhsi9mm5bCUimb4gJDgdVNTTSup0A2GbhcYupxh6FTB2EMmHzvBeNgBhnYlDIfsYGzjKJihg9htQ3oZjAc5WhMtgRZLzNSa3x0QOHVxvxvQ4wj00q166FadSkzXP4AN/mZo3m4FdJFZ23IyJLYuA9qt0a6TI2KNGBeq5GRqTqS1jXjADLM1UgpghICnKWC6kW7brcDATmt8tYsMem3QVWTBfXJIDJFQgBWuv2+B9nwZrjaQSacc2jAxf34wS0zTSHG6XIL+InpuFuNSFfvHgLn99vjxPSvIpAz8PFmawgo9xTJTADX1yVH3koTXu17gtBTacJEQkC2iQBYh3gyvf9jLYL6O+T3gsUe9p8Yr5DjxmmDo6SDC7D4zNG4TDDX+IlxrFKM4luV1jprTIiQECYb7UhjM1TBYrRJ0fwGD0VIGFhJTgEjENNHNr0iEjRnSM1J6vqPFrEmLBc2tnOb279ZcH6/pWSZhrtDzR8T/NBjmN0aOq/3lKvIVAAAAAElFTkSuQmCC
- false
- b9a32241-7cd7-41d8-b17f-f482ccceb16b
- false
- true
- Gismo_Rhino Unit To Meters
- RhinoUnitToMeters
-
9324
1413
188
44
-
9426
1435
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
- 5c64da7d-f387-4025-aab2-04d5791c7e2d
- _valueRhinoUnit
- _valueRhinoUnit
- true
- 0
- true
- 78b27c9f-72f8-4d2f-81f8-ed57369d1e59
- 1
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
9326
1415
85
40
-
9370
1435
- Unit conversion factor.
-
Unitless.
- 49add51b-425f-4353-a924-da4bc9438aa7
- unitFactor
- unitFactor
- false
- 0
-
9441
1415
69
20
-
9475.5
1425
- _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
- 7dd65638-e494-4425-abac-9868383a5d20
- valueMeters
- valueMeters
- false
- 0
-
9441
1435
69
20
-
9475.5
1445
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 532028e2-2457-4e5e-86bd-73af17fa5369
- 1
- 4e074b1f-0382-421a-9315-4fd60112a946
- Group
- Buildings
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_OSM Keys
- # OSM keys
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# Component icon based on free OSM icon from: <https://icons8.com/web-app/13398/osm>
#
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to generate a list of keys for the "requiredKeys_" input of "OSM shapes" component.
A list of keys depends on the chosen OSM object name (_OSMobjectName). Use "OSM Objects" dropdown list to generate the appropriate _OSMobjectName.
-
Provided by Gismo 0.0.3
input:
_OSMobjectName: OSM object name.
Use "OSM Objects" dropdown list to generate it.
output:
readMe!: ...
requiredKeys: A list of keys for the chosen OSM object name (_OSMobjectName).
Supply it to the "requiredKeys_" input of "OSM shapes" component.
OSMwebpage: Webpage containing detailed information about the chosen _OSMobjectName.
"""
ghenv.Component.Name = "Gismo_OSM Keys"
ghenv.Component.NickName = "OSMKeys"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "1 | OpenStreetMap"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "2"
except: pass
import scriptcontext as sc
import Grasshopper
import System
import Rhino
import math
def main(OSMobjectName):
# check _OSMobjectName
if (len(OSMobjectName) == 0):
requiredKeys_unique = []
OSMwebpage = None
validInputData = False
printMsg = "Supply a name or names to \"_OSMobjectName\" input by using \"OSM Objects\" dropdown list."
return requiredKeys_unique, OSMwebpage, validInputData, printMsg
requiredKeys_dictionary = {
"""Building""" :
["name",
"name:en",
"building",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"height",
"building:levels",
"building:min_level",
"building:part",
"min_height",
"roof:height",
"roof:shape",
"roof:angle",
"roof:material",
"roof:color",
"roof:levels",
"entrance",
"access",
"http://wiki.openstreetmap.org/wiki/Buildings"]
,
"""Commercial building""" :
["name",
"name:en",
"landuse",
"office",
"shop",
"building",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"http://wiki.openstreetmap.org/wiki/Tag:building%3Dcommercial"]
,
"""Residential building""" :
["name",
"name:en",
"building",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"building:levels",
"building:flats",
"building:roof",
"building:colour",
"building:ruian:type",
"roof:shape",
"roof:colour",
"roof:material",
"ref:ruian:building",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:building%3Dresidential"]
,
"""Office building""" :
["name",
"name:en",
"landuse",
"office",
"building",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"http://wiki.openstreetmap.org/wiki/Tag:building%3Doffice"]
,
"""Office administrative""" :
["name",
"name:en",
"office",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"opening_hours",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:office%3Dadministrative"]
,
"""Office government""" :
["name",
"name:en",
"amenity",
"office",
"government",
"admin_level",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"opening_hours",
"wheelchair",
"http://wiki.openstreetmap.org/wiki/Tag:office%3Dgovernment"]
,
"""Post office""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"website",
"opening_hours",
"wheelchair",
"ref",
"ref:FR:LaPoste",
"atm",
"change_machine",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpost_office"]
,
"""Hospital""" :
["name",
"name:en",
"amenity",
"beds",
"emergency",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"height",
"building:levels",
"min_height",
"building",
"entrance",
"roof:shape",
"start_date",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dhospital"]
,
"""Ambulance station""" :
["name",
"name:en",
"amenity",
"beds",
"emergency",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"height",
"building:levels",
"min_height",
"building",
"entrance",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:emergency%3Dambulance_station"]
,
"""Pharmacy""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"contact",
"building",
"brand",
"opening_hours",
"drive_through",
"wheelchair",
"dispensing",
"shop",
"vending",
"operator",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpharmacy"]
,
"""Police""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"website",
"opening_hours",
"wheelchair",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpolice"]
,
"""Fire station""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfire_station"]
,
"""Museum""" :
["name",
"name:en",
"amenity",
"tourism",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"opening_hours",
"website",
"entrance",
"wheelchair",
"subject",
"shop",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:tourism%3Dmuseum"]
,
"""Theatre""" :
["name",
"name:en",
"amenity",
"theatre:genre",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"entrance",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dtheatre"]
,
"""Library""" :
["name",
"name:en",
"amenity",
"tourism",
"ref:isil",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"opening_hours",
"shop",
"entrance",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dlibrary"]
,
"""Book store""" :
["name",
"name:en",
"amenity",
"shop",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"wheelchair",
"brand",
"books",
"second_hand",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks"]
,
"""College""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"entrance",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcollege"]
,
"""University""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"faculty",
"department",
"opening_hours",
"entrance",
"wheelchair",
"landuse",
"residential",
"highway",
"operator",
"wiki.openstreetmap.org/wiki/Tag:amenity=university"]
,
"""School""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"capacity",
"isced:level",
"fee",
"religion",
"denomination",
"ref",
"contact",
"leisure",
"landuse",
"min_age",
"max_age",
"sport",
"surface",
"barrier",
"entrance",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dschool"]
,
"""Kindergarten""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"capacity",
"isced:level",
"fee",
"religion",
"denomination",
"ref",
"contact",
"leisure",
"landuse",
"min_age",
"max_age",
"sport",
"surface",
"barrier",
"entrance",
"wheelchair",
"access",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dkindergarten"]
,
# ------------
"""Playground""" :
["name",
"name:en",
"amenity",
"leisure",
"tourism",
"opening_hours",
"wheelchair",
"natural",
"barrier",
"surface",
"baby",
"walking_disability",
"sitting_disability",
"blind",
"min_age",
"max_age",
"centralkey",
"access",
"fee",
"supervised",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dplayground"]
,
"""Sports center""" :
["name",
"name:en",
"amenity",
"leisure",
"landuse",
"sport",
"address",
"building", # this is not a mistake!
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dsports_centre"]
,
"""Stadium""" :
["name",
"name:en",
"amenity",
"leisure",
"capacity",
"sport",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"building", # this is not a mistake!
"entrance",
"start_date",
"owner",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dstadium"]
,
"""Park""" :
["name",
"name:en",
"amenity",
"leisure",
"landuse",
"boundary",
"highway",
"http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dpark"]
,
"""Garden""" :
["name",
"leisure",
"garden:type",
"garden:style",
"access",
"http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dgarden"]
,
"""Camping site""" :
["name",
"name:en",
"fee",
"opening_hours",
"phone",
"website",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"tents",
"caravans",
"openfire",
"backcountry",
"scout",
"group_only",
"impromptu",
"camp_site",
"drinking_water",
"sanitary_dump_station",
"internet_access",
"internet_access:fee",
"http://wiki.openstreetmap.org/wiki/Tag:tourism%3Dcamp_site"]
,
"""Tree""" :
["name",
"name:en",
"natural",
"landuse",
"leaf_type",
"leaf_cycle",
"height",
"circumference",
"diameter_crown",
"type",
"genus",
"species",
"species:en",
"taxon",
"sex",
"denotation",
"historic",
"http://wiki.openstreetmap.org/wiki/Tag:natural%3Dtree"]
,
"""Forest""" :
["name",
"name:en",
"natural",
"leaf_type",
"leaf_cycle",
"crop",
"https://wiki.openstreetmap.org/wiki/Tag:natural%3Dwood"]
,
"""Forest (managed)""" :
["name",
"name:en",
"landuse",
"natural",
"leaf_type",
"leaf_cycle",
"crop",
"http://wiki.openstreetmap.org/wiki/Tag:landuse%3Dforest"]
,
"""Grassland""" :
["name",
"name:en",
"natural",
"grassland",
"landuse",
"managed",
"surface",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:natural%3Dgrassland"]
,
"""Waterway""" :
["name",
"name:en",
"ref",
"waterway",
"natural",
"water",
"landuse",
"leisure",
"destination",
"distance",
"ford",
"seasonal",
"tidal",
"intermittent",
"lock",
"http://wiki.openstreetmap.org/wiki/Key:waterway"]
,
"""Coastline""" :
["name",
"name:en",
"natural",
"landuse",
"waterway",
"harbour",
"leisure",
"amenity",
"mooring",
"man_made",
"place",
"sport",
"seamark:type",
"boundary",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:natural%3Dcoastline"]
,
# ------------
"""Cafe""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"internet_access",
"wheelchair",
"smoking",
"self_service",
"takeaway",
"outdoor_seating",
"cuisine",
"diet",
"breakfast",
"lunch",
"ice_cream",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcafe"]
,
"""Bar""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"internet_access",
"opening_hours",
"cuisine",
"drink",
"brewery",
"microbrewery",
"smoking",
"wheelchair",
"food",
"cocktails",
"beer_garden",
"leisure",
"outdoor_seating",
"real_ale",
"real_cider",
"accommodation",
"camra",
"real_fire",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbar"]
,
"""Pub""" : #(the same as for bar)
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"internet_access",
"opening_hours",
"cuisine",
"drink",
"brewery",
"microbrewery",
"smoking",
"wheelchair",
"food",
"cocktails",
"beer_garden",
"leisure",
"outdoor_seating",
"real_ale",
"real_cider",
"accommodation",
"camra",
"real_fire",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpub"]
,
"""Winery""" :
["name",
"name:en",
"amenity",
"shop",
"landuse",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"opening_hours",
"entrance",
"wheelchair",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:craft%3Dwinery"]
,
"""Restaurant""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"internet_access",
"opening_hours",
"stars",
"cuisine",
"leisure",
"outdoor_seating",
"cocktails",
"diet",
"opening_hours",
"brewery",
"microbrewery",
"smoking",
"wheelchair",
"takeaway",
"delivery",
"drive_through",
"reservation",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant"]
,
"""Supermarket""" :
["name",
"name:en",
"amenity",
"shop",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"wheelchair",
"organic",
"membership",
"bulk_purchase",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket"]
,
"""Public market""" :
["name",
"name:en",
"amenity",
"shop",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"wheelchair",
"building", # this is not a mistake!
"highway",
"organic",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dmarketplace"]
,
"""Mall""" :
["name",
"name:en",
"amenity",
"shop",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"website",
"opening_hours",
"wheelchair",
"building", # this is not a mistake!
"landuse",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall"]
,
"""Hostel""" :
["name",
"name:en",
"tourism",
"stars",
"rooms",
"beds",
"wheelchair",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"internet_access",
"internet_access:fee",
"smoking",
"lacounty:ain",
"lacounty:bld_id",
"height",
"building:levels",
"min_height",
"building",
"ruian:building",
"building:ruian:type",
"building:units",
"entrance",
"website",
"start_date",
"ele",
"operator",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:tourism%3Dhostel"]
,
"""Hotel""" : # (the same as hotel)
["name",
"name:en",
"tourism",
"stars",
"rooms",
"beds",
"wheelchair",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"internet_access",
"internet_access:fee",
"smoking",
"lacounty:ain",
"lacounty:bld_id",
"height",
"building:levels",
"min_height",
"building",
"ruian:building",
"building:ruian:type",
"building:units",
"entrance",
"website",
"start_date",
"ele",
"operator",
"source",
"http://wiki.openstreetmap.org/wiki/Tag:tourism%3Dhotel"]
,
"""Casino""" :
["name",
"name:en",
"amenity",
"leisure",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"contact",
"phone",
"website",
"internet_access",
"opening_hours",
"wheelchair",
"smoking",
"shop",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcasino"]
,
# ------------
"""Road""" :
["name",
"name:en",
"ref",
"alt_name",
"old_name",
"highway",
"railway",
"bridge",
"tunnel",
"layer",
"tracktype",
"access",
"fee",
"construction",
"minspeed",
"maxspeed",
"maxheight",
"maxwidth",
"maxweight",
"foot",
"bicycle",
"bus",
"cycleway",
"motorcar",
"horse",
"hov",
"hgv",
"surface",
"tracktype",
"width",
"lit",
"traffic_calming",
"parking:condition",
"parking:lane",
"lanes",
"lanes:forward",
"lanes:backward",
"oneway",
"turn:lanes",
"sidewalk",
"crossing",
"http://wiki.openstreetmap.org/wiki/Key:highway"]
,
"""Railway""" :
["name",
"name:en",
"railway",
"gauge",
"electrified",
"frequency",
"voltage",
"usage",
"service",
"rack",
"electrified",
"gauge",
"frequency",
"voltage",
"rack",
"bridge",
"tunnel",
"http://wiki.openstreetmap.org/wiki/Key:railway"]
,
"""Footway""" :
["name",
"name:en",
"highway",
"footway",
"foot",
"access",
"lit",
"wheelchair",
"sidewalk",
"bicycle",
"layer",
"surface",
"smoothness",
"incline",
"width",
"sac_scale",
"trail_visibility",
"kerb",
"crossing",
"crossing_ref",
"http://wiki.openstreetmap.org/wiki/Tag:highway%3Dfootway"]
,
"""Steps""" :
["name",
"name:en",
"highway",
"incline",
"step_count",
"conveying",
"handrail",
"tactile_paving",
"surface",
"ramp",
"ramp:stroller",
"ramp:bicycle",
"ramp:wheelchair",
"ramp:luggage",
"wheelchair",
"level",
"width",
"http://wiki.openstreetmap.org/wiki/Tag:highway=steps?uselang=en-US"]
,
"""Pedestrian zone""" :
["name",
"name:en",
"highway",
"sidewalk",
"bicycle",
"motorcar",
"motorcycle",
"layer",
"surface",
"smoothness",
"incline",
"width",
"ref",
"http://wiki.openstreetmap.org/wiki/Tag:highway%3Dpedestrian"]
,
"""Aeroway""" : # airports/aerodromes, grass airplane take off strips...
["name",
"name:en",
"aeroway",
"iata",
"faa",
"IFR",
"icao",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"phone",
"aerodrome:type",
"variation",
"ele",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:aeroway%3Daerodrome"]
,
"""Bicycle parking""" :
["name",
"name:en",
"amenity",
"highway",
"fee",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"covered",
"access",
"capacity",
"bicycle_parking",
"cyclestreets_id",
"maxstay",
"surveillance",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbicycle_parking"]
,
"""Bicycle rental""" :
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"shop",
"ref",
"capacity",
"network",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbicycle_rental"]
,
"""Fuel""" : #(fuel station, filling station, petrol station, gas station and petrol garage)
["name",
"name:en",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"opening_hours",
"wheelchair",
"opening_hours",
"payment:cash",
"payment:mastercard",
"payment:visa",
"payment:diners_club",
"payment:american_express",
"payment:maestro",
"payment:dkv",
"payment:uta",
"fuel:diesel",
"fuel:octane_91",
"fuel:octane_95",
"fuel:octane_98",
"fuel:e10",
"fuel:lpg",
"building",
"highway",
"access",
"covered",
"access",
"shop",
"sanitary_dump_station",
"surface",
"brand",
"operator",
"tenant",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfuel"]
,
"""Parking""" : #(facility use by the public or by customers or other authorised users for the parking of cars, trucks, motorcycles, etc.)
["name",
"name:en",
"amenity",
"parking",
"tourism",
"landuse",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"building", # this is not a mistake!
"park_ride",
"parking:lane",
"parking:condition",
"ref",
"access",
"highway",
"multi-storey",
"underground",
"rooftop",
"sheds",
"carports",
"garage_boxes",
"park_ride",
"fee",
"supervised",
"capacity",
"capacity:disabled",
"capacity:parent",
"capacity:charging",
"maxstay",
"maxheight",
"opening_hours",
"lit",
"surface",
"vending",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dparking"]
,
"""Garage""" :
["name",
"name:en",
"amenity",
"landuse",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"building", # this is not a mistake!
"highway",
"multi-storey",
"underground",
"rooftop",
"garage_boxes",
"fee",
"supervised",
"capacity",
"capacity:disabled",
"capacity:parent",
"capacity:charging",
"maxstay",
"maxheight",
"opening_hours",
"lit",
"surface",
"vending",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:landuse%3Dgarages"]
,
"""Subway entrances""" :
["name",
"name:en",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"railway",
"public_transport",
"ref",
"bicycle",
"wheelchair",
"barrier",
"oneway",
"http://wiki.openstreetmap.org/wiki/Tag:railway%3Dsubway_entrance"]
,
# ------------
"""Construction area""" :
["name",
"name:en",
"landuse",
"building",
"construction",
"end_date",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:landuse%3Dconstruction"]
,
"""Archaeological site""" :
["name",
"name:en",
"historic",
"historic:civilization",
"natural",
"site_type",
"fortification_type",
"opening_hours",
"wheelchair",
"sprockhoff",
"ref:mhs",
"moved",
"megalith_type",
"field",
"tomb",
"http://wiki.openstreetmap.org/wiki/Tag:historic%3Darchaeological_site"]
,
"""Fountain""" :
["name",
"name:en",
"amenity",
"natural",
"man_made",
"drinking_water",
"lit",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfountain"]
,
"""Wind turbine""" :
["power",
"name",
"name:en",
"ref",
"branch",
"height",
"rotor:diameter",
"start_date",
"generator:type",
"generator:source",
"generator:plant",
"generator:output:biogas",
"generator:output:electricity",
"generator:output:hot_water",
"generator:output:hot_air",
"generator:output:cold_water",
"generator:output:cold_air",
"generator:output:compress_air",
"generator:output:stream",
"generator:output:vacuum",
"voltage",
"frequency",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:power%3Dgenerator"]
,
"""Plant""" :
["power",
"name",
"name:en",
"ref",
"height",
"start_date",
"type",
"landuse",
"waterway",
"plant:output:electricity",
"plant:output:hot_water",
"plant:output:hot_air",
"plant:output:cold_water",
"plant:output:cold_air",
"plant:output:compress_air",
"plant:output:stream",
"plant:output:vacuum",
"voltage",
"frequency",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:power%3Dplant"]
,
"""Nuclear reactor""" :
["power",
"name",
"name:en",
"ref",
"branch",
"height",
"start_date",
"generator:type",
"generator:source",
"generator:plant",
"generator:output:biogas",
"generator:output:electricity",
"generator:output:hot_water",
"generator:output:hot_air",
"generator:output:cold_water",
"generator:output:cold_air",
"generator:output:compress_air",
"generator:output:stream",
"generator:output:vacuum",
"voltage",
"frequency",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:power%3Dgenerator"]
,
# ------------
"""Internet access""" :
["name",
"name:en",
"amenity",
"tourism",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"internet_access",
"wifi",
"http://wiki.openstreetmap.org/wiki/Key:internet_access"]
,
"""Toilet""" :
["name",
"name:en",
"toilets",
"amenity",
"addr:country",
"addr:city",
"addr:postcode",
"addr:street",
"addr:housenumber",
"access",
"description",
"drinking_water",
"fee",
"indoor",
"opening_hours",
"supervised",
"wheelchair",
"diaper",
"entrance",
"female",
"male",
"unisex",
"toilets:disposal",
"composting",
"man_made",
"operator",
"http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dtoilets"]
,
"""Color""" :
["name",
"name:en",
"building:colour",
"roof:colour",
"colour",
"building:roof:colour",
"building:facade:colour",
"natural",
"leisure",
"http://wiki.openstreetmap.org/wiki/Key:colour"]
}
requiredKeys_all = []
OSMwebpage = []
for name in OSMobjectName:
if requiredKeys_dictionary.has_key(name):
requiredKeys_perName_unsliced = requiredKeys_dictionary[name]
OSMwebpage_perName = requiredKeys_perName_unsliced[-1]
requiredKeys_perName = requiredKeys_perName_unsliced[:-1]
requiredKeys_all.extend(requiredKeys_perName)
OSMwebpage.append(OSMwebpage_perName)
requiredKeys_unique = list(set(requiredKeys_all)) # only pick unique keys
requiredKeys_unique.sort() # sort them alphabetically
if (len(requiredKeys_unique) == 0):
# "_OSMobjectName" does not exist in upper "requiredKeys_dictionary"
requiredKeys_unique = []
OSMwebpage = None
validInputData = False
printMsg = "Supplied \"_OSMobjectName\" does not exist among this component's data.\n" + \
"Try creating your own \"requiredKeys\" output manually by looking at:\n \n" + \
"http://taginfo.openstreetmap.org/keys"
return requiredKeys_unique, OSMwebpage, validInputData, printMsg
resultsCompletedMsg = "OSM keys component results successfully completed!\n \nInput data:\n \nOSMobjectName: %s" % OSMobjectName
print resultsCompletedMsg
validInputData = True
printMsg = "ok"
return requiredKeys_unique, OSMwebpage, validInputData, printMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
requiredKeys, OSMwebpage, validInputData, printMsg = main(_OSMobjectName)
if not validInputData:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to generate a list of keys for the "requiredKeys_" input of "OSM shapes" component.
A list of keys depends on the chosen OSM object name (_OSMobjectName). Use "OSM Objects" dropdown list to generate the appropriate _OSMobjectName.
-
Provided by Gismo 0.0.3
-
-9
-9
-
550
575
- true
- true
- false
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEbklEQVRIS72WaUxcVRiGD7XAwEC0SrFlLDBMF9mGwWGzCIVCRkqhLB02GdZBdin0h3UhYNS0lLQi2xSGYY1AQhuDaRVjDEgLYafFNrFNTEy0NegvEky1puT1fKdosGh66w9P8uXm3nPP+5zzfe8597L/vVlZsV6Znc2KzJ4HXf8tRL/1Ch8yysNVDJbSZHKbX+svZaD1Sh5axnNhni1Ax/yrIkyTeWgay0HzVzlo4tExVQL9sSDwYUs8pEFodiTe/00ZOhcLYaiJxNHyUCRXhOLkxUwM3CxD19UimBdyMP3jAKZ/6kXSaxrpEAK0XM6FhYuHHPZGZbYal7v2YrBajpAXHPDWR3r0XS+GacaAmR+GcG9tFeN32qRDCEBpyaqNRNUrSqx8oUB1JsNkE8OlWgZNmCssC4U4N5eFqe8Hce/+Xaz+/vPDEKUQ+6dGgI75QiQUBWCyVYb3cxmsdykQtV+OO0Nb4O9jj4axPLTNGzB7+wKANQH5be0Xnq4+URNulLF1uc2NABYOSKp4EfVc/GYPQ0aCAoNntbjVZwM3lSOaJwrQtWTEp9/WYeK7IcwtD4l0UU0svPAy+62r63KbGwHILfUjBig9HGAuZ7g97IirnXIsn2d4O9MKEekadF8vRVZNGDTBTihtCEfXjTyYF8lh2SCNdbnNjTrJhv3cLTWDeviFu8PX0w6uHo6ID2G4O8LwThaDSuuOE6VBuNaxHdufscJxSxIGb5UJC0sCdF8rQi93S+diET7kOTdNFSCcz/yQP8PKMMPwGQWWP1MhO5ohRadEYoQDKk1xaJ82SgdY+Obq5I4h3/csEbAE4WkavOzHcP/KFgy8ycXj1MCcFzKCGWIKAsT7jwXYGN0cRJAwvhKdmmH5463A7E5UxDO4+7mInU+b9D8DNkJoJXFahqVWBuUOXpcL6Rh4rBrwlFBaepZ4HRbWxTmU7ntEfUoQa9RCqbBFcJSrSCPVTDKg70YJTn2ShvfOp4gzqefrYpwZycS7Q3oBpFxTOuo/N6B9pgB0vJjpOi4BYJ4xovh0FHYqn4KLxzZknggVIA8fZ3GfWhWC0xczYO9oi+SyQD6RdNjJbaCvCJJQZLntionPzD/CDbk1B/B6Rxy8ghVIrQyGytcZxxpj+OkahNqBZDg8KUNYwj4U10XB2vYJxBn90cVX+0hA42gOfPfvQlVLLE4Op8HN0wmNo9kI1HlApX6Wzz5dpOq5PU8j5NBuRKf7wN3LCYfzJQLoo+LDAcdbY1HHU0GipfXReKPzCD8EtfAMdEF1X6K4hiU+D3c+gdD4vYjJ9pMAsLcVNTiY5g1NuBsOHPXES0f2IbFYK0CJJQHYo9khYCq1M5JKA0U66b2Dqd7cxhI2WvuUUXwadQY1IlO8RBHJpiQeofcS+W/4MksUu6Y/Way0/AMdys/qxHuPSNGDbzKdKWS7dr6ac5P5f9mQnrdN5aOZ25Gek1Xp9DVN5Ik+Gksa63Kb29/+Kv4Mut/47OH+jcH7SOOBGmN/AJnaTPXA5N/SAAAAAElFTkSuQmCC
- false
- 43337699-2dec-4ffe-80c2-537a9e8414d2
- false
- true
- Gismo_OSM Keys
- OSMKeys
-
9307
1494
207
64
-
9419
1526
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 3
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- true
- OSM object name.
Use "OSM Objects" dropdown list to generate it.
- e0fed27b-5941-48ad-96d3-129a45922845
- _OSMobjectName
- _OSMobjectName
- true
- 1
- true
- e43929a1-0100-41c4-b7fd-6037e57db6b2
- 1
- 37261734-eec7-4f50-b6a8-b8d1f3c4396b
-
9309
1496
95
60
-
9358
1526
- ...
- 37ab1634-3d7f-4260-b8e7-f040ac0689d0
- out
- out
- false
- 0
-
9434
1496
78
20
-
9473
1506
- A list of keys for the chosen OSM object name (_OSMobjectName).
Supply it to the "requiredKeys_" input of "OSM shapes" component.
- edc4928d-bbe7-4747-a906-b9d0e241620b
- requiredKeys
- requiredKeys
- false
- 0
-
9434
1516
78
20
-
9473
1526
- Webpage containing detailed information about the chosen _OSMobjectName.
- f9278602-52b9-4650-a145-4d36c4e443ff
- OSMwebpage
- OSMwebpage
- false
- 0
-
9434
1536
78
20
-
9473
1546
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Gismo_OSM Objects
- Use this dropdown list to chose an OSM object.
-
Provided by Gismo 0.0.3, JAN_29_2019
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEmUlEQVRIS71Wa1CUVRj+kITlNoWpEGELu4BcF3BdIHC5u6Jyvy0X2QWWYFkQkZqIoYhABMlAVi5xW7kMNQU1guQlg8WUEMdUKqfbr0Zr/CczpTXNME/nHBaiaGR/9c488+055zvPc857+5b7383EhBvkWZotMliZLVra8BYtbMzZ73+CzFluXiRbpgleYJuNMbL59+bJTLRfzUXblALHRtNx7KN0tF4+hI6reWj/PBdavYKhb64YaUcCQLYtEBgnQk/eSYhGvitBZW8cHNyt4SK2RfVAEjTN+1AznILeGwXouanA3M8jmHswiKQyP+NFqMDpGSWG72qQXbkH/DAODv4cHF22wcHPFI4iS+yJd0dJSwT03w7j0Z+L0N/rNF5kRWDom2IoqkLhTAScpCYQRHAILuMQUMjBNYaDrRsHSbgXpqYv4eGjXzD9UweSDq+KODOy/7IVAd3tIsTm7wI/lMOLpSYI0iyTBxZx8FVxSHzDFYrK/bAXPouR94fx8LcHuHZfh9SyAJBE0Rvo1hsVoIGkARX62sE97m9yCm8Fh70VfPx4/y6o1fWUY5vQCg2nKqH/QYfuWTV4lk/9aqBbb1RAS27Qf6sQWa9I4SjehKCSZXK/fA6yl53w/b2vGPmKNXZVwcqOQ+1YAss2msYGuvW24qKBhSJommTYITFlArsLiM8LeZi5M8lIl5aWGKhdPD+FXRFOaJyQ4+SFbOMEhr4uhvr4XjiITRBcbnCPchPGrvQx0rUCE+PnEZrsjrcvZOLkRSMFBhbUeOuDVPB9bCHcRwPNwVPJYeSylpGutcmJSwiJd0PLp9kERrpId7sQ3ddVqB5Mgq+UD3s/Dm4ZHM5e72Wkjx//gRvzt9DaqkW0LAophyXQzihIDHKMEzhzpwg98wXo+iIfzZNZiM0TY4uAh9IqFWpr6xEZI4V/qADhcjcUNEjReFaOjmt5ODWtMFKABJkGWkeE3p3LB52raD8IWY4I8RoRSlojUTeaQoKahdbPctA1m88yT6tXGhlkUsmN43LUj6Wh/8tChuPklNUDCaQJ5jBXNH+ShdNXlOymWnJy+mwnY8phoFtvdLFnXgX1iSg85/wMHAS2pCeFoH40DQKf7WxMO2jTeAYsbcyQoBaj4WM5LKzNWBXTgzxRwMLanHVT/3A+cmvC8GpvLDwDn0d6eSCEROBIWwwJaADefC8F1k/zIE3cCXVTFDabmyJW5Q8dcdOGAm3TSvgE78DR9gPMLXyPrWgjLpDIBBCK7HDiXAbqPkyFo+sWBO13QXSGN5w8t+JgvpECNFDeRKCi4wCazmUyUk1zNF7rj0dCkRgeEge8PpTIntJEdziRA4TEuSFG4buxAP0U0hhEyr3gF8pHWIoH6f87kUh8TYUSi3fD1c+eiQlF25GkkTB30vci071whtTPkwXIYveciqWb7JAIEWmeJJsy0HfzJUYenupJ/J/MUjP9aBBqRpLZTUtbZCh9R8be2+AGy99kWsU07brJbWiO0xbOxmSe1QVJRzpP23rnLAEpMrpG91IOA916W/1XQYplFXS8du7f62tB1ijHMhvH/QV0nELu4gmbSgAAAABJRU5ErkJggg==
- e43929a1-0100-41c4-b7fd-6037e57db6b2
- 69
- 1
- Gismo_OSM Objects
- Gismo_OSM Objects
- false
- 0
- "Building"
- Building
- true
- "Commercial building"
- Commercial building
- false
- "Residential building"
- Residential building
- false
- "Office building"
- Office building
- false
- "Office administrative"
- Office administrative
- false
- "Office government"
- Office government
- false
- "Post office"
- Post office
- false
- "Hospital"
- Hospital
- false
- "Ambulance station"
- Ambulance station
- false
- "Pharmacy"
- Pharmacy
- false
- "Police"
- Police
- false
- "Fire station"
- Fire station
- false
- "Museum"
- Museum
- false
- "Theatre"
- Theatre
- false
- "Library"
- Library
- false
- "Book store"
- Book store
- false
- "College"
- College
- false
- "University"
- University
- false
- "School"
- School
- false
- "Kindergarten"
- Kindergarten
- false
- ""
- -----------------
- false
- "Playground"
- Playground
- false
- "Sports center"
- Sports center
- false
- "Stadium"
- Stadium
- false
- "Park"
- Park
- false
- "Garden"
- Garden
- false
- "Camping site"
- Camping site
- false
- "Tree"
- Tree
- false
- "Forest"
- Forest
- false
- "Forest (managed)"
- Forest (managed)
- false
- "Grassland"
- Grassland
- false
- "Waterway"
- Waterway
- false
- "Coastline"
- Coastline
- false
- ""
- -----------------
- false
- "Cafe"
- Cafe
- false
- "Bar"
- Bar
- false
- "Pub"
- Pub
- false
- "Winery"
- Winery
- false
- "Restaurant"
- Restaurant
- false
- "Supermarket"
- Supermarket
- false
- "Public market"
- Public market
- false
- "Mall"
- Mall
- false
- "Hostel"
- Hostel
- false
- "Hotel"
- Hotel
- false
- "Casino"
- Casino
- false
- ""
- -----------------
- false
- "Road"
- Road
- false
- "Railway"
- Railway
- false
- "Footway"
- Footway
- false
- "Steps"
- Steps
- false
- "Pedestrian zone"
- Pedestrian zone
- false
- "Aeroway"
- Aeroway
- false
- "Bicycle parking"
- Bicycle parking
- false
- "Bicycle rental"
- Bicycle rental
- false
- "Fuel"
- Fuel
- false
- "Parking"
- Parking
- false
- "Garage"
- Garage
- false
- "Subway entrance"
- Subway entrance
- false
- ""
- -----------------
- false
- "Construction area"
- Construction area
- false
- "Archaeological site"
- Archaeological site
- false
- "Fountain"
- Fountain
- false
- "Wind turbine"
- Wind turbine
- false
- "Plant"
- Plant
- false
- "Nuclear reactor"
- Nuclear reactor
- false
- ""
- -----------------
- false
- "Internet access"
- Internet access
- false
- "Toilet"
- Toilet
- false
- "Color"
- Color
- false
-
9032
1515
250
22
-
9145
1515
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- c5de93b4-1cc0-4241-895e-5add85af429b
- Number Slider
-
- false
- 0
-
582
3963
203
20
-
582.5674
3963.776
- 3
- 1
- 1
- 3000
- 800
- 0
- 800
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_OSM 3D
- # OSM 3D
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# with assistance of Vladimir Elistratov and his Blender OSM project <https://github.com/vvoovv/blender-osm>
# Component icon based on free OSM icon from: <https://icons8.com/web-app/13398/osm> and <http://www.freeiconspng.com/free-images/3d-icon-9783>
#
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to create 3d geometry of structures/building and tree shapes created with Gismo "OSM shapes" component.
Creation of 3d shapes can be done in three ways:
1) If there is a valid value (not equal to "") for the "height" key, then the shape will always be extruded according to this value.
2) If this value is lacking (equal to ""), then the shape can be extruded according to the "building:levels" key value.
3) If both of these two values are lacking (equal to ""), or the very keys are lacking, and there is a valid value ("True") for the "building" key, then the shape will be extruded, according to the supplied domain generated from the randomHeightRange_ input.
If neither of these three ways are fulfilled, then no creation of 3d shapes will be performed.
-
Provided by Gismo 0.0.3
input:
_shapes: Plug in the shapes from the Gismo OSM shapes "shapes" output
_keys: Plug in the keys from the Gismo OSM shapes "keys" output.
_values: Plug in the values from the Gismo OSM shapes "values" output.
onlyRemove_Ids_: Use this input to define lists of Open Street Map ids. "OSM ids" component will generate them.
These lists can be used to define:
1) only those ids which will be included (isolated) when "OSM 3D" component is ran (use "osm_id_Only" and "osm_way_id_Only" inputs for this).
2) ids which will be removed when "OSM 3D" component is ran (use "osm_id_Remove" and "osm_way_id_Remove" inputs for this).
3) you can combine 1) and 2) and both define the: included and removed ids.
-
If nothing supplied to this input, then no OSM ids will be isolated nor removed: meaning all of them will be included.
heightPerLevel_: Some supplied "_shapes" may contain "building_l" keys. This can be used to extrude those buildings, by supplying the height value of each level (above ground) in Rhino document units (meters, feets...).
-
If nothing supplied, the default value of 3 meters (9.84 feets) per level will be used.
-
In Rhino document units (meters, feets...).
randomHeightRange_: This output can be useful if supplied "_shapes" do not contain valid values for "height" and "building_l" keys.
If they still contain the "building" key with value "True", then this can be used to extrude the shapes, by using some random extrude domain.
So to randomly extrude "buildings" shapes, just supply the "Construct Domain" to the randomHeightRange_ input. For example, input the "Construct Domain" component by using "20" and "30" as its starting and ending domain values. This will randomly extrude all buildings by 20 to 30 meters height. Of course in case the Rhino document units is: meters. It can be any other unit.
-
If nothing supplied, no random extrusion of the shapes will be applied.
-
Domain in Rhino document units (meters, feets...).
treeType_: There are three tree geometric types:
0 - round
1 - polygonized
2 - random shaped
-
If nothing supplied, the default type 2 type (random) will be used.
-
Integer.
groundTerrain_: The ground terrain surface on which the "threeDeeShapes" will be laid onto.
Supply it by using "terrain" output of the Ladybug "Terrain Generator" (type_ = 1) or Gismo "Terrain Generator" (type_ = 2 or type_ = 3) components.
-
If nothing supplied, the "threeDeeShapes" will always be laid flat onto a horizontal plane, with plane origin being the "origin" input of the "OSM shapes" component.
bakeIt_: Set to "True" to bake the extruded _shape geometry into the Rhino scene.
The geometry will be grouped. To ungroup it, select it and call the "Ungroup" Rhino command.
-
If not supplied default value "False" will be used.
_runIt: ...
output:
readMe!: ...
threeDeeValues: Generated 3d shapes from the inputted "_shapes".
-
Those can be extruded buildings, or trees.
-
If 3d shape has not been created then that branch will be empty.
Use "Clean Tree" component and set the "E" input to "True" to remove all these empty branches.
threeDeeKeys: A list of keys. This output is the same as "keys" output of "OSM shapes" component.
threeDeeValues: Values corresponding to each shape in "threeDeeValues" output.
-
If 3d shape has not been created then that branch will not have any values (it will be empty).
Use "Clean Tree" component and set the "E" input to "True" to remove all these empty branches.
height: The height of each shape from the "threeDeeShapes" output.
-
In Rhino document units (meters, feets...).
"""
ghenv.Component.Name = "Gismo_OSM 3D"
ghenv.Component.NickName = "OSM3D"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "1 | OpenStreetMap"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "3"
except: pass
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Grasshopper
import System
import random
import Rhino
import math
import time
import gc
def checkInputData(shapes, keys, values, heightPerLevel, randomHeightRange, treeType, onlyRemove_Ids):
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
# check inputs
if (shapes.DataCount == 0):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "Please connect the \"shapes\" output from Gismo \"OSM shapes\" component to this component's \"_shapes\" input."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
elif (len(shapes.Branches) == 1) and (shapes.Branches[0][0] == None):
# this happens when "OSM shapes" component's "_runIt" input is set to "False"
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "There is no data supplied to the \"_shapes\" input.\n" + \
" \n" + \
"Please connect the \"shapes\" output from Gismo \"OSM shapes\" component to this component's \"_shapes\" input.\n" + \
"And make sure that you set the \"OSM shapes\" \"_runIt\" input to \"True\"."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
if (len(keys) == 0):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "Please connect the \"keys\" output from Gismo \"OSM shapes\" component to this component's \"_keys\" input."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
elif (len(keys) == 1) and (keys[0] == None):
# this happens when "OSM shapes" component's "_runIt" input is set to "False"
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "There is no data supplied to the \"_keys\" input.\n" + \
" \n" + \
"Please connect the \"keys\" output from Gismo \"OSM shapes\" component to this component's \"_keys\" input.\n" + \
"And make sure that you set the \"OSM shapes\" \"_runIt\" input to \"True\"."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
if (values.DataCount == 0):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "Please connect the \"values\" output from Gismo \"OSM shapes\" component to this component's \"_values\" input."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
elif (len(values.Branches) == 1) and (values.Branches[0][0] == None):
# this happens when "OSM shapes" component's "_runIt" input is set to "False"
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "There is no data supplied to the \"_values\" input.\n" + \
" \n" + \
"Please connect the \"values\" output from Gismo \"OSM shapes\" component to this component's \"_values\" input.\n" + \
"And make sure that you set the \"OSM shapes\" \"_runIt\" input to \"True\"."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
if len(shapes.Paths) != len(values.Paths):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "The number of tree branches inputted to the \"_shapes\" and \"_values\" inputs do not match.\n" + \
" \n" + \
"Make sure that you connected:\n" + \
"\"keys\" output from Gismo \"OSM shapes\" component to this component's \"_keys\" input. And:\n" + \
"\"values\" output from Gismo \"OSM shapes\" component to this component's \"_values\" input."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
# heightPerLevel_ is always in Rhino document units
if (heightPerLevel == None):
heightPerLevel = 3/unitConversionFactor # 3 meters (10 feet)
elif (heightPerLevel <= 0):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "heightPerLevel_ input must be larger than 0.\n" + \
"Please supply a value larger than 0."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
# randomHeightRange_ is always in Rhino document units
if (randomHeightRange == None):
randomHeightRangeStart = randomHeightRangeEnd = None # dummy values, will not be used
else:
# randomHeightRangeStart can be larger than randomHeightRangeEnd, the random.uniform will still generate a random value between those two numbers.
# randomHeightRangeStart == randomHeightRangeEnd, the a single value will always be generated (equal to randomHeightRangeStart and randomHeightRangeEnd)
randomHeightRangeStart = randomHeightRange.T0/unitConversionFactor
randomHeightRangeEnd = randomHeightRange.T1/unitConversionFactor
if (treeType == None):
treeType = 2 # default (random)
elif (treeType < 0) or (treeType > 2):
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "treeType_ input must can only have one of the following values:\n" + \
"0 - round tree\n" + \
"1 - polygonized tree\n" + \
"2 - random shaped tree\n" + \
" \n" + \
"Please supply one of these values."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
if (onlyRemove_Ids.BranchCount == 1) and (onlyRemove_Ids.Branches[0][0] == None):
# in "OSM ids" component, an id exists both in "osm_id_Only_" and "osm_id_Remove_" inputs, or an id exists both in "osm_way_id_Only_" and "osm_way_id_Remove_" inputs
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "Your \"_onlyRemove_Ids\" input is invalid. Check the \"readMe!\" output of \"OSM ids\" component to see what's wrong with it."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
elif (onlyRemove_Ids.BranchCount == 0):
# nothing inputted to "OSM ids" component's four inputs
osm_id_Only = []; osm_way_id_Only = []; osm_id_Remove = []; osm_way_id_Remove = []
else:
# something inputted to at least one input of "OSM ids" component
onlyRemove_IdsLL = onlyRemove_Ids.Branches
osm_id_Only = list(onlyRemove_IdsLL[0])
osm_way_id_Only = list(onlyRemove_IdsLL[1])
osm_id_Remove = list(onlyRemove_IdsLL[2])
osm_way_id_Remove = list(onlyRemove_IdsLL[3])
# check the "shapeType_" input value set in the "OSM shapes" component.
shapeType = gismo_preparation.checkShapeType(shapes.Branches)
if shapeType == 1:
heightPerLevel = randomHeightRange = randomHeightRangeStart = randomHeightRangeEnd = treeType = osm_id_Only = osm_way_id_Only = osm_id_Remove = osm_way_id_Remove = shapeType = None
validInputData = False
printMsg = "This component supports only creation of 3d buildings and trees. So \"shapeType_\" input of \"OSM shapes\" component needs to be set to either 0 or 2."
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
del shapes; del keys; del values # delete local variables
validInputData = True
printMsg = "ok"
return heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg
def isNumber(string):
"""
check if a string can be converted to a number
"""
try:
number = float(string)
return True
except:
return False
def createThreeDeeShapes(shapesDataTree, keys, valuesDataTree, heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, groundTerrain, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor):
# use the Z coordinate of the origin_ input from "OSM shapes"
OSMshapesComp_origin = sc.sticky["gismo_OSMshapesComp_origin"]
# a) filter all "building" shapes to a single list, to be used for comparison of centroids. This is used so that all shapes with valid "building:part" key within a shape with valid "building" tag will be level to that shape, in case groundTerrain_ is inputted.
# b) check if shapes with valid "building" tags contain the shapes with valid "building:part" and "height" tags. In that case if "randomHeightRange_" is inputted, the shape with "building" tag will not be extruded.
building_keyIndex = None
buildingPart_keyIndex = None
height_keyIndex = None
osm_id_keyIndex = None
osm_way_id_keyIndex = None
for keyIndex,key in enumerate(keys):
if (key == "building"):
building_keyIndex = keyIndex
elif (key == "building:part"): # "building_p"
buildingPart_keyIndex = keyIndex
elif (key == "height"):
height_keyIndex = keyIndex
elif (key == "osm_id"):
osm_id_keyIndex = keyIndex
elif (key == "osm_way_id"):
osm_way_id_keyIndex = keyIndex
buildingShapes = []
buildingShapes_with_BuildingPartsAndHeight_insideL2 = []
valueBuilding = "" # dummy value in case "building" key does not exist
valueBuildingPart = "" # dummy value in case "building:part" key does not exist
valueHeight = "" # dummy value in case "height" key does not exist
valueHeight2 = "" # dummy value in case "height" key does not exist
value_osm_id = "" # initial "osm_id" key value
value_osm_way_id = "" # dummy value in case "osm_way_id" key does not exist
if (building_keyIndex != None) and (shapeType == 0): # "(shapeType == 0)" because a node can also be tagged as: "building=yes"
shapesLL = shapesDataTree.Branches
valuesLL = valuesDataTree.Branches
paths = shapesDataTree.Paths # obrisati ovaj red
shapePlane = Rhino.Geometry.Plane(Rhino.Geometry.Point3d(0,0,OSMshapesComp_origin.Z), Rhino.Geometry.Vector3d(0,0,1)) # it will always be constant because each shapesL has a constant height (coming from "OSM shapes" component)
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
for branchIndex,shapesL in enumerate(shapesLL):
if len(shapesL) != 0: # some shape may have been removed with the "OSM ids" component
valueBuilding = valuesLL[branchIndex][building_keyIndex] # for a)
if (height_keyIndex != None):
valueHeight = valuesLL[branchIndex][height_keyIndex]
else:
valueHeight = None # the "height" key does not exist in "keys"
value_osm_id = valuesLL[branchIndex][osm_id_keyIndex]
if (osm_way_id_keyIndex != None):
value_osm_way_id = valuesLL[branchIndex][osm_way_id_keyIndex]
else:
value_osm_way_id = None # the "osm_way_id" key does not exist in "keys"
if (valueBuilding != ""):
buildingShapes.append(shapesL[0]) # "shapes" output from "OSM shapes" component will always have one item per branch
# for b)
if (valueHeight == ""): # there is a shapesL[0] with a valid "building" value but invalid "height" value (it does not have a value for "height" key)
shapesLArea = Rhino.Geometry.AreaMassProperties.Compute(shapesL[0]).Area
innerShapesTotalArea = 0
for branchIndex2,shapesL2 in enumerate(shapesLL): # for b)
if len(shapesL2) != 0: # some shape may have been removed with the "OSM ids" component
if (buildingPart_keyIndex != None) and (height_keyIndex != None):# OVAJ RED JE SKORO DODAT. proveriti da li pravi probleme
valueBuildingPart = valuesLL[branchIndex2][buildingPart_keyIndex]
valueHeight2 = valuesLL[branchIndex2][height_keyIndex]
if (valueBuildingPart != "") and (valueHeight2 != ""): # there is AT LEAST ONE shapesL2[0] with a valid "building:part" and "height" values
shapeCentroid = Rhino.Geometry.AreaMassProperties.Compute(shapesL2[0]).Centroid
pointContainment = shapesL[0].Contains(shapeCentroid, shapePlane, tol)
if (pointContainment == Rhino.Geometry.PointContainment.Inside):# or (pointContainment == Rhino.Geometry.PointContainment.Coincident):
shapesL2Area = Rhino.Geometry.AreaMassProperties.Compute(shapesL2[0]).Area
innerShapesTotalArea += shapesL2Area
if innerShapesTotalArea >= shapesLArea:
# shapesL[0] containsts other shapesL2[0]'s which fill up (cover) the complete shapesL[0] area. In that case do not extrude the shapesL[0]
if (value_osm_id != ""):
#print "value_osm_id: ", value_osm_id
osm_id_Remove.append(value_osm_id)
elif (value_osm_way_id != ""):
#print "value_osm_way_id: ", value_osm_way_id
osm_way_id_Remove.append(value_osm_way_id)
else:
# shapesL[0] does contain a valid "building" value but not a valid "height" value
#buildingShapes_with_BuildingPartsAndHeight_insideL[branchIndex].append(False)
pass
else:
# shapesL[0] does not contain a valid "building" value
#buildingShapes_with_BuildingPartsAndHeight_insideL[branchIndex].append(False)
pass
del shapesLL
del valuesLL
# get groundBrep_singleBrepFace
if (groundTerrain != None):
groundBrep_singleBrepFace = groundTerrain.Faces[0].DuplicateFace(False) # always use the top face (the actual terrain) in case inputted groundTerrain_ has been created as a polysurface
accurate = False
bb_volume, bb_centroid, bb_length, bb_depth, bb_height, bb_bottomLeftCorner, bb_bottomRightCorner, bb_topRightCorner, bb_topLeftCorner = gismo_preparation.boundingBox_properties([groundTerrain], accurate)
elif (groundTerrain == None):
groundBrep_singleBrepFace = None
bb_height = 10 # dummy value
bb_height = 3000 # dummy large value (until "Ladybug Terrain Generator" starts support "origin_" input to be on the terrain)
if (shapeType == 0):
# shift the paths in "shapes" and "values" data trees by -1, to extrude buildings
shapes_shiftedPaths_DataTree = gismo_preparation.datatree_shiftPaths(shapesDataTree)
values_shiftedPaths_DataTree = gismo_preparation.datatree_shiftPaths(valuesDataTree)
elif (shapeType != 0):
# no shifting of paths should be done in case the trees need to be created
shapes_shiftedPaths_DataTree = shapesDataTree
values_shiftedPaths_DataTree = valuesDataTree
shapes_shiftedPaths_Paths = shapes_shiftedPaths_DataTree.Paths
shapes_shiftedPaths_LL = shapes_shiftedPaths_DataTree.Branches
values_shiftedPaths_LL = values_shiftedPaths_DataTree.Branches
threeDeeShapesDataTree = Grasshopper.DataTree[object]()
threeDeeValuesDataTree = Grasshopper.DataTree[object]()
heightDataTree = Grasshopper.DataTree[object]()
projectionDirection = Rhino.Geometry.Vector3d(0,0,1) # it can be direction = Rhino.Geometry.Vector3d(0,0,-1) as well, does not matter
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
atleastOneThreeDeeShapeCanBeCreated = False # initial value
for branchIndex,shapesL in enumerate(shapes_shiftedPaths_LL):
if len(shapesL) == 0:
# some shape may have been removed with the "OSM ids" component
height = 0
threeDeeShapeL = []
threeDeeValueL = []
else:
subValuesL_filtered, shapesL_filtered = gismo_gis.filterShapes(keys, values_shiftedPaths_LL[branchIndex], "shapesL dummy string", osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove)
if (len(subValuesL_filtered) == 0) and (len(shapesL_filtered) == 0):
# the id supplied to the "osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove" is found
height = 0
threeDeeShapeL = []
threeDeeValueL = []
elif (len(subValuesL_filtered) != 0) and (len(shapesL_filtered) != 0):
# the id supplied to the "osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove" is NOT found
valueBuilding = "" # dummy value in case "building" key does not exist
valueHeight = "" # dummy value in case "height" key does not exist
valueMinHeight = "" # dummy value in case "height" key does not exist
valueLevel = "" # dummy value in case "building_l" key does not exist
valueLeafType = "" # dummy value in case "leaf_type" key does not exist
valueCycleType = "" # dummy value in case "leaf_cycle" key does not exist
valueNatural = "" # dummy value in case "natural" key does not exist
valueDiameterCrown = "" # dummy value in case "diameter_c" key does not exist
deciduousOrConiferous = "" # dummy value in case "leaf_type", "leaf_cycle", "natural" keys do not exist
for keyIndex,key in enumerate(keys):
if (key == "building"):
valueBuilding = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "height"):
valueHeight = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "building:levels"): # the short name is: building_l
valueLevel = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "leaf_type"):
valueLeafType = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "leaf_cycle"):
valueCycleType = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "natural"):
valueNatural = values_shiftedPaths_LL[branchIndex][keyIndex]
elif (key == "diameter_crown"): # the short name is: diameter_c
valueDiameterCrown = values_shiftedPaths_LL[branchIndex][keyIndex]
if (key == "min_height"):
valueMinHeight = values_shiftedPaths_LL[branchIndex][keyIndex]
# find the "height" for both extruding buildings and trees
if isNumber(valueHeight):
# there is "height" key, and it's value is not ""
height = float(valueHeight)/unitConversionFactor # in Rhino document units
threeDeeShapesObject = "3d building"
elif isNumber(valueLevel):
# there is "building_l" key, and it's value is not ""
height = float(valueLevel) * heightPerLevel # in Rhino document units
threeDeeShapesObject = "3d building"
elif (valueBuilding != "") and (not isNumber(valueHeight) and (not isNumber(valueLevel))):
# a) there are "height" key and "building_l" keys and both have "" values. And there is "building" key, and it's valid (it's not equal to "". So it's either True or some other value, like: "residential", "house", "industrial"...) or
# b) there are NO "height" and "building_l" keys. And there is "building" key, and it's valid (it's not equal to "". So it's either True or some other value, like: "residential", "house", "industrial"...)
if (randomHeightRange != None):
# domain supplied into the "randomHeightRange_" input
height = round(random.uniform(randomHeightRangeStart, randomHeightRangeEnd),2) # in Rhino document units
threeDeeShapesObject = "3d building"
else:
# nothing inputted to the "randomHeightRange_" input
height = 0
threeDeeShapesObject = None
atleastOneThreeDeeShapeCanBeCreated = True
else:
# there are "height", "building:l", "building" keys but they are all invalid ("", "", "")
# there are NO "height", "building_l", "building" keys
height = 0
threeDeeShapesObject = None
if isNumber(valueMinHeight):
valueMinHeight = float(valueMinHeight)
if (shapeType == 2):
# identify whether a 3d tree will be created
if (valueLeafType == "broadleaved"):
deciduousOrConiferous = "deciduous"
threeDeeShapesObject = "3d tree"
elif (valueLeafType == "needleleaved"):
deciduousOrConiferous = "coniferous"
threeDeeShapesObject = "3d tree"
elif (valueCycleType == "deciduous") or (valueCycleType == "semi_deciduous"):
deciduousOrConiferous = "deciduous"
threeDeeShapesObject = "3d tree"
elif (valueCycleType == "evergreen") or (valueCycleType == "semi_evergreen"):
deciduousOrConiferous = "coniferous"
threeDeeShapesObject = "3d tree"
elif (valueNatural == "tree"):
deciduousOrConiferous = "deciduous" # always use "deciduous" if not specified which "deciduousOrConiferous" the tree is
threeDeeShapesObject = "3d tree"
elif (valueDiameterCrown != ""):
deciduousOrConiferous = "deciduous" # always use "deciduous" if not specified which "deciduousOrConiferous" the tree is
threeDeeShapesObject = "3d tree"
else:
threeDeeShapesObject = None
# 1) try creating 3d trees
if (threeDeeShapesObject == "3d tree"):
if (height == 0):
# this happens if the value for the "height" key was: "", or there the "height" key does not even exist
if (randomHeightRange != None):
# domain supplied into the "randomHeightRange_" input
height = round(random.uniform(randomHeightRangeStart, randomHeightRangeEnd),2) # in Rhino document units
else:
# nothing inputted to the "randomHeightRange_" input
height = 0
atleastOneThreeDeeShapeCanBeCreated = True
if (height != 0):
# there is "height" key, and its value is valid (not "")
#atleastOneThreeDeeShapeCanBeCreated = True # proveriti da li pravi problem
threeDeeShapeL = []
threeDeeValueL = values_shiftedPaths_LL[branchIndex]
if deciduousOrConiferous == "":
deciduousOrConiferous = "deciduous" # by default, if it can not be identified if a tree is deciduous or coniferous always use the deciduous
#deciduousOrConiferous = "coniferous"
numOfTreeHorizontalSegments = 6 # this value is fixed, and should not be changed
# heights and radii
trunkRadius = height/random.uniform(44, 48) # lower values (than 44,48) can result in "bottomCrown_brep" not being able to be created
if isNumber(valueDiameterCrown):
# there is a valid "valueDiameterCrown" value
crownRadius = float(valueDiameterCrown) / 2
else:
# valueDiameterCrown == ""
crownRadius = height/random.uniform(2, 5)
trunkHeight = 0.2*height
crownHeight = height - trunkHeight
treeBottom_pt = shapesL[0].Location # convert Point to Point3d
unprojectedTrunkBottom_crv = Rhino.Geometry.Circle(treeBottom_pt, trunkRadius).ToNurbsCurve()
# project the shapes (points) to the groundTerrain_
if (groundTerrain == None):
projectedTreeBottom_pt = treeBottom_pt
projectedTrunkBottom_crv = unprojectedTrunkBottom_crv
extrusionVector = Rhino.Geometry.Vector3d(0, 0, trunkHeight)
trunkBrep = Rhino.Geometry.Surface.CreateExtrusion(projectedTrunkBottom_crv, extrusionVector).ToBrep()
trunkTop_pt = Rhino.Geometry.Point3d(projectedTreeBottom_pt.X, projectedTreeBottom_pt.Y, projectedTreeBottom_pt.Z + trunkHeight)
trunkTop_crv = Rhino.Geometry.Circle(trunkTop_pt, trunkRadius).ToNurbsCurve()
elif (groundTerrain != None):
projectedTreeBottom_pts = Rhino.Geometry.Intersect.Intersection.ProjectPointsToBreps([groundTerrain], [treeBottom_pt], projectionDirection, tol)
if len(projectedTreeBottom_pts) == 0:
# the shapeL[0] point is located outside of terrainGround_ input boundaries
# add "None" to the threeDeeShapesDataTree
height = 0
threeDeeShapeL = []
threeDeeValueL = []
threeDeeShapesDataTree.AddRange(threeDeeShapeL, shapes_shiftedPaths_Paths[branchIndex])
threeDeeValuesDataTree.AddRange(threeDeeValueL, shapes_shiftedPaths_Paths[branchIndex])
heightDataTree.AddRange([height], shapes_shiftedPaths_Paths[branchIndex])
continue
else:
projectedTreeBottom_pt = projectedTreeBottom_pts[0]
projectedTrunkBottom_crv1 = Rhino.Geometry.Curve.ProjectToBrep(unprojectedTrunkBottom_crv, groundTerrain, projectionDirection, tol)[0]
if (not projectedTrunkBottom_crv1.IsClosed):
# the projected shape is not a closed curve anymore (it was before the projection)
line = Rhino.Geometry.Line(projectedTrunkBottom_crv1.PointAtStart, projectedTrunkBottom_crv1.PointAtEnd).ToNurbsCurve()
joinedPolyCrv = Rhino.Geometry.Curve.JoinCurves([projectedTrunkBottom_crv1,line], tol)[0]
projectedTrunkBottom_crv = joinedPolyCrv.ToNurbsCurve()
else:
# the projected curve is still a closed curve (and it was before the projection)
projectedTrunkBottom_crv = projectedTrunkBottom_crv1
# a) trunk
trunkTop_pt = Rhino.Geometry.Point3d(projectedTreeBottom_pt.X, projectedTreeBottom_pt.Y, projectedTreeBottom_pt.Z + trunkHeight)
trunkTop_crv = Rhino.Geometry.Circle(trunkTop_pt, trunkRadius).ToNurbsCurve()
extrudePathCurve = Rhino.Geometry.Line(trunkTop_pt, Rhino.Geometry.Point3d(trunkTop_pt.X, trunkTop_pt.Y, trunkTop_pt.Z - bb_height)).ToNurbsCurve()
extrusionVector = Rhino.Geometry.Vector3d(0, 0, -bb_height)
extrudedShapeBrep = Rhino.Geometry.Surface.CreateExtrusion(trunkTop_crv, extrusionVector).ToBrep()
splittedBreps = Rhino.Geometry.Brep.Split(extrudedShapeBrep, groundBrep_singleBrepFace, tol)
trunkBrep = splittedBreps[0]
shrinkSuccess = trunkBrep.Faces.ShrinkFaces()
del splittedBreps
# b) crown
# crown curves/polylines
crownSection_crvs = []
if deciduousOrConiferous == "deciduous":
crownRadii = [0.15*crownRadius, crownRadius, crownRadius, crownRadius, 0.15*crownRadius] # [crownBottom_crv radius, crownMiddle1_crv, crownMiddle2_crv, crownTop_crv]
crownPartitionHeights = [0*crownHeight, 0.275*crownHeight, 0.5*crownHeight, 0.725*crownHeight, 1.0*crownHeight]
elif deciduousOrConiferous == "coniferous":
crownRadii = [0.2*crownRadius, crownRadius, 0.1*crownRadius] # [crownBottom_crv radius, crownMiddle1_crv, crownMiddle2_crv, crownTop_crv]
crownPartitionHeights = [0*crownHeight, 0.05*crownHeight, 1.0*crownHeight]
for i in xrange(len(crownRadii)):
crown_pt = Rhino.Geometry.Point3d(trunkTop_pt.X, trunkTop_pt.Y, trunkTop_pt.Z + crownPartitionHeights[i])
circleCrv = Rhino.Geometry.Circle(crown_pt, crownRadii[i]).ToNurbsCurve()
if (treeType == 0):
crownSection_crvs.append(circleCrv)
elif (treeType == 1):
includeEnds = True
circleDivision_tL = list(Rhino.Geometry.Curve.DivideByCount(circleCrv, numOfTreeHorizontalSegments, includeEnds))
circleDivision_tL = circleDivision_tL + [circleDivision_tL[0]] # closing the polyline
circleDivision_ptsL = [circleCrv.PointAt(t) for t in circleDivision_tL]
crown_polyline = Rhino.Geometry.Polyline(circleDivision_ptsL).ToNurbsCurve()
crownSection_crvs.append(crown_polyline)
elif (treeType == 2):
centroid = Rhino.Geometry.AreaMassProperties.Compute(circleCrv).Centroid
includeEnds = True
t_L = circleCrv.DivideByCount(12, includeEnds)
randomCirclePts = []
for t in t_L:
pt = circleCrv.PointAt(t)
vector = pt - centroid
vectorScaleFactor = random.uniform(-0.2, 0.2)
randomPt = pt + vector*vectorScaleFactor
randomCirclePts.append(randomPt)
degree = 3; knotstyle = 3; knotstyle2 = System.Enum.ToObject(Rhino.Geometry.CurveKnotStyle, 3); start_tangent = end_tangent = Rhino.Geometry.Vector3d.Unset
randomCirclePts2 = randomCirclePts + [randomCirclePts[0]] # close the crv
randomCrv = Rhino.Geometry.Curve.CreateInterpolatedCurve(randomCirclePts2, degree, knotstyle2, start_tangent, end_tangent)
crownSection_crvs.append(randomCrv)
# crow brep
bottomCrown_brep = Rhino.Geometry.Brep.CreatePlanarBreps([crownSection_crvs[0],trunkTop_crv])[0]
topCrown_brep = Rhino.Geometry.Brep.CreatePlanarBreps(crownSection_crvs[-1])[0]
if (treeType == 0):
loftType2 = Rhino.Geometry.LoftType.Normal
elif (treeType == 1):
loftType2 = Rhino.Geometry.LoftType.Straight
elif (treeType == 2):
loftType2 = Rhino.Geometry.LoftType.Normal
closed = False
crownSideBrep = Rhino.Geometry.Brep.CreateFromLoft(crownSection_crvs, Rhino.Geometry.Point3d.Unset, Rhino.Geometry.Point3d.Unset, loftType2, closed)[0]
treeJoinedBrep = Rhino.Geometry.Brep.JoinBreps([bottomCrown_brep, crownSideBrep, topCrown_brep, trunkBrep], tol)[0]
treeJoinedBrep.Flip() # for some reason the "treeJoinedBrep" has always normals pointed downwards
threeDeeShapeL.append(treeJoinedBrep)
# 2) try creating 3d buildings
elif (threeDeeShapesObject == "3d building"):
# check if a building can be created (if height != 0)
if (height != 0):
bottomCrvControlPt_highestZcoord = None # check if commenting-out this line will make some errors
# find out whether shapesL is included in other building shapes (like shapesL which have valid "building:part" key). If it is, then calculate the "bottomCrvControlPt_highestZcoord" of that other building shape
shapePlane = Rhino.Geometry.Plane(Rhino.Geometry.Point3d(0,0,shapesL[0].PointAtStart.Z), Rhino.Geometry.Vector3d(0,0,1)) # it will always be constant because each shapesL has a constant height (coming from "OSM shapes" component)
for buildingShape in buildingShapes:
shapeCentroid = Rhino.Geometry.AreaMassProperties.Compute(shapesL[0]).Centroid
pointContainment = buildingShape.Contains(shapeCentroid, shapePlane, tol)
if (pointContainment == Rhino.Geometry.PointContainment.Inside) or (pointContainment == Rhino.Geometry.PointContainment.Coincident):
# shapesL[0]'s centroid is contained inside another shapesL[0] (which has a valid "building" key), so use the "bottomCrvControlPt_highestZcoord" of that another shapesL[0]
dummy_topCrvs, bottomCrvControlPt_highestZcoord = gismo_geometry.liftingOSMshapes_from_groundTerrain([buildingShape], groundBrep_singleBrepFace, height, valueMinHeight) # "bottomCrvControlPt_highestZcoord" calculated
del dummy_topCrvs
break # the shapesL[0] has found to be inside another shapesL[0] which has a valid "building" key. No need for checking of other shapes
topCrvs, dummy_bottomCrvControlPt_highestZcoord = gismo_geometry.liftingOSMshapes_from_groundTerrain(shapesL, groundBrep_singleBrepFace, height, valueMinHeight, bottomCrvControlPt_highestZcoord)
if (len(topCrvs) == 0):
# the shapesL is located outside of the "groundTerrain_" ("if groundTerrain_" inputted. If "groundTerrain_" not inputted, len(projectedShapeCrvs) will never be equal to 0)
height = 0
threeDeeShapeL = []
threeDeeValueL = []
elif (len(topCrvs) != 0):
# remove closed topCrvs with small area, as they can cause problems
topCrvs_area = Rhino.Geometry.AreaMassProperties.Compute(topCrvs[0], tol).Area
if (topCrvs[0].IsClosed == True) and (topCrvs_area <= tol):
height = 0
threeDeeShapeL = []
threeDeeValueL = []
else:
threeDeeValueL = values_shiftedPaths_LL[branchIndex]
planarBrep = Rhino.Geometry.Brep.CreatePlanarBreps(topCrvs)[0]
planarBrep.Flip() # for some reason the upper planarBrep has always a normal pointed downwards
# extrude buildings
if (valueMinHeight != ""):
# there is a valid "min_height" value
extrusionVec = Rhino.Geometry.Vector3d(0,0,-(height-valueMinHeight))
elif (valueMinHeight == ""):
if (groundTerrain == None):
extrusionVec = Rhino.Geometry.Vector3d(0,0,-height)
elif(groundTerrain != None):
shapeExtrudeHeight = -(height + 2 * bb_height) # "2" is due to safety
extrusionVec = Rhino.Geometry.Vector3d(0,0,shapeExtrudeHeight)
topCrvs_StartPt = topCrvs[0].PointAtStart # if topCrvs has more shapes than 1, the others will also be on the same height
extrudeCrv = Rhino.Geometry.Line(topCrvs_StartPt, topCrvs_StartPt + extrusionVec).ToNurbsCurve()
planarBrepFace = planarBrep.Faces[0]
cap = True
extrudedShape = Rhino.Geometry.BrepFace.CreateExtrusion(planarBrepFace, extrudeCrv, cap)
if (groundTerrain == None):
# nothing inputted into the "groundTerrain_" input
threeDeeShapeL = [extrudedShape]
elif (groundTerrain != None):
if (valueMinHeight != ""):
threeDeeShapeL = [extrudedShape]
elif (valueMinHeight == ""):
# something inputted into the "groundTerrain_" input
splittedBreps = Rhino.Geometry.Brep.Split(extrudedShape, groundBrep_singleBrepFace, tol)
if len(splittedBreps) > 0:
shrinkSuccess = splittedBreps[0].Faces.ShrinkFaces()
threeDeeShapeL = [splittedBreps[0]]
del splittedBreps
else:
# height is equal to 0
threeDeeShapeL = []
threeDeeValueL = []
# 3) neither 3d tree nor 3d building could be created with the supplied _keys and _values
else:
height = 0
threeDeeShapeL = []
threeDeeValueL = []
threeDeeShapesDataTree.AddRange(threeDeeShapeL, shapes_shiftedPaths_Paths[branchIndex])
threeDeeValuesDataTree.AddRange(threeDeeValueL, shapes_shiftedPaths_Paths[branchIndex])
heightDataTree.AddRange([height], shapes_shiftedPaths_Paths[branchIndex])
if (threeDeeShapesDataTree.DataCount == 0):
if (len(osm_id_Only) != 0) or (len(osm_way_id_Only) != 0):
# this may happen if ids supplied to the "osm_id_Only_" and/or "osm_way_id_Only_" inputs of "OSM ids" component can not be found in this _location and/or radius_ (they may correspond to other _location and/or radius_)
valid_onlyRemove_Ids_or_shapes = False
printMsg = "The ids you supplied through \"osm_id_Only_\" and/or \"osm_way_id_Only_\" inputs do not exist for this \"_location\" and/or \"radius_\" inputs.\nTry removing the ids from the \"osm_id_Only_\" and/or \"osm_way_id_Only_\" inputs of \"OSM ids\" component."
return threeDeeShapesDataTree, threeDeeValuesDataTree, heightDataTree, valid_onlyRemove_Ids_or_shapes, printMsg
elif (len(osm_id_Only) == 0) and (len(osm_way_id_Only) == 0):
if (atleastOneThreeDeeShapeCanBeCreated == True):
valid_onlyRemove_Ids_or_shapes = False
printMsg = "Supplied _values and _keys do not contain neither \"height\" nor \"building:levels\" keys which are essential for creation of 3d buildings and/or 3d trees.\n" + \
" \n" + \
"You can allow the component to create them with random heights with the use of \"randomHeightRange_\" input. Supply some domain to this input (for example: \"20 to 30\") to generate the 3d shapes."
elif (atleastOneThreeDeeShapeCanBeCreated == False):
valid_onlyRemove_Ids_or_shapes = False
printMsg = "No 3D shape (building or tree) could be created for the given _keys and _values.\n\n" + \
"These can be due to the following few reasons:\n" + \
"-\n" + \
"1) The simplest one: there really isn't any building or tree at that \"_location\" and for that \"_radius\".\n" + \
"-\n" + \
"2) You might be searching in incorrect \"shapeType_\" input.\n" + \
"_keys and _values are affected by \"shapeType_\" input of the \"OSM shapes\" component. For example, trees will always be located (if they exist at that location) for shapeType_ = 2 (points). They can not be found in shapeType_ = 0 (polygons).\n" + \
"Buildings will always be created in shapeType_ = 0.\n" + \
"-\n" + \
"3) Buildings and trees are basically found by matching certain _keys with _values. It can be that you haven't initially defined a list of specific _keys so that this component would find those based on them.\n" + \
"To solve this problem define the \"requiredKeys_\" input of the \"OSM shapes\" component by using the \"OSM keys\" component. Generate the keys in \"OSM keys\" component by using the \"Building\" and \"Tree\" as \"_OSMobjectName\" inputs."
return threeDeeShapesDataTree, threeDeeValuesDataTree, heightDataTree, valid_onlyRemove_Ids_or_shapes, printMsg
# baking
if (groundTerrain != None):
groundTerrainInputted = "yes"
elif (groundTerrain == None):
groundTerrainInputted = "no"
if bakeIt_:
layerName = "heightPerLevel=" + str(heightPerLevel) + "_randomHeightRange=" + str(randomHeightRangeStart) + "-" + str(randomHeightRangeEnd) + "_groundTerrain=" + groundTerrainInputted
layParentName = "GISMO"; laySubName = "OSM"; layerCategoryName = "3D_SHAPES"
newLayerCategory = False
laySubName_color = System.Drawing.Color.FromArgb(100,191,70) # green
layerColor = System.Drawing.Color.FromArgb(0,0,0) # black
layerIndex, layerName_dummy = gismo_preparation.createLayer(layParentName, laySubName, layerCategoryName, newLayerCategory, layerName, laySubName_color, layerColor)
threeDeeShapesFlattened = [shape for threeDeeShapeL in threeDeeShapesDataTree.Branches for shape in threeDeeShapeL]
geometryIds = gismo_preparation.bakeGeometry(threeDeeShapesFlattened, layerIndex)
# grouping
groupIndex = gismo_preparation.groupGeometry("3D_OSM_SHAPES" + "_" + layerName, geometryIds)
del threeDeeShapesFlattened
del geometryIds
# deleting
del shapesDataTree; del shapes_shiftedPaths_Paths; del shapes_shiftedPaths_LL; del valuesDataTree; del values_shiftedPaths_LL; del keys; del buildingShapes # delete local variables
gc.collect()
valid_onlyRemove_Ids_or_shapes = True
printMsg = "ok"
return threeDeeShapesDataTree, threeDeeValuesDataTree, heightDataTree, valid_onlyRemove_Ids_or_shapes, printMsg
def printOutput(osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, heightPerLevel, randomHeightRangeStart, randomHeightRangeEnd, treeType):
if bakeIt_ == True:
bakedOrNot = "and baked "
elif bakeIt_ == False:
bakedOrNot = ""
if groundTerrain_:
groundTerrainInputted = "yes"
else:
groundTerrainInputted = "no"
resultsCompletedMsg = "OSM 3D component results successfully completed %s!" % bakedOrNot
printOutputMsg = \
"""
Input data:
Only remove Ids: %s, %s, %s, %s
Height per level (rhino doc. units): %s
Random height range (rhino doc. units): %s - %s
Tree geometry type: %s
Ground terrain inputted: %s
""" % (osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, heightPerLevel, randomHeightRangeStart, randomHeightRangeEnd, treeType, groundTerrainInputted)
print resultsCompletedMsg
print printOutputMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_preparation = sc.sticky["gismo_Preparation"]()
gismo_geometry = sc.sticky["gismo_CreateGeometry"]()
gismo_gis = sc.sticky["gismo_GIS"]()
heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor, validInputData, printMsg = checkInputData(_shapes, _keys, _values, heightPerLevel_, randomHeightRange_, treeType_, onlyRemove_Ids_)
if validInputData:
if _runIt:
threeDeeShapes, threeDeeValues, height, valid_onlyRemove_Ids_or_shapes, printMsg = createThreeDeeShapes(_shapes, _keys, _values, heightPerLevel, randomHeightRange, randomHeightRangeStart, randomHeightRangeEnd, treeType, groundTerrain_, osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, shapeType, unitConversionFactor)
if valid_onlyRemove_Ids_or_shapes:
printOutput(osm_id_Only, osm_way_id_Only, osm_id_Remove, osm_way_id_Remove, heightPerLevel, randomHeightRangeStart, randomHeightRangeEnd, treeType)
threeDeeKeys = _keys
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print "All inputs are ok. Please set \"_runIt\" to True, in order to run the OSM 3D component"
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to create 3d geometry of structures/building and tree shapes created with Gismo "OSM shapes" component.
Creation of 3d shapes can be done in three ways:
1) If there is a valid value (not equal to "") for the "height" key, then the shape will always be extruded according to this value.
2) If this value is lacking (equal to ""), then the shape can be extruded according to the "building:levels" key value.
3) If both of these two values are lacking (equal to ""), or the very keys are lacking, and there is a valid value ("True") for the "building" key, then the shape will be extruded, according to the supplied domain generated from the randomHeightRange_ input.
If neither of these three ways are fulfilled, then no creation of 3d shapes will be performed.
-
Provided by Gismo 0.0.3
-
-9
-9
-
660
481
- true
- true
- false
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEiUlEQVRIS72Wa1CUVRjHl0lgJVMxBxE1EDQSFUHkpnJz1w0QXGR3YfGyFxaWBdZwMcGEoBETcCYMuQgoIirilI412ZdqNDM0vJW3Ss3PTc04w0zT9KWZX+e8YV+wXL/0zDzz7vu+5/x/z3nOc553Vf+7+fioBtVqvzHv3HdMTDkv/BVlsjemftHvj33niui6ZKfjS+u/+gHhh66UY6xKQEy7Jdw7iIysW4gfu1vOwHdlih+95WLwrovj94X/VMaJhy6O3LVx7ZdTjP56nA1bY7yHSICMUAr333QyeM9F93ULLZ8WsqPVQE21he1vmak9nM3n94/wJ78z+niAPG8hTwCDd1z0Xi/GXrMGe7KFmuC9tAUO0TH1DAemn6ZpRg+eyHrq7A1cvPoZV8cGBWTZE8h8RexpJgGdF20cvl5KdXsuzt0atnqM1BrdvBlVR/3M/eyc04xnVRX7qpro6+xh8Fg/d76/yY3Hw8qeiEK5MC430RTAJRudIxYKwjbhnF2NNaMQ57Z1uNvWUt2Wg6c9G2ejlh3FW6lJ2oM9oJqm+lpuj53hsNh4dcCk38blJpoEdI0D8kJM2FI24jDnk/+SFeM0G+73dBRl5ZIzw4h5tZ7NGQZMvqW4qnI5+sAmKsyC1BiXm2hPAF0jVtJDNKyNT6XAk4ilUovOx0TJLi3ZcRpKtmcycN9B7x0LWWmp2MuyOfmoQilh7wCXbSTPSyZalYzemshGdyoxPispqdeQtiIRV30mQw8qGHpYQY5+JUWODIYfVXoP6P7azoKXI9AZYtHpl1PZ/DoR6kjsu9JJXL6Usrd1nP15Gy3nzISLcRvL0zn1yO0doPMrG33XSoiMCCNoyizyyxPQmWIIVAVhq0sjNm4h620rcLyTwbzgEPxVgZQ2ahh+6OUK5CB5khuHDWgN0YSGBQuRAFHjk9hUu5rI6Ln4qHyZFjCVmKRwtuxM4eDlYo7ednkPkCd56MdKJaqebxw0DG3AUpdC04cmXC0aXK1a3v9iCwO3nJz4oUIRfy6AXEHzR4U0nTb9A5MNcO/ZQkXw+L1yZZ/6Rh303yhVml/f1RI6L3oBkJNcrRpmz59OSHigSMsqJfLwJUHKfYEnidZPipg8xQ+9K453zxYov41vJAiY8xmAyf5KN41ND8XWkEbNoRyiEudQsC2RiKVBVLVnYnAn0HgynynT1KToI5WU+fq/QI4jliOiQT4T0H7eytKV8/B0ZrNXpCl00Uzaz1uI14UTET1LRG9m9wdG5i6cQVLWArTmJYRFzWRdsZeAAxesLBGA6q5sWkQqpGjFPi07+9ejL4tjUXwI9cfylGtK3muEiQBW5b5KpmWZFwC1v7IHawoXE5MaSpphEavXR5Inci1BeeUrWBgTrMAiooPYUBGvpFOOW1OwmIFvnwnwG+u94kCuQrc5mgxTFM0fm5X2LcXTjVFK/veLEpWb3TCUr6zU3aZTGqEc99+A8W9yr6j9vtESesVqDo4Uo5xueS+e91wppkOUo3wuS7d7RLgoWflOzpUa43IT7fn+VTzdpcbfairVX4mJL2AKc2ytAAAAAElFTkSuQmCC
- false
- 3d6bcf60-ab08-4bf3-a3ae-aff87b6648db
- false
- true
- Gismo_OSM 3D
- OSM3D
-
10958
1358
236
244
-
11088
1480
- 12
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 5
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- true
- Plug in the shapes from the Gismo OSM shapes "shapes" output
- 7608a5fc-50cf-401e-8c47-61cc61188484
- _shapes
- _shapes
- true
- 2
- true
- 34262690-63f7-48ad-99f9-c08ae3fe5f82
- 1
- c37956f4-d39c-49c7-af71-1e87f8031b26
-
10960
1360
113
20
-
11018
1370
- 1
- true
- Plug in the keys from the Gismo OSM shapes "keys" output.
- 81ad9db6-b55e-4604-8a37-0410964cd2fa
- _keys
- _keys
- true
- 1
- true
- 8ba81b83-17fb-4453-be8a-03f1f28c83ce
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10960
1380
113
20
-
11018
1390
- 2
- true
- Plug in the values from the Gismo OSM shapes "values" output.
- 074f4741-1959-4131-b8aa-2fa9e06e3110
- _values
- _values
- true
- 2
- true
- 48c344ec-645b-4343-8618-329c86d9d99d
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10960
1400
113
20
-
11018
1410
- 2
- true
- Use this input to define lists of Open Street Map ids. "OSM ids" component will generate them.
These lists can be used to define:
1) only those ids which will be included (isolated) when "OSM 3D" component is ran (use "osm_id_Only" and "osm_way_id_Only" inputs for this).
2) ids which will be removed when "OSM 3D" component is ran (use "osm_id_Remove" and "osm_way_id_Remove" inputs for this).
3) you can combine 1) and 2) and both define the: included and removed ids.
-
If nothing supplied to this input, then no OSM ids will be isolated nor removed: meaning all of them will be included.
- 6a32a873-bdbd-40cb-8cfb-f69198f7145d
- onlyRemove_Ids_
- onlyRemove_Ids_
- true
- 2
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10960
1420
113
20
-
11018
1430
- true
- Script variable OSM3D
- a05f88a5-e4df-466a-9f59-fbec505ec8a9
- ________________
- ________________
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10960
1440
113
20
-
11018
1450
- true
- Some supplied "_shapes" may contain "building_l" keys. This can be used to extrude those buildings, by supplying the height value of each level (above ground) in Rhino document units (meters, feets...).
-
If nothing supplied, the default value of 3 meters (9.84 feets) per level will be used.
-
In Rhino document units (meters, feets...).
- 4625601c-235c-45e7-9046-42d4c4dcd701
- heightPerLevel_
- heightPerLevel_
- true
- 0
- true
- 0
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
10960
1460
113
20
-
11018
1470
- true
- This output can be useful if supplied "_shapes" do not contain valid values for "height" and "building_l" keys.
If they still contain the "building" key with value "True", then this can be used to extrude the shapes, by using some random extrude domain.
So to randomly extrude "buildings" shapes, just supply the "Construct Domain" to the randomHeightRange_ input. For example, input the "Construct Domain" component by using "20" and "30" as its starting and ending domain values. This will randomly extrude all buildings by 20 to 30 meters height. Of course in case the Rhino document units is: meters. It can be any other unit.
-
If nothing supplied, no random extrusion of the shapes will be applied.
-
Domain in Rhino document units (meters, feets...).
- c1514503-6787-4820-ab52-8b61ba8acb5f
- randomHeightRange_
- randomHeightRange_
- true
- 0
- true
- 4ce4a5a6-e6a4-4566-9f23-75563fa5a30d
- 1
- 589748aa-e558-4dd9-976f-78e3ab91fc77
-
10960
1480
113
20
-
11018
1490
- true
- There are three tree geometric types:
0 - round
1 - polygonized
2 - random shaped
-
If nothing supplied, the default type 2 type (random) will be used.
-
Integer.
- 86f2f5b2-747f-4610-9553-bc3795db1a1b
- treeType_
- treeType_
- true
- 0
- true
- 0
- 48d01794-d3d8-4aef-990e-127168822244
-
10960
1500
113
20
-
11018
1510
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 2
- true
- The ground terrain surface on which the "threeDeeShapes" will be laid onto.
Supply it by using "terrain" output of the Ladybug "Terrain Generator" (type_ = 1) or Gismo "Terrain Generator" (type_ = 2 or type_ = 3) components.
-
If nothing supplied, the "threeDeeShapes" will always be laid flat onto a horizontal plane, with plane origin being the "origin" input of the "OSM shapes" component.
- 773e86f7-24e7-45ea-9161-8562b41fb101
- groundTerrain_
- groundTerrain_
- true
- 0
- true
- e48771cf-7cac-43eb-9574-580fe2ae3552
- 1
- 2ceb0405-fdfe-403d-a4d6-8786da45fb9d
-
10960
1520
113
20
-
11018
1530
- true
- Script variable Python
- 2f121b82-c7fc-4ffa-b594-9025798630a5
- ________________
- ________________
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10960
1540
113
20
-
11018
1550
- true
- Set to "True" to bake the extruded _shape geometry into the Rhino scene.
The geometry will be grouped. To ungroup it, select it and call the "Ungroup" Rhino command.
-
If not supplied default value "False" will be used.
- ba410ab1-19d6-4a63-8f06-cfabd13992a9
- bakeIt_
- bakeIt_
- true
- 0
- true
- 0
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
10960
1560
113
20
-
11018
1570
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- true
- ...
- 20937095-31b2-4475-8d6b-7848c54b6513
- _runIt
- _runIt
- true
- 0
- true
- ad12a014-f45d-4fa7-b566-e67f5ece9c48
- 1
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
10960
1580
113
20
-
11018
1590
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- ...
- dc9c0c69-98a6-4cf4-bd78-8e68003b5ec5
- out
- out
- false
- 0
-
11103
1360
89
48
-
11147.5
1384
- Generated 3d shapes from the inputted "_shapes".
-
Those can be extruded buildings, or trees.
- dab3ff5e-8f5f-4859-89a5-91141c7f6b13
- threeDeeShapes
- threeDeeShapes
- false
- 0
-
11103
1408
89
48
-
11147.5
1432
- A list of keys. This output is the same as "keys" output of "OSM shapes" component.
- 9f0d2f9a-cb01-465a-9fbd-b5bad31f3174
- threeDeeKeys
- threeDeeKeys
- false
- 0
-
11103
1456
89
48
-
11147.5
1480
- Values corresponding to each shape in "threeDeeValues" output.
-
If 3d shape has not been created then that branch will not have any values (it will be empty).
Use "Clean Tree" component and set the "E" input to "True" to remove all these empty branches.
- 98c6ec01-7a3c-4f75-b9f7-2a900b962ed5
- threeDeeValues
- threeDeeValues
- false
- 0
-
11103
1504
89
48
-
11147.5
1528
- The height of each shape from the "threeDeeShapes" output.
-
In Rhino document units (meters, feets...).
- 2f255250-6492-4a4c-8d27-ce92347b1514
- height
- height
- false
- 0
-
11103
1552
89
48
-
11147.5
1576
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Rhino Unit To Meters
- # Rhino unit to meters
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
input:
_valueRhinoUnit: A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
output:
unitFactor: Unit conversion factor.
-
Unitless.
valueMeters: _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
"""
ghenv.Component.Name = "Gismo_Rhino Unit To Meters"
ghenv.Component.NickName = "RhinoUnitToMeters"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "3 | More"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "2"
except: pass
import scriptcontext as sc
import Grasshopper
def main(valueRhinoUnit):
# check inputs
if (valueRhinoUnit == None):
unitConversionFactor = valueMeters = None
validInputData = False
printMsg = "Please add a number to \"_valueRhinoUnit\" input."
return unitConversionFactor, valueMeters, validInputData, printMsg
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
valueMeters = valueRhinoUnit * unitConversionFactor
validInputData = True
printMsg = "ok"
return unitConversionFactor, valueMeters, validInputData, printMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_preparation = sc.sticky["gismo_Preparation"]()
unitFactor, valueMeters, validInputData, printMsg = main(_valueRhinoUnit)
if not validInputData:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
-
-9
-9
-
550
575
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEdElEQVRIS+1Te1BUZRy9e3eXXV4KLctjeYokSU0SYEhQ5MDAJo81o2F4JEK2YxCvEZZHw0g2PXiojYAMMwHlxIQGyFMxEGwTBOw5mGOKUfLQIRRtbJJ09/S7966TpdT0X810Zs5893zf73fO97t7l/kf/37k5+erCgsLc3Q6XU9ubu653JysmYwM7fnU1NQjiYmJeREREa6m0n+GzMxMWUlJyc6iQt31+qosDHdsxcRgAi6e2ITz/Ruhb96Iyh0aPKuJvBEaGlrm5ORkYWr9e2i1WruCggJ9dcUrmB1NBb5/DpjUAN8RJ2OBCzHARDS/XtKrsX3rWnh5eY0pFAqVyWJpJCcnW2ZnZx9vqt1GhonAt9EwnovC/HA4BhvWomW3L0aaAnHjVBhwNgI4HU5rJPbofMGy7ChZ2ApOS4Buv7u6bCuZx1NzJBZGw5C3xQMqpew2yzLfUMkxlhWNuzvLb72d6YnFz54CPn8SOLMeuUkeoPM63uh+iI+PX/1yWsLPcyNkPh6OhaFQPBOi4JpGiKFElqsjiIhPEPVJajssDgUCY4G4OrAOrk5mv9K+P1d0DzQazesNlWR+lsYeD0XeZhfO/CTRmi+4F+bEgfIMZxjH/GgSP5S+6Mj17OFP/wy1Wj00eiAK+DoYl3sD4GJvZqRt7qZLQiqV+q5UyRavdXsDww9jpJZ/TV8S70wrICUlxSbx+U2XZ3vpnX7xOD6tXUU/muiU6fgvERAQoB+p9gD0Xphv9YDCUrxA247CKSE9PT2Mvpy9aZtjFn/qo1HH1mC4xhNisXiCmovpP1GakZFxX+bk5BTHxcWd0b/jAwy64WaHC3zcZbfs7OxqlUplJB+wJSVp4t234nCyPpiKfGDs98bNow/hwx0Pou7VQDRXxqK5IkZgebSJUWgu24AP3lCjvSwIv3R4Ap0OQLc9hisd8GaaM8zFokk+YH1I0NR01yPA0Crc7vWE4cgKIo18fAXwCbe6U7ArMOBCdAaOqYB+J6CPDPvsgaNKGA8pYGy1hbHFBjhsi9mm5bCUimb4gJDgdVNTTSup0A2GbhcYupxh6FTB2EMmHzvBeNgBhnYlDIfsYGzjKJihg9htQ3oZjAc5WhMtgRZLzNSa3x0QOHVxvxvQ4wj00q166FadSkzXP4AN/mZo3m4FdJFZ23IyJLYuA9qt0a6TI2KNGBeq5GRqTqS1jXjADLM1UgpghICnKWC6kW7brcDATmt8tYsMem3QVWTBfXJIDJFQgBWuv2+B9nwZrjaQSacc2jAxf34wS0zTSHG6XIL+InpuFuNSFfvHgLn99vjxPSvIpAz8PFmawgo9xTJTADX1yVH3koTXu17gtBTacJEQkC2iQBYh3gyvf9jLYL6O+T3gsUe9p8Yr5DjxmmDo6SDC7D4zNG4TDDX+IlxrFKM4luV1jprTIiQECYb7UhjM1TBYrRJ0fwGD0VIGFhJTgEjENNHNr0iEjRnSM1J6vqPFrEmLBc2tnOb279ZcH6/pWSZhrtDzR8T/NBjmN0aOq/3lKvIVAAAAAElFTkSuQmCC
- false
- 6bcfff72-eba3-4876-9f3e-704b12376eb6
- false
- true
- Gismo_Rhino Unit To Meters
- RhinoUnitToMeters
-
10492
1422
188
44
-
10594
1444
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
- cc9c9838-4e89-487b-a06b-125de1afe02e
- _valueRhinoUnit
- _valueRhinoUnit
- true
- 0
- true
- fda80060-008c-416a-b885-dc25942175d3
- 1
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
10494
1424
85
40
-
10538
1444
- Unit conversion factor.
-
Unitless.
- 10c23207-d0d6-4e62-be00-4e274a62bcaa
- unitFactor
- unitFactor
- false
- 0
-
10609
1424
69
20
-
10643.5
1434
- _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
- 8e323306-dfcf-4042-b666-056889aa267e
- valueMeters
- valueMeters
- false
- 0
-
10609
1444
69
20
-
10643.5
1454
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- 73232f19-277e-48c5-8803-cf3712836cbd
- Construct Domain
- Construct Domain
-
10765
1464
152
44
-
10852
1486
- Start value of numeric domain
- 3ef7c2d7-5021-4704-a91c-9509cd1c5926
- Domain start
- Domain start
- false
- 8e323306-dfcf-4042-b666-056889aa267e
- 1
-
10767
1466
70
20
-
10803.5
1476
- 1
- 1
- {0}
- 0
- End value of numeric domain
- 3489c9c9-615d-42ce-a682-90d47b859b9c
- Domain end
- Domain end
- false
- e4ca9239-7f02-4b08-8a71-e33afe452819
- 1
-
10767
1486
70
20
-
10803.5
1496
- 1
- 1
- {0}
- 1
- Numeric domain between {A} and {B}
- 4ce4a5a6-e6a4-4566-9f23-75563fa5a30d
- Domain
- Domain
- false
- 0
-
10867
1466
48
40
-
10891
1486
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Rhino Unit To Meters
- # Rhino unit to meters
#
# Gismo is a plugin for GIS environmental analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2019, Djordje Spasic <djordjedspasic@gmail.com>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
input:
_valueRhinoUnit: A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
output:
unitFactor: Unit conversion factor.
-
Unitless.
valueMeters: _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
"""
ghenv.Component.Name = "Gismo_Rhino Unit To Meters"
ghenv.Component.NickName = "RhinoUnitToMeters"
ghenv.Component.Message = "VER 0.0.3\nJAN_29_2019"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "3 | More"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "2"
except: pass
import scriptcontext as sc
import Grasshopper
def main(valueRhinoUnit):
# check inputs
if (valueRhinoUnit == None):
unitConversionFactor = valueMeters = None
validInputData = False
printMsg = "Please add a number to \"_valueRhinoUnit\" input."
return unitConversionFactor, valueMeters, validInputData, printMsg
unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits()
valueMeters = valueRhinoUnit * unitConversionFactor
validInputData = True
printMsg = "ok"
return unitConversionFactor, valueMeters, validInputData, printMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_preparation = sc.sticky["gismo_Preparation"]()
unitFactor, valueMeters, validInputData, printMsg = main(_valueRhinoUnit)
if not validInputData:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to convert values from Rhino units to meters. This can be useful for Gismo component's "radius_" inputs, as all of them use values in meters, regardless of what the Rhino units have been set at.
-
Provided by Gismo 0.0.3
-
-9
-9
-
550
575
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAEdElEQVRIS+1Te1BUZRy9e3eXXV4KLctjeYokSU0SYEhQ5MDAJo81o2F4JEK2YxCvEZZHw0g2PXiojYAMMwHlxIQGyFMxEGwTBOw5mGOKUfLQIRRtbJJ09/S7966TpdT0X810Zs5893zf73fO97t7l/kf/37k5+erCgsLc3Q6XU9ubu653JysmYwM7fnU1NQjiYmJeREREa6m0n+GzMxMWUlJyc6iQt31+qosDHdsxcRgAi6e2ITz/Ruhb96Iyh0aPKuJvBEaGlrm5ORkYWr9e2i1WruCggJ9dcUrmB1NBb5/DpjUAN8RJ2OBCzHARDS/XtKrsX3rWnh5eY0pFAqVyWJpJCcnW2ZnZx9vqt1GhonAt9EwnovC/HA4BhvWomW3L0aaAnHjVBhwNgI4HU5rJPbofMGy7ChZ2ApOS4Buv7u6bCuZx1NzJBZGw5C3xQMqpew2yzLfUMkxlhWNuzvLb72d6YnFz54CPn8SOLMeuUkeoPM63uh+iI+PX/1yWsLPcyNkPh6OhaFQPBOi4JpGiKFElqsjiIhPEPVJajssDgUCY4G4OrAOrk5mv9K+P1d0DzQazesNlWR+lsYeD0XeZhfO/CTRmi+4F+bEgfIMZxjH/GgSP5S+6Mj17OFP/wy1Wj00eiAK+DoYl3sD4GJvZqRt7qZLQiqV+q5UyRavdXsDww9jpJZ/TV8S70wrICUlxSbx+U2XZ3vpnX7xOD6tXUU/muiU6fgvERAQoB+p9gD0Xphv9YDCUrxA247CKSE9PT2Mvpy9aZtjFn/qo1HH1mC4xhNisXiCmovpP1GakZFxX+bk5BTHxcWd0b/jAwy64WaHC3zcZbfs7OxqlUplJB+wJSVp4t234nCyPpiKfGDs98bNow/hwx0Pou7VQDRXxqK5IkZgebSJUWgu24AP3lCjvSwIv3R4Ap0OQLc9hisd8GaaM8zFokk+YH1I0NR01yPA0Crc7vWE4cgKIo18fAXwCbe6U7ArMOBCdAaOqYB+J6CPDPvsgaNKGA8pYGy1hbHFBjhsi9mm5bCUimb4gJDgdVNTTSup0A2GbhcYupxh6FTB2EMmHzvBeNgBhnYlDIfsYGzjKJihg9htQ3oZjAc5WhMtgRZLzNSa3x0QOHVxvxvQ4wj00q166FadSkzXP4AN/mZo3m4FdJFZ23IyJLYuA9qt0a6TI2KNGBeq5GRqTqS1jXjADLM1UgpghICnKWC6kW7brcDATmt8tYsMem3QVWTBfXJIDJFQgBWuv2+B9nwZrjaQSacc2jAxf34wS0zTSHG6XIL+InpuFuNSFfvHgLn99vjxPSvIpAz8PFmawgo9xTJTADX1yVH3koTXu17gtBTacJEQkC2iQBYh3gyvf9jLYL6O+T3gsUe9p8Yr5DjxmmDo6SDC7D4zNG4TDDX+IlxrFKM4luV1jprTIiQECYb7UhjM1TBYrRJ0fwGD0VIGFhJTgEjENNHNr0iEjRnSM1J6vqPFrEmLBc2tnOb279ZcH6/pWSZhrtDzR8T/NBjmN0aOq/3lKvIVAAAAAElFTkSuQmCC
- false
- fe2b1e23-d53e-4f90-baa4-2de75691b046
- false
- true
- Gismo_Rhino Unit To Meters
- RhinoUnitToMeters
-
10492
1507
188
44
-
10594
1529
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- A number in Rhino units, which you would like to convert to meters.
-
In Rhino document units.
- 2d080036-1aa9-4533-aef6-f54c2175d325
- _valueRhinoUnit
- _valueRhinoUnit
- true
- 0
- true
- b8ea3920-4761-40ad-9d11-4e507eddf65c
- 1
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
10494
1509
85
40
-
10538
1529
- Unit conversion factor.
-
Unitless.
- f375c4b6-2441-4d3f-89fa-ec18c2df536a
- unitFactor
- unitFactor
- false
- 0
-
10609
1509
69
20
-
10643.5
1519
- _valueRhinoUnit number converted to meters.
It equals: _valueRhinoUnit * unitFactor
-
In meters.
- e4ca9239-7f02-4b08-8a71-e33afe452819
- valueMeters
- valueMeters
- false
- 0
-
10609
1529
69
20
-
10643.5
1539
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- Gismo_Terrain Generator
- # terrain generator
#
# Gismo is a plugin for GIS Environmental Analysis (GPL) started by Djordje Spasic.
#
# This file is part of Gismo.
#
# Copyright (c) 2021, Djordje Spasic <djordjedspasic@gmail.com>
# with assistance of Dr. Bojan Savric <savricb@geo.oregonstate.edu>
# Gismo is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# Gismo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
#
# The GPL-3.0+ license <http://spdx.org/licenses/GPL-3.0+>
"""
Use this component to create a geometry of the terrain surrounding the chosen location.
Terrain will be created with ALOS 1 arc-second (20 to 30 meters depending on the latitude) grid precision.
-
Component requires that you are connected to the Internet, as it has to download the topography data.
It also requires MapWinGIS application to be installed.
Download and install either 32 bit or 64 bit (depending on your Rhino 5 version) version of MapWinGIS from here:
https://github.com/MapWindow/MapWinGIS/releases
-
Component mainly based on:
"Mathematical cartography", V. Jovanovic, VGI 1983.
"Vincenty solutions of geodesics on the ellipsoid" article by Chris Veness
https://books.google.rs/books/about/Matemati%C4%8Dka_kartografija.html?id=GcXEMgEACAAJ&redir_esc=y
http://www.movable-type.co.uk/scripts/latlong-vincenty.html
-
Provided by Gismo 0.0.3
input:
_location: The output from the "importEPW" or "constructLocation" component. This is essentially a list of text summarizing a location on the Earth.
-
"timeZone" and "elevation" data from the location, are not important for the creation of a terrain.
radius_: Horizontal distance to which the surrounding terrain will be taken into account.
-
It can not be shorter than 20 meters or longer than 100 000 meters.
-
The component itself might inform the user to alter the initial radius_ inputted by the user.
This is due to restriction of topography data, being limited to 56 latitude South to 60 latitude North range. If radius_ value for chosen location gets any closer to the mentioned range, the component will inform the user to shrink it for a certain amount, so that the radius_ stops at the range limit.
-
If not supplied, default value of 100 meters will be used.
-
In meters.
source_: There are currently three terrain sources available:
-
0 - SRTMGL1: only terrain from -55.9 to 59.9 latitude! Terrain ends at the sea level (no sea/river/lake floor terrain). Terrain resolution varies from 20 to 30 meters.
1 - AW3D30: only terrain! Terrain ends at the sea level (no sea/river/lake floor terrain). Terrain resolution varies from 20 to 30 meters.
2 - GMRT: terrain and underwater (sea/river/lake floor) terrain. Sea level is not presented. Terrain and underwater terrain resolution varies from 50 meter to 2000 meters.
-
If nothing supplied, 0 will be used as a default (SRTMGL1 terrain only).
type_: There are four terrain types:
-
0 - terrain will be created as a mesh with rectangular edges
1 - terrain will be created as a mesh with circular edges
2 - terrain will be created as a surface with rectangular edges
3 - terrain will be created as a surface with circular edges
-
If nothing supplied, 1 will be used as a default (terrain will be created as a mesh with circular edges).
origin_: Origin for the final "terrain" output.
-
If not supplied, default point of (0,0,0) will be used.
north_: Input a vector to be used as a true North direction, or a number between 0 and 360 that represents the clockwise degrees off from the Y-axis.
-
If not supplied, default North direction will be set to the Y-axis (0 degrees).
standThickness_: Thickness of the stand.
A stand is a basically a base constructed below the terrain mesh/surface. It can be used to create a terrain for cfd analysis or visualization purposes.
-
If not supplied, default value of 0 (no stand will be created) will be used.
-
In Rhino document units.
numOfContours_: Number of elevation contours.
If you would not like the elevationContours output to be calculated, set the numOfContours_ input to 0.
-
If not supplied, default value of 10 elevation contours will be used.
legendBakePar_: In case your type_ input is set to 0 or 1, you can use the legendBakePar_ input to control the colors with which the final "terrain" mesh will be colored with based on elevation.
Use Gismo "Legend Bake Parameters" component's "customColors_" input to control these colors.
Also use its fontName_ and fontSize_ inputs to change the font, size of the "title" output.
bakeIt_: Set to "True" to bake the terrain geometry into the Rhino scene.
-
If not supplied default value "False" will be used.
_runIt: !!! ATTENTION !!! This component may crash Rhino 5 application if radius_ input is set to a value of tens of thousands of meters! This may happen due to Rhino's inability to create such large terrains.
To prevent this, it is suggested to own a 64 bit version of Rhino 5 and have strong enough PC configuration. If you do not have either of these two, it is recommended to save your .gh definition before running this component!
output:
readMe!: ...
terrain: The geometry of the terrain.
-
Depening on the type_ input it will be either a mesh (type_ = 0 and 1) or a surface (type_ = 2 and 3)
origin: The origin (center) point of the "terrain" geometry. It's the same as "origin_" input point.
-
Use grasshopper's "Point" parameter to visualize it.
-
Use this point to move the "terrain" geometry around in the Rhino scene with grasshopper's "Move" component.
elevation: Elevation of the origin_ input.
-
In Rhino document units.
elevationContours: Elevation contours.
Their number is defined by the numOfContours_ input. Set the numOfContours_ input to 0, if you would not like the elevationContours to be created.
title: Title geometry with information about location, radius, north angle.
"""
ghenv.Component.Name = "Gismo_Terrain Generator"
ghenv.Component.NickName = "TerrainGenerator"
ghenv.Component.Message = "VER 0.0.3\nMAY_05_2021"
ghenv.Component.IconDisplayMode = ghenv.Component.IconDisplayMode.application
ghenv.Component.Category = "Gismo"
ghenv.Component.SubCategory = "2 | Terrain"
#compatibleGismoVersion = VER 0.0.3\nJAN_29_2019
try: ghenv.Component.AdditionalHelpFromDocStrings = "1"
except: pass
import Grasshopper.Kernel as gh
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Grasshopper
import datetime
import System
import urllib
import Rhino
import time
import math
import clr
import os
import gc
def checkInputData(locationLatitudeD, maxVisibilityRadiusM, gridSize, source, _type, origin, north, standThickness, numOfContours, downloadTSVLink):
# check if MapWinGIS is properly installed
gismoGismoComponentNotRan = False # initial value
if sc.sticky.has_key("gismo_mapwingisFolder"):
mapFolder_ = sc.sticky["gismo_mapwingisFolder"]
iteropMapWinGIS_dll_folderPath, gdalDataPath_folderPath, validInputData, printMsg = gismo_mainComponent.mapWinGIS(mapFolder_)
if not validInputData:
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
if sc.sticky.has_key("MapWinGIS"):
global MapWinGIS
import MapWinGIS
else:
gismoGismoComponentNotRan = True
else:
gismoGismoComponentNotRan = True
if (gismoGismoComponentNotRan == True):
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "The \"Gismo Gismo\" component has not been run. Run it before running this component."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
# check inputs
if (source == None):
source = 0 # default
sourceLabel = "SRTMGL1" # default
elif (source == 0):
# SRTM 1 arc second: only terrain
sourceLabel = "SRTMGL1"
elif (source == 1):
# ALOS 1 arc second (AW3D30): only terrain
sourceLabel = "AW3D30"
elif (source == 2):
# GMRT from 10 meter (0.33 arc-second) to 2000 meter (66.66 arc second): terrain and underwater terrain
sourceLabel = "GMRT"
elif (source < 0) or (source > 2):
source = 0
sourceLabel = "SRTMGL1"
print "source_ input only supports values 0 to 2.\n" + \
"source_ input set to 0 (SRTMGL1 = terrain only)."
if (_type == None): # "type" is a reserved python word. Use "_type" instead
_type = 1 # default
typeLabel = "mesh-circular" # default
if (_type == 0):
typeLabel = "mesh-rectangular"
elif (_type == 1):
typeLabel = "mesh-circular"
elif (_type == 2):
typeLabel = "surface-rectangular"
elif (_type == 3):
typeLabel = "surface-circular"
elif (_type < 0) or (_type > 3):
_type = 0
typeLabel = "mesh-rectangular"
print "type_ input only supports values 0 to 3.\n" + \
"type_ input set to 0 (mesh-rectangular)."
if (origin == None):
origin = Rhino.Geometry.Point3d(0, 0, 0)
# send the origin of this component ("Terrain Generator") to sc.sticky, in order for it be used in the "OSM search" component
if (standThickness == None):
standThickness = 0 # no stand will be created
elif (standThickness < 0):
standThickness = 0
print "standThickness_ input can not be lower than 0. It can only be either 0 (no stand) or higher.\n" + \
"standThickness_ input set to 0 (no stand)."
if (numOfContours == None):
numOfContours = 10 # default
elif (numOfContours < 0):
numOfContours = 0
print "numOfContours_ input can not be lower than 0. It can only be either 0 (no elevation contours created) or higher.\n" + \
"numOfContours_ input set to 0 (no elevation contours will be created)."
if (maxVisibilityRadiusM == None):
maxVisibilityRadiusM = 200 # default in meters
elif (maxVisibilityRadiusM >= 20) and (maxVisibilityRadiusM < 200):
maxVisibilityRadiusM = 200 # values less than 150m can download invalid .tif file from opentopography.org. So the .tif file will always be downloaded with the minimal radius of 200 meters
elif (maxVisibilityRadiusM < 20):
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "radius_ input only supports values equal or larger than 20 meters."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
elif (maxVisibilityRadiusM > 100000):
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "Radii longer than 100 000 meters (100 kilometers) are not supported, due to possibility of crashing the Rhino.\n" + \
" \n" + \
"ATTENTION!!! Have in mind that even radii of a couple of thousands of meters may require stronger PC configurations and 64 bit version of Rhino 5. Otherwise Rhino 5 may crash."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
#arcAngleD = math.degrees( math.atan( maxVisibilityRadiusM / (6371000+elevation) ) ) # assumption of Earth being a sphere
#arcLength = (arcAngleD*math.pi*R)/180
# correction of maxVisibilityRadiusM length due to light refraction can not be calculated, so it is assumed that arcLength = maxVisibilityRadiusM. maxVisibilityRadiusM variable will be used from now on instead of arcLength.
if (source == 0) and ((locationLatitudeD < -55.9) or (locationLatitudeD > 59.9)):
# SRTMGL1 is limited to -56 to 60 latitude
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "The \"source_ = 0\" input (SRTMGL1) has range limits: from -55.9 South to 59.9 North latitude.\n" + \
"Defined \"_location\" exceeds these limits.\n" + \
"Try using either \"source_ = 1\" input or \"source_ = 2\" inputs, which have higher range limits (both from -82 South to 82 North latitude)."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
if (source == 1) and ((locationLatitudeD < -82) or (locationLatitudeD > 82)):
# AW3D30 is limited to -82 to 80 latitude
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "The \"source_ = 1\" input (SRTMGL1) has range limits: from -82 South to 82 North latitude.\n" + \
"Defined \"_location\" exceeds these limits.\n" + \
"For now, no other Gismo \"source_\" supports latitude beyond this."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
if (source == 2) and ((locationLatitudeD < -82) or (locationLatitudeD > 82)):
# GMRT is limited to -82 to 80 latitude
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "The \"source_ = 2\" input (GMRT) has range limits: from -82 South to 82 North latitude.\n" + \
"Defined \"_location\" exceeds these limits.\n" + \
"For now, no other Gismo \"source_\" supports latitude beyond this."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
if (north == None):
northRad = 0 # default, in radians
northVec = Rhino.Geometry.Vector3d(0,1,0)
else:
try: # check if it's a number
north = float(north)
if north < 0 or north > 360:
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "Please input north angle value from 0 to 360."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
except Exception, e: # check if it's a vector
north.Unitize()
northRad, northVec = gismo_preparation.angle2northClockwise(north)
northVec.Unitize()
northDeg = int(360-math.degrees(northRad))
if northDeg == 360: northDeg = 0
# there is no workingFolder_ input. So files will always be saved to "Gismo Gismo"'s gismoFolder_
gismoFolderPath = sc.sticky["gismo_gismoFolder"]
workingSubFolderPath = os.path.join(gismoFolderPath, "terrain_files")
folderCreatedSuccess = gismo_preparation.createFolder(workingSubFolderPath)
if folderCreatedSuccess == False:
maxVisibilityRadiusM = gridSize = source = sourceLabel = _type = typeLabel = origin = northRad = northDeg = standThickness = numOfContours = workingSubFolderPath = downloadTSVLink = unitConversionFactor = unitConversionFactor2 = None
validInputData = False
printMsg = "The file path you added to \"gismoFolder_\" input of Gismo Gismo component is invalid.\n" + \
"Input the string in the following format (example): c:\someFolder\gismo.\n" + \
"Or do not input anything, in which case a default Gismo folder will be used instead: C:\gismo."
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
if downloadTSVLink == None:
downloadTSVLink = "https://raw.githubusercontent.com/stgeorges/terrainShadingMask/master/objFiles/0_terrain_shading_masks_download_links.tsv"
#unitConversionFactor, unitSystemLabel = gismo_preparation.checkUnits() # factor to convert Rhino document units to meters.
unitConversionFactor = 1 # unitConversionFactor is always fixed to "1" to avoid problems when .obj files are exported from Rhino document (session) in one Units, and then imported in some other Rhino document (session) with different Units
unitConversionFactor2, unitSystemLabel = gismo_preparation.checkUnits()
validInputData = True
printMsg = "ok"
return maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg
def distanceBetweenTwoPoints(latitude1D, longitude1D, maxVisibilityRadiusM):
# "Distance/bearing between two points (inverse solution)" by Vincenty solution
# based on JavaScript code made by Chris Veness
# http://www.movable-type.co.uk/scripts/latlong-vincenty.html
# setting the latitude2D, longitude2D according to ALOS latitude range boundaries (approx. -82 to 82): http://opentopo.sdsc.edu/raster?opentopoID=OTALOS.112016.4326.2
if latitude1D >= 0:
# northern hemishere:
latitude2D = 82
elif latitude1D < 0:
# southern hemishere:
latitude2D = -82
longitude2D = longitude1D
# for WGS84:
a = 6378137 # equatorial radius, meters
b = 6356752.314245 # polar radius, meters
f = 0.00335281066474 # flattening (ellipticity, oblateness) parameter = (a-b)/a, dimensionless
latitude1R = math.radians(latitude1D)
latitude2R = math.radians(latitude2D)
longitude1R = math.radians(longitude1D)
longitude2R = math.radians(longitude2D)
L = longitude2R - longitude1R
tanU1 = (1-f) * math.tan(latitude1R)
cosU1 = 1 / math.sqrt((1 + tanU1*tanU1))
sinU1 = tanU1 * cosU1
tanU2 = (1-f) * math.tan(latitude2R)
cosU2 = 1 / math.sqrt((1 + tanU2*tanU2))
sinU2 = tanU2 * cosU2
longitudeR = L
longitudeR_ = 0
for i in range(100):
sinLongitudeR = math.sin(longitudeR)
cosLongitudeR = math.cos(longitudeR)
sinSqSigma = (cosU2*sinLongitudeR) * (cosU2*sinLongitudeR) + (cosU1*sinU2-sinU1*cosU2*cosLongitudeR) * (cosU1*sinU2-sinU1*cosU2*cosLongitudeR)
sinSigma = math.sqrt(sinSqSigma)
cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLongitudeR
sigma = math.atan2(sinSigma, cosSigma)
sinBearingAngleR = cosU1 * cosU2 * sinLongitudeR / sinSigma
cosSqBearingAngleR = 1 - sinBearingAngleR*sinBearingAngleR
if cosSqBearingAngleR == 0:
# if distanceM is measured along the equator line (latitude1D = latitude2D = 0, longitude1D != longitude2D != 0)
cos2SigmaM = 0
else:
cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqBearingAngleR
C = f/16*cosSqBearingAngleR*(4+f*(4-3*cosSqBearingAngleR))
longitudeR_ = longitudeR
longitudeR = L + (1-C) * f * sinBearingAngleR * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)))
uSq = cosSqBearingAngleR * (a*a - b*b) / (b*b)
A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)))
B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)))
deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM) - B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)))
distanceM = b*A*(sigma-deltaSigma) # in meters
bearingAngleForwardR = math.atan2(cosU2*sinLongitudeR, cosU1*sinU2-sinU1*cosU2*cosLongitudeR)
bearingAngleReverseR = math.atan2(cosU1*sinLongitudeR, -sinU1*cosU2+cosU1*sinU2*cosLongitudeR)
bearingAngleForwardD = math.degrees(bearingAngleForwardR)
bearingAngleReverseD = math.degrees(bearingAngleReverseR)
if latitude1D >= 0:
SRTMlimit = "82 North"
elif latitude1D < 0:
SRTMlimit = "-82 South"
if distanceM < 200:
correctedMaskRadiusM = "dummy"
validVisibilityRadiusM = False
printMsg = "This component dowloads free topography data from opentopography.org in order to create a terrain for the chosen _location.\n" + \
"But mentioned free topography data has limits: from -82 South to 82 North latitude.\n" + \
"The closer the location is to upper mentioned boundaries, the inputted \"radius_\" value may have be shrank to make sure that the boundaries are not exceeded.\n" + \
"In this case the _location you chose is very close (less than 200 meters) to the %s latitude boundary.\n" % SRTMlimit + \
"It is not possible to create a terrain for locations less than 200 meters close to mentioned boundary, as this _location is.\n" + \
"Try using the Ladybug \"Terrain Generator\" component instead."
else:
# shortening the maxVisibilityRadiusM according to the distance remained to the ALOS latitude range boundaries (-82 to 82)
if distanceM < maxVisibilityRadiusM:
print "distanceM < maxVisibilityRadiusM: ", distanceM < maxVisibilityRadiusM
print "distanceM, maxVisibilityRadiusM: ", distanceM, maxVisibilityRadiusM
correctedMaskRadiusM = int(distanceM) # int(distanceM) will always perform the math.floor(distanceM)
validVisibilityRadiusM = False
printMsg = "This component downloads free topography data from opentopography.org in order to create a terrain for the chosen _location.\n" + \
"But mentioned free topography data has limits: from -82 South to 82 North latitude.\n" + \
"The closer the location is to upper mentioned boundaries, the inputted \"radius_\" value may have to be shrank to make sure that the boundaries are not exceeded.\n" + \
"In this case the _location you chose is %s meters away from the %s latitude boundary.\n" % (correctedMaskRadiusM, SRTMlimit) + \
" \n" + \
"Please supply the \"radius_\" input with value: %s.\n" % correctedMaskRadiusM
elif distanceM >= maxVisibilityRadiusM:
correctedMaskRadiusM = maxVisibilityRadiusM
validVisibilityRadiusM = True
printMsg = "ok"
return correctedMaskRadiusM, validVisibilityRadiusM, printMsg
def import_export_origin_0_0_0_and_terrainShadingMask_from_objFile(importExportObj, objFilePath, fileNameIncomplete, heightM, minVisibilityRadiusM, maxVisibilityRadiusM, elevationM=None, shadingMaskSrf=None, origin=None):
objFilePath2 = chr(34) + objFilePath + chr(34)
if importExportObj == "importObj":
# import origin_0_0_0, terrainShadingMask from .obj file
sc.doc = Rhino.RhinoDoc.ActiveDoc
commandString = "_-Import %s _Enter" % objFilePath2; echo = False
importObjSuccess = rs.Command(commandString, echo)
terrainShadingMaskUnjoined = []
objIds = rs.LastCreatedObjects(False)
if objIds != None:
for rhinoId in objIds:
obj = sc.doc.Objects.Find(rhinoId).Geometry
if isinstance(obj, Rhino.Geometry.Point):
origin_0_0_0 = Rhino.Geometry.Point3d(obj.Location) # convert Point to Point3d
elif isinstance(obj, Rhino.Geometry.Brep):
terrainShadingMaskUnjoined.append(obj)
rs.DeleteObjects(objIds)
sc.doc = ghdoc
# join brep objects
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
terrainShadingMask = Rhino.Geometry.Brep.MergeBreps(terrainShadingMaskUnjoined,tol) # terrainShadingMask joined
elif objIds == None:
# this happens when a user opened a new Rhino file, while runIt_ input has been set to True. In this case the rs.LastCreatedObjects function returns: None
terrainShadingMask = origin_0_0_0 = None
elif importExportObj == "exportObj":
# export the generated terrain shading mask to .obj file
sc.doc = Rhino.RhinoDoc.ActiveDoc
objIds = []
objs = [shadingMaskSrf, Rhino.Geometry.Point(origin)]
for obj in objs:
objId = sc.doc.Objects.Add(obj)
objIds.append(objId)
rs.SelectObjects(objIds) # select objects for _-Export
commandString = "_-testMakeValidForV2 _Enter" # convert the terrainShadingMaskUnscaledUnrotated from Surface of Revolution to NURBS Surface
commandString2 = "_-Export %s Geometry=NURBS _Enter" % objFilePath2; echo = False
exportObjSuccess = rs.Command(commandString, echo)
exportObjSuccess2 = rs.Command(commandString2, echo)
rs.DeleteObjects(objIds) # delete the objects added to Rhino document, after the _-Export
sc.doc = ghdoc
# change exported .obj file heading
objFileLines = []
myFile = open(objFilePath,"r")
for line in myFile.xreadlines():
objFileLines.append(line)
myFile.close()
locationNameCorrected_latitude_longitude = (fileNameIncomplete.split("_TERRAIN")[0]).replace("_"," ")
nowUTC = datetime.datetime.utcnow() # UTC date and time
UTCdateTimeString = str(nowUTC.year) + "-" + str(nowUTC.month) + "-" + str(nowUTC.day) + " " + str(nowUTC.hour) + ":" + str(nowUTC.minute) + ":" + str(nowUTC.second)
myFile = open(objFilePath,"w")
for line in objFileLines:
if line == "# Rhino\n":
line = "# Rhino\n# Terrain shading mask generated by Grasshopper Gismo plugin\n# True North direction is set to the Y axis\n# Location: %s\n# Elevation: %s m\n# Visibility radius: %s-%s km\n# Mask radius: 200 document units\n# Created on (UTC): %s\n" % (locationNameCorrected_latitude_longitude, elevationM, minVisibilityRadiusM/1000, int(maxVisibilityRadiusM/1000), UTCdateTimeString)
else:
pass
myFile.write(line)
myFile.close()
terrainShadingMask = origin_0_0_0 = None # not needed for "exportObj"
return terrainShadingMask, origin_0_0_0
def checkObjRasterFile(fileNameIncomplete, workingSubFolderPath, downloadTSVLink, heightM, minVisibilityRadiusM, maxVisibilityRadiusM, maskStyleLabel, source, sourceLabel):
# convert the float to integer if minVisibilityRadiusM == 0 (to avoid "0.0" in the .obj fileName)
if minVisibilityRadiusM == 0:
minVisibilityRadiusKM = 0
else:
minVisibilityRadiusKM = minVisibilityRadiusM/1000
fileName = fileNameIncomplete + "_visibility=" + str(minVisibilityRadiusKM) + "-" + str(round(maxVisibilityRadiusM/1000, 2)) + "KM" + "_source=" + sourceLabel
fileName2 = fileNameIncomplete + "_visibility=" + str(round(maxVisibilityRadiusM/1000, 2)) + "KM" + "_source=" + sourceLabel
objFileNamePlusExtension = fileName + "_" + maskStyleLabel + ".obj"
rasterFileNamePlusExtension = fileName2 + ".tif"
rasterReprojectedFileNamePlusExtension = fileName2 + "_reprojected" + ".tif"
tsvFileNamePlusExtension = "0_terrain_shading_masks_download_links" + ".tsv"
vrtFileNamePlusExtension = fileName + "_" + maskStyleLabel + "_reprojected" + ".vrt"
objFilePath = os.path.join(workingSubFolderPath, objFileNamePlusExtension)
rasterFilePath = os.path.join(workingSubFolderPath, rasterFileNamePlusExtension)
rasterReprojectedFilePath = os.path.join(workingSubFolderPath, rasterReprojectedFileNamePlusExtension)
tsvFilePath = os.path.join(workingSubFolderPath, tsvFileNamePlusExtension)
vrtFilePath = os.path.join(workingSubFolderPath, vrtFileNamePlusExtension)
# chronology labels: I, II, 1, 2, A, B, a, b
##### I) check if .obj file exist:
objFileAlreadyExists = os.path.exists(objFilePath)
if objFileAlreadyExists == True:
# .obj file already created. Import it
terrainShadingMask, origin_0_0_0 = import_export_origin_0_0_0_and_terrainShadingMask_from_objFile("importObj", objFilePath, fileNameIncomplete, heightM, minVisibilityRadiusM, maxVisibilityRadiusM)
if (terrainShadingMask != None) and (origin_0_0_0 != None):
# extract "elevationM" data from the .obj file
myFile = open(objFilePath,"r")
for line in myFile.xreadlines():
if "Elevation" in line:
splittedLine = line.split(" ")
elevationM = splittedLine[2]
break
else:
elevationM = None # if somebody opened the .obj file and deleted the heading for some reason
myFile.close()
rasterFilePath = "needless"
valid_Obj_or_Raster_file = True
printMsg = "ok"
elif (terrainShadingMask == None) and (origin_0_0_0 == None):
elevationM = None
rasterFilePath = "needless" # dummy
valid_Obj_or_Raster_file = False
printMsg = "You opened a new Rhino file while \"runIt_\" input has been set to True.\n" + \
"This component relies itself on Rhino document, and opening a new Rhino file results in component not working properly.\n" + \
"Just set the \"runIt_\" input back to False, and then again to True, to make it work again, with the newest Rhino file."
elif objFileAlreadyExists == False:
##### II).obj file can not be found in "workingFolderPath" folder (example: "C:\gismo\terrain shading masks").
##### check if .obj file is listed in "0_terrain_shading_masks_download_links.tsv" file (download the "0_terrain_shading_masks_download_links.tsv" file first)
terrainShadingMask = origin_0_0_0 = elevationM = None
# connected to Internet check
connectedToInternet = gismo_preparation.checkInternetConnection()
if connectedToInternet == False:
# you are NOT connected to the Internet, exit this function
rasterFilePath = "download failed"
terrainShadingMask = origin_0_0_0 = None
valid_Obj_or_Raster_file = False
printMsg = "This component requires you to be connected to the Internet, in order to create a terrain.\n" + \
"Please do connect, then rerun the component (set \"_runIt\" to False, then to True)."
elif connectedToInternet == True:
# you ARE connected to the Internet
# download "0_terrain_shading_masks_download_links.tsv" (no need to check if it is already in the "workingSubFolderPath" as a newer version of "0_terrain_shading_masks_download_links.tsv" file may exist online)
tsvFileDownloaded = gismo_preparation.downloadFile(downloadTSVLink, tsvFilePath)
if tsvFileDownloaded == False:
#### II.2 "0_terrain_shading_masks_download_links.tsv" has NOT been downloaded
if downloadUrl_ != None:
### II.2.A inputted downloadUrl_ is either not valid, or the "0_terrain_shading_masks_download_links.tsv" file is not uploaded at that address
rasterFilePath = "download failed"
terrainShadingMask = origin_0_0_0 = None
valid_Obj_or_Raster_file = False
printMsg = "The address plugged into downloadUrl_ input is incorrect.\n" + \
"Try unplugging it, so that the component tries to use its default address."
elif downloadUrl_ == None:
### II.2.B default downloadUrl_ is not valid anymore, nevertheless try ignoring the "0_terrain_shading_masks_download_links.tsv" file and create the .obj file from a .tif file
### it may also happen that "Error 404.htm" page will be downloaded as "0_terrain_shading_masks_download_links.tsv" file
### go to switch
pass
elif tsvFileDownloaded == True:
#### II.1 "0_terrain_shading_masks_download_links.tsv" IS downloaded
# checking if .obj file has been listed in "0_terrain_shading_masks_download_links.tsv"
myFile = open(tsvFilePath,"r")
downloadObjLink = None
for line in myFile.xreadlines():
if fileName in line:
splittedLineL = line.split("\t") # split the line with "tab"
for string in splittedLineL:
if "http" in string:
downloadObjLink_unstripped = string.split("\n")[0] # split the downloadObjLink and "\n"
downloadObjLink = System.String.strip(downloadObjLink_unstripped) # remove white spaces from the beginning, end of the downloadObjLink
break
myFile.close()
if downloadObjLink != None:
### II.1.A .obj file IS listed in "0_terrain_shading_masks_download_links.tsv", so download it
objFileDownloadedDummy = gismo_preparation.downloadFile(downloadObjLink, objFilePath)
terrainShadingMask, origin_0_0_0 = import_export_origin_0_0_0_and_terrainShadingMask_from_objFile("importObj", objFilePath, fileNameIncomplete, heightM, minVisibilityRadiusM, maxVisibilityRadiusM)
rasterFilePath = "needless"
valid_Obj_or_Raster_file = True
printMsg = "ok"
elif downloadObjLink == None:
### II.1.B .obj file is NOT listed in "0_terrain_shading_masks_download_links.tsv", try to create it from a .tif file
### go to switch
pass
### switch
if ((objFileAlreadyExists == False) and (connectedToInternet == True) and (tsvFileDownloaded == False) and (downloadUrl_ == None)) or ((objFileAlreadyExists == False) and (connectedToInternet == True) and (tsvFileDownloaded == True) and (downloadObjLink == None)):
### .obj file could not be found, due to one of the following two reasons:
### - default downloadUrl_ is not valid anymore (II.2.B); or
### - .obj file is NOT listed in "0_terrain_shading_masks_download_links.tsv" (II.1.B);
### so try to create an .obj file from a .tif file
terrainShadingMask = origin_0_0_0 = "needs to be calculated"
rasterFileAlreadyExists = os.path.exists(rasterFilePath)
if rasterFileAlreadyExists == True:
## .tif file already downloaded previously
valid_Obj_or_Raster_file = True
printMsg = "ok"
if rasterFileAlreadyExists == False:
## .tif file has not been downloaded up until now, download it
# first check the location before download, so that it fits the opentopography.org limits (-82 to 82(81.99999 used instead of 82) latitude):
if locationLatitudeD > 81.99999:
# location beyond the -82 to 82 latittude limits
# (correctedMaskRadiusM < 1) or (correctedMaskRadiusM < maxVisibilityRadiusM)
terrainShadingMask = origin_0_0_0 = None
valid_Obj_or_Raster_file = False
rasterFilePath = "needless" # dummy
printMsg = "This component dowloads free topography data from opentopography.org in order to create a terrain for the chosen _location.\n" + \
"But mentioned free topography data has its limits: from -82 South to 82 North latitude.\n" + \
"Your _location's latitude exceeds the upper mentioned limits.\n" + \
" \n" + \
"Try using the Ladybug \"Terrain Generator\" component instead."
else:
# location within the -82 to 82 latittude limits
# correct (shorten) the maxVisibilityRadiusM according to the distance remained to the ALOS latitude range boundaries (-82 to 82)
correctedMaskRadiusM, validVisibilityRadiusM, printMsg = distanceBetweenTwoPoints(locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM)
if validVisibilityRadiusM == True:
# (correctedMaskRadiusM >= maxVisibilityRadiusM)
latitudeTopD, dummyLongitudeTopD, latitudeBottomD, dummyLongitudeBottomD, dummyLatitudeLeftD, longitudeLeftD, dummyLatitudeRightD, longitudeRightD = gismo_gis.destinationLatLon(locationLatitudeD, locationLongitudeD, correctedMaskRadiusM)
# generate download link for raster region
if source == 0:
# based on: http://www.opentopography.org/developers
#downloadRasterLink_withCorrectedMaskRadiusKM = "http://opentopo.sdsc.edu/otr/getdem?demtype=SRTMGL1&west=%s&south=%s&east=%s&north=%s&outputFormat=GTiff" % (longitudeLeftD,latitudeBottomD,longitudeRightD,latitudeTopD) # SRTM 1 arc second (old link)
downloadRasterLink_withCorrectedMaskRadiusKM = "https://portal.opentopography.org/API/globaldem?demtype=SRTMGL1&south={}&north={}&west={}&east={}&outputFormat=GTiff".format(latitudeBottomD, latitudeTopD, longitudeLeftD, longitudeRightD) # SRTM 1 arc second (new link)
elif source == 1:
# based on: http://www.opentopography.org/developers
#downloadRasterLink_withCorrectedMaskRadiusKM = "http://opentopo.sdsc.edu/otr/getdem?demtype=AW3D30&west=%s&south=%s&east=%s&north=%s&outputFormat=GTiff" % (longitudeLeftD,latitudeBottomD,longitudeRightD,latitudeTopD) # ALOS 1 arc second (AW3D30) (old link)
downloadRasterLink_withCorrectedMaskRadiusKM = "https://portal.opentopography.org/API/globaldem?demtype=AW3D30&south={}&north={}&west={}&east={}&outputFormat=GTiff".format(latitudeBottomD, latitudeTopD, longitudeLeftD, longitudeRightD) # ALOS 1 arc second (AW3D30) (new link)
elif source == 2:
# based on: http://www.marine-geo.org/tools/gridserverinfo.php#!/tools/getGMRTGrid
downloadRasterLink_withCorrectedMaskRadiusKM = "http://www.marine-geo.org/services/GridServer?north={}&west={}&east={}&south={}&layer=topo&format=geotiff&resolution=max".format(latitudeTopD, longitudeLeftD, longitudeRightD, latitudeBottomD) # GMRT
# new rasterFileNamePlusExtension and rasterFilePath corrected according to new correctedMaskRadiusM
rasterFileNamePlusExtension_withCorrectedMaskRadiusKM = fileNameIncomplete + "_visibility=" + str(round(maxVisibilityRadiusM/1000, 2)) + "KM" + "_source=" + sourceLabel + ".tif" # IMPORTANT: rasterFileNamePlusExtension_withCorrectedMaskRadiusKM will always be used instead of rasterFilePath from line 647 !!!
rasterFilePath_withCorrectedMaskRadiusKM = os.path.join(workingSubFolderPath, rasterFileNamePlusExtension_withCorrectedMaskRadiusKM)
tifFileDownloaded = gismo_preparation.downloadFile(downloadRasterLink_withCorrectedMaskRadiusKM, rasterFilePath_withCorrectedMaskRadiusKM)
if tifFileDownloaded:
terrainShadingMask = origin_0_0_0 = None
valid_Obj_or_Raster_file = True
printMsg = "ok"
else:
rasterFilePath = "download failed"
terrainShadingMask = origin_0_0_0 = elevationM = None
valid_Obj_or_Raster_file = False
printMsg = "This component requires topography data to be downloaded from opentopography.org as a prerequisite for creating a terrain. It has just failed to do that. Try the following two fixes:\n" + \
" \n" + \
"1) Sometimes due to large number of requests, the component fails to download the topography data even if opentopography.org website and their services are up and running.\n" + \
"In this case, wait a couple of seconds and try reruning the component.\n" + \
" \n" + \
"2) opentopography.org website could be up and running, but their terrain service (RESTful Web service) may be down (this already happened before).\n" + \
"Try again in a couple of hours.\n" + \
" \n" + \
"If each of two mentioned advices fails, open a new topic about this issue on: www.grasshopper3d.com/group/gismo/forum."
elif validVisibilityRadiusM == False:
# (correctedMaskRadiusM < 1) or (correctedMaskRadiusM < maxVisibilityRadiusM)
elevationM = None
valid_Obj_or_Raster_file = False
rasterFilePath = "needless" # dummy
#printMsg - from distanceBetweenTwoPoints function
return terrainShadingMask, origin_0_0_0, fileName, objFilePath, rasterFilePath, rasterReprojectedFilePath, rasterReprojectedFileNamePlusExtension, vrtFilePath, elevationM, valid_Obj_or_Raster_file, printMsg
def createTerrainMeshBrep(rasterFilePath, rasterReprojectedFilePath, locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM, unitConversionFactor2):
# create "terrainMesh" and "terrrainBrep" from Opentopography data
# output crs data: outputCRS_UTMzone, northOrsouth
CRS_EPSG_code, outputCRS_UTMzone, northOrsouth = gismo_gis.calculate_CRS_UTMzone(locationLatitudeD, locationLongitudeD)
# reproject raster
utils = MapWinGIS.UtilsClass()
resamplingMethod = "-r bilinear"
bstrOptions = '-s_srs EPSG:4326 -t_srs "+proj=utm +zone=%s +%s +datum=WGS84 +ellps=WGS84" %s' % (outputCRS_UTMzone, northOrsouth, resamplingMethod)
reprojectGridResult = MapWinGIS.UtilsClass.GDALWarp(utils, rasterFilePath, rasterReprojectedFilePath, bstrOptions, None)
if (reprojectGridResult != True):
convertErrorNo = MapWinGIS.GlobalSettingsClass().GdalLastErrorNo
convertErrorMsg = MapWinGIS.GlobalSettingsClass().GdalLastErrorMsg
convertErrorType = MapWinGIS.GlobalSettingsClass().GdalLastErrorType
print "convertErrorNo: ", convertErrorNo
print "convertErrorMsg: ", convertErrorMsg
print "convertErrorType: ", convertErrorType
# open the reprojected raster
grid = MapWinGIS.GridClass()
dataType = MapWinGIS.GridDataType.DoubleDataType
fileTypeExtension = MapWinGIS.GridFileType.UseExtension
inRam = True
openGridSuccess = MapWinGIS.GridClass.Open(grid, rasterReprojectedFilePath, dataType, inRam, fileTypeExtension, None)
if (openGridSuccess != True):
gridErrorMsg = grid.ErrorMsg
print "gridErrorMsg: ", gridErrorMsg
# numOfRows, numOfColumns, cellsizeX, cellsizeY
header = grid.Header
numOfRows = header.NumberRows
numOfColumns = header.NumberCols
numOfCellsInX = numOfColumns
numOfCellsInY = numOfRows
cellsizeX = header.dX
cellsizeY = header.dY
# calculate the starting point (upper left corner) of terrain mesh
scaleFactor = 0.01 # scale terrainMesh 100 times (should never be changed), meaning 1 meter in real life is 0.01 meters in Rhino document
lowerLeftCornerCellCentroidXcoord = header.XllCenter
lowerLeftCornerCellCentroidYcoord = header.YllCenter
lowerLeftCornerXcoord = lowerLeftCornerCellCentroidXcoord - (cellsizeX/2)
lowerLeftCornerYcoord = lowerLeftCornerCellCentroidYcoord - (cellsizeY/2)
originPtProjected = gismo_gis.projectedLocationCoordinates(locationLatitudeD, locationLongitudeD) # find the "origin" projected in Rhino document units for specific UTMzone
terrainMeshLeftBottomPtX = (lowerLeftCornerXcoord/unitConversionFactor2) - (originPtProjected.X/unitConversionFactor2)
terrainMeshLeftBottomPtY = (lowerLeftCornerYcoord/unitConversionFactor2) - (originPtProjected.Y/unitConversionFactor2)
terrainMeshStartPtX = ( terrainMeshLeftBottomPtX )*scaleFactor
terrainMeshStartPtY = ( terrainMeshLeftBottomPtY + ((abs(cellsizeX)/unitConversionFactor2)*numOfRows) )*scaleFactor
pts = []
# create terrainMesh from 1 arc-second format
for k in xrange(numOfCellsInY):
for i in xrange(numOfCellsInX):
ptZ = grid.Value(i,k)
if math.isnan(ptZ): # ptZ is float("nan")
ptZ = 0
pt = Rhino.Geometry.Point3d(terrainMeshStartPtX+(i*abs(cellsizeX/unitConversionFactor2)*scaleFactor), terrainMeshStartPtY-(k*abs(cellsizeY/unitConversionFactor2)*scaleFactor), ptZ/unitConversionFactor2*scaleFactor)
pts.append(pt)
closeGridSuccess = grid.Close()
# always create a terrain mesh regardless of type_ input so that "elevationM" can be calculated on a mesh
terrainMesh = gismo_geometry.meshFromPoints(numOfRows, numOfColumns, pts)
# always create a terrain brep
uDegree = min(3, numOfCellsInY - 1)
vDegree = min(3, numOfCellsInX - 1)
uClosed = False; vClosed = False
terrainSurface = Rhino.Geometry.NurbsSurface.CreateThroughPoints(pts, numOfCellsInY, numOfCellsInX, uDegree, vDegree, uClosed, vClosed)
terrainBrep = terrainSurface.ToBrep()
# project origin_0_0_0 (locationPt) to terrainMesh
safeHeightDummy = 10000/unitConversionFactor2 # in meters
origin_0_0_0 = Rhino.Geometry.Point3d(0,0,0) # always center the terrainMesh to 0,0,0 point
elevatedOrigin = Rhino.Geometry.Point3d(origin_0_0_0.X, origin_0_0_0.Y, (origin_0_0_0.Z+safeHeightDummy)*scaleFactor) # project origin_0_0_0 to terrainMesh
ray = Rhino.Geometry.Ray3d(elevatedOrigin, Rhino.Geometry.Vector3d(0,0,-1))
rayIntersectParam = Rhino.Geometry.Intersect.Intersection.MeshRay(terrainMesh, ray)
locationPt = ray.PointAt(rayIntersectParam)
elevationM = locationPt.Z/scaleFactor # in rhino document units (not meters)
elevationM = round(elevationM,2)
# deleting
#os.remove(rasterFilePath) # downloaded .tif file
os.remove(rasterReprojectedFilePath) # reprojected .tif file
del pts
gc.collect()
return terrainMesh, terrainBrep, locationPt, elevationM
def colorMesh(terrainMesh):
# color the "terrain" mesh
terrainMesh_numOfVertices = list(terrainMesh.Vertices)
terrainMesh_verticesZ = [pt.Z for pt in terrainMesh_numOfVertices]
# deconstruct "legendBakePar_" input
legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, font, fontSize, numDecimals, legendUnit, customTitle, scale, layerName, layerColor, layerCategoryName = gismo_preparation.read_legendBakePar(legendBakePar_)
colors = gismo_preparation.numberToColor(terrainMesh_verticesZ, customColors)
terrainMesh.VertexColors.Clear()
for i in range(len(terrainMesh_numOfVertices)):
terrainMesh.VertexColors.Add(colors[i])
return terrainMesh # colored mesh
def split_createStand_colorTerrain(terrainMesh, terrainBrep, locationPt, origin, standThickness, unitConversionFactor2):
scaleFactor = 0.01 # scale terrainMesh 100 times (should never be changed), meaning 1 meter in real life is 0.01 meters in Rhino document
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
#if (radius_ < (200/unitConversionFactor2)):
if (radius_ < 200):
# always reduce the cutting "radius_" unless radius_ is < 200
cuttingRadiusScaled = radius_ / unitConversionFactor2 * scaleFactor
else:
cuttingRadiusScaled = (radius_*0.9) / unitConversionFactor2 * scaleFactor # 0.9 to avoid the cutting sphere getting out of the terrainMesh/terrainBrep edges
# always perform the cutting of either a mesh or surface regardless if type_ is 0,1,2,3
if (_type == 0) or (_type == 1):
# splitting of mesh
if (_type == 0):
# split with a cuboid
boxInterval = Rhino.Geometry.Interval(-cuttingRadiusScaled, cuttingRadiusScaled)
boxIntervalZ = Rhino.Geometry.Interval(-cuttingRadiusScaled*8, cuttingRadiusScaled*8) # always use "8"
boxBrep = Rhino.Geometry.Box(Rhino.Geometry.Plane(locationPt, Rhino.Geometry.Vector3d(0,0,1)), boxInterval, boxInterval, boxIntervalZ).ToBrep()
boxMeshes = Rhino.Geometry.Mesh.CreateFromBrep(boxBrep)
boxMesh = Rhino.Geometry.Mesh();
for mesh in boxMeshes:
boxMesh.Append(mesh)
terrainMeshesSplitted = terrainMesh.Split(boxMesh)
elif (_type == 1):
# split with a sphere
meshSphere = Rhino.Geometry.Mesh.CreateFromSphere(Rhino.Geometry.Sphere(locationPt, cuttingRadiusScaled), 48, 40)
terrainMeshesSplitted = terrainMesh.Split(meshSphere)
elif (_type == 2) or (_type == 3):
# splitting of surface
if (_type == 2):
# split with a cuboid
boxInterval = Rhino.Geometry.Interval(-cuttingRadiusScaled, cuttingRadiusScaled)
boxIntervalZ = Rhino.Geometry.Interval(-cuttingRadiusScaled*5, cuttingRadiusScaled*5) # always use "5"
boxBrep = Rhino.Geometry.Box(Rhino.Geometry.Plane(locationPt, Rhino.Geometry.Vector3d(0,0,1)), boxInterval, boxInterval, boxIntervalZ).ToBrep()
terrainBrepsSplitted = terrainBrep.Split(boxBrep, tol/(1/scaleFactor)) # divide the "tol" with "1/scaleFactor" to account for the 100 times scalling in "title_scalingRotating" function
elif (_type == 3):
# split with a sphere
brepSphere = Rhino.Geometry.Sphere(locationPt, cuttingRadiusScaled).ToBrep()
terrainBrepsSplitted = terrainBrep.Split(brepSphere, tol/(1/scaleFactor)) # divide the "tol" with "1/scaleFactor" to account for the 100 times scalling in "title_scalingRotating" function
[splittedBrep.Faces.ShrinkFaces() for splittedBrep in terrainBrepsSplitted]
terrainMeshesSplitted = [Rhino.Geometry.Mesh.CreateFromBrep(splittedBrep)[0] for splittedBrep in terrainBrepsSplitted] # convert terrainBrepsSplitted to meshes for quicker calculation
# calculate the distance from projected centroids of the meshes from terrainMeshesSplitted to locationPt
tupleDistanceToLocationPtL = []
for i,splittedMesh in enumerate(terrainMeshesSplitted):
meshCentroid = Rhino.Geometry.AreaMassProperties.Compute(splittedMesh).Centroid
meshCentroid_closestPt = splittedMesh.ClosestPoint(meshCentroid)
distance = meshCentroid_closestPt.DistanceTo(locationPt)
tupleDistanceToLocationPt = (distance, i)
tupleDistanceToLocationPtL.append(tupleDistanceToLocationPt)
tupleDistanceToLocationPtL.sort()
if (_type == 0) or (_type == 1):
terrain_MeshOrBrep_Splitted = terrainMeshesSplitted[tupleDistanceToLocationPtL[0][1]]
terrainOutlines = [polyline.ToNurbsCurve() for polyline in terrain_MeshOrBrep_Splitted.GetNakedEdges()]
elif (_type == 2) or (_type == 3):
terrain_MeshOrBrep_Splitted = terrainBrepsSplitted[tupleDistanceToLocationPtL[0][1]]
nakedOnly = True
terrainOutlines = terrain_MeshOrBrep_Splitted.DuplicateEdgeCurves(nakedOnly)
# stand
standThickness = standThickness/100 # due to scalling of the terrain_Mesh_colored 100 times
if (standThickness == 0):
# stand should not be created
if (_type == 0) or (_type == 1):
# just color the mesh
terrain_Mesh_colored = colorMesh(terrain_MeshOrBrep_Splitted)
del terrainBrep
return terrain_Mesh_colored
elif (_type == 2) or (_type == 3):
del terrainMesh
return terrain_MeshOrBrep_Splitted
elif (standThickness > 0):
# create stand
accurate = True
terrainBB = terrain_MeshOrBrep_Splitted.GetBoundingBox(accurate)
lowestZcoordinatePt = terrainBB.Min # point with the lowest Z coordinate
terrainLowestVertexPlane = Rhino.Geometry.Plane(lowestZcoordinatePt, Rhino.Geometry.Vector3d(0,0,1))
terrainLowestVertexPlane2 = Rhino.Geometry.Plane(terrainLowestVertexPlane.Origin, Rhino.Geometry.Vector3d(0,0,1))
terrainLowestVertexPlane.Origin = Rhino.Geometry.Point3d(terrainLowestVertexPlane.Origin.X, terrainLowestVertexPlane.Origin.Y, terrainLowestVertexPlane.Origin.Z - standThickness)
terrainOutline = Rhino.Geometry.Curve.JoinCurves(terrainOutlines)[0]
terrainOutlineProjected = Rhino.Geometry.Curve.ProjectToPlane(terrainOutline, terrainLowestVertexPlane) # "terrainOutline" projected to the "terrainLowestVertexPlane" plane
loftType = Rhino.Geometry.LoftType.Straight; closedLoft = False
loftedTerrain_Outline_and_OutlineProjected_Brep = Rhino.Geometry.Brep.CreateFromLoft([terrainOutline, terrainOutlineProjected], Rhino.Geometry.Point3d.Unset, Rhino.Geometry.Point3d.Unset, loftType, closedLoft)[0]
terrainOutlineProjected_Brep = Rhino.Geometry.Brep.CreatePlanarBreps([terrainOutlineProjected])[0]
loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep = Rhino.Geometry.Brep.JoinBreps([loftedTerrain_Outline_and_OutlineProjected_Brep, terrainOutlineProjected_Brep],0.001)[0]
if (_type == 2) or (_type == 3):
# surface, no coloring should be performed
loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep__and__terrain = Rhino.Geometry.Brep.JoinBreps([terrain_MeshOrBrep_Splitted, loftedTerrain_Outline_and_OutlineProjected_Brep, terrainOutlineProjected_Brep],0.001)[0]
del terrainMesh
return loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep__and__terrain
elif (_type == 0) or (_type == 1):
# mesh, color the meshes
meshParam = Rhino.Geometry.MeshingParameters()
# setting the meshParam so that it does not crash Rhino
if (radius_ <= 300):
meshParam.MaximumEdgeLength = 0.1
elif (radius_ > 300) and (radius_ <= 400):
meshParam.MaximumEdgeLength = 0.2
elif (radius_ > 400) and (radius_ <= 500):
meshParam.MaximumEdgeLength = 0.3
elif (radius_ > 500) and (radius_ <= 1000):
meshParam.MaximumEdgeLength = 0.4
elif (radius_ > 1000) and (radius_ <= 2000):
meshParam.MaximumEdgeLength = 0.5
elif (radius_ > 2000) and (radius_ <= 3000):
meshParam.MaximumEdgeLength = 0.7
elif (radius_ > 3000) and (radius_ <= 4000):
meshParam.MaximumEdgeLength = 0.9
elif (radius_ > 4000):
meshParam.MaximumEdgeLength = 10
loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep_Mesh = Rhino.Geometry.Mesh.CreateFromBrep(loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep, meshParam) # it can contain more than one mesh
terrain_withStand = Rhino.Geometry.Mesh() # for scaling of terrainShadingMask
for meshMaskPart in loftedTerrain_Outline_and_OutlineProjected_Brep__and__terrainOutlineProjected_Brep_Mesh:
terrain_withStand.Append(meshMaskPart)
terrain_withStand.Append(terrain_MeshOrBrep_Splitted)
terrain_withStand_colored = colorMesh(terrain_withStand)
del terrainBrep
return terrain_withStand_colored
def createElevationContours(terrainUnoriginUnscaledUnrotated, numOfContours, _type):
scaleFactor = 0.01
tol = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
# create intersection planes
accurate = True
terrainBB_edges = terrainUnoriginUnscaledUnrotated.GetBoundingBox(accurate).GetEdges()
terrainBB_verticalEdge = terrainBB_edges[8] # "Rhino.Geometry.Line" type
includeEnds = False
terrainBB_edges_t_parameters = terrainBB_verticalEdge.ToNurbsCurve().DivideByCount(numOfContours, includeEnds)
elevationContours_planeOrigins = [Rhino.Geometry.Line.PointAt(terrainBB_verticalEdge, t) for t in terrainBB_edges_t_parameters]
elevationContours_planes = [Rhino.Geometry.Plane(origin, Rhino.Geometry.Vector3d(0,0,1)) for origin in elevationContours_planeOrigins]
if (_type == 0) or (_type == 1):
elevationContours_Polylines = list(Rhino.Geometry.Intersect.Intersection.MeshPlane(terrainUnoriginUnscaledUnrotated, elevationContours_planes))
elevationContours = [crv.ToNurbsCurve() for crv in elevationContours_Polylines] # curves
elif (_type == 2) or (_type == 3):
elevationContours = []
for plane in elevationContours_planes:
success, elevationContoursSubList, elevationContourPointsSubList = Rhino.Geometry.Intersect.Intersection.BrepPlane(terrainUnoriginUnscaledUnrotated, plane, tol/(1/scaleFactor)) # divide the "tol" with "1/scaleFactor" to account for the 100 times scalling in "title_scalingRotating" function
#elevationContoursSubList_closedCrvs = [crv for crv in elevationContoursSubList if crv.IsClosed] # remove elevationContours crvs which are not closed
elevationContoursSubList_closedCrvs = [crv for crv in elevationContoursSubList]
if len(elevationContoursSubList_closedCrvs) > 0: # or success == True
elevationContours.extend(elevationContoursSubList_closedCrvs)
return elevationContours
def title_scalingRotating(terrainUnoriginUnscaledUnrotated, locationName, locationLatitudeD, locationLongitudeD, locationPt, maxVisibilityRadiusM, _type, sourceLabel, origin, northDeg, northRad, numOfContours, unitConversionFactor):
# scaling, rotating
originTransformMatrix = Rhino.Geometry.Transform.PlaneToPlane( Rhino.Geometry.Plane(locationPt, Rhino.Geometry.Vector3d(0,0,1)), Rhino.Geometry.Plane(origin, Rhino.Geometry.Vector3d(0,0,1)) ) # move the terrain from "locationPt" to "origin"
scaleTransformMatrix = Rhino.Geometry.Transform.Scale( Rhino.Geometry.Plane(origin, Rhino.Geometry.Vector3d(0,0,1)), 100, 100, 100 ) # scale the whole terrain back to its real size due to previous usage of scaleFactor = 0.01
# rotation due to north angle position
#transformMatrixRotate = Rhino.Geometry.Transform.Rotation(-northRad, Rhino.Geometry.Vector3d(0,0,1), origin) # counter-clockwise
rotateTransformMatrix = Rhino.Geometry.Transform.Rotation(northRad, Rhino.Geometry.Vector3d(0,0,1), origin) # clockwise
if numOfContours_ > 0:
# create elevationContours
elevationContours_UnoriginUnscaledUnrotated = createElevationContours(terrainUnoriginUnscaledUnrotated, numOfContours, _type)
else:
# no elevationContours will be created
elevationContours_UnoriginUnscaledUnrotated = []
geometry = [terrainUnoriginUnscaledUnrotated] + elevationContours_UnoriginUnscaledUnrotated
for g in geometry:
if g != None: # exclude the elevationContours which are invalid (equal to None)
g.Transform(originTransformMatrix)
g.Transform(scaleTransformMatrix)
g.Transform(rotateTransformMatrix)
# title
legendStyle, legendPlane, maxValue, minValue, customColors, numLegendCells, font, fontSize, numDecimals, legendUnit, customTitle, scale, layerName, layerColor, layerCategoryName = gismo_preparation.read_legendBakePar(legendBakePar_)
if (customTitle == None):
titleLabelText = "Location: %s\nLatitude: %s, Longitude: %s\nRadius: %sm, North: %s, Source: %s" % (locationName, locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM, northDeg, sourceLabel)
else:
titleLabelText = customTitle
titleLabelMesh, titleStartPt, titleTextSize = gismo_preparation.createTitle("mesh", [terrainUnoriginUnscaledUnrotated], [titleLabelText], customTitle, textStartPt=None, textSize=fontSize, fontName=font)
# hide "origin" output
ghenv.Component.Params.Output[2].Hidden = True
return terrainUnoriginUnscaledUnrotated, titleLabelMesh, elevationContours_UnoriginUnscaledUnrotated
def bakingGrouping(locationName, locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM, sourceLabel, typeLabel, standThickness, terrain, title, elevationContours, origin):
# baking
layerName = locationName + "_" + str(locationLatitudeD) + "_" + str(locationLongitudeD) + "_RADIUS=" + str(maxVisibilityRadiusM) + "M" + "_STAND=" + str(round(standThickness,2)) + "_" + sourceLabel + "_" + typeLabel
layParentName = "GISMO"; laySubName = "TERRAIN"; layerCategoryName = "TERRAIN_GENERATOR"
newLayerCategory = False
laySubName_color = System.Drawing.Color.FromArgb(100,191,70) # green
layerColor = System.Drawing.Color.FromArgb(0,0,0) # black
layerIndex, layerName_dummy = gismo_preparation.createLayer(layParentName, laySubName, layerCategoryName, newLayerCategory, layerName, laySubName_color, layerColor, legendBakePar_)
geometryToBakeL = [terrain, title, Rhino.Geometry.Point(origin)]
geometryIds = gismo_preparation.bakeGeometry(geometryToBakeL, layerIndex)
geometryToBakeL2 = elevationContours
geometryIds2 = gismo_preparation.bakeGeometry(geometryToBakeL2, layerIndex)
# grouping
groupIndex = gismo_preparation.groupGeometry(layerName + "_terrainGenerator_elevationContours", geometryIds)
groupIndex2 = gismo_preparation.groupGeometry(layerName + "_terrainGenerator", geometryIds2)
def printOutput(northDeg, latitude, longitude, locationName, maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, workingSubFolderPath, standThickness, numOfContours):
if bakeIt_ == True:
bakedOrNot = "and baked "
elif bakeIt_ == False:
bakedOrNot = ""
resultsCompletedMsg = "Terrain generator component results successfully completed %s!" % bakedOrNot
printOutputMsg = \
"""
Input data:
Location (deg.): %s
Latitude (deg.): %s
Longitude (deg.): %s
North (deg.): %s
Radius (m): %s
Source: %s (%s)
Type: %s (%s)
Origin: %s
Stand thickness (rhino doc. units): %s
Number of elevation contours: %s
Working folder: %s
""" % (locationName, latitude, longitude, northDeg, maxVisibilityRadiusM, source, sourceLabel, _type, typeLabel, origin, standThickness, numOfContours, workingSubFolderPath)
print resultsCompletedMsg
print printOutputMsg
level = Grasshopper.Kernel.GH_RuntimeMessageLevel.Warning
if sc.sticky.has_key("gismoGismo_released"):
validVersionDate, printMsg = sc.sticky["gismo_check"].versionDate(ghenv.Component)
if validVersionDate:
gismo_mainComponent = sc.sticky["gismo_mainComponent"]()
gismo_preparation = sc.sticky["gismo_Preparation"]()
gismo_geometry = sc.sticky["gismo_CreateGeometry"]()
gismo_gis = sc.sticky["gismo_GIS"]()
locationName, locationLatitudeD, locationLongitudeD, timeZone, elevation, validLocationData, printMsg = gismo_preparation.checkLocationData(_location)
if validLocationData:
fileNameIncomplete = locationName + "_" + str(locationLatitudeD) + "_" + str(locationLongitudeD) + "_TERRAIN" # incomplete due to missing "_visibility=2KM_source=AW3D30" part (for example)
heightM = 0; minVisibilityRadiusM = 0; maskStyle = 0; maskStyleLabel = "sph"; downloadUrl_ = None; downloadTSVLink = None; gridSize_ = 10 # dummy value
maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, northRad, northDeg, standThickness, numOfContours, workingSubFolderPath, downloadTSVLink, unitConversionFactor, unitConversionFactor2, validInputData, printMsg = checkInputData(locationLatitudeD, radius_, gridSize_, source_, type_, origin_, north_, standThickness_, numOfContours_, downloadTSVLink)
if validInputData:
if _runIt:
terrainShadingMaskUnscaledUnrotated, origin_0_0_0, fileName, objFilePath, rasterFilePath, rasterReprojectedFilePath, rasterReprojectedFileNamePlusExtension, vrtFilePath, elevationM, valid_Obj_or_Raster_file, printMsg = checkObjRasterFile(fileNameIncomplete, workingSubFolderPath, downloadTSVLink, heightM, minVisibilityRadiusM, maxVisibilityRadiusM, maskStyleLabel, source, sourceLabel)
if valid_Obj_or_Raster_file:
if (rasterFilePath != "needless") and (rasterFilePath != "download failed"): # terrain shading mask NEEDS to be created
terrainMesh, terrainBrep, locationPt, elevationM = createTerrainMeshBrep(rasterFilePath, rasterReprojectedFilePath, locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM, unitConversionFactor2)
terrainUnoriginUnscaledUnrotated = split_createStand_colorTerrain(terrainMesh, terrainBrep, locationPt, origin, standThickness, unitConversionFactor2)
terrain, title, elevationContours = title_scalingRotating(terrainUnoriginUnscaledUnrotated, locationName, locationLatitudeD, locationLongitudeD, locationPt, maxVisibilityRadiusM, _type, sourceLabel, origin, northDeg, northRad, numOfContours, unitConversionFactor)
if bakeIt_: bakingGrouping(locationName, locationLatitudeD, locationLongitudeD, maxVisibilityRadiusM, sourceLabel, typeLabel, standThickness, terrain, title, elevationContours, origin)
printOutput(northDeg, locationLatitudeD, locationLongitudeD, locationName, maxVisibilityRadiusM, gridSize, source, sourceLabel, _type, typeLabel, origin, workingSubFolderPath, standThickness, numOfContours)
elevation = elevationM
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print "All inputs are ok. Please set \"_runIt\" to True, in order to run the Terrain Generator component"
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
else:
printMsg = "First please run the Gismo Gismo component."
print printMsg
ghenv.Component.AddRuntimeMessage(level, printMsg)
- Use this component to create a geometry of the terrain surrounding the chosen location.
Terrain will be created with ALOS 1 arc-second (20 to 30 meters depending on the latitude) grid precision.
-
Component requires that you are connected to the Internet, as it has to download the topography data.
It also requires MapWinGIS application to be installed.
Download and install either 32 bit or 64 bit (depending on your Rhino 5 version) version of MapWinGIS from here:
https://github.com/MapWindow/MapWinGIS/releases
-
Component mainly based on:
"Mathematical cartography", V. Jovanovic, VGI 1983.
"Vincenty solutions of geodesics on the ellipsoid" article by Chris Veness
https://books.google.rs/books/about/Matemati%C4%8Dka_kartografija.html?id=GcXEMgEACAAJ&redir_esc=y
http://www.movable-type.co.uk/scripts/latlong-vincenty.html
-
Provided by Gismo 0.0.3
-
514
131
-
1847
1009
- true
- true
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAAC7klEQVRIS+2TbUgTcRzHF0RRNFtrd9u5ofScQRYVBWUZJeXz3W23ZQ8sNZcptpSMKIoVREUvesKMluksy6255XSb1tQiSkMrK0tSIYgQMoIgeiEEffvvuGUUQVGvwg98+D/d7+F/3MlGGeU/gjExKxRpctfkdHktmS+Stv8NMXp6Os0pP1jPFqLwVD5UbNRgrJHSSMd/jyJD7hRsHCKk70uBMmPyeen479Aa1Kt1Ju2XZ696pPRAV99DaAXmMzlbxvA0H5U28SSjpzkp5A9IlI1VZCg6LcdZfPr4En39LgwNPcLzXjuybGswKVU+tGDbfNiqDmKueRY0PGWWIn8P0tX22Vti4QkW4lZrLtw3klHfyCPUkg2nvwg6I4ObXa0YHh7+UhO6CkWy4i2zkVFJ4b9kzMzkmeNjNsVMiUpRDRadSob/Tj4qPOtgv55IXAWHNwX+tgKcqNmKBz0ODLwO4c3QYyy2zADFU6elPD8TbYxeSLFUJ3ktfTQ39f6S/DjUtVlR3bQBZZ4knPOsRblnDcq9SagkN3G35KDCl44L5Gbe2xYcqtRDySuHtQZtvJRyhHnGeeOUmconWYfXw1ZpAcXROHYlG/57Vlxq5GD3pcJeLxme+9JwkSS3hwvUp6A6aEKgvRSpe5eSL0wZkNKOoObV1rnm6WjqOIru/gocuZyHYMcBOFvMcAQ4VIX1s6iM2MiSwpm41ED0ZZI1h/q7BbjYUIDYDVowBpqVUstk07JoNen+XWk5h1DnHnjv7ECwvRjutlxcaRZwuUlPRoM4fm91kBjgRasCLHnGhOaOEuQcS8LUDFWvTtBNEAvQLF2WUDQHdbc3w91qJF0b4BIViEbR62Q/Mo/sO0PEWwJqRQ24dpOHKyTAERQQnzsNar16j1hApVe9Z/fHo/TcKljPrMCuswk/uBLFxPAY8dv6DDknhuPC7jy9HLvLErC2JA7ktQ+IBchfuU/DaZ5SHPXiX0m679YJTJ5YYJRfI5N9BQec2JkRZnxdAAAAAElFTkSuQmCC
- false
- bb43699d-5a2e-4373-9171-c27f98349cf9
- false
- true
- Gismo_Terrain Generator
- TerrainGenerator
-
9786
1035
222
244
-
9893
1157
- 12
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- The output from the "importEPW" or "constructLocation" component. This is essentially a list of text summarizing a location on the Earth.
-
"timeZone" and "elevation" data from the location, are not important for the creation of a terrain.
- 3a5879e1-d8ab-40cd-8b96-cb3b23cf6480
- _location
- _location
- true
- 0
- true
- 42d83886-87be-4d48-9a47-5dac2333352f
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9788
1037
90
20
-
9834.5
1047
- true
- Horizontal distance to which the surrounding terrain will be taken into account.
-
It can not be shorter than 20 meters or longer than 100 000 meters.
-
The component itself might inform the user to alter the initial radius_ inputted by the user.
This is due to restriction of topography data, being limited to 56 latitude South to 60 latitude North range. If radius_ value for chosen location gets any closer to the mentioned range, the component will inform the user to shrink it for a certain amount, so that the radius_ stops at the range limit.
-
If not supplied, default value of 100 meters will be used.
-
In meters.
- db9900d7-cb20-46fe-8aba-fd662b9a4f5a
- radius_
- radius_
- true
- 0
- true
- 7dd65638-e494-4425-abac-9868383a5d20
- 1
- 48d01794-d3d8-4aef-990e-127168822244
-
9788
1057
90
20
-
9834.5
1067
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 100
- true
- There are currently three terrain sources available:
-
0 - SRTMGL1: only terrain from -55.9 to 59.9 latitude! Terrain ends at the sea level (no sea/river/lake floor terrain). Terrain resolution varies from 20 to 30 meters.
1 - AW3D30: only terrain! Terrain ends at the sea level (no sea/river/lake floor terrain). Terrain resolution varies from 20 to 30 meters.
2 - GMRT: terrain and underwater (sea/river/lake floor) terrain. Sea level is not presented. Terrain and underwater terrain resolution varies from 50 meter to 2000 meters.
-
If nothing supplied, 0 will be used as a default (SRTMGL1 terrain only).
- 27cade10-bd14-428e-b589-f696bdad23fb
- source_
- source_
- true
- 0
- true
- 0317a295-0589-41f5-bb44-539f9ce8d183
- 1
- 48d01794-d3d8-4aef-990e-127168822244
-
9788
1077
90
20
-
9834.5
1087
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 0
- true
- There are four terrain types:
-
0 - terrain will be created as a mesh with rectangular edges
1 - terrain will be created as a mesh with circular edges
2 - terrain will be created as a surface with rectangular edges
3 - terrain will be created as a surface with circular edges
-
If nothing supplied, 1 will be used as a default (terrain will be created as a mesh with circular edges).
- a9514fe3-20c0-4327-bea6-9398905b8775
- type_
- type_
- true
- 0
- true
- e08b77de-4188-4cd7-aed4-0f937f5a204e
- 1
- 48d01794-d3d8-4aef-990e-127168822244
-
9788
1097
90
20
-
9834.5
1107
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 1
- true
- Origin for the final "terrain" output.
-
If not supplied, default point of (0,0,0) will be used.
- d49aee83-6212-48ba-8641-256473ef3db2
- origin_
- origin_
- true
- 0
- true
- 0
- e1937b56-b1da-4c12-8bd8-e34ee81746ef
-
9788
1117
90
20
-
9834.5
1127
- true
- Input a vector to be used as a true North direction, or a number between 0 and 360 that represents the clockwise degrees off from the Y-axis.
-
If not supplied, default North direction will be set to the Y-axis (0 degrees).
- f6287b6e-eef9-40c1-9de7-fc7eee931572
- north_
- north_
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9788
1137
90
20
-
9834.5
1147
- true
- Thickness of the stand.
A stand is a basically a base constructed below the terrain mesh/surface. It can be used to create a terrain for cfd analysis or visualization purposes.
-
If not supplied, default value of 0 (no stand will be created) will be used.
-
In Rhino document units.
- d3888efb-5e53-4425-bba7-090b036b937e
- standThickness_
- standThickness_
- true
- 0
- true
- 0
- 39fbc626-7a01-46ab-a18e-ec1c0c41685b
-
9788
1157
90
20
-
9834.5
1167
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Number
- 0
- true
- Number of elevation contours.
If you would not like the elevationContours output to be calculated, set the numOfContours_ input to 0.
-
If not supplied, default value of 10 elevation contours will be used.
- 3f9870e9-5f6f-4a71-98c1-fb1552129adc
- numOfContours_
- numOfContours_
- true
- 0
- true
- 0
- 48d01794-d3d8-4aef-990e-127168822244
-
9788
1177
90
20
-
9834.5
1187
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_String
- false
- 0
- 2
- true
- In case your type_ input is set to 0 or 1, you can use the legendBakePar_ input to control the colors with which the final "terrain" mesh will be colored with based on elevation.
Use Gismo "Legend Bake Parameters" component's "customColors_" input to control these colors.
Also use its fontName_ and fontSize_ inputs to change the font, size of the "title" output.
- ed0e8ed1-44a3-4ea1-9e43-7b4a7bad4d5e
- legendBakePar_
- legendBakePar_
- true
- 2
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9788
1197
90
20
-
9834.5
1207
- true
- Script variable Python
- 05865c45-a7c7-4b00-be98-ddca9c03168d
- _____________
- _____________
- true
- 0
- true
- 0
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
9788
1217
90
20
-
9834.5
1227
- true
- Set to "True" to bake the terrain geometry into the Rhino scene.
-
If not supplied default value "False" will be used.
- eb262f2f-2101-4bd8-a456-013d017e3ad5
- bakeIt_
- bakeIt_
- true
- 0
- true
- 0
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
9788
1237
90
20
-
9834.5
1247
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- true
- !!! ATTENTION !!! This component may crash Rhino 5 application if radius_ input is set to a value of tens of thousands of meters! This may happen due to Rhino's inability to create such large terrains.
To prevent this, it is suggested to own a 64 bit version of Rhino 5 and have strong enough PC configuration. If you do not have either of these two, it is recommended to save your .gh definition before running this component!
- 00276940-4d8f-4703-b7b0-1d81170d027b
- _runIt
- _runIt
- true
- 0
- true
- 75b0c2ee-61c4-41f9-a300-4c68fc7d6e78
- 1
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
9788
1257
90
20
-
9834.5
1267
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Boolean
- false
- The geometry of the terrain.
-
Depening on the type_ input it will be either a mesh (type_ = 0 and 1) or a surface (type_ = 2 and 3)
- e48771cf-7cac-43eb-9574-580fe2ae3552
- terrain
- terrain
- false
- 0
-
9908
1037
98
60
-
9957
1067
- The origin (center) point of the "terrain" geometry. It's the same as "origin_" input point.
-
Use grasshopper's "Point" parameter to visualize it.
-
Use this point to move the "terrain" geometry around in the Rhino scene with grasshopper's "Move" component.
- true
- 871315a8-62c0-47a3-8e5e-ef01dbf403dc
- origin
- origin
- false
- 0
-
9908
1097
98
60
-
9957
1127
- Elevation of the origin_ input.
-
In Rhino document units.
- true
- b77b34d6-6d87-4de3-a78f-30baf14c20e9
- elevation
- elevation
- false
- 0
-
9908
1157
98
60
-
9957
1187
- Elevation contours.
Their number is defined by the numOfContours_ input. Set the numOfContours_ input to 0, if you would not like the elevationContours to be created.
- 64f8d4e7-dc04-4d12-9b84-12b39547cc9d
- elevationContours
- elevationContours
- false
- 0
-
9908
1217
98
60
-
9957
1247
- 8feb3db4-5bd9-4658-bf3a-e3d8e687f13d
- a5058970-b442-4922-91a1-9f0f715c9c46
- Relative Path
- Appends the directory this definition is saved in to a file path. Auto-converts the contents of a text panel containing an absolute path
- 15c4f51d-6403-4812-92ee-3e08add695dd
- Relative Path
- Relative Path
-
5305
3325
95
28
-
5351
3339
- The relative path to convert
- 8a21791e-2277-491b-a2ee-bd0bae2d488a
- Path
- Path
- false
- 0d02285b-3395-4f47-8bb0-9824204033e9
- 1
-
5307
3327
29
24
-
5323
3339
- The path made absolute
- 34a8155b-529f-4b14-816c-6c5d588f792f
- Path
- Path
- false
- 0
-
5366
3327
32
24
-
5382
3339
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 0d02285b-3395-4f47-8bb0-9824204033e9
- Panel
- false
- 0
- 0
- Google Maps Screenshot Edit.png
-
5123
3316
154
51
- 0
- 0
- 0
-
5123.212
3316.052
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312
- Number
- Contains a collection of floating point numbers
- 1
- 78b27c9f-72f8-4d2f-81f8-ed57369d1e59
- Number
- Site Radius
- false
- 4e7cb5dc-e1b4-421f-81e0-9b35c407326f
- 1
- 2
-
9182
1426
66
20
-
9215.013
1436.602
- 3cec9da4-eb68-4063-9325-57850921a8b2
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Expander
- A collapsible expander for content
- 42ede736-28e2-49cd-99b0-5ab22d116ca0
- Create Expander
- Create Expander
-
3104
1918
153
64
-
3185
1950
- 1
- The UI elements to put in the expander
- 3d064166-a53f-45ff-a7e2-9c7c76274766
- UI Elements
- UI Elements
- false
- 5f417076-775c-4f13-a96b-4b64e2aec514
- 1
-
3106
1920
64
20
-
3139.5
1930
- The text to display in the expander header
- 0e212f36-1053-44c3-9363-84d9d7b109d7
- Header
- Header
- false
- 3ba7b0a8-87fc-4783-a466-c8e022272b48
- 1
-
3106
1940
64
20
-
3139.5
1950
- 1
- 1
- {0}
- false
- The starting state of the expander - true for open, false for collapsed
- 2764abc1-2d47-487d-b8d6-147aec9ef614
- Open
- Open
- false
- 0
-
3106
1960
64
20
-
3139.5
1970
- 1
- 1
- {0}
- true
- The expander element
- d8edabc5-a9ed-46d2-b3bf-a807142fb6dd
- Expander
- Expander
- false
- 0
-
3200
1920
55
60
-
3227.5
1950
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 7d6f053a-6146-4c1b-9fe6-b869546a9fe1
- Panel
- false
- 0
- 0
- SITE IMPORTER
-
6399
2751
109
38
- 0
- 0
- 0
-
6399.778
2751.529
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 7334b6b3-a219-40cb-aad2-e8f4ce7882d3
- Number Slider
- Number Slider
- false
- 0
-
6348
2802
203
20
-
6348.479
2802.29
- 3
- 1
- 1
- 1000
- 0
- 0
- 505
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 764565ec-9c85-4260-b61b-229a802b4d1d
- Number Slider
- Number Slider
- false
- 0
-
6348
2828
203
20
-
6348.653
2828.257
- 3
- 1
- 1
- 1000
- 0
- 0
- 700
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 3ba7b0a8-87fc-4783-a466-c8e022272b48
- Panel
- false
- 0
- 0
- text
-
2947
1947
109
38
- 0
- 0
- 0
-
2947.297
1947.874
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- be2b005c-4921-490a-b876-fd16fce54dd4
- Entwine
- Entwine
-
1797
1783
118
104
-
1842
1835
- 5
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 871a8228-6eae-434d-b7da-53e7b53cda30
- false
- Branch {0;0}
- {0;0}
- true
- 94a1ede9-eb16-47e1-9c90-7d44b3faf751
- 1
-
1799
1785
28
20
-
1814.5
1795
- 2
- Data to entwine
- 6c3ee9bd-2b49-48c4-8059-f8719096b3bc
- false
- Branch {0;1}
- {0;1}
- true
- 73dcb207-f110-49bb-a5b7-67a9bce3a34c
- 1
-
1799
1805
28
20
-
1814.5
1815
- 2
- Data to entwine
- d91bfd38-9272-41f4-b8a4-205fe3e01fa3
- false
- Branch {0;2}
- {0;2}
- true
- 1b1cad79-da55-40f6-ab7d-aeddd7a9a1a5
- 1
-
1799
1825
28
20
-
1814.5
1835
- 2
- Data to entwine
- 56c5c356-e166-4547-9347-d0740940b629
- false
- Branch {0;3}
- {0;3}
- true
- 1a16fced-0d55-4e1e-8aaa-6d813b96bb31
- 1
-
1799
1845
28
20
-
1814.5
1855
- 2
- Data to entwine
- 7fb17e1a-d6bd-411c-86f4-47b57fe8883d
- false
- Branch {0;4}
- {0;4}
- true
- 4938af70-4864-4d0a-b4ef-2a3de78091c6
- 1
-
1799
1865
28
20
-
1814.5
1875
- Entwined result
- 00d199d0-35f6-4ca9-a639-f3d89eda2b2d
- 1
- Result
- Result
- false
- 0
-
1857
1785
56
100
-
1877
1835
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- e8670704-419c-4e7b-8dc1-7b4195228c22
- Value Listener
- Value Listener
- false
-
5126
3670
168
64
-
5217
3702
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 78e6b9d8-5b09-44cd-ba1e-0125aeac4b06
- Elements
- Elements
- false
- 00d199d0-35f6-4ca9-a639-f3d89eda2b2d
- 1
- 2
-
5128
3672
74
20
-
5166.5
3682
- 1
- The optional filter(s) for the elements you want to listen for.
- 9a9f0498-087d-42ae-bd1e-3d8bd52d41c8
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
5128
3692
74
20
-
5166.5
3702
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 7ab80883-30d9-4e2e-bdcc-6f7ccd38038d
- Trigger
- T
- true
- 4704f5be-aee0-4523-b98b-f529cd0b2cb6
- 1
- 2
-
5128
3712
74
20
-
5166.5
3722
- 2
- The values of the listened elements
- bc74a5c2-2bf0-4806-915e-c6719fb79e4e
- 1
- Values
- Values
- false
- 0
-
5232
3672
60
30
-
5254
3687
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 100e59d8-b4c0-406b-8ef4-aeb435490aeb
- Indices
- Indices
- false
- 0
-
5232
3702
60
30
-
5254
3717
- 501aecbb-c191-4d13-83d6-7ee32445ac50
- Cull Index
- Cull (remove) indexed elements from a list.
- 7f437267-41b6-494e-9e1d-29c633adc066
- Cull Index
- Cull Index
-
5473
3675
101
64
-
5531
3707
- 1
- List to cull
- da87bed2-5263-45a4-b75f-9d18570e952c
- List
- List
- false
- bc74a5c2-2bf0-4806-915e-c6719fb79e4e
- 1
-
5475
3677
41
20
-
5497
3687
- 1
- Culling indices
- 54d97383-a10c-4421-a061-407a7b0d45b6
- Indices
- Indices
- false
- 9dc2452d-72d1-4056-a535-48d4da1ad68b
- 1
-
5475
3697
41
20
-
5497
3707
- Wrap indices to list range
- a94e922e-9402-419e-96bb-7eea5b237f04
- Wrap
- Wrap
- false
- 0
-
5475
3717
41
20
-
5497
3727
- 1
- 1
- {0}
- true
- 1
- Culled list
- ab5b4302-b6e9-488b-beb1-b6a49be5e2e0
- List
- List
- false
- 0
-
5546
3677
26
60
-
5559
3707
- ae0b49b9-7ab6-4f95-9483-c6ab3a14b186
- 1c9de8a1-315f-4c56-af06-8f69fee80a7a
- Last Index
- Get the last index of a list (list length -1).
- 3cf4a98c-0efd-4b76-8d28-6bf4065c905f
- Last Index
- Last Index
-
5339
3704
93
28
-
5379
3718
- 1
- List of data to obtain the last index of
- de9dc2c3-e13a-41b1-b572-bde23dc9a73d
- List
- List
- false
- bc74a5c2-2bf0-4806-915e-c6719fb79e4e
- 1
-
5341
3706
23
24
-
5354
3718
- The last index of the list
- 9dc2452d-72d1-4056-a535-48d4da1ad68b
- Index
- Index
- false
- 0
-
5394
3706
36
24
-
5412
3718
- 5ab78609-c132-45c7-ba44-200a4f2e4188
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create True-Only Button
- 0
- Create a True only Button object.
- f45cbe67-e55d-4fa0-a13c-12df954eb984
- Create True-Only Button
- Create True-Only Button
-
526
2201
149
44
-
615
2223
- The text to display on the button
- 503b779d-2e37-490a-8315-04b0f0816b51
- Button Name
- Button Name
- true
- 60eef9dc-ca04-41ed-aa29-1b2998f69386
- 1
-
528
2203
72
20
-
565.5
2213
- The image to display on the button.
- 9d047697-6407-48b9-85dc-a2baf0abf2b1
- Image Path
- Image Path
- true
- 0
-
528
2223
72
20
-
565.5
2233
- The created Button
- 4938af70-4864-4d0a-b4ef-2a3de78091c6
- Button
- Button
- false
- 0
-
630
2203
43
40
-
651.5
2223
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 43067eb6-e5e1-4c77-b896-afb1b0d4b6b0
- Value Listener
- Value Listener
- true
-
1400
1317
152
44
-
1491
1339
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- f1c8ffa3-b8d5-433a-9335-26c2097cc539
- Elements
- Elements
- false
- b137913a-7f52-490f-b5c5-dfab26abd03d
- 1
-
1402
1319
74
20
-
1440.5
1329
- 1
- The optional filter(s) for the elements you want to listen for.
- c61890da-1640-4cb6-940e-6684b36f9462
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1402
1339
74
20
-
1440.5
1349
- 2
- The values of the listened elements
- 1240094d-0389-4a59-aaef-f44cea3d7331
- Values
- Values
- false
- 0
-
1506
1319
44
20
-
1528
1329
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- a0a1c4b1-fc45-4d5e-92f8-1aa15ace7d48
- Indices
- Indices
- false
- 0
-
1506
1339
44
20
-
1528
1349
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 026c9fe4-a9b0-422d-a436-ec24a30aad4e
- Entwine
- Entwine
-
2788
1898
118
64
-
2833
1930
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 120cc220-6600-46f7-9143-596ecadae2e5
- false
- Branch {0;0}
- {0;0}
- true
- 0
-
2790
1900
28
20
-
2805.5
1910
- 2
- Data to entwine
- 0701c917-958c-44b0-b2dd-47e4bac1e3e5
- false
- Branch {0;1}
- {0;1}
- true
- d72c5dd9-fcde-4b15-88ce-219ffeb30434
- 1
-
2790
1920
28
20
-
2805.5
1930
- 2
- Data to entwine
- 2fc4e48e-2464-43a4-8e39-1e2acda5e73d
- false
- Branch {0;2}
- {0;2}
- true
- 4a1eb54a-a81b-4aa3-a536-8eebee3f47b8
- 1
-
2790
1940
28
20
-
2805.5
1950
- Entwined result
- 5f417076-775c-4f13-a96b-4b64e2aec514
- 1
- Result
- Result
- false
- 0
-
2848
1900
56
60
-
2868
1930
- d8332545-21b2-4716-96e3-8559a9876e17
- Dispatch
- Dispatch the items in a list into two target lists.
- be9989e0-0a8a-417e-b541-210341aaebb9
- Dispatch
- Dispatch
-
2565
1918
157
44
-
2669
1940
- 1
- List to filter
- 34820f2b-ccca-4b35-8255-0335537a7349
- List
- List
- false
- c095a19c-69e9-470f-8a33-60c4b9db8527
- 1
-
2567
1920
87
20
-
2612
1930
- 1
- Dispatch pattern
- 13401110-579f-4d2d-868b-97accdfef813
- Dispatch pattern
- Dispatch pattern
- false
- 58db937d-c561-44e6-b3a2-ef9973a47cec
- 1
-
2567
1940
87
20
-
2612
1950
- 1
- 2
- {0}
- true
- false
- 1
- Dispatch target for True values
- d72c5dd9-fcde-4b15-88ce-219ffeb30434
- List A
- List A
- false
- 0
-
2684
1920
36
20
-
2702
1930
- 1
- Dispatch target for False values
- 52e23405-17ba-4c53-9447-958b813efff3
- List B
- List B
- false
- 0
-
2684
1940
36
20
-
2702
1950
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5ce6f7e3-f15f-452b-91b0-75d09b9fff1f
- Panel
- false
- 0
- 0
- Confirm Lat/Long
-
679
2710
115
38
- 0
- 0
- 0
-
679.7217
2710.171
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 46b20cad-e0c1-435a-8304-d3715081fd91
- Value Listener
- Value Listener
- true
-
1013
2720
152
44
-
1104
2742
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 5c347182-26f6-4009-aae2-ff620cd6025d
- Elements
- Elements
- false
- 7a4e494b-ffc5-45c6-a50c-31bdcec2926f
- 1
-
1015
2722
74
20
-
1053.5
2732
- 1
- The optional filter(s) for the elements you want to listen for.
- 36ebec3b-aa8e-4801-85bb-137b096cb179
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1015
2742
74
20
-
1053.5
2752
- 2
- The values of the listened elements
- e81330f8-8826-4aee-8447-918cb4542687
- Values
- Values
- false
- 0
-
1119
2722
44
20
-
1141
2732
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- de21a912-3f7d-4eb4-82ec-82e2590e8269
- Indices
- Indices
- false
- 0
-
1119
2742
44
20
-
1141
2752
- 5ab78609-c132-45c7-ba44-200a4f2e4188
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create True-Only Button
- 0
- Create a True only Button object.
- 4557fa9d-5d05-42c5-9291-549fcbc87e96
- Create True-Only Button
- Create True-Only Button
-
827
2711
149
44
-
916
2733
- The text to display on the button
- d5e1a959-66aa-4631-b2b1-10f282160b02
- Button Name
- Button Name
- true
- 5ce6f7e3-f15f-452b-91b0-75d09b9fff1f
- 1
-
829
2713
72
20
-
866.5
2723
- The image to display on the button.
- 72b54696-a05e-4766-b058-bd91d9839cfa
- Image Path
- Image Path
- true
- 0
-
829
2733
72
20
-
866.5
2743
- The created Button
- 7a4e494b-ffc5-45c6-a50c-31bdcec2926f
- Button
- Button
- false
- 0
-
931
2713
43
40
-
952.5
2733
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- c06d02a0-8857-4547-95ea-05e2084e868a
- Create Text Box
- Create Text Box
- true
-
1389
2636
163
64
-
1484
2668
- Optional label for the Text Box
- fb92e3ac-2afa-4542-ab51-42605ae8c114
- Label
- Label
- false
- 784cf26c-2d36-4848-a044-7b6115887d50
- 1
-
1391
2638
78
20
-
1431.5
2648
- 1
- 1
- {0}
- false
- The starting text in the text box
- 64e16c2f-61b3-4164-8581-1f3afa159ea1
- Default Text
- Default Text
- false
- ff5bc84c-c18b-4339-9734-4b92fc1934e4
- 1
-
1391
2658
78
20
-
1431.5
2668
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- 88be09c7-43ce-4656-b93a-f67dad6af004
- Update Button
- Update Button
- false
- 0
-
1391
2678
78
20
-
1431.5
2688
- 1
- 1
- {0}
- false
- The created text box.
- 05408818-6a6a-4e1b-9f2c-fd3cf85c4bc7
- Text Box
- Text Box
- false
- 0
-
1499
2638
51
60
-
1524.5
2668
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 784cf26c-2d36-4848-a044-7b6115887d50
- Panel
- false
- 0
- 0
- Lat/Long
-
1216
2597
115
42
- 0
- 0
- 0
-
1216.747
2597.967
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- 0716a6cb-f761-47cb-8684-f4bf06c5452d
- Set TextBox Contents
- Set TextBox Contents
-
1762
2656
149
44
-
1897
2678
- The text box object to modify
- 305e509f-0cd6-40ae-8a05-228cc21a099e
- Text Box to modify
- Text Box to modify
- false
- 05408818-6a6a-4e1b-9f2c-fd3cf85c4bc7
- 1
-
1764
2658
118
20
-
1824.5
2668
- The new text to display in the text box
- 4abd5418-4258-42ae-acee-32964fbdb3bb
- New Text Box contents
- New Text Box contents
- false
- 5cf043ec-869c-4eb9-94d5-cf7ac12d6c96
- 1
-
1764
2678
118
20
-
1824.5
2688
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- f2c27da9-2af0-4862-82e2-25e87622ff55
- Value Listener
- Value Listener
- false
-
1589
2684
152
64
-
1680
2716
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- dfcc808e-b63a-4aa3-8a8b-86965cde7322
- Elements
- Elements
- false
- 05408818-6a6a-4e1b-9f2c-fd3cf85c4bc7
- 1
-
1591
2686
74
20
-
1629.5
2696
- 1
- The optional filter(s) for the elements you want to listen for.
- 0ee1f74d-5179-4d1c-821e-3feb9b5b9977
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1591
2706
74
20
-
1629.5
2716
- An optional input parameter to force trigger an update (useful when the component is in manual mode)
- 553b1e07-3961-4611-82c4-061faa34fbc1
- Trigger
- T
- true
- e81330f8-8826-4aee-8447-918cb4542687
- 1
-
1591
2726
74
20
-
1629.5
2736
- 2
- The values of the listened elements
- 5cf043ec-869c-4eb9-94d5-cf7ac12d6c96
- Values
- Values
- false
- 0
-
1695
2686
44
30
-
1717
2701
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- dc578b0c-ca41-44c2-904a-8cd5904aa0ce
- Indices
- Indices
- false
- 0
-
1695
2716
44
30
-
1717
2731
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 296a4c40-da41-477f-a03c-1a37cca5b029
- Entwine
- Entwine
-
2384
1980
118
44
-
2429
2002
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- c1e7c79c-026a-44ff-b14f-4a53748209be
- false
- Branch {0;0}
- {0;0}
- true
- 05408818-6a6a-4e1b-9f2c-fd3cf85c4bc7
- 1
-
2386
1982
28
20
-
2401.5
1992
- 2
- Data to entwine
- 8a6ec940-1094-4008-9164-d414457e8860
- false
- Branch {0;1}
- {0;1}
- true
- 7a4e494b-ffc5-45c6-a50c-31bdcec2926f
- 1
-
2386
2002
28
20
-
2401.5
2012
- Entwined result
- d9886486-4df0-46d8-b33f-02ba0900d595
- 1
- Result
- Result
- false
- 0
-
2444
1982
56
40
-
2464
2002
- d8332545-21b2-4716-96e3-8559a9876e17
- Dispatch
- Dispatch the items in a list into two target lists.
- ab58fd1b-6ead-443e-96af-76a18d118b1f
- Dispatch
- Dispatch
-
2562
1990
157
44
-
2666
2012
- 1
- List to filter
- 45f3c886-3253-4b52-b9b5-ef589a2160f0
- List
- List
- false
- d9886486-4df0-46d8-b33f-02ba0900d595
- 1
-
2564
1992
87
20
-
2609
2002
- 1
- Dispatch pattern
- 90975091-c812-4a5e-b4e9-dfcd5aad1da1
- Dispatch pattern
- Dispatch pattern
- false
- 58db937d-c561-44e6-b3a2-ef9973a47cec
- 1
-
2564
2012
87
20
-
2609
2022
- 1
- 2
- {0}
- true
- false
- 1
- Dispatch target for True values
- 08444580-960c-4a4d-bfaa-a7c428736480
- List A
- List A
- false
- 0
-
2681
1992
36
20
-
2699
2002
- 1
- Dispatch target for False values
- 4a1eb54a-a81b-4aa3-a536-8eebee3f47b8
- List B
- List B
- false
- 0
-
2681
2012
36
20
-
2699
2022
- 9df5e896-552d-4c8c-b9ca-4fc147ffa022
- Expression
- Evaluate an expression
- If(x, 1, 0)
- true
- 6721d106-fe27-4647-bb47-ad7ba7d8755f
- Expression
- Expression
-
8776
822
174
28
-
8849
836
- 1
- ba80fd98-91a1-4958-b6a7-a94e40e52bdb
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Expression variable
- d7fe6fb3-860c-47d1-a273-3b3d352fdd4d
- Variable x
- x
- true
- 58db937d-c561-44e6-b3a2-ef9973a47cec
- 1
- 2
-
8778
824
12
24
-
8785.5
836
- Result of expression
- 7c43999a-af5a-438f-a429-5fbf6ea75f63
- Result
- Result
- false
- 0
-
8908
824
40
24
-
8928
836
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 0e17549b-7b50-469e-9767-ddb41c934919
- Entwine
- Entwine
-
1418
2487
118
44
-
1463
2509
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 0b094df0-3f5a-4e02-91ad-303a6e2a9ede
- false
- Branch {0;0}
- {0;0}
- true
- cee80eec-501c-42df-8d87-29481638b090
- 1
-
1420
2489
28
20
-
1435.5
2499
- 2
- Data to entwine
- 0d7908e9-639a-4f8b-b807-dcd33ddb5589
- false
- Branch {0;1}
- {0;1}
- true
- 094ddc65-3d05-46d7-bd06-edc14a272ab8
- 1
-
1420
2509
28
20
-
1435.5
2519
- Entwined result
- ee2f1bdc-b352-4c8b-ae2e-ea87511f65af
- 1
- Result
- Result
- false
- 0
-
1478
2489
56
40
-
1498
2509
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 38ef12d9-4a85-4d0d-a8a8-bf5e3d7a39a8
- Entwine
- Entwine
-
2382
1908
118
44
-
2427
1930
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- eb230a1c-7f52-41a3-944b-22f9900a516e
- false
- Branch {0;0}
- {0;0}
- true
- 00d199d0-35f6-4ca9-a639-f3d89eda2b2d
- 1
-
2384
1910
28
20
-
2399.5
1920
- 2
- Data to entwine
- 813add48-0c6d-499c-abef-435aa345645d
- false
- Branch {0;1}
- {0;1}
- true
- ee2f1bdc-b352-4c8b-ae2e-ea87511f65af
- 1
-
2384
1930
28
20
-
2399.5
1940
- Entwined result
- c095a19c-69e9-470f-8a33-60c4b9db8527
- 1
- Result
- Result
- false
- 0
-
2442
1910
56
40
-
2462
1930
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 2d5e245d-37e7-45a2-9c93-195e72ce47dc
- Panel
- false
- 0
- 0
- Example: 44.97752677802471, -93.2617974596169
-
763
2358
169
79
- 0
- 0
- 0
-
763.8369
2358.434
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ff5bc84c-c18b-4339-9734-4b92fc1934e4
- Panel
- false
- 0
- 0
- Example: 44.97752677802471, -93.2617974596169
-
1188
2645
169
79
- 0
- 0
- 0
-
1188.37
2645.639
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- true
- b243b69e-00cb-4378-adfe-9eeb9a8899ed
- Entwine
- Entwine
-
8811
864
118
44
-
8856
886
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 2f2a25c8-bc30-4821-8b3c-23d8c2b9732c
- false
- Branch {0;0}
- {0;0}
- true
- 5cf043ec-869c-4eb9-94d5-cf7ac12d6c96
- 1
- 2
-
8813
866
28
20
-
8828.5
876
- 2
- Data to entwine
- af7ca9c1-4f10-42af-8e4d-163253524564
- false
- Branch {0;1}
- {0;1}
- true
- da6ad759-3e7e-4f9d-9ed9-2677d39da640
- 1
- 2
-
8813
886
28
20
-
8828.5
896
- Entwined result
- 0ce5b974-c9c2-4897-88e4-f8038bf24be3
- 1
- Result
- Result
- false
- 0
-
8871
866
56
40
-
8891
886
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- true
- 9450b53c-e1ef-413d-9747-5d6546324a3b
- List Item
- List Item
-
8968
874
80
64
-
9018
906
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- 9d5a6f22-5e5e-4d67-99d9-5005a4261db7
- List
- List
- false
- 0ce5b974-c9c2-4897-88e4-f8038bf24be3
- 1
-
8970
876
33
20
-
8988
886
- Item index
- 48ef643a-0a86-4c02-9a93-596dc6358f4c
- Index
- Index
- false
- 7c43999a-af5a-438f-a429-5fbf6ea75f63
- 1
-
8970
896
33
20
-
8988
906
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- 40a33356-e925-4ad9-aa06-b191bc7ad0a8
- Wrap
- Wrap
- false
- 0
-
8970
916
33
20
-
8988
926
- 1
- 1
- {0}
- true
- Item at {i'}
- 4f9426bc-05a9-4d20-9d88-8facd7277486
- false
- Item
- i
- false
- 0
-
9033
876
13
60
-
9039.5
906
- c77acc8a-fe64-43f0-9485-d23744f6152e
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Slider
- Create a slider with a label and a value readout.
- 4d49c03a-c22d-402b-8f03-20a4ca2c523b
- Create Slider
- Create Slider
- false
- false
- false
- true
- true
-
818
3959
137
44
-
896
3981
- 2
- The slider(s) to add to the window.
- 5e15bc46-9f89-4c0a-a7c8-1feeeb31eb59
- Slider
- Slider
- false
- c5de93b4-1cc0-4241-895e-5add85af429b
- 1
-
820
3961
61
20
-
852
3971
- 1
- An optional value to round/snap slider to. This overrides the native settings on the GH slider.
- 535c54c6-0909-4d00-8e23-49e386e0c689
- Snap Value
- Snap Value
- true
- 0
-
820
3981
61
20
-
852
3991
- 1
- The Slider UI elements. Use in conjunction with an "Add Elements" component.
- c9596c53-0fc2-4d87-af35-01977c6436b0
- Sliders
- Sliders
- false
- 0
-
911
3961
42
40
-
932
3981
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- a8080f78-48c1-41a8-bb07-6b1b78458f04
- Value Listener
- Value Listener
- true
-
985
3969
152
44
-
1076
3991
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 27fd4406-8211-456b-92b2-7bc87c9f847f
- Elements
- Elements
- false
- c9596c53-0fc2-4d87-af35-01977c6436b0
- 1
-
987
3971
74
20
-
1025.5
3981
- 1
- The optional filter(s) for the elements you want to listen for.
- d2aca63c-55a3-481d-81fb-ce103b65cbaf
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
987
3991
74
20
-
1025.5
4001
- 2
- The values of the listened elements
- 4e7cb5dc-e1b4-421f-81e0-9b35c407326f
- Values
- Values
- false
- 0
-
1091
3971
44
20
-
1113
3981
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 88eada0f-5b95-4a8a-8020-4c4ddb09a1c7
- Indices
- Indices
- false
- 0
-
1091
3991
44
20
-
1113
4001
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 61ea44d6-08fd-4124-b73f-a64739852bb0
- Value Listener
- Value Listener
- true
-
1079
4573
152
44
-
1170
4595
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- b225dee4-e885-4252-8fb7-18152c3e4ff8
- Elements
- Elements
- false
- c369d8ce-20fb-4eef-8771-13103425762c
- 1
-
1081
4575
74
20
-
1119.5
4585
- 1
- The optional filter(s) for the elements you want to listen for.
- fc43bc4c-05d4-4ccd-a92f-41b6452ef4fa
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1081
4595
74
20
-
1119.5
4605
- 2
- The values of the listened elements
- be25bee9-5bab-46ea-97ef-3ce30a7ea276
- Values
- Values
- false
- 0
-
1185
4575
44
20
-
1207
4585
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 9fafc177-9167-474f-b2a1-3a6d02e2445f
- Indices
- Indices
- false
- 0
-
1185
4595
44
20
-
1207
4605
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- b142a454-42a2-434f-836e-a7ba271be63d
- Panel
- false
- 0
- 0
- SRTMGL1: Terrain only from -55.9 to 55.9 degrees Latitude. Terrain ends at sea level. Resolution varies from 20-30 meters.
AW3D30: Terrain only. Terrain ends at sea level. Resolution varies from 20-30 meters.
-
628
4596
212
160
- 0
- 0
- 0
-
628.5117
4596.66
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 508100ce-ed3a-41f0-be49-895ba2c70286
- Create Text Block
- Create Text Block
-
1175
4738
157
64
-
1256
4770
- The text to display in the text block
- 6299516a-2930-481e-8355-2b37a871ead4
- Text
- Text
- false
- 98f997b1-ba86-4717-893d-a2d0d8894a8c
- 1
-
1177
4740
64
20
-
1210.5
4750
- The size of the label to display
- 22562004-9981-45e0-8dcc-bb81fdde8854
- Text Size
- Text Size
- false
- 0
-
1177
4760
64
20
-
1210.5
4770
- 1
- 1
- {0}
- 12
- Text justification
- 51590f67-9512-4723-850d-e01ec821239b
- Justification
- Justification
- false
- 0
-
1177
4780
64
20
-
1210.5
4790
- 1
- 1
- {0}
- 0
- The created text block.
- 7fc02f9a-e2d9-4b2c-ad61-924dd74ce2a5
- Text Block
- Text Block
- false
- 0
-
1271
4740
59
60
-
1300.5
4770
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- 6837b896-aab4-41ad-8bd4-92f882855816
- List Item
- List Item
-
1249
4662
80
64
-
1299
4694
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- 72d285e7-1e7b-48f7-9bbf-451c140b3854
- List
- List
- false
- b142a454-42a2-434f-836e-a7ba271be63d
- 1
-
1251
4664
33
20
-
1269
4674
- Item index
- 779309ab-b6a4-4f7f-966a-36848e4a1a9c
- Index
- Index
- false
- 9fafc177-9167-474f-b2a1-3a6d02e2445f
- 1
-
1251
4684
33
20
-
1269
4694
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- 2507650b-5ef5-4f52-907c-58ca2c3ecfc2
- Wrap
- Wrap
- false
- 0
-
1251
4704
33
20
-
1269
4714
- 1
- 1
- {0}
- true
- Item at {i'}
- 02c0926d-d846-419b-8089-c3d72d1b79db
- false
- Item
- i
- false
- 0
-
1314
4664
13
60
-
1320.5
4694
- a1e21ba0-2f60-41df-bb5a-619802c5af9a
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBlock Contents
- Modify the contents of an existing Text Block object.
- 134a58ee-3414-4d69-998b-967e1fe161d7
- Set TextBlock Contents
- Set TextBlock Contents
-
1468
4662
157
44
-
1611
4684
- The text block object to modify
- c9d0c683-a1a8-4733-bcdd-536f29a1f743
- Text Block to modify
- Text Block to modify
- false
- 7fc02f9a-e2d9-4b2c-ad61-924dd74ce2a5
- 1
-
1470
4664
126
20
-
1534.5
4674
- The new text to display in the text block
- 3d214299-f795-4374-855e-74107d8e3a81
- New Text Block contents
- New Text Block contents
- false
- 02c0926d-d846-419b-8089-c3d72d1b79db
- 1
-
1470
4684
126
20
-
1534.5
4694
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 98f997b1-ba86-4717-893d-a2d0d8894a8c
- Panel
- false
- 0
- 0
- text
-
1086
4734
49
38
- 0
- 0
- 0
-
1086.833
4734.066
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 439edf67-b398-4de7-948e-b6a72e485248
- Panel
- false
- 0
- 0
- Square Site Plan
Circular Site Plan
-
605
3595
127
70
- 0
- 0
- 0
-
605.4873
3595.334
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 3eaeef40-fd3e-4074-bc65-e46182a26b9a
- Value Listener
- Value Listener
- true
-
1047
3639
152
44
-
1138
3661
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- ced73924-5d08-4b01-ab0b-771811047e83
- Elements
- Elements
- false
- 1a0c3302-e02c-438a-851d-4f72cf9b1ed1
- 1
-
1049
3641
74
20
-
1087.5
3651
- 1
- The optional filter(s) for the elements you want to listen for.
- 33274fb6-0724-4a7c-bf49-d80bcfd641ef
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1049
3661
74
20
-
1087.5
3671
- 2
- The values of the listened elements
- 87815e97-5334-413d-8d19-0f42cc6ccfb8
- Values
- Values
- false
- 0
-
1153
3641
44
20
-
1175
3651
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 427089e8-fd24-4760-87e9-4804bedf4a0e
- Indices
- Indices
- false
- 0
-
1153
3661
44
20
-
1175
3671
- ff8ebc79-b1ce-430b-8734-e1993f7e477f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Range Slider
- Creates a double-slider that describes a range
- f229c634-5270-4d0a-9980-e5e7fbb87b98
- Create Range Slider
- Create Range Slider
-
809
7066
184
44
-
905
7088
- The range that defines the min and max of the slider extents
- 13a63c11-305b-47cc-a553-5877985539da
- Slider Range
- Slider Range
- false
- 777f2d75-71c2-4628-8713-211e19d02fc5
- 1
-
811
7068
79
20
-
852
7078
- The initial value selected on the slider
- 18603576-ed60-476e-86ed-5e9a8e7579db
- Starting Range
- Starting Range
- false
- af2865b9-a94d-4b77-9095-a4c215c276b7
- 1
-
811
7088
79
20
-
852
7098
- The Range Slider Element.
- 5783c4a6-8eb5-4212-9a35-55a5ef9a6af7
- Range Slider
- Range Slider
- false
- 0
-
920
7068
71
40
-
955.5
7088
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- 7c99dd3a-bd51-4f53-9bde-fb596ee63836
- Construct Domain
- Construct Domain
-
612
7037
152
44
-
699
7059
- Start value of numeric domain
- 9799cc27-f33b-47fa-87a5-2fa8ca5dbdcb
- Domain start
- Domain start
- false
- 0
-
614
7039
70
20
-
650.5
7049
- 1
- 1
- {0}
- 0
- End value of numeric domain
- be3b3436-cc4e-4b2e-a4d7-5629103566eb
- Domain end
- Domain end
- false
- 0
-
614
7059
70
20
-
650.5
7069
- 1
- 1
- {0}
- 100
- Numeric domain between {A} and {B}
- 777f2d75-71c2-4628-8713-211e19d02fc5
- Domain
- Domain
- false
- 0
-
714
7039
48
40
-
738
7059
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- b613b565-5140-47e9-8bbd-c6a62083fe74
- Construct Domain
- Construct Domain
-
612
7100
152
44
-
699
7122
- Start value of numeric domain
- 2fc95adc-907c-4c6c-94e3-e304ac9cba81
- Domain start
- Domain start
- false
- 0
-
614
7102
70
20
-
650.5
7112
- 1
- 1
- {0}
- 20
- End value of numeric domain
- 84d6265b-5f10-4046-bcfa-2e0c51ec8cd5
- Domain end
- Domain end
- false
- 0
-
614
7122
70
20
-
650.5
7132
- 1
- 1
- {0}
- 35
- Numeric domain between {A} and {B}
- af2865b9-a94d-4b77-9095-a4c215c276b7
- Domain
- Domain
- false
- 0
-
714
7102
48
40
-
738
7122
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 36cd1795-01cb-449e-ac55-966aa0382e0b
- Value Listener
- Value Listener
- true
-
1047
7117
152
44
-
1138
7139
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- ac600c83-3a09-41c9-bc00-6636bfba58a5
- Elements
- Elements
- false
- 5783c4a6-8eb5-4212-9a35-55a5ef9a6af7
- 1
-
1049
7119
74
20
-
1087.5
7129
- 1
- The optional filter(s) for the elements you want to listen for.
- 068a6ae1-afce-4d82-a748-c1d0b36a654f
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1049
7139
74
20
-
1087.5
7149
- 2
- The values of the listened elements
- de309b1e-82d9-4ab1-9424-c8a73ae9344c
- Values
- Values
- false
- 0
-
1153
7119
44
20
-
1175
7129
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 1b835a94-20dc-45dc-8a0d-cf64918bb181
- Indices
- Indices
- false
- 0
-
1153
7139
44
20
-
1175
7149
- 825ea536-aebb-41e9-af32-8baeb2ecb590
- Deconstruct Domain
- Deconstruct a numeric domain into its component parts.
- feff88a5-f7df-4db7-9da5-b68d7f3addcc
- Deconstruct Domain
- Deconstruct Domain
-
10358
1476
112
44
-
10420
1498
- Base domain
- 0c3f7e1e-d480-428c-bb48-b6f03b17d69d
- Domain
- Domain
- false
- ecd9311a-ab28-43a7-a0a6-301d4250fa09
- 1
-
10360
1478
45
40
-
10384
1498
- Start of domain
- fda80060-008c-416a-b885-dc25942175d3
- Start
- Start
- false
- 0
-
10435
1478
33
20
-
10451.5
1488
- End of domain
- b8ea3920-4761-40ad-9d11-4e507eddf65c
- End
- End
- false
- 0
-
10435
1498
33
20
-
10451.5
1508
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 3df71b4e-9ae7-4e99-95b2-854f217c8afe
- Panel
- false
- 0
- 0
- Random height range for buildings without height information:
-
807
6719
227
65
- 0
- 0
- 0
-
807.7159
6719.763
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- 697e7063-b680-4977-a4b5-967f16fe8b32
- Construct Domain
- Construct Domain
-
982
4038
152
44
-
1069
4060
- Start value of numeric domain
- be4b8159-ebef-4146-a6e7-e8c10c393d49
- Domain start
- Domain start
- false
- 0
-
984
4040
70
20
-
1020.5
4050
- 1
- 1
- {0}
- 800
- End value of numeric domain
- 3efc409f-55c2-4434-9c69-c84b7912e031
- Domain end
- Domain end
- false
- 0
-
984
4060
70
20
-
1020.5
4070
- 1
- 1
- {0}
- 3000
- Numeric domain between {A} and {B}
- 84e10d1c-d3c2-41f7-ac9b-142e58598f43
- Domain
- Domain
- false
- 0
-
1084
4040
48
40
-
1108
4060
- 825ea536-aebb-41e9-af32-8baeb2ecb590
- Deconstruct Domain
- Deconstruct a numeric domain into its component parts.
- 15cd5492-33d5-4d0d-a80d-daa1c57fbd59
- Deconstruct Domain
- Deconstruct Domain
-
1241
7107
112
44
-
1303
7129
- Base domain
- b68d7a9a-14a1-44c0-bc68-ed7168f1b338
- Domain
- Domain
- false
- de309b1e-82d9-4ab1-9424-c8a73ae9344c
- 1
-
1243
7109
45
40
-
1267
7129
- Start of domain
- 6debcba6-7298-407c-8221-35285be4e974
- Start
- Start
- false
- 0
-
1318
7109
33
20
-
1334.5
7119
- End of domain
- 4c5e4c48-e59c-4073-ad56-31eb1c5ed132
- End
- End
- false
- 0
-
1318
7129
33
20
-
1334.5
7139
- 2013e425-8713-42e2-a661-b57e78840337
- Concatenate
- Concatenate some fragments of text
- 09f0b943-cf1f-4dda-b74d-ea779b46250c
- Concatenate
- Concatenate
-
1920
7037
89
84
-
1952
7079
- 4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 1
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- First text fragment
- 54b6756a-a74a-478f-a344-660f49f988bc
- Fragment A
- A
- true
- 36291800-5603-4544-b185-55d0dc9da800
- 1
-
1922
7039
15
20
-
1931
7049
- Second text fragment
- 5c6e2ac3-3818-426c-9a57-34b540f60410
- Fragment B
- B
- true
- 5ae65944-3c03-4216-a5a6-4b9bf3ff61e4
- 1
-
1922
7059
15
20
-
1931
7069
- Third text fragment
- e286cb55-7372-4efb-9223-0b5dd790ad72
- Fragment C
- C
- true
- bc036851-260a-4c9b-9e6e-0012a14a9f8a
- 1
-
1922
7079
15
20
-
1931
7089
- Additional text fragment
- 34327c7a-807f-4d53-9354-5f8a647a9ac7
- Fragment D
- D
- true
- 53385c35-3809-40ba-8d1d-07c2f748324f
- 1
-
1922
7099
15
20
-
1931
7109
- Resulting text consisting of all the fragments
- f9ff208e-5ba0-4d62-beef-7dfef187abba
- Result
- Result
- false
- 0
-
1967
7039
40
80
-
1987
7079
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5ae65944-3c03-4216-a5a6-4b9bf3ff61e4
- Panel
- false
- 0
- 0
- ft to
-
1483
6963
58
44
- 0
- 0
- 0
-
1483.575
6963.172
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 59511a77-ba90-4d51-8842-348b49a29aff
- Panel
- false
- 0
- 0
- Generate/Refresh Site Plan Preview
-
1077
7472
142
38
- 0
- 0
- 0
-
1077.119
7472.689
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 64a929ee-9755-457f-ba7a-0d4790f09d66
- Value Listener
- Value Listener
- true
-
1470
7485
152
44
-
1561
7507
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 23c291d6-79b2-48a3-adfb-73fb14191cf2
- Elements
- Elements
- false
- b9072a40-5f60-4608-8269-71b08c06548a
- 1
-
1472
7487
74
20
-
1510.5
7497
- 1
- The optional filter(s) for the elements you want to listen for.
- 68cfc472-e578-418d-803a-cd95b02776e4
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1472
7507
74
20
-
1510.5
7517
- 2
- The values of the listened elements
- c2c0fb66-5665-4e0e-9893-abb55f1699c4
- Values
- Values
- false
- 0
-
1576
7487
44
20
-
1598
7497
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 4a837c0d-22c9-43d4-a0a3-525a38484598
- Indices
- Indices
- false
- 0
-
1576
7507
44
20
-
1598
7517
- cb95db89-6165-43b6-9c41-5702bc5bf137
- Boolean
- Contains a collection of boolean values
- 1
- bef8d5b7-b32c-4ec9-99c3-6472dfbb5191
- Boolean
- Generate Site Plan
- false
- c2c0fb66-5665-4e0e-9893-abb55f1699c4
- 1
- 2
-
8773
1545
102
20
-
8824.618
1555.184
- b6236720-8d88-4289-93c3-ac4c99f9b97b
- Relay
- 2
- A wire relay object
- 75b0c2ee-61c4-41f9-a300-4c68fc7d6e78
- Relay
- false
- bef8d5b7-b32c-4ec9-99c3-6472dfbb5191
- 1
-
8910
1509
40
16
-
8930
1517
- b6236720-8d88-4289-93c3-ac4c99f9b97b
- Relay
- 2
- A wire relay object
- bcabb822-a379-4c50-9238-39c1f64ebb04
- Relay
- false
- bef8d5b7-b32c-4ec9-99c3-6472dfbb5191
- 1
-
8910
1547
40
16
-
8930
1555
- b6236720-8d88-4289-93c3-ac4c99f9b97b
- Relay
- 2
- A wire relay object
- ad12a014-f45d-4fa7-b566-e67f5ece9c48
- Relay
- false
- bef8d5b7-b32c-4ec9-99c3-6472dfbb5191
- 1
-
8910
1585
40
16
-
8930
1593
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
- Boolean (true/false) toggle
- 506ee423-698b-410d-80a1-e37904137fed
- Boolean Toggle
- Boolean Toggle
- false
- 0
- true
-
9689
891
146
22
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
- Provides a list of preset values to choose from
- 2aaecc35-d41a-4260-80d5-274c817b14ee
- 5
- 1
- Value List
- Resolution
- false
- 0
- None
- false
- 256
- Low
- false
- 512
- Med
- false
- 1024
- High
- false
- 2048
- Max
- true
-
10335
725
128
22
-
10400
725
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
- Provides a list of preset values to choose from
- 2611af1f-6168-45eb-ae02-1f3968b0bc28
- 15
- 1
- Value List
- ESRI ArcGIS Base Maps
- false
- 0
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export?"
- World Imagery
- true
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/export?"
- World Topographic
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/export?"
- World Physical Map
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export?"
- World Street Map
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/DeLorme_World_Base_Map/MapServer/export?"
- World DeLorme Street Map
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/export?"
- World Shaded Relief
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/export?"
- World Terrain Base
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/export?"
- World Boundaries and Places
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/export?"
- World Boundaries and Places Alt
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/export?"
- World Reference Overlay
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/export?"
- World Transportation
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/export?"
- World Light Gray Base
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/export?"
- World Light Gray Reference
- false
- "http://services.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/export?"
- National Geographic World
- false
- "http://server.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/export?"
- USA Topo Maps
- false
-
10146
868
318
22
-
10271
868
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
- Provides a list of preset values to choose from
- b0be9898-a343-4094-8279-cf607063de01
- 9
- 1
- Value List
- USGS
- false
- 0
- "http://raster.nationalmap.gov/arcgis/rest/services/Orthoimagery/USGS_EROS_Ortho_1Foot/ImageServer/exportImage?"
- Ortho 1 Foot Imagery
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/Orthoimagery/USGS_EROS_Ortho/ImageServer/exportImage?"
- Ortho Imagery
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/Orthoimagery/USGS_EROS_Ortho_NAIP/ImageServer/exportImage?"
- NAIP Imagery
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/LandCover/USGS_EROS_LandCover_NLCD/MapServer/export?"
- Land Cover
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/LandCover/conus_01/MapServer/export?"
- Land Cover - Conus 01
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/LandCover/conus_06/MapServer/export?"
- Land Cover - Conus 06
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/LandCover/Development_0106/MapServer/export?"
- Land Cover - Development
- false
- "http://raster.nationalmap.gov/arcgis/rest/services/LandCover/Wetland_0106/MapServer/export?"
- Land Cover - Wetland
- true
- "https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer"
- Topo - Scanned Maps
- false
-
10256
905
207
22
-
10297
905
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- e0046a64-8cc6-4356-a4b6-42138f6be5a3
- Panel
- Image Prefix
- false
- 0
- 0
- aerial
-
10343
822
123
39
- 0
- 0
- 0
-
10343.12
822.8003
-
255;255;255;255
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
- Boolean (true/false) toggle
- 71829324-09ff-44a7-b827-791d5bee52d4
- Boolean Toggle
- Update Imagery
- false
- 0
- true
-
10315
937
148
22
- eb41aaa3-c9da-42de-8b58-d4a1cbdadcc8
- 94830583-1656-43fb-8415-6fd290548dd1
- Get REST Raster
- Get raster imagery from ArcGIS REST Services
- true
- a4f4d9b8-d24b-46b1-81a5-e16f53258a5e
- Get REST Raster
- RESTRaster
-
10590
856
167
124
-
10670
918
- 1
- Boundary curve(s) for imagery
- 64c3abc5-4bd3-4d06-95dd-e44ffe3e39f2
- Boundary
- boundary
- false
- eaa54df0-51c4-403e-9030-6987622c8eba
- 1
-
10592
858
63
20
-
10625
868
- Maximum resolution for images
- 7f632d07-f2ea-4297-8c5f-8277532da83f
- Resolution
- resolution
- false
- 2aaecc35-d41a-4260-80d5-274c817b14ee
- 1
-
10592
878
63
20
-
10625
888
- Folder to place image files
- ea2fc8f6-f15c-4f69-9da3-2e2b869561ac
- File Location
- fileLocation
- false
- 624a0eba-8b0e-4b88-be37-6bdd3ad81792
- 1
-
10592
898
63
20
-
10625
908
- Prefix for image file name
- 23ce9c1d-4351-4717-9172-e7763a9e9933
- Prefix
- prefix
- false
- e0046a64-8cc6-4356-a4b6-42138f6be5a3
- 1
-
10592
918
63
20
-
10625
928
- ArcGIS REST Service website to query
- 64042d1c-da8c-4fc8-90ed-3fa5e2c0975e
- REST URL
- URL
- false
- 2611af1f-6168-45eb-ae02-1f3968b0bc28
- 1
-
10592
938
63
20
-
10625
948
- Go ahead and download imagery from the Service
- a26532e4-197d-4233-b260-4c6a58843f8c
- run
- get
- false
- 71829324-09ff-44a7-b827-791d5bee52d4
- 1
-
10592
958
63
20
-
10625
968
- 1
- 1
- {0}
- false
- 2
- File location of downloaded image
- 7d01e589-acb8-48f1-95a8-16c29e6b37a9
- image
- Image
- false
- 0
-
10685
858
70
40
-
10720
878
- 2
- Bounding box of image for mapping to geometry
- 2079a2dd-e82f-4c00-8b98-2bb0d514d561
- imageFrame
- imageFrame
- false
- 0
-
10685
898
70
40
-
10720
918
- 2
- Full text of REST query
- 28cceaef-c716-4dee-bb41-e97a7adaa909
- RESTQuery
- RESTQuery
- false
- 0
-
10685
938
70
40
-
10720
958
- 6577dc68-200c-4b3c-adb4-78de61d76870
- 94830583-1656-43fb-8415-6fd290548dd1
- Set EarthAnchorPoint
- Set the Rhino EarthAnchorPoint
- f8265183-5ddf-469c-9ce6-9ee3aecbe870
- Set EarthAnchorPoint
- Set EarthAnchorPoint
-
9872
890
119
64
-
9945
922
- Set the EarthAnchorPoint
- 5cc1cc6c-ff8c-4baf-8fc0-ebf6f855d6f5
- Set EAP
- Set EAP
- false
- 506ee423-698b-410d-80a1-e37904137fed
- 1
-
9874
892
56
20
-
9903.5
902
- 1
- 1
- {0}
- false
- Decimal Degree Latitude
- 19105f77-edec-4a7d-8d05-652583f4a2fa
- Latitude
- Latitude
- false
- c3a6758a-e9ca-48ed-a938-ba870174bfe8
- 1
-
9874
912
56
20
-
9903.5
922
- Decimal Degree Longitude
- f82d11d2-4ccd-4102-a57e-e95334bb39e0
- Longitude
- Longitude
- false
- 9040aaba-f616-44e6-80b6-252996d1aec4
- 1
-
9874
932
56
20
-
9903.5
942
- EarthAnchorPoint Longitude/Latitude
- 0bd85dcb-c342-4d2c-ab30-c1638efe412c
- EAP
- EAP
- false
- 0
-
9960
892
29
60
-
9974.5
922
- deaf8653-5528-4286-807c-3de8b8dad781
- Surface
- Contains a collection of generic surfaces
- true
- c39461e0-e22c-4c21-ad51-d4aa5b7b2d23
- Surface
- Surface
- false
- fa7cc90e-4b2b-4f50-8d5e-be430f465761
- 1
-
10233
643
50
24
-
10258.77
655.3833
- d5967b9f-e8ee-436b-a8ad-29fdcecf32d5
- Curve
- Contains a collection of generic curves
- true
- eaa54df0-51c4-403e-9030-6987622c8eba
- Curve
- Curve
- false
- 9156a7b3-76bd-4da6-8bdc-a2bf38cfe8e4
- 1
-
10517
692
50
24
-
10542.79
704.1113
- 8feb3db4-5bd9-4658-bf3a-e3d8e687f13d
- a5058970-b442-4922-91a1-9f0f715c9c46
- Relative Path
- Appends the directory this definition is saved in to a file path. Auto-converts the contents of a text panel containing an absolute path
- d10e5eca-c208-4bf5-b327-264964a21ff1
- Relative Path
- Relative Path
-
10368
773
95
28
-
10414
787
- The relative path to convert
- c3ffd228-5261-49bb-89ce-8cccd8a11e3f
- Path
- Path
- false
- 570ac161-09f8-4975-a797-8b20d9204f73
- 1
-
10370
775
29
24
-
10386
787
- The path made absolute
- 624a0eba-8b0e-4b88-be37-6bdd3ad81792
- Path
- Path
- false
- 0
-
10429
775
32
24
-
10445
787
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 570ac161-09f8-4975-a797-8b20d9204f73
- Panel
- false
- 0
- 0
- Site Image -
-
10204
771
135
38
- 0
- 0
- 0
-
10204.98
771.2837
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- e407f858-6c25-4550-a010-76cfa112e6bd
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- Custom Preview Materials
- Custom Preview with Materials
- 1fc23413-7f73-49d9-9fc4-b86273dce8d7
- Custom Preview Materials
- PreviewMat
-
11127
806
53
104
-
11166
858
- Geometry to preview
- true
- 13498d1d-ca6f-440e-8fbc-b7d64cb4ff5a
- Geometry
- G
- false
- 7a495bc2-719d-4ca8-a98b-8de1f6ce4b34
- 1
-
11129
808
22
20
-
11141.5
818
- The base diffuse color.
- 96d53ecb-081b-485d-9103-134ab79f27c6
- Diffuse Color
- DC
- true
- 0
-
11129
828
22
20
-
11141.5
838
- 1
- 1
- {0}
-
255;255;255;255
- The overall transparency, from 0 to 1.
- df3cbc5b-ead3-4fca-82c6-f247c54480a1
- Transparency
- T
- true
- 8c1f378d-31ac-4f56-a7ae-e3189bd29adc
- 1
-
11129
848
22
20
-
11141.5
858
- The filepath to the bitmap image to be used in the diffuse channel.
- b6fc1134-bef0-4357-af91-86b09749d4ac
- Diffuse Bitmap
- DB
- true
- 7d01e589-acb8-48f1-95a8-16c29e6b37a9
- 1
-
11129
868
22
20
-
11141.5
878
- The filepath to the bitmap image to be used in the transparency channel.
- 03a61e00-a65b-40c5-ba70-b134836d3bf6
- Transparency Bitmap
- TB
- true
- 0
-
11129
888
22
20
-
11141.5
898
- d51e9b65-aa4e-4fd6-976c-cef35d421d05
- Boundary Surfaces
- Create planar surfaces from a collection of boundary edge curves.
- true
- 0a1bb4c7-a282-4641-a105-5d5db4ee9563
- Boundary Surfaces
- Boundary
-
10816
815
63
28
-
10846
829
- 1
- Boundary curves
- 3f1dfd3f-2dde-4b14-ade3-e82eeb95583b
- Edges
- E
- false
- 2079a2dd-e82f-4c00-8b98-2bb0d514d561
- 1
-
10818
817
13
24
-
10826
829
- 1
- Resulting boundary surfaces
- 8a085e16-2283-49f9-b455-f40e1161d2e7
- Surfaces
- S
- false
- 0
-
10861
817
16
24
-
10869
829
- 9ffa6fcc-7757-4ef3-92be-c8badb3f07c8
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- SurfaceMapping
- Applies a surface UV texture mapping to a mesh.
- true
- c34098c9-904f-4bb0-b201-f54e017f36a7
- SurfaceMapping
- SurfaceMap
-
10945
797
87
44
-
10995
819
- The mesh to map
- bc8e891f-e7a5-4652-bed9-416591efd4a5
- 2
- Mesh
- M
- false
- 9156a7b3-76bd-4da6-8bdc-a2bf38cfe8e4
- 1
-
10947
799
33
20
-
10973
809
- The surface to use for mapping. Trims will be ignored.
- c1868558-4673-4d6c-a98a-32329c069616
- Surface
- S
- false
- 8a085e16-2283-49f9-b455-f40e1161d2e7
- 1
-
10947
819
33
20
-
10973
829
- The mesh with texture mapping applied.
Needs to be used in conjunction with the
Custom Preview with Materials component
in order to see the effect.
- 7a495bc2-719d-4ca8-a98b-8de1f6ce4b34
- Mapped Mesh
- M
- false
- 0
-
11010
799
20
40
-
11020
819
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 8c1f378d-31ac-4f56-a7ae-e3189bd29adc
- Number Slider
- Number Slider
- false
- 0
-
10875
849
203
20
-
10875.67
849.1216
- 3
- 1
- 0
- 1
- 0
- 0
- 0
- 919e146f-30ae-4aae-be34-4d72f555e7da
- Brep
- Contains a collection of Breps (Boundary REPresentations)
- true
- 6797d9de-d493-4645-b614-22dc5677302e
- Brep
- Brep
- false
- dab3ff5e-8f5f-4859-89a5-91141c7f6b13
- 1
- 2
-
14178
1362
50
24
-
14203.88
1374.482
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 53385c35-3809-40ba-8d1d-07c2f748324f
- Panel
- false
- 0
- 0
- ft
-
1485
7014
43
38
- 0
- 0
- 0
-
1485.906
7014.49
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- fbac3e32-f100-4292-8692-77240a42fd1a
- Point
- Contains a collection of three-dimensional points
- true
- 34b570b9-3e3d-449d-84f7-3e044a07d733
- Point
- Point
- false
- 73419a21-a58f-4983-b51f-9653c9b17cb9
- 1
-
10572
495
50
24
-
10597.89
507.7334
- 9abae6b7-fa1d-448c-9209-4a8155345841
- Deconstruct
- Deconstruct a point into its component parts.
- true
- a701800a-39e9-4ac9-bd46-eee85a2ff895
- Deconstruct
- Deconstruct
-
10656
475
141
64
-
10705
507
- Input point
- 7afca00d-781f-447e-8910-de74d2ac6292
- Point
- Point
- false
- 34b570b9-3e3d-449d-84f7-3e044a07d733
- 1
-
10658
477
32
60
-
10675.5
507
- Point {x} component
- 3853cec5-82ec-4602-bd27-e051dfe74a00
- X component
- X component
- false
- 0
-
10720
477
75
20
-
10757.5
487
- Point {y} component
- 0ad7474d-b60d-4d72-9cac-b2c48d06df41
- Y component
- Y component
- false
- 0
-
10720
497
75
20
-
10757.5
507
- Point {z} component
- cf67affd-d998-4876-aaca-06550a6b6104
- Z component
- Z component
- false
- 0
-
10720
517
75
20
-
10757.5
527
- deaf8653-5528-4286-807c-3de8b8dad781
- Surface
- Contains a collection of generic surfaces
- true
- 914eaf0f-a885-4884-8613-813713e5bbb6
- Surface
- Surface
- false
- 9156a7b3-76bd-4da6-8bdc-a2bf38cfe8e4
- 1
- 2
-
10154
368
50
24
-
10179.69
380.3662
- f80cfe18-9510-4b89-8301-8e58faf423bb
- Flatten Tree
- Flatten a data tree by removing all branching information.
- true
- 40ad04e8-688a-4804-804b-522dcc73d745
- Flatten Tree
- Flatten Tree
-
10822
515
94
44
-
10868
537
- 2
- Data tree to flatten
- 761e8309-2f39-4568-b894-bc6935278f93
- Tree
- Tree
- false
- cf67affd-d998-4876-aaca-06550a6b6104
- 1
-
10824
517
29
20
-
10840
527
- Path of flattened tree
- f4276285-7223-49eb-8680-efc845014376
- Path
- Path
- false
- 0
-
10824
537
29
20
-
10840
547
- 1
- 1
- {0}
- {0}
- 2
- Flattened data tree
- b01d70c6-e318-4e6f-ae24-deeb2da50855
- Tree
- Tree
- false
- 0
-
10883
517
31
40
-
10898.5
537
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- GhPython Script
- """Provides a scripting component.
Inputs:
x: The x script variable
y: The y script variable
Output:
a: The a output variable"""
__author__ = "sdanilow"
__version__ = "2020.09.15"
import rhinoscriptsyntax as rs
highestZ = -1000000
lowestZ = 1000000
for i in range(len(zVals)):
if zVals[i] >= highestZ:
highestZ = zVals[i]
if zVals[i] <= lowestZ:
lowestZ = zVals[i]
print highestZ
print lowestZ
- Provides a scripting component.
-
1009
256
-
741
702
- true
- true
- false
- false
- 980a572d-6092-419f-9b6e-e1f7adbce7e7
- false
- true
- GhPython Script
- GhPython Script
-
10952
505
118
64
-
11001
537
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 3
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- true
- Script variable Python
- 49655fb5-fd32-4e9a-b31c-84bbf318d937
- zVals
- zVals
- true
- 1
- true
- b01d70c6-e318-4e6f-ae24-deeb2da50855
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
10954
507
32
60
-
10971.5
537
- The execution information, as output and error streams
- 242f3992-19a6-434b-b20c-f4e7475d3093
- out
- out
- false
- 0
-
11016
507
52
20
-
11042
517
- Script variable GhPython Script
- 1e187711-ce50-4b9e-8ee4-c14250caa3a8
- highestZ
- highestZ
- false
- 0
-
11016
527
52
20
-
11042
537
- The a output variable
- 53ac50fd-7a77-4883-a3da-1b03e414b0aa
- lowestZ
- lowestZ
- false
- 0
-
11016
547
52
20
-
11042
557
- 079bd9bd-54a0-41d4-98af-db999015f63d
- Floor
- Map a real number to the largest previous integer
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA64AAAOuAFqQfVbAAABpElEQVRIS93VPygGYQDH8cuA8q9kEYs/g/xJYhLKn8Eim7LZFKXsBoMSm9FiUSZZUCIZLMqCiI2SgUEKGRDf33Oe17n37r33dBa/+tTzPO+dn3vvuXudf5MStLvDRJKDDuSbGWnDvjtMJHk4RIWZkRZsucNEooI9lJsZ8RdoPogu6FKlD61QqtAPrfdCxxbAJrKgG0v48DiHSpQGbEPrj5hGEWwiC2zGYQs2tODJAp5Qb2Y/k3WBsgxbMqQFoh2nub0if2IVFOMa+oM3qMMdZhCWWAWK/lN7FQ9YQ6bELlDmYEsGtJAhvyrQzbQFl9DTH5bYBbnQNl2Bdo5KNA5L7IJVHLhDZwr2Soa1EJBYBaN4QamZuS8yvWdUoBueet94knVBM97RY2bfacQzVLKjBV+yKtCHt1g3s/Qswn5V2mHeRBboBXYBnXyFMXgzAt30ty86TvepE0pkQSWaUA09ufpKvNHLTmqgY2qh3xSdp2jXpRVsusPEsotUgR6iVxwFOMYEgjILfe4/5wT3KIOJtpr2+VmISQRlHkHHn0JfeSH+Mo7zCc35fPwuS5oZAAAAAElFTkSuQmCC
- 53e26c56-1524-495e-a9e3-b54e0858cda9
- Floor
- Floor
- false
- 0
- Component.Params.Input(0).Name = "Value"
Component.Params.Input(0).Description = "Number to evaluate"
Component.Params.Output(0).Name = "Resultant"
Component.Params.Output(0).Description = "The floor integer value of x"
R = math.floor(x)
-
11110
558
63
28
-
11139
572
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- Number to evaluate
- 4f1e1f7e-075b-48ca-9649-65577c004b3d
- Value
- x
- true
- 0
- true
- 53ac50fd-7a77-4883-a3da-1b03e414b0aa
- 1
-
11112
560
12
24
-
11119.5
572
- The floor integer value of x
- 64dbecbc-d25d-4696-be0d-eccf71d62d79
- Resultant
- R
- false
- 0
-
11154
560
17
24
-
11162.5
572
- 079bd9bd-54a0-41d4-98af-db999015f63d
- Ceiling
- Map a real number to the smallest following integer
-
57
85
- true
-
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA64AAAOuAFqQfVbAAABpklEQVRIS93VSygFUQDG8RvlGYokyUJR3pKUR5LHQqGUUlbsFGs7ysLG0pJioywkG8qrWFLKlh0lC0LKa0P8vzMO4965j7mx8dWvzjlz53535kxzA/8meVjBRhhD8Mo4vD4vC0iDSRnecePhFpPwyjx0PPicOzwjBya12EbCp3hjz0/FPvJhooJNZ2hSjR40owFN6EQdlCJ0oRGt6EYybBKxhx8FW87QpA2L0G2zTqASpQI70PoDppABG5WFXIG7wGYMtkAb584sHlFuZj8Tc4GyBFsyoAWiW6a5vaLg+CrIxAX0hZcoxTWmES6+ChT9UnsV91hDpPguUGZgS3q1ECFxFWgzbcEZshAuvguSoMd0GXpyVKJxuPguWMWhMwxMwF7JoBY84qtgBC/INjPnVXAEFWjDCxCcmAtq8IZ2M/tOJZ6gkl0tBCWmAh28wrqZhWYO9lbpCXMnakEHTqGTzzEKd4ahTX/9pM9pn1qgRC0ohN6oxdB/RRXc0ctOdFxKUA+dp/ja5HgSUqD2A2f4K0nBMb6esFz0OcNfif5w+pFuZn+XQOADdON8x9H7y5MAAAAASUVORK5CYII=
- 7c4e07c0-66be-4584-b0e0-461d2fac5ffa
- Ceiling
- Ceiling
- false
- 0
- Component.Params.Input(0).Name = "Value"
Component.Params.Input(0).Description = "Number to evaluate"
Component.Params.Output(0).Name = "Resultant"
Component.Params.Output(0).Description = "The ceiling integer value of x"
R = math.Ceiling(x)
-
11113
513
63
28
-
11142
527
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- true
- Number to evaluate
- 3f697834-1223-4f07-86b2-de60a243a594
- Value
- x
- true
- 0
- true
- 1e187711-ce50-4b9e-8ee4-c14250caa3a8
- 1
-
11115
515
12
24
-
11122.5
527
- The ceiling integer value of x
- 63a7793a-a668-4ae5-979b-f4c50db2981a
- Resultant
- R
- false
- 0
-
11157
515
17
24
-
11165.5
527
- 9c007a04-d0d9-48e4-9da3-9ba142bc4d46
- Subtraction
- Mathematical subtraction
- true
- f3028a85-97eb-4ff9-8576-a081ddec6b67
- Subtraction
- Subtraction
-
11233
526
88
44
-
11264
548
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- First operand for subtraction
- b700335d-423e-4c18-bac4-8ba5d7433cae
- A
- A
- true
- 63a7793a-a668-4ae5-979b-f4c50db2981a
- 1
-
11235
528
14
20
-
11243.5
538
- Second operand for subtraction
- 92493847-249b-4739-b87f-b0d980e46ea5
- B
- B
- true
- 64dbecbc-d25d-4696-be0d-eccf71d62d79
- 1
-
11235
548
14
20
-
11243.5
558
- Result of subtraction
- 6f375460-9464-49f0-92ac-ffd8843e20ce
- Result
- Result
- false
- 0
-
11279
528
40
40
-
11299
548
- 23285717-156c-468f-a691-b242488c06a6
- Project
- Project an object onto a plane.
- true
- 52fe57ee-f1cd-434f-ab6b-9ec3120fbc2a
- Project
- Project
-
11210
452
148
44
-
11282
474
- Geometry to project
- fb4593cc-f4a7-41fc-8bff-530863111a23
- Geometry
- Geometry
- true
- 914eaf0f-a885-4884-8613-813713e5bbb6
- 1
-
11212
454
55
20
-
11241
464
- Projection plane
- 46fba38b-d1a5-4da6-b4cf-a2df912d1c17
- Plane
- Plane
- false
- 0
-
11212
474
55
20
-
11241
484
- 1
- 1
- {0}
-
0
0
0
1
0
0
0
1
0
- Projected geometry
- 714ea53f-4a67-4447-bb57-b4e8968aece0
- Geometry
- Geometry
- false
- 0
-
11297
454
59
20
-
11326.5
464
- Transformation data
- 88961f7d-157c-45ad-9764-fbb5990d2155
- Transform
- Transform
- false
- 0
-
11297
474
59
20
-
11326.5
484
- e9eb1dcf-92f6-4d4d-84ae-96222d60f56b
- Move
- Translate (move) an object along a vector.
- true
- 06a82c61-33bb-4e0e-a8ab-7ee775b17965
- Move
- Move
-
11675
452
148
44
-
11747
474
- Base geometry
- 3b6e348e-5906-46b1-9f6b-37256d7a1ed9
- Geometry
- Geometry
- true
- 714ea53f-4a67-4447-bb57-b4e8968aece0
- 1
-
11677
454
55
20
-
11706
464
- Translation vector
- 3d3972a9-2fbe-4ca8-a4eb-fcf898aa8c4f
- Motion
- Motion
- false
- fbbc373a-84b1-44aa-bbde-13ff7690290f
- 1
-
11677
474
55
20
-
11706
484
- 1
- 1
- {0}
-
0
0
10
- Translated geometry
- a2fb0848-67d4-4dbc-be55-f4bb5fb6ff2f
- Geometry
- Geometry
- false
- 0
-
11762
454
59
20
-
11791.5
464
- Transformation data
- 60fa794e-938b-4171-a577-afa294bd7412
- Transform
- Transform
- false
- 0
-
11762
474
59
20
-
11791.5
484
- 9103c240-a6a9-4223-9b42-dbd19bf38e2b
- Unit Z
- Unit vector parallel to the world {z} axis.
- 26fcf24e-a57d-4067-b2dd-6dcb73595a87
- Unit Z
- Unit Z
-
11506
470
134
28
-
11560
484
- Unit multiplication
- fce76d44-fbac-4445-9435-1475a8cb483c
- Factor
- Factor
- false
- 64dbecbc-d25d-4696-be0d-eccf71d62d79
- 1
-
11508
472
37
24
-
11528
484
- 1
- 1
- {0}
- 1
- World {z} vector
- fbbc373a-84b1-44aa-bbde-13ff7690290f
- Unit vector
- Unit vector
- false
- 0
-
11575
472
63
24
-
11606.5
484
- e87db220-a0a0-4d67-a405-f97fd14b2d7a
- Linear Array
- Create a linear array of geometry.
- true
- a4b20554-c0f4-4c0a-831a-97911c5e81f3
- Linear Array
- Linear Array
-
12238
454
148
64
-
12310
486
- Base geometry
- 5d81b3f8-0341-4ab8-9f89-61a6cef7331e
- Geometry
- Geometry
- true
- a2fb0848-67d4-4dbc-be55-f4bb5fb6ff2f
- 1
-
12240
456
55
20
-
12269
466
- Linear array direction and interval
- 1ba9ea84-40bd-47cb-aeec-9158d247d2e8
- Direction
- Direction
- false
- a434bfa6-1bbf-4a93-a06d-e35cac932bc5
- 1
-
12240
476
55
20
-
12269
486
- 1
- 1
- {0}
-
10
0
0
- Number of elements in array.
- 46c8e2db-01f1-4d21-b39e-c6149a0252aa
- Count
- Count
- false
- 00e8b9ef-ce75-4c3c-a8e6-d49f69c2c986
- 1
-
12240
496
55
20
-
12269
506
- 1
- 1
- {0}
- 10
- 1
- Arrayed geometry
- 7114ff0a-95e2-4256-af7b-35e5d281d63b
- Geometry
- Geometry
- false
- 0
-
12325
456
59
30
-
12354.5
471
- 1
- Transformation data
- ea9271c0-276f-4f33-946b-f1f05341d509
- Transform
- Transform
- false
- 0
-
12325
486
59
30
-
12354.5
501
- 9103c240-a6a9-4223-9b42-dbd19bf38e2b
- Unit Z
- Unit vector parallel to the world {z} axis.
- 4fd10e17-8fbb-4d0a-9abd-5167e2401f5e
- Unit Z
- Unit Z
-
12052
474
134
28
-
12106
488
- Unit multiplication
- 9d0e49c5-281e-4a1c-9a0e-17834c121913
- Factor
- Factor
- false
- a707d8fb-059a-4c04-950a-59a1e825e947
- 1
-
12054
476
37
24
-
12074
488
- 1
- 1
- {0}
- 1
- World {z} vector
- a434bfa6-1bbf-4a93-a06d-e35cac932bc5
- Unit vector
- Unit vector
- false
- 0
-
12121
476
63
24
-
12152.5
488
- 9c85271f-89fa-4e9f-9f4a-d75802120ccc
- Division
- Mathematical division
- true
- 7d2e9864-a1b5-4751-a4d3-a8d5c9dffff1
- Division
- Division
-
12084
515
88
44
-
12115
537
- Item to divide (dividend)
- fd84f13e-2478-4adb-9677-14ae3c2a03f9
- A
- A
- false
- 6f375460-9464-49f0-92ac-ffd8843e20ce
- 1
-
12086
517
14
20
-
12094.5
527
- Item to divide with (divisor)
- 13fc4c2c-4291-46b1-9e6c-1b279d3bb44e
- B
- B
- false
- a707d8fb-059a-4c04-950a-59a1e825e947
- 1
-
12086
537
14
20
-
12094.5
547
- The result of the Division
- 00e8b9ef-ce75-4c3c-a8e6-d49f69c2c986
- Result
- Result
- false
- 0
-
12130
517
40
40
-
12150
537
- 904e4b56-484a-4814-b35f-aa4baf362117
- Brep | Brep
- Solve intersection events for two Breps.
- df034980-cfb1-4d84-ad1c-7e2a8bdaf848
- Brep | Brep
- Brep | Brep
-
14369
1106
116
44
-
14425
1128
- First Brep
- 744583e5-1133-4abc-a48d-159205635513
- Brep A
- Brep A
- false
- 914eaf0f-a885-4884-8613-813713e5bbb6
- 1
-
14371
1108
39
20
-
14392
1118
- Second Brep
- 1f861b9c-854f-4cd8-80c6-d4dfddb0953f
- Brep B
- Brep B
- false
- 2289f558-1dba-4cb1-9d51-b7248eba7436
- 1
-
14371
1128
39
20
-
14392
1138
- 1
- Intersection curves
- a50c1eef-9a66-45a9-b93e-b86f6e62ce9b
- Curves
- Curves
- false
- 0
-
14440
1108
43
20
-
14461.5
1118
- 1
- Intersection points
- d66fd233-60e7-4cb4-8dda-f6d04bdb2db8
- Points
- Points
- false
- 0
-
14440
1128
43
20
-
14461.5
1138
- 87e1d9ef-088b-4d30-9dda-8a7448a17329
- Graft Tree
- Graft a data tree by adding an extra branch for every item.
- true
- true
- true
- fa901594-60d9-4110-8876-a598e08f5220
- Graft Tree
- Graft Tree
-
12426
457
93
28
-
12471
471
- 2
- Data tree to graft
- a6e7ca10-2543-4ae2-b7dc-3833ac1c4d9c
- Tree
- Tree
- false
- 7114ff0a-95e2-4256-af7b-35e5d281d63b
- 1
-
12428
459
28
24
-
12443.5
471
- 2
- Grafted data tree
- 2289f558-1dba-4cb1-9d51-b7248eba7436
- Tree
- Tree
- false
- 0
-
12486
459
31
24
-
12501.5
471
- e9eb1dcf-92f6-4d4d-84ae-96222d60f56b
- Move
- Translate (move) an object along a vector.
- true
- b0d2ba7c-462b-4b8d-85cd-a1edbb7b9770
- Move
- Move
-
10330
642
148
44
-
10402
664
- Base geometry
- 6300cbb5-3bf7-46d7-9cb2-673081f2737c
- Geometry
- Geometry
- true
- c39461e0-e22c-4c21-ad51-d4aa5b7b2d23
- 1
-
10332
644
55
20
-
10361
654
- Translation vector
- 1fadd3c7-02e3-4d85-9db5-da5c6ee7fd7b
- Motion
- Motion
- false
- dd0b3806-b979-48f5-97c0-a67a052f38ef
- 1
-
10332
664
55
20
-
10361
674
- 1
- 1
- {0}
-
0
0
10
- Translated geometry
- 9156a7b3-76bd-4da6-8bdc-a2bf38cfe8e4
- Geometry
- Geometry
- false
- 0
-
10417
644
59
20
-
10446.5
654
- Transformation data
- f869a9b0-3fc1-4459-bdc6-1fe5fcb3e98b
- Transform
- Transform
- false
- 0
-
10417
664
59
20
-
10446.5
674
- 9103c240-a6a9-4223-9b42-dbd19bf38e2b
- Unit Z
- Unit vector parallel to the world {z} axis.
- bcf6dad3-b829-4d8f-88e2-a1389d5492b5
- Unit Z
- Unit Z
-
10171
677
134
28
-
10225
691
- Unit multiplication
- 0360c302-ce26-4143-a022-3b906779b682
- Factor
- Factor
- false
- b77b34d6-6d87-4de3-a78f-30baf14c20e9
- 1
-
10173
679
37
24
-
10193
691
- 1
- 1
- {0}
- 1
- World {z} vector
- dd0b3806-b979-48f5-97c0-a67a052f38ef
- Unit vector
- Unit vector
- false
- 0
-
10240
679
63
24
-
10271.5
691
- e9eb1dcf-92f6-4d4d-84ae-96222d60f56b
- Move
- Translate (move) an object along a vector.
- true
- ee93cc86-a126-4f67-81a6-9796990bcf5e
- Move
- Move
-
14357
1365
148
44
-
14429
1387
- Base geometry
- 09df13ac-e82b-40cf-8368-bc648ff0702a
- Geometry
- Geometry
- true
- 6797d9de-d493-4645-b614-22dc5677302e
- 1
-
14359
1367
55
20
-
14388
1377
- Translation vector
- ab66bef8-536c-49c8-946f-5e19ee7c8a15
- Motion
- Motion
- false
- 849ca032-743f-41dd-bd34-05e07dd04d3a
- 1
-
14359
1387
55
20
-
14388
1397
- 1
- 1
- {0}
-
0
0
10
- Translated geometry
- 3bebfa04-54ab-46b3-bd27-6e044b05754b
- Geometry
- Geometry
- false
- 0
-
14444
1367
59
20
-
14473.5
1377
- Transformation data
- d01dba84-c09b-4078-9e89-b066cf817e04
- Transform
- Transform
- false
- 0
-
14444
1387
59
20
-
14473.5
1397
- 9103c240-a6a9-4223-9b42-dbd19bf38e2b
- Unit Z
- Unit vector parallel to the world {z} axis.
- 23f197d7-6e67-475c-9d48-311419f64b94
- Unit Z
- Unit Z
-
14167
1392
134
28
-
14221
1406
- Unit multiplication
- 225bd488-6a28-4444-bde7-209e51a6ff84
- Factor
- Factor
- false
- b77b34d6-6d87-4de3-a78f-30baf14c20e9
- 1
- 2
-
14169
1394
37
24
-
14189
1406
- 1
- 1
- {0}
- 1
- World {z} vector
- 849ca032-743f-41dd-bd34-05e07dd04d3a
- Unit vector
- Unit vector
- false
- 0
-
14236
1394
63
24
-
14267.5
1406
- 5106bafc-d5d4-4983-83e7-7be3ed07f502
- Divide Surface
- Generate a grid of {uv} points on a surface.
- true
- 35a513be-e1dd-4863-ab44-ce82436de356
- Divide Surface
- Divide Surface
-
10405
495
145
64
-
10469
527
- Surface to divide
- e17314f4-81de-43f5-abdc-3b0cf4ba6031
- Surface
- Surface
- false
- 914eaf0f-a885-4884-8613-813713e5bbb6
- 1
-
10407
497
47
20
-
10432
507
- Number of segments in {u} direction
- cdb1f89f-f90d-465f-85c7-054c2a8d24b7
- U Count
- U Count
- false
- 1a95788a-61cb-46e1-a16c-5757e7d39d8d
- 1
-
10407
517
47
20
-
10432
527
- 1
- 1
- {0}
- 10
- Number of segments in {v} direction
- 1a262c7c-4564-4e53-a526-afd52d365465
- V Count
- V Count
- false
- 1a95788a-61cb-46e1-a16c-5757e7d39d8d
- 1
-
10407
537
47
20
-
10432
547
- 1
- 1
- {0}
- 10
- 2
- Division points
- 73419a21-a58f-4983-b51f-9653c9b17cb9
- Points
- Points
- false
- 0
-
10484
497
64
20
-
10516
507
- 2
- Normal vectors at division points
- 7e9fe28b-40a5-43d1-b249-1c12f2c514e0
- Normals
- Normals
- false
- 0
-
10484
517
64
20
-
10516
527
- 2
- Parameter coordinates at division points
- true
- 0520c5b4-2de7-418c-aecd-ec0aeb35009f
- Parameters
- Parameters
- false
- 0
-
10484
537
64
20
-
10516
547
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 1a95788a-61cb-46e1-a16c-5757e7d39d8d
- Number Slider
- Number Slider
- false
- 0
-
10175
529
203
20
-
10175.3
529.4258
- 3
- 1
- 1
- 1000
- 0
- 0
- 1000
- 6e21dbe5-ecb8-4530-8a22-7cd713cf40d5
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Checklist
- Creates a listbox containing checkboxes.
- 9526b64b-c883-40a1-9940-f4b26e2a9167
- Create Checklist
- Create Checklist
-
1230
8243
167
64
-
1327
8275
- 1
- The initial list of options to display in the checklist.
- d0165b92-4ad5-4503-9523-645cfe87f4e6
- Checklist Items
- Checklist Items
- false
- ba189c45-5974-43a6-b80a-dcc320bdbce2
- 1
-
1232
8245
80
20
-
1273.5
8255
- 1
- The initially selected state of all boxes. Defaults to unchecked for all.
- f58b5f28-2269-4e65-a437-f12ec4f182dc
- Selected
- Selected
- false
- a84e5e7d-d5ba-4422-92b9-bc3a56652ae3
- 1
-
1232
8265
80
20
-
1273.5
8275
- 1
- 1
- {0}
- false
- Optional checklist box height in pixels.
- 5626db77-c44f-44d4-8776-2c742f0734c6
- Height
- Height
- true
- 0
-
1232
8285
80
20
-
1273.5
8295
- The checklist object
- d5bdd8d2-b753-4125-9ce8-ef3bc6c928be
- Checklist
- Checklist
- false
- 0
-
1342
8245
53
60
-
1368.5
8275
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ba189c45-5974-43a6-b80a-dcc320bdbce2
- Panel
- false
- 0
- 0
- Site Surface
Topo Lines
Context Buildings
-
1068
8205
120
102
- 0
- 0
- 0
-
1068.625
8205.521
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- c6128c18-3dbb-4d30-9ead-06651b7b7941
- Number Slider
-
- false
- 0
-
553
6193
239
20
-
553.2889
6193.172
- 3
- 1
- 1
- 20
- 1
- 0
- 3
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 1eaad454-0a5a-4ff6-b07d-92cd4e8569bc
- Value Listener
- Value Listener
- true
-
1007
6190
152
44
-
1098
6212
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 7e6493c4-300e-43c5-be63-4d407957fe35
- Elements
- Elements
- false
- 56fdd11c-2df4-4e81-a100-d3bd99ebf88c
- 1
-
1009
6192
74
20
-
1047.5
6202
- 1
- The optional filter(s) for the elements you want to listen for.
- a0082a6a-aa3d-4e7b-85d3-41c5c9caefde
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1009
6212
74
20
-
1047.5
6222
- 2
- The values of the listened elements
- 298bc837-c917-43bd-95bf-fa9348b4cb9b
- Values
- Values
- false
- 0
-
1113
6192
44
20
-
1135
6202
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 5051bbe2-8598-4409-b91d-37e1f69d056b
- Indices
- Indices
- false
- 0
-
1113
6212
44
20
-
1135
6222
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5a2e4736-188a-4fde-a32a-81e49d136ef9
- Panel
- false
- 0
- 0
-
Commit Geometry
-
903
7988
101
61
- 0
- 0
- 0
-
903.8715
7988.583
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 1b91bd56-855c-4eb2-9323-9f75c61ecbc6
- Value Listener
- Value Listener
- true
-
1417
8303
152
44
-
1508
8325
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- d25decf7-7874-4b16-9a4f-d7f9c3ccc315
- Elements
- Elements
- false
- d5bdd8d2-b753-4125-9ce8-ef3bc6c928be
- 1
-
1419
8305
74
20
-
1457.5
8315
- 1
- The optional filter(s) for the elements you want to listen for.
- ec4bee6c-3c2f-4c5e-8c7f-08fb92e14293
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1419
8325
74
20
-
1457.5
8335
- 2
- The values of the listened elements
- 88ff48ff-b037-4aca-a5fa-07768df2fe9d
- Values
- Values
- false
- 0
-
1523
8305
44
20
-
1545
8315
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- e04bee11-0c4e-4e7f-8993-044d397aa834
- Indices
- Indices
- false
- 0
-
1523
8325
44
20
-
1545
8335
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- df034980-cfb1-4d84-ad1c-7e2a8bdaf848
- 1
- 44270163-375f-4ec0-9c6c-c110438209f4
- Group
- Topo Lines
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 1fc23413-7f73-49d9-9fc4-b86273dce8d7
- 1
- 2fcaedf3-3005-43af-8851-74647ddc3067
- Group
- Mapped Image
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- ee93cc86-a126-4f67-81a6-9796990bcf5e
- 6797d9de-d493-4645-b614-22dc5677302e
- 23f197d7-6e67-475c-9d48-311419f64b94
- 3
- d4f61522-53d0-4733-a1ef-910f20c5d5db
- Group
- Buildings
- f58bc08f-ffe5-4e61-8042-a4c21cd5d394
- a5058970-b442-4922-91a1-9f0f715c9c46
- Hide/Show Object Preview
- Programmatically control the preview visibility of specified objects
- true
- 3ff361b6-c4ac-4967-b34b-bb2773107a92
- Hide/Show Object Preview
- Hide/Show Object Preview
- 1
- 1fc23413-7f73-49d9-9fc4-b86273dce8d7
-
14388
552
75
64
-
14449
574
- 1
- Optional list of objects to modify. Use as an alternative to the select button.
- 344f78ea-5dd8-4e81-b017-9810cf95de73
- Objects
- Objects
- true
- 0
-
14390
554
44
20
-
14413.5
564
- 1
- Set to true to enable preview for all objects - set to false to disable preview.
- eabc1232-ca4f-432a-a965-be096062a5fe
- Visible
- Visible
- false
- d7a782ff-06a4-4320-86e3-a13e01d24c85
- 1
-
14390
574
44
20
-
14413.5
584
- 88f43ac4-b6e9-42eb-9bd3-e608ef797018
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- CreateAttributes
- Create Object Attributes
- true
- 0e276474-f58a-4a4c-aee6-fad82e6d0b03
- CreateAttributes
- CreateAttributes
- true
-
13667
633
213
224
-
13770
745
- the object name
- 33333d57-33ba-46c7-9bbd-6671661c54b5
- Name
- Name
- true
- 0
-
13669
635
86
20
-
13713.5
645
- The name of the layer the object is on
- 51ccd31b-124a-4209-8d7d-16fa7a4ae732
- Layer Name
- Layer Name
- true
- 2764124b-846c-4549-ba8d-3916e27af5f0
- 1
-
13669
655
86
20
-
13713.5
665
- The object's display color
- 3a20f4d1-65f4-45d6-bf33-9da82b5c6680
- Color
- Color
- true
- 0
-
13669
675
86
20
-
13713.5
685
- The name of the object's render material
- 60e27c85-28b0-489d-839a-6ec15906e47e
- Material Name
- Material Name
- true
- 3eb67873-b921-4b00-8c86-5c25ff9e4281
- 1
-
13669
695
86
20
-
13713.5
705
- The name of the object's linetype
- 17648091-23f6-4571-9211-9b3813dd7240
- Linetype Name
- Linetype Name
- true
- 0
-
13669
715
86
20
-
13713.5
725
- 1
- The indices of the groups to which each object belongs
- b44e6dcd-dc27-45c4-aea8-8e7db6598f10
- Group Indices
- Group Indices
- true
- 0
-
13669
735
86
20
-
13713.5
745
- Object Plot Weight in mm.
- ef9b4a84-387d-4add-a999-1f9e38f7a32a
- Plot Weight
- Plot Weight
- true
- 0
-
13669
755
86
20
-
13713.5
765
- The object plot color
- 4d5349d5-f1e4-41fd-a5be-3b731584a7ae
- Plot Color
- Plot Color
- true
- 0
-
13669
775
86
20
-
13713.5
785
- True if the object is visible, false if it's hidden
- 382e6b27-1973-482b-88af-c9b108ebc188
- Visibility
- Visibility
- true
- 0
-
13669
795
86
20
-
13713.5
805
- 1
- The keys for user data on the object
- c599427f-bc3f-42d8-8587-d180521191e5
- UserData Keys
- UserData Keys
- true
- 0
-
13669
815
86
20
-
13713.5
825
- 1
- The values for user data on the object. List length must match the keys
- 69171ca8-dfba-4394-b522-d5437ca105c2
- UserData Values
- UserData Values
- true
- 0
-
13669
835
86
20
-
13713.5
845
- Object Attributes
- ab20e1d6-25ed-4c1d-8379-a7fea2f5d5da
- Object Attributes
- Object Attributes
- false
- 0
-
13785
635
93
220
-
13831.5
745
- de1d29e2-17d1-488d-a57e-9888d10caea8
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- Create/Modify Materials
- Create or Edit document Render Materials.
Note: Component can only modify materials created
by the component earlier - it will not recognize
materials that were added manually to the Rhino document.
- true
- de90746f-3aa6-4799-ab70-b89f8f43e13a
- Create/Modify Materials
- Create/Modify Materials
-
13135
1006
182
164
-
13261
1088
- Name of material to add or modify.
- e175aa17-177e-41dd-b54a-44df2ae63cac
- Name
- Name
- false
- 473be3cf-2c26-4502-94a0-6d65b62d8ef5
- 1
-
13137
1008
109
20
-
13193
1018
- Color of the diffuse channel
- 7a5a5372-c945-4329-9dda-cad509d3a7fe
- Diffuse
- Diffuse
- true
- 0
-
13137
1028
109
20
-
13193
1038
- Color of the specular highlight
- d4c82c08-9c5a-4e87-a081-d97bfc5c9ecd
- Specular
- Specular
- true
- 0
-
13137
1048
109
20
-
13193
1058
- Emissive color of the material
- 85ede92d-70d3-4954-ae9a-0f565c41b6dc
- Emission
- Emission
- true
- 0
-
13137
1068
109
20
-
13193
1078
- Amount of Transparency (0.0 = Transparent, 1.0 = opaque)
- 2c87d04b-9815-4264-9720-d168bc993350
- Alpha
- Alpha
- true
- 0
-
13137
1088
109
20
-
13193
1098
- Amount of glossy shine on the material. (0.0 = Matte, 1.0 = Full gloss)
- 78504d24-c62c-4dad-8689-801d609e1b99
- Gloss
- Gloss
- true
- 0
-
13137
1108
109
20
-
13193
1118
- File path to an image to use in the diffuse channel
- 55d1d271-a07a-4222-9e66-5f97deda9fd7
- Diffuse Bitmap
- Diffuse Bitmap
- true
- a205b3e0-654d-4144-bb0b-8cee1db7623b
- 1
-
13137
1128
109
20
-
13193
1138
- File path to an image to use in the transparency channel
- 6cf5bcce-b685-499a-adfb-b6f9521c890e
- Transparency Bitmap
- Transparency Bitmap
- true
- 0
-
13137
1148
109
20
-
13193
1158
- Name of materials successfully added or modified
- 3eb67873-b921-4b00-8c86-5c25ff9e4281
- Name
- Name
- false
- 0
-
13276
1008
39
160
-
13295.5
1088
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 473be3cf-2c26-4502-94a0-6d65b62d8ef5
- Panel
- false
- 0
- 0
- Site Plan
-
13018
1001
76
38
- 0
- 0
- 0
-
13018.84
1001.52
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 2013e425-8713-42e2-a661-b57e78840337
- Concatenate
- Concatenate some fragments of text
- true
- d4b4e73b-5f79-4a9a-a906-b600f1ab49ff
- Concatenate
- Concatenate
-
12840
1107
138
64
-
12921
1139
- 3
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 1
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- First text fragment
- 5b10dff1-abab-4046-9d75-9032ffc9c292
- Fragment A
- Fragment A
- true
- 570ac161-09f8-4975-a797-8b20d9204f73
- 1
- 2
-
12842
1109
64
20
-
12875.5
1119
- Second text fragment
- 6d6e1778-3bfd-40fc-b0fd-bb7938788fac
- Fragment B
- Fragment B
- true
- e0046a64-8cc6-4356-a4b6-42138f6be5a3
- 1
- 2
-
12842
1129
64
20
-
12875.5
1139
- Third text fragment
- 33e9dac4-c0e8-45e0-beba-9451e527669e
- Fragment A
- A
- true
- ff7cb8d6-640f-4db8-b7f8-36713c302a2d
- 1
-
12842
1149
64
20
-
12875.5
1159
- Resulting text consisting of all the fragments
- a09e4a19-3300-4520-920b-dfe9082c4fea
- Result
- Result
- false
- 0
-
12936
1109
40
60
-
12956
1139
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ff7cb8d6-640f-4db8-b7f8-36713c302a2d
- Panel
- false
- 0
- 0
- _0.jpg
-
12773
1169
50
47
- 0
- 0
- 0
-
12773.94
1169.398
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 8feb3db4-5bd9-4658-bf3a-e3d8e687f13d
- a5058970-b442-4922-91a1-9f0f715c9c46
- Relative Path
- Appends the directory this definition is saved in to a file path. Auto-converts the contents of a text panel containing an absolute path
- true
- 3b30da02-1c98-4e35-8275-dc48df3422ec
- Relative Path
- Relative Path
-
13000
1122
95
28
-
13046
1136
- The relative path to convert
- 05c462e1-9191-4a80-9876-295365970086
- Path
- Path
- false
- a09e4a19-3300-4520-920b-dfe9082c4fea
- 1
-
13002
1124
29
24
-
13018
1136
- The path made absolute
- a205b3e0-654d-4144-bb0b-8cee1db7623b
- Path
- Path
- false
- 0
-
13061
1124
32
24
-
13077
1136
- b2d64fc5-3f97-4000-a6d3-e8ad2513a1a0
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- Create/Modify Layers
- Create and Modify Rhino Layers
- true
- 97f157c4-c1c4-4be2-a998-5c3b4f6eb102
- Create/Modify Layers
- Create/Modify Layers
- true
-
13152
777
191
164
-
13246
859
- Layer to add or modify
- a33f67bf-99d2-4769-9a90-3530e002680d
- Layer Name
- Layer Name
- false
- 90764ea7-6675-4f45-bd51-257137cdf854
- 1
-
13154
779
77
20
-
13194
789
- Layer's display color
- 10e6fd76-48c5-42a4-8a19-21a711b6915b
- Layer Color
- Layer Color
- true
- 0
-
13154
799
77
20
-
13194
809
- The name of the layer's linetype. A list of available linetypes can be retrieved with the Linetype Table component.
- 9096e4d4-8b48-4afb-816f-cbf5df3dab50
- Layer Linetype
- Layer Linetype
- true
- 0
-
13154
819
77
20
-
13194
829
- The name of the layer's render material. Leave as an empty string for the default material.
- b82e022e-8cf3-4314-9010-e59fc7b8df31
- Layer Material
- Layer Material
- true
- 0
-
13154
839
77
20
-
13194
849
- True if the layer is visible.
- b0bebf0a-698d-491a-b30d-3f0b8bf2bc88
- Visibility
- Visibility
- true
- 0
-
13154
859
77
20
-
13194
869
- Layer Print Width. 0.0 = Default
- 8cf29091-da5d-4433-a659-5342ad5c5cd0
- Print Width
- Print Width
- true
- 0
-
13154
879
77
20
-
13194
889
- Layer print color.
- 540ef2f8-0e2a-47f5-9512-9c74329a4cc8
- Print Color
- Print Color
- true
- 0
-
13154
899
77
20
-
13194
909
- Set to true to delete the layer
- f9f93b2e-5249-448a-92cd-6b8ff46d24ef
- Delete Layer
- Delete Layer
- false
- 0
-
13154
919
77
20
-
13194
929
- 1
- 1
- {0}
- false
- On success, the name of the created/modified layer.
- 1c26b9cd-9499-4817-8012-2998917b66fe
- Layer Names
- Layer Names
- false
- 0
-
13261
779
80
80
-
13301
819
- On success, the full path of the created/modified layer.
- b3e9e613-f495-4c17-abac-f675fe61ab14
- Layer Full Path
- Layer Full Path
- false
- 0
-
13261
859
80
80
-
13301
899
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 7460810b-27d1-42bd-b6d0-1c74350d7637
- 1
- 9139eaf1-adf4-4c4a-a001-a2b3f0d8b6d7
- Group
- Site Surface
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 90764ea7-6675-4f45-bd51-257137cdf854
- Panel
- false
- 0
- 0
- Site Plan
Site Plan::Site Surface
Site Plan::Topo Lines
Site Plan::Context Buildings
-
12925
733
194
120
- 0
- 0
- 0
-
12925.62
733.0127
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 88f43ac4-b6e9-42eb-9bd3-e608ef797018
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- CreateAttributes
- Create Object Attributes
- true
- 9e28039c-063b-4ee6-b227-a3e45c6af9c8
- CreateAttributes
- CreateAttributes
- true
-
13673
885
213
224
-
13776
997
- the object name
- 9a972617-dcf2-47d3-a8d4-142eda40a534
- Name
- Name
- true
- 0
-
13675
887
86
20
-
13719.5
897
- The name of the layer the object is on
- 77c10bd0-638b-401f-862f-7b0218b1818a
- Layer Name
- Layer Name
- true
- 67c7fe46-6edf-4b4f-9742-85e9b0d66d5f
- 1
-
13675
907
86
20
-
13719.5
917
- The object's display color
- e0cbcdc3-ef64-4dbc-aecf-e97d8e9861a9
- Color
- Color
- true
- 0
-
13675
927
86
20
-
13719.5
937
- The name of the object's render material
- e4c07d0e-3165-4114-9a77-0347389f82d8
- Material Name
- Material Name
- true
- 0
-
13675
947
86
20
-
13719.5
957
- The name of the object's linetype
- d549ad06-0add-4db5-8551-74395aa13658
- Linetype Name
- Linetype Name
- true
- 0
-
13675
967
86
20
-
13719.5
977
- 1
- The indices of the groups to which each object belongs
- 067c9220-df30-486d-9ab6-e2595593c87f
- Group Indices
- Group Indices
- true
- 0
-
13675
987
86
20
-
13719.5
997
- Object Plot Weight in mm.
- c2ff567b-712f-41ec-8082-070bf7e5f158
- Plot Weight
- Plot Weight
- true
- 0
-
13675
1007
86
20
-
13719.5
1017
- The object plot color
- 1a73661b-1362-4c13-b7e0-4a40a939ef2e
- Plot Color
- Plot Color
- true
- 0
-
13675
1027
86
20
-
13719.5
1037
- True if the object is visible, false if it's hidden
- de97077a-2d34-46c0-8ba1-39d82875681a
- Visibility
- Visibility
- true
- 0
-
13675
1047
86
20
-
13719.5
1057
- 1
- The keys for user data on the object
- bc92a18a-fff1-4cde-9e1f-ddb228601073
- UserData Keys
- UserData Keys
- true
- 0
-
13675
1067
86
20
-
13719.5
1077
- 1
- The values for user data on the object. List length must match the keys
- e880aade-1e76-41ce-be10-e7296f46a35b
- UserData Values
- UserData Values
- true
- 0
-
13675
1087
86
20
-
13719.5
1097
- Object Attributes
- 4b1ec9e5-9bb1-4016-b700-77ab993d3928
- Object Attributes
- Object Attributes
- false
- 0
-
13791
887
93
220
-
13837.5
997
- 88f43ac4-b6e9-42eb-9bd3-e608ef797018
- 5f86fa9f-c62b-50e8-157b-b454ef3e00fa
- CreateAttributes
- Create Object Attributes
- true
- 080171a7-7168-4988-8c78-f8bd503dbf5f
- CreateAttributes
- CreateAttributes
- true
-
13677
1154
213
224
-
13780
1266
- the object name
- cbf32fc5-6e2e-42a7-87fd-8a90e935b94c
- Name
- Name
- true
- 0
-
13679
1156
86
20
-
13723.5
1166
- The name of the layer the object is on
- cdaf9ac7-95c6-4695-9296-12d4ec270e50
- Layer Name
- Layer Name
- true
- 49d51e79-c982-4c4d-981f-86baec32b55c
- 1
-
13679
1176
86
20
-
13723.5
1186
- The object's display color
- d5f4b3c0-3090-4009-878f-b44a781589a4
- Color
- Color
- true
- 0
-
13679
1196
86
20
-
13723.5
1206
- The name of the object's render material
- 7acf2a29-0a36-4f63-b4fa-5efa6bf3d6a8
- Material Name
- Material Name
- true
- 0
-
13679
1216
86
20
-
13723.5
1226
- The name of the object's linetype
- 3c475534-0593-4514-885a-5533dd108e7f
- Linetype Name
- Linetype Name
- true
- 0
-
13679
1236
86
20
-
13723.5
1246
- 1
- The indices of the groups to which each object belongs
- e5f8fbc1-0081-461b-8270-9bf47baaf1e1
- Group Indices
- Group Indices
- true
- 0
-
13679
1256
86
20
-
13723.5
1266
- Object Plot Weight in mm.
- 2f8b85f0-b528-46cc-893a-87749dc9ca6e
- Plot Weight
- Plot Weight
- true
- 0
-
13679
1276
86
20
-
13723.5
1286
- The object plot color
- c7342ed8-9108-43b0-93e5-3613e043eb08
- Plot Color
- Plot Color
- true
- 0
-
13679
1296
86
20
-
13723.5
1306
- True if the object is visible, false if it's hidden
- 2fe7130c-a721-4e6d-9173-9a0a8382de66
- Visibility
- Visibility
- true
- 0
-
13679
1316
86
20
-
13723.5
1326
- 1
- The keys for user data on the object
- d7504bdd-6959-4bd4-ae5f-a079212df6d5
- UserData Keys
- UserData Keys
- true
- 0
-
13679
1336
86
20
-
13723.5
1346
- 1
- The values for user data on the object. List length must match the keys
- a3c78202-af2b-4639-a26d-ee9df2db4de9
- UserData Values
- UserData Values
- true
- 0
-
13679
1356
86
20
-
13723.5
1366
- Object Attributes
- 7beef241-69d1-482c-8658-a4d794986f96
- Object Attributes
- Object Attributes
- false
- 0
-
13795
1156
93
220
-
13841.5
1266
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- true
- a1c4d365-5e4d-4cec-b873-d0ddf9d99c51
- List Item
- List Item
-
13464
884
90
84
-
13514
926
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- 56343055-37ff-4e4e-b25b-018ee3fcce75
- List
- List
- false
- b3e9e613-f495-4c17-abac-f675fe61ab14
- 1
-
13466
886
33
26
-
13484
899.3333
- Item index
- bcad074c-1c3e-4e5f-b133-5311503194c6
- Index
- Index
- false
- 0
-
13466
912
33
27
-
13484
926
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- b14889c8-8aa1-4728-a9d5-55e8701403dc
- Wrap
- Wrap
- false
- 0
-
13466
939
33
27
-
13484
952.6666
- 1
- 1
- {0}
- true
- Item at {i'}
- 18ca3ecc-a5aa-47ce-9259-28c9de23b17a
- false
- Item
- i
- false
- 0
-
13529
886
23
20
-
13540.5
896
- Item at {+1'}
- 2764124b-846c-4549-ba8d-3916e27af5f0
- false
- Item +1
- +1
- false
- 0
-
13529
906
23
20
-
13540.5
916
- Item at {+2'}
- 67c7fe46-6edf-4b4f-9742-85e9b0d66d5f
- false
- Item +2
- +2
- false
- 0
-
13529
926
23
20
-
13540.5
936
- Item at {+3'}
- 49d51e79-c982-4c4d-981f-86baec32b55c
- false
- Item +3
- +3
- false
- 0
-
13529
946
23
20
-
13540.5
956
- 1e936df3-0eea-4246-8549-514cb8862b7a
- Mesh
- Contains a collection of polygon meshes
- true
- eedc58db-6914-4e05-907b-d4da09c576e5
- Mesh
- Mesh
- false
- 7a495bc2-719d-4ca8-a98b-8de1f6ce4b34
- 1
-
14402
851
50
24
-
14427.34
863.4697
- f58bc08f-ffe5-4e61-8042-a4c21cd5d394
- a5058970-b442-4922-91a1-9f0f715c9c46
- Hide/Show Object Preview
- Programmatically control the preview visibility of specified objects
- true
- addbb3a4-6f64-4ae0-b4dd-412131e2b64f
- Hide/Show Object Preview
- Hide/Show Object Preview
- 2
- df034980-cfb1-4d84-ad1c-7e2a8bdaf848
- 9fe88ced-d621-42e7-aef9-03e75bc88ef3
-
14386
640
75
64
-
14447
662
- 1
- Optional list of objects to modify. Use as an alternative to the select button.
- 3a1051f3-5e01-49c1-ae62-c789bd019e81
- Objects
- Objects
- true
- 0
-
14388
642
44
20
-
14411.5
652
- 1
- Set to true to enable preview for all objects - set to false to disable preview.
- 8b303c53-a6ba-4ec0-857a-6f6c7ce8e889
- Visible
- Visible
- false
- d6f5c6c3-085f-4c0e-a68a-f98887552253
- 1
-
14388
662
44
20
-
14411.5
672
- f58bc08f-ffe5-4e61-8042-a4c21cd5d394
- a5058970-b442-4922-91a1-9f0f715c9c46
- Hide/Show Object Preview
- Programmatically control the preview visibility of specified objects
- true
- 3e14d35e-91ef-4005-b7d1-ad7050887af7
- Hide/Show Object Preview
- Hide/Show Object Preview
- 1
- a040873d-0ba5-4f74-b5cd-908cacb6e0be
-
14388
732
75
64
-
14449
754
- 1
- Optional list of objects to modify. Use as an alternative to the select button.
- 0ea566ee-d263-491d-82d1-7d150d6b4087
- Objects
- Objects
- true
- 0
-
14390
734
44
20
-
14413.5
744
- 1
- Set to true to enable preview for all objects - set to false to disable preview.
- 53ac7de3-20c5-4928-9b37-76043643b02c
- Visible
- Visible
- false
- 2d1badde-b82a-486a-8a34-7bf8504eb0ce
- 1
-
14390
754
44
20
-
14413.5
764
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- true
- 853ff553-2e31-4063-8736-31d5ae347767
- List Item
- List Item
-
14232
640
90
64
-
14282
672
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- 1b4aab4b-5a7d-47ec-88ab-e025ef5a23ff
- List
- List
- false
- 3d44772b-f683-4f6e-ad5d-5c5eebc33a9e
- 1
-
14234
642
33
20
-
14252
652
- Item index
- 677812b6-696a-47fe-bd39-64fcaa449fe5
- Index
- Index
- false
- 0
-
14234
662
33
20
-
14252
672
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- ba7849d1-c7e9-4581-adfa-21a2550f70a7
- Wrap
- Wrap
- false
- 0
-
14234
682
33
20
-
14252
692
- 1
- 1
- {0}
- true
- Item at {i'}
- d7a782ff-06a4-4320-86e3-a13e01d24c85
- false
- Item
- i
- false
- 0
-
14297
642
23
20
-
14308.5
652
- Item at {+1'}
- d6f5c6c3-085f-4c0e-a68a-f98887552253
- false
- Item +1
- +1
- false
- 0
-
14297
662
23
20
-
14308.5
672
- Item at {+2'}
- 2d1badde-b82a-486a-8a34-7bf8504eb0ce
- false
- Item +2
- +2
- false
- 0
-
14297
682
23
20
-
14308.5
692
- d8332545-21b2-4716-96e3-8559a9876e17
- Dispatch
- Dispatch the items in a list into two target lists.
- true
- 51e6fb3e-efea-44bb-b97d-6c917bd34459
- Dispatch
- Dispatch
-
14600
849
157
44
-
14704
871
- 1
- List to filter
- 2d86abe7-fcf1-491d-a8fe-9abc4e40b371
- List
- List
- false
- eedc58db-6914-4e05-907b-d4da09c576e5
- 1
-
14602
851
87
20
-
14647
861
- 1
- Dispatch pattern
- 4a23c38c-9b98-436b-840c-e782581cc10f
- Dispatch pattern
- Dispatch pattern
- false
- d7a782ff-06a4-4320-86e3-a13e01d24c85
- 1
-
14602
871
87
20
-
14647
881
- 1
- 2
- {0}
- true
- false
- 1
- Dispatch target for True values
- 0ac618e5-f452-476e-a744-2fe2a75d763e
- List A
- List A
- false
- 0
-
14719
851
36
20
-
14737
861
- 1
- Dispatch target for False values
- 271761b0-c164-4e2a-9ace-2652f1597276
- List B
- List B
- false
- 0
-
14719
871
36
20
-
14737
881
- d8332545-21b2-4716-96e3-8559a9876e17
- Dispatch
- Dispatch the items in a list into two target lists.
- true
- f65033bc-3e31-421e-958b-2caee82f8e7b
- Dispatch
- Dispatch
-
14620
1106
157
44
-
14724
1128
- 1
- List to filter
- 40ecaf75-92dd-45e5-943a-95131c1d3932
- List
- List
- false
- a50c1eef-9a66-45a9-b93e-b86f6e62ce9b
- 1
-
14622
1108
87
20
-
14667
1118
- 1
- Dispatch pattern
- 1fc7559e-5066-4263-908f-1717a8a50ac4
- Dispatch pattern
- Dispatch pattern
- false
- d6f5c6c3-085f-4c0e-a68a-f98887552253
- 1
-
14622
1128
87
20
-
14667
1138
- 1
- 2
- {0}
- true
- false
- 1
- Dispatch target for True values
- 725b7adb-a38f-4d2c-9ee6-79a6b67a7d9d
- List A
- List A
- false
- 0
-
14739
1108
36
20
-
14757
1118
- 1
- Dispatch target for False values
- 19e79991-edb1-43c8-ba5a-a01b67996a99
- List B
- List B
- false
- 0
-
14739
1128
36
20
-
14757
1138
- d8332545-21b2-4716-96e3-8559a9876e17
- Dispatch
- Dispatch the items in a list into two target lists.
- true
- bf97e387-bffd-4d35-aed7-02dc8ee09917
- Dispatch
- Dispatch
-
14626
1365
157
44
-
14730
1387
- 1
- List to filter
- 5ac496b8-d93d-4764-bd17-a7f30bd040a8
- List
- List
- false
- 3bebfa04-54ab-46b3-bd27-6e044b05754b
- 1
-
14628
1367
87
20
-
14673
1377
- 1
- Dispatch pattern
- 2006f904-1793-4a2b-b233-3bda24fc15f1
- Dispatch pattern
- Dispatch pattern
- false
- 2d1badde-b82a-486a-8a34-7bf8504eb0ce
- 1
-
14628
1387
87
20
-
14673
1397
- 1
- 2
- {0}
- true
- false
- 1
- Dispatch target for True values
- 256a6a23-ae2a-4c3f-93be-5747baf6af61
- List A
- List A
- false
- 0
-
14745
1367
36
20
-
14763
1377
- 1
- Dispatch target for False values
- 1af138e6-818b-4788-8c7d-b9e072fc9b11
- List B
- List B
- false
- 0
-
14745
1387
36
20
-
14763
1397
- cb95db89-6165-43b6-9c41-5702bc5bf137
- Boolean
- Contains a collection of boolean values
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- Boolean
- Boolean
- false
- 55c03f23-8c27-410d-8fab-79b50ae32650
- 1
-
15103
719
50
24
-
15128.74
731.2891
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 2f6a65fa-40a1-472c-9ead-2303fca59407
- Panel
- false
- 0
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 1
- Double click to edit panel content…
-
15276
598
160
100
- 0
- 0
- 0
-
15276.72
598.1182
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- a0d62394-a118-422d-abb3-6af115c75b25
- Addition
- Mathematical addition
- 53dd1ba3-f626-435e-8508-eb00bd30879f
- Addition
- Addition
-
1365
3693
88
44
-
1396
3715
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- First item for addition
- 2d8a219b-eaa9-4295-9330-ba0c99e231eb
- A
- A
- true
- 427089e8-fd24-4760-87e9-4804bedf4a0e
- 1
-
1367
3695
14
20
-
1375.5
3705
- Second item for addition
- 7ffc86a7-10a9-4647-b207-31e6daa02102
- B
- B
- true
- 0
-
1367
3715
14
20
-
1375.5
3725
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 2
- Result of addition
- e9467c3a-f8bf-4e6b-b72b-f732418a5524
- Result
- Result
- false
- 0
-
1411
3695
40
40
-
1431
3715
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
- Allows for customized geometry previews
- true
- 9fe88ced-d621-42e7-aef9-03e75bc88ef3
- Custom Preview
- Custom Preview
-
14800
1155
86
44
-
14872
1177
- Geometry to preview
- true
- e2fbc710-f61c-45e7-bdba-3481d8ee4608
- Geometry
- Geometry
- false
- 725b7adb-a38f-4d2c-9ee6-79a6b67a7d9d
- 1
-
14802
1157
55
20
-
14831
1167
- The material override
- 550a175e-c47c-4689-8962-881ac2836467
- Material
- Material
- false
- 9e064246-d7d6-4781-b9b0-b7708f337fa8
- 1
-
14802
1177
55
20
-
14831
1187
- 1
- 1
- {0}
-
255;221;160;221
-
255;66;48;66
- 0.5
-
255;255;255;255
- 0
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
- Colour (palette) swatch
- 9e064246-d7d6-4781-b9b0-b7708f337fa8
- Colour Swatch
- Colour Swatch
- false
- 0
-
255;130;130;130
-
14644
1181
124
20
-
14644.69
1181.707
- 537b0419-bbc2-4ff4-bf08-afe526367b2c
- Custom Preview
- Allows for customized geometry previews
- true
- a040873d-0ba5-4f74-b5cd-908cacb6e0be
- Custom Preview
- Custom Preview
-
14810
1418
86
44
-
14882
1440
- Geometry to preview
- true
- 7aadb48a-4fa9-4400-a37c-22e9b0ef785c
- Geometry
- Geometry
- false
- 256a6a23-ae2a-4c3f-93be-5747baf6af61
- 1
-
14812
1420
55
20
-
14841
1430
- The material override
- 59dc302f-60c1-4a22-aa7c-0986b2eaba88
- Material
- Material
- false
- b8777943-d3cc-482b-b1f3-aa942da1a33c
- 1
-
14812
1440
55
20
-
14841
1450
- 1
- 1
- {0}
-
255;221;160;221
-
255;66;48;66
- 0.5
-
255;255;255;255
- 0
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
- Colour (palette) swatch
- b8777943-d3cc-482b-b1f3-aa942da1a33c
- Colour Swatch
- Colour Swatch
- false
- 0
-
255;128;128;128
-
14654
1444
124
20
-
14654.27
1444.201
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- faf6dafb-a2c1-4848-953e-b2099155a48b
- Panel
- false
- 0
- 0
- Site Importer: Google Earth
-
6444
3189
102
38
- 0
- 0
- 0
-
6444.71
3189.957
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ae9f5ace-2e48-4afa-a967-07b57efc2d42
- Panel
- false
- 0
- 0
- 533 S 3rd St.
-
886
1479
160
60
- 0
- 0
- 0
-
886.998
1479.23
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- d8c134ca-984c-477c-93d8-c2cf597e0271
- Panel
- false
- 0
- 0
- Minneapolis
-
979
1671
69
38
- 0
- 0
- 0
-
979.2393
1671.948
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- c21f982f-a8b4-4c51-aec6-8504d405c288
- Panel
- false
- 0
- 0
- 55415
-
966
2086
56
38
- 0
- 0
- 0
-
966.959
2086.23
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
- Boolean (true/false) toggle
- a84e5e7d-d5ba-4422-92b9-bc3a56652ae3
- Boolean Toggle
- Boolean Toggle
- false
- 0
- true
-
889
8264
146
22
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 507f2370-9c8e-4268-87e6-439c944fd491
- Panel
- false
- 0
- e63fb28c-9ebe-467c-8a46-a657892f11d4
- 1
- Double click to edit panel content…
-
461
23
257
105
- 0
- 0
- 0
-
461.4456
23.17018
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- 8bc51f74-1030-44b7-a69f-5150e1a79ddc
- Set TextBox Contents
- Set TextBox Contents
-
1330
4062
149
44
-
1465
4084
- The text box object to modify
- 35914c1c-26ce-41bb-a10d-d2494bee55f8
- Text Box to modify
- Text Box to modify
- false
- 36b92625-d0ac-4fed-ad98-1a2aed1129d7
- 1
-
1332
4064
118
20
-
1392.5
4074
- The new text to display in the text box
- 09962383-dbd4-43b3-b738-332dc22a3c88
- New Text Box contents
- New Text Box contents
- false
- 4e7cb5dc-e1b4-421f-81e0-9b35c407326f
- 1
-
1332
4084
118
20
-
1392.5
4094
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- db566e1d-2823-4fa8-9fe9-cd41b41d570c
- Value Listener
- Value Listener
- true
-
979
4142
152
44
-
1070
4164
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 556ef60d-06a2-4e78-921f-2bce4c9bc09c
- Elements
- Elements
- false
- 36b92625-d0ac-4fed-ad98-1a2aed1129d7
- 1
-
981
4144
74
20
-
1019.5
4154
- 1
- The optional filter(s) for the elements you want to listen for.
- c035cde6-ee41-4758-8304-c4be10ec031a
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
981
4164
74
20
-
1019.5
4174
- 2
- The values of the listened elements
- 774ed72b-a198-40cf-8459-ebd459f3bb41
- Values
- Values
- false
- 0
-
1085
4144
44
20
-
1107
4154
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 5d9303eb-5415-4254-987f-9d501ced0a0b
- Indices
- Indices
- false
- 0
-
1085
4164
44
20
-
1107
4174
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ee6cbdcf-ad6d-4c62-aa23-7ffe3449b646
- Panel
- false
- 0
- 0
- Enter Lat/Long Information
Enter Address Information
-
993
1183
164
71
- 0
- 0
- 0
-
993.335
1183.083
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 3d36d9a9-ff67-45ad-a5ef-82eb2a3df058
- Entwine
- Entwine
-
1793
1221
118
104
-
1838
1273
- 5
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 2925bf06-d706-4bac-88b6-4a73eaaf4993
- false
- Branch {0;0}
- {0;0}
- true
- ebc38883-bbd3-444d-a888-028c30dcfbae
- 1
-
1795
1223
28
20
-
1810.5
1233
- 2
- Data to entwine
- b3ff98f6-95a3-4038-95ec-90d0539bb782
- false
- Branch {0;1}
- {0;1}
- true
- 5fafcf8b-4ead-4fd0-9b53-337edd3dd4d5
- 1
-
1795
1243
28
20
-
1810.5
1253
- 2
- Data to entwine
- 3c7a419b-61ba-4ad1-a575-af7d317edb11
- false
- Branch {0;2}
- {0;2}
- true
- b137913a-7f52-490f-b5c5-dfab26abd03d
- 1
-
1795
1263
28
20
-
1810.5
1273
- 2
- Data to entwine
- d99f46c0-b724-4dac-9e50-1654a9df5bd9
- false
- Branch {0;3}
- {0;3}
- true
- 0
-
1795
1283
28
20
-
1810.5
1293
- 2
- Data to entwine
- 53e6baf7-2f96-46b3-a4ba-77a5b6016602
- false
- Branch {0;4}
- {0;4}
- true
- 0
-
1795
1303
28
20
-
1810.5
1313
- Entwined result
- 18ceec8c-daf8-4592-bb47-f17cbaff1838
- 1
- Result
- Result
- false
- 0
-
1853
1223
56
100
-
1873
1273
- 2dddb05e-5503-4506-8f9e-5c0f4c35f8b0
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create List Box
- Creates a list box from which items can be selected.
- 402ca708-fe6d-4503-9876-3a33844a3c7d
- Create List Box
- Create List Box
-
1179
1204
158
64
-
1273
1236
- 1
- The initial list of options to display in the list.
- 85f2e13d-5286-4a9c-a066-4c315bd91bd4
- List Items
- List Items
- false
- ee6cbdcf-ad6d-4c62-aa23-7ffe3449b646
- 1
-
1181
1206
77
20
-
1221
1216
- The initially selected index. Defaults to the first item.
- b0b41b48-1069-43d0-9632-ef9fb84dce84
- Selected Index
- Selected Index
- false
- 0
-
1181
1226
77
20
-
1221
1236
- 1
- 1
- {0}
- 0
- List box height in pixels.
- 22e0142e-4c27-45ad-86f0-05452496fe7c
- Height
- Height
- false
- 0
-
1181
1246
77
20
-
1221
1256
- 1
- 1
- {0}
- 100
- The list box object
- b137913a-7f52-490f-b5c5-dfab26abd03d
- List Box
- List Box
- false
- 0
-
1288
1206
47
60
-
1311.5
1236
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- 6246076b-d794-4bf2-8e07-43df4eec727f
- Create Label
- Create Label
-
1180
1039
134
64
-
1261
1071
- The text to display in the label
- 9c17ff0b-400b-4dec-9f49-fc1fc7f8a62d
- Label Text
- Label Text
- false
- d7f43d6c-d091-48be-95c4-0f03ad21b21b
- 1
-
1182
1041
64
20
-
1215.5
1051
- The size of the label to display
- a9ba27b9-50b4-4683-8fa0-8ace2bb6fba3
- Label Size
- Label Size
- false
- 0
-
1182
1061
64
20
-
1215.5
1071
- 1
- 1
- {0}
- 24
- Text justification
- b59967cc-813b-45b6-bfd6-1f5792705e71
- Justification
- Justification
- false
- 0
-
1182
1081
64
20
-
1215.5
1091
- 1
- 1
- {0}
- 0
- The created labels.
- ebc38883-bbd3-444d-a888-028c30dcfbae
- Label
- Label
- false
- 0
-
1276
1041
36
60
-
1294
1071
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- d7f43d6c-d091-48be-95c4-0f03ad21b21b
- Panel
- false
- 0
- 0
- Enter Site Location
-
1010
1037
129
38
- 0
- 0
- 0
-
1010.178
1037.09
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- e01c9b46-5aba-4d1e-ad45-6b552c9986d6
- Panel
- false
- 0
- 0
- Enter Latitude/Longitude or Address Information for your Site
-
1006
1097
129
71
- 0
- 0
- 0
-
1006.025
1097.827
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- a7a0c814-ab68-45e0-9a9e-5515b0c4adc6
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Separator
- Create a line separator object.
- 39ff8ac3-0265-4a3f-bf90-78837c1a4a05
- Create Separator
- Create Separator
-
3593
1977
148
104
-
3667
2029
- The thickness of the separator.
- 2df461ad-b02a-4a10-8813-19c6ee1ce585
- Thickness
- Thickness
- false
- 0
-
3595
1979
57
20
-
3625
1989
- 1
- 1
- {0}
- 1
- Separator is horizontal.
- 3e6c7d81-c325-4f3a-8011-6f4b5622dd49
- Horizontal
- Horizontal
- false
- 0
-
3595
1999
57
20
-
3625
2009
- 1
- 1
- {0}
- true
- The color of the separator (optional).
- 1a390061-0c51-4824-a71a-00e967193e0c
- Color
- Color
- true
- 0
-
3595
2019
57
20
-
3625
2029
- 1
- 1
- {0}
-
255;0;0;0
- The width of the separator (optional). Default is Stretch.
- 50685f8c-82a5-49ee-97c9-5696786caf6a
- Width
- Width
- true
- 0
-
3595
2039
57
20
-
3625
2049
- The height of the separator (optional). Default is Stretch.
- b7933829-93c6-4f79-bf38-750830242587
- Height
- Height
- true
- 0
-
3595
2059
57
20
-
3625
2069
- The created Separator
- c147b2d4-b00d-4f46-b22b-0b4d5006be23
- Separator
- Separator
- false
- 0
-
3682
1979
57
100
-
3710.5
2029
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 6d7f3daa-d38f-4fdd-a910-f70b9119c5aa
- Adjust Element Appearance
- Adjust Element Appearance
-
1766
1119
129
84
-
1881
1161
- The elements to adjust
- 935d315c-e133-441d-8126-6c1f1371dffd
- Elements to Adjust
- Elements to Adjust
- false
- 5fafcf8b-4ead-4fd0-9b53-337edd3dd4d5
- 1
-
1768
1121
98
20
-
1818.5
1131
- The foreground color of the element
- ef0740bd-417e-4ab1-9a79-699540769fa4
- Foreground
- Foreground
- true
- 0
-
1768
1141
98
20
-
1818.5
1151
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 6b16e293-930a-44dd-a182-2dcec065d801
- Background
- Background
- true
- 0
-
1768
1161
98
20
-
1818.5
1171
- The font size of the element
- 6aae3466-328b-4e63-b39c-b879b5dcd37c
- Font Size
- Font Size
- true
- 9b3ee35d-f770-4721-ba37-52f6708dd24c
- 1
-
1768
1181
98
20
-
1818.5
1191
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 9b3ee35d-f770-4721-ba37-52f6708dd24c
- Number Slider
- Number Slider
- false
- 0
-
1376
1185
203
20
-
1376.118
1185.543
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 084ca242-7600-4e9b-829b-e594c80fcc60
- Create Text Block
- Create Text Block
-
1176
1116
157
64
-
1257
1148
- The text to display in the text block
- fc4471d0-27d9-4442-94b8-7d524f53000e
- Text
- Text
- false
- e01c9b46-5aba-4d1e-ad45-6b552c9986d6
- 1
-
1178
1118
64
20
-
1211.5
1128
- The size of the label to display
- 3e1fc4ef-446f-4355-b167-a934740c42f5
- Text Size
- Text Size
- false
- 0
-
1178
1138
64
20
-
1211.5
1148
- 1
- 1
- {0}
- 12
- Text justification
- 058a422d-1b62-4324-b3f8-92cd768d2128
- Justification
- Justification
- false
- 0
-
1178
1158
64
20
-
1211.5
1168
- 1
- 1
- {0}
- 0
- The created text block.
- 5fafcf8b-4ead-4fd0-9b53-337edd3dd4d5
- Text Block
- Text Block
- false
- 0
-
1272
1118
59
60
-
1301.5
1148
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- ee6cbdcf-ad6d-4c62-aa23-7ffe3449b646
- 402ca708-fe6d-4503-9876-3a33844a3c7d
- f53db8ac-97d8-4b99-bec2-d02783be0e39
- c4eb3fab-905d-4e87-9e82-bfbfbd66f52d
- 6246076b-d794-4bf2-8e07-43df4eec727f
- d7f43d6c-d091-48be-95c4-0f03ad21b21b
- e01c9b46-5aba-4d1e-ad45-6b552c9986d6
- 6d7f3daa-d38f-4fdd-a910-f70b9119c5aa
- 9b3ee35d-f770-4721-ba37-52f6708dd24c
- 084ca242-7600-4e9b-829b-e594c80fcc60
- 3d36d9a9-ff67-45ad-a5ef-82eb2a3df058
- ef89b83c-48d1-402e-8f27-a9d1df79bb51
- a9f0b996-f025-45ed-9654-a5d6766c2fb9
- 43067eb6-e5e1-4c77-b896-afb1b0d4b6b0
- 58db937d-c561-44e6-b3a2-ef9973a47cec
- 15
- 0fca8e79-46e9-4be4-a750-d0d39a3e1d86
- Group
- Select Building to Use
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- ef89b83c-48d1-402e-8f27-a9d1df79bb51
- Adjust Element Positioning
- Adjust Element Positioning
-
1759
948
142
144
-
1887
1020
- The UIElement you want to reposition.
- 7a361563-12ff-482d-bcbd-98781d932dcf
- Elements to adjust
- Elements to adjust
- false
- b137913a-7f52-490f-b5c5-dfab26abd03d
- 1
-
1761
950
111
20
-
1818
960
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- ff428b16-a896-47b4-916f-6957e55b88ad
- Margin
- Margin
- true
- 0
-
1761
970
111
20
-
1818
980
- Set to true to position relative to the upper left corner of the document
- 7b554792-59a3-4179-9034-63df50671353
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1761
990
111
20
-
1818
1000
- 1
- 1
- {0}
- false
- Override the element width
- 26a20a7a-4313-4435-a536-ca1b1ec818c0
- Width
- Width
- true
- 0
-
1761
1010
111
20
-
1818
1020
- Override the element height
- bbf6c015-5e9d-47f7-8c75-001a8348e464
- Height
- Height
- true
- a9f0b996-f025-45ed-9654-a5d6766c2fb9
- 1
-
1761
1030
111
20
-
1818
1040
- Horizontal alignment
- 8897206e-fa58-48e6-bcd0-04313e874e2a
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1761
1050
111
20
-
1818
1060
- Vertical alignment
- d12f340d-ef4a-4a19-b751-20e6526e69e2
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1761
1070
111
20
-
1818
1080
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- a9f0b996-f025-45ed-9654-a5d6766c2fb9
- Number Slider
- Number Slider
- false
- 0
-
1538
1032
203
20
-
1538.871
1032.614
- 3
- 1
- 1
- 100
- 0
- 0
- 55
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- e5901de6-507a-40c4-8bcd-6af79c7ecc50
- Panel
- false
- 0
- 0
- Proxima Nova Rg
-
6395
2901
89
38
- 0
- 0
- 0
-
6395.853
2901.739
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- cb95db89-6165-43b6-9c41-5702bc5bf137
- Boolean
- Contains a collection of boolean values
- 58db937d-c561-44e6-b3a2-ef9973a47cec
- Boolean
- Boolean
- false
- a0a1c4b1-fc45-4d5e-92f8-1aa15ace7d48
- 1
-
1594
1339
50
24
-
1619.225
1351.434
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 08fe893d-7a39-4862-b5e4-0482ec6e4b53
- 5281cc1a-c6a0-4d8b-bc66-c95824d23eba
- 7029f54e-4ba2-4006-8fe0-1a27f7e65d02
- 3990a0ae-ffec-4449-b5b8-d76e586eb67d
- 4d646e7a-a388-45ee-b1b4-8be6e23c78fa
- 1dcb88c1-bc1b-48b7-913f-55f3c86d68d1
- 7bd0a005-5314-4768-beb3-95a4a7679bc6
- 629335b4-f673-4c79-969f-e827f75251e8
- 8c5b096a-4e1a-4f15-b52e-2b56b2a8b910
- f008d5e2-b800-4399-ac7f-d17b80009914
- a335f27b-698b-4255-88f4-78200f26b34f
- da45f475-7225-4805-acb1-e29b9875d4af
- 80a1d6bf-5f00-41ac-a5df-37e89c06dcca
- 57d320e3-01a9-444b-bdf9-8d6f9b92cb0b
- c495eb29-06b7-4424-aa7d-5d64efa53b73
- 8f9d91bf-119c-44d4-a01e-4967e9ad9660
- 1c218f54-c244-4b62-88d7-61768ed392e1
- ae9f5ace-2e48-4afa-a967-07b57efc2d42
- d8c134ca-984c-477c-93d8-c2cf597e0271
- c21f982f-a8b4-4c51-aec6-8504d405c288
- 60eef9dc-ca04-41ed-aa29-1b2998f69386
- 1781268d-0b86-4743-afa3-f6b3d399d430
- f45cbe67-e55d-4fa0-a13c-12df954eb984
- be2b005c-4921-490a-b876-fd16fce54dd4
- 9f88bf58-ce70-4272-87f9-4b34d03f7bd5
- de95539b-a4e5-4cb3-a44f-4ed9e4e9a468
- b0fae450-7d60-4908-8c2a-0b207f8d19a6
- 5b302cdd-ced8-4764-ba1d-62fb4fe14a83
- 616d3887-75f6-4e0d-975a-102222125683
- 5812aecb-ba38-4369-a149-8c3531137056
- 58b7c385-e893-486e-a496-5a2dd6f59e55
- 0e17549b-7b50-469e-9767-ddb41c934919
- 2d5e245d-37e7-45a2-9c93-195e72ce47dc
- 6aa3540b-0399-40ba-9146-cd0e6de920d0
- 34
- fdb6be5f-6a20-42ad-bda8-aa5f81040785
- Group
- 9c53bac0-ba66-40bd-8154-ce9829b9db1a
- Colour Swatch
- Colour (palette) swatch
- 8c2467b8-77e4-4227-bec6-8edeae349ce0
- Colour Swatch
- Colour Swatch
- false
- 0
-
255;106;163;65
-
5676
3421
124
20
-
5676.022
3421.251
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 924977b1-84e7-4dca-b665-dc5665995c5c
- a72dedeb-188e-43b8-a97f-fb0006f95ba9
- 74b9af32-7d99-42f5-a432-8179fec731d0
- aef46266-7eca-4177-bc84-14300355d702
- e2807eeb-9f9c-4f23-8681-e52fa76dd859
- be9942f9-eb89-438c-a2d4-057d27eb0b34
- 0e7b47b7-d31c-4f1b-a482-07ea0554f8f7
- 0cce266e-3476-4154-acea-09d2d06c0404
- 2037544a-782e-47fa-908f-b3335aff5b12
- 148a616a-f5b1-40cf-a785-df2df7554d26
- cdf2e11f-6fe6-4d60-86f6-34a5efb38c8a
- 688d3616-8cff-43e5-8e63-c753ac141c0c
- 4c6367e3-8f26-4de0-9084-ce41db3437ca
- 06fa9381-80ae-4027-b45f-6857b8f1fc6f
- bc99243d-2c5d-40b4-9360-937a192cdc20
- fad66439-a507-4c7f-acb1-dc5fc30ab780
- eaa455c2-1654-4b37-ac2c-cad8507d319b
- aef487f3-d06a-46b2-97b0-b6d9430de961
- cb0b3abc-d37a-48f4-a397-3c902ba88c2a
- 15c4f51d-6403-4812-92ee-3e08add695dd
- 0d02285b-3395-4f47-8bb0-9824204033e9
- e8670704-419c-4e7b-8dc1-7b4195228c22
- 7f437267-41b6-494e-9e1d-29c633adc066
- 3cf4a98c-0efd-4b76-8d28-6bf4065c905f
- 8c2467b8-77e4-4227-bec6-8edeae349ce0
- 0c795ecb-824f-4ea9-b9d5-9a134f926409
- 26
- 7af44ae8-45d4-4380-97ff-6fb53bfec18a
- Group
- Browser Window
- 8a270d94-fbd4-49f0-8cfe-5fb43ce85bee
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Expander
- Sets the properties of an expander container
- 849698a0-5893-400b-a212-3d3a53109336
- Set Expander
- Set Expander
-
3299
1996
115
64
-
3400
2028
- The expander to modify
- c0f8fd0f-8892-4f52-b6ee-f5fb60eba701
- Expander
- Expander
- false
- d8edabc5-a9ed-46d2-b3bf-a807142fb6dd
- 1
-
3301
1998
84
20
-
3344.5
2008
- The new name of the expander
- cf6bf1f0-3dd3-4aad-9284-48a5c64679b2
- Name
- Name
- true
- ea51a479-b246-40ed-9497-e8d91a064a80
- 1
-
3301
2018
84
20
-
3344.5
2028
- Set to true to expand or false to collapse
- ff705b78-da20-4a9e-9d6e-a3424e7a657a
- Expanded Open
- Expanded Open
- true
- 0
-
3301
2038
84
20
-
3344.5
2048
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 5ae999bb-6116-41a1-98d4-0346a796d66c
- Panel
- false
- 0
- 0
- Enter Lat/Long Information
Enter Address Information
-
3004
1995
134
75
- 0
- 0
- 0
-
3004.078
1995.747
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
- 0
- Retrieve a specific item from a list.
- d04c0d64-0891-4fa8-977c-0b5aceef3db3
- List Item
- List Item
-
3158
2019
80
64
-
3208
2051
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- Base list
- 24759aa5-caa7-4f46-b576-f64fb06fa64c
- List
- List
- false
- 5ae999bb-6116-41a1-98d4-0346a796d66c
- 1
-
3160
2021
33
20
-
3178
2031
- Item index
- 7e097733-5bcb-4b3d-9d2e-61393a0abc36
- Index
- Index
- false
- a0a1c4b1-fc45-4d5e-92f8-1aa15ace7d48
- 1
- 2
-
3160
2041
33
20
-
3178
2051
- 1
- 1
- {0}
- 0
- Wrap index to list bounds
- 4ec1b640-2688-46be-bd97-dcc1ce3fae38
- Wrap
- Wrap
- false
- 0
-
3160
2061
33
20
-
3178
2071
- 1
- 1
- {0}
- true
- Item at {i'}
- ea51a479-b246-40ed-9497-e8d91a064a80
- false
- Item
- i
- false
- 0
-
3223
2021
13
60
-
3229.5
2051
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 473cb663-66f3-4abe-bd28-6e3963774e12
- 4dd91265-37ac-4962-a2c4-4bf93c55d463
- 231ebbb2-ca57-46d0-bf3d-774b1b2591ba
- c3a6758a-e9ca-48ed-a938-ba870174bfe8
- 9040aaba-f616-44e6-80b6-252996d1aec4
- 6721d106-fe27-4647-bb47-ad7ba7d8755f
- b243b69e-00cb-4378-adfe-9eeb9a8899ed
- 9450b53c-e1ef-413d-9747-5d6546324a3b
- 506ee423-698b-410d-80a1-e37904137fed
- f8265183-5ddf-469c-9ce6-9ee3aecbe870
- 10
- 4e00a616-ea8c-407c-8795-776533fde44c
- Group
- Lat/Long Inputs
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 5ce6f7e3-f15f-452b-91b0-75d09b9fff1f
- 46b20cad-e0c1-435a-8304-d3715081fd91
- 4557fa9d-5d05-42c5-9291-549fcbc87e96
- c06d02a0-8857-4547-95ea-05e2084e868a
- 784cf26c-2d36-4848-a044-7b6115887d50
- 0716a6cb-f761-47cb-8684-f4bf06c5452d
- f2c27da9-2af0-4862-82e2-25e87622ff55
- ff5bc84c-c18b-4339-9734-4b92fc1934e4
- 8
- d1959a41-14e5-4386-9a87-795a03946c6a
- Group
- Lat/Long Information
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 5d45703c-98c3-46d5-a0e8-1dab8d0fd347
- Entwine
- Entwine
-
3815
1935
118
64
-
3860
1967
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 40379d80-4f74-4bd6-94e1-bb8ae56f7418
- false
- Branch {0;0}
- {0;0}
- true
- 18ceec8c-daf8-4592-bb47-f17cbaff1838
- 1
-
3817
1937
28
20
-
3832.5
1947
- 2
- Data to entwine
- c3f36ed6-f8dc-4422-8651-cf48d729497e
- false
- Branch {0;1}
- {0;1}
- true
- d8edabc5-a9ed-46d2-b3bf-a807142fb6dd
- 1
-
3817
1957
28
20
-
3832.5
1967
- 2
- Data to entwine
- 531d1bed-9550-43bc-80be-829947405af0
- false
- Branch {0;2}
- {0;2}
- true
- c147b2d4-b00d-4f46-b22b-0b4d5006be23
- 1
-
3817
1977
28
20
-
3832.5
1987
- Entwined result
- b02fdb08-a442-40b0-abf9-5d4d8943c775
- 1
- Result
- Result
- false
- 0
-
3875
1937
56
60
-
3895
1967
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 70fc6604-190a-4dd9-92b5-d401870d2aa0
- Entwine
- Entwine
-
4438
2820
118
84
-
4483
2862
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 7de782e5-68c4-4c72-be2b-84a7462b3f98
- false
- Branch {0;0}
- {0;0}
- true
- b02fdb08-a442-40b0-abf9-5d4d8943c775
- 1
-
4440
2822
28
20
-
4455.5
2832
- 2
- Data to entwine
- 8a0e40ea-f268-4354-84b8-ac3a7ae18fa2
- false
- Branch {0;1}
- {0;1}
- true
- d9e20c67-8173-42e6-a81c-6636a8899242
- 1
-
4440
2842
28
20
-
4455.5
2852
- 2
- Data to entwine
- f37b2134-a1a8-45a0-9922-889315614bf8
- false
- Branch {0;2}
- {0;2}
- true
- 7d133164-6dd5-4cc2-baca-fff8f507743d
- 1
-
4440
2862
28
20
-
4455.5
2872
- 2
- Data to entwine
- 0c5e7a60-8d2f-459d-b33d-5f8324452830
- false
- Branch {0;3}
- {0;3}
- true
- 0
-
4440
2882
28
20
-
4455.5
2892
- Entwined result
- 233444af-38bc-41ef-9100-eacf3e0a5398
- 1
- Result
- Result
- false
- 0
-
4498
2822
56
80
-
4518
2862
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- dcf7e5b9-5595-4609-bf70-3aa4b2756e79
- Entwine
- Entwine
-
2998
5532
118
144
-
3043
5604
- 7
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 7bd9a1b0-48a0-4506-a0f2-0f1978768ea0
- false
- Branch {0;0}
- {0;0}
- true
- 3b569cb8-6892-4fd9-b505-f676fecd86de
- 1
-
3000
5534
28
20
-
3015.5
5544
- 2
- Data to entwine
- 189c6805-084a-434b-8c9d-936032e3262c
- false
- Branch {0;1}
- {0;1}
- true
- 3f9b31a3-5047-4092-bad2-8a3a38c745b1
- 1
-
3000
5554
28
20
-
3015.5
5564
- 2
- Data to entwine
- ea13878a-4ba3-4ebd-ae8d-c25fa07c768b
- false
- Branch {0;2}
- {0;2}
- true
- 28ad132d-789a-4870-916d-154e933383f1
- 1
-
3000
5574
28
20
-
3015.5
5584
- 2
- Data to entwine
- 75c07de5-8e3c-418c-a486-3b443d44226e
- false
- Branch {0;3}
- {0;3}
- true
- 6aa73273-d57b-4af2-b5af-f1b02d7ab7f1
- 1
-
3000
5594
28
20
-
3015.5
5604
- 2
- Data to entwine
- 5e6b98e8-75ed-4b13-8b8f-1ab41fc559aa
- false
- Branch {0;4}
- {0;4}
- true
- 9c61a076-71bb-4e79-b935-319ce824552c
- 1
-
3000
5614
28
20
-
3015.5
5624
- 2
- Data to entwine
- 3cd940d9-4aee-45ac-aa39-bc29ea847172
- false
- Branch {0;5}
- {0;5}
- true
- ef5e4880-327d-4de4-9ce3-99aa346e1d08
- 1
-
3000
5634
28
20
-
3015.5
5644
- 2
- Data to entwine
- 5b98b498-b358-4ecd-a345-4be90e4cf0e3
- false
- Branch {0;6}
- {0;6}
- true
- 3d2cef11-1a71-40e8-920a-e1c775f5c6a5
- 1
-
3000
5654
28
20
-
3015.5
5664
- Entwined result
- d9e20c67-8173-42e6-a81c-6636a8899242
- 1
- Result
- Result
- false
- 0
-
3058
5534
56
140
-
3078
5604
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- 9c65311c-c45c-4b4b-bc39-944157c2c0a4
- Create Label
- Create Label
-
1120
3099
134
64
-
1201
3131
- The text to display in the label
- 5b389efc-2164-464b-b639-f81b7e7fd301
- Label Text
- Label Text
- false
- 57db691c-b9b9-408c-91f4-2b438b12df07
- 1
-
1122
3101
64
20
-
1155.5
3111
- The size of the label to display
- e3a1c15c-b457-4d46-877f-e180726b0220
- Label Size
- Label Size
- false
- 0
-
1122
3121
64
20
-
1155.5
3131
- 1
- 1
- {0}
- 24
- Text justification
- d572dcb3-5899-41e8-a571-6442971e035c
- Justification
- Justification
- false
- 0
-
1122
3141
64
20
-
1155.5
3151
- 1
- 1
- {0}
- 0
- The created labels.
- 3b569cb8-6892-4fd9-b505-f676fecd86de
- Label
- Label
- false
- 0
-
1216
3101
36
60
-
1234
3131
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 57db691c-b9b9-408c-91f4-2b438b12df07
- Panel
- false
- 0
- 0
-
Site Bounds and Parameters
-
956
3089
129
38
- 0
- 0
- 0
-
956.8909
3089.665
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 14a1ee78-6536-43b2-b6d8-4b26a736f0a9
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Window Properties
- Modify various properties of a Window.
- 6e3986c6-8848-40f3-a965-94b9159bc1bf
- Set Window Properties
- Set Window Properties
-
7005
2681
125
144
-
7116
2753
- The window to modify
- 79124968-561f-4d60-9a02-ed9703a8ca39
- Window
- Window
- false
- 6508d7e4-1f74-4f17-a1f7-bced3825e6e5
- 01b93687-bb7d-4401-a6e7-2954501cb391
- 2
-
7007
2683
94
20
-
7055.5
2693
- The point (screen coordinates, so 0,0 is upper left)
at which to locate the window's upper left corner.
- db6eb9a5-615c-4c36-b4fc-c273945680b8
- Starting Location
- Starting Location
- true
- 0
-
7007
2703
94
20
-
7055.5
2713
- The base theme for the window.
- e7398882-f711-446f-b9ac-53409bea69b6
- Theme
- Theme
- true
- 0
-
7007
2723
94
20
-
7055.5
2733
- The color accent for the window. Use the component
menu item "Create Accent List" so you don't have to guess
- e639c504-ff86-4e50-808f-f253f6052e01
- Accent Color
- Accent Color
- true
- aa1c630d-8318-49db-866b-7c9dec7eafb1
- 1
-
7007
2743
94
20
-
7055.5
2753
- Set to false to hide the window's title bar.
- 2f7ef80e-5289-45d8-bed6-633029fcbf50
- Show Title Bar
- Show Title Bar
- true
- 0
-
7007
2763
94
20
-
7055.5
2773
- 1
- 1
- {0}
- true
- Set the background color of the window.
- 20dbf3a0-2a2d-402e-9252-fc054b3d6ede
- Background Color
- Background Color
- true
- 0
-
7007
2783
94
20
-
7055.5
2793
- An absolute scaling factor used to modify the size of the window.
- 35a9efa3-affb-496e-b022-684f3e985b21
- Scale Factor
- Scale Factor
- false
- 0
-
7007
2803
94
20
-
7055.5
2813
- 1
- 1
- {0}
- 1
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
- Provides a list of preset values to choose from
- aa1c630d-8318-49db-866b-7c9dec7eafb1
- 23
- 1
- Value List
- Accent Colors
- false
- 0
- "Amber"
- Amber
- false
- "Blue"
- Blue
- false
- "Brown"
- Brown
- false
- "Cobalt"
- Cobalt
- false
- "Crimson"
- Crimson
- false
- "Cyan"
- Cyan
- false
- "Emerald"
- Emerald
- false
- "Green"
- Green
- true
- "Indigo"
- Indigo
- false
- "Lime"
- Lime
- false
- "Magenta"
- Magenta
- false
- "Mauve"
- Mauve
- false
- "Olive"
- Olive
- false
- "Orange"
- Orange
- false
- "Pink"
- Pink
- false
- "Purple"
- Purple
- false
- "Red"
- Red
- false
- "Sienna"
- Sienna
- false
- "Steel"
- Steel
- false
- "Taupe"
- Taupe
- false
- "Teal"
- Teal
- false
- "Violet"
- Violet
- false
- "Yellow"
- Yellow
- false
-
6805
2742
160
22
-
6886
2742
- f31d8d7a-7536-4ac8-9c96-fde6ecda4d0a
- Cluster
-
7VwJXBNX/h/kBlFQvLVO660Ug7fiQRIOI+cCorbuyiQZYCRk0skEPHpQa9XqVvGuikoPtdYLzxbQim60Vq2y6vbQ2lKPWrvtrvZfu7Zu9f/eZCZkMkfCEo5ul8+Hj/LezJt53999zAuIJXWWAtxIPwI/XgiC+ILfNiaDJZcwzijEKTNBGuFUGhiG0/DHH17C3TcRx/Q4BS/xZaeDuClNLBwOBEPa3VVDj/dbGrvqhdE325+ccs4/jcILCbwIzgeBeb+MPLCKvi07nIyb8zJnm3A47c0+OISdSyGpAswAZ3ozT1tjvysDN+A6Gtfb59Yg+vBYPIcwEjTYRRpFmnCKJnAztyz89YnFaOY5AeCPlbm/Zkd++2lAcCxu1lGEiWY3D18R8UnBCnDuLzQ9jzCSKE2iWYTZghmU6X9A1aQRAEbjVGRu3qzAdPBOEDwzByz8CeFG1aTFBrk3Bxp4vZng9dkntmKH/TIxKhdnrnwM/HkPQF/zr0ePfJ4iyQIO83NntBN8swAAvEcFwhHBYwLTdaYkbDZpoR2vDUqgSItJcHHrhInKJEJLYRQLmhdLC1/epXDE33bdbOad2dtDlWYzXqA1zI63GAyO4I2faCnAjJM1EWiWjcHGKSJHRUZFDo1A1RYDbaHwcUbcQlOYIQJNs2gNhC4Rn51J5uPGcUawVFtu3aw69oTL+rOr+CktdB5JccNtlEY9hRehE3H4VGMrjZ7jyv3HIrst2HEs9sVLncisucNX8CgcwLwkOlnjL/GYsDrWStVC0tkh6gJ+g21jPKDguJ9tHOLTisXOJ2FynaRcjl7tN7LH1OQNoxLH0jeTlvHeKTCeMOBoGkbnBQJmozHCaJO8AHY1Mb7txV5pRjFURxoMNh5DyRw0By5mAouZw+JmmQgKTzXC9eMKHbQBEgSHwC+N2wENURoMzM3mZwdGDmytMZppzKjDEyyEHdnDqQlKfTaVsOabYVEnz94NldhFQAqhy5eYSmV2YZN05k2CM0gLpcOFkqOkaYrQWmgbj9olRwUu1DNDvZiBn61I+eg4BJmoQpBqpW8aUUgy6/QEc4fO3LPefHZMXJs0SGszDRAAegGT53k/FQX2nedISuFFPnAz3Pa85yqe89HQeAF3D7MvyNMzzGAPxlz7Zv3q/oY3jk4fMz0dNzMAmKfPyCBz6CKMwqczWshhRh07I4nMJVEAowHXR5qMuSy/ebHqTsBvQ2sLx779YUHiKuufP/ql+rVh3kCQ3ZKP1moKB6oT1RRguTifHX0QmxkRY8co222AG40oAW9FSeYFoSrV4iimB2YA/p/Ow9Eiwqgni0QZbGvNxT0ft3mgWjBhQHDPl4jZ0q8m4DHerJvMU/Y9yzzt1QhSrOIzD5J9DcxGxwWbMAormEEYTRZGvv1ZvMVg6JsJ9scIoIHUYZxEwk3bQAEIACgiRfd+761pC6NvPznpfTSq4n7U2RD+3pltoTZZEe6dNysQMT/bBGMoRKRYTAK93JfAbABiDQRxBZDAMicJRMq+sSKmMTwQvVgQpVRbx0yGSfR0Hg88UdC+7YhsLDdXpiz95WjvB28FPMMDLdgGyxS4lAAz3qQryM6+2X91qxXm5F0hD7RXq29meQCy0Gg5yADfNaXS4jwGP6OlQGuTds7cI9VUjCP1WrkQgemQenk4kZtH88gXiWbgjDpQoCSFGnCsEEe1BsyYD8fMOszAyYgJOHQkZaOHYTacJWizjR/EBefhhqxfv/nyUvLqoEGXg69WfSYmOBOZF5ISHHbWmQu8Gp8L0sbKccGdsXGtbdADz45VP34y2Mdn2jWNTf1GopPNYMQIXATjTIvR5iMUEUCygJ5+QqnXo3EGHPr05ifAJQUm0gj+L46yT07l5ov/93pCeZf50T0HVPnyUPYV18nssKdtfnEtq3FQAJzJWW0jXzDiw1rIVoiER3bE//KUHd/9UblxwZ4Rn/iPOczbT0gKIwdohoEAURDfDPrJqC4U3IdThA41MzeiOYDVzcDgA+YuxAwW3CwKrTNfybyKAGKnaU9DHep3AikZB6BOVAt59G8+fie6vDYuzs/2cDjsz60TS+QSNC8kC04AYMUSZpMBm+0oLQEaI/BCC23vzA16J2OzeFooZlmMdzJh5I1BscwwYsIIxzcLgs27tjgxhuUI7n0EHPGHA98rTLN8VFvfvL4w7sc+JfX2mTJoTJcv9Jl8JJhFZfeZ0FwYqEF1OVmD4qxEoma4HHCbYPRJ6BhlCNgJhEDEHPgI8Le4pO7/fOi6nZv0E5eEPffg++NP/1n6XSWdKGbWTRapPg7UGGSRjoBFFM7SWHYISON4gRMVyBLAT6kDDq7ZkfRiUD0OFZsjNsAq2DCjSRBH5+GUKBIvvFP+8vTh/nHLO9OLZl6bsdk/GTOZWP/bzgI8pwA8g9OIQo/BcdKVx3C9hBo19+wj1crWxJd9jt293kBbUQxANkGQy8RsRdph4E+MFzhZcpoqmrXGNGXBGTVVx1coRgFnIpfZaDSagxnMtis4PhTnOsu6t09nfjIu5ZXL03zyt0TN4eEaNNG+ugBWxzmPW4rjDPfJwJY2oVkcLX8tSQIfyGh/WL3s/GNQHIC91gI1o69THpx0iNJnekXkd4dyiuIXT34ifU/bsDV8+y2uDthhT1Ol+gDLzKEqaMOdqFK8j6EZq619EAn7vfTpWR8qBpekLr1+dlvo/d6tePvxjzPSIMx0CmB9ZeRBEW/AaMACwDHSc9AKUit6wB5ALQMdWWAOYW/QQGmrS6OJYp924ELE9bP62E3pP1+5uuJqd9F3FaDPTbjrTl4ASgC6k2dVIsFs9VlGRYSkQTbDgcHlWB3yGQQ5iNkIj6Tw158Z1ug5vTZNf2qp19HA2Mp/dEoOGdS+hpv3cjHfSmI+OJXheIEIBdjGpR9se19mO9wlIgZFitxt4fah/sNtGIuSbdC6wevzfNpqNo/7ZekL7cfN8U+20JjWgNvlgG9ZbZoBnauIVjwnFCXbsKsQo++GmGPbP1ioXL8k6eM2lZqgBpoNFPCEAvJErVJE/ylqgB89Ns4BSa9GQnJAkSbhxqkv1Ss7KYgPjve97DaSUeJIRrlG0jle8QCSjM6SRBJIlwOScJ2ARkCy8tz7wUsHdUhZuWDG+JBNxQ/dRnKIOJJDRJBsoHqHUDFGVxIqYHRZubfLr5y5a8sqQj1K4WaLgRYFxtnh4uHgl87cKECAG/e0has9zcqdaISafYrhFtbC+SIS8YjflW5tbg0+nLp3VYcnnv/11Da345GuSv1Mi5nmnFU0jTQz9Qzg+QqjkwAJ0Jd7savADE4BRuUSRnMECGbngFUiGCtJQr8bNdUtjhLGHFjG48wlZuRckkg0JEipNZMGABzvDh24BjjwwNIaCJoGYXIRacyfHYFagM+J0ehsQAWULDKiFGHOF/c7l3+pWbP70trEBQn/2tTn9PUUd5EQ8ILMte5a4I1W5A7UEW1AJBSqdqb6q0CDqOqVTu5jC3u4NwJooEWYkfHbKZyDURyW2ScVp/snXNPsa/WBSR0+6l0eLO3iHOIojNm2AA6xa1wFPc4+ZkN17kZGThDkCzHvHVkjiCy5oEcKz81emXZmtiVkIlFGZQP+Y9M0tgQo3HNIEJaTA0sYLPOjgKlB0A0u1ONAEkiY3QHcacvroGYcvgcNdJR2NvQfCzBzSBDMbALmTsJz6Ag0kzRFoOkw0WgTHxVJ02QBkBk9UUjoLdLxfEd8/K5XS4cmbvPL2Fpx+6YPX7MlM28n1GzsuMeV+0ZGfcvQ5M6EOOd8sVwgqnEMRMG/HFsDDgcONlGIc2Uji8mEw8RxDg3wpYAG49LLerYvQRS8aSeu367svyF59QO6X1Tgjbs88MLtOklOMYhf5WmTAYEtiZEDVqFsEaEq4khdbxcS1zW1EKcoIDEMpVhrYEvmi5Lr6wgVGY2tSln9Q9LAtLKPY/hRqnglx1e8huMJTq9RyhHESZv7uMCimygWtlKJKBjYmNL8mu2LVC+/3GXCM4t9OvMFX6Kk4SdVzPAAHKFqWWWs5sEB/Ro54xY+0SHjZCByjZIyXNXvQkT8tKlJ87b3nTP+xo1zfBl2WEbJLSOUYdGrXMUQ5ODXDfODibg95rCvVg75stQD9iwtVlZ3xvIg9HMBYbssNiXnAsBDO6bsOLwDUc4vjFsU9njVJ3xnwL6INHxi17gC73za5P4/fpWVcODjqVHeZwY2tFrG6Mc4Wf0Yz7nUnL0RuNQp78af+xCxqouf6hJNfDspjAdEm2QQChAmA2Gr3AtdZSkT1i0Z6FAc+r0QoQLeKqL0GPHVzq1z7t9Vrdjww9V9E7qslXsNAS2c5t3NhO6yIsgwAF+5SixLv92KZA8XyQ5xwYlIdogpBDcwO+Sp7I+ckPSIJyjg1hPArDFpbDfo0y8pYtrOLw9rdqyZOXBASK6JRx8vpYAkYKiJa8cxgJwoJGe2aIy904pUD3NO7MiB9FgGriOBU1oflIwlM7xjerySeLDbmDB1aMdyPkoqIUoqlyilt715PeQ4pdyfcfCNe/0u+3kAJcDWMighI+qViehsyxdAz9MNgEZ9/uLBvot9Y9/65d/Pbr/46J/NmpKo3sZyDCqWdI/ZwiDF6k+uO6clF82dWaUFFc2rTwPxGwGgThIpmn/3+mnrvvMj3CiaM3i5WzSHP4KiOdK7YUVzxIcrmnOtqAKOyAUBXu+Qbal7Z71avXOG6jt+2Y9ZEk0CEYuws1WqlXBwGkUWwhibSQqZGWEzUTgMpNlYGwSEujyShGVJiiwQ5Q5nzy0QvgNvy0zuC44mk3peR7rUDv5Dn1KSmZiHc8GWncPiZsG9OjYmeyl4b+QDswkBjk3xXrzVvFysFsXXQmocMpLMeq1crDeEH6IxCQ7Bcl725bxdLDeUXxvLoCmc1uUJ389dC1BpRWKgyz0WiGK5swUo3sHMsjwe+BvjcWcHuzF43B3H39Mc7mfLjLVYHvfOJE0th8PL3gNeTDzg8MFiHF69g5llOTwIkSg1JBHLAkz5exL33Hj61/j0AtLtUkMY2zCUic+iUZWBFOt/khKCnnX9T4wz9aQB1txpuJIWriTK9JevP9kDH10y6VCnq1+bFh3e4OJtBAwtvMTdks4tK1KjADj3EOsVr74KZofUP7nP7BbIut5m4mGrJp3nEoSHt3/oefHMiaS3Rkf+s1/WoxK+gYBbE+zbNuoqgf/o4fu+20sHqfeNWpGbeDKkqoH+dxnA7A7ErFgsZjddBxF9VL26llCImZmYg3O5XwOmxQ0OAIrC5WU6NLxiVUbS+sDcon6FCfv5n60wnJAB1hR+tlI35WkXESKjGCKHDOCmZu4Ahze1Q/j5XlfZ/HYMZLBYROTIhUYVNz96Zs6tF5W7J6rWfXjySjrfe5/keL/Qe+dPNwZpTEPlSBM6rCWQBi5Vr66xTkzXGKP+9A4aRrzo5NyIwvcYZBSs45zHy+pXWH1iECurKz5lpIa1dcGIhDe3/r3aaQtv3NdUvnewcm/+V0l8/zUNM+IG9z/D669ETfAOJmjVAb4kC1AjafsQigVZJoZ1VrciryLAFxFDVUeRBkM6lAc46BjrSfpmk804BUnFrds7jSzCKVv9Mn02ZkTVZAFgKsz2LBTsHfh/TnTiPg0W0Mn/BGKCdJoHbGVnVZCtFgkDF8dXCLYNMxGD43igbRx4WY6jfGKH1vifMBcq4toyIPG/AbaH02rSADYPh+B3w0/98uhRcCyFFWmMekLn8OVrIByE0ucwxORYoT9iH2qdYcJ1BGZQA1e67otcvwymG9D+t88UCjPZ72FZsTXyvw6PBnR4FMx8PGP3tPsJi72+zntn91jvZuzwqN1oRWoVUh0eta8ySbQm6vAYmW29PeHpA+oVpdrxPQ5+Pb9JOjw83J9YBvBEoqSKOsVrrEiZuIP439XhMS52+zcPFxWol5QF7X++fFefZu3wgDSJGSJHk9ohLanDY+vMowuPbG6n2h1y40RsceULLbbDAwJbPFQOWLR5HEuXHR5yGqy+HR5vlc6qarW3t3LVNu9LH30TfbkhHR5Oysm53uIB5VQ9TI5eTsre4w0gyPHDv2ZjQ5I3jOrx4qd/uji5WRtAGF09QlZXjxA0gMjB4X4DyK7boVfKw55P3WgYHvh2VERk4zWAeEJ3jpTVnSMFHR5yGLnb4XH+xrk1/iE94pfe+ONPy6O6hjdOh4cnFOAoWQU4mgvfQhAJn1kx7e+Fg+aGTXpp08XqwJI9S9z2mbs4eX9KYG0wqD/rcczFSAePWQeiC4qx85h9JWiw6sy9/YMsib7O91Djjl6340peODq197r8GDffVkA66UvdrVdCr3YgoIsX8GrfFnSrLwNUe7JeXi1zggMu8C5FUdj82q6ftp3+c8rew6WfUhe030i7sUo33Fhls7ixxVA1DgIAWsUYW7EWqMZBokdgSAHYizlHhKRw+G0f80Ea5DXWG2KBFUXzwhexScMVPrGrao7oOpxYmM9P28TbVxSmbRzmXNlZrFNF4iP/gXHL2+784NVjlbs9gF5MhBx6tRGiDqcselpMl19f9ApL8tYcGpESs097Zn7wSsVIPnoq+4pC9BzmPK01ITxA/mTgQSPj6uOxdbcxF9AUjpl0Wa46H7lAe/Bb1dYfDW2sUze+4nTuE1xKPIFeN+WKpz59dlPBvN1VKfP2H/5q1DvXN3uAp6oj5UDLHsyZmjZIy+92cYanBXW71FawUIsdEbHscoXV53RkkxwRgUxrYLdLFNft0laKI6orM0pzKo/EvJh57rUBFVe68slgyzeiGUUYrXM6yk1OHjux9/U3YQacpvEBqJlZQbwn3En3yryBkBH4024zQrDtBni3PZuqfHPmI3cZZA+r3++LyOJfru6x3k6K4GQxVAp55wZQfskThsrCpL1k0k3y7Lxc3MjIJvzQO1ijI40izCheYgwMWE5ZdKmHdudtDn7pyCXh6wmo4VbC3aUnsz197t0O5LjEvUdfCx61odvihnZMRgNawY7JNBFhLmv1uHX93+1dgmFStHr48r632kf6qA5N77x+qyl5iytaBbGLhKmZAorYKZ1BtileIaQNO+ZcIPnPSS5K2hWt3vHp/PXZSZVZ6j/u/HfO901GWmeecpO0XhKkLf7pLwgKSWtSwZMSWSK2kyLib+l8hcD3bgUga6fHHs4N/PzqIp/sRjlfoTgXOKIwfecn1gASMxXMinXQ/5ecr8DJqCe/ZZ9kUEduaN0+cc35W2cvdS1bJ3Y8TxOcufBGzJF/BSw9nPLyiS2V+TP3j26gCkVy2S8tFGKuJzoDBIOC1vzGOHNh50pC+0RWUNK252blp1pHvdYEZy54+PtfiCRjjCSRBBLXBGcufLHsqHbQvYLEjec/H156WuU+kk135gKEqniEHFToSMGXDnJOqVtnLjg7Hy7P12rqjx6KM1lZzBZrGClOZTiItYTtEYmMY/ipsm15O2rj1m+a3KHcuuuk2xnHUO40NVvlkKSEiUZ/CfjZ3kimag4MpZlbgTvXUZQcSfN3Pzjz/Lsxa1OVc46PfjhF/mUERBBc4W768KgVSesGQA4HhrFGAPIhK1LymCB9KBci92Q6I/PA6xmBCHMJCjsG4pu//PLCuEWfrExamXQfHf7S/UynJj9uNZEmP/uUx7kPAGOCwOjFhLK6yoqEdm/uTrK66PfOhPp0Yna2cwlKmB0OjxMnTs/tZWujP1ifXHHgr+lVibrlLeNwOECe8u5y5Enr0SLqsV71qbb3zbTXJpwFB+1PshAOECcT9Vx60rBpqerVn47/23ntrV/5tVkm/hcaNNuwx7OegDh3esgRByiV5iCOr84xDQJ+HtXnPIQxgrOtRakDQsQcDH5oCGSL/UBAnGL5f8tUfxKOTKp6fuwzKfMjghpSTfcAxRQ95ShW07Ne5fJo4UnSDQOrIj341mchc1W7n9Z8l+pzwrdZy+mMcUBljcPj9Tv9uYNjf69dPYsisarDsZOfd1Zr3ml7LWre8cee4BtLaRfBYcrj3TEHHIzlKWcvInQvI/CsqxaO/NZdta9OKspR02OJ77d58uuyI7E5TeiqFYfLuWrVnRrfVdve7nrtkgsZ8W9fzNjTZ/IPp1qIq1YWLieNMR1+H65aVaEm6NI/uqSue4645z8zr6TFuGq1HeTIU9zx9+WqzQu/HzYoLzl+h2XjxiPzerdrZlcN7SRHHKBUWoSrVq+jqzztqhl/vJp7JeTnpO1ZiwclYnd3N7Orlt1ZjmJIF4GrJpct8rir9kNi3+X66WfjNq+N6FdS/P30hrlqTmnKgfOubflEe14zP2O50vpz6d2G9hpA29FF1nZ0bTRPrsr3i/AN/dNS9w45M/FeIbWphXhydlsq6skBfcB6ch2Qlt970bG85yr13ceTt3zYaX1U7anEFtR7UX3TiqT1l+i9KKu8aR0AZpuk96KhJ40EcL0XHaU44rdUkAwbkWrWD8+Nffed7skVWLymUQqStaUgJuoudeB7zFomYvqvLUg2Rslse/+9uX/6eHHCwZr+D7pinYOboPjorL8b+s1CKZvTFD17u3w9k9NsguIj8ddv73xgGZVYldDp9clbrs5oguKjc07DA0gyCUhJJIF0ORUfGwPJtO1Vkw9uW5BamlGyTJlEhzVG8dEJydD9FRdPpFyKW/KRov2ld5dYPYAkkxiURBImBj19HrxzVb9Z65DZq1mxFD0PvnaFY3KrE/JbT2796fikKX89Ozp5S4DPs5UjRnRqouRWDExA95JKbiGHrIipb+Mntzr/Ycr19/OOTVoftCXzwqEjU1tAcguBBdpeUgFKDAhQ7vT6fSS39j6F7Pc7uinh9c/mvJrt99kbLSK5BclT0luOPIo+v6/kVlGsZpbupk7z7ve3z88N+7F7Mya3IHFq+sgRByiV/yW3NodXzF89vEvKfu3dWcvejN/UjMktSLHQfnIUK+/XvMmtZYWl1hPXQlLmt1lyvDz3hTc8mtxyzlY0tAfvKJthkLYd/RstueXsiLaA5BZ6wMGWCpJbJeWMPmA9uc5Iy09uOedCW1ByC71mRdAuEsktv8Br1p/6d/ltJLfCY/4f
- Contains a cluster of Grasshopper components
- 1
- 52051343-4c2e-4cec-8834-cf7d791277e2
- Cluster
- CD HumanUI Brand
- false
- 1
- 36faa049-12bc-4ae3-be34-287dcb30991c
- 04aa0292-e618-4acc-ba56-435dacfc66ed
-
6344
2986
236
140
-
6358
3056
- 0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Contains a collection of generic data
- 1
- 36faa049-12bc-4ae3-be34-287dcb30991c
- Data
- Powered by Ryan Computational Design
- false
- 0
-
6373
2988
205
136
-
6475.5
3056
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 8a3b9b0b-972a-4395-b217-e4822f988859
- Entwine
- Entwine
-
6626
2942
118
44
-
6671
2964
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- f037ad25-5e68-4a4b-a010-aab9aad88312
- false
- Branch {0;0}
- {0;0}
- true
- 233444af-38bc-41ef-9100-eacf3e0a5398
- 1
-
6628
2944
28
20
-
6643.5
2954
- 2
- Data to entwine
- f14cffc9-b801-4d30-9d8a-edc3b4b915b2
- false
- Branch {0;1}
- {0;1}
- true
- 36faa049-12bc-4ae3-be34-287dcb30991c
- 1
-
6628
2964
28
20
-
6643.5
2974
- Entwined result
- 59536bd8-7b87-4669-800a-b438fd9959e3
- 1
- Result
- Result
- false
- 0
-
6686
2944
56
40
-
6706
2964
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- 0c795ecb-824f-4ea9-b9d5-9a134f926409
- Adjust Element Positioning
- Adjust Element Positioning
-
6385
3337
142
144
-
6513
3409
- The UIElement you want to reposition.
- f98f0d9a-0bdf-4bb3-9a5a-c287c9f80326
- Elements to adjust
- Elements to adjust
- false
- 34c90063-22b8-4bd2-9edc-12d5d56e1096
- 1
-
6387
3339
111
20
-
6444
3349
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 5c8b9fc9-40c4-46c3-99db-519fedf5e4ad
- Margin
- Margin
- true
- 0
-
6387
3359
111
20
-
6444
3369
- Set to true to position relative to the upper left corner of the document
- acc6fd6b-1170-4d59-abc3-266fe833070e
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
6387
3379
111
20
-
6444
3389
- 1
- 1
- {0}
- false
- Override the element width
- 14077f64-07b1-42bd-88fe-6a32f7e8d6f9
- Width
- Width
- true
- 0
-
6387
3399
111
20
-
6444
3409
- Override the element height
- 77b3944d-ae82-40ce-afea-5acc222fc864
- Height
- Height
- true
- 0
-
6387
3419
111
20
-
6444
3429
- Horizontal alignment
- 5a2508ff-303f-443f-b252-17ff5e044abd
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
6387
3439
111
20
-
6444
3449
- 1
- 1
- {0}
- 1
- Vertical alignment
- 78b58f1f-cbd7-46c1-b7a8-cb8321eab6dd
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
6387
3459
111
20
-
6444
3469
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 17424a13-d5a2-4e02-a6e5-fddc629d6921
- Panel
- false
- 0
- 0
- Enter Map Information below to generate your Site Plan
-
945
3243
129
71
- 0
- 0
- 0
-
945.8313
3243.316
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 39a71a61-eab0-484c-bcbc-5033ff61d896
- Adjust Element Appearance
- Adjust Element Appearance
-
1425
3306
129
84
-
1540
3348
- The elements to adjust
- b03ce77d-a7cd-4b21-b4bb-47575c6321cf
- Elements to Adjust
- Elements to Adjust
- false
- 3f9b31a3-5047-4092-bad2-8a3a38c745b1
- 1
-
1427
3308
98
20
-
1477.5
3318
- The foreground color of the element
- 3a251bbf-2532-4378-8eae-6884231094a6
- Foreground
- Foreground
- true
- 0
-
1427
3328
98
20
-
1477.5
3338
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 2f255034-d6c1-4203-b901-3df74349e727
- Background
- Background
- true
- 0
-
1427
3348
98
20
-
1477.5
3358
- The font size of the element
- e8d255fd-ef79-4eb3-95c8-75ff3069a781
- Font Size
- Font Size
- true
- d25783f2-2851-44d0-a2ca-6f12518d6be0
- 1
-
1427
3368
98
20
-
1477.5
3378
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- d25783f2-2851-44d0-a2ca-6f12518d6be0
- Number Slider
- Number Slider
- false
- 0
-
1202
3370
203
20
-
1202.922
3370.636
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 7e96f075-ad7b-4d98-9ba2-8f5a0d177c55
- Create Text Block
- Create Text Block
-
1114
3260
157
64
-
1195
3292
- The text to display in the text block
- c4a31e74-cdb7-4cfd-abef-fdb6228f2449
- Text
- Text
- false
- 17424a13-d5a2-4e02-a6e5-fddc629d6921
- 1
-
1116
3262
64
20
-
1149.5
3272
- The size of the label to display
- 5aef2f0c-63ac-49fb-8715-339dbbe5e71b
- Text Size
- Text Size
- false
- 0
-
1116
3282
64
20
-
1149.5
3292
- 1
- 1
- {0}
- 12
- Text justification
- 2d6f709f-70c2-4126-939d-8fc395baedaf
- Justification
- Justification
- false
- 0
-
1116
3302
64
20
-
1149.5
3312
- 1
- 1
- {0}
- 0
- The created text block.
- 3f9b31a3-5047-4092-bad2-8a3a38c745b1
- Text Block
- Text Block
- false
- 0
-
1210
3262
59
60
-
1239.5
3292
- 30edb451-7870-4204-a6a3-e38745f42590
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Stack
- Creates a group of UI elements stacked vertically or horizontally.
- 93736fbf-e17c-49f4-aac5-babeab63ebb1
- Create Stack
- Create Stack
-
1713
3889
134
44
-
1794
3911
- 1
- The UI elements to group together
- 0d92b1c6-316e-4d07-8d79-a4756afe91d8
- UI Elements
- UI Elements
- false
- f0f32b5a-3751-4baa-8bd0-0ee8c95fd90d
- 1
-
1715
3891
64
20
-
1748.5
3901
- Set to true for horizontal arrangement; false for vertical.
- 468ad85b-7d76-4a45-b2f2-fc1985378f38
- Horizontal
- Horizontal
- false
- 0
-
1715
3911
64
20
-
1748.5
3921
- 1
- 1
- {0}
- true
- The combined group of elements
- f741d4f5-d028-4bf3-bdf8-26d214185a68
- Stack
- Stack
- false
- 0
-
1809
3891
36
40
-
1827
3911
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- f0986351-b1d8-4227-a173-bdd301e4e766
- Create Text Block
- Create Text Block
-
808
3854
157
64
-
889
3886
- The text to display in the text block
- 37fc1a8d-1960-4d08-af5b-7ecf61633865
- Text
- Text
- false
- 78ab9f31-de09-40a7-983e-f8903c429562
- 1
-
810
3856
64
20
-
843.5
3866
- The size of the label to display
- 02763100-847a-43e2-bb37-b9c4e3548391
- Text Size
- Text Size
- false
- 0
-
810
3876
64
20
-
843.5
3886
- 1
- 1
- {0}
- 16
- Text justification
- 44dc6465-86e9-4478-ad93-e396a674858c
- Justification
- Justification
- false
- 0
-
810
3896
64
20
-
843.5
3906
- 1
- 1
- {0}
- 0
- The created text block.
- ef281aa9-063f-41b5-89db-e8a39ec3b374
- Text Block
- Text Block
- false
- 0
-
904
3856
59
60
-
933.5
3886
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 78ab9f31-de09-40a7-983e-f8903c429562
- Panel
- false
- 0
- 0
- Site Plan Radius (ft)
-
648
3850
129
38
- 0
- 0
- 0
-
648.0654
3850.932
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 9cb56077-bc93-4464-9aa2-51d7d4707851
- Adjust Element Appearance
- Adjust Element Appearance
-
1221
3786
129
84
-
1336
3828
- The elements to adjust
- 0ec19f60-f089-4a16-89bf-33a749f8722f
- Elements to Adjust
- Elements to Adjust
- false
- ef281aa9-063f-41b5-89db-e8a39ec3b374
- 1
-
1223
3788
98
20
-
1273.5
3798
- The foreground color of the element
- e759abb6-3209-4aa3-88e5-ed93b5e198dc
- Foreground
- Foreground
- true
- 0
-
1223
3808
98
20
-
1273.5
3818
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 4e473687-16dc-4678-84d2-b1fb5540c443
- Background
- Background
- true
- 0
-
1223
3828
98
20
-
1273.5
3838
- The font size of the element
- 148967c4-e817-4995-afa1-0945ace04af4
- Font Size
- Font Size
- true
- 0
-
1223
3848
98
20
-
1273.5
3858
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 022b1b81-e7bb-4d7c-8d1f-d83db3845de0
- Entwine
- Entwine
-
1495
3869
118
64
-
1540
3901
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- b589d18c-f316-44cf-9207-f30490e1c69c
- false
- Branch {0;0}
- {0;0}
- true
- ef281aa9-063f-41b5-89db-e8a39ec3b374
- 1
-
1497
3871
28
20
-
1512.5
3881
- 2
- Data to entwine
- fdea9094-7a5c-4844-a24e-0baf1258330d
- false
- Branch {0;1}
- {0;1}
- true
- c9596c53-0fc2-4d87-af35-01977c6436b0
- 1
-
1497
3891
28
20
-
1512.5
3901
- 2
- Data to entwine
- 1b182945-9464-43ae-a8fc-a51bb7cb90f7
- false
- Branch {0;2}
- {0;2}
- true
- 36b92625-d0ac-4fed-ad98-1a2aed1129d7
- 1
-
1497
3911
28
20
-
1512.5
3921
- Entwined result
- f0f32b5a-3751-4baa-8bd0-0ee8c95fd90d
- 1
- Result
- Result
- false
- 0
-
1555
3871
56
60
-
1575
3901
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- 114ad891-940f-497e-b8b7-8e2467c15c38
- Adjust Element Positioning
- Adjust Element Positioning
-
1484
4118
142
144
-
1612
4190
- The UIElement you want to reposition.
- f46a30f2-7560-4419-a1bf-c269ab1b3c50
- Elements to adjust
- Elements to adjust
- false
- 36b92625-d0ac-4fed-ad98-1a2aed1129d7
- 1
-
1486
4120
111
20
-
1543
4130
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 59eb8c28-0ec2-4b12-bcf3-8e7548aa79ee
- Margin
- Margin
- true
- 0
-
1486
4140
111
20
-
1543
4150
- Set to true to position relative to the upper left corner of the document
- 00f3ad43-e6d1-4429-ae18-4bd7e7157382
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1486
4160
111
20
-
1543
4170
- 1
- 1
- {0}
- false
- Override the element width
- f3a79592-ac80-41d3-9188-eb7b504c8f38
- Width
- Width
- true
- 16a32c65-0673-4bad-b37c-9536d3b06097
- 1
-
1486
4180
111
20
-
1543
4190
- Override the element height
- cbb7c41e-8acd-435f-8d76-c66c99f23665
- Height
- Height
- true
- 0
-
1486
4200
111
20
-
1543
4210
- Horizontal alignment
- de3c769e-d939-4687-beb8-89deaaea2e3b
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1486
4220
111
20
-
1543
4230
- Vertical alignment
- f2823f21-5be6-434f-aff8-f382d7861971
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1486
4240
111
20
-
1543
4250
- 1
- 1
- {0}
- 2
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 16a32c65-0673-4bad-b37c-9536d3b06097
- Number Slider
- Number Slider
- false
- 0
-
1258
4182
203
20
-
1258.772
4182.787
- 3
- 1
- 1
- 1000
- 0
- 0
- 100
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- e7b88f2f-6502-4f6c-8490-ee3c41463da2
- Create Text Box
- Create Text Box
- true
-
781
4101
163
64
-
876
4133
- Optional label for the Text Box
- 5ed4fa48-93b7-4a74-aa25-90308af4af7b
- Label
- Label
- false
- 0
-
783
4103
78
20
-
823.5
4113
- 1
- 1
- {0}
- false
- The starting text in the text box
- b8fa5347-4c34-4230-a661-ea8a06d241c5
- Default Text
- Default Text
- false
- 0
-
783
4123
78
20
-
823.5
4133
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- 1995fb3e-8eba-4d5c-990b-8a9bd43ca174
- Update Button
- Update Button
- false
- 0
-
783
4143
78
20
-
823.5
4153
- 1
- 1
- {0}
- true
- The created text box.
- 36b92625-d0ac-4fed-ad98-1a2aed1129d7
- Text Box
- Text Box
- false
- 0
-
891
4103
51
60
-
916.5
4133
- b412d7d3-02e2-4a8e-bdcc-2e1f8b2a8834
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Slider
- Modify the range and value of a slider.
- f3ba993f-d7d0-411f-97b1-aaee3fc54323
- Set Slider
- Set Slider
-
1330
3990
79
64
-
1395
4022
- The UI Slider to update
- 98f2ba68-a938-44e4-8d63-a4b6d79a6500
- UI Slider
- UI Slider
- false
- c9596c53-0fc2-4d87-af35-01977c6436b0
- 1
-
1332
3992
48
20
-
1357.5
4002
- The value to set the slider to
- e04938ae-922b-42c9-96d5-52cd1de5ac19
- Value
- Value
- true
- 774ed72b-a198-40cf-8459-ebd459f3bb41
- 1
-
1332
4012
48
20
-
1357.5
4022
- the new slider range
- ea9b64bf-5f75-45c5-9319-89b9649c72a9
- Range
- Range
- true
- 84e10d1c-d3c2-41f7-ac9b-142e58598f43
- 1
-
1332
4032
48
20
-
1357.5
4042
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- c5de93b4-1cc0-4241-895e-5add85af429b
- 4d49c03a-c22d-402b-8f03-20a4ca2c523b
- a8080f78-48c1-41a8-bb07-6b1b78458f04
- 697e7063-b680-4977-a4b5-967f16fe8b32
- 8bc51f74-1030-44b7-a69f-5150e1a79ddc
- db566e1d-2823-4fa8-9fe9-cd41b41d570c
- 93736fbf-e17c-49f4-aac5-babeab63ebb1
- f0986351-b1d8-4227-a173-bdd301e4e766
- 78ab9f31-de09-40a7-983e-f8903c429562
- 9cb56077-bc93-4464-9aa2-51d7d4707851
- 022b1b81-e7bb-4d7c-8d1f-d83db3845de0
- 114ad891-940f-497e-b8b7-8e2467c15c38
- 16a32c65-0673-4bad-b37c-9536d3b06097
- e7b88f2f-6502-4f6c-8490-ee3c41463da2
- f3ba993f-d7d0-411f-97b1-aaee3fc54323
- 439edf67-b398-4de7-948e-b6a72e485248
- 3eaeef40-fd3e-4074-bc65-e46182a26b9a
- 53dd1ba3-f626-435e-8508-eb00bd30879f
- ed5800a8-5949-497c-9bf5-1c0b115cc367
- cff18f19-362d-444a-88ae-82d7868a22e6
- 7ed8c8f2-eebb-4835-ba1f-c30b16723283
- 6aae5d75-875f-4765-b02d-daf172ff7324
- cde60695-3ca2-465a-b7fb-b4a205f6b713
- 750da1ab-4f8a-4c0a-8b3c-c5cfb8868afc
- 5d066976-6483-4fa8-be9a-f955bbf470a9
- 258b5b32-58e4-4125-8b3a-16ecc082d9cb
- 26
- 1358b0ac-c562-439c-8762-e2cee908055d
- Group
- Site Radius
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 6482b193-a6df-4c2c-b680-f24723ddb984
- Panel
- false
- 0
- 0
- SRTMGL1
AW3D30
-
665
4459
164
71
- 0
- 0
- 0
-
665.7637
4459.716
-
255;255;250;90
- true
- true
- false
- false
- false
- true
- Courier New
- 8
- 2dddb05e-5503-4506-8f9e-5c0f4c35f8b0
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create List Box
- Creates a list box from which items can be selected.
- b7aff527-a468-4542-8fa0-c1da1a4ce63d
- Create List Box
- Create List Box
-
856
4480
158
64
-
950
4512
- 1
- The initial list of options to display in the list.
- 76731b65-1be6-4035-9e27-941aa8365552
- List Items
- List Items
- false
- 6482b193-a6df-4c2c-b680-f24723ddb984
- 1
-
858
4482
77
20
-
898
4492
- The initially selected index. Defaults to the first item.
- 119b8708-89e3-468b-ba44-e73556368676
- Selected Index
- Selected Index
- false
- 0
-
858
4502
77
20
-
898
4512
- 1
- 1
- {0}
- 0
- List box height in pixels.
- e91e50d5-d9cf-4276-b4b9-6ce0151b6ee2
- Height
- Height
- false
- 0
-
858
4522
77
20
-
898
4532
- 1
- 1
- {0}
- 100
- The list box object
- c369d8ce-20fb-4eef-8771-13103425762c
- List Box
- List Box
- false
- 0
-
965
4482
47
60
-
988.5
4512
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- 17dd218c-5938-4e7f-a1ae-ce2e5a492d92
- Adjust Element Positioning
- Adjust Element Positioning
-
1459
4458
142
144
-
1587
4530
- The UIElement you want to reposition.
- 81db6c52-421e-4859-940f-3e8ace133a19
- Elements to adjust
- Elements to adjust
- false
- c369d8ce-20fb-4eef-8771-13103425762c
- 1
-
1461
4460
111
20
-
1518
4470
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 24510e63-7de1-496e-b9f9-1584cdce54fb
- Margin
- Margin
- true
- 0
-
1461
4480
111
20
-
1518
4490
- Set to true to position relative to the upper left corner of the document
- 83e85fdb-415f-40cb-9776-12692edd8d0a
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1461
4500
111
20
-
1518
4510
- 1
- 1
- {0}
- false
- Override the element width
- b2b65d64-1fae-4216-9035-85a9f30eb5e0
- Width
- Width
- true
- 0
-
1461
4520
111
20
-
1518
4530
- Override the element height
- 454e7369-2ba2-4259-9399-447d65345d76
- Height
- Height
- true
- e5cd3b44-57e4-4fdb-8466-d8b1ae433336
- 1
-
1461
4540
111
20
-
1518
4550
- Horizontal alignment
- f6e06e4b-4a79-46c2-ab01-3e2a7c28d139
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1461
4560
111
20
-
1518
4570
- Vertical alignment
- 2130f2fa-8f90-4f0f-bcda-36cbfd03f89f
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1461
4580
111
20
-
1518
4590
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- e5cd3b44-57e4-4fdb-8466-d8b1ae433336
- Number Slider
- Number Slider
- false
- 0
-
1240
4545
203
20
-
1240.25
4545.156
- 3
- 1
- 1
- 100
- 0
- 0
- 55
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 5dd25ff1-2ecd-4f02-9858-c57f1a6d0dbd
- Entwine
- Entwine
-
1927
4385
118
84
-
1972
4427
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- cba15b9b-9bdc-455a-90c8-503f0fbe0b6a
- false
- Branch {0;0}
- {0;0}
- true
- 42f14821-1601-42a4-a9b2-41df06fae6ed
- 1
-
1929
4387
28
20
-
1944.5
4397
- 2
- Data to entwine
- c65bd778-3aa1-4ecc-b912-fd3bb68c0d26
- false
- Branch {0;1}
- {0;1}
- true
- c369d8ce-20fb-4eef-8771-13103425762c
- 1
-
1929
4407
28
20
-
1944.5
4417
- 2
- Data to entwine
- 5881bc6f-4fe0-41c2-8488-c41c4bd2e960
- false
- Branch {0;2}
- {0;2}
- true
- 7fc02f9a-e2d9-4b2c-ad61-924dd74ce2a5
- 1
-
1929
4427
28
20
-
1944.5
4437
- 2
- Data to entwine
- cfa57b36-9d9f-42d5-8eba-bb5b1bc383c9
- false
- Branch {0;3}
- {0;3}
- true
- 699718aa-7933-4c6d-8370-224559b18bfd
- 1
-
1929
4447
28
20
-
1944.5
4457
- Entwined result
- 6aa73273-d57b-4af2-b5af-f1b02d7ab7f1
- 1
- Result
- Result
- false
- 0
-
1987
4387
56
80
-
2007
4427
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 30f6eca8-c034-49d9-ae89-83c40ca47f8e
- Panel
- false
- 0
- 0
-
Choose Terrain Source:
-
691
4332
129
71
- 0
- 0
- 0
-
691.7021
4332.223
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 84c2fe92-81cb-439c-aa24-4ea9698bcdcf
- Adjust Element Appearance
- Adjust Element Appearance
-
1450
4351
129
84
-
1565
4393
- The elements to adjust
- ab013dbd-f66a-4fec-9fd4-16741739e0f6
- Elements to Adjust
- Elements to Adjust
- false
- 42f14821-1601-42a4-a9b2-41df06fae6ed
- 1
-
1452
4353
98
20
-
1502.5
4363
- The foreground color of the element
- cf09e0c6-a791-4c04-ae1c-3db5f3e96872
- Foreground
- Foreground
- true
- 0
-
1452
4373
98
20
-
1502.5
4383
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 20a75c68-b8ee-4fcb-9266-d8e261f0f7c4
- Background
- Background
- true
- 0
-
1452
4393
98
20
-
1502.5
4403
- The font size of the element
- bc7a35b4-6f08-4a74-adc1-327979d25db5
- Font Size
- Font Size
- true
- 3fb6cc1c-7528-4265-811e-2c3b3e4100e0
- 1
-
1452
4413
98
20
-
1502.5
4423
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 3fb6cc1c-7528-4265-811e-2c3b3e4100e0
- Number Slider
- Number Slider
- false
- 0
-
1061
4419
203
20
-
1061.792
4419.939
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 6842b5c9-543b-4ce4-abb6-8e3c43c4d4e6
- Create Text Block
- Create Text Block
-
860
4348
157
64
-
941
4380
- The text to display in the text block
- adb9e743-d402-498c-a9c4-70ee5ff39590
- Text
- Text
- false
- 30f6eca8-c034-49d9-ae89-83c40ca47f8e
- 1
-
862
4350
64
20
-
895.5
4360
- The size of the label to display
- fe6992e8-71f2-46c1-be3f-ee280e108845
- Text Size
- Text Size
- false
- 0
-
862
4370
64
20
-
895.5
4380
- 1
- 1
- {0}
- 12
- Text justification
- 91ec9249-de9c-417e-966a-328707b950bd
- Justification
- Justification
- false
- 0
-
862
4390
64
20
-
895.5
4400
- 1
- 1
- {0}
- 0
- The created text block.
- 42f14821-1601-42a4-a9b2-41df06fae6ed
- Text Block
- Text Block
- false
- 0
-
956
4350
59
60
-
985.5
4380
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- a868e87a-9158-47e2-8d9b-5c5fca8161d9
- Adjust Element Appearance
- Adjust Element Appearance
-
1482
4812
129
84
-
1597
4854
- The elements to adjust
- d50b64c8-e3f7-4f64-a600-730f959c79b2
- Elements to Adjust
- Elements to Adjust
- false
- 7fc02f9a-e2d9-4b2c-ad61-924dd74ce2a5
- 1
-
1484
4814
98
20
-
1534.5
4824
- The foreground color of the element
- 7743acf7-d15d-4987-b763-d509cd581a03
- Foreground
- Foreground
- true
- 0
-
1484
4834
98
20
-
1534.5
4844
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 4391c132-9253-49e4-911b-09563843ff25
- Background
- Background
- true
- 0
-
1484
4854
98
20
-
1534.5
4864
- The font size of the element
- 35dce4a0-4a0e-4fce-ab7f-bdf9783463b3
- Font Size
- Font Size
- true
- fce8d754-3331-4e65-92ee-0c97d9067f14
- 1
-
1484
4874
98
20
-
1534.5
4884
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- fce8d754-3331-4e65-92ee-0c97d9067f14
- Number Slider
- Number Slider
- false
- 0
-
1253
4877
203
20
-
1253.61
4877.15
- 3
- 1
- 1
- 100
- 0
- 0
- 14
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
- Contains a collection of generic data
- 1
- 0317a295-0589-41f5-bb44-539f9ce8d183
- Data
- Terrain Source
- false
- 9fafc177-9167-474f-b2a1-3a6d02e2445f
- 1
- 2
-
9635
1077
83
20
-
9677.454
1087.895
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 04de01fd-bcf6-43df-8246-db4bd077cb70
- Panel
- false
- 0
- 0
- Click for detailed Terrain Source Description
-
677
4955
175
41
- 0
- 0
- 0
-
677.9912
4955.337
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 0ca4d832-d1ce-46a5-ae2d-8609edbfde40
- Value Listener
- Value Listener
- true
-
1071
4989
152
44
-
1162
5011
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 11bb34f9-f1ea-4a20-8b51-824034b99b20
- Elements
- Elements
- false
- 699718aa-7933-4c6d-8370-224559b18bfd
- 1
-
1073
4991
74
20
-
1111.5
5001
- 1
- The optional filter(s) for the elements you want to listen for.
- 60640f6d-2fdb-4f77-914e-b269f4071e33
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1073
5011
74
20
-
1111.5
5021
- 2
- The values of the listened elements
- daa9e006-53ae-4407-8854-e2393f9a06a6
- Values
- Values
- false
- 0
-
1177
4991
44
20
-
1199
5001
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- 5298e7f1-b0b0-4b20-a4b7-7d38c112eefc
- Indices
- Indices
- false
- 0
-
1177
5011
44
20
-
1199
5021
- 0a6b8a40-57a4-4d8d-9f09-f34869655d1e
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Launch Window
- 0
- This component launches a new blank control window.
- false
- 44769857-46e6-49d3-b3da-101fd2d8d124
- Launch Window
- Launch Window
-
1340
5084
182
104
-
1420
5136
- Set this boolean to true to display the control window.
- ecfe72c2-b020-471c-b8d1-d6cd605af414
- Show
- Show
- false
- daa9e006-53ae-4407-8854-e2393f9a06a6
- 1
-
1342
5086
63
20
-
1375
5096
- The name of the window to display.
- fdaf8d9a-c977-4dc6-aaff-d91a30ccd6a4
- Name
- Name
- false
- fb9ed623-3321-428e-aaf2-cc2abdad71cc
- 1
-
1342
5106
63
20
-
1375
5116
- 1
- 1
- {0}
- false
- Control Window
- Starting Width of the window.
- 75129aec-75d0-498e-bcb6-ead57f606bea
- Width
- Width
- false
- 462db731-2d4c-4b4a-b8a5-a5cfec18099e
- 1
-
1342
5126
63
20
-
1375
5136
- 1
- 1
- {0}
- 370
- Starting Height of the window.
- f6b4e177-f6e1-40e2-b5c3-df3e8fd54804
- Height
- Height
- false
- fe564f9a-593d-4057-9128-9015c0b85678
- 1
-
1342
5146
63
20
-
1375
5156
- 1
- 1
- {0}
- 400
- Optional Font family for UI elements in this window.
- e5f1f002-1836-43e0-8777-9450354da645
- Font Family
- Font Family
- true
- 50fec15e-f2e6-4b4f-bcbd-62f91a16863e
- 1
-
1342
5166
63
20
-
1375
5176
- The window object. Other components can access this to add controls or gather data from the window.
- a270fadd-5259-4dbb-a44f-3208732aa449
- Window Object
- Window Object
- false
- 0
-
1435
5086
85
100
-
1477.5
5136
- 5ab78609-c132-45c7-ba44-200a4f2e4188
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create True-Only Button
- 0
- Create a True only Button object.
- 3397945a-222b-4366-8e92-90210b9bf986
- Create True-Only Button
- Create True-Only Button
-
880
4960
149
44
-
969
4982
- The text to display on the button
- e2383e77-bc56-4d1d-8df1-861bc99a4cc1
- Button Name
- Button Name
- true
- 04de01fd-bcf6-43df-8246-db4bd077cb70
- 1
-
882
4962
72
20
-
919.5
4972
- The image to display on the button.
- bafc0465-e0f0-4464-889e-7e03c795b5f0
- Image Path
- Image Path
- true
- 0
-
882
4982
72
20
-
919.5
4992
- The created Button
- 699718aa-7933-4c6d-8370-224559b18bfd
- Button
- Button
- false
- 0
-
984
4962
43
40
-
1005.5
4982
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- fb9ed623-3321-428e-aaf2-cc2abdad71cc
- Panel
- false
- 0
- 0
- Terrain Source Information
-
1065
5094
194
38
- 0
- 0
- 0
-
1065.979
5094.989
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 462db731-2d4c-4b4a-b8a5-a5cfec18099e
- Number Slider
- Number Slider
- false
- 0
-
1017
5163
203
20
-
1017.279
5163.488
- 3
- 1
- 1
- 1000
- 0
- 0
- 500
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- fe564f9a-593d-4057-9128-9015c0b85678
- Number Slider
- Number Slider
- false
- 0
-
1018
5187
203
20
-
1018.779
5187.938
- 3
- 1
- 1
- 1000
- 0
- 0
- 700
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 50fec15e-f2e6-4b4f-bcbd-62f91a16863e
- Panel
- false
- 0
- 0
- Montserrat
-
1148
5219
89
38
- 0
- 0
- 0
-
1148.006
5219.269
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 14a1ee78-6536-43b2-b6d8-4b26a736f0a9
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Window Properties
- Modify various properties of a Window.
- 4337fc01-cef4-4b84-a01f-c12d680d330c
- Set Window Properties
- Set Window Properties
-
1582
5074
125
144
-
1693
5146
- The window to modify
- 96c56cc7-481b-4146-99d0-c36b95c53692
- Window
- Window
- false
- a270fadd-5259-4dbb-a44f-3208732aa449
- 1
-
1584
5076
94
20
-
1632.5
5086
- The point (screen coordinates, so 0,0 is upper left)
at which to locate the window's upper left corner.
- 887b7652-5668-480f-b184-d85b49d43f26
- Starting Location
- Starting Location
- true
- 0
-
1584
5096
94
20
-
1632.5
5106
- The base theme for the window.
- ef2c4ae2-b26a-41f1-827d-ac13e0c02823
- Theme
- Theme
- true
- 0
-
1584
5116
94
20
-
1632.5
5126
- The color accent for the window. Use the component
menu item "Create Accent List" so you don't have to guess
- e8873fd3-9671-45a7-be94-51d84591ee7a
- Accent Color
- Accent Color
- true
- 5382e57b-665f-40fa-be70-208ba25dd8c8
- 1
-
1584
5136
94
20
-
1632.5
5146
- Set to false to hide the window's title bar.
- 807072a7-f330-463e-986b-5882bd026b9d
- Show Title Bar
- Show Title Bar
- true
- 0
-
1584
5156
94
20
-
1632.5
5166
- 1
- 1
- {0}
- true
- Set the background color of the window.
- a6f6969b-8f96-4b35-a330-73190942b617
- Background Color
- Background Color
- true
- 0
-
1584
5176
94
20
-
1632.5
5186
- An absolute scaling factor used to modify the size of the window.
- 2bf42103-064f-43bf-b961-e4a1e438fd3c
- Scale Factor
- Scale Factor
- false
- 0
-
1584
5196
94
20
-
1632.5
5206
- 1
- 1
- {0}
- 1
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
- Provides a list of preset values to choose from
- 5382e57b-665f-40fa-be70-208ba25dd8c8
- 23
- 1
- Value List
- Accent Colors
- false
- 0
- "Amber"
- Amber
- false
- "Blue"
- Blue
- false
- "Brown"
- Brown
- false
- "Cobalt"
- Cobalt
- false
- "Crimson"
- Crimson
- false
- "Cyan"
- Cyan
- false
- "Emerald"
- Emerald
- false
- "Green"
- Green
- true
- "Indigo"
- Indigo
- false
- "Lime"
- Lime
- false
- "Magenta"
- Magenta
- false
- "Mauve"
- Mauve
- false
- "Olive"
- Olive
- false
- "Orange"
- Orange
- false
- "Pink"
- Pink
- false
- "Purple"
- Purple
- false
- "Red"
- Red
- false
- "Sienna"
- Sienna
- false
- "Steel"
- Steel
- false
- "Taupe"
- Taupe
- false
- "Teal"
- Teal
- false
- "Violet"
- Violet
- false
- "Yellow"
- Yellow
- false
-
1363
5019
160
22
-
1444
5019
- 73b5e187-b35d-45bd-8495-9e06b429bc07
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Add Elements
- Add WPF Controls to a window
- true
- c14bb69b-b308-44e7-a2da-d36015ce4cb2
- Add Elements
- Add Elements
-
1545
5254
190
44
-
1629
5276
- The window to which to add the elements
- 7e61675a-97bb-454c-8782-096b19110dc0
- Window
- Window
- false
- a270fadd-5259-4dbb-a44f-3208732aa449
- 1
-
1547
5256
67
20
-
1590
5266
- 1
- The Controls and other elements you want to add to the window
- c979ce5a-c03f-4879-b02a-436051239efe
- 1
- Elements
- Elements
- false
- bb02f9bb-9225-4a6a-924e-3c38db256aea
- 1
-
1547
5276
67
20
-
1590
5286
- 1
- The elements added.
- ff387e67-fa84-474c-ae2f-2655bee47df5
- Added Elements
- Added Elements
- false
- 0
-
1644
5256
89
20
-
1688.5
5266
- 1
- The names of the added elements.
- 049a1651-898b-4abb-b361-81abc52765c4
- Element Names
- Element Names
- false
- 0
-
1644
5276
89
20
-
1688.5
5286
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 19b43f70-6377-44b9-80d8-24773ecd52e5
- Entwine
- Entwine
-
1118
5387
102
124
-
1163
5449
- 6
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 53f063cf-04cd-41c9-94a8-9a98e1d0d97a
- false
- Branch {0;0}
- {0;0}
- true
- 16322ba8-c186-461a-ad0a-7bb818069bba
- 1
-
1120
5389
28
20
-
1135.5
5399
- 2
- Data to entwine
- f04e4a0a-7c5c-4e1d-87f9-3624187ed3b1
- false
- Branch {0;1}
- {0;1}
- true
- 6147d4ed-0597-4a23-9332-8e12f707b9d2
- 1
-
1120
5409
28
20
-
1135.5
5419
- 2
- Data to entwine
- 411ace78-90c4-4025-a35b-b33a76ec1c70
- false
- Branch {0;2}
- {0;2}
- true
- 02afbc50-801d-49c7-91a2-c731147f4c71
- 1
-
1120
5429
28
20
-
1135.5
5439
- 2
- Data to entwine
- 2a51ed36-5f3c-4dd0-b4aa-b1e37b9eeaa8
- false
- Branch {0;3}
- {0;3}
- true
- 9162c252-2bcc-4c7f-b814-fb21586f5430
- 1
-
1120
5449
28
20
-
1135.5
5459
- 2
- Data to entwine
- 61179f5e-05ef-4aee-b487-ea9b59bea4b2
- false
- Branch {0;4}
- {0;4}
- true
- 8f283f99-5a18-4b8f-af49-41e7c98436b1
- 1
-
1120
5469
28
20
-
1135.5
5479
- 2
- Data to entwine
- 47d47a65-806b-4965-9621-e3f56d9094f6
- false
- Branch {0;5}
- {0;5}
- true
- 73c1f767-0553-43ca-a04c-3e60b1ed9d21
- 1
-
1120
5489
28
20
-
1135.5
5499
- Entwined result
- bb02f9bb-9225-4a6a-924e-3c38db256aea
- Result
- Result
- false
- 0
-
1178
5389
40
120
-
1198
5449
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 4aa5804f-3f99-47fb-bca3-9ba1f57e7d28
- Panel
- false
- 0
- 0
-
SRTMGL1
-
657
5325
69
38
- 0
- 0
- 0
-
657.8857
5325.666
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- f4d6464a-e027-439d-b9cc-dd45f322eb92
- Create Label
- Create Label
-
781
5329
134
64
-
862
5361
- The text to display in the label
- 724233d4-1ee8-432e-94ab-ff935d5ef75c
- Label Text
- Label Text
- false
- 4aa5804f-3f99-47fb-bca3-9ba1f57e7d28
- 1
-
783
5331
64
20
-
816.5
5341
- The size of the label to display
- a32b40b5-63a9-4103-8aea-4a41229b4838
- Label Size
- Label Size
- false
- 0
-
783
5351
64
20
-
816.5
5361
- 1
- 1
- {0}
- 24
- Text justification
- 73f6aa6f-94ec-4bfc-85d5-d59eb9d33364
- Justification
- Justification
- false
- 0
-
783
5371
64
20
-
816.5
5381
- 1
- 1
- {0}
- 0
- The created labels.
- 02afbc50-801d-49c7-91a2-c731147f4c71
- Label
- Label
- false
- 0
-
877
5331
36
60
-
895
5361
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- a3f475d6-e7fd-4dfd-a161-fdb213c05972
- Panel
- false
- 0
- 0
-
AW3D30
-
649
5521
69
38
- 0
- 0
- 0
-
649.8047
5521.392
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- d5e864d5-2bd9-45f8-bdec-a5e86ad3e656
- Create Label
- Create Label
-
775
5525
134
64
-
856
5557
- The text to display in the label
- 9b2fc1f9-e198-47a7-ba7d-509452c6a24a
- Label Text
- Label Text
- false
- a3f475d6-e7fd-4dfd-a161-fdb213c05972
- 1
-
777
5527
64
20
-
810.5
5537
- The size of the label to display
- 7a569c17-26bd-4c87-8fb5-b146e5f1a13f
- Label Size
- Label Size
- false
- 0
-
777
5547
64
20
-
810.5
5557
- 1
- 1
- {0}
- 24
- Text justification
- 02d98b95-1ae2-485a-a9db-8faaf90bd4d7
- Justification
- Justification
- false
- 0
-
777
5567
64
20
-
810.5
5577
- 1
- 1
- {0}
- 0
- The created labels.
- 8f283f99-5a18-4b8f-af49-41e7c98436b1
- Label
- Label
- false
- 0
-
871
5527
36
60
-
889
5557
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 020e7d2b-7fd0-4990-b12a-e70cc283faa6
- Create Text Block
- Create Text Block
-
764
5418
157
64
-
845
5450
- The text to display in the text block
- 1f8184f2-7505-46d4-9c2d-5644c16d95b7
- Text
- Text
- false
- fb2cbd01-dd41-47fe-a420-2d64090d5aa5
- 1
-
766
5420
64
20
-
799.5
5430
- The size of the label to display
- af4d044e-5a77-4b0b-9e67-0b1eb0d0f99e
- Text Size
- Text Size
- false
- 0
-
766
5440
64
20
-
799.5
5450
- 1
- 1
- {0}
- 12
- Text justification
- c1b2d391-44e0-4a7c-b60d-f962679090ed
- Justification
- Justification
- false
- 0
-
766
5460
64
20
-
799.5
5470
- 1
- 1
- {0}
- 0
- The created text block.
- 9162c252-2bcc-4c7f-b814-fb21586f5430
- Text Block
- Text Block
- false
- 0
-
860
5420
59
60
-
889.5
5450
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- fb2cbd01-dd41-47fe-a420-2d64090d5aa5
- Panel
- false
- 0
- 0
- The SRTM data is the current dataset of choice for digital elevation model (DEM) data since it has a fairly high resolution (1 arc-second, or around 25 meters), has near-global coverage (from 56°S to 60°N), and is in the public domain.
The Shuttle Radar Topography Mission (SRTM) is an international research effort that obtained digital elevation models on a near-global scale from 56°S to 60°N, to generate the most complete high-resolution digital topographic database of Earth prior to the release of the ASTER GDEM in 2009.
The elevation models are arranged into tiles, each covering one degree of latitude and one degree of longitude, named according to their south western corners. For example, "n45e006" stretches from 45°N 6°E to 46°N 7°E and "s45w006" from 45°S 6°W to 44°S 5°W. The resolution of the raw data is one arcsecond (30 m along the equator) and coverage includes Africa, Europe, North America, South America, Asia, and Australia.
-
577
5384
160
100
- 0
- 0
- 0
-
577.1357
5384.315
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 0b4aa3dc-8395-4d1b-9a7d-7f0fc75f7aa9
- Panel
- false
- 0
- 0
- Which Terrain Source should I use?
-
657
5141
69
38
- 0
- 0
- 0
-
657.041
5141.976
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- 89e3d31d-1a75-4451-99b2-6158ad63b962
- Create Label
- Create Label
-
781
5145
134
64
-
862
5177
- The text to display in the label
- 0b52e288-0677-4463-8bcc-581297184232
- Label Text
- Label Text
- false
- 0b4aa3dc-8395-4d1b-9a7d-7f0fc75f7aa9
- 1
-
783
5147
64
20
-
816.5
5157
- The size of the label to display
- 22ce1ab8-43f3-45c3-926f-b865ad625542
- Label Size
- Label Size
- false
- 0
-
783
5167
64
20
-
816.5
5177
- 1
- 1
- {0}
- 24
- Text justification
- ff3e72f6-24c8-4c7e-b213-ad8e78e650f7
- Justification
- Justification
- false
- 0
-
783
5187
64
20
-
816.5
5197
- 1
- 1
- {0}
- 0
- The created labels.
- 16322ba8-c186-461a-ad0a-7bb818069bba
- Label
- Label
- false
- 0
-
877
5147
36
60
-
895
5177
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 82270711-21b2-4aa7-b05c-ae5c43ee9f56
- Create Text Block
- Create Text Block
-
764
5234
157
64
-
845
5266
- The text to display in the text block
- 5c00bd7b-f55a-4a45-b330-2490fef923a3
- Text
- Text
- false
- 638b1197-912f-4d5d-959f-8ce35b128fef
- 1
-
766
5236
64
20
-
799.5
5246
- The size of the label to display
- f0fabaa8-2a9e-4faa-9c4a-a84abd8795bd
- Text Size
- Text Size
- false
- 0
-
766
5256
64
20
-
799.5
5266
- 1
- 1
- {0}
- 12
- Text justification
- a3ee8820-6cb5-43ba-ad26-ed0bb30757bc
- Justification
- Justification
- false
- 0
-
766
5276
64
20
-
799.5
5286
- 1
- 1
- {0}
- 0
- The created text block.
- 6147d4ed-0597-4a23-9332-8e12f707b9d2
- Text Block
- Text Block
- false
- 0
-
860
5236
59
60
-
889.5
5266
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 638b1197-912f-4d5d-959f-8ce35b128fef
- Panel
- false
- 0
- 0
- Both terrain sources provide medium-to-low level of detail. It is recommended that you examine both data sets to see which best represents your site. This tool is not intended as a replacement for a site survey.
-
567
5199
160
100
- 0
- 0
- 0
-
567.6914
5199.625
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 5404ca5a-4ba6-4cff-8142-b03ca1732aba
- Create Text Block
- Create Text Block
-
756
5623
157
64
-
837
5655
- The text to display in the text block
- ac2f754c-8e90-4de3-aebb-d81a607ff755
- Text
- Text
- false
- f2438c92-392f-4aa0-9d59-8c897bf83a19
- 1
-
758
5625
64
20
-
791.5
5635
- The size of the label to display
- 9880ca7f-6ef1-4bbd-bf77-0cc0b12186e8
- Text Size
- Text Size
- false
- 0
-
758
5645
64
20
-
791.5
5655
- 1
- 1
- {0}
- 12
- Text justification
- 2e6308e1-88bd-4634-87c7-97ae00116363
- Justification
- Justification
- false
- 0
-
758
5665
64
20
-
791.5
5675
- 1
- 1
- {0}
- 0
- The created text block.
- 73c1f767-0553-43ca-a04c-3e60b1ed9d21
- Text Block
- Text Block
- false
- 0
-
852
5625
59
60
-
881.5
5655
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- f2438c92-392f-4aa0-9d59-8c897bf83a19
- Panel
- false
- 0
- 0
- The ALOS Global Digital Surface Model "ALOS World 3D - 30m" (AW3D30) is the dataset with a horizontal resolution of approximately 30-meter mesh (1 arcsec), provided by Japan Aerospace Exploration Agency (JAXA) for free. The dataset has been compiled with images acquired by the Advanced Land Observing Satellite "DAICHI" (ALOS).
The [AW3D30] dataset is published based on the commercial DSM dataset (5-meter mesh version) of the "World 3D Topographic Data", which is the most precise global-scale elevation data at this time, and its elevation precision is also at a world-leading level as a 30-meter mesh version. The positive difference in detail level is clearly visible even in simple visual comparison with SRTM 1-arcsecond data with similar pixel size.
-
569
5589
160
100
- 0
- 0
- 0
-
569.2852
5589.815
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 61ea44d6-08fd-4124-b73f-a64739852bb0
- b142a454-42a2-434f-836e-a7ba271be63d
- 508100ce-ed3a-41f0-be49-895ba2c70286
- 6837b896-aab4-41ad-8bd4-92f882855816
- 134a58ee-3414-4d69-998b-967e1fe161d7
- 98f997b1-ba86-4717-893d-a2d0d8894a8c
- 6482b193-a6df-4c2c-b680-f24723ddb984
- b7aff527-a468-4542-8fa0-c1da1a4ce63d
- 17dd218c-5938-4e7f-a1ae-ce2e5a492d92
- e5cd3b44-57e4-4fdb-8466-d8b1ae433336
- 5dd25ff1-2ecd-4f02-9858-c57f1a6d0dbd
- 30f6eca8-c034-49d9-ae89-83c40ca47f8e
- 84c2fe92-81cb-439c-aa24-4ea9698bcdcf
- 3fb6cc1c-7528-4265-811e-2c3b3e4100e0
- 6842b5c9-543b-4ce4-abb6-8e3c43c4d4e6
- a868e87a-9158-47e2-8d9b-5c5fca8161d9
- fce8d754-3331-4e65-92ee-0c97d9067f14
- 04de01fd-bcf6-43df-8246-db4bd077cb70
- 0ca4d832-d1ce-46a5-ae2d-8609edbfde40
- 44769857-46e6-49d3-b3da-101fd2d8d124
- 3397945a-222b-4366-8e92-90210b9bf986
- fb9ed623-3321-428e-aaf2-cc2abdad71cc
- 462db731-2d4c-4b4a-b8a5-a5cfec18099e
- fe564f9a-593d-4057-9128-9015c0b85678
- 50fec15e-f2e6-4b4f-bcbd-62f91a16863e
- 4337fc01-cef4-4b84-a01f-c12d680d330c
- 5382e57b-665f-40fa-be70-208ba25dd8c8
- c14bb69b-b308-44e7-a2da-d36015ce4cb2
- 19b43f70-6377-44b9-80d8-24773ecd52e5
- 4aa5804f-3f99-47fb-bca3-9ba1f57e7d28
- f4d6464a-e027-439d-b9cc-dd45f322eb92
- a3f475d6-e7fd-4dfd-a161-fdb213c05972
- d5e864d5-2bd9-45f8-bdec-a5e86ad3e656
- 020e7d2b-7fd0-4990-b12a-e70cc283faa6
- fb2cbd01-dd41-47fe-a420-2d64090d5aa5
- 0b4aa3dc-8395-4d1b-9a7d-7f0fc75f7aa9
- 89e3d31d-1a75-4451-99b2-6158ad63b962
- 82270711-21b2-4aa7-b05c-ae5c43ee9f56
- 638b1197-912f-4d5d-959f-8ce35b128fef
- 5404ca5a-4ba6-4cff-8142-b03ca1732aba
- f2438c92-392f-4aa0-9d59-8c897bf83a19
- 41
- 78e88d6c-fcf0-49d8-8b23-32e6c2913724
- Group
- Choose Terrain Source
- a50c4a3b-0177-4c91-8556-db95de6c56c8
- Round
- Round a floating point value.
- a7c51214-837f-4585-ae44-d31f7785af36
- Round
- Round
-
1426
7065
129
64
-
1490
7097
- Number to round
- 09c46022-fc9a-487b-9957-ce4f3fdcb18f
- Number
- Number
- false
- 6debcba6-7298-407c-8221-35285be4e974
- 1
-
1428
7067
47
60
-
1453
7097
- Integer nearest to x
- 36291800-5603-4544-b185-55d0dc9da800
- Nearest
- Nearest
- false
- 0
-
1505
7067
48
20
-
1529
7077
- First integer smaller than or equal to x
- 69175d55-9709-40b0-b1ef-4c713eb3d060
- Floor
- Floor
- false
- 0
-
1505
7087
48
20
-
1529
7097
- First integer larger than or equal to x
- cf53aa4b-260c-4b08-8a8b-977e762482ec
- Ceiling
- Ceiling
- false
- 0
-
1505
7107
48
20
-
1529
7117
- a50c4a3b-0177-4c91-8556-db95de6c56c8
- Round
- Round a floating point value.
- a098eea3-f8b2-4f15-a7fe-eec70990f211
- Round
- Round
-
1425
7144
129
64
-
1489
7176
- Number to round
- f72176b1-00d6-47fd-9f15-185301bb23ed
- Number
- Number
- false
- 4c5e4c48-e59c-4073-ad56-31eb1c5ed132
- 1
-
1427
7146
47
60
-
1452
7176
- Integer nearest to x
- bc036851-260a-4c9b-9e6e-0012a14a9f8a
- Nearest
- Nearest
- false
- 0
-
1504
7146
48
20
-
1528
7156
- First integer smaller than or equal to x
- 9ca1a059-0eae-4594-9879-70fe7760a7c6
- Floor
- Floor
- false
- 0
-
1504
7166
48
20
-
1528
7176
- First integer larger than or equal to x
- e8b07381-6170-4218-a16f-3a43b08c3468
- Ceiling
- Ceiling
- false
- 0
-
1504
7186
48
20
-
1528
7196
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- 1e2dd893-88de-488d-83e4-f8f7e6f60bbe
- Construct Domain
- Construct Domain
-
1915
7124
152
44
-
2002
7146
- Start value of numeric domain
- ed0bd66b-0ce1-4b63-9ee5-68dd3f3a2c1f
- Domain start
- Domain start
- false
- 36291800-5603-4544-b185-55d0dc9da800
- 1
-
1917
7126
70
20
-
1953.5
7136
- 1
- 1
- {0}
- 0
- End value of numeric domain
- b91e903e-8acf-40cc-a064-ad730f8b8b2a
- Domain end
- Domain end
- false
- bc036851-260a-4c9b-9e6e-0012a14a9f8a
- 1
-
1917
7146
70
20
-
1953.5
7156
- 1
- 1
- {0}
- 1
- Numeric domain between {A} and {B}
- 80d6969a-d35c-42cd-b77f-2523d0f4de55
- Domain
- Domain
- false
- 0
-
2017
7126
48
40
-
2041
7146
- 2dddb05e-5503-4506-8f9e-5c0f4c35f8b0
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create List Box
- Creates a list box from which items can be selected.
- ed5800a8-5949-497c-9bf5-1c0b115cc367
- Create List Box
- Create List Box
-
785
3607
158
64
-
879
3639
- 1
- The initial list of options to display in the list.
- b4c2ade6-327c-416d-842d-18c86674b092
- List Items
- List Items
- false
- 439edf67-b398-4de7-948e-b6a72e485248
- 1
-
787
3609
77
20
-
827
3619
- The initially selected index. Defaults to the first item.
- 640483b0-5e99-4629-a970-3495cb79c085
- Selected Index
- Selected Index
- false
- 0
-
787
3629
77
20
-
827
3639
- 1
- 1
- {0}
- 0
- List box height in pixels.
- e96ac457-28f5-4c0a-912f-17ff3ce1fd53
- Height
- Height
- false
- 0
-
787
3649
77
20
-
827
3659
- 1
- 1
- {0}
- 100
- The list box object
- 1a0c3302-e02c-438a-851d-4f72cf9b1ed1
- List Box
- List Box
- false
- 0
-
894
3609
47
60
-
917.5
3639
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- cff18f19-362d-444a-88ae-82d7868a22e6
- Panel
- false
- 0
- 0
- Site Plan Shape:
-
617
3504
129
71
- 0
- 0
- 0
-
617.0938
3504.765
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 7ed8c8f2-eebb-4835-ba1f-c30b16723283
- Adjust Element Appearance
- Adjust Element Appearance
-
1372
3522
129
84
-
1487
3564
- The elements to adjust
- b920a208-4e71-4ce7-bee4-844a019aa12c
- Elements to Adjust
- Elements to Adjust
- false
- d36d65cb-1ea0-4c91-aa77-81da3149c70d
- 1
-
1374
3524
98
20
-
1424.5
3534
- The foreground color of the element
- e83415b8-01db-47ca-a1f6-c54931c5f051
- Foreground
- Foreground
- true
- 0
-
1374
3544
98
20
-
1424.5
3554
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- ddb1c957-8f99-4ce1-9334-fdfc6d35dcf8
- Background
- Background
- true
- 0
-
1374
3564
98
20
-
1424.5
3574
- The font size of the element
- 7cee0564-a8f5-4e72-9e70-906f6726646f
- Font Size
- Font Size
- true
- 6aae5d75-875f-4765-b02d-daf172ff7324
- 1
-
1374
3584
98
20
-
1424.5
3594
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 6aae5d75-875f-4765-b02d-daf172ff7324
- Number Slider
- Number Slider
- false
- 0
-
987
3592
203
20
-
987.1943
3592.481
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- cde60695-3ca2-465a-b7fb-b4a205f6b713
- Create Text Block
- Create Text Block
-
782
3519
157
64
-
863
3551
- The text to display in the text block
- c3980a01-8c0d-4aee-819c-23ac337bb3c5
- Text
- Text
- false
- cff18f19-362d-444a-88ae-82d7868a22e6
- 1
-
784
3521
64
20
-
817.5
3531
- The size of the label to display
- 64de1582-45fc-4c87-817f-076773b322e3
- Text Size
- Text Size
- false
- 0
-
784
3541
64
20
-
817.5
3551
- 1
- 1
- {0}
- 12
- Text justification
- bf1257e9-957d-4aec-b23f-36911e70149e
- Justification
- Justification
- false
- 0
-
784
3561
64
20
-
817.5
3571
- 1
- 1
- {0}
- 0
- The created text block.
- d36d65cb-1ea0-4c91-aa77-81da3149c70d
- Text Block
- Text Block
- false
- 0
-
878
3521
59
60
-
907.5
3551
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 750da1ab-4f8a-4c0a-8b3c-c5cfb8868afc
- Entwine
- Entwine
-
1915
3492
118
64
-
1960
3524
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 6cbb4461-9b7d-4789-b9b5-86a0b1216403
- false
- Branch {0;0}
- {0;0}
- true
- d36d65cb-1ea0-4c91-aa77-81da3149c70d
- 1
-
1917
3494
28
20
-
1932.5
3504
- 2
- Data to entwine
- 4eb5a2c9-cc4b-4ca8-b2e1-271d614bc6a0
- false
- Branch {0;1}
- {0;1}
- true
- 1a0c3302-e02c-438a-851d-4f72cf9b1ed1
- 1
-
1917
3514
28
20
-
1932.5
3524
- 2
- Data to entwine
- 8d5726bd-eaf8-4f9d-8a37-e783ab9d0039
- false
- Branch {0;2}
- {0;2}
- true
- f741d4f5-d028-4bf3-bdf8-26d214185a68
- 1
-
1917
3534
28
20
-
1932.5
3544
- Entwined result
- 28ad132d-789a-4870-916d-154e933383f1
- 1
- Result
- Result
- false
- 0
-
1975
3494
56
60
-
1995
3524
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- 5d066976-6483-4fa8-be9a-f955bbf470a9
- Adjust Element Positioning
- Adjust Element Positioning
-
1679
3578
142
144
-
1807
3650
- The UIElement you want to reposition.
- b5cebd15-0cb0-4a05-ab15-82de8e58d44f
- Elements to adjust
- Elements to adjust
- false
- 1a0c3302-e02c-438a-851d-4f72cf9b1ed1
- 1
-
1681
3580
111
20
-
1738
3590
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 3345455a-9ee3-4fba-9cf1-15fb63732370
- Margin
- Margin
- true
- 0
-
1681
3600
111
20
-
1738
3610
- Set to true to position relative to the upper left corner of the document
- aca515de-686b-4d1c-a526-c9441a1973ad
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1681
3620
111
20
-
1738
3630
- 1
- 1
- {0}
- false
- Override the element width
- db31ad0a-0fd6-4c6e-bc21-6e9f07692ece
- Width
- Width
- true
- 0
-
1681
3640
111
20
-
1738
3650
- Override the element height
- be66fb22-0e0e-404c-8d07-880374a463e6
- Height
- Height
- true
- 258b5b32-58e4-4125-8b3a-16ecc082d9cb
- 1
-
1681
3660
111
20
-
1738
3670
- Horizontal alignment
- e5dcd688-3c15-4689-acb6-1f2f24f7e312
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1681
3680
111
20
-
1738
3690
- Vertical alignment
- 5ffeabca-7279-4ea6-ae5e-d72204815b4b
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1681
3700
111
20
-
1738
3710
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 258b5b32-58e4-4125-8b3a-16ecc082d9cb
- Number Slider
- Number Slider
- false
- 0
-
1463
3665
203
20
-
1463.79
3665.989
- 3
- 1
- 1
- 100
- 0
- 0
- 55
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 9c65311c-c45c-4b4b-bc39-944157c2c0a4
- 57db691c-b9b9-408c-91f4-2b438b12df07
- 17424a13-d5a2-4e02-a6e5-fddc629d6921
- 39a71a61-eab0-484c-bcbc-5033ff61d896
- d25783f2-2851-44d0-a2ca-6f12518d6be0
- 7e96f075-ad7b-4d98-9ba2-8f5a0d177c55
- 6
- dcbfe674-4bba-4de6-bf23-e77e1b529569
- Group
- Site Plan Bounds and Parameters
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
- Contains a collection of generic data
- 1
- e08b77de-4188-4cd7-aed4-0f937f5a204e
- Data
- Terrain Type
- false
- e9467c3a-f8bf-4e6b-b72b-f732418a5524
- 1
- 2
-
9641
1097
73
20
-
9678.325
1107.706
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 12ea1e26-8b66-47b6-a62c-e9bc2663eb7e
- Panel
- false
- 0
- 0
-
Set Contour Spacing (doc units):
-
821
5902
129
55
- 0
- 0
- 0
-
821.7912
5902.43
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 90daa66b-acdc-413e-8cbc-a224a7b1ff44
- Adjust Element Appearance
- Adjust Element Appearance
-
1299
5795
129
84
-
1414
5837
- The elements to adjust
- e3350187-6f50-42b1-9541-3c72be5e38c3
- Elements to Adjust
- Elements to Adjust
- false
- b410ca69-b181-429e-984a-dcb6b0b73951
- 1
-
1301
5797
98
20
-
1351.5
5807
- The foreground color of the element
- 73d5ee5f-62bb-45f6-acdb-d890488cfb52
- Foreground
- Foreground
- true
- 0
-
1301
5817
98
20
-
1351.5
5827
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 7a344f9d-d35f-4e1d-b812-ad95115f1dc0
- Background
- Background
- true
- 0
-
1301
5837
98
20
-
1351.5
5847
- The font size of the element
- eb21b4f8-941c-4bca-a6ec-570aa89a7930
- Font Size
- Font Size
- true
- 9e2d41f8-92cf-4c4c-b1e8-114de70fdfdb
- 1
-
1301
5857
98
20
-
1351.5
5867
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 9e2d41f8-92cf-4c4c-b1e8-114de70fdfdb
- Number Slider
- Number Slider
- false
- 0
-
1067
5858
203
20
-
1067.916
5858.786
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 42adb098-22be-45c4-bff8-ae89f0e6198e
- Create Text Block
- Create Text Block
-
973
5916
157
64
-
1054
5948
- The text to display in the text block
- d89ce998-a508-4ae6-9b66-c8ed22118b5b
- Text
- Text
- false
- 12ea1e26-8b66-47b6-a62c-e9bc2663eb7e
- 1
-
975
5918
64
20
-
1008.5
5928
- The size of the label to display
- 840e46c9-1087-46fa-b4b7-89bd3770d63d
- Text Size
- Text Size
- false
- 0
-
975
5938
64
20
-
1008.5
5948
- 1
- 1
- {0}
- 12
- Text justification
- e1cd3ae9-5b42-4207-bcef-04b5664f29c3
- Justification
- Justification
- false
- 0
-
975
5958
64
20
-
1008.5
5968
- 1
- 1
- {0}
- 0
- The created text block.
- b410ca69-b181-429e-984a-dcb6b0b73951
- Text Block
- Text Block
- false
- 0
-
1069
5918
59
60
-
1098.5
5948
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 8aa549f7-2376-44e7-b60c-01ac8d17dedb
- Entwine
- Entwine
-
1963
6004
118
64
-
2008
6036
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 8ba2912e-9593-477e-8c9e-b367c48b883f
- false
- Branch {0;0}
- {0;0}
- true
- b410ca69-b181-429e-984a-dcb6b0b73951
- 1
-
1965
6006
28
20
-
1980.5
6016
- 2
- Data to entwine
- 7793006f-1c2c-43e9-89d6-8fa675c52785
- false
- Branch {0;1}
- {0;1}
- true
- 363f64c2-1a04-420d-8124-f8bf5309168b
- 1
-
1965
6026
28
20
-
1980.5
6036
- 2
- Data to entwine
- f665f064-3524-4847-ba24-be2b75bf00e0
- false
- Branch {0;2}
- {0;2}
- true
- 0
-
1965
6046
28
20
-
1980.5
6056
- Entwined result
- 9c61a076-71bb-4e79-b935-319ce824552c
- 1
- Result
- Result
- false
- 0
-
2023
6006
56
60
-
2043
6036
- c77acc8a-fe64-43f0-9485-d23744f6152e
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Slider
- Create a slider with a label and a value readout.
- 374e7bae-c34d-4167-a409-279444c6c883
- Create Slider
- Create Slider
- false
- false
- false
- true
- true
-
838
6190
137
44
-
916
6212
- 2
- The slider(s) to add to the window.
- af940096-40f9-4ea8-bbdf-e50844561133
- Slider
- Slider
- false
- c6128c18-3dbb-4d30-9ead-06651b7b7941
- 1
-
840
6192
61
20
-
872
6202
- 1
- An optional value to round/snap slider to. This overrides the native settings on the GH slider.
- dffdfd6a-74f1-49b3-a424-eee3c1ea4c7f
- Snap Value
- Snap Value
- true
- 0
-
840
6212
61
20
-
872
6222
- 1
- The Slider UI elements. Use in conjunction with an "Add Elements" component.
- 56fdd11c-2df4-4e81-a100-d3bd99ebf88c
- Sliders
- Sliders
- false
- 0
-
931
6192
42
40
-
952
6212
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- 2f74140a-65ab-45ab-b211-2ddc252b0a1f
- Construct Domain
- Construct Domain
-
1002
6269
152
44
-
1089
6291
- Start value of numeric domain
- e8c1980e-2ac7-4fb7-b6b2-5cd5c7ffaca5
- Domain start
- Domain start
- false
- 0
-
1004
6271
70
20
-
1040.5
6281
- 1
- 1
- {0}
- 1
- End value of numeric domain
- 1ed5d4a4-04f8-485e-a285-469337dff65f
- Domain end
- Domain end
- false
- 0
-
1004
6291
70
20
-
1040.5
6301
- 1
- 1
- {0}
- 20
- Numeric domain between {A} and {B}
- f1bfe78f-bd83-452b-aca6-bdd49134bc5f
- Domain
- Domain
- false
- 0
-
1104
6271
48
40
-
1128
6291
- 59b523a4-d32c-4a20-883c-a9cb828bf880
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBox Contents
- Modify the contents of an existing Text Box object.
- e5e78888-2d87-4c65-b14d-c401b86a59d7
- Set TextBox Contents
- Set TextBox Contents
-
1350
6293
149
44
-
1485
6315
- The text box object to modify
- 8aaa08d5-b805-4c9d-b18a-6cd13f3db764
- Text Box to modify
- Text Box to modify
- false
- ea8f2d51-bfbc-4c81-bb55-8f7508f4a6c7
- 1
-
1352
6295
118
20
-
1412.5
6305
- The new text to display in the text box
- b11f685b-9cb4-4dd3-9811-d827a4fa3db6
- New Text Box contents
- New Text Box contents
- false
- 298bc837-c917-43bd-95bf-fa9348b4cb9b
- 1
-
1352
6315
118
20
-
1412.5
6325
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- d631b4cd-6bf6-4552-baba-4d1f4a530bb9
- Value Listener
- Value Listener
- true
-
999
6373
152
44
-
1090
6395
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 1c27b012-0952-4888-ba21-d06a8dbbb639
- Elements
- Elements
- false
- ea8f2d51-bfbc-4c81-bb55-8f7508f4a6c7
- 1
-
1001
6375
74
20
-
1039.5
6385
- 1
- The optional filter(s) for the elements you want to listen for.
- 6b327496-df8d-4982-aaa8-2d446e14e26d
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1001
6395
74
20
-
1039.5
6405
- 2
- The values of the listened elements
- 50539fc2-c514-426e-a83c-455850a63c91
- Values
- Values
- false
- 0
-
1105
6375
44
20
-
1127
6385
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- ea4c6764-c003-46e9-914a-9685dda9348c
- Indices
- Indices
- false
- 0
-
1105
6395
44
20
-
1127
6405
- 30edb451-7870-4204-a6a3-e38745f42590
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Stack
- Creates a group of UI elements stacked vertically or horizontally.
- f73a3244-64de-44bb-9a45-6ba13727d21e
- Create Stack
- Create Stack
-
1733
6120
134
44
-
1814
6142
- 1
- The UI elements to group together
- 72f45c79-5ae7-427c-854e-dd838a6af902
- UI Elements
- UI Elements
- false
- 5b478e35-c3d0-4789-90ea-da886206f335
- 1
-
1735
6122
64
20
-
1768.5
6132
- Set to true for horizontal arrangement; false for vertical.
- eb1b3bc6-9cf7-4a1b-8cba-f74d754a73fc
- Horizontal
- Horizontal
- false
- 0
-
1735
6142
64
20
-
1768.5
6152
- 1
- 1
- {0}
- true
- The combined group of elements
- 363f64c2-1a04-420d-8124-f8bf5309168b
- Stack
- Stack
- false
- 0
-
1829
6122
36
40
-
1847
6142
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- f6a2bc5e-f61a-4de4-8e20-ed2d080a18a9
- Create Text Block
- Create Text Block
-
828
6085
157
64
-
909
6117
- The text to display in the text block
- 26f960de-c97e-4ef3-a907-8fc168af4108
- Text
- Text
- false
- 1bc2f3c7-2626-4234-9c9d-eea52673979d
- 1
-
830
6087
64
20
-
863.5
6097
- The size of the label to display
- b432bf26-1fac-4196-87d1-3470fa952356
- Text Size
- Text Size
- false
- 0
-
830
6107
64
20
-
863.5
6117
- 1
- 1
- {0}
- 16
- Text justification
- 8df8bddf-8383-4515-97a0-890e2662fc86
- Justification
- Justification
- false
- 0
-
830
6127
64
20
-
863.5
6137
- 1
- 1
- {0}
- 0
- The created text block.
- d055b766-bf00-4aa1-8a16-74bb98543186
- Text Block
- Text Block
- false
- 0
-
924
6087
59
60
-
953.5
6117
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 1bc2f3c7-2626-4234-9c9d-eea52673979d
- Panel
- false
- 0
- 0
- Contour Spacing
-
669
6082
129
38
- 0
- 0
- 0
-
669.2057
6082.966
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- c79e0960-f241-4030-82cb-c3b2175c58ad
- Adjust Element Appearance
- Adjust Element Appearance
-
1241
6017
129
84
-
1356
6059
- The elements to adjust
- cf12c970-ce12-4e2a-9c76-d4efff5cf3ce
- Elements to Adjust
- Elements to Adjust
- false
- d055b766-bf00-4aa1-8a16-74bb98543186
- 1
-
1243
6019
98
20
-
1293.5
6029
- The foreground color of the element
- eb8490dd-c711-406d-80e7-6f8c0e0d569e
- Foreground
- Foreground
- true
- 0
-
1243
6039
98
20
-
1293.5
6049
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 49295211-b230-4eab-9194-53411cc453a0
- Background
- Background
- true
- 0
-
1243
6059
98
20
-
1293.5
6069
- The font size of the element
- 11441cf9-61f5-4787-9c63-355a07d083b6
- Font Size
- Font Size
- true
- 0
-
1243
6079
98
20
-
1293.5
6089
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 0a02e77f-6140-4f22-95de-f36c17d32a30
- Entwine
- Entwine
-
1515
6100
118
64
-
1560
6132
- 3
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 0dcb4a65-6c09-47c7-91d5-cdffdd5a57a0
- false
- Branch {0;0}
- {0;0}
- true
- d055b766-bf00-4aa1-8a16-74bb98543186
- 1
-
1517
6102
28
20
-
1532.5
6112
- 2
- Data to entwine
- 594c72ae-b64e-44f7-bbe8-d0798d2be5aa
- false
- Branch {0;1}
- {0;1}
- true
- 56fdd11c-2df4-4e81-a100-d3bd99ebf88c
- 1
-
1517
6122
28
20
-
1532.5
6132
- 2
- Data to entwine
- 33d54db8-4bb7-4cf6-86d1-596cf7783448
- false
- Branch {0;2}
- {0;2}
- true
- ea8f2d51-bfbc-4c81-bb55-8f7508f4a6c7
- 1
-
1517
6142
28
20
-
1532.5
6152
- Entwined result
- 5b478e35-c3d0-4789-90ea-da886206f335
- 1
- Result
- Result
- false
- 0
-
1575
6102
56
60
-
1595
6132
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- ed2fe6cc-f59e-49c2-86f4-8c851d18952a
- Adjust Element Positioning
- Adjust Element Positioning
-
1504
6349
142
144
-
1632
6421
- The UIElement you want to reposition.
- b06e9ce0-6bb0-4fa9-99e5-d55bb5b28952
- Elements to adjust
- Elements to adjust
- false
- ea8f2d51-bfbc-4c81-bb55-8f7508f4a6c7
- 1
-
1506
6351
111
20
-
1563
6361
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 5a8db078-d408-4850-8727-b78f6a62950d
- Margin
- Margin
- true
- 0
-
1506
6371
111
20
-
1563
6381
- Set to true to position relative to the upper left corner of the document
- 4d962c84-2c1e-4893-8570-3789146b5a4f
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1506
6391
111
20
-
1563
6401
- 1
- 1
- {0}
- false
- Override the element width
- f1e2e54e-26c1-4ed4-955c-b99155497a9f
- Width
- Width
- true
- f2bb1b93-9285-4d09-8b0d-09b849ebb8d9
- 1
-
1506
6411
111
20
-
1563
6421
- Override the element height
- 5194494c-3cb7-4d29-a2d3-b70ad1c87ba9
- Height
- Height
- true
- 0
-
1506
6431
111
20
-
1563
6441
- Horizontal alignment
- 4cd263be-ba24-4297-8ea0-2791aa8acb57
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1506
6451
111
20
-
1563
6461
- Vertical alignment
- 9491f05b-56ad-40da-9016-527d1602d8fd
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1506
6471
111
20
-
1563
6481
- 1
- 1
- {0}
- 2
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- f2bb1b93-9285-4d09-8b0d-09b849ebb8d9
- Number Slider
- Number Slider
- false
- 0
-
1279
6414
203
20
-
1279.912
6414.821
- 3
- 1
- 1
- 1000
- 0
- 0
- 100
- 41a3a0d8-e0f4-4b48-88b3-bf87d79a3cfd
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Box
- Create a box for text entry, with a button to pass its value.
- e2a79286-5a08-4e08-aaee-82286a262605
- Create Text Box
- Create Text Box
- true
-
801
6332
163
64
-
896
6364
- Optional label for the Text Box
- 604364a9-924c-40c7-b51d-37f557a3e67c
- Label
- Label
- false
- 0
-
803
6334
78
20
-
843.5
6344
- 1
- 1
- {0}
- false
- The starting text in the text box
- afe8c3c5-eed1-48c4-afb5-717556e997af
- Default Text
- Default Text
- false
- 0
-
803
6354
78
20
-
843.5
6364
- 1
- 1
- {0}
- false
- Set to true to associate text box
with a button for updates. Otherwise event listening will
associate with every change in text box content.
- 33c8b294-4d3b-455a-a494-e6bc311f263d
- Update Button
- Update Button
- false
- 0
-
803
6374
78
20
-
843.5
6384
- 1
- 1
- {0}
- true
- The created text box.
- ea8f2d51-bfbc-4c81-bb55-8f7508f4a6c7
- Text Box
- Text Box
- false
- 0
-
911
6334
51
60
-
936.5
6364
- b412d7d3-02e2-4a8e-bdcc-2e1f8b2a8834
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set Slider
- Modify the range and value of a slider.
- 4b990ca8-9b76-4b8d-8533-8da8ff02ce3a
- Set Slider
- Set Slider
-
1350
6221
79
64
-
1415
6253
- The UI Slider to update
- e65e7f99-d5e1-4957-9480-a04b7dfe9468
- UI Slider
- UI Slider
- false
- 56fdd11c-2df4-4e81-a100-d3bd99ebf88c
- 1
-
1352
6223
48
20
-
1377.5
6233
- The value to set the slider to
- c521228f-d742-42d1-aa29-760f81f06831
- Value
- Value
- true
- 50539fc2-c514-426e-a83c-455850a63c91
- 1
-
1352
6243
48
20
-
1377.5
6253
- the new slider range
- 0953eb08-82e9-42d8-87d8-8e9fe6e0af20
- Range
- Range
- true
- f1bfe78f-bd83-452b-aca6-bdd49134bc5f
- 1
-
1352
6263
48
20
-
1377.5
6273
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- c6128c18-3dbb-4d30-9ead-06651b7b7941
- 1eaad454-0a5a-4ff6-b07d-92cd4e8569bc
- 12ea1e26-8b66-47b6-a62c-e9bc2663eb7e
- 90daa66b-acdc-413e-8cbc-a224a7b1ff44
- 9e2d41f8-92cf-4c4c-b1e8-114de70fdfdb
- 42adb098-22be-45c4-bff8-ae89f0e6198e
- 8aa549f7-2376-44e7-b60c-01ac8d17dedb
- 374e7bae-c34d-4167-a409-279444c6c883
- 2f74140a-65ab-45ab-b211-2ddc252b0a1f
- e5e78888-2d87-4c65-b14d-c401b86a59d7
- d631b4cd-6bf6-4552-baba-4d1f4a530bb9
- f73a3244-64de-44bb-9a45-6ba13727d21e
- f6a2bc5e-f61a-4de4-8e20-ed2d080a18a9
- 1bc2f3c7-2626-4234-9c9d-eea52673979d
- c79e0960-f241-4030-82cb-c3b2175c58ad
- 0a02e77f-6140-4f22-95de-f36c17d32a30
- ed2fe6cc-f59e-49c2-86f4-8c851d18952a
- f2bb1b93-9285-4d09-8b0d-09b849ebb8d9
- e2a79286-5a08-4e08-aaee-82286a262605
- 4b990ca8-9b76-4b8d-8533-8da8ff02ce3a
- 20
- 8b566f05-9bd8-4a1c-991a-9f3cf742dd72
- Group
- Contour Spacing
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 03212d3b-9922-40af-9ad4-e18b417bd31c
- Adjust Element Appearance
- Adjust Element Appearance
-
1571
6565
129
84
-
1686
6607
- The elements to adjust
- 012b5ff4-9387-461f-81a7-90ff4d46cefa
- Elements to Adjust
- Elements to Adjust
- false
- c28385f9-7377-43a4-b2f7-54ece96d51c2
- 7897a3aa-b9dc-44b3-b629-6d894dfeff22
- 73acd960-c6ee-4da0-895a-8abacb354901
- 3
-
1573
6567
98
20
-
1623.5
6577
- The foreground color of the element
- c9a1ce2f-f793-466e-95d9-dc75c20cae61
- Foreground
- Foreground
- true
- 0
-
1573
6587
98
20
-
1623.5
6597
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 67fbf93e-e5db-4c9a-b383-1c66717d2f99
- Background
- Background
- true
- 0
-
1573
6607
98
20
-
1623.5
6617
- The font size of the element
- 31d2b7e6-fa55-4d87-84d9-2ce6ed46c1ff
- Font Size
- Font Size
- true
- a24f4b9a-1cba-4221-b7c3-e40dfb715cbe
- 1
-
1573
6627
98
20
-
1623.5
6637
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- a24f4b9a-1cba-4221-b7c3-e40dfb715cbe
- Number Slider
- Number Slider
- false
- 0
-
1341
6630
203
20
-
1341.083
6630.553
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- cefc9cd7-88f7-46c8-9148-e88080ef1c17
- Create Text Block
- Create Text Block
-
1108
6678
157
64
-
1189
6710
- The text to display in the text block
- 689c8a24-ef55-4337-9824-a0bbee3a83ae
- Text
- Text
- false
- 3df71b4e-9ae7-4e99-95b2-854f217c8afe
- 1
-
1110
6680
64
20
-
1143.5
6690
- The size of the label to display
- 5c91b8cf-32fc-4f6d-bd69-394e6dd697d4
- Text Size
- Text Size
- false
- 0
-
1110
6700
64
20
-
1143.5
6710
- 1
- 1
- {0}
- 12
- Text justification
- 0ed1be82-77af-4d2a-99e5-18811386cbf9
- Justification
- Justification
- false
- 0
-
1110
6720
64
20
-
1143.5
6730
- 1
- 1
- {0}
- 0
- The created text block.
- c28385f9-7377-43a4-b2f7-54ece96d51c2
- Text Block
- Text Block
- false
- 0
-
1204
6680
59
60
-
1233.5
6710
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 6f7fd5da-3a8f-4991-ac1b-e2d53d64a437
- Entwine
- Entwine
-
1843
6746
118
84
-
1888
6788
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 0958ce98-20b7-4926-9ce4-ba302a4c7d65
- false
- Branch {0;0}
- {0;0}
- true
- 7897a3aa-b9dc-44b3-b629-6d894dfeff22
- 1
-
1845
6748
28
20
-
1860.5
6758
- 2
- Data to entwine
- b96d16bb-e852-4c73-867b-a8835f1f2717
- false
- Branch {0;1}
- {0;1}
- true
- c28385f9-7377-43a4-b2f7-54ece96d51c2
- 1
-
1845
6768
28
20
-
1860.5
6778
- 2
- Data to entwine
- 2f51d8f5-3e11-452a-b8b3-91fa83a427be
- false
- Branch {0;2}
- {0;2}
- true
- 73acd960-c6ee-4da0-895a-8abacb354901
- 1
-
1845
6788
28
20
-
1860.5
6798
- 2
- Data to entwine
- e742c37a-76e5-4c52-a298-55b38f82f55c
- false
- Branch {0;3}
- {0;3}
- true
- 5783c4a6-8eb5-4212-9a35-55a5ef9a6af7
- 1
-
1845
6808
28
20
-
1860.5
6818
- Entwined result
- ef5e4880-327d-4de4-9ce3-99aa346e1d08
- 1
- Result
- Result
- false
- 0
-
1903
6748
56
80
-
1923
6788
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 49184338-537c-4ad8-b057-b7768c23b3e8
- Create Text Block
- Create Text Block
-
1109
6587
157
64
-
1190
6619
- The text to display in the text block
- 8e6937f8-408d-413c-b409-3d867fb6a389
- Text
- Text
- false
- 86eb6c67-2f01-4148-ae30-1d539e1bf584
- 1
-
1111
6589
64
20
-
1144.5
6599
- The size of the label to display
- 0e345a18-359c-4b3e-936f-f84e8ffc5fc6
- Text Size
- Text Size
- false
- 0
-
1111
6609
64
20
-
1144.5
6619
- 1
- 1
- {0}
- 12
- Text justification
- f3669c2d-7fcf-4a9c-a1a6-264f04f4d588
- Justification
- Justification
- false
- 0
-
1111
6629
64
20
-
1144.5
6639
- 1
- 1
- {0}
- 0
- The created text block.
- 7897a3aa-b9dc-44b3-b629-6d894dfeff22
- Text Block
- Text Block
- false
- 0
-
1205
6589
59
60
-
1234.5
6619
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 86eb6c67-2f01-4148-ae30-1d539e1bf584
- Panel
- false
- 0
- 0
-
814
6583
160
100
- 0
- 0
- 0
-
814.7133
6583.29
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 2d58b25b-2b27-416c-ab05-7fb903c7b323
- Panel
- false
- 0
- 0
- text
-
962
6818
70
26
- 0
- 0
- 0
-
962.989
6818.136
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 0c999c5d-c896-4a6a-9ec7-8f0e080dd563
- Create Text Block
- Create Text Block
-
1112
6818
157
64
-
1193
6850
- The text to display in the text block
- f86869e8-0972-408a-8916-a98ff4de4495
- Text
- Text
- false
- 2d58b25b-2b27-416c-ab05-7fb903c7b323
- 1
-
1114
6820
64
20
-
1147.5
6830
- The size of the label to display
- 4e6529e8-8d6d-4296-9e48-213e655c711a
- Text Size
- Text Size
- false
- 0
-
1114
6840
64
20
-
1147.5
6850
- 1
- 1
- {0}
- 12
- Text justification
- c8d0f062-304f-420b-885e-c9fb641aa270
- Justification
- Justification
- false
- 0
-
1114
6860
64
20
-
1147.5
6870
- 1
- 1
- {0}
- 0
- The created text block.
- 73acd960-c6ee-4da0-895a-8abacb354901
- Text Block
- Text Block
- false
- 0
-
1208
6820
59
60
-
1237.5
6850
- a1e21ba0-2f60-41df-bb5a-619802c5af9a
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Set TextBlock Contents
- Modify the contents of an existing Text Block object.
- a5de63ac-753c-4779-8005-d26703949b0e
- Set TextBlock Contents
- Set TextBlock Contents
-
1327
6851
157
44
-
1470
6873
- The text block object to modify
- caba5a2e-dc87-46d5-87ec-2f62924d9fa5
- Text Block to modify
- Text Block to modify
- false
- 73acd960-c6ee-4da0-895a-8abacb354901
- 1
-
1329
6853
126
20
-
1393.5
6863
- The new text to display in the text block
- 9469ab33-d0ed-4505-a704-d0806159cae1
- New Text Block contents
- New Text Block contents
- false
- f9ff208e-5ba0-4d62-beef-7dfef187abba
- 1
-
1329
6873
126
20
-
1393.5
6883
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- f229c634-5270-4d0a-9980-e5e7fbb87b98
- 7c99dd3a-bd51-4f53-9bde-fb596ee63836
- b613b565-5140-47e9-8bbd-c6a62083fe74
- 36cd1795-01cb-449e-ac55-966aa0382e0b
- 3df71b4e-9ae7-4e99-95b2-854f217c8afe
- 15cd5492-33d5-4d0d-a80d-daa1c57fbd59
- 09f0b943-cf1f-4dda-b74d-ea779b46250c
- 5ae65944-3c03-4216-a5a6-4b9bf3ff61e4
- 53385c35-3809-40ba-8d1d-07c2f748324f
- a7c51214-837f-4585-ae44-d31f7785af36
- a098eea3-f8b2-4f15-a7fe-eec70990f211
- 1e2dd893-88de-488d-83e4-f8f7e6f60bbe
- 03212d3b-9922-40af-9ad4-e18b417bd31c
- a24f4b9a-1cba-4221-b7c3-e40dfb715cbe
- cefc9cd7-88f7-46c8-9148-e88080ef1c17
- 6f7fd5da-3a8f-4991-ac1b-e2d53d64a437
- 49184338-537c-4ad8-b057-b7768c23b3e8
- 86eb6c67-2f01-4148-ae30-1d539e1bf584
- 2d58b25b-2b27-416c-ab05-7fb903c7b323
- 0c999c5d-c896-4a6a-9ec7-8f0e080dd563
- a5de63ac-753c-4779-8005-d26703949b0e
- 21
- 0775d696-482a-46a8-882b-0c3cb46d4790
- Group
- Random Building Height
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 8bf1c361-90f7-4f35-8a05-f3408643b79e
- Adjust Element Appearance
- Adjust Element Appearance
-
1693
7293
129
84
-
1808
7335
- The elements to adjust
- 99e6c605-3efc-45bc-a609-d959e243bacb
- Elements to Adjust
- Elements to Adjust
- false
- edfaa1aa-efd0-49db-bec2-6a7c2f0ac6a7
- da3d6ae8-8669-404e-97bb-4aead46f2bb1
- 2
-
1695
7295
98
20
-
1745.5
7305
- The foreground color of the element
- b4c4717d-443e-4e1d-bd74-806627f432f5
- Foreground
- Foreground
- true
- 0
-
1695
7315
98
20
-
1745.5
7325
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 96868026-a23d-4c89-9537-777298472c25
- Background
- Background
- true
- 0
-
1695
7335
98
20
-
1745.5
7345
- The font size of the element
- 896bbff9-33de-472d-9fe1-a30ed3910114
- Font Size
- Font Size
- true
- f5a49c26-017e-41af-9718-0ae99585c0ea
- 1
-
1695
7355
98
20
-
1745.5
7365
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- f5a49c26-017e-41af-9718-0ae99585c0ea
- Number Slider
- Number Slider
- false
- 0
-
1463
7360
203
20
-
1463.75
7360.041
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 267abf0b-cae4-4006-bcab-4ad4f7a68635
- Create Text Block
- Create Text Block
-
1231
7315
157
64
-
1312
7347
- The text to display in the text block
- 14073712-f272-490f-8ba0-dc07a9a0324f
- Text
- Text
- false
- 39df8294-45e0-49ba-8400-e2ab5fb5b31a
- 1
-
1233
7317
64
20
-
1266.5
7327
- The size of the label to display
- 0cefacb9-6230-4495-82b0-f0fc333a5620
- Text Size
- Text Size
- false
- 0
-
1233
7337
64
20
-
1266.5
7347
- 1
- 1
- {0}
- 12
- Text justification
- 4966ba22-f72f-4821-8eb1-102bc87ca93e
- Justification
- Justification
- false
- 0
-
1233
7357
64
20
-
1266.5
7367
- 1
- 1
- {0}
- 0
- The created text block.
- edfaa1aa-efd0-49db-bec2-6a7c2f0ac6a7
- Text Block
- Text Block
- false
- 0
-
1327
7317
59
60
-
1356.5
7347
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 39df8294-45e0-49ba-8400-e2ab5fb5b31a
- Panel
- false
- 0
- 0
-
Generate/Refresh Site Plan Preview:
-
1030
7277
160
100
- 0
- 0
- 0
-
1030.321
7277.777
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- c9785b8e-2f30-4f90-8ee3-cca710f82402
- Entwine
- Flatten and combine a collection of data streams
- true
- 9bbd9a5e-25c2-4b68-be5e-3eec18099b9c
- Entwine
- Entwine
-
1969
7453
118
84
-
2014
7495
- 4
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to entwine
- 155af42d-39b7-44af-845a-b301b8657468
- false
- Branch {0;0}
- {0;0}
- true
- edfaa1aa-efd0-49db-bec2-6a7c2f0ac6a7
- 1
-
1971
7455
28
20
-
1986.5
7465
- 2
- Data to entwine
- d35509d4-7230-4072-a4fa-c3372d5f5415
- false
- Branch {0;1}
- {0;1}
- true
- b9072a40-5f60-4608-8269-71b08c06548a
- 1
-
1971
7475
28
20
-
1986.5
7485
- 2
- Data to entwine
- c5c997e0-c93e-49f3-bfab-b6b0ce25541b
- false
- Branch {0;2}
- {0;2}
- true
- da3d6ae8-8669-404e-97bb-4aead46f2bb1
- 1
-
1971
7495
28
20
-
1986.5
7505
- 2
- Data to entwine
- e1ff8282-8d2d-4242-b1ae-2494c2934c1a
- false
- Branch {0;3}
- {0;3}
- true
- 18c5ee8b-a327-468f-bb9c-e51795cc1068
- 1
-
1971
7515
28
20
-
1986.5
7525
- Entwined result
- 3d2cef11-1a71-40e8-920a-e1c775f5c6a5
- 1
- Result
- Result
- false
- 0
-
2029
7455
56
80
-
2049
7495
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- f9397dfb-2e8e-48e1-baae-6efe03dd222a
- Create Text Block
- Create Text Block
-
1231
7599
157
64
-
1312
7631
- The text to display in the text block
- 2ae4692a-494a-4edf-bff3-c856f125f996
- Text
- Text
- false
- 4111756e-c3f8-4f02-b410-87fe79516c38
- 1
-
1233
7601
64
20
-
1266.5
7611
- The size of the label to display
- bd4af12f-2fd5-4c97-918e-39c906113960
- Text Size
- Text Size
- false
- 0
-
1233
7621
64
20
-
1266.5
7631
- 1
- 1
- {0}
- 12
- Text justification
- 9169816b-a27f-410a-a739-9d0d31a96fd2
- Justification
- Justification
- false
- 0
-
1233
7641
64
20
-
1266.5
7651
- 1
- 1
- {0}
- 0
- The created text block.
- da3d6ae8-8669-404e-97bb-4aead46f2bb1
- Text Block
- Text Block
- false
- 0
-
1327
7601
59
60
-
1356.5
7631
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 4111756e-c3f8-4f02-b410-87fe79516c38
- Panel
- false
- 0
- 0
-
1030
7561
160
100
- 0
- 0
- 0
-
1030.91
7561.895
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- a7a0c814-ab68-45e0-9a9e-5515b0c4adc6
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Separator
- Create a line separator object.
- 27887b25-0638-4179-93bf-d9965a393f81
- Create Separator
- Create Separator
-
1279
7717
148
104
-
1353
7769
- The thickness of the separator.
- b18d277e-643f-4049-a431-3bf5dbd6f1cc
- Thickness
- Thickness
- false
- 0
-
1281
7719
57
20
-
1311
7729
- 1
- 1
- {0}
- 1
- Separator is horizontal.
- 12e1309b-5e8e-4e54-b4ce-3764562458f1
- Horizontal
- Horizontal
- false
- 0
-
1281
7739
57
20
-
1311
7749
- 1
- 1
- {0}
- true
- The color of the separator (optional).
- 52a09b40-c6c6-41f0-be7a-ae02dcca7aee
- Color
- Color
- true
- 0
-
1281
7759
57
20
-
1311
7769
- 1
- 1
- {0}
-
255;0;0;0
- The width of the separator (optional). Default is Stretch.
- 8d1ae75f-452e-4bb2-b63a-e1d7306432a0
- Width
- Width
- true
- 0
-
1281
7779
57
20
-
1311
7789
- The height of the separator (optional). Default is Stretch.
- c40edf5d-0a1e-4a42-a2aa-b801b32bf794
- Height
- Height
- true
- 0
-
1281
7799
57
20
-
1311
7809
- The created Separator
- 18c5ee8b-a327-468f-bb9c-e51795cc1068
- Separator
- Separator
- false
- 0
-
1368
7719
57
100
-
1396.5
7769
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- 105b502e-1fb9-44ab-8901-b37e4dae990c
- Number Slider
- Number Slider
- false
- 0
-
1617
7738
208
20
-
1617.929
7738.053
- 3
- 1
- 1
- 100
- 0
- 0
- 10
- 0e1bdb06-2fe7-4fbc-b194-15227efdc8a7
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Positioning
- Adjust the margins, sizing, and other positioning information of an element.
Absolute positioning can get a little wonky, use at your own risk.
- 796200c2-8d63-45f7-baf2-1592d86e5f9f
- Adjust Element Positioning
- Adjust Element Positioning
-
1898
7722
142
144
-
2026
7794
- The UIElement you want to reposition.
- c39002f4-e102-4054-8f83-bf4974a43e98
- Elements to adjust
- Elements to adjust
- false
- b9072a40-5f60-4608-8269-71b08c06548a
- 1
-
1900
7724
111
20
-
1957
7734
- The margin value. Input a single number to
affect margins on all sides, or four values separated by commas
to set Left, Top, Right, and Bottom individually.
- 4ffd15b9-8713-441f-8aac-65e4296af3f1
- Margin
- Margin
- true
- 0
-
1900
7744
111
20
-
1957
7754
- Set to true to position relative to the upper left corner of the document
- a396be52-b577-46ec-9b31-8b8f839b6313
- Absolute Positioning
- Absolute Positioning
- false
- 0
-
1900
7764
111
20
-
1957
7774
- 1
- 1
- {0}
- false
- Override the element width
- da3b9a63-1b4b-448a-a109-9b77b08c8fe4
- Width
- Width
- true
- a2bcfabd-887a-4b53-9bcc-0e6c5eb53888
- 1
-
1900
7784
111
20
-
1957
7794
- Override the element height
- fc528f37-6ed5-45ba-926e-b9d78fabb3a7
- Height
- Height
- true
- 0
-
1900
7804
111
20
-
1957
7814
- Horizontal alignment
- c8a1c584-1e4b-4fea-80ee-e168eeb74df2
- Horizontal Alignment
- Horizontal Alignment
- true
- 0
-
1900
7824
111
20
-
1957
7834
- Vertical alignment
- 18219d0e-0ccb-43cb-ae74-4b61d28a0a9c
- Vertical Alignment
- Vertical Alignment
- true
- 0
-
1900
7844
111
20
-
1957
7854
- ce46b74e-00c9-43c4-805a-193b69ea4a11
- Multiplication
- Mathematical multiplication
- 55c6f211-2a4a-4845-8cda-6ac4558f3a90
- Multiplication
- Multiplication
-
1703
7798
88
44
-
1734
7820
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- First item for multiplication
- aaaa07f4-7e99-4057-9a1b-b38da2649a68
- A
- A
- true
- 105b502e-1fb9-44ab-8901-b37e4dae990c
- 1
-
1705
7800
14
20
-
1713.5
7810
- Second item for multiplication
- d012409b-5f29-4538-a862-d6a89aab47d0
- B
- B
- true
- 0
-
1705
7820
14
20
-
1713.5
7830
- 1
- 1
- {0}
- Grasshopper.Kernel.Types.GH_Integer
- 14
- Result of multiplication
- a2bcfabd-887a-4b53-9bcc-0e6c5eb53888
- Result
- Result
- false
- 0
-
1749
7800
40
40
-
1769
7820
- 5ab78609-c132-45c7-ba44-200a4f2e4188
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create True-Only Button
- 0
- Create a True only Button object.
- d65b8db1-caf2-44d8-be20-2ec7b803c13e
- Create True-Only Button
- Create True-Only Button
-
1255
7475
149
44
-
1344
7497
- The text to display on the button
- f6f3cc73-ffd6-409b-917d-864ce8b1f8b6
- Button Name
- Button Name
- true
- 59511a77-ba90-4d51-8842-348b49a29aff
- 1
-
1257
7477
72
20
-
1294.5
7487
- The image to display on the button.
- 30b7432d-f29c-4122-bc9c-f0f2b95bb67e
- Image Path
- Image Path
- true
- 0
-
1257
7497
72
20
-
1294.5
7507
- The created Button
- b9072a40-5f60-4608-8269-71b08c06548a
- Button
- Button
- false
- 0
-
1359
7477
43
40
-
1380.5
7497
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- 5608d6fa-0a2e-495a-ad44-0496b836100c
- Adjust Element Appearance
- Adjust Element Appearance
-
1906
7632
129
84
-
2021
7674
- The elements to adjust
- 31bc0f3b-032a-4abf-b21b-285f6eb7d87f
- Elements to Adjust
- Elements to Adjust
- false
- b9072a40-5f60-4608-8269-71b08c06548a
- 1
-
1908
7634
98
20
-
1958.5
7644
- The foreground color of the element
- d9e41949-c8a6-430c-8164-cb9efe9dca17
- Foreground
- Foreground
- true
- 0
-
1908
7654
98
20
-
1958.5
7664
- The background color of the element
- 0874968c-0728-4059-a98b-4ff12b5945da
- Background
- Background
- true
- 0
-
1908
7674
98
20
-
1958.5
7684
- The font size of the element
- 0e39d28b-72a6-4b4c-909a-673e57ad48fd
- Font Size
- Font Size
- true
- 105b502e-1fb9-44ab-8901-b37e4dae990c
- 1
-
1908
7694
98
20
-
1958.5
7704
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 59511a77-ba90-4d51-8842-348b49a29aff
- 64a929ee-9755-457f-ba7a-0d4790f09d66
- 8bf1c361-90f7-4f35-8a05-f3408643b79e
- f5a49c26-017e-41af-9718-0ae99585c0ea
- 267abf0b-cae4-4006-bcab-4ad4f7a68635
- 39df8294-45e0-49ba-8400-e2ab5fb5b31a
- 9bbd9a5e-25c2-4b68-be5e-3eec18099b9c
- f9397dfb-2e8e-48e1-baae-6efe03dd222a
- 4111756e-c3f8-4f02-b410-87fe79516c38
- 27887b25-0638-4179-93bf-d9965a393f81
- 105b502e-1fb9-44ab-8901-b37e4dae990c
- 796200c2-8d63-45f7-baf2-1592d86e5f9f
- 55c6f211-2a4a-4845-8cda-6ac4558f3a90
- d65b8db1-caf2-44d8-be20-2ec7b803c13e
- 5608d6fa-0a2e-495a-ad44-0496b836100c
- 15
- 8b7e62e8-b8a6-414c-904d-520432687722
- Group
- b844ab20-b7ae-4a21-99d5-83c5666a7432
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Label
- Creates a label in the window.
- f40b0224-f39a-41a1-a5f2-a9ef3c6c6003
- Create Label
- Create Label
-
1074
8006
134
64
-
1155
8038
- The text to display in the label
- c75cca69-1709-4cc6-a69f-eef7fc7f85ea
- Label Text
- Label Text
- false
- 5a2e4736-188a-4fde-a32a-81e49d136ef9
- 1
-
1076
8008
64
20
-
1109.5
8018
- The size of the label to display
- 3e08c3e3-3adc-4f56-ac08-8f3bd46615fd
- Label Size
- Label Size
- false
- 0
-
1076
8028
64
20
-
1109.5
8038
- 1
- 1
- {0}
- 24
- Text justification
- 7b025ea0-b9eb-4e2b-8981-b070b64fbb62
- Justification
- Justification
- false
- 0
-
1076
8048
64
20
-
1109.5
8058
- 1
- 1
- {0}
- 0
- The created labels.
- ca712486-a0f4-469a-b0ad-150278da264f
- Label
- Label
- false
- 0
-
1170
8008
36
60
-
1188
8038
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- f31e0dbe-5861-4367-8dae-90eb806cd036
- Panel
- false
- 0
- 0
- Choose Elements to Display:
-
900
8065
129
71
- 0
- 0
- 0
-
900.8805
8065.272
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- fe2794da-42d7-4d91-bbdb-8775fa7a9230
- Adjust Element Appearance
- Adjust Element Appearance
-
1660
8086
129
84
-
1775
8128
- The elements to adjust
- bab098e5-04dd-41db-b2f5-b4a8ecaa9e63
- Elements to Adjust
- Elements to Adjust
- false
- 789f4e3c-486a-4409-a63b-47b85410bcae
- 1
-
1662
8088
98
20
-
1712.5
8098
- The foreground color of the element
- 84ba9e35-2b75-469c-9aa8-248b9de78553
- Foreground
- Foreground
- true
- 0
-
1662
8108
98
20
-
1712.5
8118
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- 77cff8f5-677e-4e94-b096-5b2f0fd4aa47
- Background
- Background
- true
- 0
-
1662
8128
98
20
-
1712.5
8138
- The font size of the element
- ebde6eee-96a8-4e49-ae8a-df1f325436f5
- Font Size
- Font Size
- true
- e0b72af0-c638-4b6b-baae-5ae2ca74573f
- 1
-
1662
8148
98
20
-
1712.5
8158
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- e0b72af0-c638-4b6b-baae-5ae2ca74573f
- Number Slider
- Number Slider
- false
- 0
-
1270
8152
203
20
-
1270.974
8152.988
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- 84065ebc-6f39-4c98-87ab-510327f56059
- Create Text Block
- Create Text Block
-
1070
8083
157
64
-
1151
8115
- The text to display in the text block
- 5ece81dc-d7f6-4617-b00d-ede008aa0db2
- Text
- Text
- false
- f31e0dbe-5861-4367-8dae-90eb806cd036
- 1
-
1072
8085
64
20
-
1105.5
8095
- The size of the label to display
- 0171416a-daef-4113-acb7-2034051868e8
- Text Size
- Text Size
- false
- 0
-
1072
8105
64
20
-
1105.5
8115
- 1
- 1
- {0}
- 12
- Text justification
- 2ed14bc0-53a6-4e05-a876-a9c7fb9c9089
- Justification
- Justification
- false
- 0
-
1072
8125
64
20
-
1105.5
8135
- 1
- 1
- {0}
- 0
- The created text block.
- 789f4e3c-486a-4409-a63b-47b85410bcae
- Text Block
- Text Block
- false
- 0
-
1166
8085
59
60
-
1195.5
8115
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- ff794186-aa2e-459f-b6ea-8675b35b9e9d
- Panel
- false
- 0
- 0
-
Bake selected elements to Rhino Document:
-
903
8376
129
71
- 0
- 0
- 0
-
903.8806
8376.271
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- Courier New
- 8
- 76eb5930-7b2b-4a11-839e-d3c00990af8b
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Adjust Element Appearance
- Adjust the color and appearance of individual elements.
- bf16a710-19ca-4b88-804f-5b101a7488e6
- Adjust Element Appearance
- Adjust Element Appearance
-
1660
8401
129
84
-
1775
8443
- The elements to adjust
- 82e46c0d-dab0-4bd5-8270-3d223c8acd88
- Elements to Adjust
- Elements to Adjust
- false
- f5e24607-83cb-4dd1-931d-7233ddde5117
- 1
-
1662
8403
98
20
-
1712.5
8413
- The foreground color of the element
- a6d95c93-2c89-431c-a1be-1e23477ba0e3
- Foreground
- Foreground
- true
- 0
-
1662
8423
98
20
-
1712.5
8433
- 1
- 1
- {0}
-
255;0;0;0
- The background color of the element
- c8eab6d2-2b3f-441c-8797-9d24fd14d810
- Background
- Background
- true
- 0
-
1662
8443
98
20
-
1712.5
8453
- The font size of the element
- 17684509-7b1c-401e-bd64-2b683ceb343d
- Font Size
- Font Size
- true
- caf93e27-a58a-4afc-92da-1409b8cce197
- 1
-
1662
8463
98
20
-
1712.5
8473
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
- Numeric slider for single values
- caf93e27-a58a-4afc-92da-1409b8cce197
- Number Slider
- Number Slider
- false
- 0
-
1270
8467
203
20
-
1270.974
8467.988
- 3
- 1
- 1
- 100
- 0
- 0
- 16
- 088f694c-6b70-4baf-afe4-5bfd46526d6f
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Text Block
- Creates a multi-line text block
- e5168874-6243-4eaf-ab20-08d2222ed8b2
- Create Text Block
- Create Text Block
-
1070
8398
157
64
-
1151
8430
- The text to display in the text block
- f610568a-736f-4ed7-a96b-43688cec8ad5
- Text
- Text
- false
- ff794186-aa2e-459f-b6ea-8675b35b9e9d
- 1
-
1072
8400
64
20
-
1105.5
8410
- The size of the label to display
- 0b2403fb-a558-46b8-9114-a763bea2a787
- Text Size
- Text Size
- false
- 0
-
1072
8420
64
20
-
1105.5
8430
- 1
- 1
- {0}
- 12
- Text justification
- cf1376a2-fe51-40ff-b2a2-719e448e9ff7
- Justification
- Justification
- false
- 0
-
1072
8440
64
20
-
1105.5
8450
- 1
- 1
- {0}
- 0
- The created text block.
- f5e24607-83cb-4dd1-931d-7233ddde5117
- Text Block
- Text Block
- false
- 0
-
1166
8400
59
60
-
1195.5
8430
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 0f335b6e-94bb-4321-a4ba-9a8bb35fad97
- Panel
- false
- 0
- 0
- Bake Site Geometry
-
939
8519
93
49
- 0
- 0
- 0
-
939.1115
8519.176
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- d6ba0398-70a7-46e7-a068-274486eb0acb
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Value Listener
- This component is used to retrieve the values of UI elements from the window. By default it will automatically refresh when those values change.
- 32c9c558-f39c-4f76-b75c-e1bb3ed753ff
- Value Listener
- Value Listener
- true
-
1324
8541
152
44
-
1415
8563
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 3ede854e-c753-40eb-84cb-b48008f14fd4
- 2
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2e3ab970-8545-46bb-836c-1c11e5610bce
- 1
- UI Element(s) to listen to. This can be retrieved either directly from the component
that generated the element, or from the output of the "Add Elements" component.
- 95c38886-558f-4ae0-aa07-c1ff42bbc96e
- Elements
- Elements
- false
- db07bf26-d1dd-4f91-a95e-4e567840b30f
- 1
-
1326
8543
74
20
-
1364.5
8553
- 1
- The optional filter(s) for the elements you want to listen for.
- 5e4267e7-2c34-40f8-9ef8-8cb2f6900c5b
- Name Filter(s)
- Name Filter(s)
- true
- 0
-
1326
8563
74
20
-
1364.5
8573
- 2
- The values of the listened elements
- 59c09ed2-1475-4f5f-af95-c259f6bac33b
- Values
- Values
- false
- 0
-
1430
8543
44
20
-
1452
8553
- 2
- For list-based objects (checklist, pulldown menu, etc) returns the selected index - otherwise returns -1.
- f6c8ea6a-1b7f-432b-8f6f-790b5f023125
- Indices
- Indices
- false
- 0
-
1430
8563
44
20
-
1452
8573
- 071c3940-a12d-4b77-bb23-42b5d3314a0d
- Clean Tree
- Removed all null and invalid items from a data tree.
- true
- f4e97143-4bbb-4791-96ae-e547dd2eb9e9
- Clean Tree
- Clean Tree
-
15277
1060
146
84
-
15375
1102
- 4
- cb95db89-6165-43b6-9c41-5702bc5bf137
- cb95db89-6165-43b6-9c41-5702bc5bf137
- cb95db89-6165-43b6-9c41-5702bc5bf137
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Remove null items from the tree.
- ab5993c1-39f8-42bb-b818-06a23c7787d6
- Remove Nulls
- Remove Nulls
- false
- 0
-
15279
1062
81
20
-
15321
1072
- 1
- 1
- {0}
- true
- Remove invalid items from the tree.
- 12b1a84e-ffb3-4c07-8ce0-e1435664a159
- Remove Invalid
- Remove Invalid
- false
- 0
-
15279
1082
81
20
-
15321
1092
- 1
- 1
- {0}
- true
- Remove empty branches from the tree.
- fbab59d3-207d-40b5-8230-2240904be914
- Remove Empty
- Remove Empty
- false
- 0
-
15279
1102
81
20
-
15321
1112
- 1
- 1
- {0}
- true
- 2
- Data tree to clean
- 31b71794-2e13-4620-8bef-2023180998e4
- Tree
- Tree
- false
- 725b7adb-a38f-4d2c-9ee6-79a6b67a7d9d
- 1
-
15279
1122
81
20
-
15321
1132
- 2
- Spotless data tree
- e3358c49-9f71-432c-b4ba-a365cc1bd899
- Tree
- Tree
- false
- 0
-
15390
1062
31
80
-
15405.5
1102
- f5f563fb-39eb-4322-a287-c2830e22d852
- a5058970-b442-4922-91a1-9f0f715c9c46
- Bake Object
- Programmatically bake the geometry of specified objects
- true
- 96381b53-68cd-47cd-9682-5d2219786093
- Bake Object
- Bake Object
- 1
- 66e25f2d-dbc1-42a5-afd5-bad30dabb7ab
-
15270
737
162
84
-
15377
769
- 1
- Optional list of objects to bake from. Use as an alternative to the select button.
- 70df3312-a227-44f8-b98c-866c251565a5
- Objects
- Objects
- true
- 0
-
15272
739
90
20
-
15318.5
749
- 1
- The optional object attributes to use for baking. Create this with the "CreateAttributes" Component from Human. Shameless self-promotion much?
- 1e6c6a46-b28c-4790-a5d4-dd71a13b0ec6
- Object Attributes
- Object Attributes
- true
- ab20e1d6-25ed-4c1d-8379-a7fea2f5d5da
- 1
-
15272
759
90
20
-
15318.5
769
- Set to true to bake all objects - set to false to do nothing.
- 8ebd6a03-e6ce-4b8d-a35b-4d482ab00e87
- Bake
- Bake
- false
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 1
-
15272
779
90
20
-
15318.5
789
- 1
- 1
- {0}
- false
- 1
- The GUIDs of the baked objects
- 326aad1d-f2ff-48cb-871c-0e13e0bb0421
- Guids
- Guids
- false
- 0
-
15392
739
38
60
-
15411
769
- 1e936df3-0eea-4246-8549-514cb8862b7a
- Mesh
- Contains a collection of polygon meshes
- true
- 66e25f2d-dbc1-42a5-afd5-bad30dabb7ab
- Mesh
- Mesh
- false
- 0ac618e5-f452-476e-a744-2fe2a75d763e
- 1
-
15332
849
50
24
-
15357.69
861.7764
- f5f563fb-39eb-4322-a287-c2830e22d852
- a5058970-b442-4922-91a1-9f0f715c9c46
- Bake Object
- Programmatically bake the geometry of specified objects
- true
- df6bbee9-44f1-416f-90e5-c0991172493c
- Bake Object
- Bake Object
- 1
- f4e97143-4bbb-4791-96ae-e547dd2eb9e9
-
15271
954
162
84
-
15378
986
- 1
- Optional list of objects to bake from. Use as an alternative to the select button.
- ae495f80-e80a-4a98-a3c7-1bdb0d554b2c
- Objects
- Objects
- true
- 0
-
15273
956
90
20
-
15319.5
966
- 1
- The optional object attributes to use for baking. Create this with the "CreateAttributes" Component from Human. Shameless self-promotion much?
- 1e60e140-0c6d-46ed-b51e-37f7cfbedd47
- Object Attributes
- Object Attributes
- true
- 4b1ec9e5-9bb1-4016-b700-77ab993d3928
- 1
-
15273
976
90
20
-
15319.5
986
- Set to true to bake all objects - set to false to do nothing.
- ca18655f-25d1-4a80-9ae0-910d9607908a
- Bake
- Bake
- false
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 1
-
15273
996
90
20
-
15319.5
1006
- 1
- 1
- {0}
- false
- 1
- The GUIDs of the baked objects
- cc05d87c-7f8b-467d-b112-fc2efc17483c
- Guids
- Guids
- false
- 0
-
15393
956
38
60
-
15412
986
- f5f563fb-39eb-4322-a287-c2830e22d852
- a5058970-b442-4922-91a1-9f0f715c9c46
- Bake Object
- Programmatically bake the geometry of specified objects
- true
- b36ac10b-2ec2-41c3-9038-5f2dcd0ce917
- Bake Object
- Bake Object
- 1
- 13b1b17a-3165-4e73-b73b-8e77e6105e26
-
15289
1232
162
84
-
15396
1264
- 1
- Optional list of objects to bake from. Use as an alternative to the select button.
- 0fdb0a19-5d8e-492d-ad03-aed303c402bc
- Objects
- Objects
- true
- 0
-
15291
1234
90
20
-
15337.5
1244
- 1
- The optional object attributes to use for baking. Create this with the "CreateAttributes" Component from Human. Shameless self-promotion much?
- eaae3e8b-69bb-40c3-956f-b2305400180f
- Object Attributes
- Object Attributes
- true
- 7beef241-69d1-482c-8658-a4d794986f96
- 1
-
15291
1254
90
20
-
15337.5
1264
- Set to true to bake all objects - set to false to do nothing.
- d94dbd7d-3ecd-4478-8425-a9abd98f08e6
- Bake
- Bake
- false
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 1
-
15291
1274
90
20
-
15337.5
1284
- 1
- 1
- {0}
- false
- 1
- The GUIDs of the baked objects
- 958ccf0e-1d56-4ffe-9e62-1c9ce6c9216c
- Guids
- Guids
- false
- 0
-
15411
1234
38
60
-
15430
1264
- ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278
- Geometry
- Contains a collection of generic geometry
- true
- 13b1b17a-3165-4e73-b73b-8e77e6105e26
- Geometry
- Geometry
- false
- 256a6a23-ae2a-4c3f-93be-5747baf6af61
- 1
-
15348
1335
50
24
-
15373.24
1347.962
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 2cd71327-3ec3-4d21-aee4-959bdee5857d
- 9526b64b-c883-40a1-9940-f4b26e2a9167
- ba189c45-5974-43a6-b80a-dcc320bdbce2
- 5a2e4736-188a-4fde-a32a-81e49d136ef9
- 1b91bd56-855c-4eb2-9323-9f75c61ecbc6
- a84e5e7d-d5ba-4422-92b9-bc3a56652ae3
- f40b0224-f39a-41a1-a5f2-a9ef3c6c6003
- f31e0dbe-5861-4367-8dae-90eb806cd036
- fe2794da-42d7-4d91-bbdb-8775fa7a9230
- e0b72af0-c638-4b6b-baae-5ae2ca74573f
- 84065ebc-6f39-4c98-87ab-510327f56059
- ff794186-aa2e-459f-b6ea-8675b35b9e9d
- bf16a710-19ca-4b88-804f-5b101a7488e6
- caf93e27-a58a-4afc-92da-1409b8cce197
- e5168874-6243-4eaf-ab20-08d2222ed8b2
- 6d371993-ebe2-4418-a782-2c3b5fa5c3c2
- 0f335b6e-94bb-4321-a4ba-9a8bb35fad97
- 32c9c558-f39c-4f76-b75c-e1bb3ed753ff
- 375a7355-e720-4295-96fe-c86ae6ae8800
- 19
- a00286eb-381f-40a8-9019-8a61d2010860
- Group
- Commit Geometry
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
- Contains a collection of generic data
- true
- 1
- 3d44772b-f683-4f6e-ad5d-5c5eebc33a9e
- Data
- Selected Elements
- false
- 88ff48ff-b037-4aca-a5fa-07768df2fe9d
- 1
- 2
-
14093
647
101
20
-
14143.89
657.1318
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
- Contains a collection of generic data
- true
- 1
- a707d8fb-059a-4c04-950a-59a1e825e947
- Data
- Topo Contour Spacing
- false
- 298bc837-c917-43bd-95bf-fa9348b4cb9b
- 1
- 2
-
11874
506
122
20
-
11935.09
516.5605
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
- Contains a collection of generic data
- 1
- ecd9311a-ab28-43a7-a0a6-301d4250fa09
- Data
- Random Building Height Domain
- false
- 80d6969a-d35c-42cd-b77f-2523d0f4de55
- 1
- 2
-
10158
1488
173
20
-
10245.39
1498.757
- cb95db89-6165-43b6-9c41-5702bc5bf137
- Boolean
- Contains a collection of boolean values
- 1
- 55c03f23-8c27-410d-8fab-79b50ae32650
- Boolean
- Bake?
- false
- 59c09ed2-1475-4f5f-af95-c259f6bac33b
- 1
- 2
-
15019
721
50
20
-
15044.37
731.8691
- 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe
- Scribble
- true
-
1066.108
742.2193
-
1948.872
742.2193
-
1948.872
818.1959
-
1066.108
818.1959
- A quick note
- Microsoft Sans Serif
- 6aaf9c1f-3620-4b7d-843a-07a7d897987d
- false
- Scribble
- Scribble
- 100
- HumanUI Interface
-
1061.108
737.2193
892.7637
85.97656
-
1066.108
742.2193
- 65283518-ad00-49d3-87fb-f76823ebb162
- Data Dam
- 2500000
- 2
- Delay data on its way through the document
- true
- 2
- 5bc74741-3e76-4673-8e93-ab08aef2d449
- Data Dam
- Data Dam
-
15510
709
125
36
-
15555
711
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 1
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- 2
- Data to buffer
- 91339102-2128-4070-a95b-11832cf14b6f
- Data Data A
- Data A
- true
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 1
-
15512
711
40
32
-
15533.5
727
- 2
- Buffered data
- efb96ce3-d254-4e08-a436-24a421d81738
- false
- Data Data A
- Data A
- false
- 0
-
15590
711
43
32
-
15611.5
727
- 410755b1-224a-4c1e-a407-bf32fb45ea7e
- 00000000-0000-0000-0000-000000000000
- GhPython Script
- """Provides a scripting component.
Inputs:
x: The x script variable
y: The y script variable
Output:
a: The a output variable"""
__author__ = "sdanilow"
__version__ = "2021.08.27"
import rhinoscriptsyntax as rs
import Rhino
rs.ZoomExtents()
- Provides a scripting component.
-
1305
249
-
558
571
- true
- true
- true
- false
- c5fda921-bd89-4637-95c9-66ad316aae2c
- false
- true
- GhPython Script
- GhPython Script
-
15667
713
61
28
-
15714
727
- 1
- 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2
- 0
- true
- Script variable Python
- 1393c365-a1de-4389-a44d-4b02a152937f
- bake
- bake
- true
- 0
- true
- efb96ce3-d254-4e08-a436-24a421d81738
- 1
- 87f87f55-5b71-41f4-8aea-21d494016f81
-
15669
715
30
24
-
15685.5
727
- 9a5b87d6-046e-4c33-9aca-5af2f7503047
- 1b2ec1b3-ab86-44c1-81d4-176f567b3592
- Create Button
- 0
- Create a Button object.
- 375a7355-e720-4295-96fe-c86ae6ae8800
- Create Button
- Create Button
-
1090
8519
149
44
-
1179
8541
- The text to display on the button
- 160c0d62-99cf-4744-abb5-3f73e5965411
- Button Name
- Button Name
- true
- 0f335b6e-94bb-4321-a4ba-9a8bb35fad97
- 1
-
1092
8521
72
20
-
1129.5
8531
- The image to display on the button.
- 0653079d-3c5b-4c0b-aa09-35870018501d
- Image Path
- Image Path
- true
- 0
-
1092
8541
72
20
-
1129.5
8551
- The created Button
- db07bf26-d1dd-4f91-a95e-4e567840b30f
- Button
- Button
- false
- 0
-
1194
8521
43
40
-
1215.5
8541
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- bb43699d-5a2e-4373-9171-c27f98349cf9
- 1
- 3f916cb0-35f0-4bbc-9ed1-6fbb18303f62
- Group
- Terrain
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
- A panel for custom notes and text values
- 6aa3540b-0399-40ba-9146-cd0e6de920d0
- Panel
- false
- 0
- 0
- 23
-
971
1827
50
40
- 0
- 0
- 0
-
971.7228
1827.357
-
255;255;250;90
- true
- true
- true
- false
- false
- true
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 34b570b9-3e3d-449d-84f7-3e044a07d733
- a701800a-39e9-4ac9-bd46-eee85a2ff895
- 914eaf0f-a885-4884-8613-813713e5bbb6
- 40ad04e8-688a-4804-804b-522dcc73d745
- 980a572d-6092-419f-9b6e-e1f7adbce7e7
- 53e26c56-1524-495e-a9e3-b54e0858cda9
- 7c4e07c0-66be-4584-b0e0-461d2fac5ffa
- f3028a85-97eb-4ff9-8576-a081ddec6b67
- 52fe57ee-f1cd-434f-ab6b-9ec3120fbc2a
- 06a82c61-33bb-4e0e-a8ab-7ee775b17965
- 26fcf24e-a57d-4067-b2dd-6dcb73595a87
- a4b20554-c0f4-4c0a-831a-97911c5e81f3
- 4fd10e17-8fbb-4d0a-9abd-5167e2401f5e
- 7d2e9864-a1b5-4751-a4d3-a8d5c9dffff1
- fa901594-60d9-4110-8876-a598e08f5220
- 35a513be-e1dd-4863-ab44-ce82436de356
- 1a95788a-61cb-46e1-a16c-5757e7d39d8d
- a707d8fb-059a-4c04-950a-59a1e825e947
- 18
- c9823158-db02-44f4-9e63-90a25e589743
- Group
- Create Cut Planes to generate Topo
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- 0e276474-f58a-4a4c-aee6-fad82e6d0b03
- de90746f-3aa6-4799-ab70-b89f8f43e13a
- 473be3cf-2c26-4502-94a0-6d65b62d8ef5
- d4b4e73b-5f79-4a9a-a906-b600f1ab49ff
- ff7cb8d6-640f-4db8-b7f8-36713c302a2d
- 3b30da02-1c98-4e35-8275-dc48df3422ec
- 97f157c4-c1c4-4be2-a998-5c3b4f6eb102
- 90764ea7-6675-4f45-bd51-257137cdf854
- 9e28039c-063b-4ee6-b227-a3e45c6af9c8
- 080171a7-7168-4988-8c78-f8bd503dbf5f
- a1c4d365-5e4d-4cec-b873-d0ddf9d99c51
- 11
- ccb86c47-3bbe-478f-b2fd-19b64ff53f67
- Group
- Create Material, Layers, and Attributes
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
- 1
-
150;170;135;255
- A group of Grasshopper objects
- f5e119b2-2eb5-4e46-93df-01e19f33a321
- 2f6a65fa-40a1-472c-9ead-2303fca59407
- f4e97143-4bbb-4791-96ae-e547dd2eb9e9
- 96381b53-68cd-47cd-9682-5d2219786093
- 66e25f2d-dbc1-42a5-afd5-bad30dabb7ab
- df6bbee9-44f1-416f-90e5-c0991172493c
- b36ac10b-2ec2-41c3-9038-5f2dcd0ce917
- 13b1b17a-3165-4e73-b73b-8e77e6105e26
- 55c03f23-8c27-410d-8fab-79b50ae32650
- 5bc74741-3e76-4673-8e93-ab08aef2d449
- c5fda921-bd89-4637-95c9-66ad316aae2c
- 11
- b08369ae-f2f4-441b-ad2e-c6dd90783d59
- Group
- Bake and Zoom Extents
- 86720a45-ee9e-49d6-b65e-494c06f66e59
- Jump
- Jump between different locations
- 2b42d477-12e4-4e1f-b3c2-37960e9956e9
- cc441393-4118-4263-8eb9-907bc79425e1
- Jump
- Jump
-
14466
559
48
48
-
14490
583
- 86720a45-ee9e-49d6-b65e-494c06f66e59
- Jump
- Jump between different locations
- 874af3f6-3390-4d95-9de2-e814123cd5b0
- cc441393-4118-4263-8eb9-907bc79425e1
- Jump
- Jump
-
11181
835
48
48
-
11205
859
- d93100b6-d50b-40b2-831a-814659dc38e3
- Rectangle
- Create a rectangle on a plane
- e42c9917-ea16-4bce-8736-b2d5e268c7ee
- Rectangle
- Rectangle
-
9835
538
131
84
-
9891
580
- Rectangle base plane
- 50e8f210-7b61-4420-9238-5e32068fff4f
- Plane
- Plane
- false
- 0
-
9837
540
39
20
-
9858
550
- 1
- 1
- {0}
-
0
0
0
1
0
0
0
1
0
- Dimensions of rectangle in plane X direction.
- 13bc1572-ea23-40c2-96df-02015ea9a8d8
- X Size
- X Size
- false
- e22f8ec9-ab94-47ca-8ef1-8ab41cf7023f
- 1
-
9837
560
39
20
-
9858
570
- 1
- 1
- {0}
-
-1
1
- Dimensions of rectangle in plane Y direction.
- 96fa1d9c-6dc5-41a4-b2dc-eda3b76a175a
- Y Size
- Y Size
- false
- e22f8ec9-ab94-47ca-8ef1-8ab41cf7023f
- 1
-
9837
580
39
20
-
9858
590
- 1
- 1
- {0}
-
-2
2
- Rectangle corner fillet radius
- 06fabced-fa61-43e1-b271-8e6edef1ccbc
- Radius
- Radius
- false
- 0
-
9837
600
39
20
-
9858
610
- 1
- 1
- {0}
- 0
- Rectangle
- fa7cc90e-4b2b-4f50-8d5e-be430f465761
- Rectangle
- Rectangle
- false
- 0
-
9906
540
58
40
-
9935
560
- Length of rectangle curve
- ca1e9144-af36-4dea-bc83-02f59a759f5a
- Length
- Length
- false
- 0
-
9906
580
58
40
-
9935
600
- 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312
- Number
- Contains a collection of floating point numbers
- c1daed9d-1aef-478a-899d-5defed2937b9
- Number
- Number
- false
- 78b27c9f-72f8-4d2f-81f8-ed57369d1e59
- 1
-
9411
579
50
24
-
9436.803
591.7842
- d1a28e95-cf96-4936-bf34-8bf142d731bf
- Construct Domain
- Create a numeric domain from two numeric extremes.
- ad4b6377-793f-44ea-88b1-3e21e48feeba
- Construct Domain
- Construct Domain
-
9638
559
152
44
-
9725
581
- Start value of numeric domain
- d2ad71f6-2552-4d59-b1a3-642fbf1b478d
- Domain start
- Domain start
- false
- 95e8704d-b006-4a2f-942b-43b3107f371c
- 1
-
9640
561
70
20
-
9676.5
571
- 1
- 1
- {0}
- 0
- End value of numeric domain
- 0d3472d2-d8e9-40e3-bc36-499d52c13a06
- Domain end
- Domain end
- false
- c1daed9d-1aef-478a-899d-5defed2937b9
- 1
-
9640
581
70
20
-
9676.5
591
- 1
- 1
- {0}
- 1
- Numeric domain between {A} and {B}
- e22f8ec9-ab94-47ca-8ef1-8ab41cf7023f
- Domain
- Domain
- false
- 0
-
9740
561
48
40
-
9764
581
- a3371040-e552-4bc8-b0ff-10a840258e88
- Negative
- Compute the negative of a value.
- 4ed02b13-4608-4378-a471-e89c06e28a71
- Negative
- Negative
-
9505
557
108
28
-
9556
571
- Input value
- e144fa85-476c-4d50-9b4a-62d536cdb2a6
- Value
- Value
- false
- c1daed9d-1aef-478a-899d-5defed2937b9
- 1
-
9507
559
34
24
-
9525.5
571
- Output value
- 95e8704d-b006-4a2f-942b-43b3107f371c
- Result
- Result
- false
- 0
-
9571
559
40
24
-
9591
571
-
iVBORw0KGgoAAAANSUhEUgAAAJYAAABkCAIAAADrOV6nAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAACeKSURBVHhe7Z0HWFRX+v/9P7vZ3272v/kZlF4EO2DL7ia7m930ukk26yab3SQau4I06b2I9CoMbQamwQxDm6F3BJGOWCIQSwwWVCw0UZoo3P/33osIF4VBB4P/x3k+z33OPec9lzvne9/3vGfmMnfe89f/Dy/i+euZfT2Q8OrVq5eev57iq7u7m81mZ2RkdHZ2jlbN/DVBwic50PPXY7yuX79eU1Pj7+/f3t4+WjXz1wQJr1y5cunypec8NS5fvnzt2jUfH+/jx4+jwGiVkwkStl4633r5OU+RS+e7uttFYmFioqiz+8bjjf8ECcuzW5/zlKnKa5MKjlib+FYXXGM0yclECVP7fx5S+irSBiqlAxXPDjjbQ2kDOHPme5k51el3rXaEyzjnqmR3GU3yMEHCQ9LbPwsVst4icUcO/1qe4PqzAs62RNKJM2e8l8fgcC4R5JoR7JaJAqNJHuaGhOm302OuScP6Mlh9GREDmZGDc5mMiP4MVn9a6K1s7tXKDAVIWJ0xmB531npXWE3mHUaTPMwVCTM5N7Ii7+ZxRqShAxKfziS/rrmJxKcrPWwI55nFGszhXVeIhKA68w4kzOC2QE5G07TMIQmzo4dlIR0FUZL6dNnhtNQZ0TCpZpaoT5dm75el77+dGXFHgRI25BJ+jqlhe/MO544wmqblZ5YQc0llen911kAOt6uET8Q6fn+pLIy4nkhcFE3DZSCmtiKiTUxcEpGg5oqYaalY2hNPZkaJva5mRd1ToIQ1WUOSyEYHk+i67HuMpml52hJCsNqsIVxrAKG/PK2nUHwtR3hBGNQcaFOz7T8WVyTfELlvEZnvPpLc964I3jgT89cOydvdIOntM+y/nYp+/VrCm+3ity7z3xjOgNl7zF6KIv+NRrZRol+3YiXEpXww9ablztBiyY3K9D5G69Q8JQmrMweRbkG8AlFbfFhDiHu2h5XQ3iTKxijcxohlbxJps4Pzxfsue0xNetL+QyQvIySGj2I4ddW5sGViE41UC82DrouSzTVjd6hlWWvLLLXSgZVWZ+xKImUVo5fCkC5tZH2b6H9TsRICXNMuFnEYHIwSo2lqZlfCSllfPbwt64409kyga4atcYTVzlCcKCQUhNYhDYMLwhERSPP5twrjCLtNwhb2e4TUkEhe93BSX7nKWdXCMujkr+7ikVxlG3bzV/cIVnfErbrJXz0gWnM3cS2zlwJJ12+M2DgbEmKgWPsKMSPOdGkxWxJCvIY8oiz1ZoRXsdXO/Ui3IJuUcxpN9TlkFK3NvovsC3EVMaQivRfpTC6bkAV3tXI/IVL1iaS1jyR5LZECLe+TRjG2iyYYMLooENnKpsiNSYG3FS4hktJU9klEJowMo2lqZkXC+pzh8rRbwW5ZZlv899okSDlnqPmPQDi9vxbuhcZVGQM4bzTV594rENwuFRJsp6ZzMe9PI+EYY7LRmtHl8QbjkVAGtN5jkqNeOkPJ0/WPBH/B23utiEsUxnfX5QxhRsf7wnupSu/HFYn3Rb3HGUtbIesrS+nG5V4iacdBGK1ToFgJb+GdQCpecPXu77z32SUiTsIXqRVrL94hri/4HwSG2YGkjmzBhZSYHxD9ucGVwU7FDjuk2782uyr8hEgxICRrpiJpzZBodVu0wdUYgyvRBofcl1xjG/TwV7VF648wLMdIXXsxQv9M6IrLUQaXI/XRsS1K/wJrZUv4yrui1Tgg0/5RSA2aotdv/LddsF1dnP/h5Jim5OhmRJdM3rnc+EuF4qslSR0HU3vorA3vlE7cUKjNuksqTUWdSeM2CtJRR1M2DjijNb7CJCyX3qrLvouJzcmMjQkvi3/+SB5RnTGAs6H8705e/GV+SF2gS7qLBReTovWucDvjSCdzjruVwNsh0dNSunl9qMXu3TeTvySSVzIHjkHy2q44wyJHvaitmhIznbQ9i/LsdGWWi1IsdLp5hsMMYxrp2jMhK6K3avJ2aZW6LD7oujhyi0aWjW661aJrMQYQmGn/KFJWXpJs/m7jzs2fB9sbx7pZcjG1O5qx7U2i7XZH4H3ZGrGAnXGEg2mM6x6up60owFkW6V0sCK1PY5/CIMDVqDEhpYVmGJmxFBQ1vo4pUT4HIPnYwE7LVBIiGMKjK6V3DqUOVKQNTk11+nBazE/GG/xC3PIPZxO1mSNVsiF4G64pf6c0W2MWpkM3S36YZ54o/Cj8rzS5i/ZLnG5D/khRfH8xj3DemtQS+SaRok8krp6aYfHqAeGqrliD7jiDHq7hbZ5hO8fgJtfwdPDyXr4hkcS0JySr74pWwRitKAwKV3VyDPoEhnfiV90TIX2dZP8opPo1vh96GJcd4BPFoluH84Zx4cLhyHld1ocRK03pKkq8ni24mMY5LWId4wZVkUmKUxquVCz7qAw8HBMeEvIg1wxOwCHEIdjjWod+J4oJblC1j0MyQhdDiyl4iITkGiWtBxcLosGB5I4kbpU0vloaXyMV1kqF2FLE14I0qiCjysDR2ifUNz4/tZmsTKhLiCm1NSZdLcwzP4PbglhPX3p4w5AWu2MTBv3pTE4MIQvpbGV/SCQtZw7cQ8G4JyMG3mesjCbxRMuxGtoAHem+dGGsVR5SljWHfyMNHZqczlRIe8nUDBd9Oj3ND2LBDoHHwineOAyKJe1IxYWh9eH7CrztJY6mMbi44b7QOMKrCLpixI7kEwhd9Tn3yIGablp9iIQIiXkJV3BpwP+iArIvtf3U3nn1Rkdb30BPb/9NgEJ3TzsKt3q7um7eQCtqUL4zNDB0d+B2X3dffw9qzl08FeSR9H0hgYsLQRUnhLjxUJDOYFFxQEBE2h9tiXiTSFpBiFdNA60ZLQNdoGsYZgonZVnj/v889qICEsJZ4bKYGilpCcQhLOoxlQpC6kI9suGjH7zxX7vdkZ42ohi/g5iP4EgwwyghaDGORsOUEBcREg1Z7BlkIu6WfAcH+/aO9gMlB3Jyco4dO3aEeh0/frympqaiouL8+fMHDhwoKytDTXNz88mTJxsaGhobGw8fPnzmzJmrV9scHZ3sd0fF7z8cG1gxBXFBFeHu5c5G2Tu+Nb0m+IhIWskcOAaSVdeiVl6JWHkhbEVPnAEKreErrkatbAldPoKomDjJXoGQEn6l2HUhdIW3QUvETxTglJg14wIrvewSoSh2PW0SEHIxj0J4yImpFF3GujMlxDWCpBYpVqH4uvl2Py8ft9OnT1dWViYkJLi5ucXGxiYmJnp5eQUGBrJYrLy8vNLS0pCQkHDqFRAQwGazYenh4ZGRkfHjjz/u83b/Zr1FoIsMZzMFSGfczCQb/xFotsuoW/w5IVlOiAynInl1mbNukqlWhqWO1EI73VIHuwV2izjbNHri9O/BAGM93l6BJC9tCv33bCztARWHe5EWIQRCTqgFRXOErZATKlruCEW8DXLNTI05iVhNpvpZpJZMCQEmwhzBxWLJjWJxp4t12JHj1c3NTXCv2trao9Srqqqqrq4O7gi/RCU8srq6GoVDhw6hBmXUnDhxouFotas1q1J2h4rs5GTwKMh0RthXwifcd0hbWK+TcyFj4BiIDft5+rfi9LHticXWYEhoQO0a/BS8rJerDwNmF0VBSvjlLEkIEGOR9SB1gHhUDemgiKKQE2ph7R/slokwi5wfWU9SVCOi5kMkhClyGWSMFbL+fFErL0YWLxDn5ecVFhbC7XJzc/Pz81Ggy9hiF03Y4kXXFBQUpKWlsiPEJUk3ajKn/6xhLJ1JD+m4FP3u9F4IEC3HA83ogoQqM4wVyCxLCMfC0lAW+yO0ZDRBF3qFhhQJrolEF1ru2R78EAkBwil8OVfYilULz//7rIyCwcH+y5cv3759e3BwcGBgoL+/v7e3t6enB7tdXV1oQhn1Y6/WS+f278toINOq4WlBak5+OiMgwqxrWsJfJyVMMJALjGkSlKO2EmormmSjWJKWNIV8MXsSImvFKhMLEiS0jKbxwDURveCdufETb0Ics4DgyIWQJonDT2z8emf5oTKIhFkQQRJRFFMjEhZsy8vLUXPu3Ln4+HjEVVTSaU5TU1Pb1TZnF2fzbYFxgRWR3iVTE+VbEuxUZLMleed3u2/w3icS5ZNQbNDDWVHjrnsjesWZwKUXQpedClgyEg9dJ1kqkKQljSH/msVAmkkH0p/uB9JpgNkjJYR+gBd0eOO3W4tLCpFhIk4icwkKCoJgHA7H1dU1OjoaBcx/RUVFPB7P29sbaY6TkxNyGdh7erlv+rddqEcOlvZTE+CS5rknbdsX4aY7jbuEHxPiZUS8/vSI9G9xVmRbaqeZaUl2awLedvUu9op7Qn0iYZKxopAsbgxeP2sSkl+A2xlHIE4+agkxmUdJiEB6DYEUmU+01yEej3/mp+bvTxw5evzw0WP1zT80Njc3Hj12+Njxw8dPHEH9iaZjRSX5BUW5hypK6d3aw+WeDpzq9HvT5jKATmewLvQyzm3Z/xqRKJ+EIEG/M2r5ueClrfuXDgn0h3grUe6LXTHLEv5zliQkV3TJnVhIHEjuwFzGaH0UD5cQYIGPwyE7RT4iZpcL49Lj47JEvJxkYVFUWMJeN7/wYK5EUCDi5iTEZSdwsxP5eRJhAbZiXq6Yl8ONkhVJrtZkyvXt5YN0Jrj9UsQbhGgJIVwpLyLknxSQDWA3fpINA9pgWrOHkqjXHLw+Jah/NiREVMwWXMDKgYqi8h75kRLSlKfdqpDdrpAOlkpulUp6ypJuV0qHLLex/vmBcWJ4E8qomUxp0q3ylP6qdJzHLcYBHwol4fWCWCLYorwl9FVCvJQ5cA8FsiVSgiVQZdRgd7zBeASUGQxE+iMoS6gtdlGJAsN4CiRL6ve9E25/Kp9DKFxCrO4FoXVulnxEJkbTFEwj4UR68Tew6v/nh9v3WifM6KPYqYGEBfzbYU6NRpuN2uPeIRKWEIIVUzMiXHE+aPFpf71mb93TfnonfclCk48eIVxBMskeSndFLT3lqwfjZm+9U356P/joHfPURSV5ETCMp0C05Meov2/+1pK3r7VA2KVYCTGkfk6p4Z4F9bMmIXnf8V7r+M/e34J8Fekvo/WxISUU9IY4HDfasrODK5eEdwUrim21ZGYaNa46aaYa/G1qRbZaqLkatuQufznDmES88qSPXrKxepmDdomdNnerqtRUI99a62yAHpqYxlMgWnw2+pNN35rHeV4oEHYrVkKko9Yzv5t0BhJSX1x0/vtTE/wZLOYYrU8CPRcikPqbFrcEvUIkLCYgw9QIlt+JXXY3DonPiotBeo37FsEvR/jLfwrQ62UvQyvTnr98mLd8gLOMEC7vj11W56rTR5mhC8NsGhL16jzeCLFuVHggxaI+lX0SY1ubNWs3XiBAxwVWvv/Gf4Sh9bMh4Wg6E/YXQqjLHLiHAp1oqYRYR8JFqN14qsCbaDkGbY8tbT++SU4SdJoDPksNHlB4OnMkj3Ddw43xK5vp2M5AQhwa+e5/P7egv0pktD4JY17oZ1L4U+BaIl6P4C2bHlIJaEaRsHyEi5plBH+SmWJJ0Gn0+1jhi4qarCEs5023+GMVh0U5o3Vq5JUQaS5WioiizuaxM5ps5QESFmIutD9mvGVHB+dNQiiHhIJl7WGLj7prn/FZdNp3Ua2LdqaZRpWT1qiKkJNhryhmQUJoBvfYsyOYH1L3GOFNXgkP54xwg6qQyMQGHJpRyisPZDpDZqRNu77b2R7zOiHQJbhLp0G47GKAbpGVRqaZeoGlRoOrdqmNZrmd5uUg3aG4JQQPNsuIOL2hKDWCP7HjExKv3ej7oWIlPJpP+DtLXSziHm9g5ZUQVwfWKxv+ZU3mS4/1P1RTQAVSel14sMV/NSkhZJgWDChv6V3OkuFYsnyP2p73X9QXtZiUkK97NnqdSGB8OlibiFtMGjO6Px5CrSafDxQo4ZF8gu130GSzbyV5x8bjTE9ySYhDlyS1489Y7ggpS71ZMZO7HOVhNJ1hI525cSnkDwRfhzlwNLwllEtBKmqXLozfxVZAGfCW/BSkyYr6IKnc3k+8u4L1B4K7aPQgT4jiJIRm8L8onxKj7/aVJHXM6MbD8cglYV323YTwozs3eOy1ScDqntH65NAS5scSXruyWvwMCAGGG+sKShVshRCGLNwM120LXjTEXkwOJXfJPQ58i2oCQrgdZRyLysU/hepYR34WmLMxLOvjmJINjuwPW0N1UE+2PiECzSbv9xIDnlTCOur2Q08bkfm2wNKULiyyy+X7JGsycknYkEcEuMjwx4JcH/OfiaeGTmcCbY+YbN/ehbmQp3MvdnHzXq2DNupHXTXrnTSPuWlhm2uuVmqtnmeudtxN6+Q+bZTrnDSOumkec9Wsc9KEfdNeLVJ73uKzYXqiYMP0/QapIQZpIfrxgSsvhOspSsJGSPgEXoj1H8YzObrJdLPvPlsxhKS+GnxM/YA8EvZWZfS7WHCdzTkzvUtVTiBhPv9WhOvJHd/uvM76IyQcjl1cYkkKJt6uLDVSqXXQSN2lcsRZs9Vf+7irJqQ9YKWO1iwTVVQm71TJMlUt3KOWa6Z2KUDnToweKWTsIoJzH5Tj9AiOIuBrNHq9+xheiNUChg5IOWeczDjwB0nkCWgp/zcSj2J6CbGcyOJfcNnDhdfH7z88088O5AESZiCd4RLh1lUtPishIQZrhE0O2TC2sZCELJA1KFO7KI82Ubu0Jbjop90foUtWMoZeUUDCfe/I6YVYLVRnDEI2hC4kE0jm7XdHYvHA9i+H5yGWMuwfj+klxBkgZfJ3SsNEKIs9M6OP7+RkXDpzvTVgDcHVIti6BGcckIR7Xy3AaB0PzLCFwUNBEw7CqJnCfjI89Wav9ybdCkzeeQZ/wuWOOEnfrVSfQyqEBXukdwkWDBbbgpDSi8KPIm3BkM50/T4F00uIxcpe64S4oCqcR76oTbGfy9DQEuZxCPdtKT95YwWtTSpBq8XDha83GLnoepD2nchFnSE6HSE6ZCUMaLXGLOkaxoiPEYOFCtDDQXDAUWOu3t0oRFoIQ/0hebQUaNU4rPEyrSwVECXi2w35ozen410gq8zin0+M/J7jX44r3smcY03eps3ycUgWhNaXJncibFLfDShMPJppJexFELc1YqXHnbU3iSpL6Vb4igJQ6Uyfv3W9yY6tPdGvDUVpHrJWPbVX44ynRpmV6kEbNewecVLnfbcg3Uj5SqBWg5N6vaN6pY1asYXqUWf1H9xJy3oHddgQ7EUkMZOI1b3oq5VvplJgrlJqrXbKQ+OYi3qemUrJHvII6FhurdYdqk2qyOjIIFbjYsR7Gzfs3Lo+zHE3192K52TGRnik/2nE1jjC2TzWy04S4VWEqa5A1IaACY9EGv/kc96jmEZCaiI8D/EKxdfsdkdCPwVGgDHIdIbXE+Px4/avd7bvXzMYoVFrr1ZqqZphpFxpq1Zpo1plq3acGug6B3L0i8xVyq1VGxzVYVNsoVJmqSrdpXzMmdy94KM5GKnzEBW5uidc1WGGvjkmKjggtthF4cAeVVRW2KheD9SC0syODOI0f/B9beNX1v5WFRzf2qToE2ns09n8CwWiq+Q/+mQM1OUgipL/jYaIOhsRazLTSIgTQljwdUyBhA4m0VT6y7R5csh0hk2mM1F29S2eWEFrUhroENGUGCQ69yAMEssYnbsRdD1FjM5IFFWga6J1LvtqDoRrj/ZlQHdBgkpvYYMCtjR0DaPLZLjqDY5/iHW/XMwjCuNv1uVS/zWYMQC1qPik+Ot7WqaREEEAiSg/pA6+iEXFbKzrwVg6Iwu61uqrT8Sqk4NFj+/44aPhUMONAj30ozXjWuVR4rGJU23a+7fkoN4nXNorkGkkxPWFEI8ogaWo6x4e4gPDQCHQEuayCadNwpa95HxDRGvfDtUa1QZaxo7ppN0RqHkjQBM1QywtIgqJj053sCYqiTjKADWzSqxKo/vrT/7pjAKZSkLolyNstTEKh3LxYQ0eVsLZk7BI2OdrWWO2a8vNiN8TbA2IUWurkm28sNZOtd5etcRcucIaE5hKhZVKwqYFCZuVau1Vk7ctOGSlctBaRbJ1ASxLLVVqbVWHMcoxk8ZdgZAS/uWZkRDrm7jASiwHTxQT/JBaT5sEhX/NRAMJ83g9HM9z277a1RawgpSQrX3aXS1tx4J804WCjUppOxfUQ0s7lQKTheWWysXmypm7FmbsWnDAXDnHeOExR9VrfhqizUoN9qpt/hoDYVpwVubQKwpI6PbnZ0ZCTIT7bMUc/0PHi4i4wCqUZ09COp3hOB4954F0Q52IhAwIpNq3QzQveaujQO7GIHJS0GU25XB0+f62zUd9IEyTtMERZgOOcpPrn54VCXur0smJMFtwAWvS2IAKL7vE2ZOQnAs5hCzw6iWvpQRb7cGQkdpoP9idFjKKTqpUIKSErz0bEmIihHiQkFrrDENCb3vJ7EmYxWnPiRmx28BpcceKQp2I0JyjsBc2ubz6bEiIzCXat4zyPPIfvWdbwiJhv/eeKnOjzT3ha4koNebARWqS7ignMGZ0VyDPkIRQC6sIQWgd1oJPQcI83k2ud+u2L42ueOsR0WoES+MBkZq9weoXPVUv7WPSSjFWADAbDNUgIsZ1VywxCxqd//AMSFhB/7bijpCiRPK3FZ+ChHQ6w3NuPOcKh1OdMGoRGv0h6m3eqtd81MZzFXiTkGWqAGB2Zz/i8LjuigUSOkHC7rkuYU3WUGLk9w6m0fQ3Jk9BwtF0JuBKqweW5ypEuPoEWMhR4Y7jiKJgFKKpAowZ3cdAE9Rl7I7Zo4yDjG+dfKhopWbnP8rC7s51CZGC+jgkR3gV0beMUgvE2V1UZMW2Z0Xfs/o6vMVZhfRCxsAxYKn3Ban1BqlBs6FQtcEQNSJGYyBY7Xag2gjDcjyR5PZWINmLLAMWuXsvjCpHqg+EqJ1zVyFliyDBkUfLaMWWljNGucZCx26rNJc9PHclrKD+19RqZyj5v6bUN2F12Xe5wdWetqLZkxDpzD7zij27N98KNSBYKkSY2lREql9wV07ZPP+ghVLCxvm5u17ONVbK2fly8ub5ZCtrkj2IUj/lvFCyab5063zZ9pfrrBeUmSklbpqPXuXmZLlwt1Lm9pfP71WutlxQaqpUbKKUvv3lg2ZK4JgtaVC0W6nTV5WIXHAl9M9btxpFOJ0qjL85RyWsybyTEvODrRFr7ENtFPghtXtn89OZXG63wLdt2xcml/fCRaaTkKXW5adyyFypzFSp0PjlOqsFKDQ5LARnXZX7g+DE44xpItV/dFkIMxhX71H63n4h3f2E/ULU1FguOO288LgduT1svaDBesEZarfWUgm7Jbtf/sFx4RGbBde9VQi28jF7vS1feaSEdOcJOuaohIiivg7JYZ75Y4LVZt0V7q/fax1fnzNbEtLpjNDth/NOKkTEQmK/6jSEIeXB2gPaUFuAXZZah7fynWCqlWEPaHvaki7c7zUKdunDMhgzC4cXvnzMeqXY72YuW/H/Ivp4MCWkv9G12B6Un3Bl7D/2a7OG4sMOz+rH3PSNF1L/y60umHjkkPChQICIR+inKCLnN9mvlgTO4UUFMhfETCczzviYCQkTwo+4WwnkkRAXQQV1bzn9Y6Toi2OiIw44BrwZNajHLAuD2pw7+fxb2TEjFl8FnnN4mYhQJkJV5GU/tQ1H7FXpD1Du9FYeDplooFhY/9toazinFxUYX3uTqISwI+O/3cUaQ8Q65mbJHy8hdEKyc/+GLVqYYWgGCUuTu+DEGdyfkqOb48MaYgMrI72L93vkBrqk+zqmILOFQ+NoLhZxTuYcR1O2o1m0zXbOZ2/bW5luuR20nAhbwBy4hwKpIlUvuy84YDy/2vzl7B3zC3fNT/j2pZu+ypCTaawoSAkN5q6E1Zl30uPO7tkeTN1p+ODkMBcmRTViLjxRTP4CCaSCeNApW3BREnmCE3Ao1CPH2z7JdQ8X8tsas2yMwrF1MIl2No+F73rZSQKcZbDBKiXG7yA3qFq4/7Ao/Ghi5AlonMY+JYs7Ex/0Q5T7qW3rzS45LyDCFxIhytOzX/m618KT9kpnnJVKjP73rJPSaUelkw5KfX4LidBJxooi/KVGG/25KyESGdc9vCifA4ep3+CDI9KCQUJEV5PNvoLQ2gBnKWzsyF9mDrMxYjmbc7zsEoPdsth+B6GKLPbHvPjLB5I6cGhcEIiT6E77KH2oOvJXSRE8yfgJD4bXVmcO1mQP5nC7ivlEvPupVttfELHzCbYKETMdbGSeyuQKJE6V4KoSsRQoy9P38cCROb9pttQU+89VCXOFrfCehtwRBMNs/gV+SA39U9rwrW3/dfn8w21wJngSpMriny9J6sCENxZFoQ1UgftSvyA+sxvd6HQmO+peenhvlqlR8nol8ccvJn4yHX9/MenT3wIU6BrJJy+KP/5Nwoe/iv/gV6KPfh3//guij3+d8OH/jPLBr8R/J1th9uAgM0H80YtpX6plWLlnRN3LjFDkY7eehAkSmmz22bVh7z5bEXVLJAszVrhnPgQrEl9LjPie/vqeckry5lfqxkjFvIFRCSPv5nNG8oTEznX//eu8ee/OnLfmzfvsty9+pbxw+/Jlm/V0zdat/cf//e03GurgP6oqG3W0P3/pd98t0nlzUkc5+cu8eXYfeRaJiTz2sGKfnPYkTJDw47c3sPYVisKPFYjaIBLtXhCsPvse5kK4I3yO0V8hVKT3psdcTdt/K511O487ZPvmhr/Pm7f+xRnzz9/M+/J3LwR9/r7fx296vPVq9LfrjZdrOf55jctfXwHub/7ReJmm1/uvf/oCs6OcfDxvnteX3vn8oXRWb1roTUU9v/AJmSChLO7s90XkTePUPawPTg4zFtKWWZRQ1lsi6cyPv16QcONger/9u//FYDGGb1o+/zUp4WcvzNukMX+j2ktGSzU2qv7uq/m/wnar9oJtOgu3aClt1lJC62e/Ii0B4wjTgrPy2+BantGP88xPuF6a3D2j+WKWmCAh0hlGMw35xUXE97N3EyLAWFSmk78t31BMuHy04aOZS/jV/77wr9/+n3+/9EtsaYX+8T/zvl7wG6iIGpRR+PKlX8Lsm4Vk5Re/+8X6GaqIswrZuu9ICUGf6lzQD0yQEKfFaKZ56LpwlqgvJJw//HamEkIw/0/e9v3oDfe3XvX/9J197/9l1xL1b5R/6/3BXwM+fWeHntonv5zn/Po6nw//hrhq8/uV2O5crAaXZRxnanBWwVs8Dxc9/EL/uZggIaNtDITWWf2AbTz1RYT92/9C7vDZL2fAp7+YZ/PKUo+3fm/3+2X2r66w/f3yr5Ve2KY93/E1A8s1euYGWt+p/c7hVX2rNXpOfza0Xrt4o+qLG1V+g8DIOM7U4KwCNjgjTjDO+edFPgmz7/JCambvPtLx1OUPR5qGf6O+ePMivc26M+A7nUUbtbQ3LdLdoKn1nbbubsNVln/442bdxVv0lhgbGNi89qftS5dv0cPu4h3LlpNdFumO7z49i/Q2aC1N8MiozZuVhOCxkUtCZDGcgEOz9609g6qsofK0noOpN8tnwsHUbpIUbMlyWXLXAUkHuZsyoUzujtowjzA1sCefK5Y1dCiNecI/L3JJiPgZ6V3i75T2dCREMlyZPjDnoP59adKp/vzIJSGUC/XICXHPfloSPmcGyCshXBCO+BTSmefMFHklRC7DC66um53/L3zOkyCXhEhnXCziJJGNNYr+9bXnPDlySViVMWC3OzKLdx4FRpPCqaAePTVnYZztXGB6CStkfaUpXeTDE5Jm8PCEx6Ystbs0pRN/ce7RiXNjnO1cYIKEiJP0t0jjLzfUZPMv2O2mH57woKfCwR8tT7uZFnFFxuqSRXTOPbpSw9ug5VzzxQkSJkc3ZwsulEjacZa15GPMyS+bjhcSksgTe63jj+SRz19j9FcgODiW5LLIzrzokTw2kRNNZEfNCXAmOB+clYzVfSC5c05L6GzOwZxH3vlixHI0jfGwEvo7S+MCK+1Nolz38MiPM8iHx5C/PwVpsUWCOuq4ox/bP9F7uy9hRx57WBbanuJ7QBpcLgsq+3mRBh9M8SuRBreRZ8XqmusSIvOsSh8oS+nOS7icxj4lCK2P8CrCin79Rzu3f+NmvzvKelcYtm57eL6OKeGe+dygqqSoxiz++aLE6wdTe6Bl7bibZe7faUjdJvPg+f3kZxzklzVkuCaFHwOV5ak3IWFhHCH1q+lp5A1fSL93TjoFxEXZyHkZCsPnZMPYvSADVJlkvOVjM3xedudsQppvNtzxGZCQqsJoUneBZpKPDIYSDXkEPLJYcgOVheJr6XFnE8KPRPuWBrlm7LMVOZvH2lOOC+yMIxzN2G6WfC+7xAAXWdjePJhxg6oTwo5Aaer5/S05wtZ8URskL0lqL03uKqM8m/o1TlLCQ2k9OZw+ge9Vp002w5UWxKGdxCHjR1Jh3JW3416ZEVFlPHKQ3A4U7+otorpUTDJ+bMp3EZU7sgLTs6OfGQknUJ0xCM1sjSNqqAd6k9KST4MeGnM10nEzBuCCUAXumBLzA3njaEAFy6sw2C0TzuppK4KoUNrRlI2AjECNo9kas0YxwpZ8oj/qcQWgZs8mzrtvbOUF2w8n/4V8hFoi9WCmh5JuWOepk2mlUeKk9b2vLgpJpmrFDlrFjlpFDlqlzlrDsJFM6gWSDR5O0iRLIF5OpBrwbPdDwlz2IK4zKrQ8eBz4z840EkKk/XvzApylh6f8MWA6DELL6ofdvk2/Z9TDs+lPig+m9ZSmdGOVAueGZxeI2vITroBswXlJ6CUf60qHzduGpX8jkgyJpLUPIXktkbLuQrRBU9CKGu9lx/yWo1DmugTbEwEr6ryXnQpZ2RKufy+RsmT0TVl3U7gaXS5HG/YIVnfErerkktzgGA6K1hDJ65j2klUjsj9H2G/f8U1EmFMddR9sFfKDucM0EmLo4Rkp0T8o6nOZ+8/vJ8M1FbFpMDuSN/BXSG9lRHcX8QiJR+6g5JVHSgiS13ZzV91LXENI1xFp64jUdaOFMVDD6EIjXXfAZUmKxaJce72Y7Zp8I22Uo7dpScx0ToesJA/CsIeEqa+JAyw+/7uV084UD+t4TBNziqkkRMxEbLTcEQr3esJsUx6gK5WRthdyiQy/gwPwIYkBIVnzSEgPowr0lnRNqoZmzIxB8tquOMObXMNewaorMQbH/JbdYBt0cw07Yw1vC1aRB2HYJxoS0ldCdtlLQvoKucMIJEgOxgLMXGAqCXGufo6pCv2Oaeync8lgO3YSo4lr9lClrDeX0xfnfcnhW5N7KX+aRsL7DItXE6lrb/NXXYxYOYKapDUj8M6JNg9AU/J9UteSQHiUafkndySf9ayf65eSyyGk4Z3PUjqDsUa6aLrFr0h8nZ7AHgO8Wwg2dmM/yiVJHeRTnlnHOf6H9u/NxSXiaZOARaeTGQd5r91uluWm2Hfe2CIIsRtOep1KKFZPReqalv0rCh10xabamdaLJGba5e6L8+11a/YuIWRrmcaPCZnmpO8TZj0TGenz1zP6GpXw+esZfs2b9/8A1iNEbXOMN/4AAAAASUVORK5CYII=