#include "StdAfx.h" #include "LeaderTextDlg.h" #include "TLeaderAddOtherPtJig.h" #include "LeaderEdjig.h" extern bool WriteRegData(const CString &sRegName, const CString &strKey, double dVal); extern bool WriteRegData(const CString &sRegName, const CString &strKey, CString sVal); //编辑引出标注 int EditLeaderDim(AcDbObjectId id) { if (id.isNull()) { return 0; } CLeaderTextDlg dlg; dlg.SetDlgStyle(0); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSymbMultiLeader, pLeader); if (pLeader == NULL) { return -1; } dlg.SetDist2Line(pLeader->GetText2BaseRatio(TRUE, FALSE)); dlg.m_sDimLayer = pLeader->layer(); dlg.SetDimLayer(); dlg.m_sUpText = pLeader->GetText1(); dlg.m_sDownText = pLeader->GetText2(); dlg.m_sFontHight.Format(_T("%.1f"), pLeader->GetTextHeight()); dlg.g_sArrowSize.Format(_T("%.1f"),pLeader->GetArrowSize()); dlg.SetArrowStyle(pLeader->GetArrow()); dlg.SetTextAlign(pLeader->GetTextAlign()); AcDbObjectId idTextStyle = pLeader->GetTextStyleId(); OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle); // 解决因为文字样式缺少,而产生的崩溃问题 if (pStyle != NULL) { const TCHAR* pName = NULL; if (pStyle->getName(pName) == Acad::eOk && pName != NULL) dlg.SetTextStyle(pName); else AfxMessageBox(_T("文字风格已删除!")); } else { AfxMessageBox(_T("文字风格已删除!")); } dlg.g_dFontHeight = _tstof(dlg.m_sFontHight); WriteRegData(_T("TWTConfig"), _T("LeaderTextStyle"), dlg.g_sFontStyle); WriteRegData(_T("TWTConfig"), _T("LeaderTextDist2Line"), dlg.m_dDist2Line); OPENOBJ_END(); OPENOBJ_END(); dlg.m_id = id; CTemporaryResourceOverride vTemp; INT_PTR nResult = dlg.DoModal(); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSymbMultiLeader, pLeader); if (pLeader == NULL) { return -1; } if (nResult == IDOK) { if (pLeader->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pLeader); pLeader->downgradeOpen(); } } else if (nResult == 1000) { int nRet = RTNORM; while (nRet == RTNORM) { XPointList lstPts; // sg add 090330,为调用JIG类做准备 pLeader->GetLeaderVertexes(lstPts); AcGePoint3d ptBase = pLeader->GetLeaderPoint().AsAcGePoint3d(), ptVertexes1; if (lstPts.Length() > 0) ptVertexes1 = lstPts[0]->AsAcGePoint3d(); XPoint ptAdd; TLeaderAddOtherPtJig jig(FALSE, pLeader->GetLeaderDirection(), ptBase,pLeader->GetTextRotation(),pLeader->IsLeaderParall()); jig.SetPrompt(_T("\n请点取要增加的标注点<退出>: ")); nRet = jig.DoIt(); if (nRet == RTNORM) { ptAdd = jig.GetPickPoint(); if (pLeader->upgradeOpen() == Acad::eOk) { XPointList pts; pLeader->GetLeaderVertexes(pts); pts.Append(new XPoint(ptAdd)); pLeader->SetLeaderVertexes(pts, FALSE); dlg.Dlg2Obj(pLeader); pLeader->downgradeOpen(); } } } } else { pLeader->close(); return RTCAN; } OPENOBJ_END(); return 0; } // 获得端点在pt点的管子 BOOL GetPipe(XPoint &pt, PickSet &ss) { const double dDist = 1; AcGePoint3d ptGeLB ,ptGeLT, ptGeRB, ptGeRT; AcGeVector3d vtX = AcGeVector3d::kXAxis; AcGeVector3d vtY = AcGeVector3d::kYAxis; ptGeLB = pt - vtX * dDist / 2; ptGeLB = ptGeLB - vtY * dDist / 2; ptGeLT = ptGeLB + vtY * dDist; ptGeRB = ptGeLB + vtX * dDist; ptGeRT = ptGeRB + vtY * dDist; PickSet ssSel(SS_FREE); RBList rbFilter(RTDXF0, _T("ATS_PIPE"), NULL); TADSGePoint3d _pt1 = Wcs2Ucs(ptGeLB) , _pt2 = Wcs2Ucs(ptGeLT) , _pt3 = Wcs2Ucs(ptGeRT) , _pt4 = Wcs2Ucs(ptGeRB); RBList rbPt = acutBuildList(RTPOINT,&_pt1,RTPOINT,&_pt2,RTPOINT,&_pt3, RTPOINT,&_pt4,NULL); acedSSGet(_T("CP"),rbPt,NULL,rbFilter,ssSel); PickSet ss2(SS_FREE); double dDistToPt = 0.0; XPoint ptOnPipe; for (long i = 0; i < ssSel.Length(); i++) { OPENOBJ_BEGIN(ssSel[i], AcDb::kForRead, TDbPipe, pPipe); if (pPipe != NULL) { pPipe->getClosestPointTo(pt, ptOnPipe); dDistToPt = pt.Distance2d(ptOnPipe); if (dDistToPt < 1e-3) { ss2 += ssSel[i]; } } OPENOBJ_END(); } ss += ss2; if (ss.Length() >0 ) { return TRUE; } return FALSE; } void LeaderDim() { CTemporaryResourceOverride vTemp; CLeaderTextDlg *pDlg = NULL; AcDbObjectId idTextStyle = InitTextStyle(TS_DIM); if (!idTextStyle) return; pDlg->g_sFontStyle = (const TCHAR *)GetSymbolName(idTextStyle); if (pDlg == NULL) { pDlg = new CLeaderTextDlg; pDlg->Create(IDD_LEADER_TEXT); } pDlg->ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); TDbSymbMultiLeader ent; ent.SetLayoutRotation(Ucs2Wcs(0.0)); ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); ent.SetTextBaseLen(ent.GetDefaultTextBaseLen()); ent.SetText2BaseRatio(pDlg->GetDist2Line()); XPoint ptFirst; TDbSymbMultiLeader::TArrowStyle ar = TDbSymbMultiLeader::kNone; while(ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptFirst) == RTNORM) { PickSet ssAll(SS_FREE); XPoint ptPiont = Ucs2Wcs(ptFirst); if(GetPipe(ptPiont, ssAll))//搜索第一点附近的管线 { Entity entPipe; TCHAR szLayer[256]; entPipe = ssAll[0L]; entPipe.GetData(8, szLayer); pDlg->m_sLayer = szLayer; pDlg->SetCmbSysStyle(); pDlg->OnSysStyleSet(); pDlg->UpdateData(FALSE); } pDlg->UpdateData(FALSE); XPointList lstVertexes; lstVertexes.Append(new XPoint(Ucs2Wcs(ptFirst))); ent.SetLeaderVertexes(lstVertexes); pDlg->DlgToObj(&ent); pDlg->m_bPost = TRUE; ent.SetText2BaseRatio(pDlg->GetDist2Line()); TLeaderEdJig jig(&ent); jig.SetOperCode(TLeaderEdJig::kLeader); int nRet = RTNORM; while(1) { if(!pDlg->IsWindowVisible()) { pDlg->DestroyWindow(); delete pDlg; return; } jig.SetPrompt(_T("\n输入引线位置或 [更改箭头型式(A)]<退出>: ")); jig.SetKeyword(_T("` A")); jig.setUserInputControls(AcEdJig::kNullResponseAccepted); int kwd(0); nRet = jig.DoIt(&kwd); if (nRet == RTNORM) break; else if (nRet == RTKWORD) { if (kwd == 0) { if (pDlg->m_bGetText) { pDlg->GetPickText(); pDlg->m_bGetText = FALSE; } pDlg->DlgToObj(&ent); } if (kwd != 0) { if (ar == TDbSymbMultiLeader::kNone) ar = TDbSymbMultiLeader::kDote; else if (ar == TDbSymbMultiLeader::kDote) ar = TDbSymbMultiLeader::kArrow; else if (ar == TDbSymbMultiLeader::kArrow) ar = TDbSymbMultiLeader::kCrossing; else ar = TDbSymbMultiLeader::kNone; ent.SetArrow(ar); } } else// zxl 2012.09.17 add 支持右键和 ESC退出命令 { pDlg->DestroyWindow(); delete pDlg; return; } } jig.SetKeyword(_T("`")); jig.SetOperCode(TLeaderEdJig::kTextLine); while(1) { if(!pDlg->IsWindowVisible()) { pDlg->DestroyWindow(); delete pDlg; return; } jig.SetPrompt(_T("\n点取文字基线位置<退出>: ")); nRet = jig.DoIt(); if (nRet == RTNORM) break; else if (nRet == RTKWORD) { if (pDlg->m_bPost) { if (pDlg->m_bGetText) { pDlg->GetPickText(); pDlg->m_bGetText = FALSE; } pDlg->DlgToObj(&ent); } } else // zxl 2012.09.17 add 支持右键和 ESC退出命令 { if (::IsWindow(pDlg->m_hWnd)) pDlg->DestroyWindow(); delete pDlg; return; } } AcDbObjectId newId = ((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); pDlg->UpdateData(TRUE); pDlg->SetCmbSysStyle(); OPENOBJ_BEGIN(newId, AcDb::kForWrite, TDbSymbMultiLeader, pLeader); pLeader->SetText2BaseRatio(pDlg->GetDist2Line()); pLeader->setLayer(InitLayer(pDlg->m_sDimLayer));//设置标注图层 OPENOBJ_END(); if (pDlg->g_bLeadLine) //引出多线 { OPENOBJ_BEGIN(newId, AcDb::kForRead, TDbSymbMultiLeader, pLeader); if (pLeader != NULL) { XPoint ptBase = pLeader->GetLeaderPoint(); while (1) { XPoint ptAdd; TLeaderAddOtherPtJig jig2(&*pDlg, Ucs2Wcs(ptFirst), ptBase); jig2.SetPrompt(_T("\n输入其他的标注点<结束>: ")); jig2.SetKeyword(_T("`")); nRet = jig2.DoIt(); if(!pDlg->IsWindowVisible()) { pDlg->DestroyWindow(); if (pDlg != NULL) { delete pDlg; pDlg = NULL; } return; } if (nRet == RTNORM) { ptAdd = jig2.GetPickPoint(); XPointList pts; pLeader->GetLeaderVertexes(pts); pts.Append(new XPoint(ptAdd)); if (pLeader->upgradeOpen() == Acad::eOk) { pLeader->SetLeaderVertexes(pts); pLeader->downgradeOpen(); } } else if (nRet == RTNONE) { break; } } } OPENOBJ_END(); } pDlg->AddToRecent(); pDlg->m_bPost = FALSE; } WriteRegData(_T("TWTConfig"), _T("LeaderTextStyle"), pDlg->g_sFontStyle); WriteRegData(_T("TWTConfig"), _T("LeaderTextDist2Line"), pDlg->m_dDist2Line); pDlg->DestroyWindow(); delete pDlg; }