// EditEnvelopDlg.cpp : implementation file // #include "stdafx.h" #include "resource.h" #include "EditBlockWrapDlg.h" // NO MSG is required #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CEditBlockWrapDlg dialog IMPLEMENT_DYNAMIC(CEditBlockWrapDlg, CModelessDialog) int CEditBlockWrapDlg::m_nFixMethod = 0; // Zyu modify on 100716,首选“输入比例” //int CEditBlockWrapDlg::m_nInputMethod = 0; int CEditBlockWrapDlg::m_nInputMethod = 1; CEditBlockWrapDlg::CEditBlockWrapDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CEditBlockWrapDlg::IDD, pParent) { //{{AFX_DATA_INIT(CEditBlockWrapDlg) m_csRotation = _T(""); m_csScaleX = _T(""); m_csScaleY = _T(""); m_csScaleZ = _T(""); m_nSizeX = _T(""); m_nSizeY = _T(""); m_nSizeZ = _T(""); m_bEqualScale = FALSE; //}}AFX_DATA_INIT m_nOldSizeX=0.0; m_nOldSizeY=0.0; m_nOldSizeZ=0.0; m_nOldScaleX=m_nOldScaleY=m_nOldScaleZ=1.0; } void CEditBlockWrapDlg::UpdateScales() { // size -> scales; //int luprec, auprec; //VERIFY(xg_getvar(_T("LUPREC"), &luprec)==RTNORM; XString luFormat; luFormat << _T("%.4f"); if(fabs(m_nOldSizeX)>1.0E-3 && fabs(_tstof(m_nSizeX))>1.0E-3) { double nScaleX=m_nOldScaleX * _tstof(m_nSizeX)/m_nOldSizeX; m_csScaleX.Format(luFormat, nScaleX); } if(fabs(m_nOldSizeY)>1.0E-3 && fabs(_tstof(m_nSizeY))>1.0E-3) { double nScaleY=m_nOldScaleY * _tstof(m_nSizeY)/m_nOldSizeY; m_csScaleY.Format(luFormat, nScaleY); } if(fabs(m_nOldSizeZ)>1.0E-3 && fabs(_tstof(m_nSizeZ))>1.0E-3) { double nScaleZ=m_nOldScaleZ * _tstof(m_nSizeZ)/m_nOldSizeZ; m_csScaleZ.Format(luFormat, nScaleZ); } } void CEditBlockWrapDlg::UpdateSizes() { int luprec; VERIFY(xg_getvar(_T("LUPREC"), &luprec)==RTNORM); XString luFormat; luFormat << _T("%.") << luprec << _T("f"); if(fabs(m_nOldSizeX)>1.0E-3 && fabs(_tstof(m_csScaleX))>1.0E-3) { double nSizeX=m_nOldSizeX * _tstof(m_csScaleX)/m_nOldScaleX; m_nSizeX.Format(luFormat, nSizeX); } if(fabs(m_nOldSizeY)>1.0E-3 && fabs(_tstof(m_csScaleY))>1.0E-3) { double nSizeY=m_nOldSizeY * _tstof(m_csScaleY)/m_nOldScaleY; m_nSizeY.Format(luFormat, nSizeY); } if(fabs(m_nOldSizeZ)>1.0E-3 && fabs(_tstof(m_csScaleZ))>1.0E-3) { double nSizeZ=m_nOldSizeZ * _tstof(m_csScaleZ)/m_nOldScaleZ; m_nSizeZ.Format(luFormat, nSizeZ); } } void CEditBlockWrapDlg::SetFromBlockInfo(AcDbObjectId idInsert) { OPENOBJ_BEGIN(idInsert, AcDb::kForRead, AcDbEntity, pEnt); BOOL bDel=FALSE; AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt); if(!pInsert) { TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(pEnt); ASSERT(pMview); if(!pMview) return; pInsert=pMview->NewBlock(TRUE); bDel=TRUE; } if(pInsert) { AcDbBlockReference &entInsert=*pInsert; TBlockGeomInfo geom; geom.SetFromInsert(&entInsert); double nRotation = geom.m_nRotation*180.0/PI; //m_nPointIndice = 0; m_ptCen = geom.m_ptCen; m_ptBase = entInsert.position(); m_nOldSizeX=geom.GetSizeX(); m_nOldSizeY=geom.GetSizeY(); m_nOldSizeZ=geom.GetSizeZ(); AcGeScale3d scales=entInsert.scaleFactors(); m_nOldScaleX=scales[0]; m_nOldScaleY=scales[1]; m_nOldScaleZ=scales[2]; int luprec, auprec; VERIFY(xg_getvar(_T("LUPREC"), &luprec)==RTNORM && xg_getvar(_T("AUPREC"), &auprec)==RTNORM); XString luFormat0, luFormat, auFormat; luFormat0 << _T("%.") << luprec << _T("f"); luFormat << _T("%.4f"); auFormat << _T("%.") << auprec << _T("f"); m_nSizeX.Format(luFormat0, geom.m_nSizeX); m_nSizeY.Format(luFormat0, geom.m_nSizeY); m_nSizeZ.Format(luFormat0, geom.m_nSizeZ); m_csRotation.Format(auFormat, nRotation); m_csScaleX.Format(luFormat, m_nOldScaleX); m_csScaleY.Format(luFormat, m_nOldScaleY); m_csScaleZ.Format(luFormat, m_nOldScaleZ); if(_tcscmp(m_csScaleX, m_csScaleY)==0 && _tcscmp(m_csScaleY, m_csScaleZ)==0) m_bEqualScale=TRUE; else m_bEqualScale=FALSE; if(bDel) delete pInsert; } OPENOBJ_END(); } void CEditBlockWrapDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEditBlockWrapDlg) DDX_Text(pDX, IDC_ROTATION, m_csRotation); // Zyu modify on 100716,调整UI // Begin //DDX_Text(pDX, IDC_SCALEX, m_csScaleX); //DDX_Text(pDX, IDC_SCALEY, m_csScaleY); //DDX_Text(pDX, IDC_SCALEZ, m_csScaleZ); //DDX_Text(pDX, IDC_SIZEX, m_nSizeX); //DDX_Text(pDX, IDC_SIZEY, m_nSizeY); //DDX_Text(pDX, IDC_SIZEZ, m_nSizeZ); DDX_Radio(pDX, IDC_BOTTOM_CENTER, m_nFixMethod); DDX_Radio(pDX, IDC_INPUT_SIZE, m_nInputMethod); DDX_Check(pDX, IDC_EQUAL_SCALE, m_bEqualScale); if (m_nInputMethod) { DDX_Text(pDX, IDC_SIZEX, m_csScaleX); DDX_Text(pDX, IDC_SIZEY, m_csScaleY); DDX_Text(pDX, IDC_SIZEZ, m_csScaleZ); } else { DDX_Text(pDX, IDC_SIZEX, m_nSizeX); DDX_Text(pDX, IDC_SIZEY, m_nSizeY); DDX_Text(pDX, IDC_SIZEZ, m_nSizeZ); } // End //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CEditBlockWrapDlg, CModelessDialog) //{{AFX_MSG_MAP(CEditBlockWrapDlg) ON_BN_CLICKED(IDC_INPUT_SIZE, OnInputSize) ON_BN_CLICKED(IDC_INPUT_SCALE, OnInputScale) // Zyu delete on 100716,调整UI //ON_EN_KILLFOCUS(IDC_SCALEX, OnKillfocusScalex) //ON_EN_KILLFOCUS(IDC_SCALEY, OnKillfocusScaley) //ON_EN_KILLFOCUS(IDC_SCALEZ, OnKillfocusScalez) ON_EN_KILLFOCUS(IDC_SIZEX, OnKillfocusSizex) ON_EN_KILLFOCUS(IDC_SIZEY, OnKillfocusSizey) ON_EN_KILLFOCUS(IDC_SIZEZ, OnKillfocusSizez) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEditBlockWrapDlg message handlers void CEditBlockWrapDlg::OnOK() { // TODO: Add extra validation here //m_bClosedByOk = TRUE; CModelessDialog::OnOK(); } void CEditBlockWrapDlg::OnCancel() { // TODO: Add extra cleanup here //m_bClosedByCancel = TRUE; CModelessDialog::OnCancel(); } void CEditBlockWrapDlg::UpdateInsert(AcDbObjectId idInsert) const { XPoint ptFix; if(m_nFixMethod==0) ptFix=m_ptCen; else if(m_nFixMethod==1) ptFix=m_ptBase; else { if(ads_getpoint(NULL, _T("\n点取图块固定点<退出>:"), ptFix)!=RTNORM) return; ptFix=Ucs2Wcs(ptFix); } OPENOBJ_BEGIN(idInsert, AcDb::kForWrite, AcDbEntity, pEnt); AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt); BOOL bDelete=FALSE; if(!pInsert) { TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(pEnt); ASSERT(pMview); if(!pMview) return; pInsert=pMview->NewBlock(TRUE); bDelete=TRUE; } if(pInsert) { AcDbBlockReference &entInsert=*pInsert; AcGeMatrix3d mat=pInsert->blockTransform(); AcGeMatrix3d matRev=mat.inverse(); ads_matrix matRev1; AsAdsMatrix(matRev, matRev1); XPoint ptOrg=m_ptBase.TransformAs(matRev1); XPoint ptFix1=ptFix.TransformAs(matRev1); XVector3D vt=ptOrg-ptFix1; AcGeScale3d scales; scales[0]=_tstof(m_csScaleX); scales[1]=_tstof(m_csScaleY); scales[2]=_tstof(m_csScaleZ); entInsert.setScaleFactors(scales); entInsert.setRotation(_tstof(m_csRotation)*PI/180.0); mat=entInsert.blockTransform(); //((AcGeVector3d &)vt).transfromBy(mat); XPoint ptFix2; ptFix2=((AcGePoint3d &)ptFix1).transformBy(mat); XPoint ptInsert=m_ptBase; ptInsert += ptFix-ptFix2; entInsert.setPosition(ptInsert); if(bDelete) { TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(pEnt); pMview->SetLocation(ptInsert); pMview->SetScaleFactors(scales); pMview->SetRotation(pInsert->rotation()); delete pInsert; } } OPENOBJ_END(); } BOOL CEditBlockWrapDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); UpdateData(FALSE); // Zyu delete on 100716,调整UI /* BOOL bTrue=m_nInputMethod==0; GetDlgItem(IDC_SIZEX)->EnableWindow(bTrue); GetDlgItem(IDC_SIZEY)->EnableWindow(bTrue); GetDlgItem(IDC_SIZEZ)->EnableWindow(bTrue); GetDlgItem(IDC_SCALEX)->EnableWindow(!bTrue); GetDlgItem(IDC_SCALEY)->EnableWindow(!bTrue); GetDlgItem(IDC_SCALEZ)->EnableWindow(!bTrue); */ return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CEditBlockWrapDlg::OnInputSize() { // Zyu modify on 100716,调整UI /* UpdateData(TRUE); GetDlgItem(IDC_SIZEX)->EnableWindow(TRUE); GetDlgItem(IDC_SIZEY)->EnableWindow(TRUE); GetDlgItem(IDC_SIZEZ)->EnableWindow(TRUE); GetDlgItem(IDC_SCALEX)->EnableWindow(FALSE); GetDlgItem(IDC_SCALEY)->EnableWindow(FALSE); GetDlgItem(IDC_SCALEZ)->EnableWindow(FALSE); */ m_nInputMethod = 0; UpdateData(FALSE); } void CEditBlockWrapDlg::OnInputScale() { // TODO: Add your control notification handler code here // Zyu modify on 100716,调整UI /* UpdateData(TRUE); GetDlgItem(IDC_SIZEX)->EnableWindow(FALSE); GetDlgItem(IDC_SIZEY)->EnableWindow(FALSE); GetDlgItem(IDC_SIZEZ)->EnableWindow(FALSE); GetDlgItem(IDC_SCALEX)->EnableWindow(TRUE); GetDlgItem(IDC_SCALEY)->EnableWindow(TRUE); GetDlgItem(IDC_SCALEZ)->EnableWindow(TRUE); */ m_nInputMethod = 1; UpdateData(FALSE); } // Zyu delete on 100716 /* void CEditBlockWrapDlg::OnKillfocusScalex() { // TODO: Add your control notification handler code here if(m_nInputMethod==1) { UpdateData(TRUE); if(m_bEqualScale) { m_csScaleY=m_csScaleZ=m_csScaleX; } UpdateSizes(); UpdateData(FALSE); } } void CEditBlockWrapDlg::OnKillfocusScaley() { // TODO: Add your control notification handler code here if(m_nInputMethod==1) { UpdateData(TRUE); if(m_bEqualScale) { m_csScaleX=m_csScaleZ=m_csScaleY; } UpdateSizes(); UpdateData(FALSE); } } void CEditBlockWrapDlg::OnKillfocusScalez() { // TODO: Add your control notification handler code here if(m_nInputMethod==1) { UpdateData(TRUE); if(m_bEqualScale) { m_csScaleX=m_csScaleY=m_csScaleZ; } UpdateSizes(); UpdateData(FALSE); } } */ void CEditBlockWrapDlg::OnKillfocusSizex() { // TODO: Add your control notification handler code here // Zyu modify on 100716 /* if(m_nInputMethod==0) { UpdateData(TRUE); UpdateScales(); if(m_bEqualScale) { m_csScaleY=m_csScaleZ=m_csScaleX; UpdateSizes(); } UpdateData(FALSE); } */ UpdateData(TRUE); if (1 == m_nInputMethod) { if(m_bEqualScale) { m_csScaleY = m_csScaleZ = m_csScaleX; } UpdateSizes(); } else { UpdateScales(); if(m_bEqualScale) { m_csScaleY = m_csScaleZ = m_csScaleX; UpdateSizes(); } } UpdateData(FALSE); } void CEditBlockWrapDlg::OnKillfocusSizey() { // TODO: Add your control notification handler code here // Zyu modify on 100716 /* if(m_nInputMethod==0) { UpdateData(TRUE); UpdateScales(); if(m_bEqualScale) { m_csScaleZ=m_csScaleX=m_csScaleY; UpdateSizes(); } UpdateData(FALSE); } */ UpdateData(TRUE); if (1 == m_nInputMethod) { if(m_bEqualScale) { m_csScaleX = m_csScaleZ = m_csScaleY; } UpdateSizes(); } else { UpdateScales(); if(m_bEqualScale) { m_csScaleX = m_csScaleZ = m_csScaleY; UpdateSizes(); } } UpdateData(FALSE); } void CEditBlockWrapDlg::OnKillfocusSizez() { // TODO: Add your control notification handler code here // Zyu modify on 100716 /* if(m_nInputMethod==0) { UpdateData(TRUE); UpdateScales(); if(m_bEqualScale) { m_csScaleX=m_csScaleY=m_csScaleZ; UpdateSizes(); } UpdateData(FALSE); } */ UpdateData(TRUE); if (1 == m_nInputMethod) { if(m_bEqualScale) { m_csScaleX = m_csScaleY = m_csScaleZ; } UpdateSizes(); } else { UpdateScales(); if(m_bEqualScale) { m_csScaleX = m_csScaleY = m_csScaleZ; UpdateSizes(); } } UpdateData(FALSE); } int EditBlockInsert(AcDbObjectId idInsert) { //OPENOBJ_BEGIN(idInsert, AcDb::kForRead, AcDbBlockReference, pInsert); //if(!pInsert) // return RTERROR; //OPENOBJ_END(); CAcModuleResourceOverride vTemp; CEditBlockWrapDlg dlg(acedGetAcadFrame()); dlg.SetFromBlockInfo(idInsert); if(dlg.DoModal()==IDOK) { dlg.UpdateInsert(idInsert); } return RTNORM; }