Add tree species to tree library

This commit is contained in:
Dion Moult
2024-03-04 17:51:48 +11:00
parent 167c456223
commit d7def8291e
3 changed files with 1838 additions and 48 deletions
File diff suppressed because it is too large Load Diff
@@ -16,7 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import os
import bpy
import csv
import random
import ifcopenshell
import ifcopenshell.api
@@ -30,6 +32,10 @@ from mathutils import Vector, Matrix
from random import uniform
# When run from Blender
BLEND_DIR = os.path.dirname(bpy.data.filepath)
OUT_PATH = os.path.join(BLEND_DIR, "..", "blenderbim", "bim", "data", "libraries", "IFC4 Landscape Library.ifc")
SimpleTreeParams = namedtuple("SimpleTreeParams", "plant_height crown_diameter trunk_diameter")
LowPolyTreeParams = namedtuple(
"LowPolyTreeParams", "plant_height crown_diameter crown_max_loc crown_taper trunk_height trunk_diameter random_seed"
@@ -301,7 +307,7 @@ tree_presets = {
class LibraryGenerator:
def generate(self, library_name, output_filename="IFC4 EU Steel.ifc"):
def generate(self, library_name, output_filename):
ifcopenshell.api.pre_listeners = {}
ifcopenshell.api.post_listeners = {}
@@ -368,7 +374,7 @@ class LibraryGenerator:
representations[rep_key] = rep_obj.name
self.create_type("IfcGeographicElementType", obj.name, representations)
# Auto generated trees
# Auto generated generic trees
self.builder = ShapeBuilder(self.file)
builder = self.builder
@@ -401,6 +407,21 @@ class LibraryGenerator:
"IfcGeographicElementType", tree_data.tree_name, **self.get_representations(tree_geometry)
)
# From tree species table
with open(os.path.join(BLEND_DIR, "tree_species.csv"), 'r') as csvfile:
reader = csv.reader(csvfile)
for i, row in enumerate(reader):
if i == 0:
continue
preset = tree_presets.get(row[0])
data = [float(x) for x in row[2:]]
preset_data = preset.preset_class(*data)._asdict()
tree_geometry = preset.generator(builder, **preset_data)
self.create_explicit_type(
"IfcGeographicElementType", row[1], **self.get_representations(tree_geometry)
)
self.file.write(output_filename)
def get_representations(self, generated_geometry: GeneratedGeometry):
@@ -464,4 +485,4 @@ class LibraryGenerator:
if __name__ == "__main__":
LibraryGenerator().generate("Landscape Assets Library", output_filename="IFC4 Landscape Library.ifc")
LibraryGenerator().generate("Landscape Assets Library", output_filename=OUT_PATH)
+27
View File
@@ -0,0 +1,27 @@
"f","name","PlantHeight","CrownDiameter","CrownMaxLoc","CrownTaper","TrunkHeight","TrunkDiameter","RandomSeed"
"low_poly","Apple",8,9,0.5,0.2,1.5,0.2,1
"low_poly","Beech",30,20,0,0.4,3,0.75,2
"low_poly","Cedar",25,17,0,1,1,0.625,3
"low_poly","Dogwood",8,6,1,0.9,0.3,0.2,4
"low_poly","Elm",17,12,0.6,0.7,2,0.425,5
"low_poly","Fir",27,15,0.1,1,0.1,0.675,6
"low_poly","Ginkgo",25,9,0.5,0.6,7,0.625,7
"low_poly","Horsechesnut",30,23,0.5,0.2,3,0.75,8
"low_poly","Ilex",26,13,0.4,0.3,12,0.65,9
"low_poly","Juniper",30,15,0.7,1,1,0.75,10
"low_poly","Kentucky Coffeetree",20,10,0.5,0,6,0.5,11
"low_poly","Linden",28,18,0.3,0.2,3,0.7,12
"low_poly","Mulberry",15,12,0.5,0.5,2,0.375,13
"low_poly","Nannybery",5,4,0.7,0.8,1,0.125,14
"low_poly","Oak",25,13,0.5,0.5,6,0.625,15
"low_poly","Pine",27,9,0.5,0.2,14,0.675,16
"low_poly","Quaking Aspen",13,4,0.5,0.3,4,0.325,17
"low_poly","Redwood",90,24,0.1,0.8,8,2.25,18
"low_poly","Sycamore",35,22,0.2,0.6,5,0.875,19
"low_poly","Tree of Heaven",20,15,0.2,0.8,3,0.5,20
"low_poly","Umbrella Tree",8,5,0.4,0.5,2,0.2,21
"low_poly","Viburnum",4,3,0.8,0.7,0.2,0.1,22
"low_poly","Weeping Willow",13,12,0.9,0.3,1,0.325,23
"low_poly","Zanthoxylum",10,8,0.4,0.6,2,0.25,24
"low_poly","Yellowwood",25,20,0.2,0.3,5,0.625,25
"low_poly","Zelkova",12,8,0.4,0.4,2,0.3,26
1 f name PlantHeight CrownDiameter CrownMaxLoc CrownTaper TrunkHeight TrunkDiameter RandomSeed
2 low_poly Apple 8 9 0.5 0.2 1.5 0.2 1
3 low_poly Beech 30 20 0 0.4 3 0.75 2
4 low_poly Cedar 25 17 0 1 1 0.625 3
5 low_poly Dogwood 8 6 1 0.9 0.3 0.2 4
6 low_poly Elm 17 12 0.6 0.7 2 0.425 5
7 low_poly Fir 27 15 0.1 1 0.1 0.675 6
8 low_poly Ginkgo 25 9 0.5 0.6 7 0.625 7
9 low_poly Horsechesnut 30 23 0.5 0.2 3 0.75 8
10 low_poly Ilex 26 13 0.4 0.3 12 0.65 9
11 low_poly Juniper 30 15 0.7 1 1 0.75 10
12 low_poly Kentucky Coffeetree 20 10 0.5 0 6 0.5 11
13 low_poly Linden 28 18 0.3 0.2 3 0.7 12
14 low_poly Mulberry 15 12 0.5 0.5 2 0.375 13
15 low_poly Nannybery 5 4 0.7 0.8 1 0.125 14
16 low_poly Oak 25 13 0.5 0.5 6 0.625 15
17 low_poly Pine 27 9 0.5 0.2 14 0.675 16
18 low_poly Quaking Aspen 13 4 0.5 0.3 4 0.325 17
19 low_poly Redwood 90 24 0.1 0.8 8 2.25 18
20 low_poly Sycamore 35 22 0.2 0.6 5 0.875 19
21 low_poly Tree of Heaven 20 15 0.2 0.8 3 0.5 20
22 low_poly Umbrella Tree 8 5 0.4 0.5 2 0.2 21
23 low_poly Viburnum 4 3 0.8 0.7 0.2 0.1 22
24 low_poly Weeping Willow 13 12 0.9 0.3 1 0.325 23
25 low_poly Zanthoxylum 10 8 0.4 0.6 2 0.25 24
26 low_poly Yellowwood 25 20 0.2 0.3 5 0.625 25
27 low_poly Zelkova 12 8 0.4 0.4 2 0.3 26