www.pudn.com > mfcopentree.rar > MfcopenView.cpp
// MfcopenView.cpp : implementation of the CMfcopenView class //武汉华中科技大学,2002,(C)版权所有 //作者:金德才 联系方式:iskyflying@163.com //请不要将本软件的任何一部分用于商业用途 //如果您觉得任何地方有用或者错误,请告诉作者,谢谢! //如果你想引用部分源程序,请注明作者信息 //////////////////////////////////////// #include "stdafx.h" #include "Mfcopen.h" #include "MainFrm.h" #include "MfcopenDoc.h" #include "MfcopenView.h" #include "math.h" #include "TransParaDlg.h" #include "Childtree.h" #include "PlanDlg.h" #include "Precisiondlg.h" #include "ChineseFont.h" #include "Welcome.h" #include "MyBitmap.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif enum {INT_TRANSLATE, INT_ROTATE, INT_ZOOM, INT_ZOOM_RECT, INT_FIT, INT_END}; enum {INT_FRONT, INT_TOP, INT_LEFT, INT_BACK, INT_NULL}; enum {INT_LINE, INT_PORT, INT_LAST}; ///////////////////////////////////////////////////////////////////////////// // CMfcopenView int m_gwel = 0; glchar_s sztemp_jin, sztemp_de, sztemp_cai; wchar_t *szfont_jin = L"金"; wchar_t *szfont_de = L"德"; wchar_t *szfont_cai = L"才"; extern int whichnode; extern long zongshu; extern double zongshu_d; const float sita = 0.8f;//测试旋转量 float test = 0; int settime = 0; static g_createtree = 0; BOOL g_bganshe = FALSE; IMPLEMENT_DYNCREATE(CMfcopenView, CView) BEGIN_MESSAGE_MAP(CMfcopenView, CView) //{{AFX_MSG_MAP(CMfcopenView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_TIMER() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_COMMAND(ID_TRANSLATE, OnTranslate) ON_UPDATE_COMMAND_UI(ID_TRANSLATE, OnUpdateTranslate) ON_UPDATE_COMMAND_UI(ID_ROTATE, OnUpdateRotate) ON_COMMAND(ID_ROTATE, OnRotate) ON_COMMAND(ID_ZOOM, OnZoom) ON_UPDATE_COMMAND_UI(ID_ZOOM, OnUpdateZoom) ON_WM_RBUTTONDOWN() ON_WM_RBUTTONDBLCLK() ON_WM_LBUTTONDBLCLK() ON_COMMAND(ID_TREE_COLOR, OnTreeColor) ON_UPDATE_COMMAND_UI(ID_TREE_COLOR, OnUpdateTreeColor) ON_COMMAND(ID_TREE_HIDE, OnTreeHide) ON_UPDATE_COMMAND_UI(ID_TREE_HIDE, OnUpdateTreeHide) ON_COMMAND(ID_TREE_TRANSLATE, OnTreeTranslate) ON_UPDATE_COMMAND_UI(ID_TREE_TRANSLATE, OnUpdateTreeTranslate) ON_COMMAND(ID_PLAY, OnPlay) ON_UPDATE_COMMAND_UI(ID_PLAY, OnUpdatePlay) ON_COMMAND(ID_TREE_INFORMATION, OnTreeInformation) ON_UPDATE_COMMAND_UI(ID_TREE_INFORMATION, OnUpdateTreeInformation) ON_COMMAND(ID_TEMPSTOP, OnTempstop) ON_UPDATE_COMMAND_UI(ID_TEMPSTOP, OnUpdateTempstop) ON_COMMAND(ID_REPEAT, OnRepeat) ON_UPDATE_COMMAND_UI(ID_REPEAT, OnUpdateRepeat) ON_WM_CONTEXTMENU() ON_COMMAND(ID_VIEW_FONT, OnViewFont) ON_UPDATE_COMMAND_UI(ID_VIEW_FONT, OnUpdateViewFont) ON_COMMAND(ID_VIEW_LEFT, OnViewLeft) ON_UPDATE_COMMAND_UI(ID_VIEW_LEFT, OnUpdateViewLeft) ON_COMMAND(ID_VIEW_TOP, OnViewTop) ON_UPDATE_COMMAND_UI(ID_VIEW_TOP, OnUpdateViewTop) ON_COMMAND(ID_VIEW_POINTS, OnViewPoints) ON_UPDATE_COMMAND_UI(ID_VIEW_POINTS, OnUpdateViewPoints) ON_COMMAND(ID_VIEW_TRIANGLES, OnViewTriangles) ON_UPDATE_COMMAND_UI(ID_VIEW_TRIANGLES, OnUpdateViewTriangles) ON_COMMAND(ID_VIEW_LINES, OnViewLines) ON_UPDATE_COMMAND_UI(ID_VIEW_LINES, OnUpdateViewLines) ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh) ON_WM_KEYDOWN() ON_COMMAND(ID_RECT_SCALE, OnRectScale) ON_COMMAND(ID_FIND_LINE, OnFindLine) ON_UPDATE_COMMAND_UI(ID_FIND_LINE, OnUpdateFindLine) ON_COMMAND(ID_FIND_PORT, OnFindPort) ON_UPDATE_COMMAND_UI(ID_FIND_PORT, OnUpdateFindPort) ON_COMMAND(ID_TOOLBAR3, OnToolbar3) ON_UPDATE_COMMAND_UI(ID_TOOLBAR3, OnUpdateToolbar3) ON_COMMAND(ID_VIEW_MESS, OnViewMess) ON_UPDATE_COMMAND_UI(ID_VIEW_MESS, OnUpdateViewMess) ON_COMMAND(ID_CREATE_TREE, OnCreateTree) ON_UPDATE_COMMAND_UI(ID_CREATE_TREE, OnUpdateCreateTree) ON_COMMAND(ID_FILE_CLEAR, OnFileClear) ON_UPDATE_COMMAND_UI(ID_RECT_SCALE, OnUpdateRectScale) ON_COMMAND(ID_VIEW_GANSHE, OnViewGanshe) ON_UPDATE_COMMAND_UI(ID_VIEW_GANSHE, OnUpdateViewGanshe) ON_COMMAND(ID_FIT, OnFit) ON_UPDATE_COMMAND_UI(ID_FIT, OnUpdateFit) ON_WM_DESTROY() ON_COMMAND(ID_VIEW_ALL_PARA, OnViewAllPara) ON_UPDATE_COMMAND_UI(ID_VIEW_ALL_PARA, OnUpdateViewAllPara) ON_COMMAND(ID_VIEW_BACK, OnViewBack) ON_UPDATE_COMMAND_UI(ID_VIEW_BACK, OnUpdateViewBack) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMfcopenView construction/destruction static int mm = 0; static int gg = 0; CMfcopenView::CMfcopenView() { // TODO: add construction code here para = new CParaSetting(this); ResetData(); } CMfcopenView::~CMfcopenView() { if(para) delete para; for(int i=0; i<10; i++) { DestroyTree(root[i]); } if(ganshe_first) { delete ganshe_first; ganshe_first = 0; } if(ganshe_second) { delete ganshe_second; ganshe_second = 0; } CMfcopenDoc* pDoc = GetDocument(); glDeleteLists(1, pDoc->m_iDArrnumber); } BOOL CMfcopenView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN; return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMfcopenView drawing bool CMfcopenView::DrawGLScene(void) { CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; COutputBar *m_output = &(pFrame->m_wndOutput); //把干涉信息记入output窗口 float begin = GetTickCount(); float end = begin; CMfcopenDoc* pDoc = GetDocument(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Scrreen And The Depth Buffer glLoadIdentity(); // Reset The Currrent Modelview Matrix glEnable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glPushMatrix(); glDisable(GL_LIGHTING); glColor3f(1.0, 0, 0); glTranslatef(0, 0, 5.0f); glRasterPos2f(0, 0); glCallList(sztemp_jin._dlist); glCallList(sztemp_de._dlist); glCallList(sztemp_cai._dlist); glPopMatrix(); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glTranslatef(0, 0, -0.2f); switch(m_view){ case INT_FRONT: break; case INT_LEFT: glRotatef(90, 0, 1.0f, 0); break; case INT_TOP: glRotatef(90, 1.0f, 0, 0); break; case INT_BACK: glRotatef(180, 0, 1.0f, 0); break; default: break; } if(m_view == INT_FRONT) { glTranslatef(m_fxtra, m_fytra, 0.0f); glRotatef(m_fxrot, 1.0f,0.0f, 0.0f); glRotatef(m_fyrot, 0.0f,1.0f, 0.0f); } if(m_view == INT_TOP) { glTranslatef(m_fxtra, 0.0f, -m_fytra); glRotatef(m_fxrot, 1.0f,0.0f, 0.0f); glRotatef(m_fyrot, 0.0f,0.0f, 1.0f); } if(m_view == INT_LEFT) { glTranslatef(0.0f, m_fytra, m_fxtra); glRotatef(m_fxrot, 0.0f,0.0f, 1.0f); glRotatef(m_fyrot, 0.0f,1.0f, 0.0f); } if(m_view == INT_BACK) { glTranslatef(-m_fxtra, m_fytra, 0.0f); glRotatef(-m_fxrot, 1.0f,0.0f, 0.0f); glRotatef(m_fyrot, 0.0f,1.0f, 0.0f); } ///////////////////////////////// /////select objects////////////// ///////////////////////////////// glInitNames(); glPushName(0); glDisable(GL_LIGHTING); glDisable(GL_BLEND); if(m_bviewmess) { glPolygonMode(GL_FRONT, GL_LINE ); for(int vv=0; vv<10; vv++) if(root[vv] != NULL) { m_lgcubenumber = 0; DrawCubeWeb(root[vv]); } } if(m_bviewganshe) { glLineStipple(2, 0x1C47); glEnable(GL_LINE_STIPPLE); glPolygonMode(GL_FRONT, GL_LINE ); ViewGanshe(); glDisable(GL_LINE_STIPPLE); } glEnable(GL_LIGHTING); glDisable(GL_CULL_FACE); glPushMatrix(); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff[0]); if(pDoc->m_bFakOpen) { glBegin(GL_TRIANGLES); glCallList(21); glEnd(); } glEnable(GL_CULL_FACE); glDisable(GL_LIGHTING); for(int r=1; r<=pDoc->m_iDArrnumber; r++) { glMaterialf(GL_FRONT, GL_SHININESS, shininess); /////////////////// //干涉检查///////// /////////////////// //重复播放规定只用于正常情况 if(m_bplay) { InterfaceCheck(r); end = GetTickCount(); CString str; str.Format("%f", (end-begin)); if(writer > 0) m_output->m_DebugList.ResetContent(); writer++; m_output->m_Find1List.AddString(str); } //隐藏实体 if(m_ilflag[r] == 1) { glLoadName(r); glEnd(); continue; } glDisable(GL_LIGHTING); CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; int m_itreeflag = pTree->GetSelectItemIndex(); if(r==m_itreeflag) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff_ganshe); else glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff[r]); //画截面 if(m_bcut1){ glColor4fv(mat_amb_diff[r]); ShowSection(r, m_istlmove[r]); } glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); //平移实体 int k = m_istlmove[r]; if(m_fmove[r][k][3]>0)//表示此物体要平移 { glPushMatrix(); glTranslatef(m_fsectcenter[r][0]-m_forigincenter[r][0]+m_fmove[r][k][3]*m_fsteptranslate[r][k][0], m_fsectcenter[r][1]-m_forigincenter[r][1]+m_fmove[r][k][3]*m_fsteptranslate[r][k][1], m_fsectcenter[r][2]-m_forigincenter[r][2]+m_fmove[r][k][3]*m_fsteptranslate[r][k][2]); m_fcenter[r][0] = m_fsectcenter[r][0] + m_fmove[r][k][3]*m_fsteptranslate[r][k][0]; m_fcenter[r][1] = m_fsectcenter[r][1] + m_fmove[r][k][3]*m_fsteptranslate[r][k][1]; m_fcenter[r][2] = m_fsectcenter[r][2] + m_fmove[r][k][3]*m_fsteptranslate[r][k][2]; glLoadName(r); glPolygonMode(GL_FRONT, m_umodelview); glBegin(GL_TRIANGLES); glCallList(r); glEnd(); glEnd(); glPopMatrix(); } else { if(m_fglobaltime<=m_ftimemove[r][k][0])//开始延迟时间区间暂停 { glLoadName(r); glPolygonMode(GL_FRONT, m_umodelview); glBegin(GL_TRIANGLES); glCallList(r); glEnd(); glEnd(); } else { //最后位置 glPushMatrix(); glTranslatef(m_fcenter[r][0]-m_forigincenter[r][0], m_fcenter[r][1]-m_forigincenter[r][1], m_fcenter[r][2]-m_forigincenter[r][2]); glLoadName(r); glPolygonMode(GL_FRONT, m_umodelview); glBegin(GL_TRIANGLES); glCallList(r); glEnd(); glEnd(); glPopMatrix(); } } } glPopMatrix(); glPopMatrix(); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glDepthFunc(GL_ALWAYS); glDepthMask(GL_TRUE); glLineWidth(1); glBegin(GL_LINES); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(0, 0, 0); glVertex3f(0.1f*m_scale, 0, 0); glEnd(); glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0.12f*m_scale, -0.01f*m_scale, ((m_view==INT_LEFT)?-0.01f:0.01)*m_scale); glRasterPos3f(0, 0, 0); myfont.DisplayFonts("X"); glPopMatrix(); // glPushMatrix(); glTranslatef(0.4f*m_scale, 0.4f*m_scale, ((m_view==INT_LEFT)?0.4f:-0.4)*m_scale); glRasterPos3f(0, 0, 0); CString str_cubenum; char buffer[50]; str_cubenum.Format("%d", m_lgcubenumber); sprintf(buffer, "%s", str_cubenum); myfont.DisplayFonts(buffer); glPopMatrix(); // glBegin(GL_LINES); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(0, 0, 0); glVertex3f(0, 0.1f*m_scale, 0); glEnd(); glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(-0.01f*m_scale, 0.12f*m_scale, ((m_view==INT_LEFT)?-0.01f:0.01)*m_scale); glRasterPos3f(0, 0, 0); myfont.DisplayFonts("Y"); glPopMatrix(); glBegin(GL_LINES); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(0, 0, 0); glVertex3f(0, 0, 0.1f*m_scale); glEnd(); glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(-0.01f*m_scale, -0.01f*m_scale, 0.12f*m_scale); glRasterPos3f(0, 0, 0); glPopMatrix(); myfont.DisplayFonts("Z"); glDepthFunc(GL_LEQUAL); return TRUE; } int initfont = 0; bool CMfcopenView::InitGL(void) { glShadeModel(GL_SMOOTH); // Enables Smooth Shadin glClearColor(0.2235294f, 0.427451f, 0.647059f, 0.0f); // Black Background glClearDepth(1.0); // Depth Buffer Setup glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glEnable(GL_DEPTH_TEST); // Enables Depth Testing glDepthFunc(GL_LEQUAL); // The Type Of Depth Tesst To Do glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations CreateTexture(g_Texture, "back.bmp", 0); return TRUE; // Initializatioon Went OK } static int initgl = 0; //whenever Invalidate(false) calls, this function will recall! void CMfcopenView::OnDraw(CDC* pDC) { CMfcopenDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if(m_bIsPrint) { KillTimer(1); CMyBitmap bmp; GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); int w = viewport[2]; int h = viewport[3]; w = (w+3)&~3;// x&~3一定能被4整除! bmp.load("jin.bmp"); pDC->SetBkMode(TRANSPARENT); for(int i=0; i SetPixelV(j, h-i, RGB(255, 255, 255)); continue; } pDC->SetPixelV(j, h-i, col); } return; } wglMakeCurrent(pDC->m_hDC,m_hRC); if(initgl < 1) { InitGL(); initgl++; } if(initgl > 2) initgl = 2; if(initfont < 1) { myfont.InitFont(pDC->m_hDC, 12); initfont++; init_wchar(pDC->m_hDC, *szfont_jin, sztemp_jin); init_wchar(pDC->m_hDC, *szfont_de , sztemp_de); init_wchar(pDC->m_hDC, *szfont_cai, sztemp_cai); } if(initfont > 2) initfont = 2; m_bFakOpen = pDoc->m_bFakOpen; m_bfileopen = pDoc->m_bfileopen; m_banimalfileopen = pDoc->m_banimalfileopen; m_fBoxMax = pDoc->m_fBoxMax; //考虑到一般情形,只能先加已存在的文件,再加其他文件! //STL if(m_bfileopen && !m_bFakOpen) { //epc没被打开,STL被打开 if(mm m_iDArrnumber) { ProcessData(pDoc->m_array); BuildDispList(pDoc->m_iDArrnumber); mm++; } DrawGLScene(); } else if(!m_bfileopen && m_bFakOpen) { //epc没打开,但是fak被打开 BuildFakList(21); DrawGLScene(); } else { if( (gg < 1) && (pDoc->m_banimalfileopen)) { //先打开硬盘中的STL文件,没有处理过 ProcessData(pDoc->m_array); BuildDispList(pDoc->m_iDArrnumber); gg++; mm = pDoc->m_iDArrnumber; m_scale = pDoc->m_scale; m_ftimes = pDoc->m_ftimes; for(int i=0; i<100; i++) { m_itrannumber[i] = pDoc->m_itrannumber[i]; for(int r=0; r<4; r++) { m_ftimemove[i][r][0] = pDoc->m_ftimemove[i][r][0]; m_ftimemove[i][r][1] = pDoc->m_ftimemove[i][r][1]; } m_ilflag[i] = pDoc->m_ilflag[i]; } for(i=0; i<100; i++) { for(int r=0; r<3; r++) { m_fcenter[i][r] = m_fsectcenter[i][r] = m_forigincenter[i][r] = m_fcenter[i][r]; } } for(i=0; i<100; i++) { for(int r=0; r<4; r++) { m_fInformation[i][r][0] = pDoc->m_fInformation[i][r][0]; m_fInformation[i][r][1] = pDoc->m_fInformation[i][r][1]; m_fInformation[i][r][2] = pDoc->m_fInformation[i][r][2]; } } for(i=0; i<100; i++) for(int j=0; j<4; j++) { mat_amb_diff[i][j] = pDoc->mat_amb_diff[i][j]; for(int k=0; k<4; k++) m_fmove[i][j][k] = pDoc->m_fmove[i][j][k]; } for(int j=0; j<100; j++) { for(int r=0; r<4; r++) { float tempstep = (m_ftimemove[j][r][1]-m_ftimemove[j][r][0])*50; m_fsteptranslate[j][r][0] = m_fmove[j][r][0]/tempstep; m_fsteptranslate[j][r][1] = m_fmove[j][r][1]/tempstep; m_fsteptranslate[j][r][2] = m_fmove[j][r][2]/tempstep; } } } DrawGLScene(); } if((settime < 1) && (m_banimalfileopen || m_bfileopen || m_bFakOpen)){ SetTimer(1, 20, NULL); settime++; } SwapBuffers(pDC->m_hDC); } ///////////////////////////////////////////////////////////////////////////// // CMfcopenView printing BOOL CMfcopenView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation CRect rc; GetClientRect(&rc); int w = rc.Width(); int h = rc.Height(); int width = w*3; width = (width+3)&~3;//x&~3一定能被4整除! int bitsize = width*h; CMyBitmap bmp; bmp.data = new BYTE[bitsize]; glReadBuffer(GL_FRONT); glPixelStorei(GL_PACK_ALIGNMENT, 4); bmp.width = w;//viewport[2]; bmp.height = h;//viewport[3]; ClientToScreen(&rc); glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, bmp.data); bmp.save("jin.bmp"); return DoPreparePrinting(pInfo); } void CMfcopenView::OnBeginPrinting(CDC* pDC, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing m_bIsPrint = TRUE; } void CMfcopenView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing m_bIsPrint = FALSE; SetTimer(1, 20, NULL); } ///////////////////////////////////////////////////////////////////////////// // CMfcopenView diagnostics #ifdef _DEBUG void CMfcopenView::AssertValid() const { CView::AssertValid(); } void CMfcopenView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMfcopenDoc* CMfcopenView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMfcopenDoc))); return (CMfcopenDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMfcopenView message handlers int CMfcopenView::OnCreate(LPCREATESTRUCT lpCreateStruct) { PIXELFORMATDESCRIPTOR pixelDesc; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 1; .dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_D pixelDescOUBLEBUFFER | PFD_STEREO_DONTCARE; pixelDesc.iPixelType = PFD_TYPE_RGBA; pixelDesc.cColorBits = 32; pixelDesc.cRedBits = 8; pixelDesc.cRedShift = 16; pixelDesc.cGreenBits = 8; pixelDesc.cGreenShift = 8; pixelDesc.cBlueBits = 8; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; pixelDesc.cAlphaShift = 0; pixelDesc.cAccumBits = 64; pixelDesc.cAccumRedBits = 16; pixelDesc.cAccumGreenBits = 16; pixelDesc.cAccumBlueBits = 16; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 32; pixelDesc.cStencilBits = 8; pixelDesc.cAuxBuffers = 0; pixelDesc.iLayerType = PFD_MAIN_PLANE; pixelDesc.bReserved = 0; pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0; CDC *pdc=GetDC(); ASSERT(pdc->m_hDC); int pixelFormat=ChoosePixelFormat(pdc->m_hDC,&pixelDesc); //返回最匹配的像素格式 BOOL success = SetPixelFormat(pdc->m_hDC,pixelFormat,&pixelDesc); //设置像素格式 m_hRC=wglCreateContext(pdc->m_hDC); if(m_primeHrc==0) { m_primeHrc=m_hRC; } else { wglShareLists(m_primeHrc,m_hRC);//使当前RC共享主RC的显示列表 } wglMakeCurrent(NULL,NULL);//使当前RC为空,为释放DC作准备 ReleaseDC(pdc); if (CView::OnCreate(lpCreateStruct) == -1) return -1; return 0; } void CMfcopenView::OnSize(UINT nType, int cx, int cy) { CDC *pdc=GetDC(); wglMakeCurrent(pdc->m_hDC,m_hRC); GLsizei width, height; width=cx; height=cy; if(height == 0) height =1; m_disp_radio = (float)width/(float)height; glViewport(0,0,width,height);//视口的变换 glMatrixMode(GL_PROJECTION);//将相继矩阵施加到投影矩阵栈 glLoadIdentity();//初始化为单为阵 m_fleft = -1.0*(GLfloat)width/(GLfloat)height; m_fright = 1.0*(GLfloat)width/(GLfloat)height; m_fbottom = -1.0f; m_ftop = 1.0f; glOrtho((m_fleft+m_ortho_bias_x)*m_scale,(m_fright+m_ortho_bias_x)*m_scale, (m_fbottom-m_ortho_bias_y)*m_scale, (m_ftop-m_ortho_bias_y)*m_scale,-100.0,100.0); m_ortho_bias_x = m_ortho_bias_y = 0; glMatrixMode(GL_MODELVIEW);//将相继矩阵施加到投影矩阵栈 glLoadIdentity(); glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightSpecular); glLightfv(GL_LIGHT0, GL_POSITION,LightPosition); wglMakeCurrent(NULL,NULL); ReleaseDC(pdc); CView::OnSize(nType, cx, cy); } void CMfcopenView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CMfcopenDoc* pDoc = GetDocument(); GetCursorPos(&m_current); ScreenToClient(&m_current); if(nIDEvent == 1) { m_fpasstime += 0.02f; if(m_blmousedown && ((m_popmenu == INT_TRANSLATE) || (m_popmenu == INT_ROTATE) || (m_popmenu == INT_ZOOM) ))//|| (m_popmenu == INT_ZOOM_RECT) Invalidate(false); if(m_popmenu == INT_END && (m_current.x == m_oldpt.x && m_current.y == m_oldpt.y) && m_fpasstime > 1.0f) { if(count == 0) { m_iObjectId = RetrieveObjectID(m_current.x, m_current.y); count++; } if(m_iObjectId > 0) { m_movecount = 0; CClientDC dc(this); CBrush brush(RGB(255, 255 ,0)); dc.SelectObject(&brush); CString str; str.Format("%s", pDoc->m_savename[m_iObjectId-1]); CSize size; size = dc.GetTextExtent(str); if(size.cx==0) return; dc.Rectangle(m_current.x+16, m_current.y+14, m_current.x+16+4+size.cx, m_current.y+14+4+size.cy); dc.SetBkMode(TRANSPARENT); dc.SetTextAlign(TA_LEFT); dc.TextOut(m_current.x+18, m_current.y+16, str); } m_fpasstime = 0; } if(m_btempstop) return; if(m_bplay) { m_fglobaltime += 0.02f; for(int i=1; i<100; i++) { for(int j=0; j<4; j++) { if((m_fglobaltime>=m_ftimemove[i][j][0])&&(m_fglobaltime =0) m_istlmove[i] = j; break; //每次只有一个时间段的运动或者不动 } else { if(m_fmove[i][j][3] > 0) memcpy(m_fsectcenter[i], m_fcenter[i], 12); m_fmove[i][j][3] = 0;//关闭它的平移开关 } } } Invalidate(false); } if(m_brepeat) { m_fglobaltime += 0.02f; int count = 0; for(int i=1; i<100; i++) { for(int j=0; j<4; j++) { if((m_fglobaltime>=m_ftimemove[i][j][0])&&(m_fglobaltime =0) m_istlmove[i] = j; break; //每次只有一个时间段的运动或者不动 } else { if(m_fglobaltime >= m_ftimemove[i][j][1]) count++; if(m_fmove[i][j][3] > 0) memcpy(m_fsectcenter[i], m_fcenter[i], 12); m_fmove[i][j][3] = 0;//关闭它的平移开关 } } } if(count >= 99*4) { count = 0; m_fglobaltime = 0; for(i=0; i<100; i++) for(int j=0; j<4; j++) m_fmove[i][j][3] = 0; for(i=0; i<100; i++) for(int j=0; j<3; j++) m_fcenter[i][j] = m_fsectcenter[i][j] = m_forigincenter[i][j]; g_bganshe = FALSE; } Invalidate(false); } } CView::OnTimer(nIDEvent); } void CMfcopenView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_blmousedown = true; CRect rect; GetClientRect(&rect); CPoint temppoint = point; ScreenToClient(&temppoint); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); /* if(::GetKeyState(VK_CONTROL) < 0) { if(m_scale < 0.1f) m_scale = 0.1f; else m_scale += 0.1f; } else { m_scale -= 0.1f; } */ m_zoomcenter = point; } else if(m_popmenu == INT_ZOOM_RECT) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM_RECT)); ShowCursor(true); m_RectZoomOldpoint = point; } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); /* CPoint pt = point; ClientToScreen(&pt); int cy = GetSystemMetrics(SM_CYMAXIMIZED); BYTE *color = new BYTE[3]; glReadBuffer(GL_BACK); glReadPixels(pt.x, cy-pt.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, color); if(abs(color[0]-58)<=1 && abs(color[1]-109)<=1 && abs(color[2]-165)<=1 ) { delete []color; return; } else delete []color; */ m_iObjectId = RetrieveObjectID(point.x, point.y); CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; if(m_iObjectId > 0 && m_itreeflag < 999) { pTree->SendMessage(WM_HIGHLIGHT, m_iObjectId, m_itreeflag); m_itreeflag = m_iObjectId; } } } CView::OnLButtonDown(nFlags, point); } void CMfcopenView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_blmousedown = false; CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM_RECT) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM_RECT)); ShowCursor(true); CRect rc, rs; CClientDC dc(this); GetClientRect(&rc); rs.SetRect(m_RectZoomOldpoint, point); if(rs.Width()==0 || rs.Height()==0) return; //放大 float rs_value = float(rs.Width())/rc.Width();//min(rs.Width(), rs.Height()); float rc_value = float(rs.Height())/rc.Height();//max(rc.Width(), rc.Height()); //平移 float deta = 2.0f*m_scale/rect.Height(); m_fstepx = (rc.Width()/2-rs.Width()/2-rs.left)*deta; m_fstepy = (rc.Height()/2-rs.Height()/2-rs.top)*deta; m_fxtra += m_fstepx; m_fytra -= m_fstepy; m_scale *= (rs_value>rc_value)?rs_value:rc_value;//rs_value/rc_value m_scale = (m_scale > 0.02) ? m_scale : 0.02; OnSize(SIZE_RESTORED, rc.Width(), rc.Height()); Invalidate(FALSE); UpdateWindow(); } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); } m_current=point; } CView::OnLButtonUp(nFlags, point); } void CMfcopenView::BuildDispList(int flag) { CString str; CMfcopenDoc* pDoc = GetDocument(); CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; pDoc->pStatus = &pFrame->m_wndStatusBar; int ss = 0; STLArray *temparray = pDoc->m_array->next; while(temparray!=NULL) { STLData *temp = temparray->stl->next; glNewList( ++ss, GL_COMPILE ); int i = 0; while(temp != NULL){ glNormal3fv(temp->fNormal); glVertex3fv(temp->fPoint1 ); glNormal3fv(temp->fNormal); glVertex3fv(temp->fPoint2); glNormal3fv(temp->fNormal); glVertex3fv(temp->fPoint3); temp = temp->next; i++; int prog = i*100/temparray->trinumber; str.Format( "已处理文件数据%d%%", prog ); pDoc->pStatus->SetPaneText(0, str, true); } str.Format("即将输出图形%d,请等待...", ss); pDoc->pStatus->SetPaneText(0, str, true); CCmdTarget::BeginWaitCursor(); glEndList(); EndWaitCursor(); pDoc->pStatus->SetPaneText(0, "图形输出成功,ok!", true); if(i>10000) ::Sleep(1000); pDoc->pStatus->SetPaneText(0, "", true); temparray = temparray->next; } } void CMfcopenView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_gwel == 0 && point.y < 200) { KillTimer(1); CWelcome wel; wel.DoModal(); m_gwel++; SetTimer(1, 20, NULL); } m_current = point; CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; pStatus=&pFrame->m_wndStatusBar; CMfcopenDoc* pDoc = GetDocument(); CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM_RECT) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM_RECT)); ShowCursor(true); } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); count = 0; if(m_movecount == 0) { CRect r; r.SetRect(m_oldpt.x+16, m_oldpt.y+16, m_oldpt.x+50, m_oldpt.y+32); InvalidateRect(&r, FALSE); m_movecount++; } } } CString strx, stry; strx.Format("X = %d", m_current.x); pStatus->SetPaneText(2, strx, true); stry.Format("Y = %d", m_current.y); pStatus->SetPaneText(3, stry, true); //平移 if(m_blmousedown && (m_popmenu == INT_TRANSLATE)) { float deta = 2.0f*m_scale/rect.Height(); //1.125f*0.004f*m_scale; CPoint ptTemp=m_current-m_oldpt; m_fstepx = ptTemp.x*deta; m_fstepy = ptTemp.y*deta; m_fxtra += m_fstepx; m_fytra -= m_fstepy; } //旋转 if(m_blmousedown && (m_popmenu == INT_ROTATE)) { CPoint ptTemp=m_current-m_oldpt; m_fanglex = ptTemp.y*sita; m_fangley = ptTemp.x*sita; m_fxrot += m_fanglex; m_fyrot += m_fangley; } //缩放1 if(m_blmousedown && (m_popmenu == INT_ZOOM)) { CPoint ptTemp = m_current-m_zoomcenter; CPoint ptTemp2 = m_current-m_oldpt; if(ptTemp.y > 0 ) { if(ptTemp2.y > 0) m_scale += ptTemp.y * 0.001f; else m_scale = (m_scale - ptTemp.y * 0.001f) > 0.02f ? (m_scale - ptTemp.y * 0.001f) : 0.02f; } if(ptTemp.y < 0) { if(ptTemp2.y < 0) m_scale = (m_scale - (-ptTemp.y) * 0.001f) > 0.02f ? (m_scale - (-ptTemp.y) * 0.001f) : 0.02f; else m_scale += (-ptTemp.y) * 0.001f; } OnSize(SIZE_RESTORED, rect.Width(), rect.Height()); } //区域缩放 if(m_blmousedown && (m_popmenu == INT_ZOOM_RECT)) { if(m_RectZoomOldpoint.x == -100) return; CClientDC dc(this); CPen pen(PS_SOLID, 1, RGB(255, 255, 255)); dc.SelectObject(&pen); dc.SetBkMode(TRANSPARENT); dc.SetROP2(R2_NOT); dc.MoveTo(m_RectZoomOldpoint.x, m_RectZoomOldpoint.y); dc.LineTo(m_oldpt.x, m_RectZoomOldpoint.y); dc.LineTo(m_oldpt.x, m_oldpt.y); dc.LineTo(m_RectZoomOldpoint.x, m_oldpt.y); dc.LineTo(m_RectZoomOldpoint.x, m_RectZoomOldpoint.y); dc.MoveTo(m_RectZoomOldpoint.x, m_RectZoomOldpoint.y); dc.LineTo(point.x, m_RectZoomOldpoint.y); dc.LineTo(point.x, point.y); dc.LineTo(m_RectZoomOldpoint.x, point.y); dc.LineTo(m_RectZoomOldpoint.x, m_RectZoomOldpoint.y); } m_oldpt = m_current; CView::OnMouseMove(nFlags, point); } void CMfcopenView::OnTranslate() { // TODO: Add your command handler code here if(m_popmenu == INT_TRANSLATE) { m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); SetCursor(m_hcursor); ShowCursor(true); return; } m_popmenu = INT_TRANSLATE; m_hcursor = AfxGetApp()->LoadCursor(IDC_CURSORTRA); SetCursor(m_hcursor); ShowCursor(true); } void CMfcopenView::OnUpdateTranslate(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen||m_bFakOpen); pCmdUI->SetCheck(m_popmenu == INT_TRANSLATE); } void CMfcopenView::OnUpdateRotate(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen||m_bFakOpen); pCmdUI->SetCheck(m_popmenu == INT_ROTATE); } void CMfcopenView::ProcessData(STLArray *data) { CMfcopenDoc* pDoc = GetDocument(); STLArray *temparray = data; int ii=0; while(temparray!=NULL) { STLData *tempdata = temparray->stl; m_fboxsize[ii][0] = pDoc->m_fboxsize[ii][0]/pDoc->m_fBoxMax;//处理数据 m_fboxsize[ii][1] = pDoc->m_fboxsize[ii][1]/pDoc->m_fBoxMax; m_fboxsize[ii][2] = pDoc->m_fboxsize[ii][2]/pDoc->m_fBoxMax; m_fcenter[ii][0] = pDoc->m_fcenter[ii][0]/pDoc->m_fBoxMax; m_fcenter[ii][1] = pDoc->m_fcenter[ii][1]/pDoc->m_fBoxMax; m_fcenter[ii][2] = pDoc->m_fcenter[ii][2]/pDoc->m_fBoxMax;//处理数据 m_forigincenter[ii][0] = m_fcenter[ii][0]; m_forigincenter[ii][1] = m_fcenter[ii][1]; m_forigincenter[ii][2] = m_fcenter[ii][2]; m_fsectcenter[ii][0] = m_fcenter[ii][0]; m_fsectcenter[ii][1] = m_fcenter[ii][1]; m_fsectcenter[ii][2] = m_fcenter[ii][2]; while(tempdata!=NULL) { for(int i=0; i<3; i++) { tempdata->fPoint1[i] /= pDoc->m_fBoxMax; tempdata->fPoint2[i] /= pDoc->m_fBoxMax; tempdata->fPoint3[i] /= pDoc->m_fBoxMax; } tempdata = tempdata->next; } ii++; temparray = temparray->next; } } void CMfcopenView::OnRotate() { // TODO: Add your command handler code here if(m_popmenu == INT_ROTATE) { m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); SetCursor(m_hcursor); ShowCursor(true); return; } m_popmenu = INT_ROTATE; m_hcursor = AfxGetApp()->LoadCursor(IDC_CURSORROT); SetCursor(m_hcursor); ShowCursor(true); } void CMfcopenView::OnZoom() { // TODO: Add your command handler code here if(m_popmenu == INT_ZOOM) { m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); SetCursor(m_hcursor); ShowCursor(true); return; } m_popmenu = INT_ZOOM; m_hcursor = AfxGetApp()->LoadCursor(IDC_CURSORZOOM); SetCursor(m_hcursor); ShowCursor(true); } void CMfcopenView::OnUpdateZoom(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen||m_bFakOpen); pCmdUI->SetCheck(m_popmenu == INT_ZOOM); } void CMfcopenView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); } } CView::OnRButtonDown(nFlags, point); } void CMfcopenView::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); } } CView::OnRButtonDblClk(nFlags, point); } void CMfcopenView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); if(rect.PtInRect(point)) { if(m_popmenu == INT_TRANSLATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORTRA)); ShowCursor(true); } else if(m_popmenu == INT_ROTATE) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORROT)); ShowCursor(true); } else if(m_popmenu == INT_ZOOM) { SetCursor(AfxGetApp()->LoadCursor(IDC_CURSORZOOM)); ShowCursor(true); } else { SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER)); ShowCursor(true); } } CView::OnLButtonDblClk(nFlags, point); } void CMfcopenView::OnTreeColor() { // TODO: Add your command handler code here COLORREF colorTemp = RGB(255, 0, 0); CColorDialog dlg(colorTemp); CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if(m_itreeflag >= 999) return; if(dlg.DoModal()==IDOK) { colorTemp=dlg.GetColor(); mat_amb_diff[m_itreeflag][0] = (float)GetRValue(colorTemp) / 255.0f; mat_amb_diff[m_itreeflag][1] = (float)GetGValue(colorTemp) / 255.0f; mat_amb_diff[m_itreeflag][2] = (float)GetBValue(colorTemp) / 255.0f; } } void CMfcopenView::OnUpdateTreeColor(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if((m_itreeflag >= 999)||(m_itreeflag == 0)) pCmdUI->Enable(FALSE); else pCmdUI->Enable(TRUE); } void CMfcopenView::OnTreeHide() { // TODO: Add your command handler code here CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if(m_itreeflag == 999) { m_ballhide = !m_ballhide; if(m_ballhide) { for(UINT i=1; i<=pTree->m_nItemSum; i++) { m_ilflag[i] = 1; } } else { for(UINT i=1; i<=pTree->m_nItemSum; i++) { m_ilflag[i] = 0; } } return; } int tempcount = 0; for(int i=0; i< pTree->m_itypenumber; i++) { tempcount++; //计算是否有类型被点击 //第i个类型被点击 if(m_itreeflag == (UINT)(1000+i)) { m_btypehide[i+1] = !m_btypehide[i+1]; tempcount -= 20; int tempcount1 = 1; int tempcount2 = pTree->m_ichildnumber[0]; for(int j=0; jm_ichildnumber[j]; tempcount2 += pTree->m_ichildnumber[j+1]; } if(m_btypehide[i+1]) { for(int i=tempcount1; i<=tempcount2; i++) { m_ilflag[i] = 1; } } else { for(int i=tempcount1; i<=tempcount2; i++) { m_ilflag[i] = 0; } } } } //类型的子节点被点击 if(tempcount >= pTree->m_itypenumber) //类型没被点击 { if(m_ilflag[m_itreeflag]==1) m_ilflag[m_itreeflag] = 0;//0表示不隐藏 else m_ilflag[m_itreeflag] = 1;//1表示隐藏 } } void CMfcopenView::OnUpdateTreeHide(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); pCmdUI->Enable(m_itreeflag); if(m_itreeflag == 999) pCmdUI->SetCheck(m_ballhide); else { for(int i=0; i m_itypenumber; i++) { if(m_itreeflag == (UINT)(1000+i)) pCmdUI->SetCheck(m_btypehide[i]); } if(i>=pTree->m_itypenumber) pCmdUI->SetCheck(m_ilflag[m_itreeflag] == 1); } } //平移参数接受 void CMfcopenView::OnTreeTranslate() { // TODO: Add your command handler code here CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if(m_itreeflag<999) pTree->SendMessage(WM_HIGHLIGHT, m_itreeflag, m_iObjectId); CTransParaDlg dlg; if(m_itreeflag == 999) //工作中心被点击 return; int tt = dlg.DoModal(); if(tt==IDOK) { if(dlg.m_ftimestart >= dlg.m_ftimeend) { MessageBox("时间区间设置错误:\n起始时间不小于终止时间!", "错误", MB_OK | MB_ICONSTOP); return; } int tempcount = 0; //类型被点击 for(int i=0; i< pTree->m_itypenumber; i++) { tempcount++; //计算是否有类型被点击 //第i个类型被点击 if(m_itreeflag == (UINT)(1000+i)) { tempcount -= 20; int tempcount1 = 1; int tempcount2 = pTree->m_ichildnumber[0]; for(int j=0; jm_ichildnumber[j]; tempcount2 += pTree->m_ichildnumber[j+1]; } //检查 for(j=tempcount1; j<=tempcount2; j++) { if(m_ftimemove[j][3][0] != m_ftimemove[j][3][1]) { MessageBox("测试版只能定义单个实体的四次运动!\n要想获得更多支持,请购买正式版!\n联系办法见帮助文件!", "注意", MB_OK | MB_ICONEXCLAMATION); return; } //可能的多次运动检查,上限是4次 for(int k=0; k<4 ; k++) { //我们认为两次不同运动不会存在相交时间区间,端点除外 //第一次赋值时间区间! if(m_ftimemove[j][k][0] == m_ftimemove[j][k][1]) { continue; } if((dlg.m_ftimeend <= m_ftimemove[j][k][0] || dlg.m_ftimestart >= m_ftimemove[j][k][1]) && m_ftimemove[j][k][0]!=0) { continue; } else { MessageBox("这个时间区间已经定义了一个运动,您应该再选择别的区间!", "注意", MB_OK|MB_ICONEXCLAMATION); return; } } } //赋予增加的运动! for(j=tempcount1; j<=tempcount2; j++) { //可能的多次运动检查,上限是4次 for(int k=0; k<4 ; k++) { //我们认为两次不同运动不会存在相交时间区间,端点除外 //第一次赋值时间区间! if(m_ftimemove[j][k][0] == m_ftimemove[j][k][1]) { k++; break; } } m_itrannumber[j] = k;// if(k>0) { //运动时间 m_ftimemove[j][k-1][0] = dlg.m_ftimestart/m_ftimes; m_ftimemove[j][k-1][1] = dlg.m_ftimeend/m_ftimes; //信息记录 m_fInformation[j][k-1][0] = dlg.m_ftranx; m_fInformation[j][k-1][1] = dlg.m_ftrany; m_fInformation[j][k-1][2] = dlg.m_ftranz; //运动长度,m_fmove[0、1、2]代表终止的位置 m_fmove[j][k-1][0] = m_fInformation[j][k-1][0]/m_fBoxMax; m_fmove[j][k-1][1] = m_fInformation[j][k-1][1]/m_fBoxMax; m_fmove[j][k-1][2] = m_fInformation[j][k-1][2]/m_fBoxMax; //速度控制 m_ftimes = dlg.m_ftimes; float tempstep = (m_ftimemove[j][k-1][1]-m_ftimemove[j][k-1][0])*50; m_fsteptranslate[j][k-1][0] = m_fmove[j][k-1][0]/tempstep; m_fsteptranslate[j][k-1][1] = m_fmove[j][k-1][1]/tempstep; m_fsteptranslate[j][k-1][2] = m_fmove[j][k-1][2]/tempstep; } } } } //类型的子节点被点击 if(tempcount >= pTree->m_itypenumber) //类型没被点击 { if(m_ftimemove[m_itreeflag][3][0] != m_ftimemove[m_itreeflag][3][1]) { MessageBox("测试版只能定义单个实体的四次运动!\n要想获得更多支持,请购买正式版!\n联系办法见帮助文件!", "注意", MB_OK | MB_ICONEXCLAMATION); return; } //可能的多次运动检查,上限是4次 for(int k=0; k<4; k++) { //我们认为两次不同运动不会存在相交时间区间,端点除外,约定所有实体不从0开始运动 if(m_ftimemove[m_itreeflag][k][0] == m_ftimemove[m_itreeflag][k][1]) continue; if((dlg.m_ftimeend <= m_ftimemove[m_itreeflag][k][0] || dlg.m_ftimestart >= m_ftimemove[m_itreeflag][k][1]) && m_ftimemove[m_itreeflag][k][0]!=0) continue; else { MessageBox("这个时间区间已经定义了一个运动,您应该再选择别的区间!", "注意", MB_OK|MB_ICONEXCLAMATION); return; } } for(k=0; k<4; k++) { if(m_ftimemove[m_itreeflag][k][0] == m_ftimemove[m_itreeflag][k][1]) { k++; break; } } m_itrannumber[m_itreeflag] = k; //运动时间 m_ftimemove[m_itreeflag][k-1][0] = dlg.m_ftimestart/m_ftimes; m_ftimemove[m_itreeflag][k-1][1] = dlg.m_ftimeend/m_ftimes; //信息记录 m_fInformation[m_itreeflag][k-1][0] = dlg.m_ftranx; m_fInformation[m_itreeflag][k-1][1] = dlg.m_ftrany; m_fInformation[m_itreeflag][k-1][2] = dlg.m_ftranz; //运动长度,m_fmove[0、1、2]代表终止的位置 m_fmove[m_itreeflag][k-1][0] = m_fInformation[m_itreeflag][k-1][0]/m_fBoxMax; m_fmove[m_itreeflag][k-1][1] = m_fInformation[m_itreeflag][k-1][1]/m_fBoxMax; m_fmove[m_itreeflag][k-1][2] = m_fInformation[m_itreeflag][k-1][2]/m_fBoxMax; //速度控制 m_ftimes = dlg.m_ftimes; float tempstep = (m_ftimemove[m_itreeflag][k-1][1]-m_ftimemove[m_itreeflag][k-1][0])*50; //首次减0 m_fsteptranslate[m_itreeflag][k-1][0] = m_fmove[m_itreeflag][k-1][0]/tempstep; m_fsteptranslate[m_itreeflag][k-1][1] = m_fmove[m_itreeflag][k-1][1]/tempstep; m_fsteptranslate[m_itreeflag][k-1][2] = m_fmove[m_itreeflag][k-1][2]/tempstep; } } else { return; } } void CMfcopenView::OnUpdateTreeTranslate(CCmdUI* pCmdUI) { CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); pCmdUI->Enable(m_itreeflag); //点击工作中心不被平移 if(m_itreeflag == 999) pCmdUI->Enable(FALSE); //允许其他的平移 else { for(int i=0; i m_itypenumber; i++) { if(m_itreeflag == (UINT)(1000+i)) pCmdUI->Enable(!m_btypehide[i]); } if(i>=pTree->m_itypenumber) pCmdUI->Enable(!(m_ilflag[m_itreeflag] == 1)); } } void CMfcopenView::OnPlay() { // TODO: Add your command handler code here CMfcopenDoc* pDoc = GetDocument(); if(!m_btempstop) { for(int i=0; i<100; i++) for(int j=0; j<4; j++) m_fmove[i][j][3] = 0; m_fglobaltime = 0; //中心坐标还原 for(i=0; i<100; i++) for(int j=0; j<3; j++) m_fcenter[i][j] = m_fsectcenter[i][j] = m_forigincenter[i][j]; g_bganshe = FALSE; Invalidate(FALSE); UpdateWindow(); } m_bplay = !m_bplay; if(m_bplay)//启动平移开关 { m_fglobaltime = 0;//时间置零 m_brepeat = FALSE; } else//关闭平移开关 { for(int i=0; i<100; i++) for(int j=0; j<4; j++) m_fmove[i][j][3] = 0; m_fglobaltime = 0; //中心坐标还原 for(i=0; i<100; i++) for(int j=0; j<3; j++) m_fcenter[i][j] = m_fsectcenter[i][j] = m_forigincenter[i][j]; g_bganshe = FALSE; Invalidate(FALSE); UpdateWindow(); } } void CMfcopenView::OnUpdatePlay(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable((m_bfileopen||m_banimalfileopen)&&!m_brepeat&&!m_btempstop); pCmdUI->SetCheck(m_bplay); } void CMfcopenView::OnTreeInformation() { // TODO: Add your command handler code here CClientDC dc(this); CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if(m_itreeflag >= 999) return; CString str; str.Format("它被平移过%d次\n具体细节信息请查询信息窗口\n", m_itrannumber[m_itreeflag]); MessageBox(str, "信息", MB_ICONINFORMATION); } void CMfcopenView::OnUpdateTreeInformation(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CChildTree* pTree=(CChildTree*)&pFrame->m_cTree; m_itreeflag = pTree->GetSelectItemIndex(); if((m_itreeflag >= 999)||(m_itreeflag == 0)) pCmdUI->Enable(FALSE); else pCmdUI->Enable(TRUE); } void CMfcopenView::OnTempstop() { // TODO: Add your command handler code here m_btempstop = !m_btempstop; } void CMfcopenView::OnUpdateTempstop(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bplay||m_btempstop||m_brepeat); pCmdUI->SetCheck(m_btempstop); } void CMfcopenView::OnRepeat() { // TODO: Add your command handler code here m_brepeat = !m_brepeat; if(!m_btempstop) { for(int i=0; i<100; i++) for(int j=0; j<4; j++) m_fmove[i][j][3] = 0; m_fglobaltime = 0; //中心坐标还原 for(i=0; i<100; i++) for(int j=0; j<3; j++) m_fcenter[i][j] = m_fsectcenter[i][j] = m_forigincenter[i][j]; g_bganshe = FALSE; Invalidate(FALSE); UpdateWindow(); } if(m_brepeat) { m_bplay = FALSE; m_btempstop = FALSE; m_fglobaltime = 0; } else//关闭平移开关 { for(int i=0; i<100; i++) for(int k=0; k<4; k++) m_fmove[i][k][3] = 0; m_fglobaltime = 0; //中心坐标还原 for(i=0; i<100; i++) for(int j=0; j<3; j++) m_fcenter[i][j] = m_fsectcenter[i][j] = m_forigincenter[i][j]; g_bganshe = FALSE; Invalidate(FALSE); UpdateWindow(); } } void CMfcopenView::OnUpdateRepeat(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable((m_bfileopen||m_banimalfileopen)&&!m_bplay&&!m_btempstop); pCmdUI->SetCheck(m_brepeat); } void CMfcopenView::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMfcopenDoc* pDoc = GetDocument(); if((pDoc->m_array == NULL || pDoc->m_array->next == NULL)&&!m_bFakOpen) { return; } CMenu menu; menu.LoadMenu(IDR_MENUPOPUP); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd()); } int CMfcopenView::RetrieveObjectID(int x, int y) { int objectsfound = 0; int viewportcoord[4] = {0}; unsigned int selectbuffer[32] = {0}; glSelectBuffer(32, selectbuffer); glGetIntegerv(GL_VIEWPORT, viewportcoord); glMatrixMode(GL_PROJECTION); glPushMatrix(); glRenderMode(GL_SELECT); glLoadIdentity(); gluPickMatrix(x, viewportcoord[3]-y, 2, 2, viewportcoord); glOrtho(m_fleft*m_scale,m_fright*m_scale, m_fbottom*m_scale, m_ftop*m_scale,-100.0,100.0); glMatrixMode(GL_MODELVIEW); DrawGLScene(); objectsfound = glRenderMode(GL_RENDER); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); if(objectsfound > 0) { unsigned int lowestdepth = selectbuffer[1]; int selectedobject = selectbuffer[3]; for(int i=0; i m_iDArrnumber; j++) { float tempvalue = 0; float abs_x = (tempvalue = (m_fcenter[i][0] - m_fcenter[j][0])) > 0 ? tempvalue : -tempvalue; float abs_y = (tempvalue = (m_fcenter[i][1] - m_fcenter[j][1])) > 0 ? tempvalue : -tempvalue; float abs_z = (tempvalue = (m_fcenter[i][2] - m_fcenter[j][2])) > 0 ? tempvalue : -tempvalue; if(abs_x > (m_fboxsize[i][0] + m_fboxsize[j][0])/2 || abs_y > (m_fboxsize[i][1] + m_fboxsize[j][1])/2 || abs_z > (m_fboxsize[i][2] + m_fboxsize[j][2])/2) continue; else { //2、box已经相交,现在应该进行更加严格的检查 if( DetailCheck(j-1, r-1) ) { if(!g_bganshe) { m_bplay = FALSE; KillTimer(1); MessageBox("存在预定运动下的不正常干涉!!", "ERROR", MB_OK); SetTimer(1, 20, NULL); g_bganshe = TRUE; //把干涉信息记入output窗口 CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; COutputBar *m_output = &(pFrame->m_wndOutput); CMfcopenDoc *pdoc = GetDocument(); if(ganshe_writer > 0) m_output->m_BuildList.ResetContent(); ganshe_writer++; CString str; str = " 预定运动下存在干涉,以下是干涉信息:\n"; m_output->m_BuildList.AddString(str); str = "--------------------------------------------------------------"; m_output->m_BuildList.AddString(str); str.Format(" 1、存在干涉的两个物体序列号是:%d 和 %d", j, r); m_output->m_BuildList.AddString(str); str.Format(" 2、其中实体 %d 运动的实际距离如下:", j); m_output->m_BuildList.AddString(str); str.Format(" X : %f, Y: %f, Z:%f", (m_fcenter[j][0] - m_forigincenter[j][0])*m_fBoxMax, (m_fcenter[j][1] - m_forigincenter[j][1])*m_fBoxMax,(m_fcenter[j][2] - m_forigincenter[j][2])*m_fBoxMax); m_output->m_BuildList.AddString(str); str.Format(" 3、其中实体 %d 运动的实际距离如下:", r); m_output->m_BuildList.AddString(str); str.Format(" X : %f, Y: %f, Z:%f", (m_fcenter[r][0] - m_forigincenter[r][0])*m_fBoxMax, (m_fcenter[r][1] - m_forigincenter[r][1])*m_fBoxMax,(m_fcenter[r][2] - m_forigincenter[r][2])*m_fBoxMax); m_output->m_BuildList.AddString(str); } //////////////////////////// //干涉后事处理 for(int n=1; n<=pDoc->m_iDArrnumber; n++) { m_fmove[n][m_istlmove[n]][3] = -100;//stop! } //定"最后"位置 for(int error=1; error <= pDoc->m_iDArrnumber; error++) { m_fmove[error][m_istlmove[error]][0] = m_fcenter[error][0] - m_forigincenter[error][0]; m_fmove[error][m_istlmove[error]][1] = m_fcenter[error][1] - m_forigincenter[error][1]; m_fmove[error][m_istlmove[error]][2] = m_fcenter[error][2] - m_forigincenter[error][2]; } ///////////////////////////// return TRUE; } else return FALSE; } } return FALSE; } BOOL CMfcopenView::OctTreeCheck(STLOctTree *first, STLOctTree *second, float x[3], float y[3]) { int flag1 = 0; int flag2 = 0; for(int vv=0; vv<8; vv++) { //两棵树可能有不同的深度,只进行同层比较是不对的! if(first->pchild[vv] == NULL) { flag1++; continue; } else { if(first->pchild[vv]->IsHave == 0) continue; float first_center[3] = { first->pchild[vv]->m_vCenter.x+x[0], first->pchild[vv]->m_vCenter.y+x[1], first->pchild[vv]->m_vCenter.z+x[2] }; int tt = 0; for(int kk=0; kk<8; kk++) { if(second->pchild[kk] == NULL) { tt++; continue; } else { if(second->pchild[kk]->IsHave == 0) continue; float second_center[3] = { second->pchild[kk]->m_vCenter.x+y[0], second->pchild[kk]->m_vCenter.y+y[1], second->pchild[kk]->m_vCenter.z+y[2] }; float delta; float abs_x = (delta = first_center[0] - second_center[0]) > 0 ? delta : -delta; float abs_y = (delta = first_center[1] - second_center[1]) > 0 ? delta : -delta; float abs_z = (delta = first_center[2] - second_center[2]) > 0 ? delta : -delta; if(abs_x > (first->pchild[vv]->m_Width+second->pchild[kk]->m_Width)/2.0f || abs_y > (first->pchild[vv]->m_Width+second->pchild[kk]->m_Width)/2.0f || abs_z > (first->pchild[vv]->m_Width+second->pchild[kk]->m_Width)/2.0f) continue; else { if(!OctTreeCheck(first->pchild[vv], second->pchild[kk], x, y)) continue; else { if(ganshe_first == NULL) { ganshe_first = first->pchild[vv]; ganshe_second = second->pchild[kk]; m_fganshemove[0][0] = first->pchild[vv]->m_vCenter.x+x[0]; m_fganshemove[0][1] = first->pchild[vv]->m_vCenter.y+x[1]; m_fganshemove[0][2] = first->pchild[vv]->m_vCenter.z+x[2]; m_fganshemove[1][0] = second->pchild[kk]->m_vCenter.x+y[0]; m_fganshemove[1][1] = second->pchild[kk]->m_vCenter.y+y[1]; m_fganshemove[1][2] = second->pchild[kk]->m_vCenter.z+y[2]; } return TRUE; } } } } if(tt >= 8 && second->IsHave != 0) { //这棵树的叶节点 if(!NonSynOctTreeCheck(first->pchild[vv], second, x, y)) continue; else return TRUE; } } } if(flag1 >= 8 && first->IsHave != 0) { //这棵树的叶节点 int glat = 0; for(int rr=0; rr<8; rr++) { if(second->pchild[rr] != NULL) { if(!NonSynOctTreeCheck(second->pchild[rr], first, y, x)) continue; else return TRUE; } else glat++; } if(glat >= 8) { if(second->IsHave == 0) return FALSE; else { if(ganshe_first == NULL) { ganshe_first = first; ganshe_second = second; m_fganshemove[0][0] = first->m_vCenter.x+x[0]; m_fganshemove[0][1] = first->m_vCenter.y+x[1]; m_fganshemove[0][2] = first->m_vCenter.z+x[2]; m_fganshemove[1][0] = second->m_vCenter.x+y[0]; m_fganshemove[1][1] = second->m_vCenter.y+y[1]; m_fganshemove[1][2] = second->m_vCenter.z+y[2]; } return TRUE; } } } return FALSE; } //非同层比较 BOOL CMfcopenView::NonSynOctTreeCheck(STLOctTree *root, STLOctTree *leaf, float x[3], float y[3]) { float root_center[3] = { root->m_vCenter.x+x[0], root->m_vCenter.y+x[1], root->m_vCenter.z+x[2] }; float leaf_center[3] = { leaf->m_vCenter.x+y[0], leaf->m_vCenter.y+y[1], leaf->m_vCenter.z+y[2] }; float delta; float abs_x = (delta = root_center[0] - leaf_center[0]) > 0 ? delta : -delta; float abs_y = (delta = root_center[1] - leaf_center[1]) > 0 ? delta : -delta; float abs_z = (delta = root_center[2] - leaf_center[2]) > 0 ? delta : -delta; if(abs_x > (root->m_Width+leaf->m_Width)/2.0f || abs_y > (root->m_Width+leaf->m_Width)/2.0f || abs_z > (root->m_Width+leaf->m_Width)/2.0f) return FALSE; else { int flag2 = 0; for(int vv=0; vv<8; vv++) { if(root->pchild[vv] != NULL) { if(!NonSynOctTreeCheck(root->pchild[vv], leaf, x, y)) continue; else { if(ganshe_first == NULL) { ganshe_first = root->pchild[vv]; ganshe_second = leaf; m_fganshemove[0][0] = root->pchild[vv]->m_vCenter.x+x[0]; m_fganshemove[0][1] = root->pchild[vv]->m_vCenter.y+x[1]; m_fganshemove[0][2] = root->pchild[vv]->m_vCenter.z+x[2]; m_fganshemove[1][0] = leaf->m_vCenter.x+y[0]; m_fganshemove[1][1] = leaf->m_vCenter.y+y[1]; m_fganshemove[1][2] = leaf->m_vCenter.z+y[2]; } return TRUE; } } else flag2++; } //两个叶节点比较 if(flag2 >= 8) { if(root->IsHave == 0) return FALSE; if(ganshe_first == NULL) { ganshe_first = root; ganshe_second = leaf; m_fganshemove[0][0] = root->m_vCenter.x+x[0]; m_fganshemove[0][1] = root->m_vCenter.y+x[1]; m_fganshemove[0][2] = root->m_vCenter.z+x[2]; m_fganshemove[1][0] = leaf->m_vCenter.x+y[0]; m_fganshemove[1][1] = leaf->m_vCenter.y+y[1]; m_fganshemove[1][2] = leaf->m_vCenter.z+y[2]; } return TRUE; } } return FALSE; } BOOL CMfcopenView::DetailCheck(int i, int j) { //两棵树之间进行比较 STLOctTree *first = root[i]; STLOctTree *second = root[j]; if(first == NULL || second == NULL) return FALSE; float x[3] = {m_fcenter[i+1][0] - m_forigincenter[i+1][0], m_fcenter[i+1][1] - m_forigincenter[i+1][1], m_fcenter[i+1][2] - m_forigincenter[i+1][2]}; float y[3] = {m_fcenter[j+1][0] - m_forigincenter[j+1][0], m_fcenter[j+1][1] - m_forigincenter[j+1][1], m_fcenter[j+1][2] - m_forigincenter[j+1][2]}; return OctTreeCheck(first, second, x, y); } void CMfcopenView::OnViewFont() { // TODO: Add your command handler code here m_view = INT_FRONT; m_fxrot = 0; m_fyrot = 0; m_fxtra = 0; m_fytra = 0; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewFont(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_view == INT_FRONT); } void CMfcopenView::OnViewLeft() { // TODO: Add your command handler code here m_view = INT_LEFT; m_fxrot = 0; m_fyrot = 0; m_fxtra = 0; m_fytra = 0; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewLeft(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_view == INT_LEFT); } void CMfcopenView::OnViewTop() { // TODO: Add your command handler code here m_view = INT_TOP; m_fxrot = 0; m_fyrot = 0; m_fxtra = 0; m_fytra = 0; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewTop(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_view == INT_TOP); } void CMfcopenView::OnViewPoints() { // TODO: Add your command handler code here m_umodelview = GL_POINT; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewPoints(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen); pCmdUI->SetCheck(m_umodelview == GL_POINT); } void CMfcopenView::OnViewTriangles() { // TODO: Add your command handler code here m_umodelview = GL_FILL; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewTriangles(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen); pCmdUI->SetCheck(m_umodelview == GL_FILL); } void CMfcopenView::OnViewLines() { // TODO: Add your command handler code here m_umodelview = GL_LINE; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewLines(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen); pCmdUI->SetCheck(m_umodelview == GL_LINE); } void CMfcopenView::OnViewRefresh() { // TODO: Add your command handler code here m_brefresh = TRUE; for(int i=0; i<2; i++) for(int j=0; j<3; j++) m_lineganshe[i][j] = 0; for(i=0; i<3; i++) for(int j=0; j<3; j++) m_triangleganshe[i][j] = 0; } void CMfcopenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default //获取主框架窗口的指针 CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; switch(nChar){ case VK_ESCAPE: //调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态 pFrame->OnViewRestore(); break; case VK_UP: m_fd -= 0.002f; Invalidate(FALSE); break; case VK_DOWN: m_fd += 0.002f; Invalidate(FALSE); break; } CView::OnKeyDown(nChar, nRepCnt, nFlags); } void CMfcopenView::OnRectScale() { // TODO: Add your command handler code here if(m_popmenu == INT_ZOOM_RECT) { m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); SetCursor(m_hcursor); ShowCursor(true); return; } m_popmenu = INT_ZOOM_RECT; m_hcursor = AfxGetApp()->LoadCursor(IDC_CURSORZOOM_RECT); SetCursor(m_hcursor); ShowCursor(true); } void CMfcopenView::CreateTexture(UINT textureArray[], LPSTR strFileName, int textureID) { AUX_RGBImageRec *pBitmap = NULL; if(!strFileName) // Return from the function if no file name was passed in return; // We need to load the texture data, so we use a cool API that the glaux.lib offers. pBitmap = auxDIBImageLoad(strFileName); // Load the bitmap and store the data if(pBitmap == NULL) // If we can't load the file, quit! exit(0); // Now that we have the texture data, we need to register our texture with OpenGL // To do this we need to call glGenTextures(). The 1 for the first parameter is // how many texture we want to register this time (we could do a bunch in a row). // The second parameter is the array index that will hold the reference to this texture. // Generate a texture with the associative texture ID stored in the array glGenTextures(1, &textureArray[textureID]); // Now that we have a reference for the texture, we need to bind the texture // to tell OpenGL this is the reference that we are assigning the bitmap data too. // The first parameter tells OpenGL we want are using a 2D texture, while the // second parameter passes in the reference we are going to assign the texture too. // We will use this function later to tell OpenGL we want to use this texture to texture map. // Bind the texture to the texture arrays index and init the texture glBindTexture(GL_TEXTURE_2D, textureArray[textureID]); // Now comes the important part, we actually pass in all the data from the bitmap to // create the texture. Here is what the parameters mean in gluBuild2DMipmaps(): // (We want a 2D texture, 3 channels (RGB), bitmap width, bitmap height, It's an RGB format, // the data is stored as unsigned bytes, and the actuall pixel data); // What is a Mip map? Mip maps are a bunch of scaled pictures from the original. This makes // it look better when we are near and farther away from the texture map. It chooses the // best looking scaled size depending on where the camera is according to the texture map. // Otherwise, if we didn't use mip maps, it would scale the original UP and down which would // look not so good when we got far away or up close, it would look pixelated. // Build Mipmaps (builds different versions of the picture for distances - looks better) gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pBitmap->sizeX, pBitmap->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pBitmap->data); // Lastly, we need to tell OpenGL the quality of our texture map. GL_LINEAR is the smoothest. // GL_NEAREST is faster than GL_LINEAR, but looks blochy and pixelated. Good for slower computers though. // Read more about the MIN and MAG filters at the bottom of main.cpp glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Now we need to free the bitmap data that we loaded since openGL stored it as a texture if (pBitmap) // If we loaded the bitmap { if (pBitmap->data) // If there is texture data { free(pBitmap->data); // Free the texture data, we don't need it anymore } free(pBitmap); // Free the bitmap structure } } void CMfcopenView::OnFindLine() { // TODO: Add your command handler code here m_bfindline = INT_LINE; } void CMfcopenView::OnUpdateFindLine(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(g_bganshe); } void CMfcopenView::OnFindPort() { // TODO: Add your command handler code here m_bfindline = INT_PORT; OnViewFont(); } void CMfcopenView::OnUpdateFindPort(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(g_bganshe); } void CMfcopenView::OnToolbar3() { // TODO: Add your command handler code here KillTimer(1); m_bcut1 = !m_bcut1; if(m_bcut1) { float a, b, c, d; CPlandlg planedlg; if(planedlg.DoModal()==IDOK) { a = planedlg.m_fa; b = planedlg.m_fb; c = planedlg.m_fc; d = -planedlg.m_fd; } CVector3 xishu; xishu.x = a; xishu.y = b; xishu.z = c; Normalize(xishu); m_xishu = xishu; d = d/Magnitude(xishu); m_fd = d; } SetTimer(1, 20, NULL); } void CMfcopenView::OnUpdateToolbar3(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen); pCmdUI->SetCheck(m_bcut1); pCmdUI->Enable(!m_bcut2); } void CMfcopenView::ShowSection(int i, int rk) { Link *head = new Link; head->point1.x = head->point1.y = head->point1.z = 1000.0f; head->point2.x = head->point2.y = head->point2.z = 1000.0f; head->flag = FALSE; head->next = NULL; CMfcopenDoc* pDoc = GetDocument(); STLArray *data = pDoc->m_array; STLStruct *first = NULL; for( ; data!=NULL; data=data->next) { if((unsigned)i == data->flag) first = data->stl; } //对这个物体的每一三角形,求它与平面的相交情况,优化!!!!!!!!!!! while(first->next != NULL) { CVector3 point1, point2, point3; point1.x = first->next->fPoint1[0]; point1.y = first->next->fPoint1[1]; point1.z = first->next->fPoint1[2]; point2.x = first->next->fPoint2[0]; point2.y = first->next->fPoint2[1]; point2.z = first->next->fPoint2[2]; point3.x = first->next->fPoint3[0]; point3.y = first->next->fPoint3[1]; point3.z = first->next->fPoint3[2]; //因为规定所有的点都保持不变,故现在只有计算变化了的临时值 point1.x += m_fcenter[i][0] - m_forigincenter[i][0]; point1.y += m_fcenter[i][1] - m_forigincenter[i][1]; point1.z += m_fcenter[i][2] - m_forigincenter[i][2]; point2.x += m_fcenter[i][0] - m_forigincenter[i][0]; point2.y += m_fcenter[i][1] - m_forigincenter[i][1]; point2.z += m_fcenter[i][2] - m_forigincenter[i][2]; point3.x += m_fcenter[i][0] - m_forigincenter[i][0]; point3.y += m_fcenter[i][1] - m_forigincenter[i][1]; point3.z += m_fcenter[i][2] - m_forigincenter[i][2]; ////////////// CVector3 line1[2] = {{point1.x, point1.y, point1.z}, {point2.x, point2.y, point2.z}}; CVector3 line2[2] = {{point2.x, point2.y, point2.z}, {point3.x, point3.y, point3.z}}; CVector3 line3[2] = {{point3.x, point3.y, point3.z}, {point1.x, point1.y, point1.z}}; //假设交点唯一 CVector3 fpoint1, fpoint2, fpoint3; bool xiangjiao1 = IntersectedPlane_2(line1, m_xishu, m_fd); if(xiangjiao1) fpoint1 = IntersectionPoint(m_xishu, line1, m_fd); bool xiangjiao2 = IntersectedPlane_2(line2, m_xishu, m_fd); if(xiangjiao2) fpoint2 = IntersectionPoint(m_xishu, line2, m_fd); bool xiangjiao3 = IntersectedPlane_2(line3, m_xishu, m_fd); if(xiangjiao3) fpoint3 = IntersectionPoint(m_xishu, line3, m_fd); //画三角形 if(xiangjiao1) { if(xiangjiao2) { if(xiangjiao3) { glBegin(GL_LINE_LOOP);//三点都在面上 glVertex3f(point1.x, point1.y, point1.z); glVertex3f(point2.x, point2.y, point2.z); glVertex3f(point3.x, point3.y, point3.z); glEnd(); } else//1和2在面上 { //记录到链表之中去 Link *node = new Link; node->point1 = fpoint1; node->point2 = fpoint2; node->flag = FALSE; node->next = head; head = node; if(m_bcut1) { glBegin(GL_LINES); glVertex3f(fpoint1.x, fpoint1.y, fpoint1.z); glVertex3f(fpoint2.x, fpoint2.y, fpoint2.z); glEnd(); } } } else { if(xiangjiao3) { //记录到链表之中去 Link *node = new Link; node->point1 = fpoint1; node->point2 = fpoint3; node->flag = FALSE; node->next = head; head = node; if(m_bcut1) { glBegin(GL_LINES); glVertex3f(fpoint1.x, fpoint1.y, fpoint1.z); glVertex3f(fpoint3.x, fpoint3.y, fpoint3.z); glEnd(); } } } } else//1没有交点 { if(xiangjiao2) { if(xiangjiao3) { //记录到链表之中去 Link *node = new Link; node->point1 = fpoint2; node->point2 = fpoint3; node->flag = FALSE; node->next = head; head = node; if(m_bcut1) { glBegin(GL_LINES); glVertex3f(fpoint2.x, fpoint2.y, fpoint2.z); glVertex3f(fpoint3.x, fpoint3.y, fpoint3.z); glEnd(); } } } } first = first->next; } while(head != NULL) { Link *temp = head; head = head->next; delete temp; } } Link * CMfcopenView::FindSketch(Link *dest, Link *back) { Link *temp = dest; static int count = 0; while(temp != NULL) { BOOL point1 = fabs(temp->point1.x - back->point1.x) < 0.000001 && fabs(temp->point1.y - back->point1.y) < 0.000001 && fabs(temp->point1.z - back->point1.z) < 0.000001; BOOL point2 = fabs(temp->point2.x - back->point2.x) < 0.000001 && fabs(temp->point2.y - back->point2.y) < 0.000001 && fabs(temp->point2.z - back->point2.z) < 0.000001; BOOL point12 = fabs(temp->point1.x - back->point2.x) < 0.000001 && fabs(temp->point1.y - back->point2.y) < 0.000001 && fabs(temp->point1.z - back->point2.z) < 0.000001; BOOL point21 = fabs(temp->point2.x - back->point1.x) < 0.000001 && fabs(temp->point2.y - back->point1.y) < 0.000001 && fabs(temp->point2.z - back->point1.z) < 0.000001; if(!temp->flag && (point1 || point2 || point12 || point21)) { Link *newnode = new Link; newnode->point1 = temp->point1; newnode->point2 = temp->point2; newnode->flag = TRUE; temp->flag = TRUE;//表示他已经记录到了链表之中 newnode->next = back; back = newnode; count++; break; } temp = temp->next; } if(count > 0) { //找到一个和第一个有相同顶点的线,继续找和这个有相同顶点的线 count = 0; back = FindSketch(dest, back); } return back; } void CMfcopenView::DestroyTree(STLOctTree *root) { if(root != NULL) { for(int vv=0; vv<8; vv++) if(root->pchild[vv] != NULL) DestroyTree(root->pchild[vv]); delete root; } } void CMfcopenView::DrawCubeWeb(STLOctTree *root) { if(root == NULL || root->IsHave == 0) return; int flag = 0; for(int vvv=0; vvv<8; vvv++) { if(root->pchild[vvv] != NULL) DrawCubeWeb(root->pchild[vvv]); flag++; } if(flag < 8) return; glColor3f(1.0f, 1.0f, 0); glBegin(GL_QUADS); //前 glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); //后 glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); //左 glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); //右 glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); //上 glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y+root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); //下 glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glVertex3f(root->m_vCenter.x-root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z+root->m_Width/2.0f); glVertex3f(root->m_vCenter.x+root->m_Width/2.0f, root->m_vCenter.y-root->m_Width/2.0f, root->m_vCenter.z-root->m_Width/2.0f); glEnd(); m_lgcubenumber++; } void CMfcopenView::OnViewMess() { // TODO: Add your command handler code here m_bviewmess = !m_bviewmess; } void CMfcopenView::OnUpdateViewMess(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable((m_bfileopen || m_banimalfileopen) && root[0]); pCmdUI->SetCheck(m_bviewmess == TRUE); } void CMfcopenView::CreateTree(STLArray *data, int i) { CMfcopenDoc* pDoc = GetDocument(); root[itree] = new STLOctTree; root[itree]->IsHave = 1; root[itree]->m_vCenter.x = m_forigincenter[itree+1][0]; root[itree]->m_vCenter.y = m_forigincenter[itree+1][1]; root[itree]->m_vCenter.z = m_forigincenter[itree+1][2]; float maxbox = m_fboxsize[i][0] > m_fboxsize[i][1] ? m_fboxsize[i][0] : m_fboxsize[i][1]; maxbox = maxbox > m_fboxsize[i][2] ? maxbox : m_fboxsize[i][2]; root[itree]->m_Width = maxbox; for(int vv=0; vv<8; vv++) root[itree]->pchild[vv] = NULL; whichnode = 1;//重新下一颗数的计算进度 CreateNode(root[itree], data, m_fprecision, i); itree++; } static int g_precision = 0; void CMfcopenView::OnCreateTree() { // TODO: Add your command handler code here CMfcopenDoc* pDoc = GetDocument(); STLArray *data = pDoc->m_array->next; if(g_precision <= 0) { CPrecisionDlg predlg; if(predlg.DoModal() == IDOK) { m_fprecision = predlg.m_fprecision; g_precision++; } else return; } BeginWaitCursor(); for(int vv=0; vv<10; vv++) { if(root[vv] != NULL && data != NULL) { data = data->next; continue; } else { if(data == NULL) { ::SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd, WM_DISPPROG, 0, zongshu_d); break; } else { zongshu = 0; zongshu_d = 0; CreateTree(data, vv+1); data = data->next; } } } EndWaitCursor(); } void CMfcopenView::OnUpdateCreateTree(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen || m_banimalfileopen); } void CMfcopenView::OnFileClear() { // TODO: Add your command handler code here CMfcopenDoc* pDoc = GetDocument(); pDoc->szFilename = ""; for(int i=0; i<10; i++) { DestroyTree(root[i]); } STLArray *tt; while(pDoc->m_array != NULL) { tt = pDoc->m_array; pDoc->m_array = pDoc->m_array->next; while(tt->stl != NULL) { STLData *temp; temp = tt->stl; tt->stl = tt->stl->next; delete temp; } delete tt; } ResetData(); //doc变量变化 pDoc->ResetData(); // CMainFrame* pFrame; pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; pFrame->m_cTree.DeleteAllItems(); pFrame->m_cTree.ResetData(); pFrame->m_cTree.AddRoot(); //静态变量归位 mm = gg = 0; g_createtree = 0; g_precision = 0; // ::SetWindowText(pFrame->GetSafeHwnd(), "模具动态装配"); Invalidate(TRUE); CRect rc; GetClientRect(&rc); OnSize(SIZE_RESTORED, rc.Width(), rc.Height()); } void CMfcopenView::OnUpdateRectScale(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bfileopen||m_banimalfileopen||m_bFakOpen); pCmdUI->SetCheck(m_popmenu == INT_ZOOM_RECT); } void CMfcopenView::ResetData() { g_bganshe = FALSE; m_bviewganshe = FALSE; ganshe_first = NULL; ganshe_second = NULL; m_lgcubenumber = 0; ganshe_writer = 0; writer = 0; itree = 0; m_movecount = count = 0; m_fpasstime = 0; m_bIsPrint = false; m_bcutplane = FALSE; m_RectZoomOldpoint.x = m_RectZoomOldpoint.y = -100; m_iObjectId = 0; m_bviewmess = FALSE; for(int vv=0; vv<10; vv++) { root[vv] = NULL; } m_bcut2 = FALSE; m_bcut1 = FALSE; m_ortho_bias_x = m_ortho_bias_y = 0; m_brefresh = FALSE; m_bfindline = INT_LAST; m_umodelview = GL_FILL; m_view = INT_FRONT; m_zoomcenter.x = m_zoomcenter.y = 0; m_fleft = m_fright = m_fbottom = m_ftop = 0; m_brepeat = FALSE; m_btempstop = FALSE; m_banimalfileopen = FALSE; m_ballhide = FALSE; m_fglobaltime = 0; m_bplay = FALSE; m_fBoxMax = 0; m_itreeflag = 0; for(int q=0; q<100; q++) { m_itrannumber[q] =0; m_ilflag[q] = 0; m_btypehide[q] = FALSE; m_istlmove[q] = 0; } for(q=0; q<100; q++) for(int d=0; d<4; d++) for(int t=0; t<3; t++) { m_fsteptranslate[q][d][t] = 0; m_fInformation[q][d][t] = 0; } for(q=0; q<100; q++) for(int d=0; d<4; d++) { m_fmove[q][d][0] = 0; m_fmove[q][d][1] = 0; m_fmove[q][d][2] = 0; m_fmove[q][d][3] = 0; } for(q=0; q<2; q++) for(int d=0; d<3; d++) m_fganshemove[q][d] = 0; //程序认定时间是0秒开始的 for(q=0; q<100; q++) for(int i=0; i<4; i++) for(int kk=0; kk<2; kk++) { m_ftimemove[q][i][kk] = 0; } for(q=0; q<100; q++) for(int i=0; i<3; i++) m_fcenter[q][i] = m_forigincenter[q][i] = m_fsectcenter[q][i] = 0; for(q=0; q<2; q++) for(int i=0; i<3; i++) m_lineganshe[q][i] = 0; for(q=0; q<3; q++) for(int i=0; i<3; i++) m_triangleganshe[q][i] = 0; m_ftimes = 1.0f; m_fstepx = m_fstepy = 0.04f; m_fanglex = m_fangley = m_fanglez = 0; m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); m_current.x = m_current.y = 200; m_oldpt.x = m_oldpt.y = 200; m_fxtra = m_fytra = 0; m_scale = 0.5f; m_fxrot = m_fyrot = m_fzrot = 0; m_blmousedown = false; m_bfileopen = false; m_bFakOpen = false; LightAmbient[0]= 0.0f; LightAmbient[1]= 0.0f; LightAmbient[2]= 0.0f; LightAmbient[3]= 1.0f; LightSpecular[0]= 1.0f; LightSpecular[1]= 1.0f; LightSpecular[2]= 1.0f; LightSpecular[3]= 1.0f; LightDiffuse[0]= 1.0f; LightDiffuse[1]= 1.0f; LightDiffuse[2]= 1.0f; LightDiffuse[3]= 1.0f; LightPosition[0]= 0.0f; LightPosition[1]= 1.0f; LightPosition[2]= 80.0f; LightPosition[3]= 1.0f; for(q=0; q<100; q++) { mat_amb_diff[q][0] = 1.0f; mat_amb_diff[q][1] = 0.2F; mat_amb_diff[q][2] = 0.2f; mat_amb_diff[q][3] = 0.5f; } mat_amb_diff_org[0] = 0.8f; mat_amb_diff_org[1] = 0.8f; mat_amb_diff_org[2] = 0.8f; mat_amb_diff_org[3] = 0.5f; mat_amb_diff_ganshe[0] = 1.0f; mat_amb_diff_ganshe[1] = 1.0f; mat_amb_diff_ganshe[2] = 1.0f; mat_amb_diff_ganshe[3] = 0.5f; shininess = 100.0f; } void CMfcopenView::OnViewGanshe() { // TODO: Add your command handler code here m_bviewganshe = !m_bviewganshe; } void CMfcopenView::OnUpdateViewGanshe(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(g_bganshe); pCmdUI->SetCheck(m_bviewganshe); } void CMfcopenView::ViewGanshe() { glColor3f(1.0f, 1.0f, 1.0f); STLOctTree *ganshe_node[2]; ganshe_node[0] = ganshe_first; ganshe_node[1] = ganshe_second; glBegin(GL_QUADS); for(int i=0; i<2; i++) { //前 glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); //后 glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); //左 glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); //右 glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); //上 glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); //下 glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z+ganshe_node[i]->m_Width/2.0f); glVertex3f(ganshe_node[i]->m_vCenter.x+ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.y-ganshe_node[i]->m_Width/2.0f, ganshe_node[i]->m_vCenter.z-ganshe_node[i]->m_Width/2.0f); } glEnd(); } void CMfcopenView::OnFit() { // TODO: Add your command handler code here if(m_popmenu == INT_FIT) { m_popmenu = INT_END; m_hcursor = AfxGetApp()->LoadCursor(IDC_POINTER); SetCursor(m_hcursor); ShowCursor(true); return; } m_popmenu = INT_FIT; m_fxtra = m_fytra = 0; m_fstepx = m_fstepy = 0.04f; m_scale = 0.5f; CRect rc; GetClientRect(&rc); OnSize(SIZE_RESTORED, rc.Width(), rc.Height()); Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateFit(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_popmenu == INT_FIT); } void CMfcopenView::BuildFakList(int num) { CMfcopenDoc* pDoc = GetDocument(); glNewList( num, GL_COMPILE ); for(int i=0; i m_Trinumber; i++) { glNormal3fv(pDoc->webtri[i].nor1); glVertex3fv(pDoc->webtri[i].point1); glNormal3fv(pDoc->webtri[i].nor2); glVertex3fv(pDoc->webtri[i].point2); glNormal3fv(pDoc->webtri[i].nor3); glVertex3fv(pDoc->webtri[i].point3); } glEndList(); } void CMfcopenView::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here wglDeleteContext(m_hRC); } void CMfcopenView::OnViewAllPara() { // TODO: Add your command handler code here if(para->GetSafeHwnd() == NULL) para->Create(); para->ShowWindow(TRUE); para->SetActiveWindow(); } void CMfcopenView::OnUpdateViewAllPara(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable((m_bfileopen || m_banimalfileopen) && !m_bplay && !m_brepeat); } void CMfcopenView::OnViewBack() { // TODO: Add your command handler code here m_view = INT_BACK; m_fxrot = 0; m_fyrot = 0; m_fxtra = 0; m_fytra = 0; Invalidate(FALSE); UpdateWindow(); } void CMfcopenView::OnUpdateViewBack(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_view == INT_BACK); }