Allow users to see different BCF viewpoints through a camera

This commit is contained in:
Dion Moult
2020-03-23 19:35:02 +11:00
parent 648aaaa778
commit 662a9fdad7
3 changed files with 47 additions and 1 deletions
@@ -35,6 +35,7 @@ if bpy is not None:
operator.SelectType, operator.SelectType,
operator.SelectBcfFile, operator.SelectBcfFile,
operator.GetBcfTopics, operator.GetBcfTopics,
operator.ActivateBcfViewpoint,
operator.SelectFeaturesDir, operator.SelectFeaturesDir,
operator.SelectDiffJsonFile, operator.SelectDiffJsonFile,
operator.SelectDiffNewFile, operator.SelectDiffNewFile,
+45 -1
View File
@@ -11,7 +11,8 @@ from . import sheeter
from . import schema from . import schema
from bpy_extras.io_utils import ImportHelper from bpy_extras.io_utils import ImportHelper
from itertools import cycle from itertools import cycle
from mathutils import Vector from mathutils import Vector, Matrix
from math import radians
from pathlib import Path from pathlib import Path
colour_list = [ colour_list = [
@@ -401,6 +402,49 @@ class GetBcfTopics(bpy.types.Operator):
return {'FINISHED'} 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): class SelectAudited(bpy.types.Operator):
bl_idname = 'bim.select_audited' bl_idname = 'bim.select_audited'
bl_label = 'Select Audited' bl_label = 'Select Audited'
+1
View File
@@ -549,6 +549,7 @@ class BIM_PT_bcf(Panel):
row = layout.row() row = layout.row()
row.prop(props, 'bcf_viewpoints') row.prop(props, 'bcf_viewpoints')
row.operator('bim.activate_bcf_viewpoint', icon='SCENE', text='')
class BIM_PT_qa(Panel): class BIM_PT_qa(Panel):