#include "stdafx.h" #include "resource.h" #include #include "ThunderCmdGroup.h" #include "ThunderDbReactor.h" #include "ThunderEditReactor.h" #include "ThunderCaculate.h" #include "LightningRodData.h" #include "DrawThunder2D.h" #include "ThunderXData.h" #include "LayPinDlg.h" #include "ThunderSetDlg.h" #include "ThunderEditReactor.h" #include "ThunderPolyLineJig.h" #include "DrawSheet.h" #include "CreateWordApp.h" #include "dbgroup.h" #include "dbxutil.h" #include "TReactorAssociate.h" #include "TThunderSectionJig.h" #include "TViewPortThunders.h" #include "ThunderLineSetDlg.h" #include "LableThunderBX.h" #include "FoldPinJig.h" #include "FoldLayPinDlg.h" #include "FoldSetDlg.h" #include "FoldPinRelation.h" #include "FoldToolKit.h" #include "ktsetting.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CThunderCmdGroup, ArxCmdGroup) BOOL CThunderCmdGroup::bIsAllowDraw = TRUE; BOOL CThunderCmdGroup::bExecute = FALSE; BOOL CThunderCmdGroup::bReDraw = FALSE; BOOL CThunderCmdGroup::bReDrawFold = TRUE; CThunderCmdGroup::CThunderCmdGroup() { m_pThunderReactor = new CThunderDbReactor(); m_pThunderDocReactor = new TelThunderDocReactor; m_pThunderDraw2d = new CDrawThunderTools; m_pThunderEditReactor = new TelThunderEditReactor(this); } CThunderCmdGroup::~CThunderCmdGroup() { if (m_pThunderReactor != NULL) { delete m_pThunderReactor; m_pThunderReactor = NULL; } if (m_pThunderDraw2d != NULL) { delete m_pThunderDraw2d; m_pThunderDraw2d = NULL; } if (m_pThunderDocReactor != NULL) { delete m_pThunderDocReactor; m_pThunderDocReactor = NULL; } if (m_pThunderEditReactor != NULL) { delete m_pThunderEditReactor; m_pThunderEditReactor = NULL; } TContainerSingleton::ReleaseInstance(); CFoldToolKit::DisInstance(); CFoldPinRelation::DisInstance(); } BEGIN_AEC_ARXCMD_MAP(CThunderCmdGroup,THUNDERPROOF) //{{AFX_AEC_ARX_CMD(TGTPMCmdGroup) //滚球法 ON_AEC_ARXCMD(Thunder_test, Thunder_test, ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, ThunderTest) //测试 ON_AEC_ARXCMD(EL_BLSZ, EL_BLSZ, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderSetPinCmd) //避雷设置 ON_AEC_ARXCMD(EL_CBLZ, EL_CBLZ, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderLayPinCmd) //插避雷针 ON_AEC_ARXCMD(EL_GBLZ, EL_GBLZ, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderEditPinCmd) //改避雷针 ON_AEC_ARXCMD(EL_SBLZ, EL_SBLZ, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderErasePinCmd) //删避雷针 ON_AEC_ARXCMD(EL_DZYD, EL_DZYD, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderMovePinCmd) //单针移动 ON_AEC_ARXCMD(EL_HBLX, EL_HBLX,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, DrawThunderLine) //绘制避雷线 ON_AEC_ARXCMD(EL_GBLX, EL_GBLX,ACRX_CMD_MODAL|ACRX_CMD_USEPICKSET,ThunderEditLineCmd) //改避雷线 ON_AEC_ARXCMD(EL_SBLX, EL_SBLX,ACRX_CMD_MODAL|ACRX_CMD_USEPICKSET,ThunderEraseLineCmd) //删避雷线 ON_AEC_ARXCMD(EL_DXYD, EL_DXYD, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderMoveLineCmd) //单线移动 ON_AEC_ARXCMD(EL_SPER, EL_SPER, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, newspheretest) //单线移动测试 ON_AEC_ARXCMD(EL_BZBJ, ELBZBJ, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderDimentRadiusCmd)//标注半径 ON_AEC_ARXCMD(EL_BZBX, EL_BZBX, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderDimentBxCmd) //标注BX ON_AEC_ARXCMD(EL_DBLB, EL_DBLB, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderSinSheetCmd) //单避雷表 ON_AEC_ARXCMD(EL_SBLB, EL_SBLB, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderDblSheetCmd) //双避雷表 ON_AEC_ARXCMD(EL_BLPQ, EL_BLPQ,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, ThunderSection) //避雷剖切 ON_AEC_ARXCMD(EL_LJSS, EL_LJSS,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, ThunderCaculateBook) //雷计算书 ON_AEC_ARXCMD(EL_JZGD, EL_JZGD,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, ThunderArchHeight) //赋高度 ON_AEC_ARXCMD(EL_CKSW, EL_CKSW, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderPart3DCmd) //查看三维 ON_AEC_ARXCMD(EL_HYEW, EL_HYEW, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, ThunderPart3DBackCmd) //还原二维 ON_AEC_ARXCMD(EL_SPTT,EL_SPTT,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, Sphere) //测试 ON_AEC_ARXCMD(EL_DBLEDT, EL_DBLEDT,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, DblEditThunder) //双击编辑避雷针 ON_AEC_ARXCMD(EL_DBDEDT, EL_DBDEDT,ACRX_CMD_MODAL| ACRX_CMD_USEPICKSET, DbDEditThunder) //双击编辑避雷带 //折线法 ON_AEC_ARXCMD(EL_BLSZF, EL_BLSZF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldSetPinCmd) //避雷设置 ON_AEC_ARXCMD(EL_CBLZF, EL_CBLZF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldLayPinCmd) //插避雷针 ON_AEC_ARXCMD(EL_GBLZF, EL_GBLZF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldEditPinCmd) //改避雷针 ON_AEC_ARXCMD(EL_SBLZF, EL_SBLZF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldErasePinCmd) //删避雷针 ON_AEC_ARXCMD(EL_DZYDF, EL_DZYDF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldMovePinCmd) //单针移动 ON_AEC_ARXCMD(EL_test1, EL_test1, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, maptest) //测试 ON_AEC_ARXCMD(EL_BZBJF, EL_BZBJF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldDimentRadiusCmd)//标注半径 ON_AEC_ARXCMD(EL_BZBXF, EL_BZBXF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldDimentBxCmd) //标注BX ON_AEC_ARXCMD(EL_DBLBF, EL_DBLBF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldSinSheetCmd) //单避雷表 ON_AEC_ARXCMD(EL_SBLBF, EL_SBLBF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldDblSheetCmd) //双避雷表 ON_AEC_ARXCMD(EL_LJSSF, EL_LJSSF, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, FoldCalcBookCmd) //雷计算书 //}}AFX_AEC_ARX_CMD END_AEC_ARXCMD_MAP(CThunderCmdGroup) //加入命令 void CThunderCmdGroup::OnAddCommands() { ArxCmdGroup::OnAddCommands(); OnLoadApp(); } //移除命令 void CThunderCmdGroup::OnRemoveCommands() { ArxCmdGroup::OnRemoveCommands(); OnUnloadApp(); } void CThunderCmdGroup::ThunderDraw() { if (m_pThunderDraw2d != NULL) { TCurDocumentLock lockDoc; TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); AcGeDoubleArray arProHeight; TContainerSingleton::LstProHeightMap mapData; TContainerSingleton::LstProHeightMap::iterator it; ThunderContainer->GetProHeightMap(mapData); for (it = mapData.begin();it != mapData.end();++it) { ThunderContainer->GetGroupProHeight(it->first, arProHeight); m_pThunderDraw2d->DrawThunder2DArea(arProHeight,it->first); } ThunderContainer->GetProLineHeightMap(mapData); for (it = mapData.begin();it != mapData.end();++it) { ThunderContainer->GetGroupLineProHeight(it->first, arProHeight); m_pThunderDraw2d->DrawThunderLine(it->first, arProHeight); } m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, FALSE); acedUpdateDisplay(); actrTransactionManager->flushGraphics(); ThunderContainer->ClearProHeight(); ThunderContainer->ClearLineProHeight(); } } int CThunderCmdGroup::Sphere() { ads_point ptUser1,ptUser2,ptUser3; double dShpere = 0.0; if (acedGetPoint(NULL,_T("\n 请选择第一点"),ptUser1) != RTNORM) return 0; if (acedGetPoint(NULL,_T("\n 请选择第二点"),ptUser2) != RTNORM) return 0; if (acedGetPoint(NULL,_T("\n 请选择第三点"),ptUser3) != RTNORM) return 0; if (acedGetReal(_T("\n 请给出圆半径:"),&dShpere) != RTNORM) return 0; AcGePoint3d pt1,pt2,pt3; pt1 = Ucs2Wcs(asPnt3d(ptUser1)); pt2 = Ucs2Wcs(asPnt3d(ptUser2)); pt3 = Ucs2Wcs(asPnt3d(ptUser3)); AcGePoint3d ptCenter; AcGePlane plan(pt1,pt2,pt3); AcGeVector3d vecNormal = plan.normal(); AcGeVector3d vec12,vec23,vec31; vec12 = pt1 - pt2; vec23 = pt2 - pt3; vec31 = pt3 - pt1; AcGeVector3d vecNormal12,vecNormal23,vecNormal31; AcGePlane plan12(pt1,vec12,vecNormal); AcGePlane plan23(pt2,vec23,vecNormal); AcGePlane plan31(pt3,vec31,vecNormal); vecNormal12 = plan12.normal(); vecNormal23 = plan23.normal(); vecNormal31 = plan31.normal(); vecNormal12.normalize(); vecNormal23.normalize(); vecNormal31.normalize(); //得到各边中点 AcGePoint3d ptCen12,ptCen23,ptCen31; ptCen12.x = (pt1.x + pt2.x)/2; ptCen12.y = (pt1.y + pt2.y)/2; ptCen12.z = (pt1.z + pt2.z)/2; ptCen23.x = (pt3.x + pt2.x)/2; ptCen23.y = (pt3.y + pt2.y)/2; ptCen23.z = (pt3.z + pt2.z)/2; ptCen31.x = (pt1.x + pt3.x)/2; ptCen31.y = (pt1.y + pt3.y)/2; ptCen31.z = (pt1.z + pt3.z)/2; AcGePoint3d ptEnd12,ptEnd23,ptEnd31; ptEnd12 = ptCen12 + vecNormal12*dShpere; ptEnd23 = ptCen23 + vecNormal23*dShpere; ptEnd31 = ptCen31 + vecNormal31*dShpere; AcDbLine line12(ptCen12,ptEnd12); AcDbLine line23(ptCen23,ptEnd23); AcGePoint3dArray arPts; line12.intersectWith(&line23,AcDb::kExtendBoth,arPts); if (arPts.length() != 1) return 0; //中垂线交点到点距离 double dDis = arPts[0].distanceTo(pt1); //球心到面的投影距离 double dDisPer = pow(pow(dShpere,2) - pow(dDis,2),0.5); vecNormal.normalize(); ptCenter = arPts[0] + vecNormal*dDisPer; AcDb3dSolid *pSolid1 = new AcDb3dSolid; AcDb3dSolid *pSolid2 = new AcDb3dSolid; Acad::ErrorStatus es; es = pSolid1->createSphere(dShpere); AcGeMatrix3d matrix; matrix.setCoordSystem(ptCenter,AcGeVector3d::kXAxis,AcGeVector3d::kYAxis,AcGeVector3d::kZAxis); pSolid1->transformBy(matrix); ptCenter = arPts[0] - vecNormal*dDisPer; es = pSolid2->createSphere(dShpere); matrix.setCoordSystem(ptCenter,AcGeVector3d::kXAxis,AcGeVector3d::kYAxis,AcGeVector3d::kZAxis); pSolid2->transformBy(matrix); AddToCurrentSpace(pSolid1,Adesk::kTrue); AddToCurrentSpace(pSolid2,Adesk::kTrue); return 1; } int CThunderCmdGroup::ThunderTest() { // 截取圆弧 Entity entCir; RBList rb = acutBuildList(RTDXF0, _T("CIRCLE"), NULL); AcGePoint3d ptCen,ptS,ptE; if (SelectEntity(_T("\n 选择圆 <退出>:"), entCir,rb) != RTNORM) { return 0; } ads_point ptCn; if (acedGetPoint(NULL, _T("\n 点取弧起点 <退出>:"), ptCn) != RTNORM) { return 0; } ptS = Ucs2Wcs(asPnt3d(ptCn)); if (acedGetPoint(NULL, _T("\n 点取弧终点 <退出>:"), ptCn) != RTNORM) { return 0; } ptE = Ucs2Wcs(asPnt3d(ptCn)); OPENOBJ_BEGIN(entCir,AcDb::kForRead,AcDbCircle,pCir); if (pCir != NULL) { double dPara,dPara2; pCir->getParamAtPoint(ptS,dPara); pCir->getParamAtPoint(ptE,dPara2); if (dPara < dPara2) { double dT = dPara2; dPara2 = dPara; dPara = dT; } AcDbArc* pArc = new AcDbArc(pCir->center(),pCir->radius(),dPara2,dPara); pArc->setColorIndex(1); AddToCurrentSpace(pArc,Adesk::kTrue); } OPENOBJ_END(); return 0; Entity ent; RBList rbMask = ads_buildlist(RTDXF0, _T("3dsolid"), NULL); if(SelectEntity(_T("\n 请选择实体<退出>:"), ent, rbMask) != RTNORM) { return 0; } PickSet ssSub(SS_FREE); if (SelectEntities(_T("\n 请选择需要减去的实体<退出>"), ssSub, rbMask) != RTNORM) { return 0; } OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDb3dSolid,pMainSolid); if (pMainSolid != NULL) { AcDb3dSolid* pNewMain = new AcDb3dSolid; pNewMain->copyFrom(pMainSolid); AcDb3dSolid* pNewSub = NULL; for (long i = 0;i < ssSub.Length();++i) { OPENOBJ_BEGIN(ssSub[i],AcDb::kForRead,AcDb3dSolid,pSubSolid); if (pSubSolid != NULL) { pNewSub = new AcDb3dSolid; pNewSub->copyFrom(pSubSolid); Acad::ErrorStatus es = pNewMain->booleanOper(AcDb::kBoolSubtract, pNewSub); delete pNewSub; } OPENOBJ_END(); } AddToCurrentSpace(pNewMain, Adesk::kTrue); } OPENOBJ_END(); return 0; } // 单针插入命令 int CThunderCmdGroup::ThunderLayPinCmd() { KTSetting::InitLayer(LAY_EL_THUNDER_2D); KTSetting::InitLayer(LAY_EL_THUNDER_3D); KTSetting::InitLayer(LAY_EL_TEXT); KTSetting::InitLayer(LAY_EL_THUNDER); KTSetting::InitLayer(LAY_PREVIEW_THUNDER); CAcModuleResourceOverride myResources; CLayPinDlg dlg; if (!dlg.DoModeless()) { return 0; } AdjustWndToViewport(&dlg); dlg.SetThunderDraw2d(m_pThunderDraw2d); // 插入避雷针 if (m_pThunderDraw2d != NULL) { m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, FALSE); } TTempDrawState temp(FALSE); TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); AcDbObjectId idThunder; while (true) { // 插入避雷针 if (!dlg.InsertThunderBlock(idThunder)) { break; } } dlg.DestroyWindow(); acedPostCommand(_T("\33")); return 0; } // 单针设置命令 int CThunderCmdGroup::ThunderSetPinCmd() { CAcModuleResourceOverride myResources; CThunderSetDlg dlg; dlg.DoModal(); return 0; } // 单针编辑命令 int CThunderCmdGroup::ThunderEditPinCmd() { Entity ent; RBList rbMask = ads_buildlist(RTDXF0, _T("INSERT,LWPOLYLINE"), NULL); if(SelectEntity(_T("\n 请在编号上选择要编辑的避雷针<退出>:"), ent, rbMask) != RTNORM) { return 0; } // 获取避雷针ID AcDbObjectId idThunder; if (acdbGetObjectId(idThunder, ent) != Acad::eOk) { return 0; } CAcModuleResourceOverride myResources; CLayPinDlg dlg(idThunder, TRUE); dlg.SetDbReactorPtr(m_pThunderReactor); dlg.DoModal(); return 0; } // 双击编辑避雷针 // 双击编辑避雷针 int CThunderCmdGroup::DblEditThunder() { AcDbObjectId idThunder; PickSet ssThunder(SS_FREE); RBList rbMask = ads_buildlist(RTDXF0, _T("INSERT"), NULL); ssThunder.Get(_T("I"), NULL, NULL, rbMask); long sss = ssThunder.Length(); if (ssThunder.Length() == 1) { if (acdbGetObjectId(idThunder, ssThunder[0l]) != Acad::eOk) { return 0; } } else { //滚球避雷针 ssThunder.Free(); RBList rbMask2 = ads_buildlist(RTDXF0, _T("CIRCLE"), RTNONE); ssThunder.Get(_T("I"), NULL, NULL, rbMask2); sss = ssThunder.Length(); CThunderXData thunderXData; if (ssThunder.Length() > 0) { // 获取圆的id AcDbObjectId idCir; if (acdbGetObjectId(idCir, ssThunder[0l]) != Acad::eOk) { return 0; } // 由圆id获取避雷针ID if (!thunderXData.GetEntityIdFromExData(idCir, idThunder, TEL_THUNDER_ID)) { return 0; } } else { //折线避雷针 ssThunder.Free(); RBList rbMask2 = ads_buildlist(RTDXF0, _T("CIRCLE"), RTNONE); ssThunder.Get(_T("I"), NULL, NULL, rbMask2); sss = ssThunder.Length(); if (ssThunder.Length() > 0) { // 获取圆的id AcDbObjectId idCir; if (acdbGetObjectId(idCir, ssThunder[0l]) != Acad::eOk) { return 0; } // 由圆id获取避雷针ID if (!thunderXData.GetXData(idCir, KEY_FOLD_THUNDER_ID,idThunder)) { return 0; } } else return 0; } } CAcModuleResourceOverride myResources; CThunderXData thunderXData; CString sType = _T(""); thunderXData.GetXData(idThunder,TEL_THUNDER_TYPE,sType); if (sType.CompareNoCase(_T("1")) == 0) { //折线避雷针 CFoldLayPinDlg dlg(idThunder,TRUE); dlg.DoModal(); } else { CLayPinDlg dlg(idThunder, TRUE); dlg.SetDbReactorPtr(m_pThunderReactor); dlg.DoModal(); } return 0; } int CThunderCmdGroup::DbDEditThunder() { PickSet ssThunder(SS_FREE); RBList rbMask = ads_buildlist(RTDXF0, _T("LWPOLYLINE"),RTNONE); ssThunder.Get(_T("I"), NULL, NULL, rbMask); long sss = ssThunder.Length(); if(sss < 1) return 0; CThunderXData ThunderXData; CString sNo = _T(""); CAcModuleResourceOverride myResources; AcDbObjectId idThunder; acdbGetObjectId(idThunder, ssThunder[0l]); ThunderXData.GetXData(idThunder,KEY_LINE_GROUP_NO,sNo); if (!sNo.IsEmpty()) { CThunderLineSetDlg dlg; dlg.SetUseType(CThunderLineSetDlg::eEdit); dlg.SetCurrectThunderLine(idThunder); dlg.DoModal(); } return 0; } // 避雷针删除命令 int CThunderCmdGroup::ThunderErasePinCmd() { // 过滤框选的圆 PickSet ssAll(SS_FREE); RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); // 选择要删除的避雷针 if(SelectEntities(_T("\n 请在编号上选择要删除的避雷针:<退出>"), ssAll, rbMask) != RTNORM) { return 0; } TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); // 删除 // 避免重复删除 AcDbObjectIdArray arThunderId; ads_name entName; int nPos = -1; CThunderXData thunderXData; AcDbObjectId idCircle, idThunder; int nNo = -1; for (long i = 0;i < ssAll.Length();i++) { Entity ent = ssAll[i]; //判断是否滚球法避雷针 if (thunderXData.GetGroupNO(ent) > 0) { if (acdbGetObjectId(idCircle, ssAll[i]) == Acad::eOk) { if (ent.Is(_T("CIRCLE"))) { // 获取避雷針id thunderXData.GetEntityIdFromExData(idCircle, idThunder, TEL_THUNDER_ID); OPENOBJ_BEGIN(idCircle, AcDb::kForRead, AcDbCircle, pCircle); if(pCircle) { // 删除标注信息(如果存在) DeleteOldDim(pCircle); } OPENOBJ_END(); } else { idThunder = idCircle; } if (idThunder.isValid()) { if (!arThunderId.find(idThunder, nPos, 0)) { arThunderId.append(idThunder); } } } } } CString sNo; AcGeDoubleArray arProHeight; for (int j = 0;j < arThunderId.length();++j) { thunderXData.GetProtectHeightFromObjEx(arThunderId[j], arProHeight); ThunderContainer->GetThunderGroupNo(arThunderId[j], sNo); ThunderContainer->AppendProHeight(sNo, arProHeight); ThunderContainer->RemoveThunder(sNo, arThunderId[j]); if (acdbGetAdsName(entName, arThunderId[j]) == Acad::eOk) { // 删除避雷针 acdbEntDel(entName); } } CThunderCmdGroup::bExecute = TRUE; return 0; } // 单针移动命令 int CThunderCmdGroup::ThunderMovePinCmd() { // 获取需要移动的避雷针 Entity ent; RBList rbMask = ads_buildlist(RTDXF0, _T("INSERT"), NULL); if(SelectEntity(_T("\n 请在编号上选择要移动的避雷针<退出>:\n"), ent, rbMask) != RTNORM) { return 0; } // 获取避雷针的idThunder AcDbObjectId idThunder; AcGePoint3d ptOld; CThunderXData thunderXdata; //如果不是滚球法避雷针 if(thunderXdata.GetGroupNO(ent) <= 0) return 0; OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbBlockReference,pRef); if (pRef != NULL) { ptOld = pRef->position(); idThunder = pRef->objectId(); } OPENOBJ_END(); ads_point ptDes; if (acedGetPoint(asDblArray(ptOld), _T("\n 请选择要移动到的位置<退出>: "), ptDes) != RTNORM) { return 0; } TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); // 获取要移动到的位置点 acdbUcs2Wcs(ptDes, ptDes, false); AcGePoint3d ptInsert = asPnt3d(ptDes); // 得到偏移矩阵 AcGeMatrix3d matThund; ptInsert.z = 0; ptOld.z = 0; AcGeVector3d vtThunder = ptInsert - ptOld; matThund.setToTranslation(vtThunder); // 移动避雷针 AcDbEntity* pEnt = NULL; if (acdbOpenAcDbEntity(pEnt, idThunder, AcDb::kForWrite) == Acad::eOk) { pEnt->transformBy(matThund); pEnt->close(); } CString sNo; CThunderXData thunderXData; AcGeDoubleArray arProHeight; thunderXData.GetProtectHeightFromObjEx(idThunder, arProHeight); ThunderContainer->GetThunderGroupNo(idThunder, sNo); ThunderContainer->AppendProHeight(sNo, arProHeight); CThunderCmdGroup::bExecute = TRUE; return 0; } void CThunderCmdGroup::RecursiveExplodeGetArcAndCir(AcDbEntity* pEnt, AcDbVoidPtrArray& arPtr) { if (pEnt != NULL) { AcDbArc* pArc = AcDbArc::cast(pEnt); if (pArc != NULL) // 圆弧 { AcDbArc* pNewArc = new AcDbArc; pNewArc->copyFrom(pArc); arPtr.append(pNewArc); } else { AcDbCircle* pCir = AcDbCircle::cast(pEnt); if (pCir != NULL) // 圆 { AcDbCircle* pNewCir = new AcDbCircle; pNewCir->copyFrom(pCir); arPtr.append(pNewCir); } else // 其它 { AcDbVoidPtrArray arLoc; pEnt->explode(arLoc); for (int i = 0;i < arLoc.length();++i) { RecursiveExplodeGetArcAndCir((AcDbEntity*)arLoc[i], arPtr); delete (AcDbEntity*) arLoc[i]; } } } } } // 标注半径命令 int CThunderCmdGroup::ThunderDimentRadiusCmd() { TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); TTempDrawState temp(FALSE); //增加避雷线标注 RBList rbMask(RTDXF0, _T("CIRCLE,REGION"),8,LAY_EL_THUNDER_2D,NULL); XPoint ptStart,ptEnd,ptPick; Entity ent; int nRet = SelectEntity1(_T("\n 请选择要标注的对象(圆或面域):<退出>"), ent, ptPick, rbMask); if(nRet != RTNORM) { return 0; } CThunderXData thunXData; //滚球法避雷针判断 if (thunXData.GetGroupNO(ent) <= 0) return 0; ptPick = Ucs2Wcs(ptPick); AcDbCircle* pCircle = NULL; AcDbRegion* pRegion = NULL; AcDbArc* pArc = NULL; CString sProH; double dProH = 0.0; AcDbVoidPtrArray arPtrs; BOOL bSel = FALSE; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if (pEnt != NULL) { pCircle = AcDbCircle::cast(pEnt); if(pCircle != NULL) { CString strHeight = _T(""); // 获取当前避雷针的保护高度 thunXData.GetXData(pCircle,TEL_CURRENT_PROHEIGHT,sProH); dProH = _tstof(sProH); int nMode = OS_INS|OS_INT|OS_NEA|XD_POINT|OS_MID|OS_CEN|OS_END; XPushVar vOsModeOpen(_T("OSMODE"), nMode); ptStart = pCircle->center(); bSel = TRUE; } else { pRegion = AcDbRegion::cast(pEnt); if (pRegion != NULL) { int nMode = OS_INS|OS_INT|OS_NEA|XD_POINT|OS_MID|OS_CEN|OS_END; XPushVar vOsModeOpen(_T("OSMODE"), nMode); thunXData.GetXData(pRegion,TEL_CURRENT_PROHEIGHT,sProH); dProH = _tstof(sProH); RecursiveExplodeGetArcAndCir(pRegion, arPtrs); //AcGePoint3d ptM1,ptM2; AcDbEntity* pTemp = NULL; //AcDbArc* pArc1 = NULL; //AcDbArc* pArc2 = NULL; //double dRaidus = 0.0; double dTmp; std::multimap mapTmp; for (int i = 0;i < arPtrs.length();i++) { pTemp = (AcDbEntity*)arPtrs[i]; pArc = AcDbArc::cast(pTemp); if (pArc != NULL) { dTmp = ptPick.Distance(pArc->center()); mapTmp.insert(std::make_pair(dTmp,pArc)); } else { pCircle = AcDbCircle::cast(pTemp); dTmp = ptPick.Distance(pCircle->center()); mapTmp.insert(std::make_pair(dTmp,pCircle)); } } if (mapTmp.size() > 0) { AcDbEntity* pNew = (AcDbEntity*)mapTmp.begin()->second; pArc = AcDbArc::cast(pNew); if (pArc != NULL) { ptStart = pArc->center(); bSel = TRUE; } else { pCircle = AcDbCircle::cast(pNew); if (pCircle != NULL) { ptStart = pCircle->center(); bSel = TRUE; } } } } } } OPENOBJ_END(); if (bSel) { TelThunderPolyLineJig jig; jig.SetPLinePoints(ptStart,ptPick); jig.SetHeight(dProH); if (pCircle) { jig.SetEntity(pCircle); } else { jig.SetEntity(pArc); } jig.start(); } for (int t = 0;t < arPtrs.length();++t) { delete (AcDbEntity*)arPtrs[t]; } return 0; } // 标注bx命令 int CThunderCmdGroup::ThunderDimentBxCmd() { TCHAR sRet[24]; int nRet = 0; CString sInput; int nType = -1; while(1) { nRet = acedGetString(0,_T("\n标注避雷针(Z)/标注避雷线(L):"),sRet); sInput = sRet; if (nRet == RTCAN) { return 0; } if (nRet == RTNORM) { if (!sInput.CompareNoCase(_T("Z")) || !sInput.CompareNoCase(_T("z")) || sInput.IsEmpty()) { nType = 0; break; } else if (!sInput.CompareNoCase(_T("L")) || !sInput.CompareNoCase(_T("l"))) { nType = 1; break; } } } CLableThunderBX drawBx; switch(nType) { case 0: { drawBx.LablePntBX(); break; } case 1: { drawBx.LabeLineBX(); break; } default:return 0; } return 0; } //局部3d查看命令 int CThunderCmdGroup::ThunderPart3DCmd() { TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); TTempDrawState temp(FALSE); TViewPortThunders view3d(m_pThunderDraw2d); return 0; } // 局部3d查看恢复命令 int CThunderCmdGroup::ThunderPart3DBackCmd() { if (m_pThunderDraw2d == NULL) return 0; TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); TTempDrawState temp(FALSE); KTSetting::InitLayer(LAY_EL_THUNDER_2D); KTSetting::InitLayer(LAY_EL_THUNDER_3D); KTSetting::InitLayer(LAY_EL_TEXT); KTSetting::InitLayer(LAY_EL_THUNDER); KTSetting::InitLayer(LAY_PREVIEW_THUNDER); KTSetting::InitLayer(LAY_EL_LIGHTNING_LINE); // 显示2d层 m_pThunderDraw2d->ShowLayer(LAY_EL_TEXT,TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER,TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_LIGHTNING_LINE,TRUE); m_pThunderDraw2d->ShowLayer(LAY_PREVIEW_THUNDER,FALSE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, FALSE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, TRUE); SHads_command(RTSTR, _T("_view"), RTSTR, _T("_top"), RTNONE); SHads_command(RTSTR, _T("_shademode"), RTSTR, _T("_2"), RTNONE); // 删除预览实体 ThunderContainer->EreasePreview3DSolid(); acedUpdateDisplay(); actrTransactionManager->flushGraphics(); return 0; } // 生成单针防护表格命令 int CThunderCmdGroup::ThunderSinSheetCmd() { // 获取防护表的插入位置 ads_point ptTemp; if (acedGetPoint(NULL, _T("\n 请选择单针防护表的插入位置<退出>: "), ptTemp) != RTNORM) { return 0; } AcGePoint3d ptInsert = asPnt3d(ptTemp); // 获取所有避雷针数据 lstCltResult lstResult; int iColCount = 0; if (m_pThunderDraw2d == NULL) { return 0; } iColCount = m_pThunderDraw2d->GetNowCaculateResult(lstResult); int nSize = (int)lstResult.size(); if (nSize < 1) { return 0; } // 排序 SortAscendEntities(lstResult); // 创建表 TelDrawSheet telSinSheet; telSinSheet.SetLayer(LAY_LIGHTSHEET); double dTextSize(4), dTableHeight(7),dTitleHeight(4); AcDbObjectId idTextStyle = NULL; idTextStyle = KTSetting::InitTextStyle(G_CSDIMSTYLE); TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(dTextSize); gridStyle.SetTextStyleId(idTextStyle); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); telSinSheet.SetRotation(Ucs2Wcs(0.0)); telSinSheet.SetGridStyle(gridStyle); telSinSheet.SetRowHeight(dTableHeight*2); telSinSheet.SetTitleVisible(TRUE); telSinSheet.SetLocation(ptInsert); telSinSheet.InitSheet(nSize + 1, 5+iColCount, dTableHeight*2, 50); AcDbObjectId idStyle = KTSetting::InitTextStyle(G_CSDIMSTYLE); // 设置表格标题 gridStyle.SetTextHeight(6.0); gridStyle.SetVerMode(AcDb::kTextBottom); telSinSheet.SetTitleText(_T("避雷针单针保护范围表")); telSinSheet.SetTitleHeight(0.01); telSinSheet.SetTitleTestStyle(gridStyle); // 设置列列标题 telSinSheet.SetColumnText(0, _T("避雷针组号"), 20); telSinSheet.SetColumnText(1, _T("避雷针编号"), 20); telSinSheet.SetColumnText(2, _T("滚球半径hr(米)"), 35); telSinSheet.SetColumnText(3, _T("避雷针高度h(米)"), 35); for (int k = 0;k < iColCount;++k) { telSinSheet.SetColumnText(4 + k, _T("保护高度hx(米)/\n保护半径rx(米)"), 35); //telSinSheet.SetColumnText(4 + k*2, _T("保护半径rx(米)"), 35); } telSinSheet.SetColumnText(5+iColCount - 1, _T("备注"), 35); // 显示数据 double dRadius = 0.0; double dProHeight = 0.0; double dProRadius = 0.0; CString strTemp = _T(""); lstCltResult::iterator it; AcGeDoubleArray arProHTemp; int i = 0; for (it = lstResult.begin();it != lstResult.end();++it) { // 插入数据 strTemp.Format(_T("%d"),it->m_nGroupNO); telSinSheet.SetText(i + 1, 0, strTemp); strTemp.Format(_T("%d#"), it->m_nNumber); telSinSheet.SetText(i + 1, 1, strTemp); dRadius = it->m_dGroundRadius; strTemp.Format(_T("%.0f"), dRadius); telSinSheet.SetText(i + 1, 2, strTemp); strTemp.Format(_T("%.2f"), it->m_dHeight); telSinSheet.SetText(i + 1, 3, strTemp); //插入保护高度和对应的保护半径 arProHTemp = it->m_arProHeight; SorProHeight(arProHTemp); for (int j = 0;j < arProHTemp.length();++j) { dProHeight = arProHTemp[j]; dProRadius = it->m_dProRadius - pow(dProHeight * (2 * dRadius - dProHeight), 0.5); strTemp.Format(_T("%.2f/%.2f"),dProHeight,dProRadius); telSinSheet.SetText(i + 1, 4 + j, strTemp); } i++; } telSinSheet.AddToCSpace(TRUE); return 0; } // 生成双针防护表格命令 int CThunderCmdGroup::ThunderDblSheetCmd() { // 获取防护表的插入位置 ads_point ptTemp; if (acedGetPoint(NULL, _T("\n 请选择双针防护表的插入位置<退出>: "), ptTemp) != RTNORM) { return 0; } AcGePoint3d ptInsert = asPnt3d(ptTemp); // 获取所有避雷针数据 lstCltResult lstResult; if (m_pThunderDraw2d != NULL) m_pThunderDraw2d->GetNowCaculateResult(lstResult); else return 0; size_t nRtLength = lstResult.size(); if (nRtLength < 2) { acutPrintf(_T("\n 双避雷表至少需要两个避雷针!")); return 0; } CCaculateResult rtTemp; double dScale = 0.0; if (!DocGetMeterUnitDraw()) dScale = 1000.0; else dScale = 1.0; lstCltResult::iterator itStart; std::map mapTemp; std::map::iterator itMap; int nGroupNO = 0; for (itStart = lstResult.begin();itStart != lstResult.end();++itStart) { nGroupNO = itStart->m_nGroupNO; if ((itMap = mapTemp.find(nGroupNO)) != mapTemp.end()) { itMap->second.push_back(*itStart); } else { lstCltResult arSub; arSub.push_back(*itStart); mapTemp.insert(std::make_pair(nGroupNO,arSub)); } } // 统计所有可形成双针保护的避雷针 //CThunderXData thunderData; //del AcArray arDblSheetData; DblSheetData dblData; CString strTemp = _T(""); // int l = 0; //del // int t = 0; //del double dDis = 0.0; AcGeDoubleArray arProHTemp; lstCltResult arSub; lstCltResult::iterator it,itSub; for (itMap = mapTemp.begin();itMap != mapTemp.end();++itMap) { arSub = itMap->second; SortAscendEntities2(arSub); for (it = arSub.begin();it != arSub.end();++it) { itSub = it; itSub++; for (itSub;itSub != arSub.end();++itSub) { strTemp.Format(_T("%d# - %d#"), it->m_nNumber, itSub->m_nNumber); dDis = it->m_ptInsert.distanceTo(itSub->m_ptInsert); // 判断是否可以形成双针保护 //多个保护高度处理 arProHTemp = itSub->m_arProHeight; SorProHeight(arProHTemp); double dHeight1 = 0.0, dRadius = 0.0, dHeight2 = 0.0; for (int k = 0;k < arProHTemp.length();++k) { dHeight1 = it->m_dHeight; dHeight2 = itSub->m_dHeight; dRadius = itSub->m_dGroundRadius; if (fabs(dHeight1 - dHeight2) < 0.01) { if (dDis >= 2 * pow(dHeight2 * dScale * (2 * dRadius * dScale- dHeight2 * dScale), 0.5)) { continue; } } else { if (dDis >= pow(dHeight1 * dScale * (2 * dRadius * dScale - dHeight1 * dScale), 0.5) + pow(dHeight2 * dScale * (2 * dRadius * dScale - dHeight2 * dScale), 0.5)) { continue; } } _tcscpy(dblData.szThunderNumb,strTemp); dblData.dThunderDblDis = dDis / dScale; dblData.nGroupNO = it->m_nGroupNO; dblData.dThunderRadius = it->m_dGroundRadius; double dProHeight = arProHTemp[k]; dblData.dThunderProHeight = dProHeight; // 计算d1 double dTemp = 0.0; // 交换两针高,dHeight1矮针的高度 if (dHeight1 > dHeight2) { dTemp = dHeight1; dHeight1 = dHeight2; dHeight2 = dTemp; } double d1 = ((dRadius - dHeight2) * (dRadius - dHeight2) - (dRadius - dHeight1) * (dRadius - dHeight1) + (dDis/dScale)*(dDis/dScale)) / (2 * dDis/dScale); double dBx = sqrt(dHeight1 * (2 * dRadius - dHeight1) - (d1) * (d1)) - sqrt(dProHeight * (2 * dRadius - dProHeight)); if (dBx > 0.01) { dblData.dThunderBx = dBx; arDblSheetData.append(dblData); } } } } } // 创建表 TelDrawSheet teldblSheet; teldblSheet.SetLayer(LAY_LIGHTSHEET); double dTextSize(4), dTableHeight(7),dTitleHeight(4); AcDbObjectId idTextStyle = NULL; idTextStyle = KTSetting::InitTextStyle(G_CSDIMSTYLE); TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(dTextSize); gridStyle.SetTextStyleId(idTextStyle); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); teldblSheet.SetRotation(Ucs2Wcs(0.0)); teldblSheet.SetGridStyle(gridStyle); teldblSheet.SetRowHeight(dTableHeight); teldblSheet.SetTitleVisible(TRUE); teldblSheet.SetLocation(ptInsert); int xLen = arDblSheetData.length(); teldblSheet.InitSheet(xLen + 1, 7, dTableHeight, 50); // 设置表格标题 gridStyle.SetTextHeight(6.0); gridStyle.SetVerMode(AcDb::kTextBottom); teldblSheet.SetTitleText(_T("避雷针双针联合保护范围表")); teldblSheet.SetTitleHeight(0.01); teldblSheet.SetTitleTestStyle(gridStyle); // 设置列标题 teldblSheet.SetColumnText(0, _T("避雷针组号"), 35); teldblSheet.SetColumnText(1, _T("避雷针编号"), 35); teldblSheet.SetColumnText(2, _T("滚球半径hr(米)"), 35); teldblSheet.SetColumnText(3, _T("保护高度hx(米)"), 35); teldblSheet.SetColumnText(4, _T("两针间距d(米)"), 35); teldblSheet.SetColumnText(5, _T("联合保护范围bx(米)"), 35); teldblSheet.SetColumnText(6, _T("备注"), 35); // 将数据添加到双针保护表 CString strTemp1 = _T(""); for (int tt = 0;tt < arDblSheetData.length();tt++) { strTemp1.Format(_T("%.2f"), arDblSheetData[tt].dThunderBx); teldblSheet.SetText(tt+1, 5, strTemp1); strTemp1.Format(_T("%d"),arDblSheetData[tt].nGroupNO); teldblSheet.SetText(tt+1, 0, strTemp1); strTemp1 = arDblSheetData[tt].szThunderNumb; teldblSheet.SetText(tt+1, 1, strTemp1); strTemp1.Format(_T("%.0f"), arDblSheetData[tt].dThunderRadius); teldblSheet.SetText(tt+1, 2, strTemp1); strTemp1.Format(_T("%.2f"), arDblSheetData[tt].dThunderProHeight); teldblSheet.SetText(tt+1, 3, strTemp1); strTemp1.Format(_T("%.2f"), arDblSheetData[tt].dThunderDblDis); teldblSheet.SetText(tt+1, 4, strTemp1); } teldblSheet.AddToCSpace(TRUE); return 0; } // typedef std::list lstCltResult; // 排序所有过滤的实体Entity void CThunderCmdGroup::SortAscendEntities(lstCltResult& lstSrc) { // 先按组号排序再按编号排序每组的避雷针 lstCltResult::iterator it; std::map mapTemp; std::map::iterator itMap; int nGroupNO = 0; for (it = lstSrc.begin();it != lstSrc.end();++it) { nGroupNO = it->m_nGroupNO; if ((itMap = mapTemp.find(nGroupNO)) != mapTemp.end()) { itMap->second.push_back(*it); } else { lstCltResult arSub; arSub.push_back(*it); mapTemp.insert(std::make_pair(nGroupNO,arSub)); } } lstSrc.clear(); lstCltResult lstSub; for (itMap = mapTemp.begin();itMap != mapTemp.end();++itMap) { lstSub = itMap->second; SortAscendEntities2(lstSub); for (it = lstSub.begin();it != lstSub.end();++it) { lstSrc.push_back(*it); } } } void CThunderCmdGroup::SortAscendEntities2(lstCltResult& lstSrc) { if (lstSrc.size() > 1) { std::map mapTemp; std::map::iterator itMap; lstCltResult::iterator itSub; for (itSub = lstSrc.begin();itSub != lstSrc.end();++itSub) { mapTemp.insert(std::make_pair(itSub->m_nNumber,*itSub)); } lstSrc.clear(); for (itMap = mapTemp.begin();itMap != mapTemp.end();++itMap) { lstSrc.push_back(itMap->second); } } } //删除标注半径 void CThunderCmdGroup::DeleteOldDim(AcDbCircle* pCircle) { if (pCircle == NULL) return; double dRadius = pCircle->radius(); AcDbPolyline *pPLine = new AcDbPolyline; XPoint pt = pCircle->center(); pt.z = 0; XPoint ptLeft = pt; XPoint ptRight = pt; ptLeft.x -= dRadius; ptRight.x += dRadius; AcGeVector3d vt1(ptLeft-pt); AcGeVector3d vt2(ptRight-pt); double dAngle1 = vt1.angleTo(vt2); double dBulge1 = tan(0.25 * dAngle1); double dAngle2 = vt2.angleTo(vt1); double dBulge2 = tan(0.25 * dAngle2); pPLine->addVertexAt(0,ptLeft,dBulge1); pPLine->addVertexAt(1,ptRight,dBulge2); pPLine->addVertexAt(2,ptLeft,dBulge1); PickSet ss(SS_FREE); RBList rbMask(RTDXF0, _T("TEXT,LWPOLYLINE"), NULL); XPoly2D poly; PolyConvert(*pPLine, poly); delete pPLine; XPoint ptLow,ptUp; poly.GetExtend(ptLow,ptUp); //Groups(0) wcs, Groups(1) ucs poly.TransUCS(Groups(0), Groups(1)); RBList rbFence = poly.Fence(); AssureInCurrentView(ptLow, ptUp); ss.Get(_T("CP"), rbFence, NULL, rbMask); int iTest = ss.Length(); CStringArray arData; AcDbObjectId id; for (long i = 0; i < ss.Length(); ++i) { arData.RemoveAll(); acdbGetObjectId(id,ss[i]); CThunderXData data; data.GetBaseInformationExData(id,arData,TEL_THUNDER_LABLE); if (arData.GetSize() > 0) { if (arData[0].CompareNoCase(_T("FORDEL")) == 0) ss[i].Erase(); } } } // 判断点是否在此圆弧上 bool CThunderCmdGroup::PointIsAtAcDbArc(const AcGePoint3d& ptTest, AcDbArc* pArc) { // 测试点到圆弧圆心的距离和此圆弧半径相等则点在此圆弧上 if (pArc == NULL) { return false; } AcGePoint3d ptArc = pArc->center(); double dDistance = ptTest.distanceTo(ptArc); double dArcRadius = pArc->radius(); if (fabs(dDistance - dArcRadius) > 0.001) { return false; } else { return true; } } //ARX加载 void CThunderCmdGroup::OnLoadApp() { if (m_pThunderDocReactor != NULL) { m_pThunderDocReactor->SetThunderDraw2D(m_pThunderDraw2d); m_pThunderDocReactor->SetThunderDbReactor(m_pThunderReactor); m_pThunderEditReactor->SetThunderDbReactor(m_pThunderReactor); acDocManager->addReactor(m_pThunderDocReactor); } if (m_pThunderReactor != NULL) { acdbCurDwg()->addReactor(m_pThunderReactor); } if (m_pThunderEditReactor != NULL) { acedEditor->addReactor(m_pThunderEditReactor); } } //ARX卸载 void CThunderCmdGroup::OnUnloadApp() { //卸载文档反应器 acDocManager->removeReactor(m_pThunderDocReactor); //卸载命令反应器 acedEditor->removeReactor(m_pThunderEditReactor); //卸载数据库反应器 AcApDocumentIterator *pIter = acDocManager->newAcApDocumentIterator(); if (pIter == NULL) return; for (;!pIter->done();pIter->step()) { (pIter->document()->database())->removeReactor(m_pThunderReactor); } delete pIter; } // 获取指定避雷针的保护高度 bool CThunderCmdGroup::GetCurPinProHeight(AcDbCircle* pCircle, CString& strHeight) { if (pCircle == NULL) { return false; } // 获取圆的id AcDbObjectId circleId = pCircle->objectId(); if (circleId == AcDbObjectId::kNull) { return false; } // 由圆id获取避雷针ID CThunderXData thunderXData; AcDbObjectId thundId; if (!thunderXData.GetEntityIdFromExData(circleId, thundId, TEL_THUNDER_ID)) { return false; } CStringArray arsDatas; if (!thunderXData.GetBaseInformationExData(circleId,arsDatas,TEL_THUNDER_PROHT)) { return false; } strHeight = arsDatas[0]; return true; } //建筑高度 int CThunderCmdGroup::ThunderArchHeight() { PickSet ssAll(SS_FREE); RBList rbMask(RTDXF0, _T("LWPOLYLINE,3DSOLID,CIRCLE"), NULL); Entity ent; if (SelectEntities(_T("请选择PLINE线,圆或3D实体:"),ssAll,rbMask) != RTNORM) return 0; double dHeight = 0.0; if (acedGetReal(_T("请输入高度(m):"),&dHeight) != RTNORM) return 0; if (!DocGetMeterUnitDraw()) dHeight *= 1000; CString sLayer; AcDbRegion *pReg = NULL; for (long i = 0; i < ssAll.Length(); ++i) { ent = ssAll[i]; AcDb3dSolid *pSolid = new AcDb3dSolid; if (ent.Is(_T("3DSOLID"))) { OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDb3dSolid,pOldSolid) { if (pSolid != NULL) { sLayer = pSolid->layer(); AcGePoint3d ptOrg(0,0,0); AcGePlane plan(ptOrg,AcGeVector3d::kXAxis,AcGeVector3d::kYAxis); pOldSolid->getSection(plan,pReg); } } OPENOBJ_END(); if (sLayer.CompareNoCase(LAY_EL_THUNDER_3D) == 0) continue; if (pReg != NULL) { pSolid->extrude(pReg,dHeight,0); pSolid->setColorIndex(1); AddToCurrentSpace(pSolid,Adesk::kTrue); } ent.Erase(); } else { AcDbVoidPtrArray arRegs; OPENOBJ_BEGIN(ent,AcDb::kForWrite,AcDbPolyline,pPline) { if (pPline != NULL) { pPline->setClosed(Adesk::kTrue); arRegs.append(pPline); } } OPENOBJ_END(); OPENOBJ_BEGIN(ent,AcDb::kForWrite,AcDbCircle,pCircle) { if (pCircle != NULL) { CString sLayer = pCircle->layer(); if (sLayer.CompareNoCase(LAY_EL_THUNDER_2D) != 0) arRegs.append(pCircle); } } OPENOBJ_END(); Acad::ErrorStatus es = Acad::eOutOfMemory; //生成3D实体 int nLen = arRegs.length(); AcDbVoidPtrArray arRegions; arRegions.setPhysicalLength(10); arRegions.setGrowLength(1); es = AcDbRegion::createFromCurves(arRegs, arRegions); if (arRegions.length() <= 0) continue; AcDbRegion *pReg = AcDbRegion::cast((AcRxObject*)arRegions[0]); if (pReg != NULL) { pSolid->extrude(pReg,dHeight,0); pSolid->setColorIndex(1); AddToCurrentSpace(pSolid,Adesk::kTrue); } for (int i = 0; i < arRegions.length(); ++i) { delete (AcDbEntity*)arRegions[i]; } } } return 0; } //计算书 int CThunderCmdGroup::ThunderCaculateBook() { lstCltResult lstResult; if (m_pThunderDraw2d != NULL) m_pThunderDraw2d->GetNowCaculateResult(lstResult); if (lstResult.size() < 2) { AfxMessageBox(_T("避雷针少于2个,无法出计算书!")); return 0; } SortAscendEntities(lstResult); lstCltResult::iterator itStart; std::map mapTemp; std::map::iterator itMap; int nGroupNO = 0; for (itStart = lstResult.begin();itStart != lstResult.end();++itStart) { nGroupNO = itStart->m_nGroupNO; if ((itMap = mapTemp.find(nGroupNO)) != mapTemp.end()) { itMap->second.push_back(*itStart); } else { lstCltResult arSub; arSub.push_back(*itStart); mapTemp.insert(std::make_pair(nGroupNO,arSub)); } } //初始化 TelCreateWordApp word; word.SetAlignment(1); // 0: 居左 1:居中 2:居右 //设置文字样式 word.SetFont(_T("黑体"),18,0); word.TypeText(_T("滚球法防雷设计计算书\n\n")); word.SetAlignment(0); CString sTempText; CString sGroundType; //del int nNumber = 0; double dHeight = 0.0; double dGroundRadius = 0.0; double dProHeight = 0.0; double dProRadius0 = 0.0; double dProRadiusX = 0.0; double dDis = 0.0; double dBx = 0.0; double dH0 = 0.0; double dHeight1 = 0.0; double dHeight2 = 0.0; double dD1 = 0.0; AcGeDoubleArray arProHTemp; word.SetFont(_T("宋体"),10,0); //bsl 2011.9.27 规范更新 //word.TypeText(_T("工程名:\n计算者:\n计算时间:\n参考规范:《建筑物防雷设计规范》(2000年版)\n\n")); word.TypeText(_T("工程名:\n计算者:\n计算时间:\n参考规范:《建筑物防雷设计规范》GB50057―2010\n\n")); lstCltResult::iterator it,itSub; lstCltResult lstGroup; for (itMap = mapTemp.begin();itMap != mapTemp.end();++itMap) { lstGroup = itMap->second; if (lstGroup.size() < 2) { continue; } SortAscendEntities2(lstGroup); for (it = lstGroup.begin();it != lstGroup.end();++it) { nGroupNO = it->m_nGroupNO; // 组号 nNumber = it->m_nNumber; // 编号 dHeight = it->m_dHeight; // 针高 dGroundRadius = it->m_dGroundRadius; //多保护高度处理 arProHTemp = it->m_arProHeight; SorProHeight(arProHTemp); for (int j = 0;j < arProHTemp.length();++j) { dProHeight = arProHTemp[j]; dProRadius0 = it->m_dProRadius; dProRadiusX = dProRadius0 - pow(dProHeight*(2*dGroundRadius - dProHeight),0.5); word.SetFont(_T("宋体"),12,1); word.TypeText(_T("已知条件\n")); word.SetFont(_T("宋体"),10,0); sTempText.Format(_T(" 算法:滚球法\n 避雷针组号%d\n 避雷针编号%d\n 针高:%.2f米\n 避雷针计算高度:%.2f米\n 被保护物的防雷等级要求:滚球半径%.0f米\n 被保护物的高度:%.2f米\n\n"),nGroupNO,nNumber,dHeight,dHeight,dGroundRadius,dProHeight); word.TypeText(sTempText); word.SetFont(_T("宋体"),12,1); word.TypeText(_T("计算过程和公式\n")); word.SetFont(_T("宋体"),10,0); sTempText.Format(_T(" r0 =√[h*(2hr -h)] \n =√[%.2f*(2*%.2f -%.2f)] \n =%.2f(米)\n"),dHeight,dGroundRadius,dHeight,dProRadius0); word.TypeText(sTempText); sTempText.Format(_T(" rx =√[h*(2hr -h)] - √[hx (2hr -hx )] \n =√[%.2f*(2*%.2f -%.2f)] - √[%.2f (2*%.2f -%.2f )]\n =%.2f(米)\n"),dHeight,dGroundRadius,dHeight,dProHeight,dGroundRadius,dProHeight,dProRadiusX); word.TypeText(sTempText); itSub = it; itSub++; for (itSub;itSub != lstGroup.end();++itSub) { dHeight1 = it->m_dHeight; dHeight2 = itSub->m_dHeight; dDis = it->m_ptInsert.distanceTo(itSub->m_ptInsert); if (!DocGetMeterUnitDraw()) dDis /= 1000; dD1 = (pow((dGroundRadius - dHeight2),2) - pow((dGroundRadius - dHeight1),2) + dDis*dDis)/(2*dDis); dBx = pow(dHeight*(2*dGroundRadius - dHeight) - dD1*dD1,0.5) - pow(dProHeight*(2*dGroundRadius - dProHeight),0.5); dH0 = dGroundRadius - pow(pow((dGroundRadius - dHeight),2) + dD1*dD1,0.5); if (dH0 < 0) continue; if (fabs(dHeight1 - dHeight2) > 0.01) sTempText.Format(_T("%d-%d\n 两针距离 D = %.2f\n D1 = [(hr - h2)*(hr - h2) - (hr - h1)*(hr - h1) + D*D]/(2*D)\n = [(%.2f - %.2f)*(%.2f - %.2f) - (%.2f - %.2f)*(%.2f - %.2f) + %.2f*%.2f]/(2*%.2f)\n = %.2f(米)\n"),it->m_nNumber,itSub->m_nNumber,dDis,dGroundRadius,dHeight2,dGroundRadius,dHeight2,dGroundRadius,dHeight1,dGroundRadius,dHeight1,dDis,dDis,dDis,dD1); else sTempText.Format(_T("%d-%d\n 两针距离 D = %.2f\n D1 = D/2\n = %.2f/2\n = %.2f(米)\n"),it->m_nNumber,itSub->m_nNumber,dDis,dDis,dDis/2); word.TypeText(sTempText); sTempText.Format(_T(" Bx =√[h(2*hr -h)-D1*D1] - √[hx(2*hr - hx)]\n =√[%.2f(2*%.2f -%.2f)-%.2f*%.2f] - √[%.2f(2*%.2f - %.2f)]\n =%.2f(米)\n"),dHeight,dGroundRadius,dHeight,dD1,dD1,dProHeight,dGroundRadius,dProHeight,dBx); if (dBx > 0) word.TypeText(sTempText); sTempText.Format(_T(" 中心点最低高度h0\n h0 =hr - √[(hr - h)*(hr - h) +D1*D1]\n =%.2f - √[(%.2f - %.2f)*(%.2f - %.2f) +%.2f*%.2f]\n =%.2f(米)\n"),dGroundRadius,dGroundRadius,dHeight,dGroundRadius,dHeight,dD1,dD1,dH0); if (dH0 > 0) word.TypeText(sTempText); } word.SetFont(_T("宋体"),12,1); word.TypeText(_T("计算结果\n")); word.SetFont(_T("宋体"),10,0); sTempText.Format(_T(" 避雷针在%.2f米处的保护范围为%.2f米\n\n"),dProHeight,dProRadiusX); word.TypeText(sTempText); } } } return 0; } void CThunderCmdGroup::SorProHeight(AcGeDoubleArray& arPro) { std::list lstTemp; std::list::iterator it; for (int i = 0;i < arPro.length();++i) { lstTemp.push_back(arPro[i]); } lstTemp.sort(); arPro.setLogicalLength(0); for (it = lstTemp.begin();it != lstTemp.end();++it) { arPro.append(*it); } } // 避雷剖切 int CThunderCmdGroup::ThunderSection() { if (m_pThunderDraw2d == NULL) { return 0; } TCHAR szNO[50]; if (ads_getstring(0, _T("\n 请输入剖切编号<1>:"), szNO) != RTNORM) { return 0; } CString sNO = szNO; if(sNO.IsEmpty()) { sNO = _T("1"); } ads_point ptFir; if(acedGetPoint(NULL,_T("\n 点取第一个剖切点<退出>: "), ptFir) != RTNORM) { return 0; } // 正交打开 XPushVar vOrthoMode(_T("ORTHOMODE"), 1); //f8 acdbUcs2Wcs(ptFir, ptFir, false); AcGePoint3d ptF = asPnt3d(ptFir); XPoly2D poly(0); poly.AppendNode(ptF); poly.AppendNode(ptF); AecDbSymbSection ent; ent.SetText(sNO); ent.SetLayoutRotation(Ucs2Wcs(0.0)); ent.setLayer(ent.GetDefaultLayer()); ent.SetTextStyleId(KTSetting::InitTextStyle(TS_EL_LABEL)); ent.SetTextLayerId(KTSetting::InitLayer(LAY_EL_TEXT, false)); ent.SetViewLine(TRUE); ent.SetPoly2D(poly); TThunderSectionJig jig(&ent); jig.SetPrompt(_T("\n 点取第二个剖切点<退出>:")); jig.SetOperCode(TThunderSectionJig::kSectPoint); if(jig.DoIt() != RTNORM) { return 0; } ent.GetPoly2D(poly); jig.SetPrompt(_T("\n 点取剖视方向<当前方向>:")); jig.SetOperCode(TThunderSectionJig::kViewDirection); int nRet = jig.DoIt(); AcDbObjectId idSec; if((nRet == RTNORM || nRet == RTNONE) && ent.IsValid()) { ent.SetTextLocation(0, ent.GetDefaultTextLocation(0)); ent.SetTextLocation(1, ent.GetDefaultTextLocation(1)); idSec = ((AecEntity*)ent.clone())->AddToCSpace(Adesk::kTrue); } // 剖切点 AcGePoint3d pt1,pt2; ent.GetPoly2D(poly); if (poly.Length() > 0) { pt1 = *poly[0]; pt2 = *poly[1]; } AcDbLine ln(pt1, pt2); AcGePoint3d ptOn; ln.getClosestPointTo(jig.GetDirPosition(), ptOn, Adesk::kTrue); AcGeVector3d vtDir = jig.GetDirPosition() - ptOn; AcGePoint3d pt3 = pt2 + vtDir; AcGePoint3d pt4 = pt1 + vtDir; m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, FALSE); acedUpdateDisplay(); actrTransactionManager->flushGraphics(); // 过滤实体 PickSet ssSel(SS_FREE); XPoint xp1(Wcs2Ucs(pt1)), xp2(Wcs2Ucs(pt2)), xp3(Wcs2Ucs(pt3)), xp4(Wcs2Ucs(pt4)); RBList pPtLst = acutBuildList(RTPOINT,&xp1,RTPOINT,&xp2,RTPOINT,&xp3, RTPOINT,&xp4,NULL); RBList lstRb3d = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); acedSSGet(_T("CP"), pPtLst, NULL, lstRb3d, ssSel); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, FALSE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, TRUE); if (ssSel.Length() > 0) { TCreateThunderSection sec(pt1, pt2, vtDir, ssSel); } return 0; } // 绘制避雷线 int CThunderCmdGroup::DrawThunderLine() { XPushVar vOrthoMode(_T("ORTHOMODE"), 1); CAcModuleResourceOverride myResources; KTSetting::InitLayer(LAY_EL_THUNDER_2D); KTSetting::InitLayer(LAY_EL_THUNDER_3D); KTSetting::InitLayer(LAY_EL_TEXT); KTSetting::InitLayer(LAY_EL_THUNDER); KTSetting::InitLayer(LAY_EL_LIGHTNING_LINE); KTSetting::InitLayer(LAY_PREVIEW_THUNDER); if (m_pThunderDraw2d != NULL) { m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_2D, TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_LIGHTNING_LINE, TRUE); m_pThunderDraw2d->ShowLayer(LAY_EL_THUNDER_3D, FALSE); m_pThunderDraw2d->ShowLayer(LAY_PREVIEW_THUNDER, FALSE); } CThunderLineSetDlg dlg; if (!dlg.DoModeless()) { return 0; } AdjustWndToViewport(&dlg); dlg.SetThunderDraw2d(m_pThunderDraw2d); TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); AcDbObjectId idNew; while (true) { // 绘制避雷带 if (!dlg.DrawThunderLine(idNew)) { break; } } dlg.DestroyWindow(); acedPostCommand(_T("\33\33")); return 0; } int CThunderCmdGroup::ThunderEditLineCmd() { RBList rbMask = ads_buildlist(RTDXF0, _T("LWPOLYLINE"), NULL); Entity ent; int nRet = 0; nRet = SelectEntity(_T("请选择需要修改的避雷线:<退出>"),ent,rbMask); if (nRet != RTNORM) { return 0; } CThunderXData ThunderXData; CString sNo = _T(""); AcDbObjectId idThunderLine; acdbGetObjectId(idThunderLine,ent); ThunderXData.GetXData(idThunderLine,KEY_LINE_GROUP_NO,sNo); if (!sNo.IsEmpty()) { CAcModuleResourceOverride myResources; CThunderLineSetDlg dlg; dlg.SetUseType(CThunderLineSetDlg::eEdit); dlg.SetCurrectThunderLine(idThunderLine); dlg.DoModal(); } return 0; } int CThunderCmdGroup::ThunderEraseLineCmd() { RBList rb = ads_buildlist(RTDXF0,_T("LWPOLYLINE"),NULL); PickSet ss(SS_FREE); int nRet = SelectEntities(_T("请选择要删除的避雷线:<退出>"),ss,rb); if (nRet != RTNORM) { return 0; } CThunderXData thundXData; CString sNO = _T(""); for (long i = 0;i < ss.Length();i++) { OPENOBJ_BEGIN(ss[i],AcDb::kForWrite,AcDbPolyline,pLine); if (pLine) { thundXData.GetXData((AcDbEntity*)pLine,KEY_LINE_GROUP_NO,sNO); if (!sNO.IsEmpty()) { pLine->erase(); } } OPENOBJ_END(); } return 0; } int CThunderCmdGroup::ThunderMoveLineCmd() { RBList rb = ads_buildlist(RTDXF0,_T("LWPOLYLINE"),NULL); Entity ent; int nRet = 0; nRet = SelectEntity(_T("请选择要移动的避雷线:<退出>"),ent,rb); if (nRet != RTNORM) { return 0; } AcGePoint3d ptS,ptE,ptPick,ptEnd; CThunderXData thundXData; CString sNO = _T(""); BOOL bSel = FALSE; OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbPolyline,pLine); if (pLine) { thundXData.GetXData((AcDbEntity*)pLine,KEY_LINE_GROUP_NO,sNO); if (!sNO.IsEmpty()) { pLine->getStartPoint(ptS); pLine->getEndPoint(ptE); ptPick = AcGePoint3d((ptS.x + ptE.x) / 2.0,(ptS.y + ptE.y) / 2.0,(ptS.z + ptE.z) / 2.0); bSel = TRUE; } } OPENOBJ_END(); if (bSel) { ads_point ptStart,pt; AcGePoint3d ptTemp; nRet = acedGetPoint(NULL,_T("\n请指定基点<退出>:"),pt); if(nRet != RTNORM) return 0; ptPick = asPnt3d(pt); ptPick.z = ptS.z; ptTemp = Wcs2Ucs(ptPick); ptStart[X] = ptTemp.x; ptStart[Y] = ptTemp.y; ptStart[Z] = ptS.z; nRet = acedGetPoint(ptStart,_T("\n请选择要移动到的位置<退出>"),pt); if(nRet != RTNORM) return 0; ptEnd = Ucs2Wcs(asPnt3d(pt)); ptEnd[Z] = ptS.z; //PickSet ss(SS_FREE); //ss += ent; //SHads_command(RTSTR,_T("MOVE"),RTPICKS,(LONG_PTR*)ss,RTSTR,_T(""),RT3DPOINT,&ptPick,RT3DPOINT,&ptEnd,RTNONE); OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbPolyline,pLine); if (pLine) { thundXData.GetXData((AcDbEntity*)pLine,KEY_LINE_GROUP_NO,sNO); if (!sNO.IsEmpty()) { if (pLine->upgradeOpen() == Acad::eOk) { AcGeMatrix3d mat; AcGeVector3d vtTranf = ptEnd - ptPick; mat.setTranslation(vtTranf); pLine->transformBy(mat); pLine->downgradeOpen(); } } } OPENOBJ_END(); } return 0; } void CThunderCmdGroup::AdjustWndToViewport(CWnd* pWnd,int nXOff,int nYOff) { if (pWnd != NULL) { CRect rect,rectWnd; acedGetAcadFrame()->GetWindowRect(rect); pWnd->GetWindowRect(&rectWnd); if (!PtInRect(rect, rectWnd.TopLeft()) && !PtInRect(rect, rectWnd.BottomRight())) { int nX = rect.TopLeft().x + nXOff; int nY = rect.TopLeft().y = nYOff; pWnd->MoveWindow(nX,nY,rectWnd.Width(),rectWnd.Height()); } } } int CThunderCmdGroup::newspheretest() { AcDbObjectId idSign = AcDbObjectId::kNull; AcDb3dSolid *pSolid = new AcDb3dSolid; if (pSolid != NULL) { pSolid->createSphere(200); pSolid->setColorIndex(1); pSolid->setVisibility(AcDb::kVisible); idSign = AddToCurrentSpace(pSolid,Adesk::kTrue); } return 0; } /******************折线法 命令***********************/ int CThunderCmdGroup::FoldSetPinCmd() { CAcModuleResourceOverride myResources; CFoldSetDlg dlg; dlg.DoModal(); return 0; } // 插避雷针 int CThunderCmdGroup::FoldLayPinCmd() { CAcModuleResourceOverride myResources; CString xstrTemp; xstrTemp.Format(_T("$Ectrical$%s"),FOLD_BLOCK_SIGN); AcDbObjectId idBlock = InitBlock((const TCHAR*)xstrTemp); int nKeyInput = 0; CFoldLayPinDlg* pDlg = new CFoldLayPinDlg; if (pDlg != NULL) { pDlg->DoModeless(); } CFoldPinJig jig; AcGePoint3d ptIns; jig.SetDlgPtr(pDlg); jig.SetProBlock(idBlock); jig.SetBlockName((const TCHAR*)xstrTemp); jig.setDispPrompt(_T("\n请选择插入点<退出>:")); while (jig.DoIt(&nKeyInput) == RTNORM) { //插避雷针 ptIns = jig.GetLastPoint(); CString sGroupNo = pDlg->GetGroupNo(); if (_ttoi(sGroupNo) < 1) { AfxMessageBox(_T("避雷针组号应大于0!")); return TRUE; } CString sNum = pDlg->GetNo(); if (_ttoi(sNum) < 1) { AfxMessageBox(_T("避雷针编号应大于0!")); return TRUE; } //更新对话框数据 if (!pDlg->GetDlgData()) { return TRUE; } KTSetting::InitLayer(LAY_EL_THUNDER); XPushVarStr cLayer(_T("CLAYER"), LAY_EL_THUNDER); XPushVar vOsMode(_T("OSMODE"), 0); double dBlockScale = pDlg->GetBlkScale(); if (dBlockScale < 1e-3) { dBlockScale = 1.0; } //插入图块 XPoint xp(Wcs2Ucs(ptIns)); SHads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR*)xstrTemp, RT3DPOINT, &xp, RTREAL, dBlockScale*10*DocGetPScale(), RTREAL, dBlockScale*10*DocGetPScale(), RTREAL,0.0,RTSTR, _T(""), RTNONE); Entity entLast; entLast.GetLast(); AcDbObjectId idEnt; acdbGetObjectId(idEnt, entLast); CString strText; strText += sNum; CString sPinHeight = pDlg->GetPinHeight(); //标注 strText += _T("#,h="); strText += sPinHeight; strText += _T("m"); double dTextHeight = pDlg->GetTextHeight(); SetBlkAttrText(entLast, strText, _T("$TEXT$"), dTextHeight, TRUE, TRUE); //写扩展数据 pDlg->SetCurrentExData(idEnt); // 设置避雷针组号 CThunderXData thundXData; thundXData.SetXData(idEnt, KEY_FOLD_GROUP_NO, sGroupNo); //记忆最后一次组号 CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.SetValue(KEY_FOLD_LAST_GROUPNO,sGroupNo); // 设置避雷针编号 thundXData.SetXData(idEnt, TEL_ORDER_NUMBER, sNum); //设置保护高度 AcGeDoubleArray arProHeight; pDlg->GetDlgProHT(arProHeight); thundXData.SetFoldProHeightToObjEx(idEnt,arProHeight); //记录保护高度设置到注册表,保持记忆 thundXData.SetProtectHeightToReg(arProHeight,KEY_FOLD_THUNDER_MULTIPROHT); //设置折线法标志 thundXData.SetXData(idEnt,TEL_THUNDER_TYPE,_T("1")); // 新插入的避雷针入库 FoldManager->AddFoldPinToMap(idEnt); //显示2维联合范围 FoldManager->ShowUnionPro2d(idEnt); CString sNO; sNO.Format(_T("%d"), _ttoi(sNum)+1); pDlg->SetNo(sNO); acedUpdateDisplay(); actrTransactionManager->flushGraphics(); } return 0; } int CThunderCmdGroup::FoldErasePinCmd() { //删除折线法避雷针 // RBList rb = ads_buildlist(RTDXF0,_T("INSERT"),8,LAY_EL_THUNDER,RTNONE); // PickSet ss(SS_FREE); // int nRet = SelectEntities(_T("\n请选择需要删除的避雷针<退出>"),ss,rb); // if (nRet != RTNORM) // { // return 0; // } // // Entity ent; // CThunderXData thunderXdata; // CString sType,sGroup; // AcDbObjectId oid; // for (long i = 0;i < ss.Length();++i) // { // acdbGetObjectId(oid,ss[i]); // thunderXdata.GetXData(oid,TEL_GROUP_NO,sGroup); // if (!sGroup.IsEmpty()) // { // thunderXdata.GetXData(oid,TEL_THUNDER_TYPE,sType); // if (sType.CompareNoCase(_T("1")) == 0) // { // //折线法避雷针 // FoldManager->DelFoldPinFromMap(sGroup,oid); // } // } // // OPENOBJ_BEGIN(oid,AcDb::kForWrite,AcDbEntity,pEnt); // if (pEnt) // { // //删除避雷针 // pEnt->erase(); // } // OPENOBJ_END(); // } // // FoldManager->ShowUnionPro2d(sGroup); //删除折线法避雷针 RBList rb = ads_buildlist(RTDXF0,_T("INSERT"),RTNONE); PickSet ss(SS_FREE); int nRet = SelectEntities(_T("\n请选择需要删除的避雷针<退出>"),ss,rb); if (nRet != RTNORM) { return 0; } Entity ent; CThunderXData thunderXdata; CString sType,sGroup; AcDbObjectId oid; //禁止更新 CThunderCmdGroup::bReDrawFold = FALSE; std::vector arGroup; typedef std::vector::iterator ITT; for (long i = 0;i < ss.Length();++i) { acdbGetObjectId(oid,ss[i]); thunderXdata.GetXData(oid,KEY_FOLD_GROUP_NO,sGroup); if (!sGroup.IsEmpty()) { thunderXdata.GetXData(oid,TEL_THUNDER_TYPE,sType); if (sType.CompareNoCase(_T("1")) == 0) { //折线法避雷针 FoldManager->DelFoldPinFromMap(sGroup,oid); if (std::find(arGroup.begin(),arGroup.end(),sGroup) == arGroup.end()) { arGroup.push_back(sGroup); } } } OPENOBJ_BEGIN(oid,AcDb::kForWrite,AcDbEntity,pEnt); if (pEnt) { //删除避雷针 pEnt->erase(); } OPENOBJ_END(); } for (unsigned t = 0;t < arGroup.size();++t) { FoldManager->ShowUnionPro2d(sGroup); } CThunderCmdGroup::bReDrawFold = TRUE; return 0; } int CThunderCmdGroup::FoldEditPinCmd() { Entity ent; RBList rbMask = ads_buildlist(RTDXF0, _T("INSERT"), NULL); if(SelectEntity(_T("\n 请在编号上选择要编辑的避雷针<退出>:"), ent, rbMask) != RTNORM) { return 0; } AcDbObjectId idThunder; acdbGetObjectId(idThunder,ent); if (idThunder.isValid()) { CAcModuleResourceOverride myResources; CThunderXData thunderXData; CString sType = _T(""); thunderXData.GetXData(idThunder,TEL_THUNDER_TYPE,sType); if (sType.CompareNoCase(_T("1")) == 0) { //折线避雷针 CFoldLayPinDlg dlg(idThunder,TRUE); dlg.DoModal(); } } return 0; } int CThunderCmdGroup::FoldMovePinCmd() { Entity ent; RBList rb = ads_buildlist(RTDXF0,_T("INSERT"),RTNONE); if(SelectEntity(_T("\n 请在编号上选择要移动的避雷针<退出>:"), ent, rb) != RTNORM) { return 0; } CThunderXData thunderXdata; //是否折线法避雷针 CString sGroupNo = _T(""); int nGroupNo = thunderXdata.GetFoldGroupNO(ent); if (nGroupNo <= 0) return 0; sGroupNo.Format(_T("%d"),nGroupNo); AcDbObjectId idThunder; acdbGetObjectId(idThunder,ent); XPoint ptPos,ptDes; ent.GetData(10,ptPos); acedGetPoint(Wcs2Ucs(ptPos),_T("\n点取目标位置:"),ptDes); AcGeMatrix3d matrix; AcGeVector3d vtTrans = ptDes - ptPos; matrix.setToTranslation(vtTrans); OPENOBJ_BEGIN(ent,AcDb::kForWrite,AcDbEntity,pRef); if (pRef) { pRef->transformBy(matrix); } OPENOBJ_END(); FoldManager->UpdateFoldPinInMap(nGroupNo,idThunder); FoldManager->ShowUnionPro2d(sGroupNo); return 0; } int CThunderCmdGroup::maptest() { std::map arMap; // arMap.insert(std::make_pair(100,_T("a"))); // arMap.insert(std::make_pair(50,_T("a"))); // arMap.insert(std::make_pair(200,_T("a"))); // arMap.insert(std::make_pair(10,_T("a"))); // arMap.insert(std::make_pair(30,_T("a"))); // arMap.insert(std::make_pair(20,_T("a"))); // arMap.insert(std::make_pair(150,_T("a"))); // arMap.insert(std::make_pair(170,_T("a"))); std::map::iterator itor; CString sTemp; for (itor = arMap.begin();itor != arMap.end();++itor) { sTemp.Format(_T("%d,"),itor->first); ads_prompt(sTemp); } return 0; } // 标注半径 int CThunderCmdGroup::FoldDimentRadiusCmd() { // 环境 TReactorAssociate rctAct(acdbCurDwg(), m_pThunderReactor); TTempDrawState temp(FALSE); RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); XPoint ptStart, ptPick; Entity ent; int nRet = SelectEntity1(_T("\n 请选择要标注的对象<退出>:"), ent, ptPick, rbMask); if(nRet != RTNORM) { return 0; } CString sGroupNo = _T(""); AcDbObjectId objId; CThunderXData thunderXData; acdbGetObjectId(objId, ent); //判断是否折线避雷针保护圆 thunderXData.GetXData(objId, KEY_FOLD_PRO_GROUP, sGroupNo); if (sGroupNo.IsEmpty()) { return 0; } // 数据 ptPick = Ucs2Wcs(ptPick); AcDbCircle* pCircle = NULL; AcDbRegion* pRegion = NULL; AcDbPolyline* pLine = NULL; AcDbArc* pArc = NULL; CString sProH = _T(""); double dProH = 0.0; AcDbVoidPtrArray arPtrs; CString sType = _T(""), sGroup = _T(""); BOOL bSel = FALSE; int iLen = 0; // ptStart, ptPick OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(pEnt != NULL) { int nMode = OS_INS | OS_INT | OS_NEA | XD_POINT | OS_MID | OS_CEN | OS_END; XPushVar vOsModeOpen(_T("OSMODE"), nMode); pCircle = AcDbCircle::cast(pEnt); if(pCircle != NULL) { thunderXData.GetXData(pCircle, KEY_FOLD_CURRENT_PROHEIGHT, sProH); if(!sProH.IsEmpty()) dProH = _tstof(sProH); ptStart = pCircle->center(); bSel = TRUE; } else { pLine = AcDbPolyline::cast(pEnt); if(pLine != NULL) { thunderXData.GetXData(pLine, KEY_FOLD_PRO_GROUP, sGroup); thunderXData.GetXData(pLine, KEY_FOLD_CURRENT_PROHEIGHT, sProH); if(!sProH.IsEmpty()) dProH = _tstof(sProH); RecursiveExplodeGetArcAndCir(pLine, arPtrs); double dTemp = 0.0; AcDbEntity* pTemp = NULL; std::multimap mapTemp; iLen = arPtrs.length(); for(int i = 0; i < iLen; ++i) { pTemp = (AcDbEntity*)arPtrs[i]; if((pArc = AcDbArc::cast(pTemp)) != NULL) { ptStart = pArc->center(); dTemp = ptPick.Distance(ptStart); mapTemp.insert(std::make_pair(dTemp, pArc)); } else if((pCircle = AcDbCircle::cast(pTemp)) != NULL) { ptStart = pCircle->center(); dTemp = ptPick.Distance(ptStart); mapTemp.insert(std::make_pair(dTemp, pCircle)); } } BOOL bSuc = FALSE; if(mapTemp.size() > 0) { AcDbEntity* pNew = (AcDbEntity*) mapTemp.begin()->second; if((pArc = AcDbArc::cast(pNew)) != NULL) { ptStart = pArc->center(); thunderXData.SetXData((AcDbEntity*)pArc, TEL_THUNDER_TYPE, sType); bSuc = thunderXData.SetXData(pArc, KEY_FOLD_PRO_GROUP, sGroup); bSel = TRUE; } else if((pCircle = AcDbCircle::cast(pNew)) != NULL) { ptStart = pCircle->center(); bSel = TRUE; } } } } } OPENOBJ_END(); if(bSel) { TelThunderPolyLineJig jig; jig.SetPLinePoints(ptStart, ptPick); jig.SetHeight(dProH); if(pCircle != NULL) jig.SetEntity(pCircle); else if(pArc != NULL) { jig.SetEntity(pArc); } jig.start(); } // 回收 while(iLen-- > 0) { delete (AcDbEntity*)arPtrs[iLen]; } return 0; } // 标注Bx int CThunderCmdGroup::FoldDimentBxCmd() { // 数据 //TCHAR sRet[24]; int nRet = 0; CString sInput = _T(""); int nType = -1; // 命令入口 // while(1) // { // //nRet = acedGetString(0, _T("\n标注避雷针<退出>:"), sRet); // 标注避雷针(Z)/标注避雷线(L): 等待避雷线 // sInput = sRet; // if (nRet == RTCAN) // { // return 0; // } // else if (nRet == RTNORM) // { // if (!sInput.CompareNoCase(_T("Z")) // || !sInput.CompareNoCase(_T("z")) // || sInput.IsEmpty()) // { // nType = 0; // break; // } // else if (!sInput.CompareNoCase(_T("L")) // || !sInput.CompareNoCase(_T("l"))) // { // nType = 1; // break; // } // } // nRet = acedGetString(0, _T("\n标注避雷针<退出>:"), NULL); // 标注避雷针(Z)/标注避雷线(L): 等待避雷线 // CLableThunderBX drawBx; // drawBx.LableFoldPntBX(); // // } //按关键字类型 操作 CLableThunderBX drawBx; nType = 0; switch(nType) { case 0: { drawBx.LableFoldPntBX(); break; } case 1: { drawBx.LabeFoldLineBX(); break; } default: return 0; } return 0; } // 单避雷表(折线) int CThunderCmdGroup::FoldSinSheetCmd() { // 获取表插入位置 ads_point ptX; if(acedGetPoint(NULL, _T("\n 请选择 避雷针单针保护范围表 插入位置<退出>: "), ptX) != RTNORM) { return 0; } AcGePoint3d ptPlugIn = asPnt3d(ptX); // 读取所有避雷针数据 FoldManager->FilterAllFoldPin(); // 过滤出所有折线避雷针数据 FOLDPINGROUP mapPin; // 折线避雷针数据 FoldManager->GetAllFoldThunder(mapPin); // 获取所有避雷针数据 int nSize = 0; // 表行数 int iColCount = 0; // 列数(保护高度 / 保护半径) int i = 0, p = 0; // 遍历计数器 FOLDPINGROUP::iterator mapItr; FOLDPINGROUP::iterator mapItrEnd = mapPin.end(); int xLen = mapPin.size(); FOLDPINLST arPin; // 同组避雷针数据 FOLDPINLST::iterator itrPin; FOLDPINLST::iterator itrPinEnd = arPin.end(); std::map arThunder; std::map::iterator itrOlder; FOLDPINLST arMaxPin; // 输出表数据集 std::list lstCol; for (mapItr = mapPin.begin(); mapItr != mapItrEnd; ++mapItr) { arPin = mapItr->second; // 计算列数(保护高度 / 保护半径) i = 0; iColCount = arPin.at(i).m_arProHeight.length(); if (iColCount < 1) { return 0; } lstCol.push_back(iColCount); //将避雷针按 组号 和 编号 排序 arThunder.clear(); for (itrPin = arPin.begin(); itrPin != arPin.end(); ++itrPin) { arThunder.insert(std::make_pair(itrPin->m_nNo,*itrPin)); } arPin.clear(); for (itrOlder = arThunder.begin(); itrOlder != arThunder.end(); ++itrOlder) { arPin.push_back(itrOlder->second); } for (itrPin = arPin.begin(); itrPin != arPin.end(); ++itrPin) { arMaxPin.push_back(*itrPin); // 所有避雷针 } } nSize = arMaxPin.size(); // 行数 if (nSize < 1) { return 0; } lstCol.sort(); lstCol.reverse(); std::list::iterator lstItr = lstCol.begin(); if (lstItr != lstCol.end()) { // 列数 (保护高度/保护半径) iColCount = (int)*lstItr; } // 建表 TelDrawSheet telFoldSinSheet; // 折线法单表 telFoldSinSheet.SetLayer(LAY_LIGHTSHEET); // 设置单表图层 double dTxtSize(4), dTxtHeight(4); double dTableHeight(7); // 表风格 TGridStyle gridStyle; AcDbObjectId idTxtStyle = NULL; idTxtStyle = KTSetting::InitTextStyle(G_CSDIMSTYLE); // 获取文本风格ID gridStyle.SetTextStyleId(idTxtStyle); // 设置表格中文本风格ID gridStyle.SetOverrideAll(TRUE); // ? 覆盖 gridStyle.SetTextHeight(dTxtHeight); // 设置文本高度 gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); telFoldSinSheet.SetLocation(ptPlugIn); // 表插入点 telFoldSinSheet.SetGridStyle(gridStyle); // 设置表格风格 telFoldSinSheet.SetRotation(Ucs2Wcs(0.0)); // 设置旋转角度 telFoldSinSheet.SetRowHeight(dTableHeight * 2); // 设置表宽 telFoldSinSheet.SetTitleVisible(TRUE); AcDbObjectId idStyle = KTSetting::InitTextStyle(EL_DIM); // 文本ID // 初始化表 telFoldSinSheet.InitSheet(nSize + 1, iColCount + 5, dTableHeight * 2, 50); // 设置表格标题 gridStyle.SetTextHeight(6.0); gridStyle.SetVerMode(AcDb::kTextBottom); telFoldSinSheet.SetTitleText(_T("避雷针单针保护范围表")); telFoldSinSheet.SetTitleHeight(0.01); telFoldSinSheet.SetTitleTestStyle(gridStyle); // 设置列标题 telFoldSinSheet.SetColumnText(0, _T("避雷针组号"), 35); telFoldSinSheet.SetColumnText(1, _T("避雷针编号"), 35); telFoldSinSheet.SetColumnText(2, _T("针高 h(米)"), 35); telFoldSinSheet.SetColumnText(3, _T("高度影响系数 p"), 40); for(int m = 0; m < iColCount; ++m) { telFoldSinSheet.SetColumnText(4 + m, _T("保护高度 hx(米) /\n保护半径 rx(米)"), 45); } telFoldSinSheet.SetColumnText(5 + iColCount - 1, _T("备注"), 35); // 插入数据 CFoldToolKit* pToolKit = CFoldToolKit::Instance(); CString csTemp = _T(""); // 输出临时字符处变量 double dHtemp = 0.0; // 临时针高 double dPbyH = 0.0; // 高度影响系数p double dProHeight = 0.0; // 保护高度 hx double dProRadius = 0.0; // 保护半径 rx int nLen = 0; // 保护高度个数 AcGeDoubleArray arProHTemp; // 保护高度临时数组 i = 0; int mapLen = arMaxPin.size();//cs xLen = arPin.size();//cs for(itrPin = arMaxPin.begin(); itrPin != arMaxPin.end(); ++itrPin) { if (i == mapLen) { break; } // 插入数据 csTemp.Format(_T("%d"),(*itrPin).m_nGroup); telFoldSinSheet.SetText(i + 1, 0, csTemp); // 避雷针组号 csTemp.Format(_T("%d#"), (*itrPin).m_nNo); telFoldSinSheet.SetText(i + 1, 1, csTemp); // 避雷针编号 csTemp.Format(_T("%.2f"), (*itrPin).m_dHeight); telFoldSinSheet.SetText(i + 1, 2, csTemp); // 针高 h // 高度影响系数p dHtemp = (*itrPin).m_dHeight; if (dHtemp < 30.0) dPbyH = 1; else if (dHtemp >= 30.0 && dHtemp <= 120.0) dPbyH = 5.5 / (pow(dHtemp, 0.5)); else if (dHtemp > 120.0) dPbyH = 0.502079; csTemp.Format(_T("%.2f"), dPbyH); telFoldSinSheet.SetText(i + 1, 3, csTemp); // 2012/3/21 for 支持山地坡地计算 int nCheck = -1; CRegProperty reg(GetRegLocation(), _T("Thunder")); reg.SetTopRootKey(HKEY_CURRENT_USER); if (!reg.GetValue(KEY_FOLD_HILL_HILLSIDE, nCheck)) { nCheck = 0; } // 插入保护高度hx / 对应的保护半径rx arProHTemp = (*itrPin).m_arProHeight; SorProHeight(arProHTemp); // 排序保护高度hx nLen = arProHTemp.length(); for(int j = 0; j < nLen; ++j) { dProHeight = arProHTemp[j]; // 保护半径需要重新计算 if(dProHeight >= 0.5*dHtemp) { dProRadius = (dHtemp - dProHeight) * dPbyH; } else if (dProHeight < 0.5*dHtemp) { dProRadius = (1.5*dHtemp - 2*dProHeight) * dPbyH; } // 2012/3/21 if (nCheck) { dProRadius *= 0.75; } csTemp.Format(_T("%.2f/%.2f"),dProHeight, dProRadius); telFoldSinSheet.SetText(i + 1, 4 + j, csTemp); // 保护高度/保护半径 } i++; } telFoldSinSheet.AddToCSpace(TRUE); return 0; } bool CThunderCmdGroup::DocGetMeterUnitDraw() { struct resbuf rb; acedGetVar(_T("INSUNITS"),&rb); if (rb.resval.rint == AcDb::kUnitsMeters) { return true; } return false; } // 双避雷表(折线) int CThunderCmdGroup::FoldDblSheetCmd() { // 获取表插入位置 ads_point ptTemp; if(acedGetPoint(NULL, _T("\n 请选择 避雷针双针联合保护范围表 插入位置<退出>: "), ptTemp) != RTNORM) { return 0; } AcGePoint3d ptPlugIn = asPnt3d(ptTemp); // 读取避雷针数据 double dScale = 0.0; if (!DocGetMeterUnitDraw()) dScale = 1000.0; else dScale = 1.0; FOLDPINGROUP mapPin; // 所有避雷针数据 FOLDPINGROUP::iterator mapItr; FoldManager->FilterAllFoldPin(); FoldManager->GetAllFoldThunder(mapPin); // 排序 // 组号默认 AcArray arDblSheetData; // 双表数据数组 FoldDblSheetData dblData; // 避雷针数据结构体单元 FOLDPINLST arSubPin; // 同组避雷针数组 FOLDPINLST::iterator itrS, itrSub; FOLDPINLST arCanUniPin; // 可形成联合防护的避雷针数组 std::map mapThunder; std::map::iterator oldItr; // 判断是否出双表 FOLDPINLST arAllPin; for (mapItr = mapPin.begin(); mapItr != mapPin.end(); ++mapItr) { arSubPin = mapItr->second; mapThunder.clear(); for (itrS = arSubPin.begin(); itrS != arSubPin.end(); ++itrS) { mapThunder.insert(std::make_pair(itrS->m_nNo, *itrS)); } arSubPin.clear(); for (oldItr = mapThunder.begin(); oldItr != mapThunder.end(); ++oldItr) { arAllPin.push_back(oldItr->second); } } int nPinLen = arAllPin.size(); if (nPinLen < 2) { acutPrintf(_T("\n 双避雷表至少需要两个避雷针!")); return 0; } CString csTemp = _T(""); // 临时数据信息变量 double dDis = 0.0, dDisX = 0.0; // 针距 D->dDis, D'->dDisX AcGeDoubleArray arProHTemp; // 保护高度数组 int nProHLen = 0; // 保护高度个数 double dH1 = 0.0, dH2 = 0.0; // double dmin = 0.0, dmax = 0.0; double dX = 0.0; double dHx = 0.0; double dBx = 0.0; CFoldToolKit* pToolKit = CFoldToolKit::Instance(); CFoldPinRelation* pRelation = CFoldPinRelation::Instance(); for(mapItr = mapPin.begin(); mapItr != mapPin.end(); ++mapItr) { arSubPin = mapItr->second; // 当前同组 编号排序 mapThunder.clear(); for (itrS = arSubPin.begin(); itrS != arSubPin.end(); ++itrS) { mapThunder.insert(std::make_pair(itrS->m_nNo, *itrS)); } arSubPin.clear(); for (oldItr = mapThunder.begin(); oldItr != mapThunder.end(); ++oldItr) { arSubPin.push_back(oldItr->second); } // 整理数据 for(itrS = arSubPin.begin(); itrS != arSubPin.end(); ++itrS) { itrSub = itrS; // itrSub++; // dH1 = itrS->m_dHeight; for(itrSub; itrSub != arSubPin.end(); ++itrSub) { dH2 = itrSub->m_dHeight; dDis = itrS->m_ptPos.distanceTo(itrSub->m_ptPos) / dScale; // 针距 // 多个保护高度处理 arProHTemp = itrSub->m_arProHeight; SorProHeight(arProHTemp); nProHLen = arProHTemp.length(); for(int k = 0; k < nProHLen; ++k) { // 组号 dblData.nGroupNo = itrS->m_nGroup; // 编号 csTemp.Format(_T("%d# - %d#"), itrS->m_nNo, itrSub->m_nNo); _tcscpy(dblData.szNo, csTemp); // 针高 csTemp.Format(_T("%.2f"), dH1); if (dH1 != dH2) { csTemp.Format(_T("%.2f/%.2f"), dH1, dH2); } _tcscpy(dblData.szPinH, csTemp); // 保护高度 dHx = arProHTemp[k]; dblData.dProHeight = dHx; // D和D' csTemp.Format(_T("%.2f"), dDis); if (dH1 != dH2) { dDisX = pToolKit->CalcEffectDist(dH1, dH2, dDis, dHx); csTemp.Format(_T("%.2f/%.2f"), dDis, dDisX); } _tcscpy(dblData.szDist, csTemp); // 折线法的联合保护BX计算2011/11/7 // 联合保护宽度Bx if (pToolKit->CalcFoldBx(dH1, dH2, dDis, dHx, dBx)) { dblData.dBx = dBx; arDblSheetData.append(dblData); } } } } } // 建表 TelDrawSheet telFoldDblSheet; telFoldDblSheet.SetLayer(_T("LINGHTNING_SINSHEET)")); double dTitleH(4); double dTextH(4); double dTableH(7); AcDbObjectId idTextStyle = NULL; idTextStyle = KTSetting::InitTextStyle(G_CSDIMSTYLE); TGridStyle gridStyle; gridStyle.SetTextStyleId(idTextStyle); gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(dTextH); gridStyle.SetHorMode(AcDb::kTextCenter); gridStyle.SetVerMode(AcDb::kTextVertMid); telFoldDblSheet.SetLocation(ptPlugIn); telFoldDblSheet.SetGridStyle(gridStyle); telFoldDblSheet.SetTitleVisible(TRUE); telFoldDblSheet.SetRowHeight(dTableH * 2); // 2011/11/8 telFoldDblSheet.SetRotation(Ucs2Wcs(0.0)); int nDblSheetLen = arDblSheetData.length(); telFoldDblSheet.InitSheet(nDblSheetLen + 1, 7, dTableH * 2, 50); // 2011/11/8 // 设置表格标题 gridStyle.SetTextHeight(6.0); gridStyle.SetVerMode(AcDb::kTextBottom); telFoldDblSheet.SetTitleText(_T("避雷针双针联合保护范围表")); telFoldDblSheet.SetTitleHeight(0.01); telFoldDblSheet.SetTitleTestStyle(gridStyle); // 设置列标题 telFoldDblSheet.SetColumnText(0, _T("避雷针组号"), 35); telFoldDblSheet.SetColumnText(1, _T("避雷针编号"), 35); telFoldDblSheet.SetColumnText(2, _T("针高h(米)"), 35); telFoldDblSheet.SetColumnText(3, _T("保护高度hx(米)"), 35); telFoldDblSheet.SetColumnText(4, _T("两针距离D/D'(米)"), 35); telFoldDblSheet.SetColumnText(5, _T("联合保护宽度bx(米)"), 35); telFoldDblSheet.SetColumnText(6, _T("备注"), 40); // 显示数据 for(int m = 0; m < nDblSheetLen; ++m) { // 避雷针组号 csTemp.Format(_T("%d"),arDblSheetData[m].nGroupNo); telFoldDblSheet.SetText(m+1, 0, csTemp); // 避雷针编号 csTemp = arDblSheetData[m].szNo; telFoldDblSheet.SetText(m+1, 1, csTemp); // 针高h csTemp = arDblSheetData[m].szPinH; telFoldDblSheet.SetText(m+1, 2, csTemp); // 保护高度hx csTemp.Format(_T("%.2f"), arDblSheetData[m].dProHeight); telFoldDblSheet.SetText(m+1, 3, csTemp); // D和D' csTemp = arDblSheetData[m].szDist; telFoldDblSheet.SetText(m+1, 4, csTemp); // 联合保护范围bx csTemp.Format(_T("%.2f"), arDblSheetData[m].dBx); telFoldDblSheet.SetText(m+1, 5, csTemp); } telFoldDblSheet.AddToCSpace(TRUE); return 0; } // 雷计算书(折线) int CThunderCmdGroup::FoldCalcBookCmd() { // 避雷针数据 FOLDPINGROUP mapPin; // 所有避雷针数据 FOLDPINGROUP::iterator mapItr; FoldManager->FilterAllFoldPin(); FoldManager->GetAllFoldThunder(mapPin); if(mapPin.size() == 1) { // 判断是否出书 mapItr = mapPin.begin(); if(mapItr->second.size() < 2) { AfxMessageBox(_T("避雷针少于2个,无法出计算书!")); return 0; } } double dScale = 0.0; if (!DocGetMeterUnitDraw()) dScale = 1000.0; else dScale = 1.0; // 初始化 TelCreateWordApp word; word.SetAlignment(1); // 0->居左 1->居中 2->居右 word.SetFont(_T("黑体"), 18, 0); word.TypeText(_T("折线法防雷设计计算书\n\n")); word.SetAlignment(0); word.SetFont(_T("宋体"), 10, 0); word.TypeText(_T("工程名:\n计算者:\n计算时间:\n参考规范:《工业与民用配电设计手册》第三版\n\t\t 交流电气装置的过电压保护和绝缘配合DL/T 620-1997\n\n\n")); // 参量 CString csTmp = _T(""); int nGroupNo = 0; // 组号 int nNum = 0; // 编号 double dH = 0.0; // 针高 double dHx = 0.0; // 保护高度 AcGeDoubleArray arProH; // 保护高度数组 int nLen = 0; double dH1 = 0.0, dH2 = 0; double dHmin = 0.0, dHmax = 0.0; double dPbyH = 0.0, dPmax = 0.0; // 高度影响系数 double dRx = 0.0; // 保护半径 double dDis = 0.0, dDisX; // 针距 double dH0 = 0.0; double dX = 0.0; double dY = 0.0; double dBx = 0.0; // 联合保护范围 double dhap = 0.0; FOLDPINLST arSubPin; FOLDPINLST::iterator itrS, itrSub; std::map mapPinTmp; std::map::iterator tmpItr; CFoldToolKit* pToolKit = CFoldToolKit::Instance(); FoldCalcResult foldCalc; // 2012/1/10 for 计算dY,dBx by wzh BOOL bSuc = FALSE; // 2012/3/21 for 支持山地坡地计算 int nCheck = -1; CRegProperty reg(GetRegLocation(), _T("Thunder")); reg.SetTopRootKey(HKEY_CURRENT_USER); if (!reg.GetValue(KEY_FOLD_HILL_HILLSIDE, nCheck)) { nCheck = 0; } // 计算出书 for(mapItr = mapPin.begin(); mapItr != mapPin.end(); ++mapItr) { arSubPin = mapItr->second; // 编号排序 mapPinTmp.clear(); for(itrS = arSubPin.begin(); itrS != arSubPin.end(); ++itrS) { mapPinTmp.insert(std::make_pair(itrS->m_nNo, *itrS)); } arSubPin.clear(); for(tmpItr = mapPinTmp.begin(); tmpItr != mapPinTmp.end(); ++tmpItr) { arSubPin.push_back(tmpItr->second); } // 整理数据 for(itrS = arSubPin.begin(); itrS != arSubPin.end(); ++itrS) { nGroupNo = itrS->m_nGroup; // 组号 nNum = itrS->m_nNo; // 编号 dH1 = dH = itrS->m_dHeight; // 针高 // 多保护高度处理 arProH = itrS->m_arProHeight; SorProHeight(arProH); nLen = arProH.length(); for(int i = 0; i < nLen; ++i) { dHx = arProH[i]; // 被保护物的高度 // 已知条件 word.SetFont(_T("宋体"), 12, 1); word.TypeText(_T("已知条件\n")); word.SetFont(_T("宋体"), 10, 0); if (nCheck) { csTmp.Format(_T("\t 算法:折线法\n\t 避雷针组号%d\n\t 避雷针编号%d\n\t 针高:%.2f米\n\t 被保护物的高度:%.2f米\n\t 布置于山地和坡地\n"), nGroupNo, nNum, dH, dHx); } else csTmp.Format(_T("\t 算法:折线法\n\t 避雷针组号%d\n\t 避雷针编号%d\n\t 针高:%.2f米\n\t 被保护物的高度:%.2f米\n"), nGroupNo, nNum, dH, dHx); word.TypeText(csTmp); /* 高度影响系数p */ //word.SetFont(_T("宋体"),10,0); word.TypeText(_T("\t 高度影响系数p:\n")); word.TypeText(_T("\t\t a, h<30m时, p = 1\n\t\t b, 30≤h≤120m时,p=(5.5)/√h\n\t\t c, h>120m时,h 取120,按b中公式计算。 p=0.502079\n\n")); // 计算过程和公式 word.SetFont(_T("宋体"),12,1); word.TypeText(_T("计算过程和公式\n")); // /* 高度影响系数p */ word.SetFont(_T("宋体"),10,0); // word.TypeText(_T("\t 高度影响系数p:\n")); // word.TypeText(_T("\t\t a, h<30m时, p = 1\n\t\t b, 30≤h≤120m时,p=(5.5)/√h\n\t\t c, h>120m时,h 取120,按b中公式计算。 p=0.502079\n")); word.TypeText(_T("\t hx保护高度保护单针保护半径rx\n")); if (dH - 30 < 1e-6) { dPbyH = 1.0; } else { dPbyH = 5.5 / pow(dH, 0.5); if (dH - 120 >1e-6) { dPbyH = 0.502079; // dPbyH = 5.5 / pow(120, 0.5); } } // 2012/4/6 dRx = pToolKit->CalcFoldRx(dH, dHx); if (0.5*dH - dHx < 1e-6) { if (nCheck) { // 2012/3/21 支持山地坡地计算 csTmp.Format(_T("\t\t hx >= 0.5h\n\t\t rx =0.75*(h - hx)p\n\t\t = 0.75*(%.2f - %.2f)*%.2f\n\t\t = %.2f (米)\n"), dH, dHx, dPbyH, dRx); } else { csTmp.Format(_T("\t\t hx >= 0.5h\n\t\t rx =(h - hx)p\n\t\t = (%.2f - %.2f)*%.2f\n\t\t = %.2f (米)\n"), dH, dHx, dPbyH, dRx); } } else { if (nCheck) { // 2012/3/21 支持山地坡地计算 csTmp.Format(_T("\t\t hx < 0.5h\n\t\t rx =0.75*(1.5h - 2hx)p\n\t\t = 0.75*(%.2f - %.2f)*%.2f\n\t\t = %.2f (米)\n"), 1.5*dH, 2*dHx, dPbyH, dRx); } else { csTmp.Format(_T("\t\t hx < 0.5h\n\t\t rx =(1.5h - 2hx)p\n\t\t = (%.2f - %.2f)*%.2f\n\t\t = %.2f (米)\n"), 1.5*dH, 2*dHx, dPbyH, dRx); } } word.TypeText(csTmp); // if (nLen >= 2) // { // X-X 两针联合保护 // word.SetFont(_T("宋体"), 12, 1); // word.TypeText(_T("\nX-X两针联合保护\n")); word.SetFont(_T("宋体"), 10, 0); itrSub = itrS; ++itrSub; for(itrSub; itrSub != arSubPin.end(); ++itrSub) { dH2 = itrSub->m_dHeight; if(dH1 == dH2) { // 等高 dDis = itrS->m_ptPos.distanceTo(itrSub->m_ptPos) / dScale; dX = dDis / (dH1 - dHx) * dPbyH; //word.TypeText(_T("\t 等高:\n")); csTmp.Format(_T(" %d - %d两针等高\n\t 两针距离 D = %.2f (米)\n"), itrS->m_nNo,itrSub->m_nNo, dDis); word.TypeText(csTmp); csTmp.Format(_T("\t x = D/(h - hx)p\n\t = %.2f /(%.2f - %.2f)*%.2f\n\t = %.2f (米)\n"), dDis, dH1, dHx, dPbyH, dX); word.TypeText(csTmp); if (pToolKit->CalcFoldBx(dH1, dH2, dDis, dHx, foldCalc)) { dY =foldCalc.m_dY; dBx = foldCalc.m_dBx; } csTmp.Format(_T("\t 查表得 y = %.2f\n"), dY); word.TypeText(csTmp); word.TypeText(_T("\t 避雷针联合保护宽度\n")); if (nCheck) { // 2012/3/21 for 支持山地坡地开发 csTmp.Format(_T("\t Bx = 0.75 * y * (h - hx) * p\n\t = 0.75 * %.2f * (%.2f - %.2f) * %.2f\n\t = %.2f (米)\n"), dY, dH1, dHx, dPbyH, dBx); } else { csTmp.Format(_T("\t Bx = y * (h - hx) * p\n\t = %.2f * (%.2f - %.2f) * %.2f\n\t = %.2f (米)\n"), dY, dH1, dHx, dPbyH, dBx); } word.TypeText(csTmp); } else { // 不等高 //word.TypeText(_T("\t 不等高:\n")); // 2012/4/6 // dHmin = min(dH1, dH2); // dHmax = max(dH1, dH2); // csTmp.Format(_T("\t hmin = min(h , h2) = %.2f (米)\n"), dHmin); // word.TypeText(csTmp); // csTmp.Format(_T(" hmax = max(h , h2) = %.2f (米)\n"), dHmax); // word.TypeText(csTmp); // 2012/4/6 // word.TypeText(_T("\t 高度影响系数p:\n")); // 取dHmax if (dHmax - 30 < 1e-6) { dPmax = 1.0; } else { dPmax = 5.5 / pow(dHmax, 0.5); if (dHmax - 120 >1e-6) { dPmax = 5.5 / pow(120, 0.5); //dPmax = 0.502079; } } // word.TypeText(_T("\t\t a, h<30m时, p = 1\n\t\t b, 30≤h≤120m时,p=(5.5)/√h\n\t\t c, h>120m时,h 取120,按b中公式计算。 p=0.502079\n")); dDis = itrS->m_ptPos.distanceTo(itrSub->m_ptPos) / dScale; csTmp.Format(_T(" %d - %d两针不等高\n\t 两针距离 D = %.2f (米)\n"), itrS->m_nNo, itrSub->m_nNo, dDis); word.TypeText(csTmp); dHmin = min(dH1, dH2); dHmax = max(dH1, dH2); csTmp.Format(_T("\t hmin = min(h , h2) = %.2f (米)\n"), dHmin); word.TypeText(csTmp); csTmp.Format(_T(" hmax = max(h , h2) = %.2f (米)\n"), dHmax); word.TypeText(csTmp); // D' dDisX = pToolKit->CalcEffectDist(dH1, dH2, dDis, dHx); if (dHmin >= 0.5*dHmax) { //dDisX = dDis - (dHmax - dHmin)*dPmax; csTmp.Format(_T(" hmin ≥ 0.5hmax时\n\t D' = D - rh\n\t = D - (hmax - hmin)p\n\t = %.2f - (%.2f - %.2f) * %.2f\n\t = %.2f (米)\n"), dDis, dHmax, dHmin, dPmax, dDisX); } else if (dHmin - 0.5*dHmax < 1e-6) { word.TypeText(_T("\t 不等高避雷针等价等高距离 D'\n")); //dDisX = dDis - (1.5*dHmax - 2*dHmin)*dPmax; csTmp.Format(_T("\t hmin<0.5hmax时\n\t D' = D - rh\n\t = D - (1.5hmax - 2hmin)p\n\t = %.2f - (1.5*%.2f - 2*%.2f)*%.2f\n\t = %.2f (米)"), dDis, dHmax, dHmin, dPmax, dDisX); } word.TypeText(csTmp); // dH0 if (nCheck) { // 2012/3/21 for 支持山地坡地开发 dH0 = dHmin - dDisX/(5*dPbyH); csTmp.Format(_T("\t h0 = hmin - D' / 5p\n\t = %.2f - %.2f / %.2f\n\t = %.2f (米)\n"), dHmin, dDisX, 5 * dPbyH, dH0); } else { // 2012/1/12 三维待用 两针联合最低保护高度 dH0 = dHmin - dDisX / (7*dPbyH); csTmp.Format(_T("\t h0 = hmin - D' / 7p\n\t = %.2f - %.2f / %.2f\n\t = %.2f (米)\n"), dHmin, dDisX, 7 * dPbyH, dH0); } word.TypeText(csTmp); // x dhap = (dHmin - dHx) * dPmax; dX = dDisX / dhap; csTmp.Format(_T("\t x = D' / hap\n\t = D' / ((hmin - hx)*p)\n\t = %.2f / ((%.2f - %.2f)*%.2f)\n\t = %.2f (米)\n"), dDisX, dHmin, dHx, dPmax, dX); word.TypeText(csTmp); //dY bSuc = pToolKit->CalcFoldBx(dH1, dH2, dDis, dHx, foldCalc); if (bSuc) { dY = foldCalc.m_dY; dBx = foldCalc.m_dBx; } csTmp.Format(_T("\t 查表得 y = %.2f\n"), dY); word.TypeText(csTmp); word.TypeText(_T("\t 避雷针联合保护宽度\n")); if (bSuc) { if (nCheck) { // 2012/3/21 for 支持山地坡地开发 csTmp.Format(_T("\t Bx = 0.75 * y * (hmin - hx)*p\n\t = 0.75 * %.2f * (%.2f - %.2f) * %.2f\n\t = %.2f (米)\n"), dY, dHmin, dHx, dPmax, dBx); } else { csTmp.Format(_T("\t Bx = y*(hmin - hx)*p\n\t = %.2f * (%.2f - %.2f) * %.2f\n\t = %.2f (米)\n"), dY, dHmin, dHx, dPmax, dBx); } word.TypeText(csTmp); } } } // } // 计算结果 word.SetFont(_T("宋体"), 12, 1); word.TypeText(_T("\n计算结果\n")); word.SetFont(_T("宋体"), 10, 0); csTmp.Format(_T("\t 避雷针在%.2f米处的保护范围为%.2f米\n\n\n"), dHx, dRx); word.TypeText(csTmp); } } }// 计算书 return 0; }