[英]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)
更多信息:
所以我的問題是:
如果你想用腳本模仿用戶輸入,你不能期望一致的結果,很難知道任何東西的位置。
要從腳本中獲得可靠的結果,您需要使用一致的數據,因此比較對象位置以確定它是否在特定標准內。
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.