// pagetarget.cpp : implementation file // #include "stdafx.h" #include "acp_base.h" #include "camresrc.h" #include "pagetarget.hpp" #include "caminter.hpp" #include "camera.hpp" #define M_GetDLL(Camera) ((Camera_Interface*)((Camera)->GetEditor())) ///////////////////////////////////////////////////////////////////////////// // PageTarget property page //IMPLEMENT_DYNCREATE(PageTarget, CDialog) PageTarget::PageTarget(Camera *p_oCamera) : PageBase(PageTarget::IDD) { //{{AFX_DATA_INIT(PageTarget) m_csPointX = _T(""); m_csPointY = _T(""); m_csPointZ = _T(""); m_csSuperObjectX = _T(""); m_csSuperObjectY = _T(""); m_csSuperObjectZ = _T(""); m_iTargetType = -1; m_iPointCoords = -1; m_csComboEdit = _T(""); //}}AFX_DATA_INIT m_p_oCamera = p_oCamera; m_lIDofCurrentEdit = NULL; } PageTarget::~PageTarget() { } void PageTarget::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(PageTarget) DDX_Control(pDX, IDC_COMBOSO, m_oComboSO); DDX_Text(pDX, IDC_EDIT_POINTX, m_csPointX); DDX_Text(pDX, IDC_EDIT_POINTY, m_csPointY); DDX_Text(pDX, IDC_EDIT_POINTZ, m_csPointZ); DDX_Text(pDX, IDC_EDIT_SOX, m_csSuperObjectX); DDX_Text(pDX, IDC_EDIT_SOY, m_csSuperObjectY); DDX_Text(pDX, IDC_EDIT_SOZ, m_csSuperObjectZ); DDX_Radio(pDX, IDC_RB_TARGPOINT, m_iTargetType); DDX_Radio(pDX, IDC_RB_WORLDCOORDS, m_iPointCoords); DDX_CBString(pDX, IDC_COMBOSO, m_csComboEdit); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(PageTarget, CDialog) //{{AFX_MSG_MAP(PageTarget) ON_BN_CLICKED(IDC_BT_COPYTOPOINT, OnBtCopytopoint) ON_BN_CLICKED(IDC_BT_RETURN, OnBtReturn) ON_EN_KILLFOCUS(IDC_EDIT_POINTX, OnKillfocusEditPointx) ON_EN_SETFOCUS(IDC_EDIT_POINTX, OnSetfocusEditPointx) ON_EN_KILLFOCUS(IDC_EDIT_POINTY, OnKillfocusEditPointy) ON_EN_SETFOCUS(IDC_EDIT_POINTY, OnSetfocusEditPointy) ON_EN_KILLFOCUS(IDC_EDIT_POINTZ, OnKillfocusEditPointz) ON_EN_SETFOCUS(IDC_EDIT_POINTZ, OnSetfocusEditPointz) ON_BN_CLICKED(IDC_RB_CAMERACOORDS, OnRbPointCoords) ON_CBN_SELCHANGE(IDC_COMBOSO, OnSelChangeComboSO) ON_CBN_EDITCHANGE(IDC_COMBOSO, OnEditChangeComboSO) ON_CBN_SETFOCUS(IDC_COMBOSO, OnSetfocusComboso) ON_CBN_KILLFOCUS(IDC_COMBOSO, OnKillfocusComboso) ON_BN_CLICKED(IDC_RB_WORLDCOORDS, OnRbPointCoords) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** BOOL PageTarget::OnInitDialog() { MTH3D_tdstVector stPoint; CPA_List *p_oListOfSO; POSITION stPos; CPA_SuperObject *p_oSO; long lIndex; CDialog::OnInitDialog(); // update the current target type member switch (m_p_oCamera->GetTargetType()) { case tNone : m_iTargetType = 2; break; case tSuperObject : m_iTargetType = 1; break; case tPoint : m_iTargetType = 0; break; default: m_iTargetType = -1; break; } // init the point coordinates to world coordinates m_iPointCoords = 0; // init the point coordinates m_p_oCamera->GetTargetPoint(stPoint); m_csPointX.Format("%.3f",MTH3D_M_xGetXofVector(&stPoint)); m_csPointY.Format("%.3f",MTH3D_M_xGetYofVector(&stPoint)); m_csPointZ.Format("%.3f",MTH3D_M_xGetZofVector(&stPoint)); // add the 'none' entry to the combo lIndex = m_oComboSO.AddString("none"); m_oComboSO.SetItemData(lIndex,NULL); // init the SuperObject combobox entries // get the list of available superobjects for this world p_oListOfSO = (M_GetDLL(m_p_oCamera))->M_GetListAllObjects(); stPos = p_oListOfSO->GetHeadPosition(); while(stPos) { p_oSO = p_oListOfSO->GetNext(stPos); if (p_oSO->GetObject() != m_p_oCamera && p_oSO->GetObject() != NULL) { lIndex = m_oComboSO.AddString(p_oSO->GetObject()->GetName()); m_oComboSO.SetItemData(lIndex,(DWORD)p_oSO); } } // select the current target in the combo p_oSO = m_p_oCamera->GetTargetSuperObject(); if (p_oSO == NULL) { m_oComboSO.SelectString(-1,"none"); m_csComboEdit = "none"; } else if (m_oComboSO.SelectString(-1,p_oSO->GetObject()->GetName()) != CB_ERR) m_csComboEdit = p_oSO->GetObject()->GetName(); else { m_oComboSO.SetCurSel(-1); m_csComboEdit = ""; } // update the SO coordinates if (m_oComboSO.GetCurSel() != -1 && p_oSO != NULL) { GEO_tdxHandleToMatrix hMatrix; hMatrix = HIE_fn_hGetSuperObjectMatrix(p_oSO->GetStruct()); POS_fn_vGetTranslationVector(hMatrix,&stPoint); m_csSuperObjectX.Format("%.3f",MTH3D_M_xGetXofVector(&stPoint)); m_csSuperObjectY.Format("%.3f",MTH3D_M_xGetYofVector(&stPoint)); m_csSuperObjectZ.Format("%.3f",MTH3D_M_xGetZofVector(&stPoint)); } else { m_csSuperObjectX = "---"; m_csSuperObjectY = "---"; m_csSuperObjectZ = "---"; GetDlgItem(IDC_RB_TARGSO)->EnableWindow(FALSE); GetDlgItem(IDC_BT_COPYTOPOINT)->EnableWindow(FALSE); } UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// // PageTarget message handlers //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnBtCopytopoint() { UpdateData(TRUE); m_iPointCoords = 0; m_csPointX = m_csSuperObjectX; m_csPointY = m_csSuperObjectY; m_csPointZ = m_csSuperObjectZ; UpdateData(FALSE); } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnBtReturn() { // if an edit had the focus, put the focus on the hidden button // to be sure to call the killfocus function for the dialog if (m_lIDofCurrentEdit != NULL) { GetDlgItem(IDC_BT_RETURN)->SetFocus(); return; } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnKillfocusEditPointx() { CString csOldValue; // translate old value into float and save it csOldValue = m_csPointX; // get the new text value UpdateData(TRUE); // check validity of text if ( ((float) atof(m_csPointX) == 0.0) && (m_csPointX[0] != '0') ) { // value is not good, put back the old one m_csPointX = csOldValue; UpdateData(FALSE); // and give back the focus to the window GetDlgItem(IDC_EDIT_POINTX)->SetFocus(); } else { // update drawing UpdateData(FALSE); m_lIDofCurrentEdit = NULL; } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnSetfocusEditPointx() { m_lIDofCurrentEdit = IDC_EDIT_POINTX; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnKillfocusEditPointy() { CString csOldValue; // translate old value into float and save it csOldValue = m_csPointY; // get the new text value UpdateData(TRUE); // check validity of text if ( ((float) atof(m_csPointY) == 0.0) && (m_csPointY[0] != '0') ) { // value is not good, put back the old one m_csPointY = csOldValue; UpdateData(FALSE); // and give back the focus to the window GetDlgItem(IDC_EDIT_POINTY)->SetFocus(); } else { // update drawing UpdateData(FALSE); m_lIDofCurrentEdit = NULL; } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnSetfocusEditPointy() { m_lIDofCurrentEdit = IDC_EDIT_POINTY; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnKillfocusEditPointz() { CString csOldValue; // translate old value into float and save it csOldValue = m_csPointZ; // get the new text value UpdateData(TRUE); // check validity of text if ( ((float) atof(m_csPointZ) == 0.0) && (m_csPointZ[0] != '0') ) { // value is not good, put back the old one m_csPointZ = csOldValue; UpdateData(FALSE); // and give back the focus to the window GetDlgItem(IDC_EDIT_POINTZ)->SetFocus(); } else { // update drawing UpdateData(FALSE); m_lIDofCurrentEdit = NULL; } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnSetfocusEditPointz() { m_lIDofCurrentEdit = IDC_EDIT_POINTZ; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnRbPointCoords() { long lLastValue; MTH3D_tdstVector stPoint; float fX,fY,fZ; // get last value lLastValue = m_iPointCoords; // get new values UpdateData(TRUE); if (m_iPointCoords == lLastValue) return; // coords type changed -> translate fX = (float) atof(m_csPointX); fY = (float) atof(m_csPointY); fZ = (float) atof(m_csPointZ); MTH3D_M_vSetVectorElements(&stPoint,fX,fY,fZ); if (m_iPointCoords == 0) m_p_oCamera->CameraToWorldCoordinates_Point(stPoint); else m_p_oCamera->WorldToCameraCoordinates_Point(stPoint); MTH3D_M_vGetVectorElements(&fX,&fY,&fZ,&stPoint); m_csPointX.Format("%.3f",fX); m_csPointY.Format("%.3f",fY); m_csPointZ.Format("%.3f",fZ); UpdateData(FALSE); // TODO: Add your control notification handler code here } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnSelChangeComboSO() { long lIndex; CPA_SuperObject *p_oSO; UpdateData(TRUE); // get the new selected element; lIndex = m_oComboSO.GetCurSel(); if (lIndex != -1) { p_oSO = (CPA_SuperObject*) m_oComboSO.GetItemData(lIndex); m_csComboEdit = p_oSO->GetObject()->GetName(); } else { m_csComboEdit = ""; } CheckComboSO(); CheckTargetType(); UpdateData(FALSE); } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnEditChangeComboSO() { long lIndex,lIndex2; lIndex = CB_ERR; lIndex2 = CB_ERR; // get the current combo text // UpdateData(TRUE); // look for the index of the string /* lIndex = m_oComboSO.FindString(-1,(char*)(LPCTSTR)m_csComboEdit); // look if there are more than one match if (lIndex != CB_ERR) { lIndex2 = m_oComboSO.FindString(lIndex,(char*)(LPCTSTR)m_csComboEdit); // open the combo droplist if (m_oComboSO.GetDroppedState() == FALSE) { // drop down, put back the original text, and put entry point at the end m_oComboSO.ShowDropDown(TRUE); m_oComboSO.SetWindowText(m_csComboEdit); m_oComboSO.SetEditSel(m_csComboEdit.GetLength(),m_csComboEdit.GetLength()); } // if there's only one match, select it if (lIndex2 == CB_ERR || lIndex2 == lIndex) m_oComboSO.SetCurSel(lIndex); else // else, just show the selected string m_oComboSO.SetTopIndex(lIndex); } */} //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnSetfocusComboso() { m_lIDofCurrentEdit = IDC_COMBOSO; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnKillfocusComboso() { UpdateData(TRUE); CheckComboSO(); CheckTargetType(); UpdateData(FALSE); } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::MakeChangesAvailable() { float fX,fY,fZ; long lIndex; UpdateData(TRUE); // Target Point coords fX = (float) atof(m_csPointX); fY = (float) atof(m_csPointY); fZ = (float) atof(m_csPointZ); m_oTargetPoint.SetXYZ(fX,fY,fZ); if (m_iPointCoords == 1) // camera coordinates m_oTargetPoint.SetAxisSystem(CameraCoordinates); else m_oTargetPoint.SetAxisSystem(WorldCoordinates); // Target SuperObject lIndex = m_oComboSO.FindStringExact(-1,(char*)(LPCTSTR)m_csComboEdit); if (lIndex != -1) m_p_oTargetSuperObject = (CPA_SuperObject*) m_oComboSO.GetItemData(lIndex); else m_p_oTargetSuperObject = NULL; // Target Type switch(m_iTargetType) { case 2: m_eTargetType = tNone; break; case 1: m_eTargetType = tSuperObject; break; case 0: m_eTargetType = tPoint; break; default: ASSERT(0); } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** BOOL PageTarget::IsPageValid() { BOOL bResult; bResult = TRUE; UpdateData(TRUE); bResult = CheckComboSO(); bResult &= CheckTargetType(); UpdateData(FALSE); return bResult; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::DoUpdate() { m_p_oCamera->SetTargetType(tNone); m_p_oCamera->SetTargetSuperObject(m_p_oTargetSuperObject); m_p_oCamera->SetTargetPoint(&m_oTargetPoint); m_p_oCamera->SetTargetType(m_eTargetType); } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** void PageTarget::OnLButtonDown(UINT nFlags, CPoint point) { // if an edit had the focus, put the focus on the hidden button // to be sure to call the killfocus function for the dialog if (m_lIDofCurrentEdit != NULL) { GetDlgItem(IDC_BT_RETURN)->SetFocus(); return; } else { CDialog::OnLButtonDown(nFlags, point); } } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** // check if combo SO is valid. If not, set to "none" and return FALSE BOOL PageTarget::CheckComboSO() { long lIndex; CPA_SuperObject *p_oSO; BOOL bResult; p_oSO = NULL; // get the new selected element; lIndex = m_oComboSO.FindStringExact(-1,(char*)(LPCTSTR)m_csComboEdit); if (lIndex != -1) p_oSO = (CPA_SuperObject*) m_oComboSO.GetItemData(lIndex); // check if the superobject is good if (p_oSO == NULL) { // not good! // disable copy to point GetDlgItem(IDC_BT_COPYTOPOINT)->EnableWindow(FALSE); // erase coords m_csSuperObjectX = "---"; m_csSuperObjectY = "---"; m_csSuperObjectZ = "---"; // set name to none m_csComboEdit = "none"; // if target was not valid, result = FALSE bResult = (lIndex != -1); } else { GEO_tdxHandleToMatrix hMatrix; MTH3D_tdstVector stPoint; //enable target SO and copy to point GetDlgItem(IDC_RB_TARGSO)->EnableWindow(TRUE); GetDlgItem(IDC_BT_COPYTOPOINT)->EnableWindow(TRUE); // update coords hMatrix = HIE_fn_hGetSuperObjectMatrix(p_oSO->GetStruct()); POS_fn_vGetTranslationVector(hMatrix,&stPoint); m_csSuperObjectX.Format("%.3f",MTH3D_M_xGetXofVector(&stPoint)); m_csSuperObjectY.Format("%.3f",MTH3D_M_xGetYofVector(&stPoint)); m_csSuperObjectZ.Format("%.3f",MTH3D_M_xGetZofVector(&stPoint)); // set new name in combo m_csComboEdit = p_oSO->GetObject()->GetName(); bResult = TRUE; } return bResult; } //******************************************************************************************************** //******************************************************************************************************** //******************************************************************************************************** // check if target type is valid. if not, set to not valid and return FALSE BOOL PageTarget::CheckTargetType() { long lIndex; CPA_SuperObject *p_oSO; BOOL bResult; bResult = TRUE; // find the combo selection p_oSO = NULL; lIndex = m_oComboSO.FindStringExact(-1,(char*)(LPCTSTR)m_csComboEdit); if (lIndex != -1) // selection valid p_oSO = (CPA_SuperObject*) m_oComboSO.GetItemData(lIndex); // check target type switch(m_iTargetType) { case 2: // tNone --> ok case 0: // tPoint --> ok bResult = TRUE; break; case 1: // tSuperObject // if SO not valid, set target type to tNone and return FALSE if (p_oSO == NULL) { m_iTargetType = 2; bResult = FALSE; } break; default: ASSERT(0); } // if target SO not valid, disable Target SO, else, enable if (p_oSO == NULL) GetDlgItem(IDC_RB_TARGSO)->EnableWindow(FALSE); else GetDlgItem(IDC_RB_TARGSO)->EnableWindow(TRUE); return bResult; }