Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtAnotate/LeaderDim.cpp
T
2026-09-28 15:28:50 +08:00

371 lines
8.5 KiB
C++

#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;
}