BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 952|回复: 5

取消一个点的选择状态vertex select False

[复制链接]
发表于 2015-11-9 12:01:31 | 显示全部楼层 |阅读模式
选则多个点时,会激活所有 关联的 边、面,这是内部机制。
而某个点v.select = False时,因为其关联的 边或者面仍旧是激活的,
所以,这个点在刷新机制下(选择的机制 在前台、后台 都 能体现,不选择的机制只体现在前台),
会重新回到选择状态。


在3d view手动操作时,操作层会 迭代所有边与面,将包含这个点的 都 False。

可以用代码 解释一下 3dview 里的diselect_vert操作:


  1. import bpy

  2. C = bpy.context

  3. def select_all():
  4.     bpy.ops.object.mode_set(mode="EDIT")
  5.     bpy.ops.mesh.select_all(action='SELECT')
  6.     bpy.ops.object.mode_set(mode="OBJECT")


  7. def diselect_vt(diselect_id):
  8.     faces = C.active_object.data.polygons
  9.     edges = C.active_object.data.edges
  10.     verts = C.active_object.data.vertices
  11.    
  12.     verts[diselect_id].select = False
  13.     for i in (edges, faces):
  14.         for ele in i:
  15.             if diselect_id in ele.vertices:
  16.                 ele.select=False
  17.         
  18. select_all()        
  19. diselect_id = 5           
  20. diselect_vt(diselect_id)
复制代码


发表于 2015-11-9 12:40:54 | 显示全部楼层
阳的帖子,来源于我在qq群的问题:
1.默认方块,进入编辑模式,这时发现所有点都是选中的
运行下面这个,会发现所有点依然是选中的
  1. import bpy
  2. for obj in bpy.data.meshes:
  3.     bpy.ops.object.mode_set(mode="OBJECT")
  4.     for vertex in obj.vertices:
  5.         if vertex.co.x<0:
  6.             vertex.select=False
  7.             print (vertex.select)
  8.     bpy.ops.object.mode_set(mode="EDIT")
  9.     bpy.context.scene.update()
复制代码



2.手工将所有的点都不选择,运行下面的,会发现这时按规则进行了
  1. import bpy
  2. for obj in bpy.data.meshes:
  3.     bpy.ops.object.mode_set(mode="OBJECT")
  4.     for vertex in obj.vertices:
  5.         if vertex.co.x<0:
  6.             vertex.select=True
  7.             print (vertex.select)
  8.     bpy.ops.object.mode_set(mode="EDIT")
  9.     bpy.context.scene.update()
复制代码

除非把这解释为特性。否则无法解释,为什么vertex.select=True可以执行,但是vertex.select=False拒绝执行

基于一致性的角度考虑(我个人认为,要么干脆不提供写vertex.select。要么就统一对待),我认为这是bug,并已汇报 https://developer.blender.org/T46730 。但是估摸着官方会回避这个问题

回复 支持 反对

使用道具 举报

发表于 2015-11-9 12:42:40 | 显示全部楼层
阳也提供用bmesh解决的方法
  1. import bpy
  2. import bmesh
  3. obj = bpy.context.edit_object
  4. me = obj.data
  5. bm = bmesh.from_edit_mesh(me)
  6. bm.faces.active = None
  7. for v in bm.verts:
  8.     v.select = (v.co.x > 0)
  9. bmesh.update_edit_mesh(me, True)
复制代码

回复 支持 反对

使用道具 举报

发表于 2015-11-9 12:43:43 | 显示全部楼层
阳解释的逻辑,我看不懂
因为按那个的逻辑,为啥不说


我将所有点都先不选择,那么与这些点关联的所有边、面,都是没有选择的
而某个点v.select = True时,因为其关联的 边或者面仍旧是没有选择的,
所以,这个点在刷新机制下,会重新回到没有选择的状态
回复 支持 反对

使用道具 举报

发表于 2015-11-9 12:44:37 | 显示全部楼层
阳:“ 因为 选择的机制 在前台、后台 都 能体现,不选择的机制只体现在前台”
牡蛎:“若真是这样,不知道blender还私藏了多少坑”

点评

依据小A的说法,c、c++部分是有 select/unselect only,只是没暴露给py。 你可以把你向官方的反馈地址也贴这里,顺道建议一下,2.8版本 暴露这些给python。  详情 回复 发表于 2015-11-9 13:52
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-9 13:52:37 | 显示全部楼层
oyster 发表于 2015-11-9 12:44
阳:“ 因为 选择的机制 在前台、后台 都 能体现,不选择的机制只体现在前台”
牡蛎:“若真是这样,不知道 ...

依据小A的说法,c、c++部分是有 select/unselect only,只是没暴露给py。

你可以把你向官方的反馈地址也贴这里,顺道建议一下,2.8版本 暴露这些给python。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-8-22 11:46 , Processed in 0.031312 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表