簡體   English   中英

從控制台啟動 Blender 時無法在 python 腳本中選擇一個框

[英]Unable to select a box in a python script when launching Blender from console

對於我的項目,我希望能夠從系統控制台運行 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" ,程序崩潰並顯示以下輸出:

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 中)。
  • 如果我在 Blender 和控制台中刪除對select_box的調用,腳本就可以正常工作。

所以我的問題是:

  • 為什么根據我啟動腳本的方式會得到不同的結果?
  • 我應該怎么做才能從系統控制台運行腳本?

如果你想用腳本模仿用戶輸入,你不能期望一致的結果,很難知道任何東西的位置。

要從腳本中獲得可靠的結果,您需要使用一致的數據,因此比較對象位置以確定它是否在特定標准內。

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)

如果要選擇網格的一部分,請使用obj.matrix_world根據其相對於對象原點的位置或其世界位置來obj.matrix_world

雖然您可以直接訪問obj.data網格組件, obj.data您應該考慮使用bmesh進行任何網格編輯。

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 特定腳本的幫助,請訪問blender.stackexchange

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM