模型交互
1 图元选择
当鼠标选中图元的时候,使用RenderControl可以接收选中消息。RenderControl::SetSelectCallback用于注册用户接收选择消息的回调函数,参数PickedResult包含了被选择的图元信息:
csharp
mRenderControl.SetSelectCallback((PickedResult result) =>
{
var item = result.GetItem();
this.listBox1.Items.Clear();
// SceneNode的类型
this.listBox1.Items.Add(item.GetNode().GetType().Name);
// SceneNode的Uuid, 参考下面 2 图元数据关联。
this.listBox1.Items.Add(String.Format("NodeId: {0}", item.GetNodeId()));
// 鼠标点击的位置
this.listBox1.Items.Add(item.GetPoint().GetPosition().ToString());
// 选中的子图元类型
this.listBox1.Items.Add(item.GetShapeType().ToString());
// 选中子图元的在整体图元的索引,即在CompoundShape中的索引
this.listBox1.Items.Add(String.Format("SubIndex: {0}", item.GetShapeIndex()));
// 点、线段、三角形面片的索引
this.listBox1.Items.Add(String.Format("PrimitiveIndex: {0}", item.GetPoint().GetPrimitiveIndex()));
// 子TopoShape的ID,可以从主TopoShape.FindChild获取子TopoShape对象
this.listBox1.Items.Add(String.Format("TopoShapeId: {0}", item.GetTopoShapeId()));
});
请参考示例观察选中的信息变化情况。
注意:
- 该函数只需设置一次,第二次设置会将之前的设置覆盖。
1.1 图元数据关联
每个SceneNode都具有全局唯一的ID。当程序重新打开的时候,SceneNode的ID会重新分配。 创建SceneNode后,可以通过ID来跟应用的业务数据关联;当选中图元后,可以根据ID获取业务信息。
注意:
- SceneNode.GetUuid可以得到SceneNode的全局唯一ID。
- 使用SceneNode.SetUserId可以关联用户自定义的ID,默认是0。
1.2 多选
按住Control键可以用鼠标多选图元,使用PickedItemIterator可以遍历多选的PickedItem.
csharp
for(var itr =result.CreateIterator(); itr.More(); itr.Next())
{
PickedItem item = itr.Current();
// 根据item获取信息
}
1.3 获取选择的几何对象
PickedItem中包含了选择对象的Id信息,要获取具体的几何对象可以通过如下方式:
csharp
PickedItem item = ...
var node = BrepSceneNode.Cast(item.GetNode()); //强制转换
if(node == null)
return;
//得到零件的shape
TopoShape shape = node.GetTopoShape();
EnumShapeFilter shapeType = item.GetShapeType();
switch(shapeType)
{
case EnumShapeFilter.Edge:
var edge = shape.FindChild(EnumTopoShapeType.Topo_EDGE, item.GetTopoShapeId());
break;
case EnumShapeFilter.Face:
var face = shape.FindChild(EnumTopoShapeType.Topo_Face, item.GetTopoShapeId());
break;
}
得到edge和face后,结合ParametricCurve和ParametricSurface就可以获取曲线、曲面的信息。
1.4 选择过滤设置
模型有点、线、面等局部元素组成,在三维视图中选择可以根据需要选择局部的元素或者整体。
- 选择局部元素
- EnumShapeFilter.Vertex
- EnumShapeFilter.Edge
- EnumShapeFilter.Face
- EnumShapeFilter.VertexEdgeFace
- 选择整体:
- EnumShapeFilter.Object
例如,设置只能选择线/边:
csharp
var ctx = mRenderControl.ViewContext;
// 根据需要设置可以被选择的元素
ctx.SetPickFilter((uint)EnumShapeFilter.Edge);
2 动画设置
通过组合使用平移、旋转和缩等矩阵变换放来模拟物体的运动。通过RenderControl::SetAnimationCallback可以得到每一帧绘制的消息,在Callback中可以对SceneNode进行矩阵变换。
csharp
mRenderControl.SetAnimationCallback((float timer)=>{
// 更新构件
var matrixR = Matrix4.makeRotationAxis(new Vector3(0, 0, 1), time);
var matrixT = Matrix4.makeTranslation(-50, 0, 0);
ConeNode1.SetTransform(matrixR * matrixT);
ConeNode1.RequstUpdate();
// 更新场景
mRenderControl.RequestDraw();
});
注意:
- 该函数只需设置一次,第二次设置会将之前的设置覆盖。
- 停用动画,直接设置为null
3 鼠标按键设置
通过控件得到ViewContext对象,可以设置鼠标按键的行为。
csharp
var viewContext = renderView.ViewContext;
``
可以设置鼠标的行为,比如要修改为左键和中键旋转,右键移动,可以如下设置:
```csharp
viewContext.SetPanButton(EnumMouseButton.Left);
viewContext.OrbitButton(EnumMouseButton.Right);
viewContext.PickButton(EnumMouseButton.Middle);
// 禁用视图旋转
viewContext.OrbitButton(EnumMouseButton.Zero);
自由旋转
默认锁定上下翻转,可以通过 SetFreeOribt来解锁
csharp
viewContext.SetFreeOribt(true);
设置固定的旋转中心
系统默认以鼠标选择的位置旋转,你也可以设置固定旋转中心。
csharp
// 设置以原心旋转
viewContext.FixedOrbitPivot(true);
viewContext.SetOrbitPivot(new Vector3(0));
// 取消固定旋转中心
viewContext.FixedOrbitPivot(false);
框选
csharp
// 框选
viewContext.SetRectPick(true);
// 单选
viewContext.SetRectPick(false);
禁用鼠标中键缩放
csharp
viewContext.ZoomByWheel(false);
4 高级交互
4.1 模型剖切
AnyCAD内置了模型剖切命令:
- 剖切盒ClipBox
- 剖切平面ClipPlane。
设置剖切盒:
csharp
{
renderView.ExecuteCommand("ClipBox");
}
设置剖切平面:
csharp
{
renderView.ExecuteCommand("ClipPlane");
}
4.2 模型修改
- 移动 在视图中选中模型后,执行如下命令进入移动操作。按ESC退出。
csharp
mRenderView.ExecuteCommand("Move");
- 旋转 在视图中选中模型后,执行如下命令进入旋转操作。按ESC退出。
csharp
mRenderView.ExecuteCommand("Rotate");
4.3 框选放大
mRenderView.ExecuteCommand("RectZoom");
5 总结
更多设置请参考示例Demo。