// MCEMoveFragment.cpp : implementation file
//
#include "stdafx.h"
#include "MCE.h"
#include "MCEMoveFragment.h"
#include "afxdialogex.h"
// MCEMoveFragment dialog
MCEMoveFragment::MCEMoveFragment(CWnd* pParent /*=NULL*/)
: CDialog(MCEMoveFragment::IDD, pParent)
{
m_pMCEView = NULL;
MyInit();
}
MCEMoveFragment::MCEMoveFragment(CView *pView) // modelles constructor
{
m_pMCEView = pView;
MyInit();
}
void MCEMoveFragment::MyInit()
{
m_translate[0] = 0;
m_translate[1] = 0;
m_translate[2] = 0;
m_rotate[0][0] = 1;
m_rotate[0][1] = 0;
m_rotate[0][2] = 0;
m_rotate[1][0] = 0;
m_rotate[1][1] = 1;
m_rotate[1][2] = 0;
m_rotate[2][0] = 0;
m_rotate[2][1] = 0;
m_rotate[2][2] = 1;
m_selected_rotating_group = 1;
m_trans_step = 0.1;
m_rot_step = 10;
m_rot_bond_step = 10;
m_use_mouse = true;
m_use_central_atom = false;
m_rotate_around_bond = false;
m_rot_bond_axis[0] = 1;
m_rot_bond_axis[1] = 0;
m_rot_bond_axis[2] = 0;
m_rot_bond_quaternion[0] = 1;
m_rot_bond_quaternion[1] = 0;
m_rot_bond_quaternion[2] = 0;
m_rot_bond_quaternion[3] = 0;
}
void MCEMoveFragment::ResetTranslation()
{
m_translate[0] = 0;
m_translate[1] = 0;
m_translate[2] = 0;
}
void MCEMoveFragment::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STEP_T, m_trans_step);
DDX_Text(pDX, IDC_STEP_R, m_rot_step);
DDX_Check(pDX, IDC_ROTATE_BY_MOUSE, m_use_mouse);
DDX_Check(pDX, IDC_CHOOSE_CENTRAL_ATOM, m_use_central_atom);
DDX_Check(pDX, IDC_CHECK_APPLY_SYMM, m_apply_symmetry);
DDX_Check(pDX, IDC_CHECK_MOVE_RIGHT_CLICK, m_move_fragment_to_mouse_click);
DDX_Check(pDX, IDC_CHECK_ROTATE_AROUND_BOND, m_rotate_around_bond);
DDX_Text(pDX, IDC_EDIT_STEP_BOND_ROTATE, m_rot_bond_step);
}
BOOL MCEMoveFragment::Create()
{
return CDialog::Create(MCEMoveFragment::IDD);
}
BEGIN_MESSAGE_MAP(MCEMoveFragment, CDialog)
ON_BN_CLICKED(IDC_BUTTON_XL, &MCEMoveFragment::OnBnClickedButtonXl)
ON_BN_CLICKED(IDC_BUTTON_XR, &MCEMoveFragment::OnBnClickedButtonXr)
ON_BN_CLICKED(IDC_BUTTON_YL, &MCEMoveFragment::OnBnClickedButtonYl)
ON_BN_CLICKED(IDC_BUTTON_YR, &MCEMoveFragment::OnBnClickedButtonYr)
ON_BN_CLICKED(IDC_BUTTON_ZL, &MCEMoveFragment::OnBnClickedButtonZl)
ON_BN_CLICKED(IDC_BUTTON_ZR, &MCEMoveFragment::OnBnClickedButtonZr)
ON_BN_CLICKED(IDOK, &MCEMoveFragment::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON_YMINUS, &MCEMoveFragment::OnBnClickedButtonYminus)
ON_BN_CLICKED(IDC_BUTTON_YPLUS, &MCEMoveFragment::OnBnClickedButtonYplus)
ON_BN_CLICKED(IDC_BUTTON_ZMINUS, &MCEMoveFragment::OnBnClickedButtonZminus)
ON_BN_CLICKED(IDC_BUTTON_ZPLUS, &MCEMoveFragment::OnBnClickedButtonZplus)
ON_BN_CLICKED(IDC_BUTTON_XMINUS, &MCEMoveFragment::OnBnClickedButtonXminus)
ON_BN_CLICKED(IDC_BUTTON_XPLUS, &MCEMoveFragment::OnBnClickedButtonXplus)
ON_BN_CLICKED(IDC_ROTATE_BY_MOUSE, &MCEMoveFragment::OnBnClickedRotateByMouse)
ON_BN_CLICKED(IDC_CHOOSE_CENTRAL_ATOM, &MCEMoveFragment::OnBnClickedChooseCentralAtom)
ON_BN_CLICKED(IDC_BUTTON1, &MCEMoveFragment::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &MCEMoveFragment::OnBnClickedButton2)
//ON_BN_CLICKED(IDCANCEL, &MCEMoveFragment::OnBnClickedCancel)
ON_BN_CLICKED(IDC_CHECK_APPLY_SYMM, &MCEMoveFragment::OnBnClickedCheckApplySymm)
ON_BN_CLICKED(IDC_CHECK_MOVE_RIGHT_CLICK, &MCEMoveFragment::OnBnClickedCheckMoveRightClick)
ON_BN_CLICKED(IDCANCEL, &MCEMoveFragment::OnBnClickedCancel)
ON_BN_CLICKED(IDC_CHECK_ROTATE_AROUND_BOND, &MCEMoveFragment::OnBnClickedCheckRotateAroundBond)
ON_BN_CLICKED(IDC_BUTTON_UPDATE_SELECTION_BOND, &MCEMoveFragment::OnBnClickedButton3)
ON_MESSAGE(WM_GET_REFRESH_GROUP, &MCEMoveFragment::OnUpdateRotatingGroups)
ON_BN_CLICKED(IDC_BUTTON_ROT_BOND_LEFT, &MCEMoveFragment::OnBnClickedButtonRotBondLeft)
ON_BN_CLICKED(IDC_BUTTON_ROT_BOND_RIGHT, &MCEMoveFragment::OnBnClickedButtonRotBondRight)
END_MESSAGE_MAP()
BOOL MCEMoveFragment::OnInitDialog()
{
CDialog::OnInitDialog();
//m_rotation_bond = NULL;
//MyInit();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void MCEMoveFragment::OnCancel()
{
// TODO: Add extra cleanup here
if (m_pMCEView != NULL) {
// modeless case -- do not call base class OnCancel
m_pMCEView->PostMessage(WM_EXIT_MOVE_FRAGMENT, IDCANCEL);
}
else {
CDialog::OnCancel(); // modal case
}
}
void MCEMoveFragment::ApplyGraphicChanges()
{
if (m_pMCEView != NULL) {
// modeless case -- do not call base class OnOK
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonXminus()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_translate[0] -= m_trans_step;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonXplus()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_translate[0] += m_trans_step;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonYminus()
{
// AfxMessageBox("Yminus");
if (m_pMCEView != NULL) {
UpdateData(TRUE);
// AfxMessageBox("Yminus 1");
m_translate[1] -= m_trans_step;
// AfxMessageBox("Yminus 2");
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonYplus()
{
//AfxMessageBox("Yplus");
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_translate[1] += m_trans_step;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonZminus()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_translate[2] -= m_trans_step;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonZplus()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_translate[2] += m_trans_step;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonXl()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (0-m_rot_step) * 3.141593/180;
m_rotate[0][0] = 1;
m_rotate[0][1] = 0;
m_rotate[0][2] = 0;
m_rotate[1][0] = 0;
m_rotate[1][1] = cos(alpha);
m_rotate[1][2] = -1*sin(alpha);
m_rotate[2][0] = 0;
m_rotate[2][1] = sin(alpha);
m_rotate[2][2] = cos(alpha);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonXr()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (m_rot_step) * 3.141593/180;
m_rotate[0][0] = 1;
m_rotate[0][1] = 0;
m_rotate[0][2] = 0;
m_rotate[1][0] = 0;
m_rotate[1][1] = cos(alpha);
m_rotate[1][2] = -1*sin(alpha);
m_rotate[2][0] = 0;
m_rotate[2][1] = sin(alpha);
m_rotate[2][2] = cos(alpha);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonYl()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (0-m_rot_step) * 3.141593/180;
m_rotate[0][0] = cos(alpha);
m_rotate[0][1] = 0;
m_rotate[0][2] = sin(alpha);
m_rotate[1][0] = 0;
m_rotate[1][1] = 1;
m_rotate[1][2] = 0;
m_rotate[2][0] = -1*sin(alpha);
m_rotate[2][1] = 0;
m_rotate[2][2] = cos(alpha);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonYr()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (m_rot_step) * 3.141593/180;
m_rotate[0][0] = cos(alpha);
m_rotate[0][1] = 0;
m_rotate[0][2] = sin(alpha);
m_rotate[1][0] = 0;
m_rotate[1][1] = 1;
m_rotate[1][2] = 0;
m_rotate[2][0] = -1*sin(alpha);
m_rotate[2][1] = 0;
m_rotate[2][2] = cos(alpha);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonZl()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (0-m_rot_step) * 3.141593/180;
m_rotate[0][0] = cos(alpha);
m_rotate[0][1] = -1*sin(alpha);
m_rotate[0][2] = 0;
m_rotate[1][0] = sin(alpha);
m_rotate[1][1] = cos(alpha);
m_rotate[1][2] = 0;
m_rotate[2][0] = 0;
m_rotate[2][1] = 0;
m_rotate[2][2] = 1;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonZr()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
float alpha = (m_rot_step) * 3.141593/180;
m_rotate[0][0] = cos(alpha);
m_rotate[0][1] = -1*sin(alpha);
m_rotate[0][2] = 0;
m_rotate[1][0] = sin(alpha);
m_rotate[1][1] = cos(alpha);
m_rotate[1][2] = 0;
m_rotate[2][0] = 0;
m_rotate[2][1] = 0;
m_rotate[2][2] = 1;
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
if (m_pMCEView != NULL) {
// modeless case -- do not call base class OnOK
m_pMCEView->PostMessage(WM_EXIT_MOVE_FRAGMENT, IDOK);
}
else {
CDialog::OnOK(); // modal case
}
}
void MCEMoveFragment::OnBnClickedMoveByKeys()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedRotateByMouse()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedChooseCentralAtom()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButton1()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButton2()
{//Update selection button
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedCheckApplySymm()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedCheckMoveRightClick()
{
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
void MCEMoveFragment::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
if (m_pMCEView != NULL) {
// modeless case -- do not call base class OnOK
m_pMCEView->PostMessage(WM_EXIT_MOVE_FRAGMENT, IDCANCEL);
}
else {
CDialog::OnCancel(); // modal case
}
}
void MCEMoveFragment::OnBnClickedCheckRotateAroundBond()
{
UpdateData(TRUE);
if(m_rotate_around_bond) {
CButton *m_ctlCheck = (CButton*) GetDlgItem(IDC_ROTATE_BY_MOUSE);
m_ctlCheck->SetCheck(BST_UNCHECKED);
GetDlgItem(IDC_ROTATE_BY_MOUSE)->EnableWindow(false);
m_ctlCheck = (CButton*) GetDlgItem(IDC_CHECK_MOVE_RIGHT_CLICK);
m_ctlCheck->SetCheck(BST_UNCHECKED);
GetDlgItem(IDC_CHECK_MOVE_RIGHT_CLICK)->EnableWindow(false);
GetDlgItem(IDC_CHOOSE_CENTRAL_ATOM)->EnableWindow(false);
GetDlgItem(IDC_CHECK_APPLY_SYMM)->EnableWindow(false);
GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
GetDlgItem(IDC_COMBO_ROTATION_GROUPS)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_UPDATE_SELECTION_BOND)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_ROT_BOND_LEFT)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_ROT_BOND_RIGHT)->EnableWindow(true);
OnBnClickedButton3();
} else {
GetDlgItem(IDC_ROTATE_BY_MOUSE)->EnableWindow(true);
GetDlgItem(IDC_CHECK_MOVE_RIGHT_CLICK)->EnableWindow(true);
GetDlgItem(IDC_CHOOSE_CENTRAL_ATOM)->EnableWindow(true);
GetDlgItem(IDC_CHECK_APPLY_SYMM)->EnableWindow(true);
GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
GetDlgItem(IDC_COMBO_ROTATION_GROUPS)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_UPDATE_SELECTION_BOND)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_ROT_BOND_LEFT)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_ROT_BOND_RIGHT)->EnableWindow(false);
CComboBox* pCombo;
pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_ROTATION_GROUPS);
pCombo->ResetContent();
m_rotating_group1.clear();
m_rotating_group2.clear();
}
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_APPLY_MOVE_FRAGMENT, IDOK);
}
}
LRESULT MCEMoveFragment::OnUpdateRotatingGroups(WPARAM wParam, LPARAM lParam)
{
CString RG1, RG2;
for(int i=0;i<m_rotating_group1.size();i++) {
RG1 += m_rotating_group1[i]->AtomLabel + ";";
}
for(int i=0;i<m_rotating_group2.size();i++) {
RG2 += m_rotating_group2[i]->AtomLabel + ";";
}
CComboBox* pCombo;
pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_ROTATION_GROUPS);
pCombo->ResetContent();
pCombo->AddString(RG1);
pCombo->AddString(RG2);
pCombo->SetCurSel(0);
//UpdateData(FALSE);
return 0L;
}
void MCEMoveFragment::OnBnClickedButton3()
{//get rotating groups
if (m_pMCEView != NULL) {
UpdateData(TRUE);
m_pMCEView->PostMessage(WM_GET_ROTATING_GROUP, IDOK);
}
}
void MCEMoveFragment::calc_quaternion(float *axis, float angle, float *q)
{
angle = angle*3.1415926536/180.0;
float sin_a = sin( angle / 2 );
float w[3];
q[0] = cos( angle / 2 );
q[1] = axis[0] * sin_a;
q[2] = axis[1] * sin_a;
q[3] = axis[2] * sin_a;
float norm = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
q[0] /= norm;
q[1] /= norm;
q[2] /= norm;
q[3] /= norm;
}
void MCEMoveFragment::GetSelectedRotationGroup()
{
CComboBox* pCombo;
pCombo = (CComboBox*)GetDlgItem(IDC_COMBO_ROTATION_GROUPS);
if(pCombo->GetCurSel()==0) {
m_selected_rotating_group = 1;
} else {
m_selected_rotating_group = 2;
}
}
void MCEMoveFragment::OnBnClickedButtonRotBondLeft()
{
UpdateData(TRUE);
GetSelectedRotationGroup();
calc_quaternion(m_rot_bond_axis, m_rot_bond_step, m_rot_bond_quaternion);
if (m_pMCEView != NULL) {
m_pMCEView->PostMessage(WM_ROTATE_ROT_GROUP, IDOK);
}
}
void MCEMoveFragment::OnBnClickedButtonRotBondRight()
{
UpdateData(TRUE);
GetSelectedRotationGroup();
calc_quaternion(m_rot_bond_axis, -1*m_rot_bond_step, m_rot_bond_quaternion);
if (m_pMCEView != NULL) {
m_pMCEView->PostMessage(WM_ROTATE_ROT_GROUP, IDOK);
}
}