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