Как удалить несколько меньших объектов в моей сцене, используя скрипт Blender? - PullRequest
0 голосов
/ 07 ноября 2019

Я использую Blender 2.8. Я хочу импортировать объект в блендер, который состоит из нескольких частей, которые не связаны. Поэтому я хочу разбить объект на части и экспортировать только самые крупные из них.

Итак, предположим, что в одном объекте есть 3 части, одна большая и две маленькие. Я могу превратить этот объект в три объекта, каждый из которых содержит одну из частей. Я хотел бы удалить два меньших объекта и оставить только самый большой. Я думаю, может быть, как-нибудь найти площадь поверхности трех разных объектов и сохранить только наибольшую, удаляя все остальные? Я довольно новичок в Blender.

bpy.ops.import_mesh.stl(filepath='path/of/file.stl')
bpy.ops.mesh.separate(type='LOOSE')
amount_of_pieces = len(context.selected_objects)

if amount_of_pieces > 1:
    highest_surface_area = 0

    #the rest is pseudocode
    for object in scene:
        if object.area > highest_surface_area:
            highest_surface_area = object.area
        else:
            bpy.ops.object.delete()

bpy.ops.export_mesh.stl(filepath='path/of/new/file.stl')

1 Ответ

0 голосов
/ 07 ноября 2019

Мне удалось написать код, который работает для этого, однако он очень длинный и хаотичный. Буду признателен, если кто-нибудь даст мне несколько советов по его очистке.

import bpy
import os
import bmesh


context = bpy.context

file = (r'path\to\file.stl')

bpy.ops.import_mesh.stl(filepath= file)
fileName = os.path.basename(file)[:-4].capitalize()
bpy.ops.mesh.separate(type='LOOSE')
bpy.ops.object.select_all(action='SELECT')
piece = len(context.selected_objects)
bpy.ops.object.select_all(action='DESELECT')

high = 0
if piece > 1:
    bpy.data.objects[fileName].select_set(True)
    obj = bpy.context.active_object
    bm = bmesh.new()
    bm.from_mesh(obj.data)
    area = sum(f.calc_area() for f in bm.faces)
    high = area
    bm.free()
    bpy.ops.object.select_all(action='DESELECT')

    for x in range (1, piece):
        name = fileName + '.00' + str(x)
        object = bpy.data.objects[name]
        context.view_layer.objects.active = object
        bpy.data.objects[name].select_set(True)
        obj = bpy.context.active_object
        bm = bmesh.new()
        bm.from_mesh(obj.data)
        newArea = sum(f.calc_area() for f in bm.faces)
        bm.free()
        if newArea > high:
            high = newArea
            bpy.ops.object.select_all(action='DESELECT')
        else:
            bpy.ops.object.delete()
        bpy.ops.object.select_all(action='DESELECT')

    if area != high:
        bpy.data.objects[fileName].select_set(True)
        bpy.ops.object.delete()


bpy.ops.export_mesh.stl(filepath= 'path/to/export/file.stl')
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False, confirm=False)
...