import bpy
import os
import sys
addon_dirpath = os.path.dirname(__file__)
sys.path += [addon_dirpath]
import azure_kinect_capture
import ply_visualizer
bl_info = {
"name": "AzurePointCaptureAddOn",
"description": "AzurePointCapture AddOn",
"author": "holomon",
"version": (1, 0, 0, 0),
"blender": (2, 80, 0),
"support": "TESTING",
"category": "3D View",
"location": "",
"warning": "",
"wiki_url": "",
"tracker_url": ""
}
class AZUREPOINTCAPTURE_PT_ui(bpy.types.Panel):
bl_label = "AzurePointCapture Panel"
bl_idname = "OBJECT_PT_AzurePointCapture"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "AzureCapture Panel"
def draw(self, context):
self.layout.operator("azure_point_capture.execute")
class AZUREPOINTCAPTURE_OT_capture(bpy.types.Operator):
bl_label = "Azure Point Capture"
bl_idname = "azure_point_capture.execute"
bl_description = "Point Importer by PointCloudVisualizer"
def execute(self, context):
work_dir = get_blend_dirpath()
if work_dir == "":
self.report({'ERROR'}, "error : .blend Project not found")
return {'FINISHED'}
ply_filepath = azure_kinect_capture.point_capture(arg_exportdir = work_dir)
if ply_filepath == "":
self.report({'ERROR'}, "error : azure_kinect_capture execute")
return {'FINISHED'}
ply_visualizer.load_kinect_ply(arg_plyfilepath = ply_filepath)
return {'FINISHED'}
def get_blend_dirpath() -> str:
"""現在のblendファイルのディレクトリパスを取得する
Returns:
str -- blendディレクトリパス(.blend未保存時は空文字を返却する)
"""
filepath = bpy.data.filepath
if filepath == "":
return ""
dirpath = os.path.dirname(filepath)
return dirpath
regist_classes = (
AZUREPOINTCAPTURE_PT_ui,
AZUREPOINTCAPTURE_OT_capture,
)
def register():
for regist_cls in regist_classes:
bpy.utils.register_class(regist_cls)
def unregister():
for regist_cls in regist_classes:
bpy.utils.unregister_class(regist_cls)
if __name__ == "__main__":
register()
import bpy
import os
import sys
addon_dirpath = os.path.dirname(__file__)
sys.path += [addon_dirpath]
import kinect_capture
def point_capture(arg_exportdir = ".") -> str:
"""呼び出し用関数
Keyword Arguments:
arg_exportdir {str} -- PLY出力ディレクトリ (default: {"."})
Returns:
bool -- 出力PLYファイルパス(実行失敗時は空文字)
"""
isResult = execute_azure_capture(arg_exportdir = arg_exportdir)
if isResult != 0:
return ""
ply_filepath = arg_exportdir + "\\color_to_depth.ply"
return ply_filepath
def execute_azure_capture(arg_exportdir = ".") -> int:
"""AzureCaptureモジュールの実行
Keyword Arguments:
arg_exportdir {str} -- PLYファイルの出力ディレクトリ (default: {"."})
Returns:
bool -- 実行成否(成功時:0)
"""
is_result = kinect_capture.capture(arg_exportdir)
return is_result
import bpy
import math
def load_kinect_ply(arg_objectname = "Points", arg_plyfilepath = "") -> bool:
"""AzureKinectのPLYファイルの点群データを新規オブジェクトに読み込む
Keyword Arguments:
arg_objectname {str} -- 読み込み用オブジェクト名 (default: {"Points"})
arg_plyfilepath {str} -- 読み込みPLYファイルパス (default: {""})
Returns:
bool -- 実行正否
"""
isResult = make_empty_object(arg_objectname = arg_objectname)
if isResult == False:
return False
isResult = load_ply_visualizer(arg_objectname = arg_objectname, arg_filepath = arg_plyfilepath)
if isResult == False:
return False
set_kinect_transform(arg_objectname = arg_objectname)
return True
def make_empty_object(arg_objectname = "Default") -> bool:
"""エンプティオブジェクトの作成
Keyword Arguments:
arg_objectname {str} -- 生成オブジェクト名 (default: {"Default"})
Returns:
bool -- 実行成否
"""
bpy.ops.object.empty_add(
type='PLAIN_AXES',
location=(0.0, 0.0, 0.0),
rotation=(0.0, 0.0, 0.0)
)
ob = bpy.context.view_layer.objects.active
ob.name = arg_objectname
ob.scale=( 1, 1, 1 )
ob.select_set(False)
return True
def load_ply_visualizer(arg_objectname = "Default", arg_filepath = "") -> bool:
"""PointCloudVisualizerへのPLYファイル読み込み
Keyword Arguments:
arg_objectname {str} -- 読み込み用オブジェクト名 (default: {"Default"})
arg_filepath {str} -- 読み込みPLYファイルパス (default: {""})
Returns:
bool -- 実行成否
"""
activeob = bpy.context.view_layer.objects[arg_objectname]
bpy.context.view_layer.objects.active = activeob
bpy.ops.point_cloud_visualizer.load_ply_to_cache(filepath=arg_filepath)
bpy.ops.point_cloud_visualizer.draw()
return True
def set_kinect_transform(arg_objectname = "Default"):
"""AzureKinectの点群データのトランスフォームの補正を行う
Keyword Arguments:
arg_objectname {str} -- 補正対象オブジェクト名 (default: {"Default"})
"""
selectob = bpy.context.scene.objects[arg_objectname]
selectob.location.x = 0.0
selectob.location.y = 0.0
selectob.location.z = 0.0
selectob.rotation_euler.x = 2 * math.pi / 360 * -90.0
selectob.rotation_euler.y = 0.0
selectob.rotation_euler.z = 0.0
selectob.scale.x = 0.001
selectob.scale.y = 0.001
selectob.scale.z = 0.001
return