Skip to content

场景管理

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

TIP

SceneNode不支持多次加入场景,即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,使用以下方法遍历:

csharp

for(var itr = scene.CreateIterator();itr.More(); itr.Next())
{
    var node = itr.Current();
    //....
}

3 对象选择

选择过滤器

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

csharp
enum EnumShapeFilter
{
    Vertex,//点
    Edge, //边
    Face, // 面
    Object, // SceneNode整体选择
};

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

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

从三维窗口中选择

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

csharp
    //renderView是RenderControl;
    mRenderView.SetSelectCallback((PickedResult result) =>
    {
        //PickedResult中包含了选择的信息
        // 选择的SceneNode
        // 选择的点的位置
    });

通过API选择

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

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

4 二维对象管理

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

WindowNode2D可以创建屏幕固定位置的二维对象,如:

csharp
    var cir = GeometryBuilder.CreateArc(new Vector3(0), new Vector3(100, 0, 0), new Vector3(0, 100, 0), 0);
    var node = PrimitiveSceneNode.Create(cir, null);

    var text = TextSceneNode.Create("圆弧", ColorTable.绿宝石, 50, true);

    var group = new GroupSceneNode();
    group.AddNode(node);
    group.AddNode(text);

    //相对窗口左上角
    var window = new WindowNode2D(group, 100, 100);
    render.ShowSceneNode(window);

比如二维的标签:

详细代码请参考Tag示例


上海图无形科技有限公司旗下产品
Copyright © 2013-2024 AnyCAD