Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/EditBlockWrapDlg.cpp
T
2026-09-28 15:28:50 +08:00

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;
}