分享
 
 
 

Implement the 3D view window in a Dialog with OpenCascade

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Implement the 3D view window in a Dialog with OpenCascade

【Preview】

【Motivation】

In my application about simulation on the Real Structure Elements in a construction, the calculation of some parameters is the mainly task which will be solved by the 3D graphic boolean method with Opencascade SDK. However, the white-box test unit should be established before the main module.

First, I think that the visual tools like the a dialog or a window will be helpful to check the boolean arithmetic in my application. Second, a window OCX or light-weight visual tool is mascara for the future.

【Design Item】

A window class “C3DWnd” is designed for disaplaying the Simulated Elements using in the main module. And a instance of the C3DWnd is aggregated in a Dialog class. Based the Idea of the Component, C3DWnd is nested in a DLL module which can be encapsulated as an OCX. On the other hand the “Dialog class” is nested in another module as an “exe file”.

【Code Background】

System: Window XP,sp1;

Compiler: Visual C++ 6.0,sp6;

SDK: Opencascade 5.1;

【Detail】

1、C3DWnd class

// 3DWnd.h : header file

//

#include <V3d_View.hxx>

#include <TPrsStd_AISViewer.hxx>

#include <Graphic3d_WNTGraphicDevice.hxx>

#include <AIS_InteractiveContext.hxx>

#include <WNT_Window.hxx>

#include <Handle_V3d_PositionalLight.hxx>

#ifndef __AFXWIN_H__

#error include 'stdafx.h' before including this file for PCH

#endif

#undef DLLIMPEXP

#ifdef _3DViewDLL_

#define DLLIMPEXP __declspec(dllexport)

#else

#define DLLIMPEXP

#endif

/////////////////////////////////////////////////////////////////////////////

// C3DWnd window

enum View3D_CurrentAction {

CurAction3d_Nothing,

CurAction3d_DynamicZooming,

CurAction3d_WindowZooming,

CurAction3d_DynamicPanning,

CurAction3d_GlobalPanning,

CurAction3d_DynamicRotation,

CurAction3d_BeginSpotLight,

CurAction3d_TargetSpotLight,

CurAction3d_EndSpotLight,

CurAction3d_BeginPositionalLight,

CurAction3d_BeginDirectionalLight,

CurAction3d_EndDirectionalLight

};

class __declspec(dllexport) C3DWnd : public CWnd

{

// Construction

public:

C3DWnd();

// Attributes

public:

enum LineStyle { Solid, Dot, ShortDash, LongDash, Default };

// Operations

public:

virtual void DrawRectangle (const Standard_Integer MinX ,

const Standard_Integer MinY ,

const Standard_Integer MaxX ,

const Standard_Integer MaxY ,

const Standard_Boolean Draw ,

const LineStyle aLineStyle = Default );

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(C3DWnd)

public:

//}}AFX_VIRTUAL

// Implementation

public:

void ShowFace(unsigned long nFaceID);

void ShowSolid(const int nID);

void DispplayText();

void DisplayAxis();

void Refresh();

void Clear();

void Right();

void Top();

void Left();

void Front();

void Bottom();

void Back();

void Axo();

void HideOff();

void HideOn();

void Rotate();

void PanGlobal();

void Pan();

void ZoomProg();

void ZoomWin();

void ZoolAll();

void ShowVolume();

virtual ~C3DWnd();

// Generated message map functions

protected:

//{{AFX_MSG(C3DWnd)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnSize(UINT nType, int cx, int cy);

afx_msg void OnPaint();

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

//画鼠标拉框用的笔:

CPen* m_pPen;

//3D视图指针:

Handle_V3d_View m_pView;

//视图容器类:

Handle_V3d_Viewer m_pViewer;

//window窗口框架:

Handle_WNT_Window m_pWNTWindow;

//选择图形和管理图形行为:

Handle_AIS_InteractiveContext m_pAISContext;

//初始化Windows NT Graphic Device:

Handle_Graphic3d_WNTGraphicDevice m_pGraphicDevice;

//位置灯光设置

Handle_V3d_PositionalLight m_pCurrent_PositionalLight;

//隐藏的标志:

Standard_Boolean m_DegenerateModeIsOn;

//当前的命令状态:

View3D_CurrentAction m_CurrentMode;

//当前缩放比例:

Quantity_Factor m_CurZoom;

//图像视图的宽度:

Standard_Real m_rWidth;

//图像视图的高度:

Standard_Real m_rHeight;

Standard_Integer m_Atx , m_Aty , m_Atz ;//

Standard_Integer m_Eyex , m_Eyey , m_Eyez ;//

};

