// SprinklerByLineDlg.cpp : implementation file // #include "stdafx.h" #include "DbEquipment.h" #include "DbPipe.h" #include "XRect.h" #include "layerdef.h" #include "SprinklerByLineDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern AcDbObjectId InitLayer(const TCHAR *szLayer, AcDbDatabase *pDb = NULL); //************************************************************************** // 直线喷头 //************************************************************************** void SprinklerByLine() { CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp, xsTmp2, xsTmp3, xsTmp4, xsTmp5, xsTmp6, xsTmp7, xsTmp2d, xsTmp3d; XString xsTmp8, xsTmp9, xsTmp10;//zxl 2011.12.19 add 增加水喷雾喷头 if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000125"), xsTmp) != RTNORM) return; if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000128"), xsTmp2) != RTNORM) return; if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000131"), xsTmp6) != RTNORM) return; if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000283"), XString()) != RTNORM) // cet 2011.2.28 add 剖切时需要的图块 { return; } if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000529"), xsTmp8) != RTNORM)//zxl 2011.12.19 add 增加水喷雾喷头 { return; } if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000540"), xsTmp9) != RTNORM) // cet 2013.1.5 add 直立型水幕 { return; } if (GlobalFunc::LoadDwbBlock(csDwb, _T("00000541"), xsTmp10) != RTNORM) // cet 2013.1.5 add 下垂型水幕 { return; } if(g_Option::instance().g_bBlk3D){ if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000365"), xsTmp3) != RTNORM) return; if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000366"), xsTmp4) != RTNORM) return; if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000367"), xsTmp5) != RTNORM) return; if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000417"), xsTmp7) != RTNORM) return; } //XString xsTmp, xsTmp2, xsTmp3, xsTmp4, xsTmp5; //if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000125"), xsTmp) != RTNORM) // return; //if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000128"), xsTmp2) != RTNORM) // return; //if(g_Option::instance().g_bBlk3D){ // if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000365"), xsTmp3) != RTNORM) // return; // if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000366"), xsTmp4) != RTNORM) // return; // if(GlobalFunc::LoadDwbBlock(csDwb, _T("00000367"), xsTmp5) != RTNORM) // return; //} int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); CSprinklerByLineDlg dlg(acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; dlg.Create(IDD_SPRINKLER_LINE, acedGetAcadFrame()); dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); } CString m_csSysBlk1 = _T("TWTSYS(00000283)"); CString m_csSysBlk2 = _T("TWTSYS(00000130)"); CString m_csSysBlk3 = _T("TWTSYS(00000530)");//水喷雾 系统 zxl 2011.12.19 add XPoint ptStart, ptEnd; int iRet; iRet = ads_getpoint(NULL, _T("请输入起始点<退出>:"), ptStart); ptStart = GlobalFunc::Ucs2Wcs(ptStart); if(iRet != RTNORM ){ dlg.DestroyWindow(); return; } if(dlg.m_bDrawCir) g_Option::instance().adsout << _T("\n外圆表示喷淋头保护范围"); TSprinklerJig jig(&dlg, ptStart); jig.SetPrompt(_T("\n请输入终点<退出>:")); int nKeyIdx; if(jig.DoIt(&nKeyIdx) != RTNORM){ dlg.DestroyWindow(); return; } ptEnd = jig.GetPickPoint(); XPushVar vOsMode2(_T("OSMODE"), 0); int len = jig.m_pDrawEnt->m_lstPt.Length(); GlobalFunc::InitPipeLayer(LAY_PIPE_SPRINKLE); InitLayer(LAY_EQUIP_SPRINKLE); double nAng(0); if(len > 1){ XPoint pt3 = *jig.m_pDrawEnt->m_lstPt[0]; XPoint pt4 = *jig.m_pDrawEnt->m_lstPt[1]; nAng = ads_angle(pt3, pt4); } if(dlg.m_iType == 0){ xsTmp2d = xsTmp; xsTmp3d = xsTmp4; } else if(dlg.m_iType == 1){ xsTmp2d = xsTmp; xsTmp3d = xsTmp3; } else if(dlg.m_iType == 2){ xsTmp2d = xsTmp2; xsTmp3d = xsTmp5; } else if(dlg.m_iType == 3){ xsTmp2d = xsTmp6; xsTmp3d = xsTmp7; } else if (dlg.m_iType == 4)//zxl 2011.12.19 add 增加水喷雾喷头 { xsTmp2d = xsTmp8; xsTmp3d = xsTmp3; } else if (dlg.m_iType == 5) // cet 2013.1.5 add 直立型水幕 { xsTmp2d = xsTmp9; xsTmp3d = xsTmp4; } else if (dlg.m_iType == 6) // cet 2013.1.5 add 下垂型水幕 { xsTmp2d = xsTmp10; xsTmp3d = xsTmp3; } for(int i=0;im_lstPt[i]; CDbEquipment *pEquip = new CDbEquipment; pEquip->SetBlock2d(GlobalFunc::GetBlkIdByName(xsTmp2d)); pEquip->SetBlock3d(GlobalFunc::GetBlkIdByName(xsTmp3d)); //pEquip->SetSysBlock(m_csSysBlk1); if(dlg.m_iType == 1){ pEquip->SetHidePipe(FALSE);//下喷 pEquip->SetPipeLength(-250); pEquip->SetSysBlock(m_csSysBlk1); } else if(dlg.m_iType == 3){ pEquip->SetHidePipe(TRUE);//侧喷 pEquip->SetPipeLength(-250); pEquip->SetSysBlock(m_csSysBlk2); } else if (dlg.m_iType == 4)//zxl 2011.12.19 add 增加水喷雾喷头 { pEquip->SetHidePipe(TRUE); pEquip->SetPipeLength(-250); pEquip->SetSysBlock(m_csSysBlk3); } else if (dlg.m_iType == 5) // cet 2013.1.5 add 增加直立型水幕 { pEquip->SetHidePipe(TRUE); pEquip->SetPipeLength(250); pEquip->SetSysBlock(_T("TWTSYS(00000542)")); } else if (dlg.m_iType == 6) // cet 2013.1.5 add 增加下垂型水幕 { pEquip->SetHidePipe(TRUE); pEquip->SetPipeLength(-250); pEquip->SetSysBlock(_T("TWTSYS(00000542)")); } else { pEquip->SetHidePipe(TRUE); pEquip->SetPipeLength(250); pEquip->SetSysBlock(m_csSysBlk1); } // if(dlg.m_iType == 2){ // pEquip->SetBlock2d(GlobalFunc::GetBlkIdByName(xsTmp2)); // pEquip->SetHidePipe(TRUE); // pEquip->SetPipeLength(250); // pEquip->SetBlock3d(GlobalFunc::GetBlkIdByName(xsTmp5)); // } // else{ // pEquip->SetBlock2d(GlobalFunc::GetBlkIdByName(xsTmp)); // if(dlg.m_iType == 0){ //上喷 // pEquip->SetHidePipe(TRUE); // pEquip->SetPipeLength(250); // pEquip->SetBlock3d(GlobalFunc::GetBlkIdByName(xsTmp4)); // } // else if(dlg.m_iType == 1){ // pEquip->SetHidePipe(FALSE); // pEquip->SetBlock3d(GlobalFunc::GetBlkIdByName(xsTmp3)); // pEquip->SetPipeLength(-250); // } // } pt.z = dlg.m_nEle * 1000; pEquip->SetLocation(pt); pEquip->SetAngle(nAng); pEquip->SetNumber(_T("CIRCLE-1")); pEquip->SetScale(g_Option::instance().g_nSprinklerRadius); pEquip->setLayer(LAY_EQUIP_SPRINKLE); pEquip->setColor(AcCmColor()); //随层 GlobalFunc::AddToCurrentSpace(pEquip, Adesk::kTrue); Entity entLast; entLast.GetLast(); GlobalFunc::WriteXdata(entLast, _T("HYDRANT_RADIUS"), dlg.m_csRadius); if(i == 0) continue; XPoint p1, p2; p1 = *jig.m_pDrawEnt->m_lstPt[i-1]; p2 = pt; p1.z = dlg.m_nEle * 1000; p2.z = dlg.m_nEle * 1000; CDbPipe *pPipe = new CDbPipe; pPipe->SetPipeWeight(g_Option::instance().g_nPipeWidth[8]); pPipe->SetStartPoint(p1); pPipe->SetEndPoint(p2); pPipe->setLayer(LAY_PIPE_SPRINKLE); pPipe->setLinetype(GlobalFunc::GetPipeWireLayLineType(LAY_PIPE_SPRINKLE)); pPipe->SetDnDiameter(g_Option::instance().g_iDefaultPipeDn); pPipe->SetModelType(TPipeSys::kModel); pPipe->SetSysType(TPipeSys::kSprinkle); pPipe->SetRadius(g_Option::instance().g_nPipeRadius[8]); pPipe->setColor(AcCmColor()); //随层 GlobalFunc::AddToCurrentSpace(pPipe, Adesk::kTrue); } if(dlg.m_iMode == 1) dlg.m_iOldDist = dlg.m_iDist; dlg.DestroyWindow(); SHads_command(RTNONE); } ///////////////////////////////////////////////////////////////////////////// // CSprinklerByLineDlg dialog IMPLEMENT_DYNAMIC(CSprinklerByLineDlg, CDialog) int CSprinklerByLineDlg::m_iNum = 5; int CSprinklerByLineDlg::m_iDist = 3600; int CSprinklerByLineDlg::m_iMode = 0; int CSprinklerByLineDlg::m_iOldDist = 3600; int CSprinklerByLineDlg::m_iType = 1; double CSprinklerByLineDlg::m_nEle = 0; CSprinklerByLineDlg::CSprinklerByLineDlg(CWnd* pParent /*=NULL*/) : CDialog(CSprinklerByLineDlg::IDD, pParent),m_spinDist(100) { //{{AFX_DATA_INIT(CSprinklerByLineDlg) m_bDrawCir = FALSE; m_csRadius = _T("2.12"); m_iDist2Wall = 1400; //}}AFX_DATA_INIT } void CSprinklerByLineDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSprinklerByLineDlg) DDX_Control(pDX, IDC_EDIT_DIST2, m_editDist2Wall); DDX_Control(pDX, IDC_EDIT_DIST, m_editDist); DDX_Control(pDX, IDC_EDIT_ELE, m_editEle); DDX_Control(pDX, IDC_SPIN_DIST, m_spinDist); DDX_Check(pDX, IDC_CHECK_DRAW, m_bDrawCir); DDX_CBString(pDX, IDC_COMBO_RADIUS, m_csRadius); DDX_Text(pDX, IDC_EDIT_DIST2, m_iDist2Wall); DDX_Text(pDX, IDC_EDIT_DIST, m_iDist); DDX_Radio(pDX, IDC_RADIO_POS1, m_iType); DDX_Text(pDX, IDC_EDIT_ELE, m_nEle); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSprinklerByLineDlg, CDialog) //{{AFX_MSG_MAP(CSprinklerByLineDlg) ON_WM_CLOSE() ON_BN_CLICKED(IDC_CHECK_DRAW, OnCheckDraw) ON_EN_KILLFOCUS(IDC_EDIT_DIST, OnKillfocusEditDist) ON_EN_KILLFOCUS(IDC_EDIT_DIST2, OnKillfocusEditDist2) ON_EN_KILLFOCUS(IDC_EDIT_ELE, OnKillfocusEditEle) ON_CBN_KILLFOCUS(IDC_COMBO_RADIUS, OnKillfocusComboRadius) ON_MESSAGE(WM_ACAD_KEEPFOCUS, onAcadKeepFocus) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSprinklerByLineDlg message handlers BOOL CSprinklerByLineDlg::OnInitDialog() { CDialog::OnInitDialog(); m_editEle.SetDataType(CRealEdit::eReal); m_editDist2Wall.SetDataType(CRealEdit::eReal); m_editDist.SetDataType(CRealEdit::eReal); m_spinDist.SetRange(0,10000); OnCheckDraw(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSprinklerByLineDlg::OnClose() { CDialog::OnClose(); acedPostCommand(_T("\33\33")); } void CSprinklerByLineDlg::OnCheckDraw() { UpdateData(); CWnd *pWnd1 = GetDlgItem(IDC_COMBO_RADIUS); pWnd1->EnableWindow(m_bDrawCir); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// // 角度为负数时构造RECT不正确,这里修改一下 zxl 2014.01.08 add void ModifyRect(XRect &rect) { XPoint ptS = rect.m_ptS, ptE = rect.m_ptE; double dAng = rect.m_nAngle; double dAngle = ads_angle(ptS, ptE); dAng = dAng / 180 * PI; double dAngDst = dAng; while (fabs(dAngDst) > PI / 2) { if (dAngDst > 0) { dAngDst -= PI / 2; } else { dAngDst += PI / 2; } } if (dAngle > (PI / 2 + dAngDst + GlobalFunc::Wcs2Ucs(0.0)) && dAngle < (2 * PI + GlobalFunc::Wcs2Ucs(0.0)) && dAng < GlobalFunc::Wcs2Ucs(0.0)) { AcGeVector3d vtY(0, -1, 0); vtY = vtY.rotateBy(dAng + GlobalFunc::Wcs2Ucs(0.0), AcGeVector3d::kZAxis); AcDbLine line(ptS, ptS + vtY * 100); line.setStartPoint(ptS); line.setEndPoint(ptS + vtY * 100); XPoint pt1, pt2, ptMid; line.getClosestPointTo(ptE, pt1, Adesk::kTrue); Midpoint(ptS, ptE, ptMid); AcGeVector3d vt = ptMid - pt1; pt2 = ptMid + vt; rect.upRight = rect.lowRight; rect.lowRight = pt2; rect.lowLeft = rect.upLeft; rect.upLeft = pt1; rect.nWidth = ptS.Distance2d(pt2); rect.nHeight = ptS.Distance2d(pt1); rect.x_angle = ads_angle(ptS, pt2); rect.y_angle = ads_angle(ptS, pt1); } } CSprinklerPreview::CSprinklerPreview(CSprinklerByLineDlg *dlg, XPoint ptStart, XPoint ptEnd) { // m_dDist = 0; m_ptStart = ptStart; m_ptEnd = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg = dlg; m_pdlg2 = NULL; m_pdlg3 = NULL; m_pdlg4 = NULL; m_pdlg5 = NULL; m_pdlg6 = NULL; } CSprinklerPreview::CSprinklerPreview(CSprinklerByArcDlg *dlg, XPoint ptStart, XPoint ptEnd) { // m_dDist = 0; m_ptStart = ptStart; m_ptMid = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg6 = dlg; m_pdlg = NULL; m_pdlg2 = NULL; m_pdlg3 = NULL; m_pdlg4 = NULL; m_pdlg5 = NULL; } CSprinklerPreview::CSprinklerPreview(CSprinklerByRectDlg *dlg, XPoint ptStart, XPoint ptEnd) { // m_dDist = 0; m_ptStart = ptStart; m_ptEnd = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg2 = dlg; m_pdlg4 = NULL; m_pdlg3 = NULL; m_pdlg = NULL; m_pdlg5 = NULL; m_pdlg6 = NULL; } CSprinklerPreview::CSprinklerPreview(CSprinkIsometryDlg *dlg, XPoint ptStart, XPoint ptEnd, double nXDist, double nYDist) { // m_dDist = 0; m_ptStart = ptStart; m_ptEnd = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg3 = dlg; m_pdlg2 = NULL; m_pdlg4 = NULL; m_pdlg5 = NULL; m_pdlg6 = NULL; m_pdlg = NULL; m_nXDist = nXDist; m_nYDist = nYDist; } CSprinklerPreview::CSprinklerPreview(CSprinklerByFreeDlg *dlg, XPoint ptStart, XPoint ptEnd) { // m_dDist = 0; m_ptStart = ptStart; m_ptEnd = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg3 = NULL; m_pdlg2 = NULL; m_pdlg5 = NULL; m_pdlg6 = NULL; m_pdlg = NULL; m_pdlg4 = dlg; m_bNeedText = TRUE; } CSprinklerPreview::CSprinklerPreview(CSprinklerBySectionDlg *dlg, XPoint pt1, XPoint pt2, XPoint pt3) { m_pDrawLine = NULL; m_pDrawRect = NULL; m_ptStart = pt1; m_ptEnd = pt2; m_ptMid = pt3; m_pdlg5 = dlg; m_pdlg3 = NULL; m_pdlg2 = NULL; m_pdlg6 = NULL; m_pdlg4 = NULL; m_pdlg = NULL; // m_dDist = 0; } CSprinklerPreview::CSprinklerPreview(XPoint ptStart, XPoint ptEnd) { m_ptStart = ptStart; m_ptEnd = ptEnd; m_pDrawLine = NULL; m_pDrawRect = NULL; m_pdlg3 = NULL; m_pdlg2 = NULL; m_pdlg = NULL; m_pdlg4 = NULL; m_pdlg5 = NULL; m_pdlg6 = NULL; m_bNeedText = TRUE; // m_dDist = 0; } CSprinklerPreview::~CSprinklerPreview() { if(m_pDrawLine) delete m_pDrawLine; if(m_pDrawRect) delete m_pDrawRect; } //等距布置 BOOL GetIsometryInsPt(XPoint ptS, XPoint ptE, double nXDist, double nYDist, double nAngle, double row_dist, double col_dist, XPointList &lstInsPt, int &iRow, int &iCol) { // cet 2011.5.10 add 将ptS, ptE点z值设为0,防止标高不一致导致rect构造错误 ptS.z = 0; ptE.z = 0; XRect rect(ptS, ptE, nAngle); ModifyRect(rect);// 矩形构造不正确,重新构造 zxl 2014.01.08 add ads_polar(ptS, rect.x_angle, nXDist, ptS); ads_polar(ptS, rect.y_angle, nYDist, ptS); XPoint ptTmp(ptS), ptNew(ptS), ptYNew; lstInsPt.Reset(); lstInsPt.NewAppend(ptS);//第一列 iRow = 1; ads_polar(ptS, rect.y_angle, col_dist, ptYNew); double nDist = ads_distance(ptS, ptYNew); while(nDist < (rect.nHeight - nYDist)){ XPoint ptTmp2 = ptYNew; lstInsPt.NewAppend(ptYNew); ads_polar(ptTmp2, rect.y_angle, col_dist, ptYNew); nDist = ads_distance(ptTmp, ptYNew); } ads_polar(ptTmp, rect.x_angle, row_dist, ptNew); nDist = ads_distance(ptTmp, ptNew); while(nDist < (rect.nWidth - nXDist)){ iRow ++; ptTmp = ptNew; lstInsPt.NewAppend(ptNew); ads_polar(ptTmp, rect.y_angle, col_dist, ptYNew); nDist = ads_distance(ptTmp, ptYNew); iCol = 1; while(nDist < (rect.nHeight-nYDist)){ iCol ++; XPoint ptTmp2 = ptYNew; lstInsPt.NewAppend(ptYNew); ads_polar(ptTmp2, rect.y_angle, col_dist, ptYNew); nDist = ads_distance(ptTmp, ptYNew); } ads_polar(ptTmp, rect.x_angle, row_dist, ptNew); nDist = ads_distance(ptS, ptNew); } return TRUE; } // cet 2011.4.15 add double GetArcLenByChord(XArc &arc, double nChord) { double nRadius = arc.GetRadius(); double nTmp = nChord / (2.0*nRadius); nTmp = asin(nTmp) * 2.0 * nRadius; return nTmp; } // cet 2011.4.15 add // 将一段线均分N个点, 但间距是50倍数(喷淋系统) 喷头间距模数:g_iSprinklerDistMod void GetPointListSprinkler(XCurveSegment seg, int iNum, XPointList &lstPt, double nShortDist, double nDist2Wall) { // 增加对喷头间距模数的控制 int nMod1 = 100, nMod2 = 25; if (g_Option::instance().g_iSprinklerDistMod == 100) { nMod1 = 1000; nMod2 = 50; } if(seg.Is(CURVE_LINE)){ XLine line = seg.GetLine(); double angLine = ads_angle(line.StartPoint(), line.EndPoint()); double distLine = line.GetLength() / iNum / 2; // 喷头间距的一半 if(distLine < nShortDist && nShortDist > 0) // 喷头间距不小于最小间距nShortDist*2 distLine = nShortDist; // 调整喷头间距使其长度是模数的整数倍 double nTmp1 = distLine / nMod1; double nTmp2 = distLine - ((int)nTmp1)*nMod1; double nTmp3 = nTmp2 / nMod2 + 0.5; int iTmp1 = (int)nTmp3; distLine = (int)nTmp1 * nMod1 + iTmp1 * nMod2; int n = 1; XPoint ptTemp; double nFisrtDist = (line.GetLength() - distLine * (iNum-1) * 2) / 2; // 第一点距墙的距离 while(nFisrtDist > nDist2Wall){ // 距墙的距离大于最小距墙距离时,调整喷头间距值 distLine += nMod2; // 喷头间距的一半调整时相应增幅为模数的一半,以便满足喷头间距为模数的整数倍 nFisrtDist = nFisrtDist - iNum * nMod2; // 所有喷头间距调整后,第一点距墙的距离 } // zxl 2013.08.27 add 距墙的距离小于2.4米时喷头居中布置 if(line.GetLength() < 2400 && iNum == 1) nFisrtDist = line.GetLength() / 2; // 调整第一点距墙距离,使其是模数的整数倍 nTmp1 = nFisrtDist / nMod1; nTmp2 = nFisrtDist - ((int)nTmp1)*nMod1; nTmp3 = nTmp2 / (nMod2 * 2) + 0.5; iTmp1 = (int)nTmp3; nFisrtDist = (int)nTmp1 * nMod1 + iTmp1 * (nMod2 * 2); ads_polar(line.StartPoint(), angLine, nFisrtDist, ptTemp); lstPt.NewAppend(ptTemp); while(n < iNum){ ads_polar(line.StartPoint(), angLine, (2*n)*distLine + nFisrtDist, ptTemp); lstPt.NewAppend(ptTemp); n++; } } else if(seg.Is(CURVE_ARC)){ XArc arc = seg.GetArc(); nShortDist = nShortDist*2; XPoint ptStart, ptEnd; arc.GetStartPoint(ptStart); arc.GetEndPoint(ptEnd); double distLine = arc.GetLength() / iNum; // 喷头间距 // 调整喷头间距使其长度是模数的整数倍 double nTmp1 = distLine / nMod1; double nTmp2 = distLine - ((int)nTmp1)*nMod1; double nTmp3 = nTmp2 / (nMod2 * 2) + 0.5; int iTmp1 = (int)nTmp3; distLine = (int)nTmp1 * nMod1 + iTmp1 * (nMod2 * 2); // 当距墙距离大于最小值时,调整喷头间距并且喷头间距必须是模数的整数倍 int n = 1; XPoint ptTemp; double nFisrtDist = (arc.GetLength() - distLine * (iNum-1)) / 2; // 第一点距墙距离 while(nFisrtDist > nDist2Wall){ distLine += nMod2 * 2; // 保证喷头间距是模数的整数倍 nFisrtDist = nFisrtDist - iNum*nMod2; } // 调整第一点距墙距离,使其是模数的整数倍 nTmp1 = nFisrtDist / nMod1; nTmp2 = nFisrtDist - ((int)nTmp1)*nMod1; nTmp3 = nTmp2 / (nMod2 * 2) + 0.5; iTmp1 = (int)nTmp3; nFisrtDist = (int)nTmp1 * nMod1 + iTmp1 * (nMod2 * 2); nFisrtDist = GetArcLenByChord(arc, nFisrtDist); AcDbArc *pArc=new AcDbArc; pArc->setCenter(arc.GetCenterPt()); pArc->setRadius(arc.GetRadius()); pArc->setStartAngle(arc.GetStarAngle()); pArc->setEndAngle(arc.GetEndAngle()); pArc->getPointAtDist(nFisrtDist, ptTemp); lstPt.NewAppend(ptTemp); distLine = GetArcLenByChord(arc, distLine); if(distLine > 0.001){ while(distLine > 0.001 && n < iNum){ pArc->getPointAtDist(n*distLine + nFisrtDist, ptTemp); lstPt.NewAppend(ptTemp); n++; } } delete pArc; } } //矩形布置 BOOL GetRectInsPt(XPoint ptS, XPoint ptE, double nAngle, int row_num, int col_num, XPointList &lstInsPt, double nShortDist, double nDist2Wall) { lstInsPt.Reset(); XRect rect(ptS, ptE, nAngle); ModifyRect(rect);// 矩形构造不正确,重新构造 zxl 2014.01.08 add XLine line(rect.upLeft, rect.lowLeft, 1); XCurveSegment seg; XPointList lstPt; seg = line; // cet 2011.4.15 add 增加对喷头间距模数的控制 //GlobalFunc::GetPointList(seg, row_num, lstPt, nShortDist, nDist2Wall); GetPointListSprinkler(seg, row_num, lstPt, nShortDist, nDist2Wall); if(lstPt.Length() != row_num) return FALSE; for(int i=0;i 1000000 || rect.nWidth > 1000000) { double dd = 0; } XLine line(rect.upLeft, rect.lowLeft, 1); XCurveSegment seg; XPointList lstPt; seg = line; // cet 2011.4.15 add 增加对喷头间距模数的控制 //GlobalFunc::GetPointList(seg, row_num, lstPt, nShortDist, nDist2Wall); GetPointListSprinkler(seg, row_num, lstPt, nShortDist, nDist2Wall); lstPtRow.NewAppend(rect.upLeft); // cet 2011.4.15 add 增加对喷头间距模数的控制 //GlobalFunc::GetPointList(seg, row_num, lstPtRow, nShortDist, nDist2Wall); GetPointListSprinkler(seg, row_num, lstPtRow, nShortDist, nDist2Wall); lstPtRow.NewAppend(rect.lowLeft); if(lstPt.Length() != row_num) return FALSE; for(int i=0;i 0) iNum ++; /* cet 2011.5.110 modify 返回值需随模数值变化而变化 if(seg.Is(CURVE_LINE)){ XLine line = seg.GetLine(); double angLine = ads_angle(line.GetStartPoint(), line.GetEndPoint()); double distLine = line.GetLength() / iNum; if(distLine < nShortDist) distLine = nShortDist; double nTmp1 = distLine / 100; double nTmp2 = distLine - ((int)nTmp1)*100; double nTmp3 = nTmp2 / 50 + 0.5; int iTmp1 = (int)nTmp3; distLine = (int)nTmp1 * 100 + iTmp1 * 50; int n = 1; XPoint ptTemp; double nFisrtDist = (line.GetLength() - distLine * (iNum-1)) / 2; while(nFisrtDist > nDist2Wall){ distLine += 50; nFisrtDist = nFisrtDist - iNum*25; if(distLine > iDist){ iNum ++; break; } } } */ // 增加对喷头间距模数的控制 int nMod1 = 100, nMod2 = 50; if (g_Option::instance().g_iSprinklerDistMod == 100) { nMod1 = 1000; nMod2 = 100; } if (seg.Is(CURVE_LINE)) { XLine line = seg.GetLine(); double angLine = ads_angle(line.GetStartPoint(), line.GetEndPoint()); double distLine = line.GetLength() / iNum; if(distLine < nShortDist) distLine = nShortDist; double nTmp1 = distLine / nMod1; double nTmp2 = distLine - ((int)nTmp1)*nMod1; double nTmp3 = nTmp2 / nMod2 + 0.5; int iTmp1 = (int)nTmp3; distLine = (int)nTmp1 * nMod1 + iTmp1 * nMod2; int n = 1; XPoint ptTemp; double nFisrtDist = (line.GetLength() - distLine * (iNum-1)) / 2; while(nFisrtDist > nDist2Wall) { distLine += nMod2; nFisrtDist = nFisrtDist - iNum*(nMod2*0.5); if(distLine > iDist) { iNum ++; break; } } } // if(seg.Length() / iNum < 2400) sr 2009-4-14 删除 长3800,需要布置2列 // iNum --; if(seg.GetLength() < 200) //规范规定,喷头距墙至少100 sr 2009-4-14 iNum = 0; return iNum; } Adesk::Boolean CSprinklerPreview::subWorldDraw(AcGiWorldDraw *pWd) { double nSprinklerRadius(1); // if(g_bEquipByScale) nSprinklerRadius = g_Option::instance().g_nSprinklerRadius *GlobalFunc::DocGetPScale()/100; // else // nSprinklerRadius = g_nSprinklerRadius; if(m_pdlg != NULL){ //两点均布 if(m_pDrawLine) delete m_pDrawLine; XLine line(m_ptStart, m_ptEnd, 1); XCurveSegment seg; m_lstPt.Reset(); seg = line; m_pdlg->UpdateData(TRUE); if(!pWd->isDragging()){ m_pDrawLine = new AcDbLine(m_ptStart, m_ptEnd); m_pDrawLine->worldDraw(pWd); } double nShortDist(1200); double nDist2Wall = m_pdlg->m_iDist2Wall-20; int iDist = m_pdlg->m_iDist; int num = GetCurvePartNum(seg, iDist, nDist2Wall); if(num < 1) return Adesk::kTrue;; // cet 2011.4.15 add 增加对喷头间距模数的控制 //GlobalFunc::GetPointList(seg, num, m_lstPt, nShortDist, nDist2Wall); GetPointListSprinkler(seg, num, m_lstPt, nShortDist, nDist2Wall); //显示间距 CString csRowDist; for(int j=-1;jm_csRadius)*1000; for(int i=0;im_bDrawCir){//绘制保护范围 AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } } } else if(m_pdlg6 != NULL){//弧线布置 XArc arc(m_ptStart, m_ptEnd, m_ptMid); XCurveSegment seg; m_lstPt.Reset(); seg = arc; m_pdlg6->UpdateData(TRUE); AcDbArc arc1(arc.GetCenterPt(), arc.GetRadius(), arc.GetStarAngle(), arc.GetEndAngle()); arc1.worldDraw(pWd); if(m_pdlg6->m_iMode == 1){ //均布 GlobalFunc::GetPointList(seg, m_pdlg6->m_iNum, m_lstPt, m_pdlg6->m_iDist2Wall); } else if(m_pdlg6->m_iMode == 0){//等距 GlobalFunc::GetPointList(seg, m_pdlg6->m_dDist, m_lstPt); } int len = m_lstPt.Length(); double nProtect = _tstof(m_pdlg6->m_csRadius)*1000; for(int i=0;im_bDrawCir){//绘制保护范围 AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } } } else if(m_pdlg2 != NULL){//矩形布置或菱形布置 double nDist1(0), nDist2(0); if(m_pDrawRect) delete m_pDrawRect; m_lstPt.Reset(); m_pdlg2->UpdateData(TRUE); double dAngle = m_pdlg2->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)); m_ptStart.z = 0; m_ptEnd.z =0; XRect rect(m_ptStart, m_ptEnd, dAngle); ModifyRect(rect);// 矩形构造不正确,重新构造 zxl 2014.01.08 add // m_ptStart.z = 0; cet 2011.5.10 modify 移到rect前避免起始点标高不一致导致构造的rect错误 // m_ptEnd.z =0; XPoint p1 = rect.lowLeft; XPoint p2 = rect.lowRight; XPoly2D poly; rect.AsPoly2D(poly); m_pDrawRect = new AcDbPolyline; GlobalFunc::PolyConvert(poly, *m_pDrawRect); m_pDrawRect->worldDraw(pWd); int iRow(0), iCol(0); double nShortDist(0); double nDist2Wall = m_pdlg2->m_nDist2Wall-0;//sr 2009-3-12 把-20 改为 -0 ,不记得当初为什么-20 if(m_pdlg2->m_iType == 0){ iRow = m_pdlg2->m_iRow; iCol = m_pdlg2->m_iCol; } else{ //根据最大间距(对话框),最小间距2.4米确定行列数 nShortDist = m_pdlg2->m_dMinDist / 2; int iColDist = m_pdlg2->m_iCol; int iRowDist = m_pdlg2->m_iRow; XLine line1(rect.lowLeft, rect.lowRight); XCurveSegment seg1; seg1 = line1; iCol = GetCurvePartNum(seg1, iColDist, nDist2Wall); XLine line2(rect.upLeft, rect.lowLeft); XCurveSegment seg2; seg2 = line2; iRow = GetCurvePartNum(seg2, iRowDist, nDist2Wall); if(iRow > 1000) { iRow = 1; } if(iCol > 1000) iCol = 1; // 无法划分时直接返回 cet 2012.12.19 add if (iCol == 0 || iRow == 0) { return Adesk::kFalse; } } XPointList lstPt, lstPt2; if(m_pdlg2->m_iMode == 0) { GetRectInsPt(m_ptStart, m_ptEnd, m_pdlg2->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)), iRow, iCol, m_lstPt, nShortDist, nDist2Wall, lstPt, lstPt2); // cet 2012.12.19 add 按行列间距布置时,考虑距墙最小间距 int nLen = lstPt2.Length(); // if (m_pdlg2->m_iType == 1 && nLen >= 3) cet 2013.4.15 modify 控制是否需要考虑距墙最小间距, x轴y轴方向均考虑 int nLen2 = lstPt.Length(); if (m_pdlg2->m_bMinDistToWall && m_pdlg2->m_iType == 1 && nLen >= 3) { double dDist1 = lstPt2[0]->Distance2d(*lstPt2[1]); double dDist2 = lstPt2[nLen - 1]->Distance2d(*lstPt2[nLen - 2]); // cet 2013.4.15 add 考虑列距墙距离 double dDist3 = lstPt[0]->Distance2d(*lstPt[1]); double dDist4 = lstPt[nLen2 - 1]->Distance2d(*lstPt[nLen2 - 2]); double dDist = m_pdlg2->m_dMinDistToWall; double dTol = 0.001; // 误差 if (GlobalFunc::DocGetCurMeterUnitDraw()) { dDist *= 0.001; } // 小于最小距墙间距 cet 2013.4.15 modify 考虑列距墙距离 if (dDist1 + dTol < dDist || dDist2 + dTol < dDist || dDist3 + dTol < dDist || dDist4 + dTol < dDist) { return Adesk::kFalse; } } } else GetDiamondInsPt(m_ptStart, m_ptEnd, m_pdlg2->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)), iRow, iCol, m_lstPt, m_pdlg2->m_iConPipe); if(m_pdlg2->m_iRow > 1 && m_pdlg2->m_iCol > 1 && m_lstPt.Length() > 3){ if(m_pdlg2->m_iMode == 0){ nDist1 = rect.nWidth / iCol; nDist2 = rect.nHeight / iRow; } else{ if(m_pdlg2->m_iConPipe == 0){ //行接管 nDist1 = rect.nWidth / (iCol - 0.5); nDist2 = rect.nHeight / iRow; } else if(m_pdlg2->m_iConPipe == 1){//列接管 nDist1 = rect.nWidth / iCol; nDist2 = rect.nHeight / (iRow - 0.5); } } } //显示间距 int len = m_lstPt.Length(); CString csRowDist; double nDist4(0); for(int j=0;jm_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)) + rect.y_angle, nDist3/2, ptTmp1); csRowDist.Format(_T("%.0f"), nDist3); AcDbText text; text.setRotation(m_pdlg2->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0))); text.setHeight(350); text.setTextString(csRowDist); text.setTextStyle(GlobalFunc::GetTextStyleId(_T("STANDARD"))); text.setPosition(ptTmp1); text.worldDraw(pWd); } for(j=0;jm_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)) + rect.x_angle, nDist3/2, ptTmp1); ads_polar(ptTmp1, rect.y_angle, -nDist4, ptTmp1); csRowDist.Format(_T("%.0f"), nDist3); AcDbText text; text.setRotation(m_pdlg2->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0))); text.setHeight(350); text.setTextString(csRowDist); text.setTextStyle(GlobalFunc::GetTextStyleId(_T("STANDARD"))); text.setPosition(ptTmp1); text.worldDraw(pWd); } //显示喷头&保护圆 double nProtect = _tstof(m_pdlg2->m_csRadius) * 1000; for(int i=0;im_bDrawCir){//绘制保护范围 AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } } } else if(m_pdlg3 != NULL){//等距布置喷头 m_pdlg3->UpdateData(TRUE); int iRow, iCol; GetIsometryInsPt(m_ptStart, m_ptEnd, m_pdlg3->m_nRow2Wall, m_pdlg3->m_nCol2Wall, m_pdlg3->m_nAngle + GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0)), m_pdlg3->m_nXDist, m_pdlg3->m_nYDist, m_lstPt, iRow, iCol); int len = m_lstPt.Length(); double nProtect = _tstof(m_pdlg3->m_csRadius) * 1000; for(int i=0;im_bDrawCir){ AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } } } else if(m_pdlg5 != NULL){//扇形布置喷头 XArc arc(m_ptStart, m_ptMid, m_ptEnd); AcDbArc arc2(arc.GetCenterPt(), arc.GetRadius(), arc.GetStarAngle(), arc.GetEndAngle()); arc2.worldDraw(pWd); XPoint pt1, pt2, pt3, pt4; ads_polar(arc.GetCenterPt(), arc.GetStarAngle(), arc.GetRadius() - m_nRadius, pt1); ads_polar(arc.GetCenterPt(), arc.GetEndAngle(), arc.GetRadius() - m_nRadius, pt2); ads_polar(arc.GetCenterPt(), arc.GetStarAngle(), arc.GetRadius(), pt3); ads_polar(arc.GetCenterPt(), arc.GetEndAngle(), arc.GetRadius(), pt4); if(arc.GetRadius() > m_nRadius){ AcDbArc arc3(arc.GetCenterPt(), arc.GetRadius() - m_nRadius, arc.GetStarAngle(), arc.GetEndAngle()); arc3.worldDraw(pWd); AcDbLine l1(pt3, pt1); l1.worldDraw(pWd); AcDbLine l2(pt4, pt2); l2.worldDraw(pWd); } else{ AcDbLine l1(pt3, arc.GetCenterPt()); l1.worldDraw(pWd); AcDbLine l2(pt4, arc.GetCenterPt()); l2.worldDraw(pWd); } m_pdlg5->UpdateData(TRUE); //确定行、列数 int iRow(0), iCol(0); double nShortDist(1200); double nDist2Wall = m_pdlg5->m_nDist2Wall-20; iRow = (int)(m_nRadius / m_pdlg5->m_iRow); if(m_nRadius / m_pdlg5->m_iRow - iRow > 0) iRow ++; double nTmp = m_nRadius / iRow / 2; XArc arc4(arc.GetCenterPt(), arc.GetRadius() - nTmp, arc.GetStarAngle(), arc.GetEndAngle()); iCol = (int)(arc4.GetLength() / m_pdlg5->m_iCol); if(arc4.GetLength() / m_pdlg5->m_iCol - iCol > 0) iCol ++; double nDist1 = arc4.GetLength() / iCol; double nDist2 = m_nRadius / iRow; // zxl 2013.08.26 modify // if(nDist1 < 2400)//如果小于2.4米,调整行列数,首先满足规范最小间距 // iCol --; // if(nDist2 < 2400) // iRow --; if (nDist1 < 200) { iCol = 0;//规范规定,喷头距墙至少100 m_lstPt.Reset(); } if (nDist2 < 200) { iRow = 0; m_lstPt.Reset(); } if(iCol < 1 || iRow < 1 ) return Adesk::kTrue; XPointList lstPt2; GetSectorInsPt(arc, m_nRadius, iRow, iCol, m_lstPt, nShortDist, nDist2Wall , m_pdlg5->m_lstPt, lstPt2); m_pdlg5->m_iRowNum = iRow; m_pdlg5->m_iColNum = iCol; m_pdlg5->m_nRadius = m_nRadius; // cet 2011.5.25 add 获得标注点 m_pdlg5->m_lstColPt = m_pdlg5->m_lstPt; m_pdlg5->m_lstRowPt = lstPt2; //显示间距 int len = m_lstPt.Length(); CString csRowDist; double nDist4(0); for(int j=0;jm_lstPt.Length()-1;j++){ XPoint ptTmp1 = *m_pdlg5->m_lstPt[j]; XPoint ptTmp2 = *m_pdlg5->m_lstPt[j+1]; double nDist3 = ads_distance(ptTmp1, ptTmp2); XLine line(ptTmp1, ptTmp2); line.MidPoint(ptTmp1); csRowDist.Format(_T("%.0f"), nDist3); AcDbText text; text.setRotation(GlobalFunc::Radian2Angle(GlobalFunc::Ucs2Wcs(0.0))); text.setHeight(350); text.setTextString(csRowDist); text.setTextStyle(GlobalFunc::GetTextStyleId(_T("STANDARD"))); text.setPosition(ptTmp1); text.worldDraw(pWd); } for(j=0;jm_csRadius) * 1000; for(int i=0;im_bDrawCir){ AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } } } else{ // if(m_dDist > 0){//两点定距 // if(m_pDrawLine) // delete m_pDrawLine; // XLine line(m_ptStart, m_ptEnd, 1); // XCurveSegment seg; // m_lstPt.Reset(); // seg = line; // if(!pWd->isDragging()){ // m_pDrawLine = new AcDbLine(m_ptStart, m_ptEnd); // m_pDrawLine->worldDraw(pWd); // } // GlobalFunc::GetPointList(seg, m_dDist, m_lstPt); // int len = m_lstPt.Length(); // // for(int i=0;im_bDrawCir){//绘制保护范围 double nProtect = _tstof(m_pdlg4->m_csRadius) * 1000; AcDbCircle cir2(pt, AcGeVector3d::kZAxis, nProtect); cir2.worldDraw(pWd); } double nDist = ads_distance(m_ptStart, m_ptEnd); double nAng = ads_angle(m_ptStart, m_ptEnd); XPoint ptText; if (nAng > PI/2 && nAng <= PI+PI/2) ads_polar(m_ptStart, nAng, nDist/2+300, ptText); else ads_polar(m_ptStart, nAng, nDist/2-300, ptText); ads_polar(ptText, nAng+PI/2, 100, ptText); if (nAng > PI/2 && nAng <= PI+PI/2) { ads_polar(ptText, nAng-PI/2, 100*2, ptText); nAng += PI; } if(m_bNeedText){ CString csDist; csDist.Format(_T("%.0f"), nDist); AcDbText text; text.setRotation(nAng); text.setHeight(3.5*GlobalFunc::DocGetPScale()); text.setTextString(csDist); text.setTextStyle(GlobalFunc::GetTextStyleId(_T("STANDARD"))); text.setPosition(ptText); text.setAlignmentPoint(ptText); text.worldDraw(pWd); } // } } return Adesk::kTrue; } TSprinklerJig::TSprinklerJig(XPoint pt1) { m_ptStart = pt1; m_ptEnd = pt1; m_iPipeType = 0; m_nDist = 0; m_nLockAng =-1; m_pDrawEnt = new CSprinklerPreview(m_ptStart, m_ptEnd); } TSprinklerJig::TSprinklerJig(CSprinklerByLineDlg *dlg, XPoint pt1) { m_ptStart = pt1; m_ptEnd = pt1; m_nDist = 0; m_nLockAng =-1; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd); } TSprinklerJig::TSprinklerJig(CSprinklerByArcDlg *dlg, XPoint pt1, XPoint pt2) { m_ptStart = pt1; m_ptEnd = pt2; m_nDist = 0; m_nLockAng =-1; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd); } TSprinklerJig::TSprinklerJig(CSprinklerByFreeDlg *dlg, XPoint pt1) { m_ptStart = pt1; m_ptEnd = pt1; m_nDist = 0; m_nLockAng =-1; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd); } TSprinklerJig::TSprinklerJig(CSprinklerBySectionDlg *dlg, XPoint pt1, XPoint pt2, XPoint pt3) { m_ptStart = pt1; m_ptEnd = pt2; m_nDist = 0; m_ptMid = pt3; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd, m_ptMid); } TSprinklerJig::TSprinklerJig(CSprinklerByRectDlg *dlg, XPoint pt1) { m_ptStart = pt1; m_ptEnd = pt1; m_nDist = 0; m_nLockAng =-1; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd); } TSprinklerJig::TSprinklerJig(CSprinkIsometryDlg *dlg, XPoint pt1, double nXDist, double nYDist) { m_ptStart = pt1; m_ptEnd = pt1; m_nDist = 0; m_nLockAng = -1; m_pDrawEnt = new CSprinklerPreview(dlg, m_ptStart, m_ptEnd, nXDist, nYDist); } TSprinklerJig::~TSprinklerJig() { if(m_pDrawEnt) delete m_pDrawEnt; } void TSprinklerJig::SetStartPoint(XPoint pt) { m_ptStart = pt; m_pDrawEnt->m_ptStart = m_ptStart; } void TSprinklerJig::SetDist(double dDist) { m_nDist = dDist; // if(dDist < 0){//两点均布 // m_pDrawEnt->m_dDist = fabs(dDist); // m_nDist = 0; // } } AcEdJig::DragStatus TSprinklerJig::GetPoint(XPoint &pt) { if(m_nLockAng > -1) return acquirePoint(pt); if(!!m_ptMid){ //扇形布置 XArc arc(m_ptStart, m_ptMid, m_ptEnd); XPoint ptBase; arc.MidPoint(ptBase); AcGePoint3d ptBase2 = asPnt3d(ptBase); return acquirePoint(pt, ptBase2); } return acquirePoint(pt, m_ptStart.AsAcGePoint3d()); } int TSprinklerJig::DoIt(int *keyIndex) { int nRet = TSymbEdJig::DoIt(keyIndex); return nRet; } XPoint TSprinklerJig::GetCorrectPt() { XPoint ptTmp = m_ptResult; if(m_nLockAng > -1){ // m_ptRef = XPoint(); XPoint ptTmp2 = m_ptStart; ptTmp2.z = 0; double nAngle = ads_angle(ptTmp2, m_ptResult) - m_nLockAng; double nDist = ads_distance(ptTmp2, m_ptResult); if(nAngle > PI/2 && nAngle < PI/2*3) ads_polar(m_ptStart, m_nLockAng, -nDist, ptTmp); else ads_polar(m_ptStart, m_nLockAng, nDist, ptTmp); } return ptTmp; } // 更新实体数据 Adesk::Boolean TSprinklerJig::update() { Adesk::Boolean bRet=Adesk::kTrue; if(!!m_ptMid){ //扇形布置 XArc arc(m_ptStart, m_ptMid, m_ptEnd); XPoint ptBase; arc.MidPoint(ptBase); double nDist = ads_distance(arc.GetCenterPt(), m_ptResult); double nDist2 = ads_distance(ptBase, m_ptResult); if(nDist < arc.GetRadius() && nDist2 < arc.GetRadius()) nDist = arc.GetRadius() - nDist; else nDist = arc.GetRadius(); m_pDrawEnt->m_nRadius = nDist; } else{ XPoint ptTmp = m_ptResult; if(m_nLockAng > -1){ ptTmp = GetCorrectPt(); } if(m_nDist > 1){ double nAng = ads_angle(m_ptStart, ptTmp); ads_polar(m_ptStart, nAng, m_nDist, ptTmp); m_pDrawEnt->m_bNeedText = FALSE; } else m_pDrawEnt->m_bNeedText = TRUE; m_ptResult = ptTmp; m_pDrawEnt->m_ptEnd = ptTmp; } return bRet; } AcDbEntity* TSprinklerJig::entity() const { return (AcDbEntity *)m_pDrawEnt; } void CSprinklerByLineDlg::OnKillfocusEditDist() { double dData = m_iDist; CString sText; m_editDist.GetWindowText(sText); m_iDist = _tstof(sText); if (m_iDist <= 0 || !GlobalFunc::IsStrAllNum(sText) || sText.Find(_T('.')) > 0) { m_iDist = dData; UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); m_editDist.SetFocus(); m_editDist.SetSel(0, -1); } } void CSprinklerByLineDlg::OnKillfocusEditDist2() { double dData = m_iDist2Wall; CString sText; m_editDist2Wall.GetWindowText(sText); m_iDist2Wall = _tstof(sText); if (m_iDist2Wall <= 0 || !GlobalFunc::IsStrAllNum(sText) || sText.Find(_T('.')) > 0) { m_iDist2Wall = dData; UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); m_editDist2Wall.SetFocus(); m_editDist2Wall.SetSel(0, -1); } } void CSprinklerByLineDlg::OnKillfocusEditEle() { double dData = m_nEle; CString sText; m_editEle.GetWindowText(sText); m_nEle = _tstof(sText); if (sText.IsEmpty() || !GlobalFunc::IsStrAllNum(sText)) { m_nEle = dData; UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); m_editEle.SetFocus(); m_editEle.SetSel(0, -1); } } void CSprinklerByLineDlg::OnKillfocusComboRadius() { CString csData = m_csRadius; CEdit *pWnd = (CEdit *)GetDlgItem(IDC_COMBO_RADIUS); if (pWnd == NULL) { return; } CString sText; pWnd->GetWindowText(sText); double dNewData = _tstof(sText); if (dNewData <= 0 || !GlobalFunc::IsStrAllNum(sText)) { m_csRadius = csData; UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); pWnd->SetFocus(); pWnd->SetSel(0, -1); } } LONG_PTR CSprinklerByLineDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR) { POINT pt; ::GetCursorPos(&pt); CRect rect; GetWindowRect(&rect); if (!(rect.PtInRect(pt))) { return FALSE; } return TRUE; }