场景管理

AnyCAD支持多场景,使用内置的SceneManager统一管理。通过ViewContext.GetSceneManager可以得到SceneManager。通过SceneManager.GetScene方法可得到默认的Scene。Scene可以用来管理SceneNode,通过GroupSceneNode可以构建树形的场景结构。

TIP

SceneNode不支持多次加入场景,即SceneNode在整个场景中只能存在一个。

1 场景节点状态

通过SceneNode可以设置显示对象的可见性、可选择性、用户业务系统的UserId。

每个对象具有session级别的(下次重新打开程序Uuid会变)全局唯一的ID,称之为Uuid。

2 三维对象管理

Scene提供添加、删除、遍历显示对象的API。

对象查找

使用Scene.FindNode方法通过对象的uuid查找SceneNode对象。

对象类型转换

SceneNode是所有类型SceneNode的基类,比如BrepSceneNode、PrimitiveSceneNode等。使用BrepSceneNode.Cast方法可以把SceneNOde对象转换为BrepSceneNode对象,其他类型的显示对象亦然。

对象删除

使用Scene.RemoveNode方法通过显示对象的Uuid可以删除显示对象。

对象遍历

SceneNodeIterator用于遍历Scene场景中所有的显示对象。 Scene.CreateIterator()创建SceneNodeIterator,使用以下方法遍历:


for(var itr = scene.CreateIterator();itr.More(); itr.Next())
{
    var node = itr.Current();
    //....
}
1
2
3
4
5
6

3 对象选择

选择过滤器

支持以下几种类型的过滤选择:

enum EnumShapeFilter
{
    Vertex,//点
    Edge, //边
    Face, // 面
    LeafNode, // SceneNode整体选择
};
1
2
3
4
5
6
7

从控件上获取ViewContext对象,可以设置过滤器

    // 清除,以便后续新加
	void ClearPickFilters();
    // 设置为默认的
	void ResetPickFilters();
    // 添加一种可被选中的类型
	void AddPickFilter(EnumShapeFilter filter);
    // 清除一种可被选中的类型
	void ClearPickFilter(EnumShapeFilter filter);
    // 获取所有的过滤器
	uint GetPickFilter() 

1
2
3
4
5
6
7
8
9
10
11

从三维窗口中选择

当用鼠标从三维窗口中选中模型的时候,会触发回调的事件。设置SelectCallback即可被动获取选中的信息。

    //renderView是RenderControl;
    mRenderView.SetSelectCallback((PickedResult result) =>
    {
        //PickedResult中包含了选择的信息
        // 选择的SceneNode
        // 选择的点的位置
    });
1
2
3
4
5
6
7

通过API选择

有时候我们需要用代码来选中模型整体或者模型的一部分,比如从目录树上节点上选中。从控件上获得SceneManager对象,就可以调用其API来设置选中的对象

//使用SceneNode选择整体
sceneManager.Select(uuid); 
//选中SceneNode的某个面或者边
sceneManager.SelectSubShape(uuid, EnumShapeFilter, shapeIndex); 
 //选中SceneNode的某个面或者边,这里的索引是对应的TopoShape的索引
sceneManager.SelectSubTopo(uuid, EnumShapeFilter, topoIdx);
1
2
3
4
5
6

4 二维对象管理

Scene2D用于管理二维对象,用法与Scene类似。

比如二维的标签:

详细代码请参考Tag示例