/////////////////////////////////////////////////////////////////////////////

// 3DWnd.cpp : implementation file

//

#include "stdafx.h"

#include "3DWnd.h"

#include <AIS_ListOfInteractive.hxx>

#include <AIS_ListIteratorOfListOfInteractive.hxx>

#include <BRepPrimAPI_MakeSphere.hxx>

#include <AIS_Trihedron.hxx>

#include <Geom_Axis2Placement.hxx>

#include "..\..\..\..\GCL7\Source\GeoCalc\ExportFunc.h"

#ifdef _DEBUG

//#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

gp_Pnt p1,p2,p3;

/////////////////////////////////////////////////////////////////////////////

// C3DWnd

Standard_Integer cXmin = 0;

Standard_Integer cYmin = 0;

Standard_Integer cXmax = 600;

Standard_Integer cYmax = 600;

Standard_Integer cZmin = 0;

Standard_Integer cZmax = 200;

Standard_Integer cZoomStep = 20;

#define ValZWMin 1

gp_Pnt ConvertClickToPoint(Standard_Real x, Standard_Real y, Handle(V3d_View) aView)

{

V3d_Coordinate XEye,YEye,ZEye,XAt,YAt,ZAt;

aView->Eye(XEye,YEye,ZEye);

aView->At(XAt,YAt,ZAt);

gp_Pnt EyePoint(XEye,YEye,ZEye);

gp_Pnt AtPoint(XAt,YAt,ZAt);

gp_Vec EyeVector(EyePoint,AtPoint);

gp_Dir EyeDir(EyeVector);

gp_Pln PlaneOfTheView = gp_Pln(AtPoint,EyeDir);

Standard_Real X,Y,Z;

aView->Convert(int(x),int(y),X,Y,Z);

gp_Pnt ConvertedPoint(X,Y,Z);

gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView,ConvertedPoint);

gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(),

ConvertedPointOnPlane.Y(),

PlaneOfTheView);

return ResultPoint;

}

C3DWnd::C3DWnd()

{

m_pView = NULL;

m_pViewer = NULL;

m_pAISContext = NULL;

m_pGraphicDevice = NULL;

m_pWNTWindow = NULL;

m_CurrentMode = CurAction3d_Nothing;

m_CurZoom = 0;

m_pPen = NULL;

m_DegenerateModeIsOn=Standard_True;

}

C3DWnd::~C3DWnd()

{

m_pView->Remove();

if (m_pPen != NULL)

delete m_pPen;

}

BEGIN_MESSAGE_MAP(C3DWnd, CWnd)

//{{AFX_MSG_MAP(C3DWnd)

ON_WM_CREATE()

ON_WM_SIZE()

ON_WM_PAINT()

ON_WM_MOUSEMOVE()

ON_WM_MOUSEWHEEL()

ON_WM_LBUTTONUP()

ON_WM_LBUTTONDOWN()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// C3DWnd message handlers

int C3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CWnd::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: Add your specialized creation code here

// Creating View

try

{

m_pGraphicDevice = new Graphic3d_WNTGraphicDevice();

}

catch(Standard_Failure)

{

AfxMessageBox("Fatal Error During Graphic Initialisation");

};

m_pViewer = new V3d_Viewer(m_pGraphicDevice, (short *) (""));

m_pViewer->SetDefaultLights();

