// SprinklerSysDlg.cpp : implementation file // #include "stdafx.h" #include #include #include #include #include #include "SprinklerSysDlg.h" #include "DistFloorDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // 喷淋系统 ///////////////////////////////////////////////////////////////////////////// extern CString GetValveLayBySys(TPipeSys::SysType sys); AcDbObjectId DrawSysPipeByLayer(XPoint ptStart, XPoint ptEnd, const TCHAR* szLayer, int iLevel) { if(ptStart == ptEnd) return NULL; TPipeSys::SysType sys = GetPipeSysByLayer(szLayer); TDbPipe *pPipe = new TDbPipe; if(!g_bStandPipeArc)//传统扣弯 pPipe->SetRadiusIn(-2); pPipe->SetHideLevel(iLevel); pPipe->SetStartPoint(ptStart); pPipe->SetEndPoint(ptEnd); pPipe->setLayer(szLayer); pPipe->setLinetype(GetPipeWireLayLineType(szLayer)); pPipe->SetDnDiameter(g_iDefaultPipeDn); pPipe->SetMaterial(g_iPipeMaterial[GetPipeLayerIdxByName(szLayer)]); pPipe->SetPipeWeight(g_nPipeWidth[GetPipeLayerIdxByName(szLayer)]); pPipe->SetSysType(sys); pPipe->SetRadius(g_nPipeRadius[GetPipeLayerIdxByName(szLayer)]); pPipe->setColor(AcCmColor()); //随层 pPipe->SetModelType(TPipeSys::kSystem); AcDbObjectId id = AddToCurrentSpace(pPipe, Adesk::kTrue); return id; } AcDbObjectId DrawPlanPipeByLayer(XPoint ptStart, XPoint ptEnd, const TCHAR* szLayer, int iLevel) { TPipeSys::SysType sys = GetPipeSysByLayer(szLayer); TDbPipe *pPipe = new TDbPipe; if(!g_bStandPipeArc)//传统扣弯 pPipe->SetRadiusIn(-2); pPipe->SetHideLevel(iLevel); pPipe->SetStartPoint(ptStart); pPipe->SetEndPoint(ptEnd); pPipe->setLayer(szLayer); pPipe->setLinetype(GetPipeWireLayLineType(szLayer)); pPipe->SetDnDiameter(g_iDefaultPipeDn); pPipe->SetMaterial(g_iPipeMaterial[GetPipeLayerIdxByName(szLayer)]); pPipe->SetPipeWeight(g_nPipeWidth[GetPipeLayerIdxByName(szLayer)]); pPipe->SetSysType(sys); pPipe->SetRadius(g_nPipeRadius[GetPipeLayerIdxByName(szLayer)]); pPipe->setColor(AcCmColor()); //随层 pPipe->SetModelType(TPipeSys::kModel); AcDbObjectId id = AddToCurrentSpace(pPipe, Adesk::kTrue); return id; } AcDbObjectId InsValveByName(const TCHAR* szName, XPoint pt, const TCHAR* szPipeLay, BOOL bHorizontal) { TPipeSys::SysType sys = GetPipeSysByLayer(szPipeLay); CString csLay = GetValveLayBySys(sys); InitLayer(csLay); AcDbObjectId recordId = GetBlkIdByName(szName); if(!recordId) return recordId; double nWidth = GetValveWidth(szName); TDbPipeValve *pValve = new TDbPipeValve; pValve->SetBlock2d(recordId); pValve->SetLocation(pt); pValve->SetWidth(nWidth); pValve->SetFlangeDn(nWidth/2); pValve->setLayer(csLay); pValve->setColor(AcCmColor()); //随层 pValve->SetSysType(sys); AcDbObjectId id = AddToCurrentSpace(pValve, Adesk::kTrue); return id; } AcDbObjectId InsValveByName(const TCHAR* szName, XPoint pt, const TCHAR* szPipeLay, XPoint ptPipeS, XPoint ptPipeE) { TPipeSys::SysType sys = GetPipeSysByLayer(szPipeLay); CString csLay = GetValveLayBySys(sys); InitLayer(csLay); AcDbObjectId recordId = GetBlkIdByName(szName); if(!recordId) return recordId; XVector3D vectBase(ptPipeE.x - ptPipeS.x, ptPipeE.y - ptPipeS.y, 0); vectBase.Normalize(); int iQuadrant = 0; if(vectBase.y < -0.000001 ||(vectBase.y<0.000001&&vectBase.y>=-0.000001&&vectBase.x<0)){ //管线逆向绘制 vectBase.x = -vectBase.x; vectBase.y = -vectBase.y; iQuadrant = 2; } double nWidth = GetValveWidth(szName); TDbPipeValve *pValve = new TDbPipeValve; pValve->SetBlock2d(recordId); pValve->SetDirection(vectBase); pValve->SetQuadrant(iQuadrant); pValve->SetLocation(pt); pValve->SetWidth(nWidth); pValve->SetFlangeDn(nWidth/2); pValve->setLayer(csLay); pValve->setColor(AcCmColor()); //随层 pValve->SetSysType(sys); AcDbObjectId id = AddToCurrentSpace(pValve, Adesk::kTrue); return id; } AcDbObjectId InsSysSprinkler(const TCHAR* szName, XPoint pt, double nAng) { InitLayer(LAY_EQUIP_SPRINKLE); AcDbObjectId recordId = GetBlkIdByName(szName); if(!recordId) return recordId; TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(recordId); pEquip->SetLocation(pt); pEquip->SetScale(g_nSprinklerRadius); pEquip->SetHidePipe(FALSE); pEquip->SetAngle(nAng); pEquip->setLayer(LAY_EQUIP_SPRINKLE); pEquip->setColor(AcCmColor()); //随层 AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); return id; } AcDbObjectId InsElevation(XPoint pt, const TCHAR* szText, const TCHAR*szLayer, BOOL bRight = TRUE) { AcDbObjectId id = InitLayer(LAY_TEXT); TDbSymbElevation *pElev = new TDbSymbElevation; pElev->SetLocation(pt); pElev->SetLayoutRotation(Ucs2Wcs(0.0)); pElev->SetText(szText); // zxl 2012.07.03 modify //pElev->SetTextHeight(g_nTwtDimHeight); pElev->SetTextHeight(g_nEleDimHeight); pElev->SetBaseLine(FALSE); pElev->SetLeader(FALSE); // zxl 2012.07.03 modify //pElev->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle)); pElev->SetTextStyleId(InitTwtTextStyle(g_csEleDimStyle)); pElev->setLayer(pElev->GetDefaultLayer()); pElev->SetTextLayerId(id); pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen()*1.1); pElev->SetTextPoint(pElev->GetDefaultTextLocation()); if(!bRight) //标高标注往左边绘制 { double dLen = pElev->GetBaseLen(); AcDbIntArray indices; indices.append(1); pElev->moveGripPointsAt(indices, AcGeVector3d(-dLen*DocGetPScale(), 0.0, 0.0)); } AcDbObjectId idRet = pElev->AddToCSpace(Adesk::kTrue); Entity ent; ent.GetLast(); WriteXdata(ent, _T("TG-LAYER"), szLayer); return idRet; } void DrawFloorLine(XPoint p1, XPoint p2, const TCHAR*szPipeLayer, const TCHAR*szText, double nHeight, const TCHAR*szSerial=_T("")) { InitLayer(LAY_TWT); InitTwtTextStyle(g_csTwtDimStyle); XPushVarStr clayer(_T("CLAYER"), LAY_TWT); //楼板线和字 //zxl 2013.05.27 add ads_polar(p1, Ucs2Wcs(0.0 - PI), 5*DocGetPScale(), p1); XLine line(p1, p2, 1); XPoint ptTmp; int ret = ptTmp & line; line.Make(); Entity ent; ent.GetLast(); WriteXdata(ent, _T("TG-LAYER"), szPipeLayer); WriteXdata(ent, _T("PIPE-SERIAL"), (const TCHAR*)szSerial); BOOL bLeft = TRUE; if(_tcsicmp(szText, _T("")) != 0) { XPoint ptText; ads_polar(p1, PI/2, 50, ptText); XText text(szText, ptText, g_nTwtDimHeight * DocGetPScale(), g_nDimScale, g_csTwtDimStyle, LAY_TEXT); text.SetRotate(Ucs2Wcs(0.0)); text.TgDraw(XExplodeDraw::kBottomLeft); ent.GetLast(); WriteXdata(ent, _T("TG-LAYER"), szPipeLayer); WriteXdata(ent, _T("PIPE-SERIAL"), (const TCHAR*)szSerial); } else bLeft = FALSE; if(nHeight < -998) return; XPoint ptEle; CString csEle; csEle.Format(_T("%.3f"), nHeight); ads_polar(p1, Ucs2Wcs(0.0), 15*DocGetPScale(), ptEle); InsElevation(ptEle, csEle, szPipeLayer, bLeft); ent.GetLast(); WriteXdata(ent, _T("PIPE-SERIAL"), (const TCHAR*)szSerial); } void SprinklerSys() { CTemporaryResourceOverride vTemp; CSprinklerSysDlg dlg; if(dlg.DoModal() != IDOK) return; InitLayer(LAY_EQ_SPRINKLE); InitLayer(LAY_EQUIP_SPRINKLE); InitPipeLayer(LAY_PIPE_SPRINKLE); XPoint ptIns, ptStart, ptEnd, ptFloor; xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); PickSet ss(SS_FREE); ss.IncludeBegin(); double nAllHeight = dlg.m_nAllHeight; double nBraLength = dlg.m_nDist*(dlg.m_iNum+3); ptStart = ptIns; ads_polar(ptStart, PI/2*3, dlg.m_nFloorHeight*1000, ptStart); ads_polar(ptIns, PI/2, nAllHeight, ptEnd); DrawSysPipeByLayer(ptStart, ptEnd, LAY_PIPE_SPRINKLE); ptFloor = ptIns; XPoint ptPtS, ptPtE; CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp, xsTmp2, xsTmp3, xsTmp4, xsTmp5, xsTmp6, xsTmp7, xsTmp8, xsTmp9, xsTmp10; if(LoadDwbBlock(csDwb, _T("00000126"), xsTmp) != RTNORM) //干式 return; if(LoadDwbBlock(csDwb, _T("00000283"), xsTmp2) != RTNORM) //闭式 return; if(LoadDwbBlock(csDwb, _T("00000130"), xsTmp3) != RTNORM) //侧式 return; if(LoadDwbBlock(csDwb, _T("00000132"), xsTmp10) != RTNORM) //断线 return; csDwb = g_csDwbPath + _T("valve"); if(LoadDwbBlock(csDwb, _T("00000437"), xsTmp4) != RTNORM) //遥控信号阀 return; if(LoadDwbBlock(csDwb, _T("00000531"), xsTmp5) != RTNORM) //流量指示器 return; if(LoadDwbBlock(csDwb, _T("00000669"), xsTmp6) != RTNORM) //自动排气阀 return; if(LoadDwbBlock(csDwb, _T("00000497"), xsTmp7) != RTNORM) //截止阀 return; if(LoadDwbBlock(csDwb, _T("00000667"), xsTmp8) != RTNORM) //末端试水阀 return; if(LoadDwbBlock(csDwb, _T("00000592"), xsTmp9) != RTNORM) //压力表 return; ads_polar(ptStart, PI/2, dlg.m_nFloorHeight*1000/2, ptEnd); InsValveByName((const TCHAR*)xsTmp7, ptEnd, LAY_PIPE_SPRINKLE); double nCountHeight = dlg.m_nMinEle; for(int i=0;i 0) nLastHeight = _tstof(dlg.m_lstHeight[i-1]); nCountHeight += nLastHeight; //楼板线和字 CString csText = dlg.m_lstName[i]; DrawFloorLine(ptStart, ptEnd, LAY_PIPE_SPRINKLE, csText, nCountHeight); //干管 XPoint ptPipeS, ptPipeE; ads_polar(ptFloor, PI/2, dlg.m_nElevation*1000, ptPipeS); ads_polar(ptPipeS, 0, nBraLength, ptPipeE); DrawSysPipeByLayer(ptPipeS, ptPipeE, LAY_PIPE_SPRINKLE); //阀门 XPoint ptValve1, ptValve2, ptValve3, ptValve4; ads_polar(ptPipeS, 0, dlg.m_nDist, ptValve1); InsValveByName((const TCHAR*)xsTmp4, ptValve1, LAY_PIPE_SPRINKLE);//遥控信号阀 ads_polar(ptPipeS, 0, dlg.m_nDist*2, ptValve1); InsValveByName((const TCHAR*)xsTmp5, ptValve1, LAY_PIPE_SPRINKLE);//流量指示器 if(i == dlg.m_iFloorNum-1){ ads_polar(ptPipeS, 0, dlg.m_nDist*(dlg.m_iNum+3), ptPtS); ads_polar(ptPtS, PI/2*3, dlg.m_nLength, ptValve4); InsValveByName((const TCHAR*)xsTmp7, ptValve4, LAY_PIPE_SPRINKLE); ads_polar(ptPtS, PI/2*3, dlg.m_nLength*2, ptPtE); DrawSysPipeByLayer(ptPtE, ptPtS, LAY_PIPE_SPRINKLE); InsValveByName((const TCHAR*)xsTmp8, ptPtE, LAY_PIPE_SPRINKLE); ads_polar(ptPtS, PI/2*3, dlg.m_nLength*1.5, ptPtS); ads_polar(ptPtS, 0, dlg.m_nLength, ptPtE); DrawSysPipeByLayer(ptPtS, ptPtE, LAY_PIPE_SPRINKLE); InsValveByName((const TCHAR*)xsTmp9, ptPtE, LAY_PIPE_SPRINKLE); } else{ ads_polar(ptPipeS, 0, dlg.m_nDist*(dlg.m_iNum+2)+dlg.m_nDist/3, ptValve3);//截止阀 InsValveByName((const TCHAR*)xsTmp7, ptValve3, LAY_PIPE_SPRINKLE); ads_polar(ptPipeS, 0, dlg.m_nDist*(dlg.m_iNum+3), ptValve4); InsEquipmentByName(xsTmp10, ptValve4, 0, LAY_EQ_SPRINKLE, FALSE, FALSE); } //标高 // XPoint ptEle; // CString csEle; // double nLastHeight(0); // if(i > 0) // nLastHeight = _tstof(dlg.m_lstHeight[i-1]); // nCountHeight += nLastHeight; // csEle.Format(_T("%.3f"), nCountHeight); // // ads_polar(ptFloor, 0, dlg.m_nDist, ptEle); // InsElevation(ptEle, csEle, LAY_PIPE_SPRINKLE); //喷头 for(int j=0;j vOsMode(_T("OSMODE"), nOsMode); ptIns = Wcs2Ucs(ptIns); ss.Redraw(2); actrTransactionManager->flushGraphics(); //acad 刷新 XPoint xp; int nRet = DragMovePickSet(ss, _T("\n请点取系统图位置<退出>: "), ptIns, xp); if(nRet != RTNORM){ ss.Erase(); TPipePerDocData *pData = GetCurPipeDocData(); pData->EnableWork(FALSE); return; } ss.Redraw(1); } ///////////////////////////////////////////////////////////////////////////// // CSprinklerSysDlg dialog //void HideDialog(CWnd *pWnd, BOOL Flag) //{ // if (Flag) { // pWnd->GetParent()->EnableWindow(TRUE); // pWnd->GetParent()->SetFocus(); // pWnd->GetParent()->SetActiveWindow(); // pWnd->ShowWindow(SW_HIDE); // } // else { // pWnd->GetParent()->EnableWindow(FALSE); // pWnd->EnableWindow(TRUE); // pWnd->SetActiveWindow(); // pWnd->ShowWindow(SW_SHOW); // } //} int CSprinklerSysDlg::m_iNum = 8; int CSprinklerSysDlg::m_iFloorNum = 3; CSprinklerSysDlg::CSprinklerSysDlg(CWnd* pParent /*=NULL*/) : CDialog(CSprinklerSysDlg::IDD, pParent), m_spinNum(1), m_spinLength(50), m_spinFloor(1) { //{{AFX_DATA_INIT(CSprinklerSysDlg) m_iStyle = 1; m_iPos1 = 1; m_nLength = 250; m_nFloorHeight = 3; m_nElevation = 2.2; m_nDist = 1000; //}}AFX_DATA_INIT m_nAllHeight = 0; m_nMinEle= 0; } void CSprinklerSysDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSprinklerSysDlg) DDX_Control(pDX, IDC_SPIN_NUM, m_spinNum); DDX_Control(pDX, IDC_SPIN_LENGTH, m_spinLength); DDX_Control(pDX, IDC_SPIN_FLOOR, m_spinFloor); DDX_Radio(pDX, IDC_RADIO_TYPE1, m_iStyle); DDX_Radio(pDX, IDC_RADIO_POS1, m_iPos1); DDX_Text(pDX, IDC_EDIT_NUM, m_iNum); DDX_Text(pDX, IDC_FLOOR_NUM, m_iFloorNum); DDX_Text(pDX, IDC_EDIT_LENGTH, m_nLength); DDX_Text(pDX, IDC_EDIT_FOOR_HEIGHT, m_nFloorHeight); DDX_Text(pDX, IDC_EDIT_ELEVATION, m_nElevation); DDX_Text(pDX, IDC_EDIT_DIST, m_nDist); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSprinklerSysDlg, CDialog) //{{AFX_MSG_MAP(CSprinklerSysDlg) ON_WM_PAINT() 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_POS1, OnRadioPos1) ON_BN_CLICKED(IDC_RADIO_POS2, OnRadioPos2) ON_BN_CLICKED(IDC_RADIO_POS3, OnRadioPos3) ON_BN_CLICKED(IDC_BUTTON_HEIGHT, OnButtonHeight) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSprinklerSysDlg message handlers BOOL CSprinklerSysDlg::OnInitDialog() { CDialog::OnInitDialog(); m_spinNum.SetRange(1, 50); m_spinLength.SetRange(50, 1000); m_spinFloor.SetRange(1, 50); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSprinklerSysDlg::OnPaint() { CPaintDC dc(this); // device context for painting OpenSlide(); CWnd *pWnd = GetDlgItem(IDC_STATIC_PREVIEW2); DrawSlide(_T("TWT(PSXT)"), pWnd); } void CSprinklerSysDlg::OpenSlide() { CString csSldName; UpdateData(); if(m_iStyle == 0 && m_iPos1 == 0) //开 上喷 csSldName = _T("TWT(PT3)"); else if(m_iStyle == 0 && m_iPos1 == 1)//开 下喷 csSldName = _T("TWT(PT4)"); else if(m_iStyle == 1 && m_iPos1 == 0)//闭 上喷 csSldName = _T("TWT(PT2)"); else if(m_iStyle == 1 && m_iPos1 == 1)//闭 下喷 csSldName = _T("TWT(PT1)"); else if(m_iStyle == 1 && m_iPos1 == 2)//闭 上下喷 csSldName = _T("TWT(PT5) && m_iPos1 == 1"); else if(m_iStyle == 2) //侧墙 下喷 csSldName = _T("TWT(PT6)"); else if(m_iStyle == 3) //侧墙 下喷 csSldName = _T("TWT(PT7)"); else{ csSldName = _T(""); } CWnd *pWnd = GetDlgItem(IDC_STATIC_PREVIEW); DrawSlide((const TCHAR*)csSldName, pWnd); } void CSprinklerSysDlg::OnRadioType1() { UpdateData(); if(m_iPos1 == 2){ m_iPos1 = 1; UpdateData(FALSE); } OpenSlide(); } void CSprinklerSysDlg::OnRadioType2() { OpenSlide(); } void CSprinklerSysDlg::OnRadioType3() { UpdateData(); m_iPos1 = 1; UpdateData(FALSE); OpenSlide(); } void CSprinklerSysDlg::OnRadioType4() { UpdateData(); m_iPos1 = 1; UpdateData(FALSE); OpenSlide(); } void CSprinklerSysDlg::OnRadioPos1() { UpdateData(); if(m_iStyle == 2 || m_iStyle == 3){ m_iPos1 = 1; UpdateData(FALSE); return; } OpenSlide(); } void CSprinklerSysDlg::OnRadioPos2() { OpenSlide(); } void CSprinklerSysDlg::OnRadioPos3() { UpdateData(); if(m_iStyle == 2 || m_iStyle == 3){ m_iPos1 = 1; UpdateData(FALSE); return; } else if(m_iStyle == 0){ m_iPos1 = 1; UpdateData(FALSE); return; } OpenSlide(); } void CSprinklerSysDlg::OnButtonHeight() { UpdateData(TRUE); CTemporaryResourceOverride vTemp; CDistFloorDlg dlg; for(int i=0;i -1 || csText.Find(_T("-")) > -1) m_nMinEle -= _tstof(m_lstHeight[i]); } CDialog::OnOK(); }