494 lines
13 KiB
C++
494 lines
13 KiB
C++
#include "stdafx.h"
|
|
#include "AcDbObjectPtr.h"
|
|
#include "globalFunc.h"
|
|
#include "PickEntSet.h"
|
|
#include "PoolDlg.h"
|
|
#include "xtext.h"
|
|
#include "DbEquipment.h"
|
|
#include "TBlockGeomInfo.h"
|
|
#include "TBlockInsertEdJig.h"
|
|
#include "DbPool.h"
|
|
#include "CesspoolCalcDlg.h"
|
|
#include "layerdef.h"
|
|
#include "tdbblockinsert.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern AcDbObjectId InitBlock(const TCHAR *pszBlock, AcDbDatabase *pDb = NULL);
|
|
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPoolDlg dialog
|
|
|
|
//***************************************************************************************************
|
|
// 布置池
|
|
//***************************************************************************************************
|
|
|
|
|
|
void InsOutDoorPoolCmd()
|
|
{
|
|
// cet 2011.5.26 add 设置捕捉点
|
|
int nOsMode = 0;
|
|
xg_getvar(_T("OSMODE"), &nOsMode);
|
|
nOsMode &= ~0x4000;
|
|
nOsMode |= OS_INT | OS_END | OS_NEA;
|
|
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
|
|
|
|
CString csDwb = g_csDwbPath + _T("TwtSys");
|
|
XString xsTmp1, xsTmp2, xsTmp3, xsTmp4, xsTmp5, xsTmp6;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000353"), xsTmp1) != RTNORM) //化粪池
|
|
return;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000354"), xsTmp2) != RTNORM) //隔油池
|
|
return;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000355"), xsTmp3) != RTNORM) //沉淀池
|
|
return;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000356"), xsTmp4) != RTNORM) //降温池
|
|
return;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000357"), xsTmp5) != RTNORM) //中和池
|
|
return;
|
|
if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000399"), xsTmp6) != RTNORM) //化粪池
|
|
return;
|
|
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp1;
|
|
AcDbObjectId idBlock = InitBlock(g_Option::instance().g_csInsBlkName);
|
|
if (!idBlock) {
|
|
return;
|
|
}
|
|
|
|
XPoint ptIns;
|
|
InitLayer(LAY_TWT_OUT);
|
|
GlobalFunc::PushVarStr clayer(_T("CLAYER"), LAY_TWT_OUT);
|
|
xg_getvar(_T("VIEWCTR"), ptIns);
|
|
ptIns = GlobalFunc::Ucs2Wcs(ptIns);
|
|
XVector3D vtNormal = GlobalFunc::Ucs2Wcs(XVector3D(0, 0, 1), TRUE);
|
|
((AcGeVector3d &)vtNormal).normalize();
|
|
|
|
AcDbEntity *pDragEnt = NULL;
|
|
DbBlockInsert *pInsert = new DbBlockInsert;
|
|
pInsert->setBlockTableRecord(idBlock);
|
|
pInsert->setPosition(ptIns);
|
|
|
|
pInsert->setRotation(ads_angle(XPoint(), GlobalFunc::Ucs2Ecs(XVector3D(1, 0, 0), vtNormal, TRUE)));
|
|
pInsert->setNormal(vtNormal);
|
|
pInsert->setScaleFactors(AcGeScale3d(CPoolDlg::m_nX, CPoolDlg::m_nY, 1));
|
|
pDragEnt = pInsert;
|
|
GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csTwtDimStyle);
|
|
CPoolDlg dlg(pInsert, acedGetAcadFrame());
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
dlg.Create(IDD_POOL, acedGetAcadFrame());
|
|
}
|
|
|
|
pInsert->setScaleFactors(AcGeScale3d(CPoolDlg::m_nX, CPoolDlg::m_nY, 1));
|
|
|
|
TBlockInsertEdJig2 jig(pInsert, ptIns);
|
|
jig.SetPrompt(_T("\n请点取池插入点[90度翻转(R)]<退出>:"));
|
|
// jig.SetKeyword(_T("A S D E R T W"));
|
|
jig.SetOperCode(TBlockInsertEdJig2::kMove);
|
|
dlg.ShowWindow(SW_SHOW);
|
|
acedGetAcadDwgView()->SetFocus();
|
|
CString csText;
|
|
|
|
int nRoTateNum = 0; // cet 2011.5.25 add 旋转次数
|
|
while (1) {
|
|
dlg.UpdateData(TRUE);
|
|
if (dlg.m_iType == 0) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp1;
|
|
csText = _T("HC");
|
|
}
|
|
else if (dlg.m_iType == 1) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp2;
|
|
csText = _T("YC");
|
|
}
|
|
else if (dlg.m_iType == 2) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp3;
|
|
csText = _T("CC");
|
|
}
|
|
else if (dlg.m_iType == 3) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp4;
|
|
csText = _T("JC");
|
|
}
|
|
else if (dlg.m_iType == 4) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp5;
|
|
csText = _T("ZC");
|
|
}
|
|
else if (dlg.m_iType == 5) {
|
|
g_Option::instance().g_csInsBlkName = (const TCHAR*)xsTmp6;
|
|
csText = _T("HC");
|
|
}
|
|
|
|
idBlock = InitBlock(g_Option::instance().g_csInsBlkName);
|
|
if (idBlock == NULL)
|
|
break;
|
|
jig.SetBlockId(idBlock);
|
|
jig.SetKeyword(_T("W R"));
|
|
|
|
int nKeyIndex = 0;
|
|
int nRet = jig.DoIt(&nKeyIndex);
|
|
ptIns = jig.GetPickPoint();
|
|
if (nRet == RTNORM) {
|
|
pInsert->setScaleFactors(AcGeScale3d(CPoolDlg::m_nX, CPoolDlg::m_nY, 1));
|
|
double nRotate = pInsert->rotation();
|
|
double nElevation(0);
|
|
int iPipeIdx(0);
|
|
Entity entWire = GlobalFunc::GetPipeByPt(ptIns, nElevation, iPipeIdx);
|
|
if (!!entWire) {
|
|
XPoint pt3, pt4;
|
|
GlobalFunc::GetPipePoint(entWire, pt3, pt4);
|
|
nRotate = ads_angle(pt3, pt4);
|
|
}
|
|
|
|
if (nRotate > (PI * 2 - 0.001))
|
|
nRotate -= PI * 2;
|
|
|
|
//放置位置有导线才旋转180度
|
|
if (!!entWire)
|
|
{
|
|
if (nRotate > (PI - 0.001))
|
|
nRotate -= PI;
|
|
}
|
|
|
|
XPoint ptText = ptIns;
|
|
XPoint ptPos = pInsert->position();
|
|
if (!GlobalFunc::DocGetMeterUnitDraw())
|
|
{
|
|
ads_polar(ptText, nRotate + PI / 2, dlg.m_nY / 2 + g_Option::instance().g_nTwtDimHeight * GlobalFunc::DocGetPScale() / 2, ptText);
|
|
ads_polar(ptText, nRotate, dlg.m_nX / 2 + g_Option::instance().g_nTwtDimHeight * GlobalFunc::DocGetPScale() / 2, ptText);
|
|
}
|
|
else
|
|
{
|
|
ads_polar(ptText, nRotate + PI / 2, dlg.m_nY / 2 + g_Option::instance().g_nTwtDimHeight * GlobalFunc::DocGetPScale() / 2 / 10, ptText);
|
|
ads_polar(ptText, nRotate, dlg.m_nX / 2 + g_Option::instance().g_nTwtDimHeight * GlobalFunc::DocGetPScale() / 2 / 10, ptText);
|
|
}
|
|
|
|
CDbPool *pEquip = new CDbPool;
|
|
pEquip->SetBlock2d(idBlock);
|
|
pEquip->SetPoolLength(dlg.m_nX);
|
|
pEquip->SetPoolWidth(dlg.m_nY);
|
|
pEquip->SetAngle(0.0);
|
|
|
|
pEquip->SetLabelLayer(InitLayer(LAY_TEXT));
|
|
pEquip->SetLabel(csText);
|
|
pEquip->SetTextStyleId(GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csTwtDimStyle));
|
|
|
|
double dTextRotate = GlobalFunc::Ucs2Wcs(0.0);
|
|
if (dTextRotate > PI / 2 && dTextRotate < PI * 3 / 2)
|
|
dTextRotate += PI;
|
|
|
|
pEquip->SetLocation(ptPos);
|
|
pEquip->SetLabelLocation(ptText);
|
|
|
|
pEquip->SetTextRotation(dTextRotate);
|
|
if (!GlobalFunc::DocGetMeterUnitDraw())
|
|
pEquip->SetTextHeight(g_Option::instance().g_nTwtDimHeight);
|
|
else
|
|
pEquip->SetTextHeight(g_Option::instance().g_nTwtDimHeight / 10);
|
|
pEquip->EnableDrawLabel(TRUE);
|
|
|
|
AcDbExtents extents;
|
|
AcGeScale3d scale(1);
|
|
double x = 0, y = 0;
|
|
GlobalFunc::GetInsertExtend(idBlock, x, y);
|
|
if (x > 1.0E-3)
|
|
scale.sx *= dlg.m_nX * x;
|
|
if (y > 1.0E-3)
|
|
scale.sy *= dlg.m_nY * y;
|
|
//求图块边缘点
|
|
AcDbBlockReference insert(ptPos, idBlock);
|
|
insert.setScaleFactors(scale);
|
|
if (insert.geomExtentsBestFit(extents) == Acad::eOk)
|
|
{
|
|
XPoint ptMax = extents.maxPoint();
|
|
XPoint ptMin = extents.minPoint();
|
|
|
|
XPoint ptInter1, ptInter2;
|
|
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
|
|
nRoTateNum %= 4;
|
|
double dLen = dlg.m_nX;
|
|
if (nRoTateNum == 1 || nRoTateNum == 3)
|
|
{
|
|
vtDir = AcGeVector3d::kYAxis;
|
|
dLen = dlg.m_nY;
|
|
}
|
|
AcGePoint3d ptPosT = ptPos;
|
|
ptPosT.z = 0;
|
|
AcDbLine line(ptPosT + vtDir * dLen * 3 / 4, ptPosT - vtDir * dLen * 3 / 4);
|
|
|
|
AcDbPolyline polyLine;
|
|
AcGePoint3d pt1 = ptMin;
|
|
AcGePoint3d pt2 = pt1 + vtDir * dLen * x;
|
|
AcGePoint3d pt3 = ptMax;
|
|
AcGePoint3d pt4 = pt3 - vtDir * dLen * x;
|
|
|
|
polyLine.addVertexAt(0, pt1.convert2d(AcGePlane::kXYPlane));
|
|
polyLine.addVertexAt(1, pt2.convert2d(AcGePlane::kXYPlane));
|
|
polyLine.addVertexAt(2, pt3.convert2d(AcGePlane::kXYPlane));
|
|
polyLine.addVertexAt(3, pt4.convert2d(AcGePlane::kXYPlane));
|
|
polyLine.addVertexAt(4, pt1.convert2d(AcGePlane::kXYPlane));
|
|
|
|
AcGePoint3dArray arPts;
|
|
polyLine.intersectWith(&line, AcDb::kOnBothOperands, arPts);
|
|
if (arPts.length() == 2)
|
|
{
|
|
pEquip->AddInterface(_T("1"), arPts[0], XVector3D(vtDir));
|
|
pEquip->AddInterface(_T("2"), arPts[1], XVector3D(vtDir));
|
|
}
|
|
|
|
}
|
|
|
|
// cet 2011.5.25 add
|
|
if (!!entWire)// zxl 2013.12.09 add
|
|
{
|
|
if (nRoTateNum == 1)
|
|
{
|
|
nRotate += PI / 2;
|
|
}
|
|
else if (nRoTateNum == 2)
|
|
{
|
|
nRotate += PI;
|
|
}
|
|
else if (nRoTateNum == 3)
|
|
{
|
|
nRotate += PI * 1.5;
|
|
}
|
|
}
|
|
|
|
pEquip->SetAngle(nRotate);
|
|
|
|
AcDbObjectId idPool = GlobalFunc::AddToCurrentSpace(pEquip, Adesk::kTrue);
|
|
//TPipePerDocData *pData = GetCurPipeDocData();
|
|
//pData->ApplyUpdates();
|
|
OPENOBJ_BEGIN(idPool, AcDb::kForWrite, CDbPool, pPool);
|
|
pPool->UpdataPipeInterface();
|
|
OPENOBJ_END();
|
|
|
|
// cet 2013.3.6 add 实时更新池与管线
|
|
//pData->ApplyUpdates();
|
|
}
|
|
else if (nRet == RTKWORD)
|
|
{
|
|
if (nKeyIndex == 1)// zxl 2013.12.09 add 只有输入R时才旋转
|
|
{
|
|
++nRoTateNum;// cet 2011.5.25 add
|
|
}
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
jig.SetRefPoint(ptIns);
|
|
}
|
|
delete pDragEnt;
|
|
dlg.DestroyWindow();
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CPoolDlg, CModelessDialog)
|
|
|
|
double CPoolDlg::m_nX = 1750;
|
|
double CPoolDlg::m_nY = 1050;
|
|
CPoolDlg::CPoolDlg(AcDbEntity *pInsert, CWnd* pParent /*=NULL*/)
|
|
: CModelessDialog(CPoolDlg::IDD, pParent), m_pInsert(pInsert)
|
|
{
|
|
//{{AFX_DATA_INIT(CPoolDlg)
|
|
m_iType = 0;
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CPoolDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CModelessDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPoolDlg)
|
|
DDX_Radio(pDX, IDC_RADIO_TYPE1, m_iType);
|
|
DDX_Text(pDX, IDC_EDIT_LEN, m_nX);
|
|
DDX_Text(pDX, IDC_EDIT_WIDTH, m_nY);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPoolDlg, CModelessDialog)
|
|
//{{AFX_MSG_MAP(CPoolDlg)
|
|
ON_WM_CLOSE()
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE1, OnRadioType1)
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE2, OnRadioType2)
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE3, OnRadioType3)
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE4, OnRadioType4)
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE5, OnRadioType5)
|
|
ON_WM_PAINT()
|
|
ON_EN_KILLFOCUS(IDC_EDIT_LEN, OnKillfocusEditLen)
|
|
ON_EN_KILLFOCUS(IDC_EDIT_WIDTH, OnKillfocusEditWidth)
|
|
ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc)
|
|
ON_BN_CLICKED(IDC_RADIO_TYPE6, OnRadioType6)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPoolDlg message handlers
|
|
|
|
void CPoolDlg::OnClose()
|
|
{
|
|
CModelessDialog::OnClose();
|
|
acedPostCommand(_T("\33\33"));
|
|
}
|
|
|
|
void CPoolDlg::PostNcDestroy()
|
|
{
|
|
CModelessDialog::PostNcDestroy();
|
|
}
|
|
|
|
void CPoolDlg::OpenSlide()
|
|
{
|
|
UpdateData();
|
|
CWnd *pWnd = GetDlgItem(IDC_PREVIEW1);
|
|
CString csTmp;
|
|
csTmp.Format(_T("TWT(POOL%d)"), m_iType + 1);
|
|
GlobalFunc::DrawSlide(csTmp, pWnd);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType1()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(TRUE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType2()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(FALSE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType3()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(FALSE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType4()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(FALSE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType5()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(FALSE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
void CPoolDlg::OnRadioType6()
|
|
{
|
|
CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC);
|
|
pWnd->EnableWindow(FALSE);
|
|
OpenSlide();
|
|
GlobalFunc::PostCommand(_T("W "), false);
|
|
}
|
|
|
|
BOOL CPoolDlg::OnInitDialog()
|
|
{
|
|
CModelessDialog::OnInitDialog();
|
|
OpenSlide();
|
|
if (GlobalFunc::DocGetMeterUnitDraw() && m_nX > 100 && m_nY > 100) {
|
|
m_nX = m_nX / 1000;
|
|
m_nY = m_nY / 1000;
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
if (!GlobalFunc::DocGetMeterUnitDraw() && m_nX < 100 && m_nY < 100) {
|
|
m_nX = m_nX * 1000;
|
|
m_nY = m_nY * 1000;
|
|
UpdateData(FALSE);
|
|
}
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CPoolDlg::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
OpenSlide();
|
|
}
|
|
|
|
|
|
void CPoolDlg::SetFromBlockInfo()
|
|
{
|
|
if (m_pInsert == NULL)
|
|
return;
|
|
|
|
AcDbBlockReference *pBlockInsert = AcDbBlockReference::cast(m_pInsert);
|
|
AcDbBlockReference &entInsert = *pBlockInsert;
|
|
BlockGeomInfo geom;
|
|
geom.SetFromInsert(&entInsert);
|
|
AcGeScale3d scales = entInsert.scaleFactors();
|
|
m_nX = scales[0];
|
|
m_nY = scales[1];
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CPoolDlg::UpdateInsert()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
if (m_pInsert == NULL)
|
|
return;
|
|
|
|
AcDbBlockReference *pBlockInsert = AcDbBlockReference::cast(m_pInsert);
|
|
AcGeScale3d scales(1);
|
|
scales.sx *= m_nX;
|
|
scales.sy *= m_nY;
|
|
|
|
AcDbBlockReference &entInsert = *pBlockInsert;
|
|
entInsert.setScaleFactors(scales);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CPoolDlg::OnKillfocusEditLen()
|
|
{
|
|
UpdateInsert();
|
|
}
|
|
|
|
void CPoolDlg::OnKillfocusEditWidth()
|
|
{
|
|
UpdateInsert();
|
|
}
|
|
|
|
void CPoolDlg::OnButtonCalc()
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
CCesspoolCalcDlg dlg;
|
|
dlg.SetPoolLen(m_nX);
|
|
dlg.SetPoolWidth(m_nY);
|
|
|
|
dlg.DoModal();
|
|
m_nX = dlg.GetPoolLen();
|
|
m_nY = dlg.GetPoolWidth();
|
|
|
|
if (GlobalFunc::DocGetMeterUnitDraw() && m_nX > 100 && m_nY > 100) {
|
|
m_nX = m_nX / 1000;
|
|
m_nY = m_nY / 1000;
|
|
}
|
|
|
|
if (!GlobalFunc::DocGetMeterUnitDraw() && m_nX < 100 && m_nY < 100) {
|
|
m_nX = m_nX * 1000;
|
|
m_nY = m_nY * 1000;
|
|
}
|
|
UpdateData(FALSE);
|
|
|
|
UpdateInsert();
|
|
//acedPostCommand(_T("\33\33"));
|
|
// GlobalFunc::PostCommand(_T("hfc "), false);
|
|
}
|
|
|