// HydrantPlanDlg.cpp : implementation file // #include "stdafx.h" #include #include //#include //#include #include "XBlock.h" //#include "cbclass.h" #include "DrawStandPipeDlg.h" #include "HydrantPlanDlg.h" #include "InsBlockDlg.h" #include "SelectBlkDlg.h" #include "EditWaterBucketDlg.h" #include "ProtectRadiusDlg.h" #include "jig.h" #include "DbFireExtinguisher.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //#ifdef _WIN64 #include"TGAs.h" //#endif //*************************************************************************************************** // 保护半径 //*************************************************************************************************** void UnionPoly(DList &lstPolyThis) { if(lstPolyThis.Length() >1){ XPoly2D poly1 = *lstPolyThis[0]; DList lstPolyThis3; lstPolyThis3.Append(new XPoly2D(poly1)); DList lstPolyThis4; for(int nn=1;nn"), entPoly, rbMask2) == RTNORM) { XPoly2D poly(entPoly); poly.TransUCS(Groups(0), Groups(1)); RBList rbFence = poly.Fence(); XPoint ptLow, ptUp; poly.GetExtend(ptLow, ptUp); AssureInCurrentView(Ucs2Wcs(ptLow), Ucs2Wcs(ptUp)); ss.Get(_T("CP"), rbFence, NULL, rbMask); CString sNot; sNot.Format(_T("\n共得到%d个设备"),ss.Length()); acutPrintf(sNot); } } void ShowProtectRadius() { RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T(""), //支持消防附件 zxl 2011.10.20 add -4, _T(""), // 支持灭火器 cet 2013.4.22 add -4, _T("or>"), NULL); PickSet ss(SS_FREE), ssDel(SS_FREE), ssFire(SS_FREE), ssHydrant(SS_FREE), ssSprinkle(SS_FREE); TCHAR cRet; int ret(0); while (true)//添加循环,控制用户交互 zxl 2011.10.20 add { INITGET_BEG(0, _T("P R")); ret = SelectEntities(_T("\n请选择要显示的消火栓、灭火器或喷头范围{选取闭合PLINE(P)/修改保护半径(R)}:<整张图>"), ss, rbMask, _T("P R"), cRet); INITGET_END(); // zxl 2011.12.01 modify // INITGET_BEG(0, _T("P R S")); // ret = SelectEntities(_T("\n请选择要显示的消火栓或灭火器[选取闭合PLINE(P)/修改保护半径(R)/显示喷头保护半径(S)]:<整张图>"), ss, rbMask, _T("P R S"), cRet); // INITGET_END(); // if(ret == RTKWORD){ // if(cRet == _T('R')){ // PickSet ssSel(SS_FREE); // if(SelectEntities(_T("\n请选择要修改的消防设备<退出>:"), ssSel, rbMask) != RTNORM) // return; // double nNew(0); // ads_getreal(_T("\n请输入新的保护半径(m)<退出>"), &nNew); // if(nNew <0.001) // return; // long len = ssSel.Length(); // for(long j=0;j"), //添加消防附件 zxl 2011.10.18 add // -4, _T(""), // -4, _T(""), // -4, _T("or>"), NULL); // // if(SelectEntities(_T("\n请选择要显示的消火栓或灭火器或喷头:<退出>"), ss, rbMask2) != RTNORM) // // return; // // //增加pline线选取功能 zxl 2011.10.18 modify // TCHAR cRets; // int nRet(0); // INITGET_BEG(0, _T("P")); // nRet = SelectEntities(_T("\n请选择要显示的消火栓或灭火器或喷头[闭合PLINE选取(P)]:<退出>"), ss, rbMask2, _T("P"), cRets); // INITGET_END(); // if (cRets == _T('P')) // { // GetEquipmentFromPline(ss, rbMask2); // } // else if (nRet != RTNORM) // { // return; // } // } // else // zxl 2011.10.18 add // { // GetEquipmentFromPline(ss, rbMask); // } // } if (ret == RTKWORD) { if (cRet == _T('P')) { GetEquipmentFromPline(ss, rbMask); } else if (cRet == _T('R')) { PickSet ssSel(SS_FREE); if(SelectEntities(_T("\n请选择要修改的消防设备<退出>:"), ssSel, rbMask) != RTNORM) return; double nNew(0); ads_getreal(_T("\n请输入新的保护半径(m)<退出>"), &nNew); if(nNew <0.001) return; long len = ssSel.Length(); for(long j=0;j 0) { break; } } // cet 2012.6.4 add 断管符号 AcDbObjectId id = GetBlockIdFromString(_T("$TwtSys$00000132")); //zxl 2011.12.01 modify 单独显示消火栓、灭火器、喷头的保护半径 for (long l = 0; l < ss.Length(); l++) { Entity entTmp = ss[l]; XPoint ptEqLoc; OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) { // cet 2012.6.4 add 断管符号除外 if (id == pEquip->GetBlock2d()) { continue; } CString sLayer = pEquip->layer(); if (sLayer.Compare(LAY_EQUIP_SPRINKLE) == 0) { ssSprinkle += entTmp; } else if (sLayer.Compare(LAY_EQUIP_HYDRANT) == 0) { ssHydrant += entTmp; } else if (sLayer.Compare(LAY_TWT_EXTINGUISHER) == 0) { ssFire += entTmp; } } OPENOBJ_END(); // 支持灭火器 cet 2013.4.22 add if (entTmp.Is(_T("INSERT"))) { ssFire += entTmp; } } CProtectRadiusDlg dlg; dlg.Create(IDD_PROTECT_RADIUS); int iIndex = 0; int nType = 0; double dUint(1); if(!DocGetMeterUnitDraw()) dUint = 1000; adsout << _T("红色是喷淋保护范围,白色是消火栓或灭火器保护范围!"); while(true) { PickSet ssSel(SS_FREE); if (iIndex > 0)//初次进入循环顺序显示保护半径 { PickSet ss; dlg.m_bModify = false; dlg.UpdateData(TRUE); ret = SelectEntities(_T(""),ss, rbMask); nType = dlg.m_nShowType; if (ret == RTERROR && dlg.m_bModify) { if (nType == 0) { ssSel += ssHydrant; } else if (nType == 1) { ssSel += ssFire; } else if (nType == 2) { ssSel += ssSprinkle; } else if (nType == 4) { dlg.ShowWindow(FALSE); break; } else if(nType == 3) { ssDel.Erase(); dlg.DestroyWindow(); PickSet ssSel(SS_FREE); if(SelectEntities(_T("\n请选择要修改的消防设备<退出>:"), ssSel, rbMask) != RTNORM) return; double nNew(0); ads_getreal(_T("\n请输入新的保护半径(m)<退出>"), &nNew); if(nNew < 0.001) return; long len = ssSel.Length(); for(long j=0;jSetProtectRadius(nNew); } OPENOBJ_END(); } break; } ssDel.Erase(); } else if (ret != RTNORM) { ssDel.Erase(); dlg.DestroyWindow(); break; } } else { iIndex++; ssSel += ssHydrant; dlg.m_nShowType = 0; if (ssHydrant.Length() == 0) { ssSel += ssFire; dlg.m_nShowType = 1; if (ssFire.Length() == 0) { ssSel += ssSprinkle; dlg.m_nShowType = 2; } } dlg.ShowWindow(TRUE); dlg.UpdateData(FALSE); nType = dlg.m_nShowType; } DList lstPoly1; int itype = -1; long len = ssSel.Length(); for(long i=0;iGetLocation(); // } // OPENOBJ_END(); if (entTmp.Is(_T("ATS_EQUIPMENT"))) { OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip != NULL) { ptEqLoc = pEquip->GetLocation(); } OPENOBJ_END(); // 支持灭火器新实体 zxl 2014.02.10 add OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbFireExtinguisher, pFire); if(pFire != NULL) { double dRadius = pFire->GetProtectRadius(); csCir.Format(_T("%.0f"), dRadius); double dScale = pFire->GetScale(); if (pFire->GetScaleType() == 0) { dScale *= (pFire->GetPScale() / 100); } AcGeScale3d scale(dScale); double dWidth = 0.0, dHeight = 0.0; AcGePoint3d ptIns = AcGePoint3d::kOrigin; AcDbBlockReference blkRef(ptIns, pFire->GetBlock2d()); blkRef.setScaleFactors(scale); AcDbExtents extent; blkRef.getGeomExtents(extent); AcGePoint3d ptMin = extent.minPoint(); AcGePoint3d ptMax = extent.maxPoint(); dWidth = ptMax.x - ptMin.x; dHeight = ptMax.y - ptMin.y; //插入点 ptIns = pFire->GetLocation(); AcGePoint3dArray arrPts; if (pFire->GetLayType() == 0) // 按数量进行布置并标注规格 { // 图块出入点 int nMod = pFire->GetNum() % 2; if (nMod == 1) // 奇数个灭火器 { arrPts.append(ptIns); } int nNum = pFire->GetNum(); nNum /= 2; AcGeVector3d vtDir = AcGeVector3d::kXAxis; vtDir.rotateBy(pFire->GetAngle(), AcGeVector3d::kZAxis); double dDist = 0.0; for (int i = 0; i < nNum; ++i) { if (i == 0 && nMod == 0) { dDist += dWidth * 0.5; } else { dDist += dWidth; } arrPts.append(ptIns + vtDir * dDist); arrPts.append(ptIns - vtDir * dDist); } } else { arrPts.append(ptIns); } for (int i = 0; i < arrPts.length(); i++) { XPoint pt = arrPts[i]; XCircle cir2(pt, _tstof(csCir)*dUint); XCurveSegment seg; seg = cir2; XPoly2D poly; seg.AsPoly2D(poly); lstPoly1.Append(new XPoly2D(poly)); cir2.Make(); Entity entCir2; entCir2.GetLast(); if(IsSprinkler(entTmp)){ entCir2.SetData(62, 1); entCir2.Modify(); } ssDel += entCir2; } continue; } OPENOBJ_END(); } else if (entTmp.Is(_T("INSERT"))) { OPENOBJ_BEGIN(entTmp, AcDb::kForRead, AcDbBlockReference, pRef); if(pRef != NULL) { ptEqLoc = pRef->position(); } OPENOBJ_END(); } else { continue; } XCircle cir2(ptEqLoc, _tstof(csCir)*dUint); XCurveSegment seg; seg = cir2; XPoly2D poly; seg.AsPoly2D(poly); lstPoly1.Append(new XPoly2D(poly)); cir2.Make(); Entity entCir2; entCir2.GetLast(); if(IsSprinkler(entTmp)){ entCir2.SetData(62, 1); entCir2.Modify(); } ssDel += entCir2; } } // zxl 2011.12.02 add 添加进度条 acedSetStatusBarProgressMeter(_T("计算中..."), 0, lstPoly1.Length() - 1); for(int m=0;m lstPoly2, lstPoly3,lstDest; lstPoly2.Append(new XPoly2D(rPoly1)); lstPoly3.Append(new XPoly2D(rPoly2)); Intersect(lstPoly3,lstPoly2,lstDest); for(int j=0;jgetBlockTable(pBlockTable, AcDb::kForRead); #if ADS > 24 if(Acad::eOk != pBlockTable->getAt(szBlkName, recordId)){ #else if(Acad::eOk != pBlockTable->getAt(szBlkName, recordId, AcDb::kForRead)){ #endif pBlockTable->close(); delete pBlkRef; return FALSE; } pBlockTable->close(); pBlkRef->setBlockTableRecord(recordId); pBlkRef->setPosition(pt); pBlkRef->setRotation(nInsBlkRotate); if(bMirror) pBlkRef->setScaleFactors(AcGeScale3d(-nScale, nScale, 1)); else pBlkRef->setScaleFactors(AcGeScale3d(nScale, nScale, 1)); AcDbExtents extents; pBlkRef->getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); XPoint ptCen; ptCen[0] = (pMax[0] + pMin[0]) / 2; ptCen[1] = (pMax[1] + pMin[1]) / 2; ptCen[2] = 0; AcGeMatrix3d mat; mat.setToTranslation(AcGeVector3d(ptCen[0] - pt[0], ptCen[1] - pt[1], 0)); pt.TransformBy(mat); delete pBlkRef; return TRUE; } //*************************************************************************************************** // 连消火栓 //*************************************************************************************************** void GetAllLineByEq(Entity ent, DList &lstLine) { OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ AcDbVoidPtrArray entSet; pEquip->explode(entSet); for(int i=0;i<1;i++){ AcDbEntity *pEnt = (AcDbEntity *)entSet[i]; AcDbBlockReference *pBlkRef = NULL; if(pBlkRef = AcDbBlockReference::cast(pEnt)){ AcDbVoidPtrArray entSet2; pBlkRef->explode(entSet2); int len = entSet2.length(); for(int j=0;jstartPoint(); XPoint pE = pLine->endPoint(); pS.z = 0; pE.z = 0; XLine *line = new XLine(pS, pE); lstLine.Append(line); } } ReleaseEntSet(entSet2); } } ReleaseEntSet(entSet); } OPENOBJ_END(); } void DoLinkHydrantByUser(Entity entEq, Entity entPipe, double dEle) { int iPolarmode(0); xg_getvar(_T("AUTOSNAP"), &iPolarmode); XPushVar vOrthoMode(_T("ORTHOMODE"), 1); //f8 XPoint ptStart, ptEnd, ptJig, ptPick1, ptPick2; GetPipePoint(entPipe, ptStart, ptEnd); ptJig = ptStart; ptPick1 = ptStart; ptPick1.z = dEle; ptJig.z = 0; TPipeEdJig jig(ptJig, ptJig, 0.5); jig.SetPrompt(_T("\n请点取管线下一点或消火栓<退出>:")); jig.m_bInit = TRUE; while(1){ ptPick1.z = 0; jig.m_ptRef = ptPick1; int ret = jig.DoIt(); if(ret == RTNORM){ ptPick2 = jig.m_ptPick; //首先判断是否从设备上引出 Entity entEq = GetEquipmentByPt(ptPick2); if(!entEq){ ptPick2 = jig.GetCorrectPt(); } else{ DList lstLine; GetAllLineByEq(entEq, lstLine); int len = lstLine.Length(); double nDist(-1); for(int i=0;iSetLocation(ptPick2); } OPENOBJ_END(); ptPick1.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = (TDbPipe *)pPipe->clone(); pNewPipe->SetEndPoint(ptPick2); pNewPipe->SetStartPoint(ptPick1); pNewPipe->SetDnDiameter(65); AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); break; } ptPick1.z = dEle; ptPick2.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = (TDbPipe *)pPipe->clone(); pNewPipe->SetEndPoint(ptPick2); pNewPipe->SetStartPoint(ptPick1); pNewPipe->SetDnDiameter(65); AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); ptPick1 = ptPick2; ptJig = ptPick2; ptJig.z = 0; jig.SetStartPoint(ptJig); } else break; } xg_setvar(_T("AUTOSNAP"), iPolarmode); } extern CString GetPipeLayerByVPipeLay(const TCHAR* szLayer); void DoLinkHydrant(Entity entEq, Entity entPipe) { // RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); // RBList rbMask2(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("消防")), NULL); // Entity entPipe, entEq; // if(SelectEntity(_T("\n请选择消火栓<退出>:"), entEq, rbMask) != RTNORM) // return; // // if(SelectEntity(_T("\n请选择消防立管<退出>:"), entPipe, rbMask2) != RTNORM) // return; BOOL bIsUpLink = FALSE; OPENOBJ_BEGIN(entEq, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ double dLen = pEquip->GetPipeLength(); if(dLen > 10) bIsUpLink = TRUE; } OPENOBJ_END(); CString csLay; XPoint ptPipe; //先把立管设置一个合适的管径 OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe && pPipe->IsVertical()){ csLay = pPipe->GetLayer(); double nDn = pPipe->GetDnDiameter(); if(nDn < 50){ if(pPipe->upgradeOpen()==Acad::eOk) { pPipe->SetDnDiameter(100); pPipe->downgradeOpen(); } } ptPipe = pPipe->StartPoint(); } else return; OPENOBJ_END(); csLay = GetPipeLayerByVPipeLay(csLay); double dEle(1.1); if(bIsUpLink) { dEle = 0.8; ads_getreal(_T("\n请输入支管标高(0.8m)<退出>"), &dEle); } else ads_getreal(_T("\n请输入支管标高(1.1m)<退出>"), &dEle); dEle = dEle * 1000; ptPipe.z = 0; TCHAR szText[32]; int nRet = 0; // cet 2010.6.23 add nRet = ads_getstring(0, _T("\n系统自动就近连接消火栓: "), szText); // cet 2010.6.23 add if (nRet == RTCAN) { return; } if(_tcsicmp(szText, _T("N")) == 0) { DoLinkHydrantByUser(entEq, entPipe, dEle); return; } DList lstLine; GetAllLineByEq(entEq, lstLine);//得到消火栓图块全部线段 XPoint ptInsert, ptInt, ptPipeEnd; OPENOBJ_BEGIN(entEq, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptInsert = pEquip->GetInsert(); ptInsert.z = 0; XVector3D vt = pEquip->GetDirection(); vt.Normalize(); vt *= 1000; XPoint ptTmp; ptTmp = ptInsert + vt; XLine line1(ptInsert, ptTmp); ptPipe.Project(&line1, ptInt); XLine line2(ptPipe, ptInt); line2.SetLineFlag(1); int len = lstLine.Length(); double nDist(-1); for(int i=0;i 0) { double n = ads_distance(ptPipe, ptIntTmp); if(n < nDist || nDist < 0){ ptPipeEnd = ptIntTmp;// 有交点,立管直接接消火栓 nDist = n; } } } if(!ptPipeEnd) { //2008-12-23 SR ADD 如果没有交点,还不能确定不是直接接消火栓,再试试消火栓另外一个方向 vt = pEquip->GetDirection(); vt.Normalize(); vt.Rotate(PI/2.0); vt *= 1000; ptTmp = ptInsert + vt; XLine line4(ptInsert, ptTmp); XPoint ptInt2; ptPipe.Project(&line4, ptInt2); XLine line5(ptPipe, ptInt2); line5.SetLineFlag(1); for(int i=0;i 0) { double n = ads_distance(ptPipe, ptIntTmp); if(n < nDist || nDist < 0){ ptPipeEnd = ptIntTmp;// 有交点,立管直接接消火栓 nDist = n; } } } } XPoint ptStart, ptEnd; ptStart = ptPipe; ptStart.z = dEle; if(!!ptPipeEnd) ptEnd = ptPipeEnd; else ptEnd = ptInt; ptEnd.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = (TDbPipe *)pPipe->clone(); pNewPipe->SetEndPoint(ptEnd); pNewPipe->SetStartPoint(ptStart); pNewPipe->SetDnDiameter(65); pNewPipe->setLayer(InitLayer(csLay)); AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); if(!!ptPipeEnd) {//立管直接连接消火栓 if(pEquip->upgradeOpen()==Acad::eOk) { pEquip->SetLocation(ptEnd); pEquip->downgradeOpen(); } } else { // 2008-12-23 SR REMOVE 对于拐弯连接消火栓的,直接连接到中心而不是就近。哈市院提出2立管连接双拴 //立管需要拐一下,绘制2根管线连接消火栓 // nDist = -1; // //确定消火栓的连接点 // for(i=0;i 0) // { // double n = ads_distance(ptPipe, ptIntTmp); // if(n < nDist || nDist < 0){ // ptPipeEnd = ptIntTmp; // nDist = n; // } // } // } // if(!!ptPipeEnd) { ptStart = ptInt; ptStart.z = dEle; ptEnd = ptInsert; // ptEnd = ptPipeEnd; ptEnd.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe2 = (TDbPipe *)pPipe->clone(); pNewPipe2->setLayer(InitLayer(csLay)); pNewPipe2->SetEndPoint(ptEnd); pNewPipe2->SetStartPoint(ptStart); pNewPipe2->SetDnDiameter(65); AddToCurrentSpace(pNewPipe2, Adesk::kTrue); } OPENOBJ_END(); if(pEquip->upgradeOpen()==Acad::eOk) { ptInsert.z = ptEnd.z; pEquip->SetLocation(ptInsert); pEquip->downgradeOpen(); } } } } OPENOBJ_END(); } void LinkHydrant() { RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); RBList rbMask2(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("消防")), NULL); Entity entPipe, entEq; if(SelectEntity(_T("\n请选择消火栓<退出>:"), entEq, rbMask) != RTNORM) return; if(SelectEntity(_T("\n请选择消防立管<退出>:"), entPipe, rbMask2) != RTNORM) return; DoLinkHydrant(entEq, entPipe); } void LinkHydrant2() { RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); RBList rbMask2(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("消防")), NULL); Entity entPipe, entEq; if(SelectEntity(_T("\n请选择消防立管<退出>:"), entPipe, rbMask2) != RTNORM) return; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe && pPipe->IsVertical()){ double nDn = pPipe->GetDnDiameter(); if(nDn < 50){ if(pPipe->upgradeOpen()==Acad::eOk) { pPipe->SetDnDiameter(100); pPipe->downgradeOpen(); } } } else return; OPENOBJ_END(); double dEle(1.1); ads_getreal(_T("\n请输入支管标高(1.1m)<退出>"), &dEle); dEle = dEle * 1000; int iPolarmode(0); xg_getvar(_T("AUTOSNAP"), &iPolarmode); XPushVar vOrthoMode(_T("ORTHOMODE"), 1); //f8 XPoint ptStart, ptEnd, ptJig, ptPick1, ptPick2; GetPipePoint(entPipe, ptStart, ptEnd); ptJig = ptStart; ptPick1 = ptStart; ptPick1.z = dEle; ptJig.z = 0; TPipeEdJig jig(ptJig, ptJig, 0.5); jig.SetPrompt(_T("\n请点取管线下一点或消火栓<退出>:")); jig.m_bInit = TRUE; while(1){ ptPick1.z = 0; jig.m_ptRef = ptPick1; int ret = jig.DoIt(); if(ret == RTNORM){ ptPick2 = jig.m_ptPick; //首先判断是否从设备上引出 Entity entEq = GetEquipmentByPt(ptPick2); if(!entEq){ ptPick2 = jig.GetCorrectPt(); } else{ DList lstLine; GetAllLineByEq(entEq, lstLine); int len = lstLine.Length(); double nDist(-1); for(int i=0;iSetLocation(ptPick2); } OPENOBJ_END(); ptPick1.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = (TDbPipe *)pPipe->clone(); pNewPipe->SetEndPoint(ptPick2); pNewPipe->SetStartPoint(ptPick1); pNewPipe->SetDnDiameter(65); AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); break; } ptPick1.z = dEle; ptPick2.z = dEle; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ TDbPipe *pNewPipe = (TDbPipe *)pPipe->clone(); pNewPipe->SetEndPoint(ptPick2); pNewPipe->SetStartPoint(ptPick1); pNewPipe->SetDnDiameter(65); AddToCurrentSpace(pNewPipe, Adesk::kTrue); } OPENOBJ_END(); ptPick1 = ptPick2; ptJig = ptPick2; ptJig.z = 0; jig.SetStartPoint(ptJig); } else break; } xg_setvar(_T("AUTOSNAP"), iPolarmode); } //*************************************************************************************************** // 替换消火栓 2007-2-28 SR 取消命令 //*************************************************************************************************** void ReplaceHydrant() { RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); Entity ent; PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择需要替换的消火栓<退出>:"), ss, rbMask) != RTNORM) return; ent = ss[0L]; XPoint ptLoc; CString csBlkName, csSldName; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptLoc = pEquip->GetLocation(); AcDbObjectId id = pEquip->GetBlock2d(); csBlkName = GetBlkNameById(id); } OPENOBJ_END(); if(!ptLoc) return; csSldName = BlockName2SldName(csBlkName); CPoint ptDwgView; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptLoc, ptDwgView); acedGetAcadDwgView()->ClientToScreen(&ptDwgView); CTemporaryResourceOverride vTemp; CSelectBlkDlg dlg; dlg.m_csTkName = _T("TWTSYS"); if(_tcsicmp(csBlkName, _T("$TwtSys$00000383")) == 0 || _tcsicmp(csBlkName, _T("$TwtSys$00000386")) == 0 || _tcsicmp(csBlkName, _T("$ATTACHMENT$00000086")) == 0 || _tcsicmp(csBlkName, _T("$ATTACHMENT$00000087")) == 0) dlg.m_csType = _T("消火栓"); else dlg.m_csType = _T("平面消火栓"); dlg.m_ptBase = ptDwgView; dlg.m_staticSlide.m_csCurRecord = csSldName; if(dlg.DoModal() == IDOK){ CString csRet = dlg.m_staticSlide.m_csCurRecord; XString xsTKName, xsRocord; SplitSlbName(csRet, xsTKName, xsRocord); XString xsBlk; LoadDwbBlock(xsTKName, xsRocord, xsBlk); AcDbObjectId recordId = GetBlkIdByName(xsBlk); for(long i=0;iGetInsert(); GetBlkRecordMidPt(xsBlk, pEquip->GetScale(), ptMid, pEquip->IsMirrorByY(), pEquip->GetAngle()); pEquip->SetBlock2d(recordId); pEquip->SetLocation(ptMid); } OPENOBJ_END(); } } } //*************************************************************************************************** // 系统消火栓 //*************************************************************************************************** void InsSysHydrant() { CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp1, xsTmp2; if(LoadDwbBlock(csDwb, _T("00000386"), xsTmp1) != RTNORM) return; if(LoadDwbBlock(csDwb, _T("00000383"), xsTmp2) != RTNORM) return; XPoint ptIns, ptLoc; double nPipeHorLength(600), nPipeVerLength(400); BOOL m_bMirror = FALSE; AcGeMatrix3d mat; InitLayer(LAY_EQUIP_HYDRANT); InitPipeLayer(LAY_PIPE_FIRE); xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Wcs2Ucs(ptIns); g_csInsBlkName = xsTmp1; TBlockEdJig jig(g_csInsBlkName, ptIns, 1); int nOsMode=0; double nScale = 1; PickSet ss(SS_FREE); nOsMode |= OS_INT|OS_NEA|OS_MID; XPushVar vOsMode(_T("OSMODE"), nOsMode); int iMode = 0; //0:平接管 1: 上接管 2: 不接管 while(1){ ss.Free(); if(m_bMirror) nPipeHorLength = -fabs(nPipeHorLength); else nPipeHorLength = fabs(nPipeHorLength); if(iMode == 0) mat.setToTranslation(Ucs2Wcs(AcGeVector3d(nPipeHorLength, 0, 0))); else if(iMode == 1) mat.setToTranslation(Ucs2Wcs(AcGeVector3d(nPipeHorLength, nPipeVerLength, 0))); else mat.setToTranslation(Ucs2Wcs(AcGeVector3d(0, 0, 0))); jig.m_nSacle = nScale; jig.m_nSacleY = nScale; CString csPrompt; jig.m_bReversal = m_bMirror; jig.m_mat = mat; if(g_csInsBlkName == (const TCHAR*)xsTmp1) csPrompt = _T("\n请点取消火栓插入点[选择地面位置(W)/放大(E)/缩小(D)/左右翻转(F)/双栓(S)/平接管(1)/上接管(2)/不接管(3)]<完成>:"); else csPrompt = _T("\n请点取消火栓插入点[选择地面位置(W)/放大(E)/缩小(D)/左右翻转(F)/单栓(S)/平接管(1)/上接管(2)/不接管(3)]<完成>:"); jig.SetPrompt(csPrompt); jig.SetKeyword(_T("W E D F S 1 2 3")); int nKeyIndex = -1; int ret = jig.DoIt(&nKeyIndex); if(ret == RTKWORD){ if (nKeyIndex == 0) { RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); double nDist(1100); ads_getdist(NULL, _T("\n请输入消火栓距地面距离<1100>:"), &nDist); while (true) { if(ads_getpoint(NULL, _T("\n请点取消火栓所在地面位置:<退出>"), ptLoc) != RTNORM) return; GetPointPickSet(ptLoc, ss, rbMask, 20); ptIns = ptLoc; ptIns.y += nDist; ptIns = Ucs2Wcs(ptIns); ptLoc = Ucs2Wcs(ptLoc); if (ss.Length() > 0) { Entity entPipe = ss[0L]; XPoint ptS,ptE; GetPipePoint(entPipe, ptS, ptE); ptS = Wcs2Ucs(ptS); ptE = Wcs2Ucs(ptE); AcGeVector3d vt = ptS - ptE; AcGeTol tol; tol.setEqualVector(0.1); if (vt.isParallelTo(AcGeVector3d::kYAxis, tol)) { break; } } } } else if(nKeyIndex == 1) nScale += 0.5; else if(nKeyIndex == 2 && jig.m_nSacle > 0.5) nScale -= 0.5; else if(nKeyIndex == 3) m_bMirror = !m_bMirror; else if(nKeyIndex == 4) g_csInsBlkName = g_csInsBlkName == (const TCHAR*)xsTmp1 ? xsTmp2 : xsTmp1; else if(nKeyIndex == 5) iMode = 0; else if(nKeyIndex ==6) iMode = 1; else if(nKeyIndex == 7) iMode = 2; if (nKeyIndex != 0) { continue; } } else if(ret != RTNORM) break; if (nKeyIndex != 0) { ptIns = jig.GetPickPoint(); XPoint ptUcs = Wcs2Ucs(ptIns); RBList rbMaskPipe(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("管")), NULL); GetPointPickSet(ptUcs, ss, rbMaskPipe, 20); } if(ss.Length() > 0){ //管件插入在管线上 Entity entPipe = ss[0L]; XPoint ptStart,ptEnd; CString sLayer; OPENOBJ_BEGIN(entPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe != NULL) { sLayer = pPipe->GetLayer(); } OPENOBJ_END(); GetPipePoint(entPipe, ptStart, ptEnd); XCurveSegment seg(ptStart, ptEnd, 0); seg.ProjectToMe(ptIns, ptIns); double dAng = ads_angle(seg.GetEndPoint(), seg.GetStartPoint()); XPoint ptend, ptPipe; int itype = -1; ads_prompt(_T("\n请选择插入方向<退出>")); while(1){ struct resbuf pointbuf; int iRet = ads_grread(5, &itype, &pointbuf); ads_point_set(pointbuf.resval.rpoint, ptend); ptend = Ucs2Wcs(ptend); if(itype != 5 && itype != 3 && itype != 11) break; AcGeVector3d vectBase(seg.EndPoint().x - seg.StartPoint().x, seg.EndPoint().y - seg.StartPoint().y, 0); AcGeVector3d vectTmp(ptend.x - ptIns.x, ptend.y - ptIns.y, 0); double dAng2 = vectBase.angleTo(vectTmp, AcGeVector3d::kZAxis); if(dAng2 < PI) ads_polar(ptIns, dAng - PI/2, nPipeHorLength, ptPipe); else{ ads_polar(ptIns, dAng + PI/2, nPipeHorLength, ptPipe); } ads_redraw(NULL, 1); if(itype == 3 || itype == 11){ XPoint ptInsEq = ptPipe; // DrawSysPipeByLayer(ptIns, ptPipe, LAY_PIPE_FIRE); // TDbEquipment *pEquip = new TDbEquipment; // pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); // pEquip->SetHidePipe(TRUE); // pEquip->MirrorByY(m_bMirror); // pEquip->SetScale(nScale); // pEquip->setLayer(LAY_EQUIP_HYDRANT); // pEquip->setColor(AcCmColor()); //随层 // pEquip->SetLocation(ptPipe); // AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); if(iMode == 0){ DrawSysPipeByLayer(ptIns, ptPipe, sLayer); ptInsEq = ptPipe; } else if(iMode == 1){ mat.setToTranslation(Ucs2Wcs(AcGeVector3d(0, nPipeVerLength, 0))); XPoint ptTmp = ptPipe; ptTmp.TransformBy(mat); ptInsEq = ptTmp; DrawSysPipeByLayer(ptIns, ptPipe, sLayer); DrawSysPipeByLayer(ptPipe, ptTmp, sLayer); } TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); pEquip->SetHidePipe(TRUE); pEquip->MirrorByY(m_bMirror); pEquip->SetScale(nScale); pEquip->setLayer(LAY_EQUIP_HYDRANT); pEquip->setColor(AcCmColor()); //随层 pEquip->SetLocation(ptInsEq); AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); AcGePoint3d ptIns2 = ptIns; OPENOBJ_BEGIN(ss[0L], AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ pPipe->getClosestPointTo(ptIns2, ptIns2); } OPENOBJ_END(); if (nKeyIndex == 0) { TDbDimension2 *pDim = new TDbDimension2; pDim->setLayer(LAY_DIM); pDim->SetLocation(ptLoc); pDim->SetStyleId(InitDimStyle(DS_LINEAR)); pDim->SetRotation(ads_angle(XPoint(ptIns2), ptLoc)); pDim->AddSegment(ptIns2); TDimensionEdJig jig(pDim, _T("\n请点取尺寸线位置<退出>:")); jig.m_nFlag=1; if(jig.doIt() != RTNORM) { delete pDim; return; } AcDbObjectId idDim = pDim->AddToMSpace(Adesk::kTrue); } break; } else{ XPoint ptTmpUcs1 = Wcs2Ucs(ptIns); XPoint ptTmpUcs2 = Wcs2Ucs(ptPipe); ads_grdraw(ptTmpUcs1, ptTmpUcs2, -1, 0); } } } else{//自由插入 ptIns.TransformBy(jig.m_mat); TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); pEquip->SetHidePipe(TRUE); pEquip->MirrorByY(m_bMirror); pEquip->SetScale(nScale); pEquip->setLayer(LAY_EQUIP_HYDRANT); pEquip->setColor(AcCmColor()); //随层 pEquip->SetLocation(ptIns); AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); if(iMode == 0) DrawSysPipeByLayer(ptIns, jig.GetPickPoint(), LAY_PIPE_FIRE); else if(iMode == 1){ mat.setToTranslation(AcGeVector3d(nPipeHorLength, 0, 0)); XPoint ptTmp = jig.GetPickPoint(); ptTmp.TransformBy(mat); DrawSysPipeByLayer(ptIns, ptTmp, LAY_PIPE_FIRE); DrawSysPipeByLayer(ptTmp, jig.GetPickPoint(), LAY_PIPE_FIRE); } } } g_nInsBlkRotate = 0; } //*************************************************************************************************** // 编辑雨水斗 //*************************************************************************************************** // cet 2010.10.27 add int EditWaterBucket(AcDbObjectId id) { if (!id) { return RTERROR; } ads_name name; acdbGetAdsName(name, id); Entity ent(name); CString strDia; strDia = ReadXdata(ent, _T("PipeDia")); TCHAR szBlkName[256]; ent.GetData(2, szBlkName); double dEle = 0.0, dSize = 0.0; TDbEquipment *pEquip = NULL; acdbOpenObject(pEquip, id, AcDb::kForRead); if (pEquip != NULL) { XPoint pt = pEquip->GetLocation(); dEle = pt.z; dSize = pEquip->GetScale() / DocGetPScale(); pEquip->close(); } if (!DocGetMeterUnitDraw()) { dEle /= 1000; } CString strSize, strEle; strEle.Format(_T("%f"), dEle); if (strEle.Find(_T(".")) != -1) { strEle.TrimRight(_T("0")); strEle.TrimRight(_T(".")); } strSize.Format(_T("%f"), dSize); if (strSize.Find(_T(".")) != -1) { strSize.TrimRight(_T("0")); strSize.TrimRight(_T(".")); } CTemporaryResourceOverride vTemp; CEditWaterBucketDlg dlg; dlg.SetPipeDia(_tstof(strDia)); dlg.SetEle(_tstof(strEle)); dlg.SetSize(_tstof(strSize)); dlg.SetBlkName(szBlkName); if (dlg.DoModal() == IDOK) { CString csBlkName = dlg.GetBlkName(); CString csTK, csRecord; SplitBlkStr(csBlkName, csTK, csRecord); XString xsTmp; if(LoadDwbBlock((const TCHAR*)csTK, (const TCHAR*)csRecord, xsTmp) != RTNORM) { return 1; } TDbEquipment *pEquip = NULL; acdbOpenObject(pEquip, id, AcDb::kForWrite); if (pEquip != NULL) { double dEle = dlg.GetEle(); if (!DocGetMeterUnitDraw()) { dEle *= 1000; } XPoint pt = pEquip->GetLocation(); pt.z = dEle; pEquip->SetLocation(pt); pEquip->SetBlock2d(GetBlkIdByName(csBlkName)); pEquip->SetScale(dlg.GetSize() * DocGetPScale()); pEquip->close(); } strDia.Format(_T("%.3f"), dlg.GetPipeDia()); strEle.Format(_T("%.3f"), dlg.GetEle()); strSize.Format(_T("%.3f"), dlg.GetSize()); WriteXdata(ent, _T("PipeDia"), strDia); } return 1; } //*************************************************************************************************** // 翻转消火栓 //*************************************************************************************************** void ReversalHydrant() { RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); Entity ent; XPushVar vOsMode3(_T("OSMODE"), 0); if(SelectEntity(_T("\n请选择要翻转的消火栓:<退出>"), ent, rbMask) == RTNORM){ XPoint ptCen, pt1, pt2; ent.GetExtend(pt1, pt2); XLine line(pt1, pt2, 1); line.MidPoint(ptCen); XPoint ptUcs = Wcs2Ucs(ptCen); SHads_command(RTSTR,_T("_rotate"), RTENAME, (TLong_ptr*)ent, RTSTR, _T(""), RT3DPOINT, &ptUcs, RTREAL, 180.0, RTNONE); } } //*************************************************************************************************** // 编辑消火栓 //*************************************************************************************************** int EditHydrant(AcDbObjectId id) { if(!id) return RTERROR; CTemporaryResourceOverride vTemp; CHydrantPlanDlg dlg(1); ads_name ent; acdbGetAdsName(ent, id); dlg.m_csRadius = ReadXdata(ent, _T("HYDRANT_RADIUS")); const TCHAR *szBlkName = NULL; CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp6, xsTmp7; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ double nLen = pEquip->GetPipeLength(); if(nLen > 0) dlg.m_iMode = 0; else dlg.m_iMode = 1; OPENOBJ_BEGIN(pEquip->GetBlock2d(), AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord){ pRecord->getName(szBlkName); } OPENOBJ_END(); dlg.m_csInsBlkName = szBlkName; XPoint ptLoc = pEquip->GetLocation(); dlg.m_dEle = ptLoc.z / 1000; dlg.SetScale(pEquip->GetScale(), pEquip->GetYScale()); } OPENOBJ_END(); if(dlg.DoModal() != IDOK) return 1; if(g_bBlk3D){ if(LoadDwbBlock(csDwb, _T("00000441"), xsTmp6) != RTNORM) return 1; if(LoadDwbBlock(csDwb, _T("00000442"), xsTmp7) != RTNORM) return 1; } OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbEquipment, pEquip); if(pEquip){ pEquip->SetScale(dlg.m_dScaleX); pEquip->SetYScale(dlg.m_dScaleY); pEquip->SetBlock2d(GetBlkIdByName(dlg.m_csInsBlkName)); if(_tcsicmp(dlg.m_csInsBlkName, szBlkName) != 0) pEquip->SetSysBlock(dlg.m_csSysBlk); XPoint ptLoc = pEquip->GetLocation(); pEquip->SetAutoScale(dlg.m_bAutoScale); ptLoc.z = dlg.m_dEle*1000; pEquip->SetLocation(ptLoc); if(dlg.m_bMirrorByX){ pEquip->MirrorByY(!pEquip->IsMirrorByY()); } if(dlg.m_iMode == 0){ pEquip->SetPipeLength(250);//上 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } else{ pEquip->SetPipeLength(0); //平 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7)); } } OPENOBJ_END(); WriteXdata(ent, _T("HYDRANT_RADIUS"), dlg.m_csRadius); if(dlg.m_bMirrorByY){ Entity entTmp = ent; g_ssPickFirst.Free(); g_ssPickFirst += entTmp; ReversalHydrant(); } return 1; } void EditHydrantCmd() { g_ssPickFirst.Free(); RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择要修改的消火栓<退出>"), ss, rbMask) != RTNORM) return; long len = ss.Length(); if(len < 1) return; CTemporaryResourceOverride vTemp; CHydrantPlanDlg dlg(1); dlg.m_csInsBlkName = _T(""); dlg.m_iMode = -1; if(dlg.DoModal() != IDOK) return; CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp6, xsTmp7; if(g_bBlk3D){ if(LoadDwbBlock(csDwb, _T("00000441"), xsTmp6) != RTNORM) return; if(LoadDwbBlock(csDwb, _T("00000442"), xsTmp7) != RTNORM) return; } XPushVar vOsMode(_T("OSMODE"), 0); for(long i=0;i 0.1 && dlg.m_dScaleY > 0.1){ pEquip->SetScale(dlg.m_dScaleX); pEquip->SetYScale(dlg.m_dScaleY); } AcDbObjectId idRec = GetBlkIdByName(dlg.m_csInsBlkName); if(idRec != NULL){ pEquip->SetBlock2d(idRec); pEquip->SetSysBlock(dlg.m_csSysBlk); } pEquip->SetAutoScale(dlg.m_bAutoScale); XPoint ptLoc = pEquip->GetLocation(); ptLoc.z = dlg.m_dEle*1000; pEquip->SetLocation(ptLoc); if(dlg.m_bMirrorByX){ pEquip->MirrorByY(!pEquip->IsMirrorByY()); } if(dlg.m_iMode == 0){ pEquip->SetPipeLength(250);//上 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } else if(dlg.m_iMode == 1){ pEquip->SetPipeLength(0); //平 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7)); } } OPENOBJ_END(); WriteXdata(entTmp, _T("HYDRANT_RADIUS"), dlg.m_csRadius); if(dlg.m_bMirrorByY){//黑白翻转 XPoint ptCen, pt1, pt2; entTmp.GetExtend(pt1, pt2); XLine line(pt1, pt2, 1); line.MidPoint(ptCen); ptCen.z = 0; XPoint ptUcs = Wcs2Ucs(ptCen); SHads_command(RTSTR,_T("_rotate"), RTENAME, (TLong_ptr*)entTmp, RTSTR, _T(""), RT3DPOINT, &ptUcs, RTREAL, 180.0, RTNONE); } } return; } //*************************************************************************************************** // 平面消火栓 //*************************************************************************************************** // 两条线相互投影,取共有的长度 void GetShortCurve(XCurveSegment &curve1, XCurveSegment &curve2) { XPoint ptS1 = curve1.GetStartPoint(); XPoint ptS2 = curve2.GetStartPoint(); XPoint ptE1 = curve1.GetEndPoint(); XPoint ptE2 = curve2.GetEndPoint(); XPoint pt; if (curve1.PathDistance(ptS2) < 0.001 && curve2.PathDistance(ptS1) > 0.001) { curve2.ProjectToMe(ptS1, pt); curve2.SetStartPoint(pt); } else if (curve1.PathDistance(ptS2) > 0.001 && curve2.PathDistance(ptS1) < 0.001) { curve1.ProjectToMe(ptS2, pt); curve1.SetStartPoint(pt); } if (curve1.PathDistance(ptE2, 0) > 0.001 && curve2.PathDistance(ptE1, 0) < 0.001) { curve1.ProjectToMe(ptE2, pt); curve1.SetEndPoint(pt); } else if (curve1.PathDistance(ptE2, 0) < 0.001 && curve2.PathDistance(ptE1, 0) > 0.001) { curve2.ProjectToMe(ptE1, pt); curve2.SetEndPoint(pt); } } XCurveSegment GetOtherWallSegByPt(XPoint ptPick, Entity entWall, AcGeMatrix3d mat) { XCurveSegment seg; if(entWall.Is(_T("ATS_WALL"))){ OPENOBJ_BEGIN(entWall, AcDb::kForRead, TDbWall, pWall); XCurveSegment lCurve, rCurve; XPoint ptNew1, ptNew2; if(pWall) { pWall->GetSideCurve(lCurve, rCurve); double dBulge = lCurve.GetBulge(); AcGePoint3d ptStart = lCurve.StartPoint(); ptStart = ptStart.transformBy(mat); AcGePoint3d ptEnd = lCurve.EndPoint(); ptEnd = ptEnd.transformBy(mat); XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); lCurve = line; lCurve.SetBulge(dBulge); dBulge = rCurve.GetBulge(); ptStart = rCurve.StartPoint(); ptStart = ptStart.transformBy(mat); ptEnd = rCurve.EndPoint(); ptEnd = ptEnd.transformBy(mat); XLine line2(asDblArray(ptStart), asDblArray(ptEnd), 1); rCurve = line2; rCurve.SetBulge(dBulge); GetShortCurve(lCurve, rCurve); lCurve.ProjectToMe(ptPick, ptNew1); rCurve.ProjectToMe(ptPick, ptNew2); if(ads_distance(ptPick, ptNew1) < ads_distance(ptPick, ptNew2)) seg = rCurve; else seg = lCurve; } OPENOBJ_END(); } return seg; } bool IsEntInBlk(Entity ent, Entity entBlk) { AcDbObjectId idEnt; acdbGetObjectId(idEnt, ent); OPENOBJ_BEGIN(entBlk, AcDb::kForRead, AcDbBlockReference, pEnt); if(pEnt != NULL) { XPoint ptIns; AcDbObjectId idRecord = pEnt->blockTableRecord(); OPENOBJ_BEGIN(idRecord,AcDb::kForRead,AcDbBlockTableRecord,pRec); if (pRec != NULL) { AcDbBlockTableRecordIterator *pIter = NULL; pRec->newIterator(pIter); if (pIter != NULL) { for (pIter->start();!pIter->done();pIter->step()) { AcDbObjectId id; pIter->getEntityId(id); if (id == idEnt) { return true; } } delete pIter; } } OPENOBJ_END(); } OPENOBJ_END(); return false; } //选取外部参照上1根曲线 XCurveSegment GetExternalBlockSeg2(Entity &entBlk, XPoint &ptPick, AcGeMatrix3d &mat) { XBlock myBlock(entBlk); if(!myBlock.m_bInitSuccess) return XCurveSegment(); mat = myBlock.GetMatrix3d(); XCurveSegment seg; XPoint ptResult; ads_name ent; ads_matrix xformres; resbuf* refstkres; while (1) { refstkres = NULL; //直接选择子实体 int result = acedNEntSelP(_T("\n外部参照!请继续选择外部参照上墙线<退出>: "), ent, ptResult, 0, xformres, &refstkres); if (refstkres != NULL) acutRelRb(refstkres); if (result == RTNORM) { Entity entTemp = ent; entBlk = ent; ptResult = Ucs2Wcs(ptResult); if(entTemp.Is(_T("LINE"))){ ptPick = ptResult; XCurveSegment seg2(entTemp); AcGePoint3d ptStart = seg2.StartPoint(); ptStart = ptStart.transformBy(*(AcGeMatrix3d*)xformres); AcGePoint3d ptEnd = seg2.EndPoint(); ptEnd = ptEnd.transformBy(*(AcGeMatrix3d*)xformres); XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); seg = line; return seg; } else if(entTemp.Is(_T("ATS_WALL"))){ OPENOBJ_BEGIN(entTemp, AcDb::kForRead, TDbWall, pWall); XCurveSegment lCurve, rCurve; XPoint ptNew1, ptNew2; if(pWall) { ptPick = ptResult; pWall->GetSideCurve(lCurve, rCurve); AcGePoint3d ptStart = lCurve.StartPoint(); ptStart = ptStart.transformBy(*(AcGeMatrix3d*)xformres); AcGePoint3d ptEnd = lCurve.EndPoint(); ptEnd = ptEnd.transformBy(*(AcGeMatrix3d*)xformres); XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); lCurve = line; ptStart = rCurve.StartPoint(); ptStart = ptStart.transformBy(*(AcGeMatrix3d*)xformres); ptEnd = rCurve.EndPoint(); ptEnd = ptEnd.transformBy(*(AcGeMatrix3d*)xformres); XLine line2(asDblArray(ptStart), asDblArray(ptEnd), 1); rCurve = line2; lCurve.ProjectToMe(ptPick, ptNew1); rCurve.ProjectToMe(ptPick, ptNew2); if(ads_distance(ptPick, ptNew1) < ads_distance(ptPick, ptNew2)) seg = lCurve; else seg = rCurve; return seg; } OPENOBJ_END(); } else if(entTemp.Is(_T("LWPOLYLINE"))){// zxl 2014.01.15 add 支持外部参照的PLINE线 ptPick = ptResult; OPENOBJ_BEGIN(entTemp, AcDb::kForRead, AcDbPolyline, pLine); if(pLine) { ptPick = ptResult; double dDist = 0.0; for (int i = 0; i < pLine->numVerts(); i++) { XCurveSegment segNew; AcGePoint3d ptStart; pLine->getPointAt(i, ptStart); ptStart = ptStart.transformBy(*(AcGeMatrix3d*)xformres); AcGePoint3d ptEnd; pLine->getPointAt(i + 1, ptEnd); // zxl 2014.02.10 add if (pLine->isClosed() && i == pLine->numVerts() - 1) { pLine->getPointAt(0, ptEnd); } ptEnd = ptEnd.transformBy(*(AcGeMatrix3d*)xformres); XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); segNew = line; double dDistNew = segNew.GetDist2Me(ptPick); if (i == 0 || fabs(dDistNew) < fabs(dDist)) { dDist = dDistNew; seg = segNew; } } return seg; } OPENOBJ_END(); } } else break; } return seg; } XCurveSegment GetEntitySegByPt(XPoint &ptPick, Entity &entWall, AcGeMatrix3d &mat) { XCurveSegment seg; if(entWall.Is(_T("ATS_WALL"))){ OPENOBJ_BEGIN(entWall, AcDb::kForRead, TDbWall, pWall); XCurveSegment lCurve, rCurve; XPoint ptNew1, ptNew2; if(pWall) { pWall->GetSideCurve(lCurve, rCurve); GetShortCurve(lCurve, rCurve); lCurve.ProjectToMe(ptPick, ptNew1); rCurve.ProjectToMe(ptPick, ptNew2); if(ads_distance(ptPick, ptNew1) < ads_distance(ptPick, ptNew2)) seg = lCurve; else seg = rCurve; } OPENOBJ_END(); } else if(entWall.Is(_T("ATS_COLUMN"))){ OPENOBJ_BEGIN(entWall, AcDb::kForRead, TDbColumn, pColumn); if(pColumn){ XPoly2D poly(1); pColumn->GetOutline(poly); int nSeg = poly.TotalSegments(); for(int j=0; jexplode(entSet); for(int i=0;i<1;i++) { AcDbEntity *pEnt = (AcDbEntity *)entSet[i]; AcDbBlockReference *pBlkRef = NULL; if(pBlkRef = AcDbBlockReference::cast(pEnt)) { XPoint ptIns; AcGeScale3d scRef; AcDbVoidPtrArray entSet2; AcDbObjectId idRecord = pBlkRef->blockTableRecord(); OPENOBJ_BEGIN(idRecord,AcDb::kForRead,AcDbBlockTableRecord,pRec); if (pRec != NULL) { AcDbBlockTableRecordIterator *pIter = NULL; pRec->newIterator(pIter); if (pIter != NULL) { AcDbObjectId idEnt; for (pIter->start();!pIter->done();pIter->step()) { pIter->getEntityId(idEnt); AcDbEntity *pEnt1 = NULL; acdbOpenObject(pEnt1, idEnt, AcDb::kForWrite); AcDbBlockReference *pBlkRef1 = NULL; if (pBlkRef1 = AcDbBlockReference::cast(pEnt1)) { ptIns = pBlkRef->position(); scRef = pBlkRef->scaleFactors(); double dRotat = pBlkRef->rotation(); AcDbBlockReference *pBlkRef2 = (AcDbBlockReference *)pBlkRef1->clone(); pBlkRef2->setScaleFactors(scRef); AcGeVector3d vt = ptIns - XPoint(); AcGeMatrix3d mat; mat.setToTranslation(vt); pBlkRef2->transformBy(mat); pBlkRef2->setRotation(dRotat); pBlkRef2->explode(entSet2); if (pBlkRef2 != NULL) { delete pBlkRef2; pBlkRef2 = NULL; } } pEnt1->close(); } delete pIter; } } OPENOBJ_END(); int len = entSet2.length(); if (len == 0) { pBlkRef->explode(entSet2); } len = entSet2.length(); for(int j=0;jstartPoint(); XPoint pE = pLine->endPoint(); pS.z = 0; pE.z = 0; XPoint ptMid; Midpoint(pS, pE, ptMid); double dLenS = seg.GetDist2Me(pS); double dLenE = seg.GetDist2Me(pE); double dLenM = seg.GetDist2Me(ptMid); if (fabs(seg.GetBulge()) < 0.001 && fabs(dLenE) < 0.001 && fabs(dLenS) < 0.001) { bRet = true; } else if (fabs(seg.GetBulge()) > 0.001 && fabs(dLenM) < 0.001) { bRet = true; } } } ReleaseEntSet(entSet2); } } ReleaseEntSet(entSet); } OPENOBJ_END(); return bRet; } XPoint GetNearestEntPt(XPoint ptPick, XCurveSegment seg) { XPoint ptS = seg.GetStartPoint(); XPoint ptE = seg.GetEndPoint(); RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); PickSet ss(SS_FREE); XPoint ptUcs = Wcs2Ucs(ptPick); // 设置外包框大小 int nLen = 0.0; double dLen1 = ptPick.Distance2d(ptS); double dLen2 = ptPick.Distance2d(ptE); nLen = dLen1 > dLen2 ? dLen1 : dLen2; double dLenMin = dLen1 > dLen2 ? dLen2 : dLen1; XPoint ptRet = dLen1 > dLen2 ? ptE : ptS; GetPointPickSet(ptUcs, ss, rbMask, nLen); for (long i = 0; i < ss.Length(); i++) { Entity ent = ss[i]; XPoint pt1; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) { pt1 = pEquip->GetLocation(); seg.ProjectToMe(pt1, pt1); if (IsHydrantNear2Seg(ent, seg) && pt1.Distance2d(ptPick) < dLenMin) { ptRet = pt1; dLenMin = pt1.Distance2d(ptPick); } } OPENOBJ_END(); } return ptRet; } void InsPlanHydrant() { int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); CString csDwb = g_csDwbPath + _T("TwtSys"); XString xsTmp1, xsTmp6, xsTmp7, xsTmp0; if(LoadDwbBlock(csDwb, _T("00000434"), xsTmp1) != RTNORM) return; xsTmp0 = xsTmp1; if(g_bBlk3D){ if(LoadDwbBlock(csDwb, _T("00000441"), xsTmp6) != RTNORM) return; if(LoadDwbBlock(csDwb, _T("00000442"), xsTmp7) != RTNORM) return; } CHydrantPlanDlg dlg(0, acedGetAcadFrame()); if(dlg.m_csInsBlkName == _T("")) dlg.m_csInsBlkName = xsTmp1; else{ CString csTKName, csRocord; SplitBlkStr(dlg.m_csInsBlkName, csTKName, csRocord); LoadDwbBlock(csTKName, csRocord, xsTmp1); } { CTemporaryResourceOverride vTemp; dlg.Create(IDD_HYDRANT_PLAN, acedGetAcadFrame()); dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); } InitLayer(LAY_EQUIP_HYDRANT); g_nInsBlkRotate = 0; RBList rbMask = ads_buildlist( -4, _T(""), NULL); PickSet ssAll(SS_FREE); RBList rbMask2(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); ssAll.Get(_T("X"),NULL,NULL, rbMask2); PickSet ssDel(SS_FREE); std::map mapData; // cet 2010.6.23 add ssDel.IncludeBegin(); for(long j=0;jGetLocation(); } OPENOBJ_END(); // cet 2010.6.23 add mapData.insert(std::make_pair(ptPick,_tstof(csRadius)*1000)); if (!dlg.IsShowCircle()) { continue; } XCircle cir(ptPick, _tstof(csRadius)*1000); cir.Make(); } ssDel.IncludeEnd(); XPoint ptPick; Entity entWall; BOOL bFree = TRUE; // cet 2010.6.23 del // while(SelectEntity1(0.3, _T("\n请拾取布置消火栓的外部参照、墙线、柱子、直线、弧线 <退出>"), entWall, ptPick, rbMask) == RTNORM){ // cet 2010.6.23 add PickSet ssNew(SS_FREE); // 保存新插入的保护圆 // 对话框选择布置方式 郑晓龙2014.01.10 modify double dMeter = 1000.0; if (DocGetMeterUnitDraw()) { dMeter = 1.0; } bool bRet = false; bool bBlk = false; while(!bRet) { dlg.UpdateData(TRUE); if (dlg.m_iPlanType == 0) { int nRet(0); if (!bBlk) { INITGET_BEG(0, _T("R ")); nRet = SelectEntity1(0.3, _T("\n请拾取布置消火栓的外部参照、墙线、柱子、直线、弧线 <退出>"), entWall, ptPick, rbMask); INITGET_END(); if (nRet != RTNORM && nRet != RTKWORD) { break; } } ssDel.Erase(); ssDel.Free(); dlg.UpdateData(); if (dlg.IsShowCircle()) { std::map::iterator it; for(it = mapData.begin(); it != mapData.end(); it++) { XCircle cir((*it).first, (*it).second); cir.Make(); Entity entCir; entCir.GetLast(); ssDel += entCir; } } if (nRet == RTKWORD) { continue; } ptPick = Ucs2Wcs(ptPick); bFree = FALSE; dlg.UpdateData(); g_csInsBlkName = dlg.m_csInsBlkName; if(entWall.Is(_T("INSERT")) && IsExternalBlock(entWall)) { bBlk = true; } Entity entBlk = entWall; XCurveSegment seg; // 得到点所在的线段 AcGeMatrix3d mat; seg = GetEntitySegByPt(ptPick, entWall, mat); if(!seg) break; entWall = entBlk; g_nInsBlkRotate = GetInsRotate(ptPick, seg); AcGeVector3d vect; vect.x = cos(g_nInsBlkRotate); vect.y = sin(g_nInsBlkRotate); vect.z = 0; BOOL m_bMirror = FALSE; double nScale = 1; // if(g_bEquipByScale) // nScale = DocGetPScale()/100; BOOL bCancel = FALSE; double nWidth(0), nHeight(0); double dScaleX(0), dScaleY(0); XCircle cir(ptPick, _tstof(dlg.m_csRadius)*1000); cir.Make(); Entity entCir; entCir.GetLast(); // ssDel+= entCir; // cet 2010.6.23 del ssNew += entCir; // cet 2010.6.23 add while(1){ dlg.UpdateData(); dlg.GetScale(dScaleX, dScaleY); double dScaleMater = dlg.m_bAutoScale ? DocGetPScale() / 100 : 1; GetBlkRecordWidth(xsTmp0, dScaleX * dScaleMater, dScaleY * dScaleMater, nWidth, nHeight); // TBlockEdJig jig(g_csInsBlkName, ptPick, 1, vect, nWidth*DocGetPScale()/100.0 + dlg.m_iDist); TBlockEdJig jig(g_csInsBlkName, ptPick, 1, vect, nWidth + dlg.m_iDist); jig.m_nSacle = dScaleX * dScaleMater; jig.m_nSacleY = dScaleY * dScaleMater; // jig.m_nSacle = dScaleX*(DocGetPScale()/100.0); // jig.m_nSacleY = dScaleY*(DocGetPScale()/100.0); jig.SetPrompt(_T("\n请指定附件的插入方向<完成>:")); int nKeyIndex = 0; int nRetCode = jig.DoIt(&nKeyIndex); if(nRetCode == RTNORM){ if(jig.m_iQuadrant == 2 || jig.m_iQuadrant == 3){ g_nInsBlkRotate += PI; } if(jig.m_iQuadrant == 1 || jig.m_iQuadrant == 3){ m_bMirror = TRUE; } ptPick = jig.m_ptRetIns; break; } else{ bCancel = TRUE; ssNew -= entCir; // cet 2010.7.9 add 当前消火栓布置取消时其保护半径应删除 entCir.Erase(); // cet 2010.7.9 add break; } } // entCir.Erase(); if(bCancel){ continue; } dlg.UpdateData(); dlg.GetScale(dScaleX, dScaleY); TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); pEquip->SetInsert(ptPick); pEquip->SetHidePipe(TRUE); pEquip->SetScale(dScaleX); pEquip->SetYScale(dScaleY); pEquip->SetAutoScale(dlg.m_bAutoScale); pEquip->MirrorByY(m_bMirror); double dAngle = g_nInsBlkRotate; pEquip->SetAngle(dAngle); if(dlg.m_iMode == 0){ pEquip->SetPipeLength(250);//上 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } else pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7)); pEquip->SetSysBlock((const TCHAR*)dlg.m_csSysBlk); pEquip->setLayer(LAY_EQUIP_HYDRANT); pEquip->setColor(AcCmColor()); //随层 pEquip->SetLocation(ptPick); AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); Entity entLast; entLast.GetLast(); WriteXdata(entLast, _T("HYDRANT_RADIUS"), dlg.m_csRadius); } else if (dlg.m_iPlanType == 1) { // if(bFree){ //任意布置 // PickSet ssAll(SS_FREE); // RBList rbMask2(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL); // ssAll.Get(_T("X"),NULL,NULL, rbMask2); // PickSet ssDel(SS_FREE); // ssDel.IncludeBegin(); // for(long j=0;jGetLocation(); // } // OPENOBJ_END(); // // XCircle cir(ptPick, _tstof(csRadius)*1000); // cir.Make(); // } // ssDel.IncludeEnd(); XPoint ptIns; double nScale = 1; InitLayer(LAY_TWT_GULLY); xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); BOOL bMirror = FALSE; while(1){ dlg.UpdateData(); // cet 2010.6.23 add ssDel.Erase(); ssDel.Free(); if (dlg.IsShowCircle()) { std::map::iterator it; for(it = mapData.begin(); it != mapData.end(); it++) { XCircle cir((*it).first, (*it).second); cir.Make(); Entity entCir; entCir.GetLast(); ssDel += entCir; } } double dScaleX(0), dScaleY(0); dlg.GetScale(dScaleX, dScaleY); g_csInsBlkName = dlg.m_csInsBlkName; double dScaleMater = dlg.m_bAutoScale ? DocGetPScale() / 100 : 1; //支持预览保护圆 2009-4-2 TBlockExJig jig(g_csInsBlkName, ptIns, dScaleX * dScaleMater, dScaleY * dScaleMater, _tstof(dlg.m_csRadius)*1000); // jig.SetRadius(_tstof(dlg.m_csRadius)*1000); // jig.m_nSacle = dScaleX; // jig.m_nSacleY = dScaleY; // jig.m_nSacle = dScaleX*(DocGetPScale()/100.0); // jig.m_nSacleY = dScaleY*(DocGetPScale()/100.0); jig.SetPrompt(_T("\n请点取消火栓插入点[90度旋转(A)/左右翻转(F)]:<退出>")); jig.SetKeyword(_T("A F R")); int nKeyIndex = 0; // jig.m_bReversal = bMirror; jig.SetReversal(bMirror); int ret = jig.DoIt(&nKeyIndex); if(ret == RTKWORD){ if(nKeyIndex == 0) g_nInsBlkRotate += PI/2; else if(nKeyIndex == 1) bMirror = !bMirror; else break; continue; } else if(ret != RTNORM) { bRet = true; break; } ptIns = jig.GetPickPoint(); XPoint ptMid = ptIns; // GetBlkRecordMidPt(g_csInsBlkName, nScale, ptMid, bMirror, g_nInsBlkRotate); dlg.UpdateData(); TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); pEquip->SetScale(dScaleX); pEquip->SetYScale(dScaleY); pEquip->SetAutoScale(dlg.m_bAutoScale); pEquip->SetInsert(ptIns); pEquip->SetHidePipe(TRUE); pEquip->MirrorByY(bMirror); double nAngle = Ucs2Wcs(g_nInsBlkRotate); pEquip->SetAngle(nAngle); if(dlg.m_iMode == 0){ pEquip->SetPipeLength(250);//上 pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } else pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7)); pEquip->SetSysBlock((const TCHAR*)dlg.m_csSysBlk); pEquip->setLayer(LAY_EQUIP_HYDRANT); pEquip->setColor(AcCmColor()); //随层 pEquip->SetLocation(ptMid); AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); Entity entLast; entLast.GetLast(); WriteXdata(entLast, _T("HYDRANT_RADIUS"), dlg.m_csRadius); XCircle cir(ptIns, _tstof(dlg.m_csRadius)*1000); cir.Make(); Entity entCir; entCir.GetLast(); // ssDel+= entCir; // cet 2010.6.23 del ssNew += entCir; // cet 2010.6.23 add } } else { int nRet(0); if (!bBlk) { INITGET_BEG(0, _T("R ")); nRet = SelectEntity1(0.3, _T("\n请拾取布置消火栓的外部参照、墙线、柱子、直线、弧线 <退出>"), entWall, ptPick, rbMask); INITGET_END(); if (nRet != RTNORM && nRet != RTKWORD) { break; } } ssDel.Erase(); ssDel.Free(); dlg.UpdateData(); if (dlg.IsShowCircle()) { std::map::iterator it; for(it = mapData.begin(); it != mapData.end(); it++) { XCircle cir((*it).first, (*it).second); cir.Make(); Entity entCir; entCir.GetLast(); ssDel += entCir; } } if (nRet == RTKWORD) { continue; } ptPick = Ucs2Wcs(ptPick); bFree = FALSE; dlg.UpdateData(); g_csInsBlkName = dlg.m_csInsBlkName; if(entWall.Is(_T("INSERT")) && IsExternalBlock(entWall)) { bBlk = true; } Entity entBlk = entWall; XCurveSegment seg; AcGeMatrix3d mat; seg = GetEntitySegByPt(ptPick, entWall, mat); if(!seg) break; XPoint ptRet = GetNearestEntPt(ptPick, seg); if (entWall.Is(_T("ATS_WALL"))) { XCurveSegment seg2; seg2 = GetOtherWallSegByPt(ptPick, entWall, mat); XPoint ptPick2; seg2.ProjectToMe(ptPick, ptPick2); XPoint ptRet2 = GetNearestEntPt(ptPick2, seg2); seg.ProjectToMe(ptRet2, ptRet2); if (ads_distance(ptRet2, ptPick) < ads_distance(ptRet, ptPick)) { ptRet = ptRet2; } } entWall = entBlk; double dLenPick = seg.PathDistance(ptPick); double dLenRet = seg.PathDistance(ptRet); TADSGePointDir2d pt; double dBulge = seg.GetBulge(); double dDst = dlg.m_dByDist * dMeter; if (fabs(dBulge) > 0.001)// 弧线时重新计算距离,使两点之间的直线距离为dDst { XCircle cir = seg.GetCircle(); double r = cir.GetRadius(); dDst = 2 * r * asin(dDst/2/r); } if (dLenRet == 0.0) { if (ptRet.Distance2d(seg.GetStartPoint()) < 1) { seg.Polar(dDst, pt); } else { seg.Polar(seg.GetLength() - dDst, pt); } } else if (dLenPick > dLenRet) { seg.Polar(dLenRet + dDst, pt); } else { seg.Polar(dLenRet - dDst, pt); } ptPick = pt.AsAcGePoint3d(); double dLenS = seg.PathDistance(ptPick, 1); double dLenE = seg.PathDistance(ptPick, 0); if (dLenS < 0.0 || dLenE < 0.0)// 布置点不在线上 { continue; } g_nInsBlkRotate = GetInsRotate(ptPick, seg); AcGeVector3d vect; vect.x = cos(g_nInsBlkRotate); vect.y = sin(g_nInsBlkRotate); vect.z = 0; BOOL m_bMirror = FALSE; double nScale = 1; BOOL bCancel = FALSE; double nWidth(0), nHeight(0); double dScaleX(0), dScaleY(0); XCircle cir(ptPick, _tstof(dlg.m_csRadius)*1000); cir.Make(); Entity entCir; entCir.GetLast(); ssNew += entCir; while(1) { dlg.UpdateData(); dlg.GetScale(dScaleX, dScaleY); double dScaleMater = dlg.m_bAutoScale ? DocGetPScale() / 100 : 1; GetBlkRecordWidth(xsTmp0, dScaleX * dScaleMater, dScaleY * dScaleMater, nWidth, nHeight); TBlockEdJig jig(g_csInsBlkName, ptPick, 1, vect, nWidth + dlg.m_iDist); jig.m_nSacle = dScaleX * dScaleMater; jig.m_nSacleY = dScaleY* dScaleMater; jig.SetPrompt(_T("\n请指定附件的插入方向<完成>:")); int nKeyIndex = 0; int nRetCode = jig.DoIt(&nKeyIndex); if(nRetCode == RTNORM) { if(jig.m_iQuadrant == 2 || jig.m_iQuadrant == 3){ g_nInsBlkRotate += PI; } if(jig.m_iQuadrant == 1 || jig.m_iQuadrant == 3){ m_bMirror = TRUE; } ptPick = jig.m_ptRetIns; break; } else { bCancel = TRUE; ssNew -= entCir; entCir.Erase(); break; } } if(bCancel) { continue; } dlg.UpdateData(); dlg.GetScale(dScaleX, dScaleY); TDbEquipment *pEquip = new TDbEquipment; pEquip->SetBlock2d(GetBlkIdByName(g_csInsBlkName)); pEquip->SetInsert(ptPick); pEquip->SetHidePipe(TRUE); pEquip->SetScale(dScaleX); pEquip->SetYScale(dScaleY); pEquip->SetAutoScale(dlg.m_bAutoScale); pEquip->MirrorByY(m_bMirror); double dAngle = g_nInsBlkRotate; pEquip->SetAngle(dAngle); if(dlg.m_iMode == 0) { pEquip->SetPipeLength(250); pEquip->SetBlock3d(GetBlockIdFromString(xsTmp6)); } else pEquip->SetBlock3d(GetBlockIdFromString(xsTmp7)); pEquip->SetSysBlock((const TCHAR*)dlg.m_csSysBlk); pEquip->setLayer(LAY_EQUIP_HYDRANT); pEquip->setColor(AcCmColor()); pEquip->SetLocation(ptPick); AcDbObjectId id = AddToCurrentSpace(pEquip, Adesk::kTrue); Entity entLast; entLast.GetLast(); WriteXdata(entLast, _T("HYDRANT_RADIUS"), dlg.m_csRadius); } } ssDel.Erase(); ssNew.Erase(); // cet2010.6.23 add g_nInsBlkRotate = 0; dlg.DestroyWindow(); } IMPLEMENT_DYNAMIC(CHydrantPlanDlg, CModelessDialog) BOOL CHydrantPlanDlg::m_bWndChkRadius = FALSE; int CHydrantPlanDlg::m_iMode = 0; CString CHydrantPlanDlg::m_csOldDim = _T("700*200"); CString CHydrantPlanDlg::m_csInsBlkName = _T(""); CString CHydrantPlanDlg::m_csSysBlk = _T(""); BOOL CHydrantPlanDlg::m_bAutoScale = FALSE; CString CHydrantPlanDlg::m_csRadius = _T("28"); // cet 2010.7.22 add 记忆半径 int CHydrantPlanDlg::m_iPlanType = 0; CHydrantPlanDlg::CHydrantPlanDlg(int iMode, CWnd* pParent /*=NULL*/) : CModelessDialog(CHydrantPlanDlg::IDD, pParent), m_spinDist(50) { //{{AFX_DATA_INIT(CHydrantPlanDlg) m_iDist = 0; m_bMirrorByX = FALSE; m_bMirrorByY = FALSE; m_dEle = 1.1; m_iDim = -1; m_dByDist = 3.0; //}}AFX_DATA_INIT m_csSysBlk1 = _T("TWTSYS(00000386)"); m_csSysBlk2 = _T("TWTSYS(00000383)"); // m_csSysBlk = m_csSysBlk1; m_iOpenMode = iMode; m_dScaleX = 0; m_dScaleY = 0; } void CHydrantPlanDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHydrantPlanDlg) DDX_Control(pDX, IDC_EDIT_BYDIST, m_edtByDist); DDX_Control(pDX, IDC_LIST_DN, m_listDim); DDX_Control(pDX, IDC_SPIN_DIST, m_spinDist); DDX_Text(pDX, IDC_EDIT_DIST, m_iDist); DDV_MinMaxInt(pDX, m_iDist, -100, 1000); DDX_Check(pDX, IDC_CHECK_LR, m_bMirrorByX); DDX_Check(pDX, IDC_CHECK_UD, m_bMirrorByY); DDX_Text(pDX, IDC_EDIT_ELE, m_dEle); DDX_LBIndex(pDX, IDC_LIST_DN, m_iDim); DDX_Text(pDX, IDC_EDIT_BYDIST, m_dByDist); DDV_MinMaxDouble(pDX, m_dByDist, 0., 10000000000.); DDX_CBString(pDX, IDC_COMBO_RADIUS, m_csRadius); DDX_Radio(pDX, IDC_RADIO_MODE1, m_iMode); DDX_Check(pDX, IDC_CHECK_AUTOSCALE, m_bAutoScale); DDX_Check(pDX, IDC_CHECK_RADIUS, m_bWndChkRadius); DDX_Radio(pDX, IDC_RADIO_BYLINE, m_iPlanType); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CHydrantPlanDlg, CModelessDialog) //{{AFX_MSG_MAP(CHydrantPlanDlg) ON_WM_PAINT() ON_WM_CLOSE() ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc) ON_BN_CLICKED(IDC_RADIO_MODE1, OnRadioMode1) ON_BN_CLICKED(IDC_RADIO_MODE2, OnRadioMode2) ON_BN_CLICKED(IDC_PREVIEW, OnPreview) ON_BN_CLICKED(IDC_BUTTON_DIM, OnButtonDim) ON_LBN_SELCHANGE(IDC_LIST_DN, OnSelchangeListDn) ON_BN_CLICKED(IDC_CHECK_RADIUS, OnCheckRadius) ON_BN_CLICKED(IDC_RADIO_BYDIST, OnRadioBydist) ON_BN_CLICKED(IDC_RADIO_BYLINE, OnRadioByline) ON_BN_CLICKED(IDC_RADIO_BYUSER, OnRadioByuser) ON_EN_KILLFOCUS(IDC_EDIT_BYDIST, OnKillfocusEditBydist) ON_BN_CLICKED(IDC_CHECK_AUTOSCALE, OnCheckAutoscale) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHydrantPlanDlg message handlers BOOL CHydrantPlanDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); m_spinDist.SetRange(0,1000); OpenSlide(); if(m_iOpenMode == 0){ CRect rect; this->GetWindowRect(&rect); rect.bottom -= 80; this->MoveWindow(&rect); } else{ CWnd *pWnd1 = GetDlgItem(IDC_EDIT_DIST); CWnd *pWnd2 = GetDlgItem(IDC_SPIN_DIST); CWnd *pWnd3 = GetDlgItem(IDC_BUTTON_CALC); pWnd1->EnableWindow(FALSE); pWnd2->EnableWindow(FALSE); pWnd3->EnableWindow(FALSE); CWnd *pWnd4 = GetDlgItem(IDC_RADIO_BYLINE); CWnd *pWnd5 = GetDlgItem(IDC_RADIO_BYUSER); CWnd *pWnd6 = GetDlgItem(IDC_RADIO_BYDIST); pWnd4->EnableWindow(FALSE); pWnd5->EnableWindow(FALSE); pWnd6->EnableWindow(FALSE); UpdateData(FALSE); } ResetDim(); if(m_iOpenMode == 1){ CString csText; csText.Format(_T("%.0f*%.0f"), m_dScaleX, m_dScaleY); int idx = m_listDim.FindString(0, csText); if(idx > -1){ m_iDim = idx; } else{ m_listDim.AddString(csText); m_iDim = m_listDim.GetCount()-1; } UpdateData(FALSE); } else{ int idx = m_listDim.FindString(0, m_csOldDim); if(idx > -1) m_iDim = idx; else m_iDim = 0; UpdateData(FALSE); } if(m_csSysBlk == _T("")) m_csSysBlk = m_csSysBlk1; CRegProperty regProp(GetRegLocation(), _T("TWTConfig")); regProp.SetTopRootKey(HKEY_CURRENT_USER); if (!regProp.GetValue(_T("HydrantPlanByDist"), m_dByDist)) { m_dByDist = 3; } if (!regProp.GetValue(_T("HydrantPlanType"), m_iPlanType)) { m_iPlanType = 0; } UpdateData(FALSE); InitEditStatus(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CHydrantPlanDlg::InitEditStatus() { UpdateData(TRUE); CWnd *pWnd = GetDlgItem(IDC_EDIT_BYDIST); if (m_iPlanType == 2 && m_iOpenMode == 0) { pWnd->EnableWindow(TRUE); } else { pWnd->EnableWindow(FALSE); } } void CHydrantPlanDlg::OnPaint() { CPaintDC dc(this); // device context for painting OpenSlide(); } void CHydrantPlanDlg::OnClose() { CModelessDialog::OnClose(); acedPostCommand(_T("\33\33")); } void CHydrantPlanDlg::OpenSlide() { UpdateData(TRUE); CWnd *pImageBox = GetDlgItem(IDC_PREVIEW); CString csTKName, csRocord; CString csSlb; SplitBlkStr(m_csInsBlkName, csTKName, csRocord); csSlb.Format(_T("%s(%s)"), csTKName, csRocord); DrawSlide((const TCHAR*)csSlb, pImageBox); } void CHydrantPlanDlg::OnButtonCalc() { CModelessDialog::OnClose(); acedPostCommand(_T("\33\33")); acedPostCommand(_T("xhsjs ")); } void CHydrantPlanDlg::OnRadioMode1() { PostCommand(_T("R "), false); } void CHydrantPlanDlg::OnRadioMode2() { PostCommand(_T("R "), false); } void CHydrantPlanDlg::OnSelchangeListDn() { UpdateData(TRUE); m_listDim.GetText(m_iDim, m_csOldDim); PostCommand(_T("R "), false); } void CHydrantPlanDlg::OnPreview() { UpdateData(); CTemporaryResourceOverride vTemp; CSelectBlkDlg dlg; dlg.m_csTkName = _T("TWTSYS"); dlg.m_csType = _T("平面消火栓"); CWnd *pWnd = GetDlgItem(IDC_PREVIEW); CRect rect; dlg.m_staticSlide.m_csCurRecord = m_csSysBlk1; pWnd->GetWindowRect(&rect); dlg.m_ptBase = rect.TopLeft(); if(dlg.DoModal() == IDOK){ CString csRet = dlg.m_staticSlide.m_csCurRecord; CString csDes = dlg.m_staticSlide.m_csCurDesName; if(csDes.Find(_T("双")) > -1){ m_csSysBlk = m_csSysBlk2; } else{ m_csSysBlk = m_csSysBlk1; } XString xsTKName, xsRocord; SplitSlbName(csRet, xsTKName, xsRocord); acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); XString xsBlk; LoadDwbBlock(xsTKName, xsRocord, xsBlk); m_csInsBlkName = xsBlk; acDocManager->unlockDocument(curDoc()); OpenSlide(); } PostCommand(_T("R "), false); } BOOL InvokeDataStore(int iMode, CString csText) { CString csRet; RBList rbCmd=ads_buildlist(RTSTR, _T("IDataStore"), RTSTR, csText, RTSHORT, iMode, NULL); resbuf *rbRes=NULL; if(ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes) { if(rbRes && rbRes->restype==RTSTR) csRet=rbRes->resval.rstring; ads_relrb(rbRes); return TRUE; } return FALSE; } void CHydrantPlanDlg::OnButtonDim() { InvokeDataStore(41, _T("消火栓尺寸")); ResetDim(); m_iDim = 0; UpdateData(FALSE); } void CHydrantPlanDlg::ResetDim() { m_listDim.ResetContent(); CodeBase db; int Number; CString csType, csValue, csRemark; XString fullFile; if(!FindFile(_T("DataStore.dbf"), fullFile)) { Callme(_T("对不起,没有发现DataStore.dbf文件!")); return; } XDbfTable *pTable = db.Open(fullFile); if(!pTable) { Callme(_T("DataStore.dbf文件出错!")); return; } pTable->MoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), csType); GET_FIELD(pTable, _T("TypeValue"), csValue); GET_FIELD(pTable, _T("REMARK"), csRemark); if(csType == _T("消火栓尺寸") && Number == 41){ m_listDim.AddString(csValue); } pTable->MoveNext(); } // m_iDim = 0; // UpdateData(FALSE); } void CHydrantPlanDlg::GetScale(double &dX, double &dY) { UpdateData(TRUE); CString csText; m_listDim.GetText(m_iDim, csText); int idx = csText.Find(_T("*")); CString csLeft, csRight; csLeft = csText.Left(idx); csRight = csText.Right(csText.GetLength() - idx - 1); dX = _tstof(csLeft); dY = _tstof(csRight); } void CHydrantPlanDlg::SetScale(double dX, double dY) { m_dScaleX = dX; m_dScaleY = dY; } void CHydrantPlanDlg::OnOK() { UpdateData(TRUE); CString csText; m_listDim.GetText(m_iDim, csText); int idx = csText.Find(_T("*")); CString csLeft, csRight; csLeft = csText.Left(idx); csRight = csText.Right(csText.GetLength() - idx - 1); m_dScaleX = _tstof(csLeft); m_dScaleY = _tstof(csRight); CModelessDialog::OnOK(); } void CHydrantPlanDlg::OnCheckRadius() { PostCommand(_T("R "), false); } void CHydrantPlanDlg::OnRadioBydist() { InitEditStatus(); PostCommand(_T("R "), false); acedGetAcadDwgView()->SetFocus(); } void CHydrantPlanDlg::OnRadioByline() { InitEditStatus(); PostCommand(_T("R "), false); acedGetAcadDwgView()->SetFocus(); } void CHydrantPlanDlg::OnRadioByuser() { InitEditStatus(); PostCommand(_T("R "), false); acedGetAcadDwgView()->SetFocus(); } BOOL CHydrantPlanDlg::DestroyWindow() { UpdateData(TRUE); CRegProperty regProp(GetRegLocation(), _T("TWTConfig")); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.SetValue(_T("HydrantPlanByDist"), m_dByDist); regProp.SetValue(_T("HydrantPlanType"), m_iPlanType); return CModelessDialog::DestroyWindow(); } extern bool IsStrAllNum(CString csText); void CHydrantPlanDlg::OnKillfocusEditBydist() { double dData = m_dByDist; CString sText; m_edtByDist.GetWindowText(sText); m_dByDist = _tstof(sText); if (m_dByDist <= 0 || !IsStrAllNum(sText)) { m_dByDist = dData; UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); m_edtByDist.SetFocus(); m_edtByDist.SetSel(0, -1); } } void CHydrantPlanDlg::OnCheckAutoscale() { UpdateData(TRUE); PostCommand(_T("R "), false); acedGetAcadDwgView()->SetFocus(); }