// LineVideoDlg.cpp : implementation file // #include "stdafx.h" #if ADS<17 #include "LineVideoDlg.h" #include "avlib.h" #include "Texture.h" #include "actrans.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern void GetRectBmpFromBmp( CWnd *pWnd ,CRect rectClient, CBitmap &bitmap); extern CRect GetVPRect(int cvport); int CLineVideoDlg::m_nFrameNum = 100; int CLineVideoDlg::m_nRate = 25; int CLineVideoDlg::m_nColorNum = 3; BOOL CLineVideoDlg::m_bRender = FALSE; CLineVideoDlg::CLineVideoDlg(CWnd* pParent /*=NULL*/) : GlwCAcUiDialog(CLineVideoDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLineVideoDlg) //}}AFX_DATA_INIT m_bInit = FALSE; m_nCount = 0; m_bHasInitAvi = FALSE; m_bTakePhoto = FALSE; RBList rbMask(RTDXF0, "TCH_CAMERA", NULL); PickSet ss(SS_FREE); if (ss.Get("X", NULL, NULL, rbMask)!=RTNORM) { adsout << "\n请用相机透视建立一相机!"; m_bInit = FALSE; return; } if (ss.Length()==1L) m_id=ss[0L]; else if (SelectEntity("\n请选择上华照相机<退出>:", m_id, rbMask)!=RTNORM) return; m_bInit = TRUE; m_rectVP = CRect(0,0,0,0); } void CLineVideoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLineVideoDlg) DDX_Text(pDX, IDC_EDIT_FRAME_NUM, m_nFrameNum); DDX_Text(pDX, IDC_EDIT_RATE, m_nRate); DDV_MinMaxInt(pDX, m_nRate, 2, 200); DDX_Check(pDX, IDC_CHECK_RENDER, m_bRender); DDX_Radio(pDX, IDC_COLOR2, m_nColorNum); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CLineVideoDlg, GlwCAcUiDialog) //{{AFX_MSG_MAP(CLineVideoDlg) ON_BN_CLICKED(IDC_CAMERA_PATH, OnCameraPath) ON_BN_CLICKED(IDC_PREVIEW, OnPreview) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CLineVideoDlg::HideDialog(BOOL Flag) { if (Flag) { GetParent()->EnableWindow(TRUE); GetParent()->SetFocus(); GetParent()->SetActiveWindow(); ShowWindow(SW_HIDE); GetParent()->RedrawWindow(); } else { GetParent()->EnableWindow(FALSE); EnableWindow(TRUE); SetActiveWindow(); ShowWindow(SW_SHOW); } } void CLineVideoDlg::OnCameraPath() { HideDialog(TRUE); Entity ent; RBList rbMask(RTDXF0, "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE", NULL); if (SelectEntity("\n请选择作为路径的曲线(线/弧/圆/多段线):", ent, rbMask)==RTNORM) { XPoly2D pathCamera(ent); m_ePathCam = ent; if (!pathCamera){ m_pathCamera.Reset(); XCurveSegment curve(ent); curve.AsPoly2D(m_pathCamera); } else m_pathCamera = pathCamera; } HideDialog(FALSE); } BOOL CLineVideoDlg::GetAviFile(CString& csAviFile) { XString sFileName; if (GetFileDia(sFileName, 1, "avi", "输入动画文件名")!=RTNORM) return FALSE; if (FindFile(sFileName)) { if (remove(sFileName) != 0) { AfxMessageBox("当前文件可能被打开或只读!"); return FALSE; } } csAviFile=(const char *)sFileName; /* //CTemporaryResourceOverride vTemp; CFileDialog dlg(TRUE,"*.avi",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("上华录影文件 (*.avi) |*.AVI||"),this); // sr modify if (dlg.DoModal()!=IDOK){ return FALSE; } //if (FindFile(dlg.GetPathName())) { // return FALSE; //} csAviFile = dlg.GetPathName(); */ return TRUE; } void CLineVideoDlg::OnPreview() { UpdateData(TRUE); if (!m_pathCamera) { MessageBox("相机路径没有选!"); return; } if (m_nFrameNum < 1) { MessageBox("总帧数不能为0!\n\n注意:总帧数也不能定得太大,否则会影响预览速度。"); return; } m_bTakePhoto = FALSE; m_nCount = 0; HideDialog(TRUE); for(int i = 0; i < m_nFrameNum; i++) { TakePhoto(); actrTransactionManager->flushGraphics(); acedUpdateDisplay(); } HideDialog(FALSE); } void CLineVideoDlg::OnOK() { extern void SetSunLight(); extern void SetMaterial(); UpdateData(TRUE); m_nCount = 0; m_bTakePhoto = TRUE; if (!m_pathCamera){ MessageBox("相机路径没有选!"); return; } if (m_nFrameNum < 1) { MessageBox("总帧数不能为0!\n注意:总帧数也不能定得太大,否则会影响预览速度。"); return; } HideDialog(TRUE); CString csAviFile; if (!GetAviFile(csAviFile)) { m_nCount = m_nFrameNum; HideDialog(FALSE); return; } int nVP=0; OPENOBJ_BEGIN(m_id, AcDb::kForRead, TDbCamera, pCam); if (pCam == NULL) { HideDialog(FALSE); return; } nVP = pCam->GetAssociateViewport(); m_rectVP = GetVPRect(pCam->GetAssociateViewport()); OPENOBJ_END(); VERIFY(xg_setvar("CVPORT", nVP)==RTNORM); if (m_rectVP.Width()>0 && m_rectVP.Width()<10000 && m_rectVP.Height()>0 && m_rectVP.Height()<10000) { m_bHasInitAvi = TRUE; CWnd *pParentWnd = acedGetAcadFrame(); if (pParentWnd != NULL) { //避免对话框不见了,否则在此一直运行 m_fileAvi.SetSaveOptionsParentWnd(pParentWnd->m_hWnd); } else { m_fileAvi.SetHasSaveOptionsDialog(FALSE); } m_fileAvi.SetColorNum(GetColorNum()); m_fileAvi.Init(csAviFile, m_rectVP.Width(), m_rectVP.Height(), m_nRate); if (m_fileAvi.IsOK()) { //需要高质量 if (m_bRender) { // 渲染初始设置 AvErrorCode retval; static int sbInitialized = FALSE; if (!sbInitialized) { retval = av_loadlib(); if (retval != AvRetNorm) { acdbFail("Library initialization failed.\n"); } else { sbInitialized = TRUE; } } static int bInitialized = FALSE; if (!bInitialized) { retval = av_initialize(); if (retval != AvRetNorm) { acdbFail("initialization failed.\n"); } else { bInitialized = TRUE; } } SetSunLight(); //设置光源 SetMaterial(); //设置材质 //设置渲染配置 if (SetRenderConfig()) { m_sTGAFile=GetTempFileName(".tga"); m_sBMPFile=GetTempFileName(".bmp"); if (m_sTGAFile && m_sBMPFile) { //渲染和逐步制作动画 acedSetStatusBarProgressMeter("正在制作动画,按ESC中断", 0, m_nFrameNum); for(int i = 0; isetVisibility(AcDb::kInvisible); OPENOBJ_END(); acedSetStatusBarProgressMeter("正在制作动画,按ESC中断", 0, m_nFrameNum); for(int i = 0; iGetCamera(); ptTarget = pCam->GetTarget(); double dist = ads_distance(ptCamera, ptTarget); double nLenCam = m_pathCamera.Distance3d(); double nStemCam = nLenCam / m_nFrameNum; m_pathCamera.Polar3d(nStemCam*m_nCount, ptCamera, vtNormal); vtNormal*=dist; ptTarget = ptCamera + vtNormal; pCam->SetCamera(ptCamera); pCam->SetTarget(ptTarget); //如果不是预览,即制作动画 if (m_bTakePhoto) { pCam->SetActive(TRUE); if (pCam->downgradeOpen()==Acad::eOk) { pCam->draw(); pCam->TakePhoto((m_nCount!=0 && m_nCount!=m_nFrameNum && !m_bRender)); pCam->upgradeOpen(); bOpend = TRUE; } } } OPENOBJ_END(); //如果不是预览,则制作动画 if (m_bTakePhoto && bOpend) { if (m_bRender && Render() && FindFile(m_sTGAFile)) { if (FindFile(m_sBMPFile)) { remove(m_sBMPFile); } CTexture texture; if (texture.ReadFile(m_sTGAFile)) { texture.SaveFile(m_sBMPFile); if (FindFile(m_sBMPFile)) { m_fileAvi.AddFrame(m_sBMPFile); } } } else { CBitmap bitmap; GetRectBmpFromBmp(acedGetAcadDwgView(), m_rectVP, bitmap); m_fileAvi.AddFrame(bitmap); } acedSetStatusBarProgressMeterPos(m_nCount+1); } m_nCount++; } //渲染设置(同CPathVideoDlg::SetRenderConfig()) BOOL CLineVideoDlg::SetRenderConfig() { AvErrorCode retval; //渲染系统配置 AvRprefParam pRpref; pRpref.mode = AvRprefSet; // 设置 pRpref.renderType = AvRprefRenderRaytrace; // 照片级光线跟踪渲染 pRpref.destination = AvRprefDestFile; // 文件 AvRprefToggleParam Toggle; // 渲染选项 Toggle.AvRprefSmoothToggle = TRUE; // 平滑着色 Toggle.AvRprefShadowToggle = TRUE; // 阴影 true Toggle.AvRprefFinishToggle = TRUE; Toggle.AvRprefMergeToggle = FALSE; Toggle.AvRprefSkipRdlgToggle = TRUE; // 跳过渲染对话框 Toggle.AvRprefCropwindowToggle = FALSE; // 修剪窗口 Toggle.flags= AvRprefSmooth | AvRprefShadow | AvRprefFinish | AvRprefMerge | AvRprefSkipRdlg | AvRprefCropwindow; pRpref.toggle = Toggle; pRpref.flags = AvRprefDestination | AvRprefRenderType | AvRprefToggle; if ((retval = av_rpref(&pRpref)) != AvRetNorm) { acutPrintf("\n error: %s", av_errorstr(retval)); return FALSE; } pRpref.mode = AvRprefRopt; pRpref.antiAlias = AvRprefAntiAliasMedium; pRpref.renderType = AvRprefRenderRaytrace; pRpref.flags = AvRprefRenderType | AvRprefAntiAlias; if ((retval = av_rpref(&pRpref)) != AvRetNorm) { acutPrintf("\n error: %s", av_errorstr(retval)); return FALSE; } //配置输出TGA文件参数 AvFileOptParam pTGAParam; pTGAParam.mode = AvFileOptTGA; pTGAParam.xRes = m_rectVP.Width(); pTGAParam.yRes = m_rectVP.Height(); pTGAParam.aspectRatio = 1.0; pTGAParam.colorMode = AvFileOptColorModeC32; pTGAParam.interlace = 1; pTGAParam.compression = TRUE; pTGAParam.bottomUp = FALSE; pTGAParam.flags = AvFileOptXRes | AvFileOptYRes | AvFileOptAspectRatio | AvFileOptColorMode | AvFileOptInterlace | AvFileOptCompression | AvFileOptBottomUp; if ((retval = av_rfileopt(&pTGAParam)) != AvRetNorm) { acutPrintf("\n error: %s", av_errorstr(retval)); return FALSE; } return TRUE; } //渲染(同CPathVideoDlg::Render()) BOOL CLineVideoDlg::Render() { if (!m_sTGAFile) return FALSE; if (!m_fileAvi.IsOK()) return FALSE; if (FindFile(m_sTGAFile)) { if (remove(m_sTGAFile) != 0) return FALSE; } //渲染 AvErrorCode retval; AvRenderParam pRenderParam; pRenderParam.mode = AvRender; //不要对话框 pRenderParam.fileName = m_sTGAFile; //文件名 pRenderParam.flags = AvRenderFilename; if ((retval = av_render(&pRenderParam)) != AvRetNorm) { acutPrintf("\n error: %s", av_errorstr(retval)); return FALSE; } return TRUE; } void CLineVideoDlg::OnDestroy() { if (FindFile(m_sTGAFile)) { remove(m_sTGAFile); } if (FindFile(m_sBMPFile)) { remove(m_sBMPFile); } if (m_bInit) { TDbCamera::ResetIdArray(); } CDialog::OnDestroy(); } UINT CLineVideoDlg::GetColorNum() { UINT nColorNum = 24; UpdateData(TRUE); switch(m_nColorNum) { case 0: nColorNum = 8; break; case 1: nColorNum = 16; break; case 2: nColorNum = 24; break; case 3: nColorNum = 32; break; default: break; } return nColorNum; } #endif/*ADS<17*/