def append_asset2(asset_data, **kwargs): '''Link asset to the scene''' file_names = paths.get_download_filenames(asset_data) scene = bpy.context.scene user_preferences = bpy.context.preferences.addons['blenderkit'].preferences if user_preferences.api_key == '': user_preferences.asset_counter += 1 if asset_data['asset_type'] == 'scene': scene = append_link.append_scene(file_names[0], link=False, fake_user=False) parent = scene if asset_data['asset_type'] == 'model': s = bpy.context.scene downloaders = kwargs.get('downloaders') s = bpy.context.scene sprops = s.blenderkit_models if sprops.append_method == 'LINK_COLLECTION': sprops.append_link = 'LINK' sprops.import_as = 'GROUP' else: sprops.append_link = 'APPEND' sprops.import_as = 'INDIVIDUAL' al = sprops.append_link ain = asset_in_scene(asset_data) if ain is not False: if ain == 'LINKED': al = 'LINK' else: al = 'APPEND' link = al == 'LINK' if downloaders: for downloader in downloaders: if link is True: parent, newobs = append_link.link_collection( file_names[-1], location=downloader['location'], rotation=downloader['rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) else: parent, newobs = append_link.append_objects( file_names[-1], location=downloader['location'], rotation=downloader['rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) if parent.type == 'EMPTY' and link: bmin = asset_data['bbox_min'] bmax = asset_data['bbox_max'] size_min = min(1.0, (bmax[0] - bmin[0] + bmax[1] - bmin[1] + bmax[2] - bmin[2]) / 3) parent.empty_display_size = size_min elif kwargs.get('model_location') is not None: if link is True: parent, newobs = append_link.link_collection( file_names[-1], location=kwargs['model_location'], rotation=kwargs['model_rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) else: parent, newobs = append_link.append_objects( file_names[-1], location=kwargs['model_location'], rotation=kwargs['model_rotation'], link=link, parent=kwargs.get('parent')) if parent.type == 'EMPTY' and link: bmin = asset_data['bbox_min'] bmax = asset_data['bbox_max'] size_min = min(1.0, (bmax[0] - bmin[0] + bmax[1] - bmin[1] + bmax[2] - bmin[2]) / 3) parent.empty_display_size = size_min if link: group = parent.instance_collection lib = group.library lib['asset_data'] = asset_data elif asset_data['asset_type'] == 'brush': inscene = False for b in bpy.data.brushes: if b.blenderkit.id == asset_data['id']: inscene = True brush = b break if not inscene: brush = append_link.append_brush(file_names[-1], link=False, fake_user=False) thumbnail_name = asset_data['thumbnail'].split(os.sep)[-1] tempdir = paths.get_temp_dir('brush_search') thumbpath = os.path.join(tempdir, thumbnail_name) asset_thumbs_dir = paths.get_download_dirs('brush')[0] asset_thumb_path = os.path.join(asset_thumbs_dir, thumbnail_name) shutil.copy(thumbpath, asset_thumb_path) brush.icon_filepath = asset_thumb_path if bpy.context.view_layer.objects.active.mode == 'SCULPT': bpy.context.tool_settings.sculpt.brush = brush elif bpy.context.view_layer.objects.active.mode == 'TEXTURE_PAINT': bpy.context.tool_settings.image_paint.brush = brush parent = brush elif asset_data['asset_type'] == 'material': inscene = False for m in bpy.data.materials: if m.blenderkit.id == asset_data['id']: inscene = True material = m break if not inscene: material = append_link.append_material(file_names[-1], link=False, fake_user=False) target_object = bpy.data.objects[kwargs['target_object']] if len(target_object.material_slots) == 0: target_object.data.materials.append(material) else: target_object.material_slots[ kwargs['material_target_slot']].material = material parent = material scene['assets used'] = scene.get('assets used', {}) scene['assets used'][asset_data['asset_base_id']] = asset_data.copy() scene['assets rated'] = scene.get('assets rated', {}) id = asset_data['asset_base_id'] scene['assets rated'][id] = scene['assets rated'].get(id, False) parent['asset_data'] = asset_data if hasattr(parent.blenderkit, 'tags') and 'tags' in asset_data: asset_data['tags'].remove('non-manifold') parent.blenderkit.tags = ','.join(asset_data['tags']) if hasattr(parent.blenderkit, 'description') and 'description' in asset_data: if asset_data['description'] is not None: parent.blenderkit.description = asset_data['description'] if hasattr(parent.blenderkit, 'custom_props') and 'metadata' in asset_data: if 'product_info' in asset_data['metadata']: product_info = asset_data['metadata'].pop('product_info') clients = [] skus = [] for client_sku in product_info: clients.append(client_sku['client']) skus.append(client_sku['sku']) if hasattr(parent.blenderkit, 'client') and hasattr( parent.blenderkit, 'sku'): parent.blenderkit.client = ','.join(clients) parent.blenderkit.sku = ','.join(skus) else: parent.blenderkit.custom_props['client'] = ','.join(clients) parent.blenderkit.custom_props['sku'] = ','.join(skus) for key, value in asset_data['metadata'].items(): parent.blenderkit.custom_props[key] = value bpy.ops.wm.undo_push_context(message='add %s to scene' % asset_data['name'])
def append_asset(asset_data, **kwargs): # downloaders=[], location=None, '''Link asset to the scene''' file_names = paths.get_download_filenames(asset_data) props = None ##### # how to do particle drop: # link the group we are interested in( there are more groups in File!!!! , have to get the correct one!) # scene = bpy.context.scene user_preferences = bpy.context.preferences.addons['blenderkit'].preferences if user_preferences.api_key == '': user_preferences.asset_counter += 1 if asset_data['asset_type'] == 'scene': scene = append_link.append_scene(file_names[0], link=False, fake_user=False) props = scene.blenderkit parent = scene if asset_data['asset_type'] == 'model': s = bpy.context.scene downloaders = kwargs.get('downloaders') s = bpy.context.scene sprops = s.blenderkit_models # TODO this is here because combinations of linking objects or appending groups are rather not-usefull if sprops.append_method == 'LINK_COLLECTION': sprops.append_link = 'LINK' sprops.import_as = 'GROUP' else: sprops.append_link = 'APPEND' sprops.import_as = 'INDIVIDUAL' #copy for override al = sprops.append_link import_as = sprops.import_as # set consistency for objects already in scene, otherwise this literally breaks blender :) ain = asset_in_scene(asset_data) #override based on history if ain is not False: if ain == 'LINKED': al = 'LINK' import_as = 'GROUP' else: al = 'APPEND' import_as = 'INDIVIDUAL' # first get conditions for append link link = al == 'LINK' # then append link if downloaders: for downloader in downloaders: # this cares for adding particle systems directly to target mesh, but I had to block it now, # because of the sluggishnes of it. Possibly re-enable when it's possible to do this faster? if 0: # 'particle_plants' in asset_data['tags']: append_link.append_particle_system( file_names[-1], target_object=kwargs['target_object'], rotation=downloader['rotation'], link=False, name=asset_data['name']) return if sprops.import_as == 'GROUP': parent, newobs = append_link.link_collection( file_names[-1], location=downloader['location'], rotation=downloader['rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) else: parent, newobs = append_link.append_objects( file_names[-1], location=downloader['location'], rotation=downloader['rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) if parent.type == 'EMPTY' and link: bmin = asset_data['bbox_min'] bmax = asset_data['bbox_max'] size_min = min(1.0, (bmax[0] - bmin[0] + bmax[1] - bmin[1] + bmax[2] - bmin[2]) / 3) parent.empty_display_size = size_min elif kwargs.get('model_location') is not None: if sprops.import_as == 'GROUP': parent, newobs = append_link.link_collection( file_names[-1], location=kwargs['model_location'], rotation=kwargs['model_rotation'], link=link, name=asset_data['name'], parent=kwargs.get('parent')) else: parent, newobs = append_link.append_objects( file_names[-1], location=kwargs['model_location'], rotation=kwargs['model_rotation'], link=link, parent=kwargs.get('parent')) if parent.type == 'EMPTY' and link: bmin = asset_data['bbox_min'] bmax = asset_data['bbox_max'] size_min = min(1.0, (bmax[0] - bmin[0] + bmax[1] - bmin[1] + bmax[2] - bmin[2]) / 3) parent.empty_display_size = size_min if link: group = parent.instance_collection lib = group.library lib['asset_data'] = asset_data elif asset_data['asset_type'] == 'brush': # TODO if already in scene, should avoid reappending. inscene = False for b in bpy.data.brushes: if b.blenderkit.id == asset_data['id']: inscene = True brush = b break if not inscene: brush = append_link.append_brush(file_names[-1], link=False, fake_user=False) thumbnail_name = asset_data['thumbnail'].split(os.sep)[-1] tempdir = paths.get_temp_dir('brush_search') thumbpath = os.path.join(tempdir, thumbnail_name) asset_thumbs_dir = paths.get_download_dirs('brush')[0] asset_thumb_path = os.path.join(asset_thumbs_dir, thumbnail_name) shutil.copy(thumbpath, asset_thumb_path) brush.icon_filepath = asset_thumb_path if bpy.context.view_layer.objects.active.mode == 'SCULPT': bpy.context.tool_settings.sculpt.brush = brush elif bpy.context.view_layer.objects.active.mode == 'TEXTURE_PAINT': # could be just else, but for future possible more types... bpy.context.tool_settings.image_paint.brush = brush # TODO set brush by by asset data(user can be downloading while switching modes.) # bpy.context.tool_settings.image_paint.brush = brush props = brush.blenderkit parent = brush elif asset_data['asset_type'] == 'material': inscene = False for m in bpy.data.materials: if m.blenderkit.id == asset_data['id']: inscene = True material = m break if not inscene: material = append_link.append_material(file_names[-1], link=False, fake_user=False) target_object = bpy.data.objects[kwargs['target_object']] if len(target_object.material_slots) == 0: target_object.data.materials.append(material) else: target_object.material_slots[ kwargs['material_target_slot']].material = material parent = material scene['assets used'] = scene.get('assets used', {}) scene['assets used'][asset_data['asset_base_id']] = asset_data.copy() scene['assets rated'] = scene.get('assets rated', {}) id = asset_data['asset_base_id'] scene['assets rated'][id] = scene['assets rated'].get(id, False) parent[ 'asset_data'] = asset_data # TODO remove this??? should write to blenderkit Props?
has_url = download.get_download_url(asset_data, download.get_scene_id(), user_preferences.api_key, tcom=None, resolution='blend') if not has_url == True: bg_blender.progress( "couldn't download asset for thumnbail re-rendering") # download first, or rather make sure if it's already downloaded bg_blender.progress('downloading asset') fpath = download.download_asset_file(asset_data) data['filepath'] = fpath main_object, allobs = append_link.link_collection( fpath, location=(0, 0, 0), rotation=(0, 0, 0), link=True, name=asset_data['name'], parent=None) allobs = [main_object] else: bg_blender.progress('preparing thumbnail scene') obnames = get_obnames() main_object, allobs = append_link.append_objects( file_name=data['filepath'], obnames=obnames, link=True) bpy.context.view_layer.update() camdict = { 'GROUND': 'camera ground', 'WALL': 'camera wall',