m_pViewer->SetLightOn();

// Create an interactive context based on the m_pViewer

m_pAISContext = new AIS_InteractiveContext(m_pViewer);

m_pView = m_pViewer->CreateView();

m_pView->SetDegenerateModeOn();

// store for restore state after rotation (witch is in Degenerated mode)

m_DegenerateModeIsOn = Standard_True;

// Creating new Window and attaching it to View

m_pWNTWindow = new WNT_Window(m_pGraphicDevice,GetSafeHwnd());

m_pView->SetWindow(m_pWNTWindow );

if (!m_pWNTWindow->IsMapped()) m_pWNTWindow ->Map();

DisplayAxis();

return 0;

}

void C3DWnd::OnSize(UINT nType, int cx, int cy)

{

CWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

if (m_pView != NULL){

m_pView->MustBeResized();

m_pView->Size(m_rWidth, m_rHeight);

}

}

void C3DWnd::OnPaint()

{

CPaintDC dc(this); // device context for painting

CRect aRect;

GetWindowRect(aRect);

if(m_rWidth != aRect.Width() || m_rHeight != aRect.Height()) {

m_rWidth = aRect.Width();

m_rHeight = aRect.Height();

::PostMessage ( GetSafeHwnd () , WM_SIZE , SW_SHOW , m_rWidth + m_rHeight*65536 );

}

// TODO: Add your message handler code here

m_pView->Redraw();

// Do not call CWnd::OnPaint() for painting messages

}

void C3DWnd::ShowVolume()

{

Clear();

CArrLong arrID;

GetSolidsID(arrID);

for (int i = 0; i < arrID.GetSize(); i++){

TopoDS_Solid solid = GetSolidByID(arrID.GetAt(i));

Handle(AIS_Shape) ais = new AIS_Shape(solid);

m_pAISContext->SetColor(ais,Quantity_NOC_GREEN,Standard_False);

m_pAISContext->SetMaterial(ais,Graphic3d_NOM_GOLD,Standard_False);

m_pAISContext->SetDisplayMode(ais,1);

m_pAISContext->Display(ais,Standard_False);

}

GetFacesID(arrID);

for ( i = 0; i < arrID.GetSize(); i++){

TopoDS_Face Face ;

if (!GetFaceByID(arrID.GetAt(i), Face))

break;

Handle(AIS_Shape) ais = new AIS_Shape(Face);

m_pAISContext->SetColor(ais,Quantity_NOC_GRAY99,Standard_False);

m_pAISContext->SetMaterial(ais,Graphic3d_NOM_STONE,Standard_False);

m_pAISContext->SetDisplayMode(ais,1);

m_pAISContext->Display(ais,Standard_False);

}

m_pView->FitAll();

m_pView->ZFitAll();

/* TopoDS_Shape S = BRepPrimAPI_MakeWedge(600.,100.,80.,20.);

Handle(AIS_Shape) ais1 = new AIS_Shape(S);

m_pAISContext->SetColor(ais1,Quantity_NOC_GREEN,Standard_False);

m_pAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);

m_pAISContext->Display(ais1,Standard_False);

BRepPrimAPI_MakeSphere S2(gp_Pnt(0,300,0), 100.);

Handle(AIS_Shape) aSphere = new AIS_Shape(S2.Shape());

m_pAISContext->SetMaterial(aSphere,Graphic3d_NOM_SILVER);

m_pAISContext->SetDisplayMode(aSphere,1);

m_pAISContext->Display(aSphere);

m_pView->FitAll();

m_pView->ZFitAll();

AIS_ListOfInteractive aList;

m_pAISContext->DisplayedObjects(aList);

AIS_ListIteratorOfListOfInteractive aListIterator;

for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){

m_pAISContext->Remove(aListIterator.Value());

}

TColgp_Array1OfPnt Points1(1,4);

Points1.SetValue(1,gp_Pnt(0,0,0));

Points1.SetValue(2,gp_Pnt(2,1,0));

Points1.SetValue(3,gp_Pnt(4,0,0));

Points1.SetValue(4,gp_Pnt(6,2,0));

GeomAPI_PointsToBSpline PTBS1(Points1);

Handle(Geom_BSplineCurve) BSC1 = PTBS1.Curve();

TopoDS_Edge S = BRepBuilderAPI_MakeEdge(BSC1).Edge();

Handle(AIS_Shape) ais1 = new AIS_Shape(S);

m_pAISContext->SetColor(ais1,Quantity_NOC_GREEN,Standard_False);

m_pAISContext->SetMaterial(ais1,Graphic3d_NOM_PLASTIC,Standard_False);

m_pAISContext->Display(ais1,Standard_False);

m_pView->FitAll();

m_pView->ZFitAll();*/

}

