统计对齐标注
//----------------------------------------------------------------------------- //----- acrxEntryPoint.cpp //----------------------------------------------------------------------------- #include "StdAfx.h" #include "GMTextFun.h" //GMTextFun下载 //----------------------------------------------------------------------------- #define szRDS _RXST("") //1:枚举块定义上的的所有实体(包括冻结图层,锁定图层的) Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbBlockTableRecord* pBTR) { if(pBTR==NULL) return Acad::eNullHandle; //新建枚举器 AcDbBlockTableRecordIterator* pIterator=NULL; Acad::ErrorStatus es=pBTR->newIterator(pIterator); if(es!=Acad::eOk) return es; //执行遍历 AcDbObjectId id; for(pIterator->start();!pIterator->done();pIterator->step()) { es=pIterator->getEntityId(id); if(es!=Acad::eOk) continue; ids.append(id); } //删除释放枚举器 delete pIterator; pIterator=NULL; return Acad::eOk; } //4:枚举块定义上的的所有实体(包括冻结图层,锁定图层的) Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbObjectId btrId) { AcDbObject* pObj=NULL; Acad::ErrorStatus es=acdbOpenAcDbObject(pObj,btrId,AcDb::kForRead); if(es!=Acad::eOk) return es; if(!pObj->isKindOf(AcDbBlockTableRecord::desc())) { pObj->close(); return Acad::eNotThatKindOfClass; } AcDbBlockTableRecord* pRec=AcDbBlockTableRecord::cast(pObj); if(pRec==NULL) { pObj->close(); return Acad::eNullHandle; } es=EnumAllEntityInBTR(ids,pRec); pObj->close(); return es; } //获取标注中的文字 Acad::ErrorStatus GetDimText(CString& strText,AcDbAlignedDimension* pDim) { AcDbObjectIdArray ids; Acad::ErrorStatus es=EnumAllEntityInBTR(ids,pDim->dimBlockId()); if(es!=Acad::eOk) { return es; } for(int i=0;i<ids.logicalLength();i++) { AcDbEntityPointer spEnt(ids.at(i),AcDb::kForRead); if(spEnt.openStatus()!=Acad::eOk) { continue; } if(spEnt->isKindOf(AcDbText::desc())) { AcDbText* pText=AcDbText::cast(spEnt.object()); TCHAR* pTextStr=pText->textString(); strText=pTextStr; acutDelString(pTextStr); return Acad::eOk; } else if(spEnt->isKindOf(AcDbMText::desc())) { AcDbMText* pText=AcDbMText::cast(spEnt.object()); TCHAR* pTextStr=pText->contents(); strText=pTextStr; acutDelString(pTextStr); MTextItemArray itemArr; itemArr.item.str=strText; itemArr.item.nType=-1; itemArr.updateChildren(); strText=itemArr.getText(); return Acad::eOk; } } return Acad::eNotApplicable; } void TJDQBZ() { AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase(); if(pDb==NULL) { return; } CStringArray strTextArray; AcDbObjectIdArray ids; EnumAllEntityInBTR(ids,pDb->currentSpaceId()); for(int i=0;i<ids.logicalLength();i++) { AcDbEntityPointer spEnt(ids.at(i),AcDb::kForRead); if(spEnt.openStatus()!=Acad::eOk) { continue; } if(!spEnt->isKindOf(AcDbAlignedDimension::desc())) { continue; } AcDbAlignedDimension* pDim=AcDbAlignedDimension::cast(spEnt.object()); CString strText; if(GetDimText(strText,pDim)!=Acad::eOk) { continue; } strTextArray.Add(strText); } if(strTextArray.GetCount()==0) { AfxMessageBox(_T("未找到任何距离标注")); return; } CString lpDwgFile; CFileDialog fileDlg(FALSE, _T(".xls"), NULL, OFN_LONGNAMES | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST, _T("Excel文件 (*.xls)|*.xls||"), acedGetAcadFrame()); if (fileDlg.DoModal() != IDOK) { return; } lpDwgFile=fileDlg.GetPathName(); try { Excel::_ApplicationPtr pExcelApp; HRESULT hr = pExcelApp.CreateInstance(L"Excel.Application"); ATLASSERT(SUCCEEDED(hr)); pExcelApp->Visible = true; // make Excel’s main window visible Excel::_WorkbookPtr pWorkbook=pExcelApp->Workbooks->Add(); Excel::_WorksheetPtr pWorksheet = pWorkbook->ActiveSheet; Excel::RangePtr pRange = pWorksheet->Cells; pRange->Item[1][1] = L"ID"; // read/write cell’s data pRange->Item[1][2] = L"标注内容"; for(int i=0;i<strTextArray.GetCount();i++) { CString strId; strId.Format(_T("%d"),i+1); pRange->Item[1+i+1][1]=_bstr_t(strId); pRange->Item[1+i+1][2]=_bstr_t(strTextArray.GetAt(i)); } _variant_t FileFormat=Excel::xlExcel8; pWorkbook->SaveAs(_bstr_t(lpDwgFile), &FileFormat, // FileFormat &vtMissing, // Password &vtMissing, // WriteResPassword &vtMissing, // ReadOnlyRecommended &vtMissing, // CreateBackup Excel::xlNoChange); // AccessMode pWorkbook->Close(VARIANT_FALSE); // save changes pExcelApp->Quit(); } catch (_com_error& error) { ATLASSERT(FALSE); ATLTRACE2(error.ErrorMessage()); } } //----------------------------------------------------------------------------- //----- ObjectARX EntryPoint class CDimTJApp : public AcRxArxApp { public: CDimTJApp () : AcRxArxApp () {} virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) { AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ; // TODO: Add your initialization code here acedRegCmds->addCommand(_T("DimTJ"),_T("TJDQBZ"),_T("TJDQBZ"),0,TJDQBZ); acutPrintf(_T("\r\n欢迎访问CAD工具之家www.cadgj.com,大量实用CAD工具,CAD好帮手,图纸比较,图纸外发等等......")); acutPrintf(_T("\r\n统计对齐标注命令:TJDQBZ")); return (retCode) ; } virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) { AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ; // TODO: Add your code here acedRegCmds->removeGroup(_T("DimTJ")); return (retCode) ; } virtual void RegisterServerComponents () { } } ; //----------------------------------------------------------------------------- IMPLEMENT_ARX_ENTRYPOINT(CDimTJApp)查看完整版本: 统计对齐标注
Tags: