Files
envi-code/SourceCode/Code2026/tg_shs/shs_utility/InsertBlockDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

564 lines
14 KiB
C++

// InsertBlockDlg.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "InsertBlockDlg.h"
#include "DbMultiViewInsert.h"
#include "rxregsvc.h"
#include "axlock.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInsertBlockDlg dialog
IMPLEMENT_DYNAMIC(CInsertBlockDlg, CModelessDialog)
int CInsertBlockDlg::m_nInputMethod = 0;
// Zyu add on 100819,块的类型
int CInsertBlockDlg::m_iBlockType = 1;
CInsertBlockDlg::CInsertBlockDlg(AcDbEntity *pInsert, CWnd* pParent /*=NULL*/)
: CModelessDialog(CInsertBlockDlg::IDD, pParent), m_pInsert(pInsert)
{
//{{AFX_DATA_INIT(CInsertBlockDlg)
m_csRotation = _T("");
m_csScaleX = _T("");
m_csScaleY = _T("");
m_csScaleZ = _T("");
m_csSizeX = _T("");
m_csSizeY = _T("");
m_csSizeZ = _T("");
m_bEqualScale = FALSE;
m_bMultiView = FALSE;
//}}AFX_DATA_INIT
m_nOldSizeX=0.0;
m_nOldSizeY=0.0;
m_nOldSizeZ=0.0;
m_nOldScaleX=m_nOldScaleY=m_nOldScaleZ=1.0;
m_nInputMethod=1;
SetFromBlockInfo();
}
CInsertBlockDlg::CInsertBlockDlg(AcDbObjectId idInsert,CWnd* pParent /*=NULL*/)
: CModelessDialog(CInsertBlockDlg::IDD, pParent), m_pInsert(NULL),m_idInsert(idInsert)
{
//{{AFX_DATA_INIT(CInsertBlockDlg)
m_csRotation = _T("");
m_csScaleX = _T("");
m_csScaleY = _T("");
m_csScaleZ = _T("");
m_csSizeX = _T("");
m_csSizeY = _T("");
m_csSizeZ = _T("");
m_bEqualScale = FALSE;
m_bMultiView = FALSE;
//}}AFX_DATA_INIT
m_nOldSizeX=0.0;
m_nOldSizeY=0.0;
m_nOldSizeZ=0.0;
m_nOldScaleX=m_nOldScaleY=m_nOldScaleZ=1.0;
m_nInputMethod=1;
SetFromBlockInfo();
}
void CInsertBlockDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInsertBlockDlg)
DDX_Text(pDX, IDC_ROTATION, m_csRotation);
// Zyu modify on 100716,调整UI
// Begin
//DDX_Text(pDX, IDC_XSCALE, m_csScaleX);
//DDX_Text(pDX, IDC_YSCALE, m_csScaleY);
//DDX_Text(pDX, IDC_ZSCALE, m_csScaleZ);
//DDX_Text(pDX, IDC_SIZEX, m_csSizeX);
//DDX_Text(pDX, IDC_SIZEY, m_csSizeY);
//DDX_Text(pDX, IDC_SIZEZ, m_csSizeZ);
DDX_Check(pDX, IDC_EQUAL_SCALE, m_bEqualScale);
// Zyu add on 100819
if (m_bMultiView)
{
m_iBlockType = 1;
}
DDX_Radio(pDX, IDC_RAD_ACAD, m_iBlockType);
DDX_Radio(pDX, IDC_INPUT_SIZE, m_nInputMethod);
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_csSizeX);
DDX_Text(pDX, IDC_SIZEY, m_csSizeY);
DDX_Text(pDX, IDC_SIZEZ, m_csSizeZ);
}
// End
//DDX_Check(pDX, IDC_MAKE_VIEW2D, m_bMultiView);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInsertBlockDlg, CModelessDialog)
//{{AFX_MSG_MAP(CInsertBlockDlg)
ON_BN_CLICKED(IDC_INPUT_SIZE, OnInputSize)
ON_BN_CLICKED(IDC_INPUT_SCALE, OnInputScale)
// Zyu modify on 100716,调整UI
//ON_EN_KILLFOCUS(IDC_XSCALE, OnKillfocusScalex)
//ON_EN_KILLFOCUS(IDC_YSCALE, OnKillfocusScaley)
//ON_EN_KILLFOCUS(IDC_ZSCALE, OnKillfocusScalez)
ON_EN_KILLFOCUS(IDC_ROTATION, OnEnKillfocusRotation)
ON_EN_KILLFOCUS(IDC_SIZEX, OnKillfocusSizex)
ON_EN_KILLFOCUS(IDC_SIZEY, OnKillfocusSizey)
ON_EN_KILLFOCUS(IDC_SIZEZ, OnKillfocusSizez)
// sg add 110504,解决切换关键字时,图块类型不更新的问题
ON_BN_CLICKED(IDC_RAD_ACAD, OnRadioBlockType)
ON_BN_CLICKED(IDC_RAD_TG, OnRadioBlockType)
ON_WM_KILLFOCUS()
// Zyu delete on 100716,调整UI
//ON_BN_CLICKED(IDC_APPLY, OnApply)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInsertBlockDlg message handlers
void CInsertBlockDlg::UpdateScales()
{
// size -> scales;
//int luprec, auprec;
//VERIFY(xg_getvar("LUPREC", &luprec)==RTNORM;
XString luFormat;
luFormat << _T("%.4f");
if(fabs(m_nOldSizeX)>1.0E-3 && fabs(_tstof(m_csSizeX))>1.0E-3) {
double nScaleX=m_nOldScaleX * _tstof(m_csSizeX)/m_nOldSizeX;
m_csScaleX.Format(luFormat, nScaleX);
}
if(fabs(m_nOldSizeY)>1.0E-3 && fabs(_tstof(m_csSizeY))>1.0E-3) {
double nScaleY=m_nOldScaleY * _tstof(m_csSizeY)/m_nOldSizeY;
m_csScaleY.Format(luFormat, nScaleY);
}
if(fabs(m_nOldSizeZ)>1.0E-3 && fabs(_tstof(m_csSizeZ))>1.0E-3) {
double nScaleZ=m_nOldScaleZ * _tstof(m_csSizeZ)/m_nOldSizeZ;
m_csScaleZ.Format(luFormat, nScaleZ);
}
}
void CInsertBlockDlg::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_csSizeX.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_csSizeY.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_csSizeZ.Format(luFormat, nSizeZ);
}
}
void CInsertBlockDlg::SetFromBlockInfo()
{
if(!m_idInsert.isNull())
{
m_pInsert=NULL;
acdbOpenObject(m_pInsert,m_idInsert,AcDb::kForRead);
if(m_pInsert!=NULL)
{
AcDbBlockReference *pBlockInsert=AcDbBlockReference::cast(m_pInsert);
BOOL bDelete=FALSE;
if(!pBlockInsert) {
TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(m_pInsert);
ASSERT(pMview);
if(!pMview)
return;
pBlockInsert=pMview->NewBlock(TRUE);
bDelete=TRUE;
}
AcDbBlockReference &entInsert=*pBlockInsert;
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_csSizeX.Format(luFormat0, geom.m_nSizeX);
m_csSizeY.Format(luFormat0, geom.m_nSizeY);
m_csSizeZ.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(bDelete)
delete pBlockInsert;
m_pInsert->close();
m_pInsert=NULL;
}
}
else
{
AcDbBlockReference *pBlockInsert=AcDbBlockReference::cast(m_pInsert);
BOOL bDelete=FALSE;
if(!pBlockInsert) {
TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(m_pInsert);
ASSERT(pMview);
if(!pMview)
return;
pBlockInsert=pMview->NewBlock(TRUE);
bDelete=TRUE;
}
AcDbBlockReference &entInsert=*pBlockInsert;
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_csSizeX.Format(luFormat0, geom.m_nSizeX);
m_csSizeY.Format(luFormat0, geom.m_nSizeY);
m_csSizeZ.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(bDelete)
delete pBlockInsert;
}
}
// Zyu add on 100819,获得用户选择的图块类型0->ACAD图块,1->上华图块
int CInsertBlockDlg::GetBlockType()
{
UpdateData();
return m_iBlockType;
}
void CInsertBlockDlg::UpdateInsert()
{
if(m_pInsert!=NULL)
{
AcDbBlockReference *pBlockInsert=AcDbBlockReference::cast(m_pInsert);
AcGeScale3d scales;
scales[0]=_tstof(m_csScaleX);
scales[1]=_tstof(m_csScaleY);
scales[2]=_tstof(m_csScaleZ);
if(!pBlockInsert) {
TDbMultiViewInsert *pMview=TDbMultiViewInsert::cast(m_pInsert);
ASSERT(pMview);
if(!pMview)
return;
pMview->SetScaleFactors(scales);
pMview->SetRotation(_tstof(m_csRotation)*PI/180.0);
} else {
AcDbBlockReference &entInsert=*pBlockInsert;
entInsert.setScaleFactors(scales);
entInsert.setRotation(_tstof(m_csRotation)*PI/180.0);
}
}
}
BOOL CInsertBlockDlg::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_XSCALE)->EnableWindow(!bTrue);
GetDlgItem(IDC_YSCALE)->EnableWindow(!bTrue);
GetDlgItem(IDC_ZSCALE)->EnableWindow(!bTrue);
*/
// Zyu add on 100819,插入多视图块时,“ACAD”类型按钮不可用
GetDlgItem(IDC_RAD_ACAD)->EnableWindow(!m_bMultiView);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CInsertBlockDlg::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_XSCALE)->EnableWindow(FALSE);
GetDlgItem(IDC_YSCALE)->EnableWindow(FALSE);
GetDlgItem(IDC_ZSCALE)->EnableWindow(FALSE);
*/
m_nInputMethod = 0;
UpdateData(FALSE);
}
void CInsertBlockDlg::OnInputScale()
{
// TODO: Add your control notification handler code here
// Zyu delete on 100716,调整UI
/*
UpdateData(TRUE);
GetDlgItem(IDC_SIZEX)->EnableWindow(FALSE);
GetDlgItem(IDC_SIZEY)->EnableWindow(FALSE);
GetDlgItem(IDC_SIZEZ)->EnableWindow(FALSE);
GetDlgItem(IDC_XSCALE)->EnableWindow(TRUE);
GetDlgItem(IDC_YSCALE)->EnableWindow(TRUE);
GetDlgItem(IDC_ZSCALE)->EnableWindow(TRUE);
*/
m_nInputMethod = 1;
UpdateData(FALSE);
}
// Zyu delete on 100716,调整UI
/*
void CInsertBlockDlg::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 CInsertBlockDlg::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 CInsertBlockDlg::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);
}
}
*/
// Zyu add on 100716
void CInsertBlockDlg::OnEnKillfocusRotation()
{
UpdateData(TRUE);
OnApply();
}
void CInsertBlockDlg::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);
OnApply();
}
void CInsertBlockDlg::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);
OnApply();
}
void CInsertBlockDlg::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);
OnApply();
}
void CInsertBlockDlg::OnKillFocus(CWnd* pNewWnd)
{
CModelessDialog::OnKillFocus(pNewWnd);
UpdateData(TRUE);
if(m_idInsert.isNull())
UpdateInsert();
}
Adesk::Boolean acedPostCommand(const TCHAR * );
void CInsertBlockDlg::OnApply()
{
UpdateData(TRUE);
if(m_idInsert.isNull())
UpdateInsert();
else
acedPostCommand(_T("~\n"));
}
// sg add 110504,解决切换关键字时,图块类型不更新的问题
void CInsertBlockDlg::OnRadioBlockType()
{
UpdateData(TRUE);
}