void C3DWnd::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if ( nFlags & MK_LBUTTON)

{

if ( nFlags & MK_CONTROL )

{

// move with MB1 and Control : on the dynamic zooming

// Do the zoom in function of mouse's coordinates

m_pView->Zoom(cXmax,cYmax,point.x,point.y);

// save the current mouse coordinate in min

cXmax = point.x;

cYmax = point.y;

}

else // if ( Ctrl )

{

switch (m_CurrentMode)

{

case CurAction3d_Nothing :

cXmax = point.x; cYmax = point.y;

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_False);

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_True);

break;

case CurAction3d_DynamicZooming :

m_pView->Zoom(cXmax,cYmax,point.x,point.y);

// save the current mouse coordinate in min \n";

cXmax=point.x; cYmax=point.y;

break;

case CurAction3d_WindowZooming :

cXmax = point.x; cYmax = point.y;

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_False,LongDash);

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_True,LongDash);

break;

case CurAction3d_DynamicPanning :

m_pView->Pan(point.x-cXmax,cYmax-point.y); // Realize the panning

cXmax = point.x; cYmax = point.y;

break;

case CurAction3d_GlobalPanning : // nothing

break;

case CurAction3d_DynamicRotation :

m_pView->Rotation(point.x,point.y);

m_pView->Redraw();

break;

default :

Standard_Failure::Raise(" incompatible Current Mode ");

break;

}

}

}

CWnd::OnMouseMove(nFlags, point);

}

void C3DWnd::DrawRectangle(const Standard_Integer MinX ,

const Standard_Integer MinY ,

const Standard_Integer MaxX ,

const Standard_Integer MaxY ,

const Standard_Boolean Draw ,

const LineStyle aLineStyle)

{

static int m_DrawMode;

if (!m_pPen && aLineStyle ==Solid )

{m_pPen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;}

else if (!m_pPen && aLineStyle ==Dot )

{m_pPen = new CPen(PS_DOT, 1, RGB(0,0,0)); m_DrawMode = R2_XORPEN;}

else if (!m_pPen && aLineStyle == ShortDash)

{m_pPen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;}

else if (!m_pPen && aLineStyle == LongDash)

{m_pPen = new CPen(PS_DASH, 1, RGB(0,0,0)); m_DrawMode = R2_NOTXORPEN;}

else if (aLineStyle == Default)

{ m_pPen = NULL; m_DrawMode = R2_MERGEPENNOT;}

CPen* aOldPen;

CClientDC clientDC(this);

if (m_pPen) aOldPen = clientDC.SelectObject(m_pPen);

clientDC.SetROP2(m_DrawMode);

static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;

static Standard_Boolean m_IsVisible;

if ( m_IsVisible && !Draw) // move or up : erase at the old position

{

clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);

clientDC.LineTo(StoredMaxX,StoredMaxY);

clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);

m_IsVisible = false;

}

StoredMinX = min ( MinX, MaxX );

StoredMinY = min ( MinY, MaxY );

StoredMaxX = max ( MinX, MaxX );

StoredMaxY = max ( MinY, MaxY);

if (Draw) // move : draw

{

clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY);

clientDC.LineTo(StoredMaxX,StoredMaxY);

clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);

m_IsVisible = true;

}

if (m_pPen) clientDC.SelectObject(aOldPen);

}

BOOL C3DWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

// move with MB1 and Control : on the dynamic zooming

// Do the zoom in function of mouse's coordinates

m_CurZoom = m_pView->Scale();

cXmax = pt.x + zDelta/cZoomStep;

cYmax = pt.y + zDelta/cZoomStep;

if (cYmax < 0) cYmax = 0;

if (cXmax < 0) cXmax = 0;

m_pView->Zoom(cXmax,cYmax,pt.x,pt.y);

return TRUE;

// return CWnd::OnMouseWheel(nFlags, zDelta, pt);

}

void C3DWnd::OnLButtonUp(UINT nFlags, CPoint point)

{

if ( nFlags & MK_CONTROL )

{

return;

}

else // if ( Ctrl )

{

switch (m_CurrentMode)

{

case CurAction3d_Nothing :

if (point.x == cXmin && point.y == cYmin)

{ // no offset between down and up --> selectEvent

cXmax=point.x;

cYmax=point.y;

} else

{

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_False);

cXmax=point.x;

cYmax=point.y;

}

break;

case CurAction3d_DynamicZooming :

m_CurrentMode = CurAction3d_Nothing;

break;

case CurAction3d_WindowZooming :

DrawRectangle(cXmin,cYmin,cXmax,cYmax,Standard_False);

cXmax=point.x;

cYmax=point.y;

if ((abs(cXmin-cXmax)>ValZWMin) || (abs(cYmin-cYmax)>ValZWMin))

{

// Do the zoom window between Pmin and Pmax

m_pView->WindowFitAll(cXmin,cYmin,cXmax,cYmax);

}

m_CurrentMode = CurAction3d_Nothing;

break;

case CurAction3d_DynamicPanning :

m_CurrentMode = CurAction3d_Nothing;

break;

case CurAction3d_GlobalPanning :

m_pView->Place(point.x,point.y,m_CurZoom);

m_CurrentMode = CurAction3d_Nothing;

break;

case CurAction3d_DynamicRotation :

m_CurrentMode = CurAction3d_Nothing;

break;

}

}

}

void C3DWnd::OnLButtonDown(UINT nFlags, CPoint point)

{

// save the current mouse coordinate in min

cXmin=point.x; cYmin=point.y;

cXmax=point.x; cYmax=point.y;

if ( nFlags & MK_CONTROL )

{

// Button MB1 down Control :start zomming

// SetCursor(AfxGetApp()->LoadStandardCursor());

}

else // if ( Ctrl )

{

switch (m_CurrentMode)

{

case CurAction3d_Nothing : // start a drag

break;

case CurAction3d_DynamicZooming :

break;

case CurAction3d_WindowZooming :

break;

case CurAction3d_DynamicPanning :

break;

case CurAction3d_GlobalPanning :

break;

case CurAction3d_DynamicRotation :

if (!m_DegenerateModeIsOn)

m_pView->SetDegenerateModeOn();

m_pView->StartRotation(point.x,point.y);

break;

case CurAction3d_BeginPositionalLight :

break;

case CurAction3d_BeginSpotLight :

break;

case CurAction3d_TargetSpotLight :

break;

case CurAction3d_EndSpotLight :

break;

case CurAction3d_BeginDirectionalLight:

break;

case CurAction3d_EndDirectionalLight:

break;

}

}

CWnd::OnLButtonDown(nFlags, point);

}

void C3DWnd::ZoolAll()

{

m_pView->FitAll();

m_pView->ZFitAll();

}

void C3DWnd::ZoomWin()

{

m_CurrentMode = CurAction3d_WindowZooming;

}

void C3DWnd::ZoomProg()

{

m_CurrentMode = CurAction3d_DynamicZooming;

}

void C3DWnd::Pan()

{

m_CurrentMode = CurAction3d_DynamicPanning;

}

void C3DWnd::PanGlobal()

