// OpCreate3DSptDlg.cpp : implementation file // #include "stdafx.h" #include "geomative.h" #include "OpCreate3DSptDlg.h" #include "Medium3D.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COpCreate3DSptDlg dialog extern HHOOK hHook; extern int g_iUILanguage; extern LRESULT __stdcall CBTHookProc(long nCode, WPARAM wParam, LPARAM lParam); COpCreate3DSptDlg::COpCreate3DSptDlg(CScript3D* pNewScript, CLinkList* pMedLinkList, INT_PTR* pRet, CWnd* pParent /*=NULL*/) : CDialog(COpCreate3DSptDlg::IDD, pParent) { //{{AFX_DATA_INIT(COpCreate3DSptDlg) m_operator = _T(""); m_desc = _T(""); m_scriptName = _T(""); m_x1 = 0; m_x0 = 0; m_y1 = 0; m_y0 = 0; m_area = _T(""); m_c1x = 0; m_c1y = 0; m_c2x = 0; m_c2y = 0; m_pDisX = 0; m_pDisY = 0; m_pStepX = 0; m_pStepY = 0; m_ScriptNum = 0; m_DeDate = CTime::GetCurrentTime(); m_pStartX = 0.0f; m_pStartY = 0.0f; //}}AFX_DATA_INIT // m_pRet = pRet; m_pNewScript = pNewScript; // m_pOpCreateSptFrame = NULL; m_pMedLinkList = pMedLinkList; // m_pOpCreateSptView = NULL; // m_pOpCreateSptInfoView = NULL; // m_pOpCreateSptRecListView = NULL; } void COpCreate3DSptDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COpCreate3DSptDlg) DDX_Control(pDX, IDC_SPT_CHNUMBER, m_chnumber); DDX_Control(pDX, IDC_SPT_CHAMOUNT, m_chamount); DDX_Control(pDX, IDC_CHECK, m_diagonal); DDX_Control(pDX, IDC_SPT_AR, m_ar); DDX_Text(pDX, IDC_SPT_DEFINER, m_operator); DDX_Text(pDX, IDC_SPT_SCDESC, m_desc); DDX_Text(pDX, IDC_SPT_SNAME, m_scriptName); DDX_Text(pDX, IDC_XONE, m_x1); DDX_Text(pDX, IDC_XZERO, m_x0); DDX_Text(pDX, IDC_YONE, m_y1); DDX_Text(pDX, IDC_YZERO, m_y0); DDX_Text(pDX, IDC_SPT_AREA, m_area); DDX_Text(pDX, IDC_C1X, m_c1x); DDX_Text(pDX, IDC_C1Y, m_c1y); DDX_Text(pDX, IDC_C2X, m_c2x); DDX_Text(pDX, IDC_C2Y, m_c2y); DDX_Text(pDX, IDC_P_DIS_X, m_pDisX); DDX_Text(pDX, IDC_P_DIS_Y, m_pDisY); DDX_Text(pDX, IDC_P_STEP_X, m_pStepX); DDX_Text(pDX, IDC_P_STEP_Y, m_pStepY); DDX_Text(pDX, IDC_SCRIPT_NUM, m_ScriptNum); DDX_DateTimeCtrl(pDX, IDC_SPT_DATE, m_DeDate); DDX_Text(pDX, IDC_P_START_X, m_pStartX); DDX_Text(pDX, IDC_P_START_Y, m_pStartY); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COpCreate3DSptDlg, CDialog) //{{AFX_MSG_MAP(COpCreate3DSptDlg) ON_WM_SIZE() ON_BN_CLICKED(RET_OK, OnOk) ON_CBN_SELCHANGE(IDC_SPT_AR, OnSelchangeSptAr) ON_BN_CLICKED(IDC_OK, OnOk) ON_BN_CLICKED(IDC_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COpCreate3DSptDlg message handlers BOOL COpCreate3DSptDlg::Create(UINT nID, CWnd* pParentWnd) { // TODO: Add your specialized code here and/or call the base class pParentWnd->EnableWindow(FALSE); return CDialog::Create(IDD, pParentWnd); } BOOL Zoom_Window(HWND hWnd, CRect TaregetEX_Pos, LPRECT mOrgRect, BOOL bZoomEx_Only) { if(hWnd) { BOOL IsVisable = IsWindowVisible(hWnd); if(!bZoomEx_Only) { ::SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW); CRect SrcWndRect; if(mOrgRect) { SrcWndRect = mOrgRect; } else { GetWindowRect(hWnd,&SrcWndRect); } DWORD style = GetWindowLong(hWnd, GWL_STYLE); INT_PTR Board_dx = 0, Board_dy = 0; if( WS_CAPTION == (style & WS_CAPTION) ) { Board_dy += GetSystemMetrics(SM_CYCAPTION); } if( WS_DLGFRAME == (style & WS_DLGFRAME) ) { Board_dx += 2 * GetSystemMetrics(SM_CXBORDER); Board_dy += 2 * GetSystemMetrics(SM_CYBORDER); } else if( WS_BORDER == (style & WS_BORDER) ) { Board_dx += GetSystemMetrics(SM_CXBORDER); Board_dy += GetSystemMetrics(SM_CYBORDER); } else { } double dx = (double)(TaregetEX_Pos.Width() - Board_dx) / (double)(SrcWndRect.Width() - Board_dx); double dy = (double)(TaregetEX_Pos.Height() - Board_dy) / (double)(SrcWndRect.Height() - Board_dy); HWND hChild = ::GetWindow(hWnd, GW_CHILD); while(hChild != NULL) { CRect rect; GetWindowRect(hChild, &rect); CPoint pt_lt(rect.left, rect.top); ScreenToClient(hWnd, &pt_lt); MoveWindow(hChild, (INT)(pt_lt.x * dx), (INT)(pt_lt.y * dy), (INT)(rect.Width() * dx), (INT)(rect.Height() * dy), true); hChild = GetWindow(hChild, GW_HWNDNEXT); } } //MoveWindow(hWnd, TaregetEX_Pos.left, TaregetEX_Pos.top, TaregetEX_Pos.right, TaregetEX_Pos.bottom, true); UINT nFlage = SWP_NOZORDER|SWP_DRAWFRAME|SWP_DEFERERASE; if(IsVisable) nFlage |= SWP_SHOWWINDOW; ::SetWindowPos(hWnd, 0, TaregetEX_Pos.left, TaregetEX_Pos.top, TaregetEX_Pos.Width(), TaregetEX_Pos.Height(), nFlage); } return(false); } BOOL COpCreate3DSptDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //窗口自适应大小 // Zoom_Window(GetSafeHwnd(), CRect(0,0, GetSystemMetrics(SM_CXSCREEN)/1.3, GetSystemMetrics(SM_CYSCREEN)/1.3)); // CenterWindow();//使窗口居中 //初始化控件 m_ar.SetItemData(m_ar.AddString("Pole-Pole"), 22); m_ar.SetItemData(m_ar.AddString("Pole-Dipole"), 23); m_ar.SetItemData(m_ar.AddString("Dipole-Dipole"), 24); m_ar.SetItemData(m_ar.AddString("Schlumberger"), 25); m_ar.SetItemData(m_ar.AddString("WennerAlfa"), 26); m_ar.SetItemData(m_ar.AddString("WennerBeta"), 27); m_ar.SetItemData(m_ar.AddString("Gradient"), 28); m_chamount.AddString("1"); m_chamount.SetCurSel(0); m_chamount.EnableWindow(false); m_chnumber.AddString("1"); m_chnumber.SetCurSel(0); m_chnumber.EnableWindow(false); CChannel* pChannel = new CChannel; pChannel->m_iChNumber = (int)VAL_ONE; m_pNewScript->m_chaList.AddTail((void*)pChannel); this->GetDlgItem(IDC_SPT_SNAME)->SetFocus(); //禁用C1 C2编辑框 this->GetDlgItem(IDC_C1X)->EnableWindow(FALSE); this->GetDlgItem(IDC_C1Y)->EnableWindow(FALSE); this->GetDlgItem(IDC_C2X)->EnableWindow(FALSE); this->GetDlgItem(IDC_C2Y)->EnableWindow(FALSE); //初始化步长和电极间距 m_ScriptNum = m_pStepX = m_pStepY = m_pDisY = m_pDisX = 1; m_pStartX = m_pStartY = 0.0; UpdateData(FALSE); ((CEdit*)GetDlgItem(IDC_SPT_SNAME))->SetLimitText(20); return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COpCreate3DSptDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here } void COpCreate3DSptDlg::OnOk() { // TODO: Add your control notification handler code here UpdateData(TRUE); //检查界面的值是否有效 if (!CheckControlVaild()) return; CMedium3D *pMedium3D = NULL; CSptRecord* pSptRecord = NULL; DWORD dwMedHandle = (DWORD)VAL_ZERO; int iAR = (int)VAL_ZERO; //UpdateData(TRUE)会导致此处溢出,建议重新创建界面中的控件 POSITION pos = m_pNewScript->m_chaList.FindIndex(m_chnumber.GetCurSel()); CChannel* pChannel = (CChannel*)m_pNewScript->m_chaList.GetAt(pos); iAR = m_ar.GetItemData(m_ar.GetCurSel()); dwMedHandle = m_handleProcessor.GenerateHandle(iAR, PZ_STYLE_MED_DEF); pChannel->m_pMedium = m_pMedLinkList->Find(dwMedHandle); pMedium3D = (CMedium3D *)(pChannel->m_pMedium); int nSig = 0; memset(m_zone, 0, 8); nSig = zoneCount(m_area); //计算测点区域的数量 switch (nSig) { case 1: break; case -1://参数过长 hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // AfxMessageBox("your area parameter is too long, please check and reset the parameter"); memset(m_zone, 0, 8); break; case -2: hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); // AfxMessageBox("your area parameter is invaild, please check and reset the parameter"); memset(m_zone, 0, 8); break; } //初始化3d脚本对象 pMedium3D->create(); //检查是否勾选对角线选项 int nCheck = 0; nCheck = m_diagonal.GetCheck(); if (nCheck) //判断是否取45°对角线 pMedium3D->SetFlags(TRUE); //根据用户输入的置设置句型大小 pMedium3D->SetRect(m_x0, m_y0, m_x1, m_y1); //设置电极步长 pMedium3D->SetPoleStep(m_pStepX, m_pStepY); //设置电极间距 pMedium3D->SetPoleDistance(m_pDisX, m_pDisY); //设置需要生成的测点区域 pMedium3D->setZone(true, nSig, m_zone); //m_zone[0]保存了长度 //中梯装置需要输入C1, C2信息 if (iAR == 28) { //设置中梯装置的c1,c2 pMedium3D->SetPointCPosition("C1",m_c1x, m_c1y); pMedium3D->SetPointCPosition("C2",m_c2x, m_c2y); } //执行脚本生成 if (!pMedium3D->generate()) { // AfxMessageBox("error"); return; } //3d脚本不再使用该字段记录测点总数 m_pNewScript->m_iEAmount = pMedium3D->getPoleCount(); pChannel->ClearSptRecList(); pMedium3D->GenerateSptRecElecVal3D(m_ScriptNum, m_pNewScript, &(pChannel->m_iPtAmount), &(pChannel->m_sptRecArray)); pMedium3D->Destroy(); CDialog::OnOK(); } void COpCreate3DSptDlg::OnCancel() { // TODO: Add your control notification handler code here CDialog::OnCancel(); } bool COpCreate3DSptDlg::CheckControlVaild() { CString szCaption; //判断是否输入脚本名字 if (m_scriptName.GetLength() == 0) { szCaption.Empty(); szCaption.LoadString(IDS_OP_LC_SCON_INPUT_SNAME); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBox(szCaption, NULL, MB_ICONWARNING); this->GetDlgItem(IDC_SPT_SNAME)->SetFocus(); return FALSE; } //判断是否选择装置类型 if ((int)VAL_MINUS_ONE == m_ar.GetCurSel()) { szCaption.Empty(); szCaption.LoadString(IDS_OP_LC_SCON_SEL_AR); hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBox(szCaption, NULL, MB_ICONWARNING); this->GetDlgItem(IDC_SPT_AR)->SetFocus(); return FALSE; } //检查X0,Y0,X1,Y1是否有效,若两点重合则无效 if (m_x0 == m_x1 && m_y0 == m_y1) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请设置一个有效的矩形")); else MessageBoxEx(NULL, _T("Please set a vaild rect"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } if (m_x1 > 30 || m_y1 > 30) { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); MessageBox("The cable num should less than 30", NULL, MB_ICONWARNING); return FALSE; } //如果是中梯装置则检验C1,C2的值是否有效 CString szItem = _T(""); m_ar.GetLBText(m_ar.GetCurSel(),szItem); if (szItem == "Gradient") { //C1、C2不能重合 if (m_c1x == m_c2x && m_c1y == m_c2y) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("C1不能等于C2!")); else MessageBoxEx(NULL, _T("C1 can not equal to C2"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } //C1,C2不能落在矩形范围之内 if (m_c1x > m_x0 && m_c1x < m_x1 && m_c1y > m_y0 && m_c1y < m_y1) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("C1不能处于矩阵范围内!")); else MessageBoxEx(NULL, _T("C1 can not surround by rect"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } else if(m_c2x > m_x0 && m_c2x < m_x1 && m_c2y > m_y0 && m_c2y < m_y1) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("C2不能处于矩阵范围内!")); else MessageBoxEx(NULL, _T("C2 can not surround by rect"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } } //判断电极间距是否有效(间距不能为0) if (m_pDisX < 0 || m_pDisY < 0) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("电极间距无效")); else MessageBoxEx(NULL, _T("Pole distance invalid"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } //步长也不能为0 if (m_pStepX < 0 || m_pStepY < 0) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("电极步长无效")); else MessageBoxEx(NULL, _T("Pole step invalid"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return FALSE; } // //检查脚本分割数量是否超过最大值 // int maxCount = 0;//脚本最大分割数量 // CString szTmp = _T(""); // // maxCount = m_y1 - m_y0 + 1; // // if (m_ScriptNum > maxCount || m_ScriptNum < 1) // { // szTmp.Format("script splitted can not more than %d", maxCount); // AfxMessageBox(szTmp); // return FALSE; // } //将电极间距、步长、矩形坐标,格式化成指定的格式 m_PoleDistance.Format("%.1f,%.1f", m_pDisX, m_pDisY); m_PoleStep.Format("%d,%d", m_pStepX, m_pStepY); m_Rect.Format("%d,%d,%d,%d",m_x0,m_y0,m_x1,m_y1); m_PoleStart.Format("%.1f,%.1f", m_pStartX, m_pStartY); return TRUE; } int COpCreate3DSptDlg::zoneCount(CString f_szZone) { //TRUE:执行成功 -1:数据过长 -2:数据无效 CString szTmp; int nLength; int zoneNum = 0; nLength = f_szZone.GetLength(); if (nLength > 15) { return -1; } int nData; for (int i = 0; i < (nLength + 1)/2; i++) { szTmp = f_szZone.Left(f_szZone.GetLength() - (f_szZone.GetLength() - 1)); m_zone[i] = atoi(szTmp.GetBuffer(0)); if (m_zone[i] < 0 || m_zone[i] > 7) { return -2; } zoneNum++; f_szZone = f_szZone.Right(f_szZone.GetLength() - 2); } // m_zone[0] = zoneNum; return zoneNum; } void COpCreate3DSptDlg::OnSelchangeSptAr() { // TODO: Add your control notification handler code here //Gradient CString szItem = _T(""); m_ar.GetLBText(m_ar.GetCurSel(),szItem); if (szItem == "Gradient") { this->GetDlgItem(IDC_C1X)->EnableWindow(TRUE); this->GetDlgItem(IDC_C1Y)->EnableWindow(TRUE); this->GetDlgItem(IDC_C2X)->EnableWindow(TRUE); this->GetDlgItem(IDC_C2Y)->EnableWindow(TRUE); } else { this->GetDlgItem(IDC_C1X)->EnableWindow(FALSE); this->GetDlgItem(IDC_C1Y)->EnableWindow(FALSE); this->GetDlgItem(IDC_C2X)->EnableWindow(FALSE); this->GetDlgItem(IDC_C2Y)->EnableWindow(FALSE); } } void COpCreate3DSptDlg::_save_scr(int q, _scriptor *scr) { struct _rect rect = { 1, 1, 3, 3 }; struct _rect *r; struct _point *node, *head = NULL; int length; FILE *fd = NULL; char *buf = NULL; if (!scr) return; head = scr_get_points(scr); if (!head) goto __exit; buf = (char *)malloc(512 * sizeof(char)); if (!buf) { printf("buffer alloc failed!\n"); goto __exit; } else { r = scr_get_rect(scr); _snprintf(buf, 512, "red/%s(%d,%d,%d,%d)%d.scr", scr_get_name(scr), r->x0, r->y0, r->x1, r->y1,q); fd = fopen(buf, "wb+"); } if (fd < 0) { printf("open \"%s\" for write failed!\n", scr_get_name(scr)); goto __exit; } else { time_t now; struct tm *ptm; time(&now); ptm = localtime(&now); //取得当地时间 r = scr_get_rect(scr); length = _snprintf(buf, 512, "\r\n"); fwrite(buf, 1, length,fd); length = _snprintf(buf, 512, "\r\n"); fwrite(buf, 1, length,fd); __exit: if (fd) fclose(fd); if (buf) free(buf); return; } BOOL COpCreate3DSptDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) { return TRUE; } if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) { return TRUE; } return CDialog::PreTranslateMessage(pMsg); } int COpCreate3DSptDlg::PostionToStepPostion(int f_originalPostion) { UpdateData(TRUE); int sum = 0; //-1表示这个点在无穷远范围,不做处理 if (f_originalPostion == -1) { return f_originalPostion; } //计算行号 int nLineth = 0;//记录第几行 nLineth = f_originalPostion / (m_y1 - m_y0 + 1); //记录余数,判断是否是新起一行 int remainder = 0; remainder = f_originalPostion % (m_y1 - m_y0 + 1); if (remainder == 0) { nLineth -= 1; } sum = f_originalPostion + (m_pStepX - 1) * (f_originalPostion - 1) + (m_pStepY - m_pStepX) * nLineth; return sum; } CString COpCreate3DSptDlg::GetPoleStep() { return m_PoleStep; } CString COpCreate3DSptDlg::GetRect() { return m_Rect; } CString COpCreate3DSptDlg::GetPoleDistance() { return m_PoleDistance; } CString COpCreate3DSptDlg::GetPoleStart() { return m_PoleStart; }