371 lines
8.5 KiB
C++
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;
|
|
}
|