{

m_CurZoom = m_pView->Scale();

// Do a Global Zoom

//myView->FitAll();

m_CurrentMode = CurAction3d_GlobalPanning;

}

void C3DWnd::Rotate()

{

m_CurrentMode = CurAction3d_DynamicRotation;

}

void C3DWnd::HideOn()

{

m_pView->SetDegenerateModeOff();

m_DegenerateModeIsOn = Standard_False;

}

void C3DWnd::HideOff()

{

m_pView->SetDegenerateModeOn();

m_DegenerateModeIsOn = Standard_True;

}

void C3DWnd::Axo()

{

m_pView->SetProj(V3d_XposYnegZpos);

}

void C3DWnd::Back()

{

m_pView->SetProj(V3d_Xneg);

}

void C3DWnd::Bottom()

{

m_pView->SetProj(V3d_Zneg);

}

void C3DWnd::Front()

{

m_pView->SetProj(V3d_Xpos);

}

void C3DWnd::Left()

{

m_pView->SetProj(V3d_Ypos);

}

void C3DWnd::Top()

{

m_pView->SetProj(V3d_Zpos);

}

void C3DWnd::Right()

{

m_pView->SetProj(V3d_Yneg);

}

void C3DWnd::Clear()

{

AIS_ListOfInteractive aList;

m_pAISContext->DisplayedObjects(aList);

AIS_ListIteratorOfListOfInteractive aListIterator;

for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){

m_pAISContext->Remove(aListIterator.Value());

}

}

void C3DWnd::Refresh()

{

Clear();

DisplayAxis();

}

void C3DWnd::DisplayAxis()

{

Handle(AIS_Trihedron) aTrihedron;

Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(gp::XOY());

aTrihedron = new AIS_Trihedron(anAxis);

m_pAISContext->Display(aTrihedron);

}

void C3DWnd::DispplayText()

{

/*

TCollection_ExtendedString Text("Test");

Handle (Sample2D_Text) aText =

new Sample2D_Text(Text,

140,15*(j-5), // anX , anY

Aspect_TOT_SOLID,// aType

0.0 , // anAngle

0.0 , // aSlant

color++, // aColorIndex

2, // aFontIndex

j/10, // aScale

Standard_False, // aIsUnderline

Standard_True, // aIsZoomable

Graphic2d_TOA_TOPLEFT); // aTypeOfAlignment

myAISInteractiveContext2D->Display(aText, // object

Standard_False); // Redraw

if (color == my2DViewer->ColorMap()->Size()) color =1;*/

}

void C3DWnd::ShowSolid(const int nID)

{

Clear();

TopoDS_Solid solid = GetSolidByID(nID);

Handle(AIS_Shape) ais = new AIS_Shape(solid);

m_pAISContext->SetColor(ais,Quantity_NOC_GREEN,Standard_False);

m_pAISContext->SetMaterial(ais,Graphic3d_NOM_GOLD,Standard_False);

m_pAISContext->SetDisplayMode(ais,1);

m_pAISContext->Display(ais,Standard_False);

m_pView->FitAll();

m_pView->ZFitAll();

}

void C3DWnd::ShowFace(unsigned long nFaceID)

{

Clear();

TopoDS_Face Face ;

GetFaceByID(nFaceID, Face);

Handle(AIS_Shape) ais = new AIS_Shape(Face);

m_pAISContext->SetColor(ais,Quantity_NOC_GRAY99,Standard_False);

m_pAISContext->SetMaterial(ais,Graphic3d_NOM_STONE,Standard_False);

m_pAISContext->SetDisplayMode(ais,1);

m_pAISContext->Display(ais,Standard_False);

m_pView->FitAll();

m_pView->ZFitAll();

}

2、CTest3DViewDlg class

/////////////////////////////////////////////////////////////////////////////

// // Test3DViewDlg.h : header file

class C3DWnd;

class CTest3DViewDlg : public CDialog

