487 lines
12 KiB
C++
487 lines
12 KiB
C++
// 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;
|
|
}
|
|
|