场景管理
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();
//....
}
3 对象选择
选择过滤器
支持以下几种类型的过滤选择:
enum EnumShapeFilter
{
Vertex,//点
Edge, //边
Face, // 面
Object, // SceneNode整体选择
};
从控件上获取ViewContext对象,可以设置过滤器
// 清除,以便后续新加
void ClearPickFilters();
// 设置为默认的
void ResetPickFilters();
// 添加一种可被选中的类型
void AddPickFilter(EnumShapeFilter filter);
// 清除一种可被选中的类型
void ClearPickFilter(EnumShapeFilter filter);
// 获取所有的过滤器
uint GetPickFilter()
从三维窗口中选择
当用鼠标从三维窗口中选中模型的时候,会触发回调的事件。设置SelectCallback即可被动获取选中的信息。
//renderView是RenderControl;
mRenderView.SetSelectCallback((PickedResult result) =>
{
//PickedResult中包含了选择的信息
// 选择的SceneNode
// 选择的点的位置
});
通过API选择
有时候我们需要用代码来选中模型整体或者模型的一部分,比如从目录树上节点上选中。从控件上获得SceneManager对象,就可以调用其API来设置选中的对象
//使用SceneNode选择整体
sceneManager.Select(uuid);
//选中SceneNode的某个面或者边
sceneManager.SelectSubShape(uuid, EnumShapeFilter, shapeIndex);
//选中SceneNode的某个面或者边,这里的索引是对应的TopoShape的索引
sceneManager.SelectSubTopo(uuid, EnumShapeFilter, topoIdx);
4 二维对象管理
Scene2D用于管理二维对象,用法与Scene类似。
WindowNode2D可以创建屏幕固定位置的二维对象,如:
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示例