这里给一个获取网格面序号的范例,其他都差不多:
# coding=utf-8
import rhinoscriptsyntax as rs
mesh_guid = rs.GetObject("点击要选取子面的网格",filter=rs.filter.mesh)
mesh_id_list = rs.GetMeshFaces(mesh_guid, "选取子面")
print(mesh_id_list)
这种只能一步步的来 先选择物体,在选中面。。。
如果我想 提前选择好了面。。通过面得到物体,在得到选择的ID 呢。。。卡在 通过面 得到物体这步。
import rhinoscriptsyntax as rs
import Rhino
AllmeshOBJ = rs.ObjectsByType(32, False)
for o in AllmeshOBJ :
mesh = rs.coercemesh(o)
MeshObject = Rhino.DocObjects.Custom.CustomMeshObject(mesh) #######
Indelist = MeshObject.GetSelectedSubObjects()
本想是 得到所有mesh物体,在依次通过物体上的 子选择数量 来判断 但是 对Common 还不是很熟悉 报错。
报错的原因是,Rhino.DocObjects.Custom.CustomMeshObject 是个抽象类,不能直接实例化。
用 RhinoCommon 选择物件的话可以用 Rhino.Input.Custom.GetObject
另外,发代码把代码格式化一下,python 的格式没有了很难看清楚是哪个块里面的:
还是用 RhinoCommon
写了一个网格面的范例,其他都差不多,这个支持预选,也支持执行脚本以后再选网格面:
# coding=utf-8
import Rhino
import scriptcontext as sc
def getMeshFacesId():
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt("选取网格面");
go.GeometryFilter = Rhino.DocObjects.ObjectType.MeshFace;
go.SubObjectSelect=True
go.GroupSelect=False
go.EnablePreSelect(True,True)
go.GetMultiple(1,0)
if go.CommandResult() != Rhino.Commands.Result.Success:
return None
objs = go.Objects()
result = [item.GeometryComponentIndex.Index for item in objs]
go.Dispose()
return result
selected_faces_id_list = getMeshFacesId()
print selected_faces_id_list
2 个赞