#include "StdAfx.h" #include "LayoutLegendDlg.h" #include "TDbLayoutLegend.h" class TDbLayoutLegendJig:public AcEdJig { public: TDbLayoutLegendJig(TDbLayoutLegend *pLegend,TCHAR *pszPormat,TCHAR *pszKeyWord); ~TDbLayoutLegendJig(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; AcEdJig::DragStatus doIt(); void SetOffetPt(AcGePoint3d &pt); private: TDbLayoutLegend *m_pLegend; // AcGePoint3d m_ptCur; //鼠标当前坐标 AcGeVector3d m_vecOffet; //基点偏移向量 AcGePoint3d m_ptLast; TCHAR *m_pszPormat; //提示语 TCHAR *m_pszKeyWord; //关键字 }; TDbLayoutLegendJig::TDbLayoutLegendJig(TDbLayoutLegend *pLegend,TCHAR *pszPormat,TCHAR *pszKeyWord): m_pLegend(pLegend), m_ptCur(0,0,0), m_vecOffet(0,0,0), m_ptLast(0,0,0), m_pszPormat(pszPormat), m_pszKeyWord(pszKeyWord) { } TDbLayoutLegendJig::~TDbLayoutLegendJig() { } AcEdJig::DragStatus TDbLayoutLegendJig::doIt() { AcEdJig::DragStatus status =AcEdJig::kNull; setDispPrompt(m_pszPormat); try { INITGET_BEG(0,m_pszKeyWord); status = drag(); INITGET_END(); } catch(...) { status = AcEdJig::kCancel; } return status; } AcEdJig::DragStatus TDbLayoutLegendJig::sampler() { setUserInputControls((UserInputControls)(AcEdJig::kAccept3dCoordinates| AcEdJig::kNullResponseAccepted)); AcEdJig::DragStatus status =AcEdJig::kCancel; setKeywordList(m_pszKeyWord); status = acquirePoint(m_ptCur); if (status == AcEdJig::kNormal) { if (m_ptCur.isEqualTo(m_ptLast)) { return AcEdJig::kNoChange; } } m_ptLast = m_ptCur; return status; } Adesk::Boolean TDbLayoutLegendJig::update() { AcGePoint3d ptNew = m_ptCur - m_vecOffet; m_pLegend->SetLocation(ptNew); return Adesk::kTrue; } AcDbEntity * TDbLayoutLegendJig::entity() const { return(m_pLegend); } void TDbLayoutLegendJig::SetOffetPt(AcGePoint3d &pt) { m_vecOffet =pt-m_ptCur; } ////////////////////////////////////////////////////////////// // // 命令函数:总平图例 // ////////////////////////////////////////////////////////////// void LayoutLegendCmd() { ClayoutLegendDlg dlg; if(dlg.DoModal() != IDOK) { return; } if (dlg.GetSize() <= 0 ) { return; } //临时数据对象 CString sBlockName; CString sText; TDbLayoutLegend *pEnt = new TDbLayoutLegend; CList clistTextWidth; int nCloumn = dlg.GetCloumnNum(); for (int i=0; iPush_Back(sBlockName.GetBuffer(sBlockName.GetLength()),sText.GetBuffer(sText.GetLength())); sText.ReleaseBuffer(); TDbText text; text.SetText(sText); text.SetHeight(2.5); text.SetLocation(TADSGePoint3d(0, 0, 0)); text.SetStyleId(acdbCurDwg()->textstyle()); XPoint ptEx = text.GetExtents(); int nNum = i % nCloumn; if (clistTextWidth.FindIndex(nNum)) { if (ptEx.x > clistTextWidth.GetAt(clistTextWidth.FindIndex(nNum))) { clistTextWidth.SetAt(clistTextWidth.FindIndex(nNum), ptEx.x); } } else { clistTextWidth.AddTail(ptEx.x); } } //添加到模型空间标志 bool bFlag = false; pEnt->SetCloumnWidth(&clistTextWidth); //JIG效果 TDbLayoutLegendJig jig(pEnt,(LPTSTR)_T("\n点取图例位置或[改基点(T)]<退出>:"),(LPTSTR)_T("T")); while (true) { AcEdJig::DragStatus status = jig.doIt(); if(status == AcEdJig::kKW1)//改基点 { //创建临时对象,作为改选基点参考 TDbLayoutLegend *pIns = new TDbLayoutLegend; pIns->CopyPropertiesFrom(pEnt,AcDbMatchProperties::kSetAllFlagsOn); AcDbObjectId idTemp = AddToModelSpace(pIns); if (idTemp.isValid()) { XPoint pt; int rt=XGetPoint(NULL, _T("\n输入插入点"),pt); //删除临时对象 OPENOBJ_BEGIN(idTemp, AcDb::kForWrite, AcDbEntity, pEntRemove); if(pEntRemove) { pEntRemove->erase(); } OPENOBJ_END(); if(rt==RTNORM) { pt=Ucs2Wcs(pt); jig.SetOffetPt(pt); } else if (rt == RTCAN)//退出 { break; } else//空格、右键、回车 { continue; } } else { delete pIns; } } else if (status == AcEdJig::kNormal) { bFlag = true; break; } else { break; } }//end of true if (bFlag) { //炸开 AcDbVoidPtrArray entitySet; AcDbObjectId idLayer = InitLayer(LAY_TEXT); if(pEnt->explode(entitySet) == Acad::eOk) { for (int i=0;isetLayer(idLayer); } OPENOBJ_END(); } } } delete pEnt; }