Невозможно выбрать поле в скрипте python при запуске Blender из консоли - PullRequest
0 голосов
/ 10 января 2020

Для моего проекта я хочу иметь возможность запускать скрипт Blender python из системной консоли.

Этот минимальный скрипт (см. Ниже) способен выбирать регион, используя оператор select_box . Скрипт работает правильно при запуске из приложения Blender. Однако при запуске из консоли, используя "C:\Program Files\Blender Foundation\Blender 2.81\blender.exe" "C:\Users\Desktop\test.blend" -d --python "D:\Documents\minTest.py", программа cra sh выдает следующий вывод:

Switching to fully guarded memory allocator.
Blender 2.81 (sub 16)
Build: 2019-12-04 14:30:40 Windows Release
argv[0] = C:\Program Files\Blender Foundation\Blender 2.81\blender.exe
argv[1] = C:\Users\Desktop\test.blend
argv[2] = -d
argv[3] = --python
argv[4] = D:\Documents\minTest.py
Read prefs: C:\Users\AppData\Roaming\Blender Foundation\Blender\2.81\config\userpref.blend
read file
  Version 280 sub 39 date unknown hash unknown
found bundled python: C:\Program Files\Blender Foundation\Blender 2.81\2.81\python
Warning: Add-on 'io_mesh_xyz' was not upgraded for 2.80, ignoring
Warning: Add-on 't26_PointCloudSkinner1_Umbrella' was not upgraded for 2.80, ignoring
Read blend: C:\Users\Desktop\test.blend
read file C:\Users\Desktop\test.blend
  Version 281 sub 16 date 2019-12-04 11:32 hash f1aa4d18d49d
***** DEBUG: working
Error   : EXCEPTION_ACCESS_VIOLATION
Address : 0x00007FF60F40DCFD
Module  : C:\Program Files\Blender Foundation\Blender 2.81\blender.exe

Файл test.blend представляет собой простую сцену запуска , Сценарий minTest.py выглядит следующим образом:

import bpy

def getView3dAreaAndRegion():
    for area in bpy.context.screen.areas:
        if area.type == "VIEW_3D":
            for region in area.regions:
                if region.type == "WINDOW":
                    return area, region

view3dArea, view3dRegion = getView3dAreaAndRegion()
override = bpy.context.copy()
override['area'] = view3dArea
override['region'] = view3dRegion

print("***** DEBUG: working") #Debug to see that the script has launched
bpy.ops.view3d.select_box(override,xmin=100, xmax=500, ymin=100, ymax=300, wait_for_input=False)

Дополнительная информация:

  • Я использую Blender 2.81 и Python 3.7 (в комплекте Blender).
  • Сценарий работает отлично, если я уберу вызов select_box как в Blender, так и из консоли.

Итак, мои вопросы:

  • Почему у меня разные результаты в зависимости от того, как я запускаю скрипт?
  • Что мне нужно сделать, чтобы запустить скрипт из системной консоли?

1 Ответ

0 голосов
/ 12 января 2020

Вы не можете ожидать последовательных результатов, если хотите имитировать пользовательский ввод с помощью скрипта, слишком сложно знать, где что-либо позиционируется.

Чтобы получить надежные результаты из скрипта, вам нужно поработать с согласованными данными, поэтому сравните местоположение объектов, чтобы решить, соответствует ли оно определенным критериям.

import bpy

for obj in bpy.context.scene.objects:
    if obj.location.z > 0.2 and obj.location.z < 1.5:
        obj.select_set(True)
    else:
        obj.select_set(False)

Если вы хотите выбрать часть me sh, определите, что выбрано, либо на основе его положение относительно начала координат объекта или его положения в мире с помощью obj.matrix_world.

В то время как вы можете напрямую обращаться к me sh компонентам в obj.data, вам следует рассмотреть возможность использования bme sh для любого редактирования me sh.

import bpy
import bmesh

bpy.ops.object.mode_set(mode='EDIT')
me = bpy.context.object.data
bm = bmesh.from_edit_mesh(me)

for v in bm.verts:
    if v.co.z > -1.8 and v.co.z < 0.5:
        v.co.z += 0.2
        v.select = True
    else:
        v.select = False

bmesh.update_edit_mesh(me)
bm.free()
bpy.ops.object.mode_set(mode='OBJECT')

Для получения помощи по заданным сценариям blender c спросите в blender.stackexchange .

...