// DimPipeElevationDlg.cpp : implementation file // #include "stdafx.h" #include #include #include "DimPipeElevationDlg.h" #include "TwtDef.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //*************************************************************************************************** // 单注标高 //*************************************************************************************************** class TElevEdJig : public TSymbEdJig { public: enum TElevOper { kNone=0, kDirection=1, kBaseLine=2, kLeader=3}; protected: //输入 TElevEdJig::TElevOper m_nOperCode; CDimPipeElevationDlg *m_pDlg; // I/O TDbSymbElevation *m_pDrawEnt; public: TElevEdJig(TDbSymbElevation *pElev, CDimPipeElevationDlg *pDlg); TElevEdJig(TDbSymbElevation *pElev); virtual int DoIt(int *pKeyIndex=NULL); virtual DragStatus GetPoint(XPoint &pt); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; XPoint GetDragPoint() const; XPoint GetBasePoint() const; public: void SetOperCode(TElevEdJig::TElevOper nCode) { m_nOperCode=nCode; } }; TElevEdJig::TElevEdJig(TDbSymbElevation *pElev, CDimPipeElevationDlg *pDlg) { m_nOperCode=TElevEdJig::kNone; m_pDrawEnt=pElev; m_pDlg = pDlg; } TElevEdJig::TElevEdJig(TDbSymbElevation *pElev) { m_nOperCode=TElevEdJig::kNone; m_pDrawEnt=pElev; m_pDlg = NULL; } XPoint TElevEdJig::GetDragPoint() const { XPoint ptDrag=m_ptResult; XPoint ptArray[7]; m_pDrawEnt->GetVertexes(ptArray); if(m_nOperCode==TElevEdJig::kDirection) ptDrag=ptArray[2]; else if(m_nOperCode==TElevEdJig::kBaseLine) ptDrag=ptArray[4]; else if(m_nOperCode==TElevEdJig::kLeader) ptDrag=ptArray[6]; return ptDrag; } XPoint TElevEdJig::GetBasePoint() const { XPoint ptDrag=m_ptResult; XPoint ptArray[7]; m_pDrawEnt->GetVertexes(ptArray); if(m_nOperCode==TElevEdJig::kDirection) ptDrag=ptArray[2]; else if(m_nOperCode==TElevEdJig::kBaseLine) ptDrag=ptArray[0]; return ptDrag; } // 开始执行拖动 int TElevEdJig::DoIt(int *keyIndex) { m_ptResult=GetDragPoint(); return TSymbEdJig::DoIt(keyIndex); } // 反馈 AcEdJig::DragStatus TElevEdJig::GetPoint(XPoint &pt) { return acquirePoint(pt, GetBasePoint().AsAcGePoint3d()); } // 更新实体数据 Adesk::Boolean TElevEdJig::update() { if(m_pDlg != NULL){ m_pDlg->UpdateData(TRUE); // m_pDrawEnt->SetPScale((double)m_pDlg->m_iScale); CString sText = m_pDlg->m_csText; if(m_pDlg->m_csElePrefix != _T("无") && sText.Find(_T(".")) < 0){ if(m_pDlg->m_iPrecision == 1) sText = sText + _T(".00"); else sText = sText + _T(".000"); } if(m_pDlg->m_csElePrefix != _T("无") && fabs(_tstof(sText)) < 0.001) sText = m_pDlg->m_csElePrefix + _T("%%P") + sText; else if(m_pDlg->m_csElePrefix != _T("无") && _tstof(sText) > 0.001) sText = m_pDlg->m_csElePrefix + _T("+") + sText; else if(m_pDlg->m_csElePrefix != _T("无") && _tstof(sText) < -0.001) sText = m_pDlg->m_csElePrefix + sText; m_pDrawEnt->SetText(sText); if(m_pDlg->m_iPrecision == 1) m_pDrawEnt->SetPrec2(TRUE); else m_pDrawEnt->SetPrec2(FALSE); } Adesk::Boolean bRet=Adesk::kTrue; AcGePoint3dArray gripPoints; TDbSymbElevation *pElev=m_pDrawEnt; VERIFY(pElev->getStretchPoints(gripPoints)==Acad::eOk); if(m_nOperCode==TElevEdJig::kDirection) { AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[1]; AcDbIntArray indices; indices.append(1); if(vtOffset.length()>_distSnap*10) pElev->moveGripPointsAt(indices, vtOffset); } else if(m_nOperCode==TElevEdJig::kBaseLine) { AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[3]; AcDbIntArray indices; indices.append(3); if(vtOffset.length()>_distSnap) pElev->moveGripPointsAt(indices, vtOffset); } else if(m_nOperCode==TElevEdJig::kLeader) { int idx=pElev->HasBaseLine()? 4 : 3; AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[idx]; AcDbIntArray indices; indices.append(idx); if(vtOffset.length()>_distSnap*10) pElev->moveGripPointsAt(indices, vtOffset); } else { bRet=Adesk::kFalse; } return bRet; } AcDbEntity* TElevEdJig::entity() const { return (AcDbEntity *)m_pDrawEnt; } //extern CString GetDimLayerNameByPipeLayer(const CString &strLayer); // cet 2010.11.23 add XPoint GetAngPoint(XPoint ptstart, double nAngle) { double nEle = ptstart.z; ptstart.z =0; XPoint ptRet, ptend; int itype = -1; double dAng(0); nAngle = Wcs2Ucs(nAngle); double ntmp2 = Radian2Angle(nAngle); while(1){ struct resbuf pointbuf; int iRet = ads_grread(5, &itype, &pointbuf);//得到动态点pointbuf ads_point_set(pointbuf.resval.rpoint, ptend);//ptend动态点,也就是引出支线的结束点 ptend.z = 0; double dOAng = ads_angle(ptstart, ptend) - nAngle; double dDis = ads_distance(ptstart, ptend); dDis = fabs(dDis * cos(dOAng)); //指出标注的引出方向 if(dOAng < -0.001) dOAng += 2*PI; else if(dOAng > (PI*2 + 0.001)) dOAng -= PI*2; double ntmp = Radian2Angle(dOAng); if(dOAng<=PI && dOAng>PI/2){ dAng = nAngle + PI; } else if(dOAng>=0 && dOAngPI/2*3){ dAng = nAngle; } else if(dOAng>=PI && dOAng lstElevId; GetEntFromBlockByDxf(lstElevId, _T("ATS_ELEVATION")); AcDbObjectId *pLast=lstElevId.Tail(); XPoint ptLast; double *pLastLoc=NULL; double nLastElev=0.0; if(pLast) { OPENOBJ_BEGIN(*pLast, AcDb::kForRead, TDbSymbElevation, pLastElev); if(pLastElev) { ptLast=pLastElev->GetLocation(); nLastElev=_tstof(pLastElev->GetText()); pLastLoc=&ptLast.x; } OPENOBJ_END(); } CDimPipeElevationDlg dlg(acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; dlg.Create(IDD_DIM_PIPE_ELEVATION, acedGetAcadFrame()); } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); // cet 2011.11.22 add double dMeter = 1000; if (DocGetMeterUnitDraw()) { dMeter = 1; } // if(DocGetMeterUnitDraw() && dlg.m_iScale > 20) // { // dlg.m_iScale = 1; // dlg.UpdateData(FALSE); // } double g_nLeaderLen=7.0; double g_nBaseLen=7.0; XPoint ptLoc, ptPick; while(1) { int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); int nRetCode; INITGET_BEG(0, _T("R")); nRetCode=ads_getpoint(pLastLoc? (double *)Wcs2Ucs(pLastLoc) : NULL, _T("\n请点取标高点或 [参考标高(R)]<退出>:"), ptLoc); INITGET_END(); if(nRetCode==RTNORM) break; else if(nRetCode==RTKWORD) { Entity entRef; if(entRef.FilterSelect(_T("\n点取参考标高<退出>: "), RBList(RTDXF0, _T("ATS_ELEVATION"), NULL))==RTNORM) { OPENOBJ_BEGIN(entRef, AcDb::kForRead, TDbSymbElevation, pLastElev); if(pLastElev) { ptLast=pLastElev->GetLocation(); nLastElev=_tstof(pLastElev->GetText()); pLastLoc=&ptLast.x; } OPENOBJ_END(); } } else{ dlg.DestroyWindow(); return; } } RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); PickSet ss(SS_FREE); GetPointPickSet(ptLoc, ss, rbMask, int(0.5*DocGetPScale())); XPoint ptUcs = ptLoc; ptLoc=Ucs2Wcs(ptLoc); double nRotate(0), nEle(-250); TCHAR szLayer[256]; dlg.UpdateData(TRUE); CString strPipeLayer; // cet 2010.11.23 add 管道图层 if(ss.Length() == 1){ Entity ent = ss[0L]; if(ent.Is(_T("LINE"))){ XLine line(ent); nRotate = line.Direction(); if(nRotate >= PI && nRotate <= PI*3/2) nRotate -= PI; else if(nRotate > PI/2 && nRotate < PI) nRotate += PI; } else if(ent.Is(_T("ATS_PIPE"))){ ent.GetData(8, szLayer); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ nRotate = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint()); if(pPipe->GetModelType() == TPipeSys::kModel) { //nEle = pPipe->StartPoint().z/1000; cet 2011.11.22 modify nEle = pPipe->StartPoint().z / dMeter; } else nEle = _tstof(ReadXdata(ent, _T("TG-ELEVATION"))); if(nRotate >= PI && nRotate <= PI*3/2) nRotate -= PI; else if(nRotate > PI/2 && nRotate < PI) nRotate += PI; strPipeLayer = pPipe->layer(); // cet 2010.11.23 add 管道图层 } OPENOBJ_END(); } // nRotate = Ucs2Wcs(nRotate); } if(dlg.m_bOut){ if(ss.Length() == 1){ ads_prompt(_T("\n请点取引出点:<不引出>")); ptPick = GetAngPoint(ptUcs, nRotate); ptPick = Ucs2Wcs(ptPick); } else{ if(ads_getpoint(ptUcs, _T("\n请点取引出点:<不引出>"), ptPick) == RTNORM){ ptPick = Ucs2Wcs(ptPick); ptPick.z = ptLoc.z; nRotate = ads_angle(ptLoc, ptPick); if(nRotate >= PI && nRotate < PI*3/2) nRotate -= PI; else if(nRotate > PI/2 && nRotate < PI) nRotate += PI; } } } XString sText, sText1; dlg.UpdateData(TRUE); if(nEle > -200) { if(dlg.m_iPrecision == 1) sText = XString(_T("%.2f"), nEle); else sText = XString(_T("%.3f"), nEle); } else{ if(dlg.m_csText == _T("")) { // cet 2011.11.22 modify // if(dlg.m_iPrecision == 1) // sText = XString(_T("%.2f"), nLastElev+_AS_METER(ptLoc.y-ptLast.y)); // else // sText = XString(_T("%.3f"), nLastElev+_AS_METER(ptLoc.y-ptLast.y)); double dVal = ptLoc.y-ptLast.y; dVal /= dMeter; if (dlg.m_iPrecision == 1) { sText = XString(_T("%.2f"), nLastElev + dVal); } else { sText = XString(_T("%.3f"), nLastElev + dVal); } } else sText = dlg.m_csText; } dlg.m_csText = sText; dlg.UpdateData(FALSE); // if(dlg.m_csElePrefix != _T("无") && _tstof(sText) < 0.001) // sText = dlg.m_csElePrefix + _T("±") + sText; // else if(dlg.m_csElePrefix != _T("无") && _tstof(sText) > 0.001) // sText = dlg.m_csElePrefix + _T("+") + sText; if(!sText1) sText1=sText; TDbSymbElevation *pElev = new TDbSymbElevation; pElev->SetLocation(ptLoc); if(fabs(nRotate) < 0.001) pElev->SetLayoutRotation(Ucs2Wcs(nRotate)); else pElev->SetLayoutRotation(nRotate); pElev->SetText(sText1); if(!!ptPick){ pElev->SetLocation(ptPick); pElev->SetBaseLine(TRUE); pElev->SetBaseLen(ads_distance(ptPick, ptLoc)/100); } else{ pElev->SetLocation(ptLoc); pElev->SetBaseLine(FALSE); pElev->SetBaseLen(7); } pElev->SetLeader(FALSE); pElev->SetLeaderLen(7); pElev->SetTextHeight(dlg.m_nHeight); // zxl 2012.07.03 modify //pElev->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle)); pElev->SetTextStyleId(InitTwtTextStyle(g_csEleDimStyle)); pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen()); pElev->SetTextLayerId(InitLayer(LAY_TEXT)); pElev->setLayer(pElev->GetDefaultLayer()); // pElev->SetPScale((double)dlg.m_iScale); pElev->SetTextPoint(pElev->GetDefaultTextLocation()); TElevEdJig jig(pElev, &dlg); const TCHAR *pszPrompt=_T("\n请点取标高方向<当前>:"); jig.SetOperCode(TElevEdJig::kDirection); jig.SetPrompt(pszPrompt); int nRet=jig.DoIt(); if(nRet!=RTNORM) { dlg.DestroyWindow(); delete pElev; return; } AcDbObjectId id = pElev->AddToCSpace(Adesk::kTrue); //cet 2010.11.23 add 标注随管道的标注图层 if (!strPipeLayer.IsEmpty()) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSymbElevation, pEnt) if(pEnt != NULL) { CString strDimLayer = GetDimLayerNameByPipeLayer(strPipeLayer); pEnt->setLayer(InitLayer(strDimLayer)); } OPENOBJ_END() } if(_tcscmp(szLayer, _T("")) != 0){ Entity entLast; entLast.GetLast(); WriteXdata(entLast, _T("TG-LAYER"), szLayer); } dlg.DestroyWindow(); return; } void DimPipeElevation(Entity ent, XPoint ptLoc) { double dMeter(1); if(!DocGetMeterUnitDraw()) dMeter = 1000; TCHAR szLayer[256]; ent.GetData(8, szLayer); double nRotate(0), nEle(0); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ pPipe->getClosestPointTo(ptLoc, AcGeVector3d::kZAxis, ptLoc); //nRotate = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint());// zxl 2013.12.03 modify nRotate = ads_angle(Wcs2Ucs(pPipe->GetStartPoint()), Wcs2Ucs(pPipe->GetEndPoint())); if(pPipe->GetModelType() == TPipeSys::kModel) nEle = ptLoc.z/dMeter; else nEle = _tstof(ReadXdata(ent, _T("TG-ELEVATION"))); if(nRotate >= PI && nRotate <= PI*3/2) nRotate -= PI; else if(nRotate > PI/2 && nRotate < PI) nRotate += PI; } else return; OPENOBJ_END(); CString sText; sText.Format(_T("%.3f"), nEle); TDbSymbElevation *pElev = new TDbSymbElevation; pElev->SetLocation(ptLoc); // zxl 2013.12.03 modify nRotate统一为ucs角度 // if(fabs(nRotate) < 0.001) // pElev->SetLayoutRotation(Ucs2Wcs(nRotate)); // else // pElev->SetLayoutRotation(nRotate); pElev->SetLayoutRotation(Ucs2Wcs(nRotate)); pElev->SetText(sText); pElev->SetLocation(ptLoc); pElev->SetBaseLine(FALSE); pElev->SetBaseLen(7); pElev->SetLeader(FALSE); pElev->SetLeaderLen(7); // zxl 2012.07.03 modify // pElev->SetTextHeight(g_nTwtDimHeight); // pElev->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle)); pElev->SetTextHeight(g_nEleDimHeight); pElev->SetTextStyleId(InitTwtTextStyle(g_csEleDimStyle)); pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen()); pElev->SetTextLayerId(InitLayer(LAY_TEXT)); pElev->setLayer(pElev->GetDefaultLayer()); pElev->SetTextPoint(pElev->GetDefaultTextLocation()); //pElev->SetPScale((double)dlg.m_iScale); TElevEdJig jig(pElev); const TCHAR *pszPrompt=_T("\n请点取标高方向<当前>:"); jig.SetOperCode(TElevEdJig::kDirection); jig.SetPrompt(pszPrompt); int nRet=jig.DoIt(); if(nRet!=RTNORM) { delete pElev; return; } pElev->AddToCSpace(Adesk::kTrue); if(_tcscmp(szLayer, _T("")) != 0){ Entity entLast; entLast.GetLast(); WriteXdata(entLast, _T("TG-LAYER"), szLayer); } return; } ///////////////////////////////////////////////////////////////////////////// // CDimPipeElevationDlg dialog IMPLEMENT_DYNAMIC(CDimPipeElevationDlg, CModelessDialog) BOOL CDimPipeElevationDlg::m_bOut = TRUE; CString CDimPipeElevationDlg::m_csElePrefix = _T("无"); //int CDimPipeElevationDlg::m_iScale = 100; double CDimPipeElevationDlg::m_nHeight = 3.5; int CDimPipeElevationDlg::m_iPrecision = 0; CDimPipeElevationDlg::CDimPipeElevationDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CDimPipeElevationDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDimPipeElevationDlg) m_csText = _T(""); //}}AFX_DATA_INIT } void CDimPipeElevationDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDimPipeElevationDlg) DDX_Text(pDX, IDC_EDIT_CONTENT, m_csText); DDX_CBIndex(pDX, IDC_COMBO_PRECISION, m_iPrecision); DDX_Control(pDX, IDC_COMBO_PREFIX, m_colPerFix); DDX_CBString(pDX, IDC_COMBO_PREFIX, m_csElePrefix); DDX_Check(pDX, IDC_CHECK_OUT, m_bOut); DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDimPipeElevationDlg, CModelessDialog) //{{AFX_MSG_MAP(CDimPipeElevationDlg) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDimPipeElevationDlg message handlers // 重载update函数,支持combobox的数据刷新 zxl 2012.06.16 add BOOL CDimPipeElevationDlg::UpdateData(BOOL bSaveAndValidate) { CWnd::UpdateData(bSaveAndValidate); int len = m_colPerFix.GetCount(); BOOL bFlag = FALSE; for(int i=0;i