// PoolDlg.cpp : implementation file // #include "stdafx.h" #include "PoolDlg.h" //#include "InsBlockDlg.h" //#include "aecutil.h" // DragInsertBlock //#include "DbBlockInsert.h" #include #include #include #include #include "tapi.h" #include "twtdef.h" #include "TBlockInsertEdJig.h" #include "DbPool.h" #include "CesspoolCalcDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //extern TARCH_IMPEXP int DragInsertBlock(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales); ///////////////////////////////////////////////////////////////////////////// // 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(LoadDwbBlock(csDwb, _T("00000353"), xsTmp1) != RTNORM) //化粪池 return; if(LoadDwbBlock(csDwb, _T("00000354"), xsTmp2) != RTNORM) //隔油池 return; if(LoadDwbBlock(csDwb, _T("00000355"), xsTmp3) != RTNORM) //沉淀池 return; if(LoadDwbBlock(csDwb, _T("00000356"), xsTmp4) != RTNORM) //降温池 return; if(LoadDwbBlock(csDwb, _T("00000357"), xsTmp5) != RTNORM) //中和池 return; if(LoadDwbBlock(csDwb, _T("00000399"), xsTmp6) != RTNORM) //化粪池 return; g_csInsBlkName = (const TCHAR*)xsTmp1; AcDbObjectId idBlock=InitBlock(g_csInsBlkName); if(!idBlock) { return; } XPoint ptIns; InitLayer(LAY_TWT_OUT); XPushVarStr clayer(_T("CLAYER"), LAY_TWT_OUT); xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); XVector3D vtNormal=Ucs2Wcs(XVector3D(0,0,1), TRUE); ((AcGeVector3d &)vtNormal).normalize(); AcDbEntity *pDragEnt=NULL; TDbBlockInsert *pInsert = new TDbBlockInsert; pInsert->setBlockTableRecord(idBlock); pInsert->setPosition(ptIns); pInsert->setRotation(ads_angle(XPoint(), Ucs2Ecs(XVector3D(1,0,0), vtNormal, TRUE))); pInsert->setNormal(vtNormal); pInsert->setScaleFactors(AcGeScale3d(CPoolDlg::m_nX,CPoolDlg::m_nY,1)); pDragEnt=pInsert; InitTwtTextStyle(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_csInsBlkName = (const TCHAR*)xsTmp1; csText = _T("HC"); } else if(dlg.m_iType == 1){ g_csInsBlkName = (const TCHAR*)xsTmp2; csText = _T("YC"); } else if(dlg.m_iType == 2){ g_csInsBlkName = (const TCHAR*)xsTmp3; csText = _T("CC"); } else if(dlg.m_iType == 3){ g_csInsBlkName = (const TCHAR*)xsTmp4; csText = _T("JC"); } else if(dlg.m_iType == 4){ g_csInsBlkName = (const TCHAR*)xsTmp5; csText = _T("ZC"); } else if(dlg.m_iType == 5){ g_csInsBlkName = (const TCHAR*)xsTmp6; csText = _T("HC"); } idBlock=InitBlock(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 = GetPipeByPt(ptIns, nElevation, iPipeIdx); if(!!entWire){ XPoint pt3, pt4; 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 (!DocGetMeterUnitDraw()) { ads_polar(ptText, nRotate + PI/2, dlg.m_nY/2+g_nTwtDimHeight*DocGetPScale()/2, ptText); ads_polar(ptText, nRotate, dlg.m_nX/2+g_nTwtDimHeight*DocGetPScale()/2, ptText); } else { ads_polar(ptText, nRotate + PI/2, dlg.m_nY/2+g_nTwtDimHeight*DocGetPScale()/2/10, ptText); ads_polar(ptText, nRotate, dlg.m_nX/2+g_nTwtDimHeight*DocGetPScale()/2/10, ptText); } TDbPool *pEquip = new TDbPool; 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(InitTextStyle(g_csTwtDimStyle)); double dTextRotate = Ucs2Wcs(0.0); if (dTextRotate > PI/2 && dTextRotate < PI*3/2) dTextRotate += PI; pEquip->SetLocation(ptPos); pEquip->SetLabelLocation(ptText); pEquip->SetTextRotation(dTextRotate); if (!DocGetMeterUnitDraw()) pEquip->SetTextHeight(g_nTwtDimHeight); else pEquip->SetTextHeight(g_nTwtDimHeight/10); pEquip->EnableDrawLabel(TRUE); AcDbExtents extents; AcGeScale3d scale(1); double x = 0, y = 0; 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 = AddToCurrentSpace(pEquip, Adesk::kTrue); TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); OPENOBJ_BEGIN(idPool, AcDb::kForWrite, TDbPool, 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); DrawSlide(csTmp, pWnd); } void CPoolDlg::OnRadioType1() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(TRUE); OpenSlide(); PostCommand(_T("W "), false); } void CPoolDlg::OnRadioType2() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(FALSE); OpenSlide(); PostCommand(_T("W "), false); } void CPoolDlg::OnRadioType3() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(FALSE); OpenSlide(); PostCommand(_T("W "), false); } void CPoolDlg::OnRadioType4() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(FALSE); OpenSlide(); PostCommand(_T("W "), false); } void CPoolDlg::OnRadioType5() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(FALSE); OpenSlide(); PostCommand(_T("W "), false); } void CPoolDlg::OnRadioType6() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_CALC); pWnd->EnableWindow(FALSE); OpenSlide(); PostCommand(_T("W "), false); } BOOL CPoolDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); OpenSlide(); if(DocGetMeterUnitDraw() && m_nX > 100 && m_nY > 100){ m_nX = m_nX / 1000; m_nY = m_nY / 1000; UpdateData(FALSE); } if(!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; TBlockGeomInfo 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(DocGetMeterUnitDraw() && m_nX > 100 && m_nY > 100){ m_nX = m_nX / 1000; m_nY = m_nY / 1000; } if(!DocGetMeterUnitDraw() && m_nX < 100 && m_nY < 100){ m_nX = m_nX * 1000; m_nY = m_nY * 1000; } UpdateData(FALSE); UpdateInsert(); //acedPostCommand(_T("\33\33")); // PostCommand(_T("hfc "), false); }