{

// Construction

public:

CTest3DViewDlg(CWnd* pParent = NULL); // standard constructor

~CTest3DViewDlg();

// Dialog Data

//{{AFX_DATA(CTest3DViewDlg)

enum { IDD = IDD_TEST3DVIEW_DIALOG };

// NOTE: the ClassWizard will add data members here

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTest3DViewDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

HICON m_hIcon;

// Generated message map functions

//{{AFX_MSG(CTest3DViewDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

virtual void OnOK();

afx_msg void OnBtnShowvolume();

afx_msg void OnBtnZoomall();

afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);

afx_msg void OnBtnZoomwin();

afx_msg void OnBtnZoomprog();

afx_msg void OnBtnPan();

afx_msg void OnBtnPanGlobal();

afx_msg void OnBtnRotate();

afx_msg void OnBtnHideOn();

afx_msg void OnBtnHideOff();

afx_msg void OnBtnFront();

afx_msg void OnBtnTop();

afx_msg void OnBtnLeft();

afx_msg void OnBtnRight();

afx_msg void OnBtnBack();

afx_msg void OnBtnBottom();

afx_msg void OnBtnAxo();

afx_msg void OnBtnLoadData();

afx_msg void OnBtnBoolean();

afx_msg void OnBtnDisplay();

afx_msg void OnBtnBoolean2();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

C3DWnd *m_p3dWnd;

};

// Test3DViewDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Test3DView.h"

#include "Test3DViewDlg.h"

#include "..\3DViewDLL\3dWnd.h"

#include "LoadDataDlg.h"

#include "BoolDlg.h"

#include "DisplayDlg.h"

#include "BoolFaceCutDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CTest3DViewDlg dialog

CTest3DViewDlg::CTest3DViewDlg(CWnd* pParent /*=NULL*/)

: CDialog(CTest3DViewDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CTest3DViewDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_p3dWnd = NULL;

}

CTest3DViewDlg::~CTest3DViewDlg()

{

if (m_p3dWnd != NULL)

delete m_p3dWnd;

}

void CTest3DViewDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CTest3DViewDlg)

// NOTE: the ClassWizard will add DDX and DDV calls here

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CTest3DViewDlg, CDialog)

//{{AFX_MSG_MAP(CTest3DViewDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BTN_SHOWVOLUME, OnBtnShowvolume)

ON_BN_CLICKED(IDC_BTN_ZOOMALL, OnBtnZoomall)

ON_WM_MOUSEWHEEL()

ON_BN_CLICKED(IDC_BTN_ZOOMWIN, OnBtnZoomwin)

ON_BN_CLICKED(IDC_BTN_ZOOMPROG, OnBtnZoomprog)

ON_BN_CLICKED(IDC_BTN_PAN, OnBtnPan)

ON_BN_CLICKED(IDC_BTN_PANGLOBAL, OnBtnPanGlobal)

ON_BN_CLICKED(IDC_BTN_ROTATE, OnBtnRotate)

ON_BN_CLICKED(IDC_BTN_HIDEON, OnBtnHideOn)

ON_BN_CLICKED(IDC_BTN_HIDEOFF, OnBtnHideOff)

ON_BN_CLICKED(IDC_BTN_FRONT, OnBtnFront)

ON_BN_CLICKED(IDC_BTN_TOP, OnBtnTop)

ON_BN_CLICKED(IDC_BTN_LEFT, OnBtnLeft)

ON_BN_CLICKED(IDC_BTN_RIGHT, OnBtnRight)

ON_BN_CLICKED(IDC_BTN_BACK, OnBtnBack)

ON_BN_CLICKED(IDC_BTN_BOTTOM, OnBtnBottom)

ON_BN_CLICKED(IDC_BTN_AXO, OnBtnAxo)

ON_BN_CLICKED(IDC_BTN_LOADDATA, OnBtnLoadData)

ON_BN_CLICKED(IDC_BTN_BOOLEAN, OnBtnBoolean)

ON_BN_CLICKED(IDC_BTN_DISPLAY, OnBtnDisplay)

