mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 17:58:20 +00:00
Revert "Refactor BIM_PT_gis added files"
This reverts commit 445e77bac0.
This commit is contained in:
@@ -1,112 +0,0 @@
|
||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
|
||||
#
|
||||
# This file is part of BlenderBIM Add-on.
|
||||
#
|
||||
# BlenderBIM Add-on 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.
|
||||
#
|
||||
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# ############################################################################ #
|
||||
|
||||
import blenderbim.tool as tool
|
||||
|
||||
def refresh():
|
||||
GeoreferenceData.is_loaded = False
|
||||
|
||||
class GeoreferenceData:
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
cls.data = {
|
||||
"map_conversion" : cls.map_conversion(),
|
||||
"projected_crs" : cls.projected_crs(),
|
||||
"true_north" : cls.true_north(),
|
||||
}
|
||||
cls.is_loaded = True
|
||||
|
||||
@classmethod
|
||||
def is_georeferenced(cls):
|
||||
ifc = tool.Ifc.get()
|
||||
if ifc.schema == "IFC2X3":
|
||||
return
|
||||
|
||||
map_conversions = []
|
||||
for context in ifc.by_type("IfcGeometricRepresentationContext", include_subtypes=False):
|
||||
if not context.HasCoordinateOperation:
|
||||
continue
|
||||
map_conversions.append(context)
|
||||
|
||||
return True if map_conversions else False
|
||||
|
||||
@classmethod
|
||||
def map_conversion(cls):
|
||||
ifc = tool.Ifc.get()
|
||||
map_conversion_v = {}
|
||||
|
||||
if ifc.schema == "IFC2X3":
|
||||
return
|
||||
|
||||
for context in ifc.by_type("IfcGeometricRepresentationContext", include_subtypes=False):
|
||||
if not context.HasCoordinateOperation:
|
||||
continue
|
||||
|
||||
map_conversion_v = context.HasCoordinateOperation[0].get_info()
|
||||
map_conversion_v["SourceCRS"] = map_conversion_v["SourceCRS"].id()
|
||||
map_conversion_v["TargetCRS"] = map_conversion_v["TargetCRS"].id()
|
||||
|
||||
break
|
||||
|
||||
return map_conversion_v
|
||||
|
||||
@classmethod
|
||||
def projected_crs(cls):
|
||||
ifc = tool.Ifc.get()
|
||||
projected_crs = {}
|
||||
|
||||
if ifc.schema == "IFC2X3":
|
||||
return
|
||||
|
||||
for context in ifc.by_type("IfcGeometricRepresentationContext", include_subtypes=False):
|
||||
if not context.HasCoordinateOperation:
|
||||
continue
|
||||
|
||||
projected_crs = context.HasCoordinateOperation[0].TargetCRS.get_info()
|
||||
if projected_crs["MapUnit"]:
|
||||
projected_crs["MapUnit"] = map_conversion.TargetCRS.MapUnit.get_info()
|
||||
|
||||
if projected_crs["MapUnit"]:
|
||||
projected_crs["MapUnit"] = map_conversion.TargetCRS.MapUnit.get_info()
|
||||
break
|
||||
|
||||
return projected_crs
|
||||
|
||||
@classmethod
|
||||
def true_north(cls):
|
||||
ifc = tool.Ifc.get()
|
||||
true_north = {}
|
||||
|
||||
if ifc.schema == "IFC2X3":
|
||||
return
|
||||
|
||||
for context in ifc.by_type("IfcGeometricRepresentationContext", include_subtypes=False):
|
||||
if not context.TrueNorth:
|
||||
continue
|
||||
true_north = context.TrueNorth.DirectionRatios
|
||||
break
|
||||
|
||||
return true_north
|
||||
|
||||
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
|
||||
#
|
||||
# This file is part of BlenderBIM Add-on.
|
||||
#
|
||||
# BlenderBIM Add-on 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.
|
||||
#
|
||||
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import bpy
|
||||
import blenderbim.bim.helper
|
||||
import ifcopenshell
|
||||
|
||||
from blenderbim.bim.module.georeference.data import GeoreferenceData
|
||||
|
||||
def add_georeferencing(ifc):
|
||||
ifc.run("georeference.add_georeferencing")
|
||||
|
||||
def enable_editing_georeferencing(georeference): #TODO simplify this function
|
||||
georeference.clear_projected_crs()
|
||||
|
||||
blenderbim.bim.helper.import_attributes(
|
||||
"IfcProjectedCRS",
|
||||
bpy.context.scene.BIMGeoreferenceProperties.projected_crs,
|
||||
GeoreferenceData.data["projected_crs"],
|
||||
georeference.import_projected_crs_attributes,
|
||||
)
|
||||
|
||||
georeference.clear_map_conversion()
|
||||
|
||||
blenderbim.bim.helper.import_attributes(
|
||||
"IfcMapConversion",
|
||||
bpy.context.scene.BIMGeoreferenceProperties.map_conversion,
|
||||
GeoreferenceData.data["map_conversion"],
|
||||
georeference.import_map_conversion_attributes,
|
||||
)
|
||||
|
||||
bpy.context.scene.BIMGeoreferenceProperties.has_true_north = bool(GeoreferenceData.data["true_north"])
|
||||
|
||||
if GeoreferenceData.data["true_north"]:
|
||||
bpy.context.scene.BIMGeoreferenceProperties.true_north_abscissa = str(GeoreferenceData.data["true_north"][0])
|
||||
bpy.context.scene.BIMGeoreferenceProperties.true_north_ordinate = str(GeoreferenceData.data["true_north"][1])
|
||||
|
||||
bpy.context.scene.BIMGeoreferenceProperties.is_editing = True
|
||||
|
||||
def remove_georeferencing(ifc):
|
||||
ifc.run("georeference.remove_georeferencing")
|
||||
|
||||
def edit_georeferencing(ifc, georeference):
|
||||
props = bpy.context.scene.BIMGeoreferenceProperties
|
||||
ifc_file = georeference.get_file()
|
||||
|
||||
projected_crs = blenderbim.bim.helper.export_attributes(props.projected_crs, georeference.export_crs_attributes)
|
||||
map_conversion = blenderbim.bim.helper.export_attributes(props.map_conversion, georeference.export_map_attributes)
|
||||
|
||||
true_north = None
|
||||
# if props.has_true_north:
|
||||
# try:
|
||||
# true_north = [float(props.true_north_abscissa), float(props.true_north_ordinate)]
|
||||
# except ValueError:
|
||||
# self.report({"ERROR"}, "True North Abscissa and Ordinate expect a number")
|
||||
|
||||
ifcopenshell.api.run( #TODO use ifc.run
|
||||
"georeference.edit_georeferencing",
|
||||
ifc_file,
|
||||
**{
|
||||
"map_conversion": map_conversion,
|
||||
"projected_crs": projected_crs,
|
||||
"true_north": true_north,
|
||||
}
|
||||
)
|
||||
|
||||
bpy.ops.bim.disable_editing_georeferencing()
|
||||
|
||||
def disable_editing_georeferencing(georeference):
|
||||
georeference.set_false_is_editing()
|
||||
|
||||
def set_ifc_grid_north(georeference):
|
||||
georeference.set_ifc_grid_north()
|
||||
|
||||
def set_blender_grid_north(georeference):
|
||||
georeference.set_blender_grid_north()
|
||||
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
|
||||
#
|
||||
# This file is part of BlenderBIM Add-on.
|
||||
#
|
||||
# BlenderBIM Add-on 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.
|
||||
#
|
||||
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
import bpy
|
||||
import json
|
||||
import blenderbim.core.tool
|
||||
import blenderbim.tool as tool
|
||||
import ifcopenshell
|
||||
|
||||
from ifcopenshell.api.unit.data import Data as UnitData
|
||||
|
||||
class Georeference(blenderbim.core.tool.Georeference):
|
||||
|
||||
@classmethod
|
||||
def clear_projected_crs(cls):
|
||||
bpy.context.scene.BIMGeoreferenceProperties.projected_crs.clear()
|
||||
|
||||
@classmethod
|
||||
def clear_map_conversion(cls):
|
||||
bpy.context.scene.BIMGeoreferenceProperties.map_conversion.clear()
|
||||
|
||||
@classmethod
|
||||
def get_file(cls):
|
||||
return tool.Ifc.get()
|
||||
|
||||
@classmethod
|
||||
def import_projected_crs_attributes(cls, name, prop, data):
|
||||
if name == "MapUnit":
|
||||
new = bpy.context.scene.BIMGeoreferenceProperties.projected_crs.add()
|
||||
new.name = name
|
||||
new.data_type = "enum"
|
||||
new.is_null = data[name] is None
|
||||
new.is_optional = True
|
||||
new.enum_items = json.dumps(
|
||||
{u["id"]: u["Name"] for u in UnitData.units.values() if u["UnitType"] == "LENGTHUNIT"}
|
||||
)
|
||||
if data["MapUnit"]:
|
||||
new.enum_value = str(data["MapUnit"]["id"])
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def import_map_conversion_attributes(cls, name, prop, data):
|
||||
if name not in ["SourceCRS", "TargetCRS"]:
|
||||
# Enforce a string data type to prevent data loss in single-precision Blender props
|
||||
prop.data_type = "string"
|
||||
prop.string_value = "" if prop.is_null else str(data[name])
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def export_crs_attributes(cls, attributes, prop,):
|
||||
ifc_file = tool.Ifc.get()
|
||||
if not prop.is_null and prop.name == "MapUnit":
|
||||
attributes[prop.name] = ifc_file.by_id(int(prop.enum_value))
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def export_map_attributes(cls, attributes, prop):
|
||||
if not prop.is_null and prop.data_type == "string":
|
||||
# We store our floats as string to prevent single precision data loss
|
||||
attributes[prop.name] = float(prop.string_value)
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def set_false_is_editing(cls):
|
||||
props = bpy.context.scene.BIMGeoreferenceProperties
|
||||
props.is_editing = False
|
||||
|
||||
@classmethod
|
||||
def set_ifc_grid_north(cls):
|
||||
x_angle = -bpy.context.scene.sun_pos_properties.north_offset
|
||||
bpy.context.scene.BIMGeoreferenceProperties.map_conversion.get("XAxisAbscissa").string_value = str(cos(x_angle))
|
||||
bpy.context.scene.BIMGeoreferenceProperties.map_conversion.get("XAxisOrdinate").string_value = str(sin(x_angle))
|
||||
|
||||
@classmethod
|
||||
def set_blender_grid_north(cls):
|
||||
bpy.context.scene.sun_pos_properties.north_offset = -radians(
|
||||
ifcopenshell.util.geolocation.xaxis2angle(
|
||||
float(bpy.context.scene.BIMGeoreferenceProperties.map_conversion.get("XAxisAbscissa").string_value),
|
||||
float(bpy.context.scene.BIMGeoreferenceProperties.map_conversion.get("XAxisOrdinate").string_value),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user