🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **叁、逐个选择** **H子:** 接下来就该尝试怎么逐个选择模型了把。这个难道bpy也有自带的API可以实现吗?! **AOI:** 不,并没有这么万能,乖乖的用for去遍历吧。我们先来看看怎么样去命令选中模型吧。 这里我们就会涉及到bpy的一个类了: **Data Access(bpy.data)** ![](https://box.kancloud.cn/80f19d2b2cc475851fd50a807c61bb0a_521x290.png) 可以看到,这个类的名称是Data Access,顾名思义就是数据入口,也就是说,通过这个库,就可以通过某些手法获得对象。 通过官方案例API,就可以清楚的看到这个类的作用: ![](https://box.kancloud.cn/b6639db6bb423215ec585b91d2bf4d04_674x614.png) bpy.data: >Access to Blender’s internal data >访问Blender的内部数据 示例代码有点长(大概),反正也不知道写什么(可能),但是我们还是可以提取出有用的信息。 ![](https://box.kancloud.cn/d4665c73b43a52ac1ccb847d0a706b60_273x102.png) 就是,data类里面,包含了各种类型的数据,同时是利用字符串(对象名)去获取对象的。 ![](https://box.kancloud.cn/e0a9c4ad80f1f0b7d10ec0d37fb91773_365x297.png) 同样的方法,在交互窗口输入bpy.data. 然后按下Ctrl+空格键,看看输出的内容。 是不是发现见到很多熟悉的东西呢。 ![](https://box.kancloud.cn/d59622999daa783df45eec2e3d666e5a_331x150.png) **H子:** 啊!我见到了!objects!让我试试看 bpy.data.objects['TreeTri.004'] ![](https://box.kancloud.cn/78703b9165ee8264d74df9627ef7eb1a_293x40.png) 执行之后确实的见到返回了结果了。 **AOI:** 对的,这样就可以通过名字获得对象了。而也可以由此推测,Blender的内部数据,实际上不管你怎么放,在哪个层,什么设置,实际上他们都在底层平等的放置在各自分类的数组里面。而可以通过['对象名']获取,看起来是不是很像某一种数组呢? **H子:** 看起来就像是字典? **AOI:** 对的,这也就说明了,记录对象的数组其实是一个字典性质的数据结构,通过key值获得对象,同时也就说明了,为什么Blender里面同类对象,比如mesh,明明位于两个不同的对象上面,却也不允许使用同一个对象名。 为了方便后面的操作,我们可以用python的type方法去查看对象的数据类型。或者用包括且不限于dir等的命令,去查看对象的各种参数和属性,对期望操作的对象获得尽可能多的信息。了解对象越多,后面的操作便会越轻松。 ![](https://box.kancloud.cn/ac8ff88c7d40ab93527bdb536bdf63b3_351x39.png) **H子:** 看起来是一个**位于bpy_type类下面的Object类型**呢。好的,记下了。 **H子:** 那么,可以获得单个对象了,那么怎么才能选中呢。 **AOI:** 这里,我们就该出动API的搜索功能了。 首先打开API页面,在搜索框输入select。因为我们的目标是找到选择对象这个方法,这个时候,就直接搜想要的功能的英文看看能返回什么结果。 ![](https://box.kancloud.cn/230e1aa9ce8716a7c7a4e01ade001d9e_227x104.png) ![](https://box.kancloud.cn/ea1a334edf1d0fe787cbb550fabb4561_1035x873.png) 然后出现了很多结果,这个时候,我们就该开始从里面找出目标了。 为了排除这堆搜索结果,我们可以尝试利用浏览器自带的搜索功能,按下Ctrl+F,打开搜索框,然后输入object,因为我们想要的是选中某个对象,那么就直接输入object就好了 ![](https://box.kancloud.cn/77365ab67d41658af84287e4e51a6542_1062x116.png) 然后我们得到了这么些筛选结果。 我们可以看到,高亮的第一个结果是位于bpy.types.Object类下面的结果,看起来,这个是一个属于Object类型的一个参数,看起来有戏。那么我们就先点进去看看。 可以看到,这个参数的描述是: >Object selection state >对象选中状态 是一个布尔型的变量。 ![](https://box.kancloud.cn/395ec0b14e99ac45211f59d5f176abf7_1022x97.png) 这样,有一种命中的预感。 为了测试对不对,我们直接开始在交互界面尝试一下就明白了。 **H子:** 好,输入命令,回车! ![](https://box.kancloud.cn/e602268a4fe48a882f9e757270dcaf91_361x19.png) 好的!被选中了 ![](https://box.kancloud.cn/a033a81fadd803b439f1fb8652b87665_506x334.png) **H子:** 好的,既然知道了规则的话,那么剩下来就是要进行遍历处理了把。先通过一个变量记录一下选中的对象,然后再遍历这个变量,然后逐个选中? 总之先试试看把。 先按A取消全选,然后按F6设置操作动作为【取消选择】 ![](https://box.kancloud.cn/5fed7cac0fb28d4dc8183a534eb0458b_622x502.png) 得到取消选择的命令 ![](https://box.kancloud.cn/1973e89cb75f8d9cf2108034a77d5363_356x26.png) 然后开始编写循环 ~~~ 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对吧。 ![](https://box.kancloud.cn/809763d16483072456597b204aff27f7_174x152.png) 选择 : 窗口-切换显示系统控制台,就可以打开控制台窗口了 ![](https://box.kancloud.cn/278072afe13707e9f28d06b7fff541d2_832x419.png) 对的,就是这个熟悉的黑框框 所有的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]) ~~~ 代码执行的输出结果是: ![](https://box.kancloud.cn/6696bdd54d1dd79b9bc029e6f47eac72_840x190.png) 看来执行的结果是正确的 那么,到此,逐个选择就算是完成了。