opencascade AIS_ViewCube源码学习小方块 原创
opencascade AIS_ViewCube 小方块
前言
用于显示视图操控立方体的交互对象。
视图立方体由多个部分组成,负责不同的相机操作:
立方体的各个面代表主视图:顶部、底部、左侧、右侧、前侧和后侧。
边表示主视图之一的旋转45度。
顶点表示主视图之一的两个方向的旋转。
该对象的行为类似于视图角落的三轴坐标系,
因此其位置应该使用转换持久性标志进行定义:
@code SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_LEFT_LOWER, Graphic3d_Vec2i (100, 100));
视图立方体的各部分对于检测或动态高亮显示是敏感的(但不是选择),并且每个其所有者 AIS_ViewCubeOwner 对应于相机的变换。
for (aViewCube->StartAnimation (aDetectedOwner); aViewCube->HasAnimation(); )
{
aViewCube->UpdateAnimation();
… // 更新应用程序窗口
}
包括变换循环。
此循环允许外部操作,例如应用程序更新。为此,AIS_ViewCube 在应用程序级别上具有虚拟接口 onAfterAnimation(),应在此重新定义。
方法
//! 如果指定的方向属于立方体的一个面,则返回TRUE。
bool IsBoxSide (V3d_TypeOfOrientation theOrient);
//! 如果指定的方向属于立方体的一个边,则返回TRUE。
bool IsBoxEdge (V3d_TypeOfOrientation theOrient);
//! 如果指定的方向属于立方体的一个角(顶点),则返回TRUE。
bool IsBoxCorner (V3d_TypeOfOrientation theOrient);
//! 空构造函数。
AIS_ViewCube();
//! 返回视图动画。
const Handle(AIS_AnimationCamera)& ViewAnimation() const { return myViewAnimation; }
//! 设置视图动画。
SetViewAnimation (const Handle(AIS_AnimationCamera)& theAnimation) { myViewAnimation = theAnimation; }
//! 如果启用自动在选择(高亮)时进行相机转换,则返回TRUE;默认为TRUE。
ToAutoStartAnimation() const { return myToAutoStartAnim; }
//! 启用/禁用选择(高亮)时的自动相机转换。
//! 如果应用程序希望根据拾取结果(AIS_ViewCubeOwner)手动执行操作,则可以禁用自动逻辑。
void SetAutoStartAnimation (bool theToEnable) { myToAutoStartAnim = theToEnable; }
//! 如果相机动画应在不间断循环中进行,则返回TRUE;默认为TRUE。
Standard_Boolean IsFixedAnimationLoop() const { return myIsFixedAnimation; }
//! 设置相机动画是否应在不间断循环中进行。
void SetFixedAnimationLoop (bool theToEnable) { myIsFixedAnimation = theToEnable; }
//! 它不会重置视图立方体的位置。
void ResetStyles();
设置默认的可视属性。
void setDefaultAttributes();
//! 设置默认的动态高亮属性。
void setDefaultHighlightAttributes();
几何管理API
//! @return 视图立方体面的大小(宽度和高度);默认为100。
Standard_Real Size() ;
//! 设置视图立方体面的大小(宽度和高度)。
//! theToAdaptAnother 如果为TRUE,则将自动调整其他参数以适应指定的大小。
void SetSize (Standard_Real theValue,Standard_Boolean theToAdaptAnother = true);
//! 返回盒子面到边/角面分割的盒子面扩展;默认为10。
Standard_Real BoxFacetExtension() ;
//! 设置盒子面扩展的新值。
void SetBoxFacetExtension (Standard_Real theValue);
//! 返回轴与3D部分(盒子)之间的间距;默认为10。
Standard_Real AxesPadding() const { return myAxesPadding; }
//! 设置轴与3D部分(盒子)之间的新间距值。
void SetAxesPadding (Standard_Real theValue);
//! 返回盒子边缘与盒子面之间的间隙;默认为0。
Standard_Real BoxEdgeGap() const { return myBoxEdgeGap; }
//! 设置盒子边缘间隙的新值。
void SetBoxEdgeGap (Standard_Real theValue);
//! 返回盒子边缘的最小大小;默认为2。
Standard_Real BoxEdgeMinSize() const { return myBoxEdgeMinSize; }
//! 设置盒子边缘的最小大小的新值。
void SetBoxEdgeMinSize (Standard_Real theValue);
//! 返回盒子角(顶点)的最小大小;默认为2。
Standard_Real BoxCornerMinSize() const { return myCornerMinSize; }
//! 设置盒子角(顶点)的最小大小的新值。
void SetBoxCornerMinSize (Standard_Real theValue);
//! 返回视图立方体边角(圆角矩形)的相对半径;默认为0.0。
//! 该值在[0, 0.5]范围内,意味着绝对半径=RoundRadius() / Size()。
Standard_Real RoundRadius() ;
//! 设置视图立方体边角(圆角矩形)的相对半径。
该值应在[0, 0.5]范围内。
Standard_EXPORT void SetRoundRadius ;
//! 返回三轴的半径;默认为1.0。
Standard_Real AxesRadius() ;
//! 设置三轴的半径。
void SetAxesRadius (const Standard_Real theRadius);
//! 返回三轴圆锥的半径;默认为3.0。
Standard_Real AxesConeRadius() ;
//! 设置三轴圆锥的半径。
void SetAxesConeRadius (Standard_Real theRadius);
//! 返回三轴球(中心点)的半径;默认为4.0。
Standard_Real AxesSphereRadius();
//! 设置三轴球(中心点)的半径。
void SetAxesSphereRadius (Standard_Real theRadius);
//! return 如果绘制三轴,则返回TRUE;默认为TRUE。
Standard_Boolean ToDrawAxes();
//! 启用/禁用绘制三轴。
void SetDrawAxes (Standard_Boolean theValue);
//! @return 如果绘制视图立方体的边缘,则返回TRUE;默认为TRUE。
Standard_Boolean ToDrawEdges() ;
//! 启用/禁用绘制视图立方体的边缘。
void SetDrawEdges (Standard_Boolean theValue);
//! 返回如果绘制视图立方体的顶点(角),则返回TRUE;默认为TRUE。
Standard_Boolean ToDrawVertices() const { return myToDisplayVertices; }
//! 启用/禁用绘制视图立方体的顶点(角)。
void SetDrawVertices (Standard_Boolean theValue);
//! 如果应用程序期望Y-up视图方向而不是Z-up,则返回TRUE;默认为FALSE。
Standard_Boolean IsYup() ;
//! 设置应用程序是否期望Y-up视图方向而不是Z-up。
Standard_EXPORT void SetYup (Standard_Boolean theIsYup,
Standard_Boolean theToUpdateLabels = Standard_True);
样式管理API
//! 返回盒子面的着色样式。
const Handle(Prs3d_ShadingAspect)& BoxSideStyle();
//! 返回盒子边的显示样式。
const Handle(Prs3d_LineAspect)& BoxEdgeStyle();
//! 返回盒子角(顶点)的显示样式。
const Handle(Prs3d_PointAspect)& BoxCornerStyle() ;
//! 返回轴线的显示样式。
const Handle(Prs3d_LineAspect)& AxesStyle();
//! 返回轴线顶部圆锥的显示样式。
const Handle(Prs3d_ShadingAspect)& AxesConeStyle() ;
//! 返回轴线顶部球(中心点)的显示样式。
const Handle(Prs3d_PointAspect)& AxesSphereStyle() ;
//! 设置盒子面的着色样式。
void SetBoxSideStyle (const Handle(Prs3d_ShadingAspect)& theAspect);
//! 设置盒子边的显示样式。
void SetBoxEdgeStyle (const Handle(Prs3d_LineAspect)& theAspect);
//! 设置盒子角(顶点)的显示样式。
void SetBoxCornerStyle (const Handle(Prs3d_PointAspect)& theAspect);
//! 设置轴线的显示样式。
void SetAxesStyle (const Handle(Prs3d_LineAspect)& theAspect);
//! 设置轴线顶部圆锥的显示样式。
void SetAxesConeStyle (const Handle(Prs3d_ShadingAspect)& theAspect);
//! 设置轴线顶部球(中心点)的显示样式。
void SetAxesSphereStyle (const Handle(Prs3d_PointAspect)& theAspect);
public: //! @name 显示属性管理API
//! 返回视图立方体的可见性。
Standard_Boolean IsVisible() ;
//! 设置视图立方体的可见性。
Standard_EXPORT void SetVisible (Standard_Boolean theToDisplay);
//! @return 返回三轴的可见性。
Standard_Boolean AreAxesVisible() const { return myToDisplayAxes; }
//! 设置三轴的可见性。
Standard_EXPORT void SetAxesVisible (Standard_Boolean theToDisplay);
//! @return 返回视图立方体的边的可见性。
Standard_Boolean AreEdgesVisible() const { return myToDisplayEdges; }
//! 设置视图立方体的边的可见性。
Standard_EXPORT void SetEdgesVisible (Standard_Boolean theToDisplay);
//! @return 返回视图立方体的顶点(角)的可见性。
Standard_Boolean AreVerticesVisible() const { return myToDisplayVertices; }
//! 设置视图立方体的顶点(角)的可见性。
Standard_EXPORT void SetVerticesVisible (Standard_Boolean theToDisplay);
//! 返回视图立方体的标签是否可见。
Standard_Boolean AreLabelsVisible() const { return myToDisplayLabels; }
//! 设置视图立方体的标签是否可见。
Standard_EXPORT void SetLabelsVisible (Standard_Boolean theToDisplay);
标签管理API
//! 返回盒子面的标签的文本样式。
const Handle(Graphic3d_AspectText3d)& BoxSideTextStyle() const { return myTextStyle; }
//! 返回盒子边的标签的文本样式。
const Handle(Graphic3d_AspectText3d)& BoxEdgeTextStyle() const { return myTextStyle; }
//! 返回盒子角(顶点)的标签的文本样式。
const Handle(Graphic3d_AspectText3d)& BoxCornerTextStyle() const { return myTextStyle; }
//! 设置盒子面的标签的文本样式。
void SetBoxSideTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);
//! 设置盒子边的标签的文本样式。
void SetBoxEdgeTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);
//! 设置盒子角(顶点)的标签的文本样式。
void SetBoxCornerTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);
交互API
//! 返回当前视图立方体拾取的面。
AIS_ViewCubeOwner PickedOwner() const { return myPickedOwner; }
//! 返回是否可以拾取视图立方体。
Standard_Boolean IsPickable() const { return myIsPickable; }
//! 设置是否可以拾取视图立方体。
void SetPickable (Standard_Boolean theIsPickable) { myIsPickable = theIsPickable; }
//! 返回拾取动作是否启用。
Standard_Boolean IsPickActionEnabled();
//! 启用/禁用拾取动作。
void SetPickActionEnabled (Standard_Boolean theToEnable) { myToEnablePickAction = theToEnable; }
//! 返回当前视图立方体面的方向。
如果视图立方体未拾取,则返回-1。
Standard_Integer PickedOrientation();
//! 返回视图立方体面的方向的角度。
Standard_Real PickedOrientationAngle();
//! @return 返回拾取到视图立方体的面的位置(UV参数范围为[0,1])。
gp_XY PickedLocation() ;
//! 返回视图立方体的拾取偏移量。
gp_XY PickShift() ;
//! 设置视图立方体的拾取偏移量。
void SetPickShift (const gp_XY& theShift) { myPickShift = theShift; }
//! 返回视图立方体拾取的边框面的偏移量。
Standard_Real BoxFacetPickShift() ;
//! 设置视图立方体拾取的边框面的偏移量。
void SetBoxFacetPickShift (Standard_Real theShift);
//! 返回视图立方体拾取的边框边的偏移量。
Standard_Real BoxEdgePickShift() ;
//! 设置视图立方体拾取的边框边的偏移量。
void SetBoxEdgePickShift (Standard_Real theShift);
//! 返回视图立方体拾取的角的偏移量。
Standard_Real BoxCornerPickShift();
//! 设置视图立方体拾取的角的偏移量。
void SetBoxCornerPickShift (Standard_Real theShift);
操作API
//! 将视图立方体放置到指定的视图和位置。
void Place (const Handle(V3d_View)& theView,
const AIS_ViewCubeLocation theLocation);
//! 将视图立方体放置到视图的默认位置。
void Place (const Handle(V3d_View)& theView);
//! 设置视图立方体的方向(面)。
void SetOrientation (const V3d_TypeOfOrientation theOrientation);
//! 设置视图立方体的位置。
void SetLocation (const AIS_ViewCubeLocation theLocation);
//! 设置视图立方体的位置和方向。
void SetPosition (const AIS_ViewCubeLocation theLocation,
const V3d_TypeOfOrientation theOrientation);
//! 将视图立方体放置到视图的默认位置和方向。
Standard_EXPORT void SetPosition (const Handle(V3d_View)& theView,
const AIS_ViewCubeLocation theLocation,
const V3d_TypeOfOrientation theOrientation);
返回视图立方体的当前位置。
Standard_EXPORT AIS_ViewCubeLocation currentLocation() const;
//! 返回指定的方向(面)。
Standard_EXPORT V3d_TypeOfOrientation orientationOf (const AIS_ViewCubeLocation theLocation) const;
使用方法
在OpenCASCADE中,AIS_ViewCube
是一个用于显示视图立方体(View Cube)的类,它提供了一个三维视图中用于导航的交互性控件。下面是一个简单的示例代码,展示如何在OpenCASCADE中使用AIS_ViewCube
类:
#include <AIS_ViewCube.hxx>
#include <V3d_View.hxx>
#include <Graphic3d_AspectText3d.hxx>
#include <Prs3d_Drawer.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <Graphic3d_AspectMarker3d.hxx>
#include <Graphic3d_AspectText3d.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_PointAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <Prs3d_TextAspect.hxx>
#include <TCollection_AsciiString.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <V3d_Viewer.hxx>
#include <AIS_InteractiveContext.hxx>
// 创建视图立方体并显示在指定的视图中
void createAndDisplayViewCube(const Handle(V3d_View)& view)
{
// 创建视图立方体
Handle(AIS_ViewCube) viewCube = new AIS_ViewCube();
// 设置视图立方体的位置(这里选择了默认位置)
viewCube->Place(view);
// 设置视图立方体的方向(这里选择了默认方向)
viewCube->SetOrientation(V3d_XposYnegZpos);
// 设置视图立方体的可见性(默认可见)
viewCube->SetVisible(Standard_True);
// 将视图立方体添加到交互式上下文中
Handle(AIS_InteractiveContext) context = view->Viewer()->InteractiveContext();
context->Display(viewCube, Standard_True);
}
int main()
{
// 初始化OpenCASCADE图形驱动
Handle(OpenGl_GraphicDriver) graphicDriver = new OpenGl_GraphicDriver();
// 创建视图
Handle(V3d_Viewer) viewer = new V3d_Viewer(graphicDriver);
Handle(V3d_View) view = viewer->CreateView();
// 将视图显示在窗口中(这里省略窗口创建和初始化的代码)
// 创建和显示视图立方体
createAndDisplayViewCube(view);
// 运行主事件循环等待用户操作(这里省略事件循环的代码)
return 0;
}
代码解析:
-
头文件包含:
#include <AIS_ViewCube.hxx>
:引入AIS_ViewCube
类的头文件。- 其他头文件用于引入所需的OpenCASCADE类和数据类型。
-
createAndDisplayViewCube函数:
createAndDisplayViewCube
函数用于创建和显示视图立方体。- 创建
AIS_ViewCube
对象,并设置其位置和方向。 - 将
AIS_ViewCube
添加到交互式上下文中,以便在视图中显示。
-
主函数main:
- 创建OpenCASCADE图形驱动和视图对象。
- 创建和显示视图立方体,调用
createAndDisplayViewCube
函数。 - 主事件循环等待用户操作,这里未提供完整的事件处理代码。
-
注意事项:
- 代码中省略了窗口创建和事件循环等部分,这些通常需要根据具体的应用程序环境来实现。
- 在实际应用中,还可以根据需求调整视图立方体的其他属性,如样式、标签等。
这段示例代码演示了如何在OpenCASCADE中创建和显示一个基本的视图立方体控件。