[DTK] Qt开发-3D图形引擎:opencascade,AIS_ViewCube(视方体)的实现
Tofloor
poster avatar
deepin
2023-02-24 08:49
Author

前言
430CF446CE4E41CC00BA4C2B25DAA327.jpg
在CAD软件的开发过程中,3D几何体其实都有一定的方向来确定其结构的差异,一般我们会通过右视图后视图顶视图左视图正视图底视图来确定几何体每个方位所在,让绘制的3D集合体在绘图界面中的操作更有方向感。

指定几何体结构方向的工具-视方体,及QT代码
A14EB93349FFA6036F6BC81AFCDFFAE8.jpg
为了知道已绘制的几何体的某一个平面或朝向,opencascade图形引擎为我们提供了AIS_ViewCube这一个工具,在开发文档中被称为“视方体”。

视方体,主要的作用就是我们绘图者在旋转几何体时,几何体当前朝我们正面展示的平面结构时,它会通过文本的形式在视方体上显示其视图的朝向,如右视图后视图顶视图左视图正视图底视图

具体的Qt代码实现内容如下:

(1).项目结构,如下图:

image.png

(2)相关代码块:

**.**文件occview.h要导入和开启AIS_ViewCube
image.png

.文件occview.cpp需要设置AIS_ViewCube,可以改变它的边框大小、颜色,以及相关坐标轴的颜色、坐标轴XYZ字体的颜色。

#include "occview.h"
#include "ui_occview.h"
#include "Prs3d_DatumAspect.hxx"

OccView::OccView(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::OccView)
{
    ui->setupUi(this);

    if(m_context.IsNull()){
        Handle(Aspect_DisplayConnection) m_display_connection = new Aspect_DisplayConnection();
        if(m_graphic_driver.IsNull()){
            m_graphic_driver = new OpenGl_GraphicDriver(m_display_connection);
        }


            NSView* aViewHandle = (NSView*)winId();
            window = new Cocoa_Window(aViewHandle);

            // 创建图形系统驱动
            m_viewer = new V3d_Viewer(m_graphic_driver);
            m_view = m_viewer->CreateView();
            m_view->SetWindow(window);

            if(!window->IsMapped()){
                window->Map();
            }

            m_context = new AIS_InteractiveContext(m_viewer);
            m_viewer->SetDefaultLights();
            m_viewer->SetLightOn();

            m_view->SetBackgroundColor(Quantity_NOC_GRAY60);
            m_view->MustBeResized();

            // 激活格栅
            m_viewer->ActivateGrid (Aspect_GT_Rectangular, Aspect_GDM_Lines);

            // 显示三维坐标系
            m_view->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD,0.08,V3d_ZBUFFER);

            // 显示视方体
            h_AisViewCube = new AIS_ViewCube();
            h_AisViewCube->SetSize(20.0,true);   //视方体大小
            m_context->SetDisplayMode(AIS_Shaded,true);
            h_AisViewCube->SetBoxColor(Quantity_NOC_WHITE); //设置视方体为白色
//            h_AisViewCube->SetBoxSideLabel(V3d_Xpos,"右视图");
//            h_AisViewCube->SetBoxSideLabel(V3d_Ypos,"后视图");
//            h_AisViewCube->SetBoxSideLabel(V3d_Zpos,"顶视图");
//            h_AisViewCube->SetBoxSideLabel(V3d_Zneg,"左视图");
//            h_AisViewCube->SetBoxSideLabel(V3d_Zneg,"正视图");
//            h_AisViewCube->SetBoxSideLabel(V3d_Zneg,"底视图");
            h_AisViewCube->SetTransparency(0.2);    //透明度
            h_AisViewCube->SetTextColor(Quantity_Color(Quantity_NOC_BLACK)); //设置视方体为黑色

            h_AisViewCube->SetFontHeight(10);   //字体高度


//            h_AisViewCube->SetMaterial(Graphic3d_MaterialAspect(Graphic3d_NOM_GOLD));

            //视方体的边界线设置
            const Handle(Prs3d_Drawer)& myDrawer =  h_AisViewCube->Attributes();
            myDrawer->SetupOwnFaceBoundaryAspect();
            myDrawer->SetFaceBoundaryDraw(true);

            myDrawer->FaceBoundaryAspect()->SetColor(Quantity_NameOfColor::Quantity_NOC_GRAY);
            myDrawer->FaceBoundaryAspect()->SetWidth(1.0);

            myDrawer->SetDatumAspect (new Prs3d_DatumAspect());

            //视方体坐标轴颜色设置
            const Handle_Prs3d_DatumAspect& datumAspect = h_AisViewCube->Attributes()->DatumAspect();
            datumAspect->ShadingAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
            datumAspect->ShadingAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
            datumAspect->ShadingAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
            //坐标轴文本颜色设置
            datumAspect->TextAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
            datumAspect->TextAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
            datumAspect->TextAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);

            h_AisViewCube->SetTransformPersistence(
                        new Graphic3d_TransformPers(
                            Graphic3d_TMF_TriedronPers,
                            Aspect_TOTP_RIGHT_UPPER,
                            Graphic3d_Vec2i(100,100)
                            )
                        );

            m_context->Display(h_AisViewCube,Standard_True);
        }

        setAttribute(Qt::WA_PaintOnScreen);
        setAttribute(Qt::WA_NoSystemBackground);
        setBackgroundRole(QPalette::NoRole);
        setFocusPolicy(Qt::StrongFocus);

        setMouseTracking(true);
}

OccView::~OccView()
{
    delete ui;
}

代码需要优化的一些地方

1.视方体中的文本或文字,没有实现中文国际化,目前这些视图文本名称(如左视图、右视图)需要中文国际化;

2.视方体这个工具,需要在绘图区域重新确定显示位置;

3.视方体的整体大小变化,会在QT窗口变大时自动变小,与刚启动时设定的值其显示有差异。

结语:

opencascade的工具-视方体(AIS_ViewCube),可以通过视图方位很明确的指出几何体的朝向。对于绘图者来讲,这个在绘制几何体时能够快速找到要绘制的部位,其结构也很明确。

关于以上内容,很多开源社区也有相关代码实现,希望论坛内感兴趣的开发者能够继续进行优化和改进。

Reply Favorite View the author
All Replies
deepin
2023-02-24 08:53
#1

FF32828419E9AED0F813CEA59D704E6B.jpg

Reply View the author
fuuko
deepin
2023-02-24 16:29
#2

需要优化的地方可以加一条没有js调用接口,不然都不像你的风格joy

Reply View the author
deepin
2023-02-24 20:15
#3
fuuko

需要优化的地方可以加一条没有js调用接口,不然都不像你的风格joy

opencascade,有JS版。

Reply View the author