From 662a9fdad75a0474f58ed61b714633f0c5244863 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 23 Mar 2020 19:35:02 +1100 Subject: [PATCH] Allow users to see different BCF viewpoints through a camera --- src/ifcblenderexport/blenderbim/__init__.py | 1 + src/ifcblenderexport/blenderbim/operator.py | 46 ++++++++++++++++++++- src/ifcblenderexport/blenderbim/ui.py | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/ifcblenderexport/blenderbim/__init__.py b/src/ifcblenderexport/blenderbim/__init__.py index 212e8da63e..df46340baf 100644 --- a/src/ifcblenderexport/blenderbim/__init__.py +++ b/src/ifcblenderexport/blenderbim/__init__.py @@ -35,6 +35,7 @@ if bpy is not None: operator.SelectType, operator.SelectBcfFile, operator.GetBcfTopics, + operator.ActivateBcfViewpoint, operator.SelectFeaturesDir, operator.SelectDiffJsonFile, operator.SelectDiffNewFile, diff --git a/src/ifcblenderexport/blenderbim/operator.py b/src/ifcblenderexport/blenderbim/operator.py index 9f0a337cc0..5696ed624c 100644 --- a/src/ifcblenderexport/blenderbim/operator.py +++ b/src/ifcblenderexport/blenderbim/operator.py @@ -11,7 +11,8 @@ from . import sheeter from . import schema from bpy_extras.io_utils import ImportHelper from itertools import cycle -from mathutils import Vector +from mathutils import Vector, Matrix +from math import radians from pathlib import Path colour_list = [ @@ -401,6 +402,49 @@ class GetBcfTopics(bpy.types.Operator): return {'FINISHED'} +class ActivateBcfViewpoint(bpy.types.Operator): + bl_idname = 'bim.activate_bcf_viewpoint' + bl_label = 'Activate BCF Viewpoint' + + def execute(self, context): + import bcfplugin + + topics = bcfplugin.getTopics() + if not topics: + return {'FINISHED'} + topic = topics[bpy.context.scene.BIMProperties.active_bcf_topic_index][1] + viewpoints = bcfplugin.getViewpoints(topic) + if not viewpoints: + return {'FINISHED'} + viewpoint = viewpoints[int(bpy.context.scene.BIMProperties.bcf_viewpoints)][1] + + obj = bpy.data.objects.get('Viewpoint') + if not obj: + obj = bpy.data.objects.new('Viewpoint', bpy.data.cameras.new('Viewpoint')) + bpy.context.scene.collection.objects.link(obj) + bpy.context.scene.camera = obj + area = next(area for area in bpy.context.screen.areas if area.type == 'VIEW_3D') + area.spaces[0].region_3d.view_perspective = 'CAMERA' + + if viewpoint.oCamera: + camera = viewpoint.oCamera + obj.data.type = 'ORTHO' + elif viewpoint.pCamera: + camera = viewpoint.pCamera + obj.data.type = 'PERSP' + obj.data.angle = radians(camera.fieldOfView) + + z_axis = Vector((-camera.direction.x, -camera.direction.y, -camera.direction.z)).normalized() + y_axis = Vector((camera.upVector.x, camera.upVector.y, camera.upVector.z)).normalized() + x_axis = y_axis.cross(z_axis).normalized() + rotation = Matrix((x_axis, y_axis, z_axis)) + rotation.invert() + location = Vector((camera.viewPoint.x, camera.viewPoint.y, camera.viewPoint.z)) + obj.matrix_world = rotation.to_4x4() + obj.location = location + return {'FINISHED'} + + class SelectAudited(bpy.types.Operator): bl_idname = 'bim.select_audited' bl_label = 'Select Audited' diff --git a/src/ifcblenderexport/blenderbim/ui.py b/src/ifcblenderexport/blenderbim/ui.py index 7725bb2c65..f571547927 100644 --- a/src/ifcblenderexport/blenderbim/ui.py +++ b/src/ifcblenderexport/blenderbim/ui.py @@ -549,6 +549,7 @@ class BIM_PT_bcf(Panel): row = layout.row() row.prop(props, 'bcf_viewpoints') + row.operator('bim.activate_bcf_viewpoint', icon='SCENE', text='') class BIM_PT_qa(Panel):