ON_BN_CLICKED(IDC_BTN_BOOLEAN2, OnBtnBoolean2)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CTest3DViewDlg message handlers

BOOL CTest3DViewDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

m_p3dWnd = new C3DWnd;

CRect rect;

/*

CWnd *pWnd = NULL;

pWnd = GetDlgItem(IDC_3DWND);

ASSERT(pWnd);

pWnd->GetClientRect(rect);*/

m_p3dWnd->Create(NULL, "Test3D", WS_CHILD|WS_VISIBLE, rect, this, ID_3DVIEWER);

return TRUE; // return TRUE unless you set the focus to a control

}

void CTest3DViewDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CTest3DViewDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

CRect rect;

CWnd *pWnd = NULL;

pWnd = GetDlgItem(IDC_3DWND);

ASSERT(pWnd);

pWnd->GetClientRect(rect);

if (m_p3dWnd != NULL)

m_p3dWnd->MoveWindow(rect);

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CTest3DViewDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CTest3DViewDlg::OnOK()

{

// TODO: Add extra validation here

CDialog::OnOK();

}

void CTest3DViewDlg::OnBtnShowvolume()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->ShowVolume();

}

void CTest3DViewDlg::OnBtnZoomall()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->ZoolAll();

}

BOOL CTest3DViewDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

// TODO: Add your message handler code here and/or call default

WPARAM wParam;

LPARAM lParam;

wParam = MAKEWPARAM(nFlags,zDelta); // We can put whatever we

lParam = MAKELPARAM(pt.x, pt.y); // want in wParam & lParam

if (m_p3dWnd != NULL)

return m_p3dWnd->SendMessage(WM_MOUSEWHEEL, wParam, lParam);

return CDialog::OnMouseWheel(nFlags, zDelta, pt);

}

void CTest3DViewDlg::OnBtnZoomwin()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->ZoomWin();

}

void CTest3DViewDlg::OnBtnZoomprog()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->ZoomProg();

}

void CTest3DViewDlg::OnBtnPan()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Pan();

}

void CTest3DViewDlg::OnBtnPanGlobal()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->PanGlobal();

}

void CTest3DViewDlg::OnBtnRotate()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Rotate();

}

void CTest3DViewDlg::OnBtnHideOn()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->HideOn();

}

void CTest3DViewDlg::OnBtnHideOff()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->HideOff();

}

void CTest3DViewDlg::OnBtnFront()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Front();

}

void CTest3DViewDlg::OnBtnTop()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Top();

}

void CTest3DViewDlg::OnBtnLeft()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Left();

}

void CTest3DViewDlg::OnBtnRight()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Right();

}

void CTest3DViewDlg::OnBtnBack()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Back();

}

void CTest3DViewDlg::OnBtnBottom()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Bottom();

}

void CTest3DViewDlg::OnBtnAxo()

{

// TODO: Add your control notification handler code here

ASSERT(m_p3dWnd);

m_p3dWnd->Axo();

}

void CTest3DViewDlg::OnBtnLoadData()

{

// TODO: Add your control notification handler code here

CLoadDataDlg dlg(this);

dlg.DoModal();

}

void CTest3DViewDlg::OnBtnBoolean()

{

// TODO: Add your control notification handler code here

CBoolDlg dlg;

dlg.DoModal();

}

void CTest3DViewDlg::OnBtnDisplay()

{

// TODO: Add your control notification handler code here

CDisplayDlg dlg;

dlg.DoModal();

ASSERT(m_p3dWnd);

if (dlg.m_nID < 0 ) return;

if (dlg.m_bFace){

m_p3dWnd->ShowFace(dlg.m_nID);

}else{

m_p3dWnd->ShowSolid(dlg.m_nID);

}

}

void CTest3DViewDlg::OnBtnBoolean2()

{

// TODO: Add your control notification handler code here

CBoolFaceCutDlg dlg;

dlg.DoModal();

}

If you want the Sourece Codes, write down your email as below.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有