## **叁、逐個選擇**
**H子:** 接下來就該嘗試怎么逐個選擇模型了把。這個難道bpy也有自帶的API可以實現嗎?!
**AOI:** 不,并沒有這么萬能,乖乖的用for去遍歷吧。我們先來看看怎么樣去命令選中模型吧。
這里我們就會涉及到bpy的一個類了:
**Data Access(bpy.data)**

可以看到,這個類的名稱是Data Access,顧名思義就是數據入口,也就是說,通過這個庫,就可以通過某些手法獲得對象。
通過官方案例API,就可以清楚的看到這個類的作用:

bpy.data:
>Access to Blender’s internal data
>訪問Blender的內部數據
示例代碼有點長(大概),反正也不知道寫什么(可能),但是我們還是可以提取出有用的信息。

就是,data類里面,包含了各種類型的數據,同時是利用字符串(對象名)去獲取對象的。

同樣的方法,在交互窗口輸入bpy.data. 然后按下Ctrl+空格鍵,看看輸出的內容。
是不是發現見到很多熟悉的東西呢。

**H子:** 啊!我見到了!objects!讓我試試看
bpy.data.objects['TreeTri.004']

執行之后確實的見到返回了結果了。
**AOI:** 對的,這樣就可以通過名字獲得對象了。而也可以由此推測,Blender的內部數據,實際上不管你怎么放,在哪個層,什么設置,實際上他們都在底層平等的放置在各自分類的數組里面。而可以通過['對象名']獲取,看起來是不是很像某一種數組呢?
**H子:** 看起來就像是字典?
**AOI:** 對的,這也就說明了,記錄對象的數組其實是一個字典性質的數據結構,通過key值獲得對象,同時也就說明了,為什么Blender里面同類對象,比如mesh,明明位于兩個不同的對象上面,卻也不允許使用同一個對象名。
為了方便后面的操作,我們可以用python的type方法去查看對象的數據類型。或者用包括且不限于dir等的命令,去查看對象的各種參數和屬性,對期望操作的對象獲得盡可能多的信息。了解對象越多,后面的操作便會越輕松。

**H子:** 看起來是一個**位于bpy_type類下面的Object類型**呢。好的,記下了。
**H子:** 那么,可以獲得單個對象了,那么怎么才能選中呢。
**AOI:** 這里,我們就該出動API的搜索功能了。
首先打開API頁面,在搜索框輸入select。因為我們的目標是找到選擇對象這個方法,這個時候,就直接搜想要的功能的英文看看能返回什么結果。


然后出現了很多結果,這個時候,我們就該開始從里面找出目標了。
為了排除這堆搜索結果,我們可以嘗試利用瀏覽器自帶的搜索功能,按下Ctrl+F,打開搜索框,然后輸入object,因為我們想要的是選中某個對象,那么就直接輸入object就好了

然后我們得到了這么些篩選結果。
我們可以看到,高亮的第一個結果是位于bpy.types.Object類下面的結果,看起來,這個是一個屬于Object類型的一個參數,看起來有戲。那么我們就先點進去看看。
可以看到,這個參數的描述是:
>Object selection state
>對象選中狀態
是一個布爾型的變量。

這樣,有一種命中的預感。
為了測試對不對,我們直接開始在交互界面嘗試一下就明白了。
**H子:** 好,輸入命令,回車!

好的!被選中了

**H子:** 好的,既然知道了規則的話,那么剩下來就是要進行遍歷處理了把。先通過一個變量記錄一下選中的對象,然后再遍歷這個變量,然后逐個選中?
總之先試試看把。
先按A取消全選,然后按F6設置操作動作為【取消選擇】

得到取消選擇的命令

然后開始編寫循環
~~~ python
import bpy
objs = bpy.context.selected_objects
for o in objs:
bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects[o.name].select = True
~~~
看起來是這樣的,應該沒錯的樣子。不過執行完了之后,全選對象就只剩下了選中一個對象了。這樣也不知道對不對啊,有辦法可以打印些什么東西出來嗎,或者說,python的print命令輸出的東西可以在什么地方看到呢。
**AOI:** 看來你已經注意到了,沒有辦法輸出,很不方便debug對吧。

選擇 : 窗口-切換顯示系統控制臺,就可以打開控制臺窗口了

對的,就是這個熟悉的黑框框
所有的print輸出,以及代碼錯誤等等的信息,都會在這里顯示。那么,再嘗試一下修改代碼,并且輸出debug信息,對代碼執行過程進行檢查吧。
**H子:** 好的,先修改一下代碼。
~~~python
import bpy
objs = bpy.context.selected_objects
#打印全部選中對象
print(objs)
for o in objs:
bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects[o.name].select = True
#打印當前選中對象(因為selected_objects是一個數組,記錄了全部選中的對象,而因為當前只選中了一個對象,所以直接填寫數組下標值為0,獲取第一個對象就好了)
print(bpy.context.selected_objects[0])
~~~
代碼執行的輸出結果是:

看來執行的結果是正確的
那么,到此,逐個選擇就算是完成了。