用 DeepDraw 几何引擎开发建筑设计软件(五):创建选择工具
系列文章
介绍
这一节开始介绍选择工具,引擎里提供了拾取对象的工具类CPickHelper,通过鼠标点击屏幕上的坐标,这个类遍历场景中的全部对象,包括组件中,返回一个列表,包含了所有左边点周围(9×9)像素内所有碰到的对象,并且通过面遮挡,排序等方式,得到最佳的拾取对象(BestPick)
创建SelectTool
直接上源代码,这是最简单的一个工具类,目的是演示,如何使用CPickHelper
import core
class SelectTool(core.IBaseTool):
def __init__(self, view):
super().__init__(view.view_proxy)
self.view = view
self.activate()
def activate(self):
self.pick_helper = core.CPickHelper(self.view.view_proxy)
def draw(self, gl):
pass
def draw_2d(self, painter):
pass
def on_left_button_down(self, pos, mod):
self.pos_x = pos.x()
self.pos_y = pos.y()
picker = self.pick_helper
picker.Reset()
picker.SinglePick(self.pos_x, self.pos_y, 9, None)
best = picker.BestPick()
print("select:")
if best:
print(best.e)
def on_left_button_up(self, pos):
pass
def on_mouse_move(self, pos, modifiers):
pass
运行结果
运行后,创建一个矩形,这相当于给场景添加了5个对象(4个线段和一个面),然后用鼠标选择面,可以看到,点选面,终端显示的select是CFace,点选线,显示CEdge,当同时选中时,CEdge的优先级要高于CFace
[python3.8]
>>> select:
<editor2.CEdge object at 0x0000028B018491F0>
select:
<editor2.CFace object at 0x0000028B01892130>
select:
<editor2.CEdge object at 0x0000028B0181C030>
高亮选中效果
现在已经可以知道CPickHelper返回的是什么了,那么把选中的高亮显示,基本的选择工具就有,其实只要使用SetSelection和ClearSelection,引擎的渲染模块,就会自动显示高亮效果
def on_left_button_down(self, pos, mod):
self.pos_x = pos.x()
self.pos_y = pos.y()
model = core.active_model()
picker = self.pick_helper
picker.Reset()
picker.SinglePick(self.pos_x, self.pos_y, 9, None)
best = picker.BestPick()
print("select:")
if best:
print(best.e)
model.SetSelection([best.e])
else:
model.ClearSelection()
运行起来,交互效果非常好 
再测试细节更丰富的模型
这里导入个复杂点的模型,要用到下一节讲到的读取dim文件,其实只要在程序初始化的时候加入一小段:
model = core.CModel()
binfile.load_sketchup_model(model, "test3_triangle.dim")
model.Activate()
core.set_active_model(model)

网硕互联帮助中心





评论前必须登录!
注册