mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-11 22:31:55 +00:00
Implemented gensky and fixed executable flag error as mentioned by Manu in #5033
This commit is contained in:
@@ -19,6 +19,15 @@
|
|||||||
import bpy
|
import bpy
|
||||||
from . import ui, prop, operator
|
from . import ui, prop, operator
|
||||||
|
|
||||||
|
import stat
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
import pyradiance
|
||||||
|
|
||||||
|
def get_pyradiance_path():
|
||||||
|
return importlib.util.find_spec('pyradiance').submodule_search_locations[0]
|
||||||
|
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
operator.ExportOBJ,
|
operator.ExportOBJ,
|
||||||
@@ -38,6 +47,12 @@ classes = (
|
|||||||
def register():
|
def register():
|
||||||
bpy.types.Scene.radiance_exporter_properties = bpy.props.PointerProperty(type=prop.RadianceExporterProperties)
|
bpy.types.Scene.radiance_exporter_properties = bpy.props.PointerProperty(type=prop.RadianceExporterProperties)
|
||||||
bpy.types.Scene.BIMSolarProperties = bpy.props.PointerProperty(type=prop.BIMSolarProperties)
|
bpy.types.Scene.BIMSolarProperties = bpy.props.PointerProperty(type=prop.BIMSolarProperties)
|
||||||
|
pyradiance_path = Path(get_pyradiance_path())
|
||||||
|
bin_path = pyradiance_path / "bin"
|
||||||
|
if bin_path.exists():
|
||||||
|
for file in bin_path.iterdir():
|
||||||
|
if file.is_file():
|
||||||
|
file.chmod(file.stat().st_mode | stat.S_IEXEC)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
|
|||||||
@@ -5,6 +5,23 @@
|
|||||||
"Black Ceiling 2": "void plastic black_ceiling\n0\n0\n5 0.1116 0.1085 0.0938 0.0000 0.0000",
|
"Black Ceiling 2": "void plastic black_ceiling\n0\n0\n5 0.1116 0.1085 0.0938 0.0000 0.0000",
|
||||||
"Plastic Ceiling Vent E14 526": "void plastic plastic_ceiling_vent_e14_526\n0\n0\n5 0.7384 0.7195 0.6540 0.0110 0.0500",
|
"Plastic Ceiling Vent E14 526": "void plastic plastic_ceiling_vent_e14_526\n0\n0\n5 0.7384 0.7195 0.6540 0.0110 0.0500",
|
||||||
"Specular Reflective Ceiling Panels": "void plastic specular_reflective_ceiling_panels\n0\n0\n5 0.7708 0.7673 0.6819 0.0741 0.0500"
|
"Specular Reflective Ceiling Panels": "void plastic specular_reflective_ceiling_panels\n0\n0\n5 0.7708 0.7673 0.6819 0.0741 0.0500"
|
||||||
|
},
|
||||||
|
"Door": {
|
||||||
|
"Wooden Door": "void plastic wooden_door\n0\n0\n5 0.6164 0.4257 0.2156 0.0185 0.2000",
|
||||||
|
"Wooden Door 2": "void plastic wooden_door_2\n0\n0\n5 0.0403 0.0388 0.0406 0.0121 0.2000",
|
||||||
|
"White Wooden Door": "void plastic white_wooden_door\n0\n0\n5 0.7893 0.7502 0.6413 0.0080 0.2000",
|
||||||
|
"Off White Door": "void plastic off_white_door\n0\n0\n5 0.8607 0.8611 0.7852 0.0258 0.2000",
|
||||||
|
"Bedroom Door": "void plastic bedroom_door\n0\n0\n5 0.2508 0.0782 0.0111 0.0279 0.2000"
|
||||||
|
},
|
||||||
|
"Floor": {
|
||||||
|
"Light Blue Ceramic": "void plastic light_blue_ceramic\n0\n0\n5 0.7477 0.7776 0.7807 0.0323 0.1000",
|
||||||
|
"Light Grey Ceramic": "void plastic light_grey_ceramic\n0\n0\n5 0.6386 0.5941 0.4982 0.0106 0.2000",
|
||||||
|
"Purple Carpet": "void plastic purple_carpet\n0\n0\n5 0.0425 0.0179 0.0371 0.0001 0.3000"
|
||||||
|
},
|
||||||
|
"Wall": {
|
||||||
|
"Dirty Dark Pink Painted Wall": "void plastic dirty_dark_pink_painted_wall\n0\n0\n5 0.3533 0.1751 0.1690 0.0000 0.2000",
|
||||||
|
"Blue Green Painted Walls": "void plastic blue_green_painted_walls\n0\n0\n5 -0.0013 0.2092 0.2601 0.0140 0.2000",
|
||||||
|
"Red Painted Wall": "void plastic red_painted_wall\n0\n0\n5 0.4621 0.0156 0.0091 0.0396 0.2000"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -71,9 +71,6 @@ class ExportOBJ(bpy.types.Operator):
|
|||||||
ifc_file_path = context.scene.radiance_exporter_properties.ifc_file
|
ifc_file_path = context.scene.radiance_exporter_properties.ifc_file
|
||||||
ifc_file = ifcopenshell.open(ifc_file_path)
|
ifc_file = ifcopenshell.open(ifc_file_path)
|
||||||
|
|
||||||
# for material in ifc_file.by_type("IfcMaterial"):
|
|
||||||
# self.report({'INFO'}, f"Material: {material.Name}, ID: {material.id()}")
|
|
||||||
|
|
||||||
obj_file_path = os.path.join(output_dir, "model.obj")
|
obj_file_path = os.path.join(output_dir, "model.obj")
|
||||||
mtl_file_path = os.path.join(output_dir, "model.mtl")
|
mtl_file_path = os.path.join(output_dir, "model.mtl")
|
||||||
|
|
||||||
@@ -140,12 +137,17 @@ class RadianceRender(bpy.types.Operator):
|
|||||||
|
|
||||||
obj_file_path = os.path.join(output_dir, "model.obj")
|
obj_file_path = os.path.join(output_dir, "model.obj")
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
sun_props = context.scene.BIMSolarProperties
|
||||||
=======
|
|
||||||
sky_file_path = os.path.join(output_dir, "sky.rad")
|
sky_file_path = os.path.join(output_dir, "sky.rad")
|
||||||
|
latitude = sun_props.latitude
|
||||||
|
longitude = sun_props.longitude
|
||||||
|
timezone = sun_props.timezone
|
||||||
|
month = sun_props.month
|
||||||
|
day = sun_props.day
|
||||||
|
hour = sun_props.hour
|
||||||
|
minute = sun_props.minute
|
||||||
|
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
camera = self.get_active_camera(context)
|
camera = self.get_active_camera(context)
|
||||||
if camera is None:
|
if camera is None:
|
||||||
self.report({"ERROR"}, "No active camera found in the scene. Please add a camera and set it as active.")
|
self.report({"ERROR"}, "No active camera found in the scene. Please add a camera and set it as active.")
|
||||||
@@ -154,60 +156,33 @@ class RadianceRender(bpy.types.Operator):
|
|||||||
# Get camera position and direction
|
# Get camera position and direction
|
||||||
camera_position, camera_direction = self.get_camera_data(camera)
|
camera_position, camera_direction = self.get_camera_data(camera)
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
# Material processing
|
|
||||||
# style = []
|
|
||||||
|
|
||||||
# with open(obj_file_path, "r") as obj_file:
|
dt = datetime(2024, month, day, hour, minute)
|
||||||
# for line in obj_file:
|
|
||||||
# if line.startswith("usemtl"):
|
|
||||||
# l = line.strip().split(" ")
|
|
||||||
# style.append(l[1])
|
|
||||||
|
|
||||||
=======
|
|
||||||
|
|
||||||
dt = datetime(2024, 7, 29, 12, 0) # July 29, 2024, at 12:00 PM
|
|
||||||
latitude = 40.7128 # New York City latitude
|
|
||||||
longitude = -74.0060 # New York City longitude
|
|
||||||
timezone = -4 # Eastern Daylight Time (EDT)
|
|
||||||
|
|
||||||
sky_description = pr.gensky(
|
sky_description = pr.gensky(
|
||||||
dt=dt,
|
dt=dt,
|
||||||
latitude=latitude,
|
latitude=latitude,
|
||||||
longitude=longitude,
|
longitude=longitude,
|
||||||
timezone=timezone,
|
timezone=timezone,
|
||||||
sunny_with_sun=True, # Assuming a sunny day with visible sun
|
sunny_with_sun=True,
|
||||||
ground_reflectance=0.2, # Typical ground reflectance value
|
ground_reflectance=0.2,
|
||||||
turbidity=3.0 # Clear sky condition
|
turbidity=3.0
|
||||||
)
|
)
|
||||||
|
|
||||||
sky_description_str = sky_description.decode('utf-8')
|
sky_description_str = sky_description.decode('utf-8')
|
||||||
|
|
||||||
# Print the generated sky description
|
|
||||||
print(sky_description_str)
|
|
||||||
|
|
||||||
with open(sky_file_path, 'w') as f:
|
with open(sky_file_path, 'w') as f:
|
||||||
f.write(sky_description_str)
|
f.write(sky_description_str)
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
# Check if json file is empty or not
|
|
||||||
props = context.scene.radiance_exporter_properties
|
props = context.scene.radiance_exporter_properties
|
||||||
|
|
||||||
if props.use_json_file:
|
if props.use_json_file:
|
||||||
# Load data from JSON file
|
|
||||||
with open(props.json_file, "r") as file:
|
with open(props.json_file, "r") as file:
|
||||||
data = json.load(file)
|
data = json.load(file)
|
||||||
else:
|
else:
|
||||||
# Use in-UI material mappings
|
|
||||||
data = props.get_mappings_dict()
|
data = props.get_mappings_dict()
|
||||||
<<<<<<< Updated upstream
|
|
||||||
|
|
||||||
print(data)
|
|
||||||
|
|
||||||
=======
|
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
# Create materials.rad file
|
|
||||||
materials_file = os.path.join(output_dir, "materials.rad")
|
materials_file = os.path.join(output_dir, "materials.rad")
|
||||||
with open(materials_file, "w") as file:
|
with open(materials_file, "w") as file:
|
||||||
file.write("void plastic white\n0\n0\n5 0.8 0.8 0.8 0 0\n")
|
file.write("void plastic white\n0\n0\n5 0.8 0.8 0.8 0 0\n")
|
||||||
@@ -221,10 +196,6 @@ class RadianceRender(bpy.types.Operator):
|
|||||||
for style_id, radiance_material in data.items():
|
for style_id, radiance_material in data.items():
|
||||||
print(style_id, radiance_material)
|
print(style_id, radiance_material)
|
||||||
file.write("inherit alias " + style_id + " " + data.get(style_id, "white") + "\n")
|
file.write("inherit alias " + style_id + " " + data.get(style_id, "white") + "\n")
|
||||||
# file.write(f"inherit alias {style_id} {radiance_material}\n")
|
|
||||||
# for i in set(ifc_materials):
|
|
||||||
# print(i)
|
|
||||||
# file.write("inherit alias " + i + " " + data.get(i, "white") + "\n")
|
|
||||||
|
|
||||||
self.report({"INFO"}, "Exported Materials Rad file to: {}".format(materials_file))
|
self.report({"INFO"}, "Exported Materials Rad file to: {}".format(materials_file))
|
||||||
|
|
||||||
@@ -235,7 +206,6 @@ class RadianceRender(bpy.types.Operator):
|
|||||||
self.report({"INFO"}, "obj2mesh output: {}".format(mesh_file_path))
|
self.report({"INFO"}, "obj2mesh output: {}".format(mesh_file_path))
|
||||||
scene_file = os.path.join(output_dir, "scene.rad")
|
scene_file = os.path.join(output_dir, "scene.rad")
|
||||||
with open(scene_file, "w") as file:
|
with open(scene_file, "w") as file:
|
||||||
# file.write("void mesh model\n1 " + rtm_file_path + "\n0\n0\n")
|
|
||||||
file.write('void mesh model\n1 "' + rtm_file_path + '"\n0\n0\n')
|
file.write('void mesh model\n1 "' + rtm_file_path + '"\n0\n0\n')
|
||||||
|
|
||||||
self.report({"INFO"}, "Exported Scene file to: {}".format(scene_file))
|
self.report({"INFO"}, "Exported Scene file to: {}".format(scene_file))
|
||||||
@@ -248,7 +218,7 @@ class RadianceRender(bpy.types.Operator):
|
|||||||
|
|
||||||
scene.add_material(material_path)
|
scene.add_material(material_path)
|
||||||
scene.add_surface(scene_path)
|
scene.add_surface(scene_path)
|
||||||
scene.add_sky(sky_file_path)
|
scene.add_source(sky_file_path)
|
||||||
|
|
||||||
aview = pr.View(position=camera_position, direction=camera_direction)
|
aview = pr.View(position=camera_position, direction=camera_direction)
|
||||||
scene.add_view(aview)
|
scene.add_view(aview)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import datetime
|
|||||||
import blenderbim.tool as tool
|
import blenderbim.tool as tool
|
||||||
from math import radians, pi
|
from math import radians, pi
|
||||||
from mathutils import Euler, Vector, Matrix, Quaternion
|
from mathutils import Euler, Vector, Matrix, Quaternion
|
||||||
from bpy.props import IntProperty, StringProperty, EnumProperty, FloatProperty, FloatVectorProperty, BoolProperty
|
from bpy.props import IntProperty, StringProperty, EnumProperty, FloatProperty, FloatVectorProperty, BoolProperty, CollectionProperty
|
||||||
from bpy.types import PropertyGroup
|
from bpy.types import PropertyGroup
|
||||||
from blenderbim.bim.module.light.data import SolarData
|
from blenderbim.bim.module.light.data import SolarData
|
||||||
from blenderbim.bim.module.light.decorator import SolarDecorator
|
from blenderbim.bim.module.light.decorator import SolarDecorator
|
||||||
@@ -182,6 +182,7 @@ class RadianceExporterProperties(PropertyGroup):
|
|||||||
)
|
)
|
||||||
|
|
||||||
material_mappings: bpy.props.CollectionProperty(type=bpy.types.PropertyGroup, name="Material Mappings")
|
material_mappings: bpy.props.CollectionProperty(type=bpy.types.PropertyGroup, name="Material Mappings")
|
||||||
|
# material_mappings: CollectionProperty(type=MaterialMapping)
|
||||||
|
|
||||||
should_load_from_memory: BoolProperty(
|
should_load_from_memory: BoolProperty(
|
||||||
name="Load from Memory",
|
name="Load from Memory",
|
||||||
|
|||||||
Reference in New Issue
Block a user