#include "stdafx.h" #include "resource.h" #include "CellDialog.h" #include "SheetTitileDlg.h" #include "NewSheetDlg.h" #include "GridSheetDlg.h" #include "ColumnProp.h" #include "RowPropPage.h" #include "TipWnd.h" #include "texceloperator.h" #include "COMUTIL.H " #include "TgAs.h" #include "WordApplication.h" #include "CCellBlockDlg.h" int g_nTgKey = 0; // hook used #define IDC_USER_SHEET_EDIT 1090 extern TARCH_IMPEXP AcDbObjectId InitTextStyle(const TCHAR *pszStyle); // modify by xly on 101028 更具递增文字的需求,修改本函数,支持中文数字,希腊数字的递增变化 //CString PlusString(const TCHAR* szRes, int step, BOOL bIsPlus); CString PlusString(const TCHAR* szRes, int step, BOOL bIsPlus, bool bHasChineseNum = false); BOOL GetBlkAttrib(Entity entTemp, TCellBlockInsert &blk); Adesk::Boolean acedPostCommand(const TCHAR * ); // add by xly On 101216 引入设置实体的图层并将实体添加到图纸中 extern AcDbObjectId AddToSpace(Adesk::Boolean bClosed, TDbEntity *pEntSymb); void NewSheet() { static int nRowNum=4; static int nColNum=4; static double nRowHeight=7.0; static double nColWidth=40.0; CNewSheetDlg dlg1(acedGetAcadFrame()); dlg1.m_csColWidth.Format(_T("%.1f"), nColWidth); dlg1.m_csRowHeight.Format(_T("%.1f"), nRowHeight); dlg1.m_nRowNum=nRowNum; dlg1.m_nColNum=nColNum; { CTemporaryResourceOverride vTemp; if(dlg1.DoModal()!=IDOK) return; } nRowNum=dlg1.m_nRowNum; nColNum=dlg1.m_nColNum; nRowHeight=_tstof(dlg1.m_csRowHeight); nColWidth=_tstof(dlg1.m_csColWidth); XString sTextStyle; xg_getvar(_T("TEXTSTYLE"), sTextStyle); AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle); if(!idTextStyle) return; TDbSheet *pSheet=new TDbSheet; pSheet->SetRotation(Ucs2Wcs(0.0));//add by whl TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); double nTextSize=3.5; gridStyle.SetTextHeight(nTextSize); gridStyle.SetTextStyleId(idTextStyle); pSheet->SetTitleText(dlg1.m_csTitle); pSheet->SetTitleHeight(7.0); pSheet->SetGridStyle(gridStyle); pSheet->SetRowHeight(nRowHeight); pSheet->InitSheet(nRowNum,nColNum, nRowHeight, nColWidth); if(dlg1.m_bAllowChHeight) pSheet->SetRowHeightStyle(TSheetRow::kFree); XPoint ptLoc; if(XGetPoint(NULL, _T("\n左上角点"), ptLoc)!=RTNORM) { delete pSheet; return; } ptLoc=Ucs2Wcs(ptLoc); ptLoc.z=0; pSheet->SetLocation(ptLoc); // modify by xly on 101216 表格对象支持图层的切换 //pSheet->AddToCSpace(TRUE); AddToSpace(Adesk::kTrue, pSheet); // CGridSheetDlg dlg2(pSheet, acedGetAcadFrame()); // { // CTemporaryResourceOverride vTemp; // if(dlg2.DoModal()==IDOK) { // XPoint ptLoc; // if(XGetPoint(NULL, _T("\n左上角点"), ptLoc)!=RTNORM) // return; //ptLoc=Ucs2Wcs(ptLoc); //ptLoc.z=0; // pSheet->SetLocation(ptLoc); // pSheet->AddToCSpace(TRUE); // } else { // delete pSheet; // } // } } void Dbf2Sheet() { XString fileName; xg_getvar(_T("DWGPREFIX"), fileName); if(GetFileDia(fileName, 0, _T("dbf"), _T("选择一DBF文件"))!=RTNORM) return; CodeBase db; XDbfTable *pTable=db.Open(fileName); if(!pTable) { adsout << _T("\n不能打开数据库文件'") << fileName << _T("'"); return; } int nColumn = pTable->GetFieldNum(); int nRow = pTable->GetRecordCount(TRUE) + 1; if(nColumn<=0 || nRow<=0) return; XString sTextStyle; xg_getvar(_T("TEXTSTYLE"), sTextStyle); AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle); if(!idTextStyle) return; XPoint ptLoc; if(XGetPoint(NULL, _T("\n左上角点"), ptLoc)!=RTNORM) return; ptLoc=Ucs2Wcs(ptLoc); ptLoc.z=0; TDbSheet *pSheet=new TDbSheet; pSheet->InitSheet(nRow, nColumn, 7.0, 24.0); //设置标题 pSheet->SetLocation(ptLoc); pSheet->SetTitleText(fileName); pSheet->SetTitleHeight(7.0); pSheet->SetRowHeight(7.0); TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); double nTextSize=3.5; gridStyle.SetTextHeight(nTextSize); gridStyle.SetTextStyleId(idTextStyle); pSheet->SetGridStyle(gridStyle); // 设置列 FieldInfo *pFieldArray = pTable->GetFieldInfo(); ASSERT(pFieldArray && nColumn>0); for(int i=0; iSetColumnAt(i, column); TGridCell &cell=*(*pSheet)(0, i); cell.SetText(sFieldDesc); } FieldInfo::ReleaseArray(pFieldArray); TSheetRow rowHead; rowHead.SetHeight(pSheet->GetRowHeight(TRUE)); rowHead.SetRowHeightStyle(TSheetRow::kAutomatic); pSheet->SetRowAt(0, rowHead); int iRow=1; for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext(), iRow++) { for(int iCol=0; iColGetFieldContent(iCol); const TCHAR *szVal=(const TCHAR *)(*pField); cell.SetText(szVal); } TSheetRow row; row.SetHeight(pSheet->GetRowHeight()); //row.SetRowHeightStyle(TSheetRow::kFixed); pSheet->SetRowAt(iRow, row); } if(pSheet->IsValid()) pSheet->AddToCSpace(Adesk::kTrue); else delete pSheet; } ///////////////////////////////////////////////////////////////////////////// // Zyu modify on 100316 // IsPaperSpace()函数已经在底层函数中提供,暂时修改名称 /* inline BOOL IsPaperSpace() { int cvport=0; xg_getvar(_T("CVPORT"), &cvport); return (cvport==1); } */ AcDbObjectId GetHitSheet(XPoint ptHit) { ptHit.z=0; AcDbObjectId id; DList ss; RBList mask(RTDXF0, _T("ATS_SHEET"), NULL); // Zyu modify on 100316 // IsPaperSpace()函数已经在底层函数中提供,暂时修改名称 const TCHAR *pszBlock=IsPaperSpace()? ACDB_PAPER_SPACE : ACDB_MODEL_SPACE; if(GetEntFromBlockByDxf(ss, _T("ATS_SHEET"), 0, pszBlock)==Acad::eOk) { int lCount=ss.Length(); for(int i=0; iIsValid()) { XPoly2D poly; pSheet->GetBorder(poly); if((ptHit&poly)==PR_INSIDE) { id=ent; break; } } OPENOBJ_END(); } } return id; } // 列/行/单元格加亮 class TSheetEdJig : public AcEdJig { public: TSheetEdJig(); virtual ~TSheetEdJig(); enum TSheetOper { kNone=0, kSingleRow=1, kMultRow=2, kSingleCol=3, kMultCol=4, kSingleCell=5, kMultCell=6}; protected: int GetRetCode(int nRetCode, int *kewyIdx=NULL) const; void UpdateRegion(XPoint ptTopLeft, double nWidth, double nHeight, double nAng); protected: //输入 XString m_sPrompt; //提示信息 XString m_sKeyword; TSheetEdJig::TSheetOper m_nOperCode; XPoint m_ptInput; int m_iOldToRow, m_iOldToCol; // 中间结果 AcDbSolid m_entDraw; // 结果 // 结果和输入 AcDbObjectId m_idSheet; CTipWnd *m_TextDlg; BOOL m_bNeedPlus; public: XPoint m_ptResult; int DoIt(int *pKeyIndex=NULL); virtual DragStatus sampler(); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; //BOOL GetHitCell(const TDbSheet *pSheet, int &nRowFrom, int &nColFrom) const; //BOOL GetHitColumn(const TDbSheet *pSheet, int &nColFrom) const; //BOOL GetHitRow(const TDbSheet *pSheet, int &nRowFrom) const; AcDbObjectId GetHitRow(int &nRowFrom) const; AcDbObjectId GetHitColumn(int &nColFrom) const; BOOL GetHitCells(const TDbSheet *pSheet, int &nRowFrom, int &nColFrom, int &nRowTo, int &nColTo) const; BOOL GetHitColumns(const TDbSheet *pSheet, int &nColFrom, int &nColTo) const; BOOL GetHitRows(const TDbSheet *pSheet, int &nRowFrom, int &nRowTo) const; public: void SetPrompt(const TCHAR *s) { m_sPrompt=s; } void SetKeyword(const TCHAR *k) { m_sKeyword=k; } void SetOperCode(TSheetEdJig::TSheetOper nCode) { m_nOperCode=nCode; } void SetPoint1(XPoint pt) { m_ptInput=pt; } void SetSheetId(AcDbObjectId id) { m_idSheet=id; } void SetNeedPlus(BOOL bNeedPlus) { m_bNeedPlus=bNeedPlus; } void EditRowProp(); void EditRowProps(); void RemoveRows(); void InsertRows(); void EditColProp(); void EditColProps(); void RemoveCols(); void InsertCols(); void EditCell(); void EditCellProps(); void ExplodeCell(); }; TSheetEdJig::TSheetEdJig() { m_nOperCode=TSheetEdJig::kNone; m_TextDlg = NULL; m_iOldToRow = 0; m_iOldToCol = 0; m_bNeedPlus = FALSE; } TSheetEdJig::~TSheetEdJig() { if(m_TextDlg){ m_TextDlg->DestroyWindow(); delete m_TextDlg; m_TextDlg = NULL; } } // 转换成ADS代码 int TSheetEdJig::GetRetCode(int retCode, int *kwordId) const { int ret = retCode; if (ret == AcEdJig::kCancel) ret = RTCAN; else if(ret == AcEdJig::kNull) ret = RTNONE; else if (ret <= 0) ret = RTNORM; else { if(kwordId) *kwordId = ret-1; ret = RTKWORD; } return ret; } BOOL TSheetEdJig::GetHitCells(const TDbSheet *pSheet, int &nRowFrom, int &nColFrom, int &nRowTo, int &nColTo) const { int nColMin1, nRowMin1, nColMin2, nRowMin2; const TGridCell *pCell1=pSheet->HitTestOnCell(m_ptInput, &nRowMin1, &nColMin1); const TGridCell *pCell2=pSheet->HitTestOnCell(m_ptResult, &nRowMin2, &nColMin2); if(!pCell1 || !pCell2) return FALSE; int nColMax1=pCell1->IsRange()? pCell1->GetRange()->GetCoordMax(FALSE) : nColMin1; int nRowMax1=pCell1->IsRange()? pCell1->GetRange()->GetCoordMax(TRUE) : nRowMin1; int nColMax2=pCell2->IsRange()? pCell2->GetRange()->GetCoordMax(FALSE) : nColMin2; int nRowMax2=pCell2->IsRange()? pCell2->GetRange()->GetCoordMax(TRUE) : nRowMin2; nRowFrom = min(nRowMin1, nRowMin2); nRowTo = max(nRowMax1, nRowMax2); nColFrom = min(nColMin1, nColMin2); nColTo = max(nColMax1, nColMax2); return TRUE; } BOOL TSheetEdJig::GetHitColumns(const TDbSheet *pSheet, int &nColFrom, int &nColTo) const { int nCol1=pSheet->HitTestOnColumn(m_ptInput); if(nCol1==COL_PREVFIRST) nCol1=0; else if(nCol1==COL_NEXTLAST) nCol1=pSheet->GetColumnNum()-1; ASSERT(nCol1>=0); int nCol2=pSheet->HitTestOnColumn(m_ptResult); if(nCol2==COL_PREVFIRST) nCol2=0; else if(nCol2==COL_NEXTLAST) nCol2=pSheet->GetColumnNum()-1; ASSERT(nCol2>=0); nColFrom=min(nCol1, nCol2); nColTo=max(nCol1, nCol2); return TRUE; } BOOL TSheetEdJig::GetHitRows(const TDbSheet *pSheet, int &nRowFrom, int &nRowTo) const { int nRow1=pSheet->HitTestOnRow(m_ptInput); if(nRow1==ROW_PREVFIRST) nRow1=0; else if(nRow1==COL_NEXTLAST) nRow1=pSheet->GetRowNum()-1; ASSERT(nRow1>=0); int nRow2=pSheet->HitTestOnRow(m_ptResult); if(nRow2==ROW_PREVFIRST) nRow2=0; else if(nRow2==COL_NEXTLAST) nRow2=pSheet->GetRowNum()-1; ASSERT(nRow2>=0); nRowFrom=min(nRow1, nRow2); nRowTo=max(nRow1, nRow2); return TRUE; } AcDbObjectId TSheetEdJig::GetHitRow(int &nRowFrom) const { ASSERT(m_nOperCode==TSheetEdJig::kSingleRow); AcDbObjectId id=m_idSheet; if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet); ASSERT(pSheet); int nRow=pSheet->HitTestOnRow(m_ptResult); if(nRow<0) { id=AcDbObjectId::kNull; } else { nRowFrom=nRow; } OPENOBJ_END(); } return id; } AcDbObjectId TSheetEdJig::GetHitColumn(int &nColFrom) const { ASSERT(m_nOperCode==TSheetEdJig::kSingleCol); AcDbObjectId id=m_idSheet; if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet); ASSERT(pSheet); int nCol=pSheet->HitTestOnColumn(m_ptResult); if(nCol<0) { id=AcDbObjectId::kNull; } else { nColFrom=nCol; } OPENOBJ_END(); } return id; } // 开始执行拖动 int TSheetEdJig::DoIt(int *keyIndex) { int nRetCode=0; //acedGetAcadDwgView()->SetFocus(); //屏幕菜单点取时, 命令焦点没有在图形窗口 setDispPrompt(m_sPrompt); if(!!m_sKeyword && keyIndex) { INITGET_BEG(-1, m_sKeyword); try { nRetCode = drag(); } catch(...) { nRetCode=AcEdJig::kCancel; } INITGET_END(); } else { try { nRetCode = drag(); } catch(...) { nRetCode=AcEdJig::kCancel; } } nRetCode=GetRetCode(nRetCode, keyIndex); return nRetCode; } // 反馈 AcEdJig::DragStatus TSheetEdJig::sampler() { DragStatus stat; setUserInputControls((UserInputControls) (AcEdJig::kAccept3dCoordinates|AcEdJig::kNullResponseAccepted)); if (!!m_sKeyword) setKeywordList(m_sKeyword); else setKeywordList(NULL); XPoint ptTemp; stat = acquirePoint(ptTemp); if(stat == AcEdJig::kNormal) { if (ptTemp.Distance2d(m_ptResult)>_DIST_SNAP) { m_ptResult=ptTemp; } else return AcEdJig::kNoChange; } return stat; } void TSheetEdJig::UpdateRegion(XPoint ptTopLeft, double nWidth, double nHeight, double nAng) { XPoint ptBotLeft, ptBotRight, ptTopRight; ads_polar(ptTopLeft, nAng-PI/2, nHeight, ptBotLeft); ads_polar(ptBotLeft, nAng, nWidth, ptBotRight); ads_polar(ptTopLeft, nAng, nWidth, ptTopRight); m_entDraw.setPointAt(0, ptTopLeft); m_entDraw.setPointAt(1, ptBotLeft); m_entDraw.setPointAt(3, ptBotRight); m_entDraw.setPointAt(2, ptTopRight); } // 更新实体数据 Adesk::Boolean TSheetEdJig::update() { Adesk::Boolean bRet=Adesk::kTrue; if(m_nOperCode==TSheetEdJig::kSingleCol) { //单行选择 m_idSheet = GetHitSheet(m_ptResult); if(!!m_idSheet) { OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); int nCol = pSheet->HitTestOnColumn(m_ptResult); if(nCol>=0) { double nWidth=pSheet->GetColumnWidth(nCol, FALSE); double nHeight=pSheet->GetSheetHeight(FALSE, FALSE); XPoint ptTopLeft=pSheet->GetColumnPoint(nCol); double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, nWidth, nHeight, nAng); } OPENOBJ_END(); } } else if(m_nOperCode==TSheetEdJig::kMultCol) { //列选择 ASSERT(!!m_idSheet); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet) ASSERT(pSheet); int nFrom, nTo; if(GetHitColumns(pSheet, nFrom, nTo)) { double nWidth=pSheet->GetColumnsWidth(nFrom, nTo, FALSE); double nHeight=pSheet->GetSheetHeight(FALSE, FALSE); XPoint ptTopLeft=pSheet->GetColumnPoint(nFrom); double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, nWidth, nHeight, nAng); } OPENOBJ_END(); } else if(m_nOperCode==TSheetEdJig::kSingleRow) { //单行选择 m_idSheet = GetHitSheet(m_ptResult); if(!!m_idSheet) { OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); ASSERT(pSheet); int nRow=pSheet->HitTestOnRow(m_ptResult); if(nRow>=0) { XPoint ptTopLeft=pSheet->GetRowPoint(nRow); double nHeight=pSheet->GetRowHeight(nRow, FALSE); double nWidth=pSheet->GetSheetWidth(FALSE); double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, nWidth, nHeight, nAng); } OPENOBJ_END(); } } else if(m_nOperCode==TSheetEdJig::kMultRow) { //多行选择 ASSERT(!!m_idSheet); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); ASSERT(pSheet); int nFrom, nTo; if(GetHitRows(pSheet, nFrom, nTo)) { double nHeight=pSheet->GetRowsHeight(nFrom, nTo, FALSE); double nWidth=pSheet->GetSheetWidth(FALSE); XPoint ptTopLeft=pSheet->GetRowPoint(nFrom); double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, nWidth, nHeight, nAng); } OPENOBJ_END(); } else if(m_nOperCode==TSheetEdJig::kMultCell) {//窗选单元格 ASSERT(!!m_idSheet); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); ASSERT(pSheet); int nColFrom, nColTo, nRowFrom, nRowTo; if(GetHitCells(pSheet, nRowFrom, nColFrom, nRowTo, nColTo)) { double nWidth=pSheet->GetColumnsWidth(nColFrom, nColTo, FALSE); double nHeight=pSheet->GetRowsHeight(nRowFrom, nRowTo, FALSE); XPoint ptTopLeft=pSheet->GetCellPoint(nRowFrom, nColFrom); double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, nWidth, nHeight, nAng); int nRow, nCol; const TGridCell *pCell = pSheet->HitTestOnCell(m_ptInput, &nRow, &nCol); pSheet->HitTestOnCell(m_ptResult, &nRow, &nCol); SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; if((nRow != m_iOldToRow || nCol != m_iOldToCol) && !bShift && m_bNeedPlus){ m_iOldToRow = nRow; m_iOldToCol = nCol; CString csText = pCell->GetText(); if(csText==_T("")) return Adesk::kFalse; int len = abs(nRowTo - nRowFrom); if(len == 0){ len = abs(nColTo - nColFrom); } SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; CString csText2; if(bCtrl) csText2 = PlusString(csText, len, FALSE); else csText2 = PlusString(csText, len, TRUE); DList lstInfo; CBlockStruct *pInfo = new CBlockStruct(); pInfo->m_csRecord = csText; pInfo->m_csDesName = csText2; lstInfo.Append(pInfo); if(m_TextDlg) { m_TextDlg->DestroyWindow(); delete m_TextDlg; m_TextDlg = NULL; } if(!m_TextDlg){ XPoint ptSize = pSheet->GetCellSize(m_iOldToRow, m_iOldToCol); XPoint ptStart = pSheet->GetCellPoint(m_iOldToRow, m_iOldToCol); ptStart.x += (ptSize.x*DocGetPScale()); m_TextDlg = new CTipWnd(); CPoint ptDwgView; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptStart, ptDwgView); m_TextDlg->Create(lstInfo, ptDwgView.x, ptDwgView.y, acedGetAcadDwgView()); } } } OPENOBJ_END(); } else if(m_nOperCode==TSheetEdJig::kSingleCell) { //点选单元格 m_idSheet = GetHitSheet(m_ptResult); if(!!m_idSheet) { OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); int nRow, nCol; const TGridCell *pCell = pSheet->HitTestOnCell(m_ptResult, &nRow, &nCol); if(pCell) { XPoint ptTopLeft=pSheet->GetCellPoint(nRow, nCol); XPoint szCell=pSheet->GetCellSize(nRow, nCol, FALSE); XPoint ptBotLeft, ptBotRight, ptTopRight; double nAng=pSheet->GetRotation(); UpdateRegion(ptTopLeft, szCell.x, szCell.y, nAng); } OPENOBJ_END(); } } else { bRet=Adesk::kFalse; } return bRet; } AcDbEntity* TSheetEdJig::entity() const { return (AcDbEntity *)(&m_entDraw); } ///////////////////////////////////////////////////////////// void TSheetEdJig::EditRowProp() { ASSERT(m_nOperCode==TSheetEdJig::kSingleRow); int nRow; AcDbObjectId id=GetHitRow(nRow); if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet); if(pSheet) { CTemporaryResourceOverride vTemp; CRowProp dlg(acedGetAcadFrame()); dlg.Obj2Dlg(*pSheet, nRow); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { dlg.Dlg2Obj(*pSheet, nRow, nRow); pSheet->CalculateRowHeight(nRow); pSheet->downgradeOpen(); } } } OPENOBJ_END(); } } void TSheetEdJig::EditRowProps() { ASSERT(m_nOperCode==TSheetEdJig::kMultRow); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); if(!pSheet) return; int nRowFrom, nRowTo; if(GetHitRows(pSheet, nRowFrom, nRowTo)) { CTemporaryResourceOverride vTemp; CRowProp dlg(acedGetAcadFrame()); dlg.Obj2Dlg(*pSheet, nRowFrom); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { dlg.Dlg2Obj(*pSheet, nRowFrom, nRowTo); pSheet->CalculateRowHeight(nRowFrom, nRowTo); pSheet->downgradeOpen(); } } } OPENOBJ_END(); } void TSheetEdJig::RemoveRows() { ASSERT(m_nOperCode==TSheetEdJig::kMultRow); OPENOBJ_BEGIN(m_idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(!pSheet) return; int nRowFrom, nRowTo; if(GetHitRows(pSheet, nRowFrom, nRowTo)) { if(nRowTo-nRowFrom == pSheet->GetRowNum()-1) pSheet->erase(); else { for(int i=nRowFrom; i<=nRowTo; i++) { pSheet->RemoveRow(nRowFrom); } } } OPENOBJ_END(); } // 插入多行 void TSheetEdJig::InsertRows() { ASSERT(m_nOperCode==TSheetEdJig::kSingleRow); int nRow; AcDbObjectId id=GetHitRow(nRow); if(!!id) { int nRowNum=1; ads_initget(RSG_NONEG|RSG_NOZERO, NULL); adsout << _T("\n输入要添加的空行数目<") << nRowNum << _T(">:"); if(ads_getint(_T(""), &nRowNum)!=RTCAN) { static int nAnser=Q_YES; int nAns=YesNoQuestion(_T("\n是否同时复制当前行"), nAnser); if(nAns!=RTCAN) nAnser=nAns; if(nAns==RTCAN) return; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { if(nRowNum+pSheet->GetRowNum()>255) { adsout << _T("\n表格最多允许255行!"); return; } for(int i=0; iAddRowAt(nRow); if(nAns==Q_YES) pSheet->CopyRow(nRow+1, nRow); } } OPENOBJ_END(); } } } void TSheetEdJig::EditColProp() { ASSERT(m_nOperCode==TSheetEdJig::kSingleCol); int nCol; AcDbObjectId id=GetHitColumn(nCol); if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet); if(pSheet) { CTemporaryResourceOverride vTemp; CColumnProp dlg(acedGetAcadFrame()); dlg.Obj2Dlg(*pSheet, nCol); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { dlg.Dlg2Obj(*pSheet, nCol, nCol); pSheet->downgradeOpen(); } } } OPENOBJ_END(); } } void TSheetEdJig::EditColProps() { ASSERT(m_nOperCode==TSheetEdJig::kMultCol); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); if(!pSheet) return; int nColFrom, nColTo; if(GetHitColumns(pSheet, nColFrom, nColTo)) { CTemporaryResourceOverride vTemp; CColumnProp dlg(acedGetAcadFrame()); dlg.Obj2Dlg(*pSheet, nColFrom); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { dlg.Dlg2Obj(*pSheet, nColFrom, nColTo); pSheet->CalculateRowHeight(0, pSheet->GetRowNum()-1); pSheet->downgradeOpen(); } } } OPENOBJ_END(); } void TSheetEdJig::RemoveCols() { ASSERT(m_nOperCode==TSheetEdJig::kMultCol); OPENOBJ_BEGIN(m_idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(!pSheet) return; int nColFrom, nColTo; if(GetHitColumns(pSheet, nColFrom, nColTo)) { if(nColTo-nColFrom == pSheet->GetColumnNum()-1) pSheet->erase(); else { for(int i=nColFrom; i<=nColTo; i++) { pSheet->RemoveColumn(nColFrom); } pSheet->CalculateRowHeight(0, pSheet->GetRowNum()-1); } } OPENOBJ_END(); } // 插入多列 void TSheetEdJig::InsertCols() { ASSERT(m_nOperCode==TSheetEdJig::kSingleCol); int nCol; AcDbObjectId id=GetHitColumn(nCol); if(!!id) { int nColNum=1; ads_initget(RSG_NONEG|RSG_NOZERO, NULL); adsout << _T("\n输入要添加的空列的数目<") << nColNum << _T(">:"); if(ads_getint(_T(""), &nColNum)!=RTCAN) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { if(nColNum+pSheet->GetColumnNum()>255) { adsout << _T("\n表格最多允许255列!"); return; } for(int i=0; iAddColumnAt(nCol); } } OPENOBJ_END(); } } } // 单格分解 void TSheetEdJig::ExplodeCell() { OPENOBJ_BEGIN(m_idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { int nRow, nCol; const TGridCell *pCell=pSheet->HitTestOnCell(m_ptResult, &nRow, &nCol); if(!pCell) return; if(!pCell->GetRange()) { adsout << _T("\n该单元格不是合并单元格, 无法分解!"); } else { pSheet->ExplodeCell(nRow, nCol); } } OPENOBJ_END(); } // 单格编辑 void TSheetEdJig::EditCell() { OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); if(pSheet) { int nRow, nCol; const TGridCell *pCell=pSheet->HitTestOnCell(m_ptResult, &nRow, &nCol); if(!pCell) return; //add by xlc on 081030 增加表格单元中块的编辑 CString csText = pCell->GetText(); TCellBlockInsert blkinsert; if (blkinsert.ParserDesc(csText)) { CTemporaryResourceOverride vTemp; CCellBlockDlg dlg; int nFlag=blkinsert.m_nControlFlag; dlg.m_strBlockName=blkinsert.m_sBlockName; dlg.m_nFlag=nFlag; dlg.m_idOldBlock=GetBlockIdFromString(blkinsert.m_sBlockName); dlg.CloneBlockToPreview(); dlg.m_bAutoSize=((nFlag&CBF_AUTOSIZE)!=0); dlg.m_bUniScale=((nFlag&CBF_UNISCALE)!=0); dlg.m_bShowAttr=((nFlag&CBF_SHOW_ATTR)!=0); dlg.m_bEqualSide=((nFlag&CBF_EQUAL_SIDE)!=0); if (dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { Entity entText; AcDbObjectId objId=dlg.m_idOldBlock; ads_name ent; Acad::ErrorStatus es=acdbGetAdsName(ent,objId); if(es==Acad::eOk) { entText=ent; TCellBlockInsert blk; blk.m_sBlockName = dlg.m_strBlockName; blk.m_nControlFlag=dlg.m_nFlag; GetBlkAttrib(entText, blk); XString xsBlk; blk.OutputDesc(xsBlk); TGridCell *pCell=(*pSheet)(nRow, nCol); pCell->SetText(xsBlk); pSheet->CalculateRowHeight(nRow); } pSheet->downgradeOpen(); } } } else { CTemporaryResourceOverride vTemp; CCellDialog dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pSheet, nRow, nCol); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { dlg.Dlg2Obj(pSheet, nRow, nCol); pSheet->CalculateRowHeight(nRow); pSheet->downgradeOpen(); } } } } OPENOBJ_END(); } // 多格编辑 void TSheetEdJig::EditCellProps() { OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbSheet, pSheet); if(pSheet) { int nRowFrom, nColFrom, nRowTo, nColTo; if(GetHitCells(pSheet, nRowFrom, nColFrom, nRowTo, nColTo)) { CTemporaryResourceOverride vTemp; CCellPropDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pSheet, nRowFrom, nColFrom); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { for(int nRow=nRowFrom; nRow<=nRowTo; nRow++) { for(int nCol=nColFrom; nCol<=nColTo; nCol++) { dlg.Dlg2Obj(pSheet, nRow, nCol); } pSheet->CalculateRowHeight(nRow); } pSheet->downgradeOpen(); } } } } OPENOBJ_END(); } ///////////////////////////////////////////////////////////////////////// // Command: 全屏编辑 void SheetFullEdit() { Entity id; if(SelectEntity(_T("\n选择表格:"), id, RBList(RTDXF0, _T("ATS_SHEET"), NULL))==RTNORM) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSheet, pSheet); if(pSheet) { TDbSheet sheet; CopyObject(*pSheet, sheet); CTemporaryResourceOverride vTemp; CGridSheetDlg dlg(&sheet, acedGetAcadFrame()); if(dlg.DoModal()==IDOK) { if(pSheet->upgradeOpen()==Acad::eOk) { pSheet->assertWriteEnabled(); CopyObject(sheet, *pSheet); pSheet->CalculateRowHeight(0, pSheet->GetRowNum()-1); pSheet->downgradeOpen(); } } } OPENOBJ_END(); } } int Keyword2CellOper(TCHAR c) { const TCHAR *szKey = _T("SMMX"); // Zyu modify on 100726,去掉编译警告 //int nLen=_tcslen(szKey); size_t nLen=_tcslen(szKey); int nRet=-1; for(int i=0; i osmode(_T("OSMODE"), 0); const TCHAR *szPrompts[]={ _T("\n请点取一单元格进行编辑或 [多格属性(M)/单元分解(X)]<退出>:"), //单格编辑 _T("\n请点取确定多格的第一点以编辑属性或 [单格编辑(S)/单元分解(X)]<退出>:"), //多格属性 _T("\n请点取确定多格的第二点以编辑属性<退出>:"), //多格属性编辑 _T("\n请点要分解的单元格或 [单格编辑(S)/多格属性(M)]<退出>:"), //多格属性 }; const TCHAR *szKeywords1[]={ _T("M X"), _T("S X"), _T(""), _T("S M"), }; const TCHAR *szKeywords2[]= { _T("MX"), _T("SX"), _T(""), _T("SM"), }; int nOper=0; TSheetEdJig jig; while(nOper>=0) { jig.SetPrompt(szPrompts[nOper]); jig.SetKeyword(szKeywords1[nOper]); switch(nOper) { case 0: case 3: {//单格属性或者单元分解 jig.SetOperCode(TSheetEdJig::kSingleCell); const TCHAR *szKeyword=szKeywords2[nOper]; int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode==RTNORM) { if(nOper==0) jig.EditCell(); else jig.ExplodeCell(); } else if(nCode==RTKWORD) { nOper=Keyword2CellOper(szKeyword[nKeyIndex]);; } else { nOper=-1; } } break; case 1: { //多格属性第一点 const TCHAR *szKeyword=szKeywords2[nOper]; XPoint ptFrom; int nCode; INITGET_BEG(0, szKeywords1[nOper]); nCode=ads_getpoint(NULL, szPrompts[nOper], ptFrom); INITGET_END(); if(nCode==RTNORM) { ptFrom=Ucs2Wcs(ptFrom); AcDbObjectId id=GetHitSheet(ptFrom); if(!id) { adsout << _T("\n请正确点取!"); } else { jig.SetSheetId(id); jig.SetPoint1(ptFrom); nOper++; } } else if(nCode==RTKWORD) { XString sKeyword; ads_getinput(sKeyword); nOper=Keyword2CellOper(sKeyword[0]); } else { nOper=-1; } } break; case 2: { //多格属性第二点 jig.SetOperCode(TSheetEdJig::kMultCell); int nCode=jig.DoIt(); if(nCode==RTNORM) { jig.EditCellProps(); nOper--; } else { nOper=-1; } } break; default: break; } } } // Command: 合并单元格 void MergeCell() { XPushVar osmode(_T("OSMODE"), 0); XPoint pt1; int nRet=ads_getpoint(NULL, _T("\n点取第一个角点: "), pt1); pt1 = Ucs2Wcs(pt1); AcDbObjectId idSheet=GetHitSheet(pt1); if(!idSheet) return; TSheetEdJig jig; jig.SetPrompt(_T("\n点取另一个角点: ")); jig.SetSheetId(idSheet); jig.SetOperCode(TSheetEdJig::kMultCell); jig.SetPoint1(pt1); if(jig.DoIt()==RTNORM) { OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { int nRowFrom, nColFrom, nRowTo, nColTo; if(jig.GetHitCells(pSheet, nRowFrom, nColFrom, nRowTo, nColTo)) { pSheet->MergeCells(nRowFrom, nColFrom, nRowTo, nColTo); } } OPENOBJ_END(); } } int Keyword2ColOper(TCHAR c) { const TCHAR *szKey = _T("SMMATEEXX"); // Zyu modify on 100726,去掉编译警告 //int nLen=_tcslen(szKey); size_t nLen = _tcslen(szKey); int nRet=-1; for(int i=0; i osmode(_T("OSMODE"), 0); const TCHAR *szPrompts[]={ _T("\n请点取一表列以编辑属性或 [多列属性(M)/插入列(A)/加末列(T)/删除列(E)/交换列(X)]<退出>:"), //单行属性 _T("\n请点取确定多列的第一点以编辑属性或 [单列属性(S)/插入列(A)/加末列(T)/删除列(E)/交换列(X)]<退出>:"), //多行属性 _T("\n请点取确定多列的第二点以编辑属性<退出>:"), //多行属性编辑 _T("\n请点取一表列以插入新列或 [单列属性(S)/多列属性(M)/加末列(T)/删除列(E)/交换列(X)]<退出>:"), //增加行 _T("\n请点取表格以加末列或 [单列属性(S)/多列属性(M)/插入列(A)/删除列(E)/交换列(X)]<退出>:"), //末尾加行 _T("\n请点取确定多列的第一点以删除表列或 [单列属性(S)/多列属性(M)/插入列(A)/加末列(T)/交换列(X)]<退出>:"), //删除行 _T("\n请点取确定多列的第二点以删除表列<退出>:"), //多行删除 _T("\n请点取用于交换的第一列或 [单列属性(S)/多列属性(M)/插入列(A)/加末列(T)/删除列(E)]<退出>:"), //单行属性 _T("\n请点取用于交换的第二列:"), }; const TCHAR *szKeywords1[]={ _T("M A T E X"), _T("S A T E X"), _T(""), _T("S M T E X"), _T("S M A E X"), _T("S M A T X"), _T(""), _T("S M A T E"), _T(""), }; const TCHAR *szKeywords2[]= { _T("MATEX"), _T("SATEX"), _T(""), _T("SMTEX"), _T("SMAEX"), _T("SMATX"), _T(""), _T("SMATE"), _T(""), }; int nOper=0; TSheetEdJig jig; while(nOper>=0) { jig.SetPrompt(szPrompts[nOper]); jig.SetKeyword(szKeywords1[nOper]); switch(nOper) { case 0: //单列属性 case 3: { //插入列 jig.SetOperCode(TSheetEdJig::kSingleCol); const TCHAR *szKeyword=szKeywords2[nOper]; int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode==RTNORM) { if(nOper==0) jig.EditColProp(); else jig.InsertCols(); } else if(nCode==RTKWORD) { nOper=Keyword2ColOper(szKeyword[nKeyIndex]); } else { nOper=-1; } } break; case 1: //多列属性第一点 case 5: { //多列删除第一点 XPoint ptFrom; int nCode; INITGET_BEG(0, szKeywords1[nOper]); nCode=ads_getpoint(NULL, szPrompts[nOper], ptFrom); INITGET_END(); if(nCode==RTNORM) { ptFrom=Ucs2Wcs(ptFrom); AcDbObjectId id=GetHitSheet(ptFrom); if(!id) { adsout << _T("\n请正确点取!"); } else { jig.SetSheetId(id); jig.SetPoint1(ptFrom); nOper++; } } else if(nCode==RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword)==RTNORM); nOper=Keyword2ColOper(sKeyword[0]); } else { nOper=-1; } } break; case 2: //多行属性第二点 case 6: { //多行删除第二点 jig.SetOperCode(TSheetEdJig::kMultCol); int nCode=jig.DoIt(); if(nCode==RTNORM) { if(nOper==2) jig.EditColProps(); else jig.RemoveCols(); nOper--; } else { nOper=-1; } } break; case 4: {//末尾加列 Entity ent; int nCode; INITGET_BEG(0, szKeywords1[nOper]); nCode=ent.FilterSelect(szPrompts[nOper], RBList(RTDXF0, _T("ATS_SHEET"), NULL)); INITGET_END(); if(nCode==RTNORM) { int nColNum=1; ads_initget(RSG_NONEG|RSG_NOZERO, NULL); adsout << _T("\n输入要添加的空列的数目<") << nColNum << _T(">:"); if(ads_getint(_T(""), &nColNum)!=RTCAN) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { int nColCount=pSheet->GetColumnNum(); for(int i=0; iAddColumnAt(nColCount); } OPENOBJ_END(); } } else if(nCode==RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword)==RTNORM); nOper=Keyword2ColOper(sKeyword[0]); } else { nOper=-1; } } break; case 7: { //列交换 jig.SetOperCode(TSheetEdJig::kSingleCol); const TCHAR *szKeyword=szKeywords2[nOper]; int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode==RTNORM) { int nColSrc; AcDbObjectId id=jig.GetHitColumn(nColSrc); if(!!id) { jig.SetPrompt(szPrompts[nOper+1]); jig.SetKeyword(szKeywords2[nOper+1]); nCode=jig.DoIt(); if(nCode==RTNORM) { int nColDest; AcDbObjectId idDest=jig.GetHitColumn(nColDest); if(id==idDest && nColSrc!=nColDest) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { pSheet->SwapColumn(nColSrc, nColDest); } OPENOBJ_END(); } } else if(nCode==RTCAN) { nOper=-1; } } } else if(nCode==RTKWORD) { nOper=Keyword2ColOper(szKeyword[nKeyIndex]); } else { nOper=-1; } } break; default: break; } } } int Keyword2RowOper(TCHAR c) { const TCHAR *szKey = _T("SMMATEECCXX"); // Zyu modify on 100726,去掉编译警告 //int nLen=_tcslen(szKey); size_t nLen=_tcslen(szKey); int nRet=-1; for(int i=0; i osmode(_T("OSMODE"), 0); const TCHAR *szPrompts[]={ _T("\n请点取一表行以编辑属性或 [多行属性(M)/增加行(A)/末尾加行(T)/删除行(E)/复制行(C)/交换行(X)]<退出>:"), //单行属性 _T("\n请点取确定多行的第一点以编辑属性或 [单行属性(S)/增加行(A)/末尾加行(T)/删除行(E)/复制行(C)/交换行(X)]<退出>:"), //多行属性 _T("\n请点取确定多行的第二点以编辑属性<退出>:"), //多行属性编辑 _T("\n请点取一表行以插入新行或 [单行属性(S)/多行属性(M)/末尾加行(T)/删除行(E)/复制行(C)/交换行(X)]<退出>:"), //增加行 _T("\n请点取表格以末尾加行或 [单行属性(S)/多行属性(M)/增加行(A)/删除行(E)/复制行(C)/交换行(X)]<退出>:"), //末尾加行 _T("\n请点取取确定多行的第一点以删除表行或 [单行属性(S)/多行属性(M)/增加行(A)/末尾加行(T)/复制行(C)/交换行(X)]<退出>:"), //删除行 _T("\n请点取确定多行的第二点以删除表行<退出>:"), //多行删除 _T("\n请点取参考表行以复制表行或 [单行属性(S)/多行属性(M)/增加行(A)/末尾加行(T)/删除行(E)/交换行(X)]<退出>:"), //复制行 _T("\n请点取待复制表行:"), _T("\n请点取用以交换的第一行或 [单行属性(S)/多行属性(M)/增加行(A)/末尾加行(T)/删除行(E)/复制行(C)]<退出>:"), //交换行 _T("\n请点取用于交换的第二行:"), }; const TCHAR *szKeywords1[]={ _T("M A T E C X"), _T("S A T E C X"), _T(""), _T("S M T E C X"), _T("S M A E C X"), _T("S M A T C X"), _T(""), _T("S M A T E X"), _T(""), _T("S M A T E C"), _T(""), }; const TCHAR *szKeywords2[]= { _T("MATECX"), _T("SATECX"), _T(""), _T("SMTECX"), _T("SMAECX"), _T("SMATCX"), _T(""), _T("SMATEX"), _T(""), _T("SMATEC"), _T(""), }; int nOper=0; TSheetEdJig jig; while(nOper>=0) { jig.SetPrompt(szPrompts[nOper]); jig.SetKeyword(szKeywords1[nOper]); switch(nOper) { case 0: //单行属性 case 3: { //插入行 jig.SetOperCode(TSheetEdJig::kSingleRow); const TCHAR *szKeyword=szKeywords2[nOper]; int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode==RTNORM) { if(nOper==0) jig.EditRowProp(); else jig.InsertRows(); } else if(nCode==RTKWORD) { nOper=Keyword2RowOper(szKeyword[nKeyIndex]); } else { nOper=-1; } } break; case 1: //多行属性第一点 case 5: { //多行删除第一点 XPoint ptFrom; int nCode; INITGET_BEG(0, szKeywords1[nOper]); nCode=ads_getpoint(NULL, szPrompts[nOper], ptFrom); INITGET_END(); if(nCode==RTNORM) { ptFrom=Ucs2Wcs(ptFrom); AcDbObjectId id=GetHitSheet(ptFrom); if(!id) { adsout << _T("\n请正确点取!"); } else { jig.SetSheetId(id); jig.SetPoint1(ptFrom); nOper++; } } else if(nCode==RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword)==RTNORM); nOper=Keyword2RowOper(sKeyword[0]); } else { nOper=-1; } } break; case 2: //多行属性第二点 case 6: { //多行删除第二点 jig.SetOperCode(TSheetEdJig::kMultRow); int nCode=jig.DoIt(); if(nCode==RTNORM) { if(nOper==2) jig.EditRowProps(); else jig.RemoveRows(); nOper--; } else { nOper=-1; } } break; case 4: {//末尾加行 Entity ent; int nCode; INITGET_BEG(0, szKeywords1[nOper]); nCode=ent.FilterSelect(szPrompts[nOper], RBList(RTDXF0, _T("ATS_SHEET"), NULL)); INITGET_END(); if(nCode==RTNORM) { int nRowNum=1; ads_initget(RSG_NONEG|RSG_NOZERO, NULL); adsout << _T("\n输入要添加的空行数目<") << nRowNum << _T(">:"); if(ads_getint(_T(""), &nRowNum)!=RTCAN) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { int nRowCount=pSheet->GetRowNum(); for(int i=0; iAddRowAt(nRowCount); } OPENOBJ_END(); } } else if(nCode==RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword)==RTNORM); nOper=Keyword2RowOper(sKeyword[0]); } else { nOper=-1; } } break; case 7: case 9: { //行复制或交换 jig.SetOperCode(TSheetEdJig::kSingleRow); const TCHAR *szKeyword=szKeywords2[nOper]; int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode==RTNORM) { int nRowSrc; AcDbObjectId id=jig.GetHitRow(nRowSrc); if(!!id) { jig.SetPrompt(szPrompts[nOper+1]); jig.SetKeyword(szKeywords2[nOper+1]); nCode=jig.DoIt(); if(nCode==RTNORM) { int nRowDest; AcDbObjectId idDest=jig.GetHitRow(nRowDest); if(id==idDest && nRowSrc!=nRowDest) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { if(nOper==7) pSheet->CopyRow(nRowSrc, nRowDest); else pSheet->SwapRow(nRowSrc, nRowDest); } OPENOBJ_END(); } } else if(nCode==RTCAN) { nOper=-1; } } } else if(nCode==RTKWORD) { nOper=Keyword2RowOper(szKeyword[nKeyIndex]); } else { nOper=-1; } } break; default: break; } } } extern int EditSheetProp(AcDbObjectId id); // 对象编辑 int EditSheet(AcDbObjectId id) { XPushVar osmode(_T("OSMODE"), 0); return EditSheetProp(id); } // 沈睿ADD //////////////////////////////////////////////////////////////////////////////////// // 删除表行 //////////////////////////////////////////////////////////////////////////////////// void SheetDelRow() { XPushVar vOsMode(_T("OSMODE"), 0); ads_prompt(_T("\n本命令也可以通过[表行编辑]实现!")); TSheetEdJig jig; jig.SetOperCode(TSheetEdJig::kSingleRow); while(1){ jig.SetPrompt(_T("\n请点取要删除的表行<退出>")); int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode != RTNORM) return; int nRow; AcDbObjectId id = jig.GetHitRow(nRow); if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { pSheet->RemoveRow(nRow); } OPENOBJ_END(); } } } //////////////////////////////////////////////////////////////////////////////////// // 增加表行 //////////////////////////////////////////////////////////////////////////////////// void SheetInsertRow() { XPushVar vOsMode(_T("OSMODE"), 0); ads_prompt(_T("\n本命令也可以通过[表行编辑]实现!")); TSheetEdJig jig; jig.SetOperCode(TSheetEdJig::kSingleRow); jig.SetKeyword(_T("A S")); BOOL bBefor = TRUE; BOOL bCopy = FALSE; while(1){ if(bBefor) jig.SetPrompt(_T("\n请点取一表行以(在本行之前)插入新行或 [在本行之后插入(A)/复制当前行(S)]<退出>:")); else jig.SetPrompt(_T("\n请点取一表行以(在本行之后)插入新行或 [在本行之前插入(A)/复制当前行(S)]<退出>:")); int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode == RTKWORD){ if(nKeyIndex == 0) { bBefor = !bBefor; continue; } else bCopy = TRUE; } else if(nCode != RTNORM) return; int nRow; AcDbObjectId id = jig.GetHitRow(nRow); if(!!id) { OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { if(!bBefor){ nRow ++; } pSheet->AddRowAt(nRow); if(bCopy) pSheet->CopyRow(nRow+1, nRow); } OPENOBJ_END(); } } } //////////////////////////////////////////////////////////////////////////////////// // 撤销合并 //////////////////////////////////////////////////////////////////////////////////// void SheetDelMerge() { ads_prompt(_T("\n本命令也可以通过[单元编辑]实现!")); XPoint ptSize, ptStart, ptEnd, ptPick; XPushVar vOsMode(_T("OSMODE"), 0); AcDbObjectId idSheet = NULL; if(ads_getpoint(NULL, _T("\n点取已经合并的单元格<退出>: "), ptPick) != RTNORM) return; idSheet=GetHitSheet(ptPick); if(!idSheet) return; OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet) { int nRow, nCol; const TGridCell *pCell=pSheet->HitTestOnCell(ptPick, &nRow, &nCol); if(!pCell) return; if(!pCell->GetRange()) { adsout << _T("\n该单元格不是合并单元格, 无法撤销合并!"); } else { pSheet->ExplodeCell(nRow, nCol); } } OPENOBJ_END(); } //////////////////////////////////////////////////////////////////////////////////// // 表格填写 //////////////////////////////////////////////////////////////////////////////////// #if ADS > 22 static bool TgSheetHook(MSG* msg) #else static BOOL TgSheetHook(MSG* msg) #endif { BOOL bRet=FALSE; switch(msg->message) { case WM_KEYDOWN: { if(msg->wParam == VK_RETURN){ g_nTgKey = VK_RETURN; acedPostCommand(_T(" ")); bRet = TRUE; } else if(msg->wParam == VK_ESCAPE){ g_nTgKey = VK_ESCAPE; acedPostCommand(_T(" ")); bRet = TRUE; } else if(msg->wParam == VK_RIGHT){ g_nTgKey = VK_RIGHT; acedPostCommand(_T(" ")); bRet = TRUE; } else if(msg->wParam == VK_LEFT){ g_nTgKey = VK_LEFT; acedPostCommand(_T(" ")); bRet = TRUE; } else if(msg->wParam == VK_UP){ g_nTgKey = VK_UP; acedPostCommand(_T(" ")); bRet = TRUE; } else if(msg->wParam == VK_DOWN){ g_nTgKey = VK_DOWN; acedPostCommand(_T(" ")); bRet = TRUE; } break; } case WM_MOUSEWHEEL:{ bRet = TRUE; break; } case WM_MBUTTONDOWN:{ bRet = TRUE; break; } case WM_RBUTTONUP:{ g_nTgKey = VK_RBUTTON; acedPostCommand(_T(" ")); bRet = TRUE; } default: break; } return bRet; } void InitTgSheetHook(BOOL bTrue) { static BOOL bTgMsgHook=FALSE; if(bTrue) { if(!bTgMsgHook) bTgMsgHook=acedRegisterFilterWinMsg(TgSheetHook); } else { if(bTgMsgHook) { acedRemoveFilterWinMsg(TgSheetHook); bTgMsgHook=FALSE; g_nTgKey = 0; } } } void InputSheetCell() { CEdit *pEdit = new CEdit(); XPoint ptPick; AcDbObjectId idSheet = NULL; XPushVar vOsMode(_T("OSMODE"), 0); if(ads_getpoint(NULL, _T("\n点取编辑单元格<退出>: "), ptPick) != RTNORM) return; InitTgSheetHook(TRUE); idSheet = GetHitSheet(ptPick); if(!idSheet) return; TDbSheet *pSheet = NULL; acdbOpenObject(pSheet, idSheet, AcDb::kForRead); if(!pSheet) return; XPoint ptSize, ptStart, ptEnd; int nRow, nCol, nRowAll, nColAll; CString csText; nRowAll = pSheet->GetRowNum(); nColAll = pSheet->GetColumnNum(); const TGridCell *pCell = pSheet->HitTestOnCell(ptPick, &nRow, &nCol); if(pCell==NULL) return; csText = pCell->GetText(); ptSize = pSheet->GetCellSize(nRow, nCol); ptStart = pSheet->GetCellPoint(nRow, nCol); ptEnd.x = ptStart.x + ptSize.x*DocGetPScale(); ptEnd.y = ptStart.y - ptSize.y*DocGetPScale(); CPoint ptDwgView1, ptDwgView2; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptStart, ptDwgView1); acedCoordFromWorldToPixel(cvport, ptEnd, ptDwgView2); CTemporaryResourceOverride vTmp; pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN, CRect(ptDwgView1.x, ptDwgView1.y,ptDwgView2.x,ptDwgView2.y), acedGetAcadDwgView(), IDC_USER_SHEET_EDIT); pEdit->SetWindowText(csText); int lenText = csText.GetLength(); pEdit->SetSel(0, lenText); pEdit->SetFocus(); int nKey, ret; ads_prompt(_T("\n请在编辑框内输入文字<可利用上、下、左、右控制表格移位;ESC键退出;回车键完成>")); while(1){ ret = ads_getint(_T(""), &nKey); if(ret == RTNONE && g_nTgKey != 0) { if(g_nTgKey == VK_ESCAPE) break; CString csTmp; pEdit->GetWindowText(csTmp); TGridCell *pCell=(*pSheet)(nRow, nCol); if(csTmp != csText){ if(pSheet->upgradeOpen()==Acad::eOk) { pSheet->assertWriteEnabled(); pCell->SetText(csTmp); pSheet->downgradeOpen(); } else break; } if(g_nTgKey == VK_RETURN || g_nTgKey == VK_RBUTTON) break; else if(g_nTgKey == VK_RIGHT){ nCol++; if(nCol == nColAll){ nRow++; if(nRow == nRowAll) break; nCol = 0; } } else if(g_nTgKey == VK_LEFT){ nCol--; if(nCol == -1){ nRow--; if(nRow == -1) break; nCol = nColAll-1; } } else if(g_nTgKey == VK_UP){ nRow--; if(nRow == -1){ break; } } else if(g_nTgKey == VK_DOWN){ nRow++; if(nRow == nRowAll){ break; } } if(pEdit) pEdit->DestroyWindow(); TGridCell *pCellNew = (*pSheet)(nRow, nCol); csText = pCellNew->GetText(); ptSize = pSheet->GetCellSize(nRow, nCol); ptStart = pSheet->GetCellPoint(nRow, nCol); ptEnd.x = ptStart.x + ptSize.x*DocGetPScale(); ptEnd.y = ptStart.y - ptSize.y*DocGetPScale(); CPoint ptDwgView1, ptDwgView2; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptStart, ptDwgView1); acedCoordFromWorldToPixel(cvport, ptEnd, ptDwgView2); pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN, CRect(ptDwgView1.x, ptDwgView1.y,ptDwgView2.x,ptDwgView2.y), acedGetAcadDwgView(), IDC_USER_SHEET_EDIT); pEdit->SetWindowText(csText); int lenText = csText.GetLength(); pEdit->SetSel(0, lenText); pEdit->SetFocus(); } else if(ret == RTCAN) break; } pSheet->close(); InitTgSheetHook(FALSE); if(pEdit) pEdit->DestroyWindow(); delete pEdit; } //////////////////////////////////////////////////////////////////////////////////// // 单元复制 //////////////////////////////////////////////////////////////////////////////////// BOOL GetBlkAttrib(Entity entTemp, TCellBlockInsert &blk) { AcDbBlockReference *pBlockRef = NULL;// 定义块表指针 AcDbObjectId eId; acdbGetObjectId(eId, entTemp); acdbOpenObject(pBlockRef, eId, AcDb::kForRead); if(!pBlockRef) return FALSE; AcDbObjectIterator *pIterator; pIterator = pBlockRef->attributeIterator(); AcDbEntity *pEnt; AcDbAttribute *pAtt; for (pIterator->start(); !pIterator->done(); pIterator->step()) { //遍历块中实体 AcDbObjectId att_id; att_id = pIterator->objectId(); acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForRead); pAtt = AcDbAttribute::cast(pEnt); if(pAtt != NULL) { TCHAR *cname = pAtt->tag();//得到标记 CString csRet, csTag; csTag.Format(_T("%s"), cname); if(pAtt->isInvisible() == Adesk::kFalse){ TCHAR *cval = pAtt->textString();//得到值 csRet.Format(_T("%s"), cval); delete[] cval; TAttribValue *pAttrib = new TAttribValue(); pAttrib->m_sName = csTag; pAttrib->m_sValue = csRet; blk.m_lstAttribs.Append(pAttrib); } delete[] cname; } pEnt->close(); } delete pIterator; pBlockRef->close(); return TRUE; } void CopyCellContent() { RBList rbMask = ads_buildlist( -4, _T(""), NULL); BOOL bIsCopy = FALSE; BOOL bIsBlk = FALSE; Entity entText; TSheetEdJig jig; CString csCopyText; TGridStyle oldStyle; int nOldRow, nOldCol; AcDbObjectId idOld = NULL; XPushVar vOsMode(_T("OSMODE"), 0); int nKeyIndex=0; //modify by xlc on 081031 移出插入图块功能 //jig.SetKeyword(_T("A B")); //jig.SetPrompt(_T("\n点取拷贝源单元格或 [选取文字(A)/选取图块(B)]<退出>:")); jig.SetKeyword(_T("A")); jig.SetPrompt(_T("\n点取拷贝源单元格或 [选取文字(A)]<退出>:")); while(1) { jig.SetOperCode(TSheetEdJig::kSingleCell); int nCode=jig.DoIt(&nKeyIndex); if(nCode == RTNORM) { AcDbObjectId idSheet = GetHitSheet(jig.m_ptResult); if(!!idSheet) { SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); pSheet->assertWriteEnabled(); int nRow, nCol; pSheet->HitTestOnCell(jig.m_ptResult, &nRow, &nCol); TGridCell *pCell=(*pSheet)(nRow, nCol); if(bIsCopy && !bCtrl){ //jig.SetPrompt(_T("\n点取粘贴至单元格(按CTRL键重新选择复制源)或 [选取文字(A)/选取图块(B)]<退出>: ")); jig.SetPrompt(_T("\n点取粘贴至单元格(按CTRL键重新选择复制源)或 [选取文字(A)]<退出>: ")); if(!bIsBlk) pCell->SetText(csCopyText); else{ TCellBlockInsert blk; blk.m_sBlockName = csCopyText; blk.m_nControlFlag = CBF_AUTOSIZE | CBF_UNISCALE | CBF_SHOW_ATTR | CBF_EQUAL_SIDE; GetBlkAttrib(entText, blk); XString xsBlk; blk.OutputDesc(xsBlk); pCell->SetText(xsBlk); } } else { if(bCtrl && !!idOld) { OPENOBJ_BEGIN(idOld, AcDb::kForWrite, TDbSheet, pSheet2); if(pSheet2){ pSheet2->assertWriteEnabled(); TGridCell *pCell=(*pSheet2)(nOldRow, nOldCol); pCell->SetGridStyle(oldStyle); } OPENOBJ_END(); if(idOld == idSheet){ pSheet->assertWriteEnabled(); TGridCell *pCell=(*pSheet)(nOldRow, nOldCol); pCell->SetGridStyle(oldStyle); } } //jig.SetPrompt(_T("\n点取粘贴至单元格(按CTRL键重新选择复制源)[选取文字(A)/选取图块(B)]<退出>: ")); jig.SetPrompt(_T("\n点取粘贴至单元格(按CTRL键重新选择复制源)[选取文字(A)]<退出>: ")); idOld = idSheet; oldStyle = pCell->GetGridStyle(); TGridStyle newStyle = oldStyle; nOldRow = nRow; nOldCol = nCol; newStyle.SetFlagBit(OF_TEXTCOLOR, TRUE); newStyle.SetTextColor(1); pCell->SetGridStyle(newStyle); csCopyText = pCell->GetText(); bIsCopy = TRUE; bIsBlk = FALSE; } OPENOBJ_END(); } } else if(nCode == RTKWORD && nKeyIndex == 0){ if(SelectEntity(_T("\n请选择拷贝源文字<退出>:"), entText, rbMask) != RTNORM) continue; TCHAR szText[256]; entText.GetData(1, szText); csCopyText = szText; bIsCopy = TRUE; bIsBlk = FALSE; // [2010-3-23 wubo] CASE: C010-01 键入A并正确选择了文字后,应提示以下内容 jig.SetPrompt(_T("\n点取粘贴至单元格(按CTRL键重新选择复制源)或 [选取文字(A)]<退出>: ")); } // else if(nCode == RTKWORD && nKeyIndex == 1){ // RBList rbMask2(RTDXF0, _T("INSERT"), 8, _T("*"), NULL); // if(SelectEntity(_T("\n请选择拷贝源图块<退出>:"), entText, rbMask2) != RTNORM) // continue; // TCHAR szText[256]; // entText.GetData(2, szText); // csCopyText = szText; // bIsCopy = TRUE; // bIsBlk = TRUE; // } else { if(!!idOld) { OPENOBJ_BEGIN(idOld, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet){ pSheet->assertWriteEnabled(); TGridCell *pCell=(*pSheet)(nOldRow, nOldCol); pCell->SetGridStyle(oldStyle); } OPENOBJ_END(); } break; } } } //add by xlc on 081022 // 单元格中插入图块 void CopyCellContentBlock() { Entity entText; CWnd *pWnd=acedGetAcadFrame(); CCellBlockDlg dlg(pWnd); { CTemporaryResourceOverride vTemp; dlg.Create(dlg.IDD, pWnd); } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); TSheetEdJig jig; CString csCopyText; TGridStyle oldStyle; XPushVar vOsMode(_T("OSMODE"), 0); int nKeyIndex=0; jig.SetKeyword(_T("B")); jig.SetPrompt(_T("\n点取插入单元格或 [选取图块(B)]<退出>:")); while(1) { jig.SetOperCode(TSheetEdJig::kSingleCell); int nCode=jig.DoIt(&nKeyIndex); if(nCode == RTNORM) { AcDbObjectId idSheet = GetHitSheet(jig.m_ptResult); if(!!idSheet) { OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); pSheet->assertWriteEnabled(); int nRow, nCol; pSheet->HitTestOnCell(jig.m_ptResult, &nRow, &nCol); TGridCell *pCell=(*pSheet)(nRow, nCol); jig.SetPrompt(_T("\n点取插入单元格或 [选取图块(B)]<退出>: ")); TCellBlockInsert blk; blk.m_sBlockName = dlg.m_strBlockName; blk.m_nControlFlag = dlg.m_nFlag; if(dlg.m_bLibBlk) //图库获得图块 { AcDbObjectId objId=dlg.m_idOldBlock; ads_name ent; Acad::ErrorStatus es=acdbGetAdsName(ent,objId); if(es==Acad::eOk) entText=ent; else continue; blk.m_sBlockName = dlg.m_strBlockName; } GetBlkAttrib(entText, blk); XString xsBlk; blk.OutputDesc(xsBlk); pCell->SetText(xsBlk); OPENOBJ_END(); } } else if(nCode == RTKWORD) { dlg.HideDialog(TRUE); RBList rbMask2(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), 8, _T("*"), NULL); if(SelectEntity(_T("\n请选择插入图块<退出>:"), entText, rbMask2) != RTNORM) { dlg.HideDialog(FALSE); continue; } TCHAR szText[256]; entText.GetData(2, szText); dlg.m_strBlockName = szText; dlg.m_idOldBlock=GetBlockIdFromString(szText); dlg.CloneBlockToPreview(); dlg.UpdatePreview(); dlg.HideDialog(FALSE); dlg.m_bLibBlk=FALSE; } else break; } if(::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } //////////////////////////////////////////////////////////////////////////////////// // 单元递增 //////////////////////////////////////////////////////////////////////////////////// // 返回: FALSE-空串 // numWidth: 0-无数字;1-数字宽度不固定,否则固定宽度 BOOL StringAnalysis(const TCHAR *src, XString &sPrefix, int *num, int *numWidth) { ASSERT(src && num && numWidth); // Zyu modify on 100726,去掉编译警告 //int nLen=_tcslen(src); int nLen = (int)_tcslen(src); if(!nLen) return FALSE; int iNumPos=nLen; for(int iPos=nLen-1; iPos>=0; iPos--) { if(!isdigit(src[iPos])) break; else iNumPos=iPos; } if(iNumPos==nLen) { *numWidth=0; //No digit } else { if(iNumPos>0) { XString sTemp; sTemp=src; StrCpy(sTemp, src, src+iNumPos); sPrefix=sTemp; } else { sPrefix=_T(""); } if(iNumPos==nLen-1) { *numWidth=-1; } else { if(src[iNumPos]==_T('0')) { // Zyu modify on 100726,去掉编译警告 //*numWidth=nLen-_tcslen(sPrefix); *numWidth = nLen - (int)_tcslen(sPrefix); } else { *numWidth=-1; } } *num=_ttoi(src+iNumPos); } return TRUE; } // modify by xly on 101028 更具递增文字的需求,修改本函数,支持中文数字的递增变化 // 函数使用说明:该函数可以支持数字(1...),字母(a...A...),中文数字(一...),大写中文数字(零...),特殊字(Ⅰ...) // 默认情况下中文数字(一...),大写中文数字(零...),特殊字三种情况不支持,但已经有实现过程,只需为csRightTmp2附值就可以。 // bHasChineseNum = true时支持中文数字,默认 bHasChineseNum = false不支持 //CString PlusString(const TCHAR* szRes, int step, BOOL bIsPlus) CString PlusString(const TCHAR* szRes, int step, BOOL bIsPlus, bool bHasChineseNum) { XString xsText; int num, numWith; StringAnalysis(szRes, xsText, &num, &numWith); CString csRes = szRes; CString csRet = csRes; if(numWith != 0){ if(bIsPlus) num += step; else if(num > 0) num -= step; if(num < 0) num = 0; if(numWith == -1) csRet.Format(_T("%s%d"), xsText, num); else{ //需要补0 XString sText; sText << xsText; TCHAR szNext[256]=_T(""); _itot(num, szNext, 10); if(numWith > 0) { // Zyu modify on 100726,去掉编译警告 //int iZeroNum = numWith - _tcslen(szNext); int iZeroNum = numWith - (int)_tcslen(szNext); for(int kk=0; kk vOsMode(_T("OSMODE"), 0); AcDbObjectId idSheet = NULL; if(ads_getpoint(NULL, _T("\n点取第一个单元格<退出>: "), ptPick) != RTNORM) return; idSheet=GetHitSheet(ptPick); if(!idSheet) return; TDbSheet *pSheet = NULL; acdbOpenObject(pSheet, idSheet, AcDb::kForRead); if(!pSheet) return; TSheetEdJig jig; jig.SetPrompt(_T("\n点取最后一个单元格<退出>: ")); jig.SetSheetId(idSheet); jig.SetOperCode(TSheetEdJig::kMultCell); jig.SetPoint1(ptPick); jig.SetNeedPlus(TRUE); if(jig.DoIt()==RTNORM) { jig.GetHitCells(pSheet, nRowFrom, nColFrom, nRowTo, nColTo); } else{ pSheet->close(); return; } int len = abs(nRowTo - nRowFrom) + 1; if(len > 1){ int nRow = nRowFrom; int nCol = nColFrom; const TGridCell *pCell = pSheet->HitTestOnCell(ptPick, &nRow, &nCol); //modify by xlc on 090602 单元递增崩溃问题 if(pCell==NULL) { pSheet->close(); return; } CString csText = pCell->GetText(); if(csText == _T("")){ pSheet->close(); return; } if(nRow == nRowFrom && nCol == nColFrom){ for(int i=1;iGetCellSize(nRowFrom+i, nColFrom); ptStart = pSheet->GetCellPoint(nRowFrom+i, nColFrom); if(pSheet->upgradeOpen()==Acad::eOk) { TGridCell *pCell=(*pSheet)(nRowFrom+i, nColFrom); pSheet->assertWriteEnabled(); SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; if(!bShift){ SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(bCtrl) csText = PlusString(csText, 1, FALSE); else csText = PlusString(csText, 1, TRUE); } pCell->SetText(csText); pSheet->downgradeOpen(); } } } else{ for(int i=1;iGetCellSize(nRowTo-i, nColTo); ptStart = pSheet->GetCellPoint(nRowTo-i, nColTo); if(pSheet->upgradeOpen()==Acad::eOk) { TGridCell *pCell=(*pSheet)(nRowTo-i, nColTo); pSheet->assertWriteEnabled(); SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; if(!bShift){ SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(bCtrl) csText = PlusString(csText, 1, FALSE); else csText = PlusString(csText, 1, TRUE); } pCell->SetText(csText); pSheet->downgradeOpen(); } } } } else { //行递增 int len = abs(nColTo - nColFrom) + 1; int nRow = nRowFrom; int nCol = nColFrom; const TGridCell *pCell = pSheet->HitTestOnCell(ptPick, &nRow, &nCol); //modify by xlc on 090602 单元递增崩溃问题 if(pCell==NULL) { pSheet->close(); return; } CString csText = pCell->GetText(); if(csText == _T("")){ pSheet->close(); return; } if(nRow == nRowFrom && nCol == nColFrom){ for(int i=1;iGetCellSize(nRowFrom, nColFrom+i); ptStart = pSheet->GetCellPoint(nRowFrom, nColFrom+i); if(pSheet->upgradeOpen()==Acad::eOk) { TGridCell *pCell=(*pSheet)(nRowFrom, nColFrom+i); pSheet->assertWriteEnabled(); SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; if(!bShift){ SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(bCtrl) csText = PlusString(csText, 1, FALSE); else csText = PlusString(csText, 1, TRUE); } pCell->SetText(csText); pSheet->downgradeOpen(); } } } else{ for(int i=1;iGetCellSize(nRowTo, nColTo-i); ptStart = pSheet->GetCellPoint(nRowTo, nColTo-i); if(pSheet->upgradeOpen()==Acad::eOk) { TGridCell *pCell=(*pSheet)(nRowTo, nColTo-i); pSheet->assertWriteEnabled(); SHORT nStateShift = GetKeyState(VK_SHIFT); BOOL bShift = (nStateShift&256)!=0; if(!bShift){ SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(bCtrl) csText = PlusString(csText, 1, FALSE); else csText = PlusString(csText, 1, TRUE); } pCell->SetText(csText); pSheet->downgradeOpen(); } } } } pSheet->close(); } // Add by lcf 2004/09/02 ////////////////////////////////////////////////////////////////////////////////// // 拆分 ////////////////////////////////////////////////////////////////////////////////// //extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal); // add by xly on 101217 设置表格对象的图层 void SetLayerTable(Entity ent, const TCHAR *pszLayer) { // modify by xly on 101217 拆分表格时生成的表格放置在与原表格同一图层 OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet == NULL) return; pSheet->setLayer(pszLayer); OPENOBJ_END(); } // CSplitSheet 对话框 class CSplitSheet : public CAcUiDialog { DECLARE_DYNAMIC(CSplitSheet) public: CSplitSheet(CWnd* pParent = NULL); // 标准构造函数 virtual ~CSplitSheet(); // 对话框数据 enum { IDD = IDD_SPLITUNITE }; static int m_iRadio; static int m_iHead; static int m_iAppoint; static BOOL m_bTitle; static BOOL m_bPick; CSpinButtonCtrl m_spinHead; CSpinButtonCtrl m_spinAppoint; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); virtual void OnOK(); afx_msg void OnBnClickedRadio(); afx_msg void OnBnClickedCheckPick(); void UpdateSplitMode(); void UpdateVisible(); void PickSplitRow(); void PickSplitCol(); void AppointSplitRow(); void AppointSplitCol(); DECLARE_MESSAGE_MAP() }; // CSplitSheet 对话框 IMPLEMENT_DYNAMIC(CSplitSheet, CAcUiDialog) int CSplitSheet::m_iRadio = 0; int CSplitSheet::m_iHead = 1; int CSplitSheet::m_iAppoint = 20; BOOL CSplitSheet::m_bTitle = FALSE; BOOL CSplitSheet::m_bPick = TRUE; CSplitSheet::CSplitSheet(CWnd* pParent /*=NULL*/) : CAcUiDialog(CSplitSheet::IDD, pParent) { } CSplitSheet::~CSplitSheet() { } void CSplitSheet::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO_ROW, m_iRadio); DDX_Check(pDX, IDC_CHECK_COPYTITLE, m_bTitle); DDX_Check(pDX, IDC_CHECK_PICK, m_bPick); DDX_Control(pDX, IDC_SPIN_HEAD, m_spinHead); DDX_Control(pDX, IDC_SPIN_APPOINT, m_spinAppoint); DDX_Text(pDX, IDC_EDIT_HEAD, m_iHead); DDV_MinMaxInt(pDX, m_iHead, 0, 100); DDX_Text(pDX, IDC_EDIT_APPOINT, m_iAppoint); DDV_MinMaxInt(pDX, m_iAppoint, 0, 100); } BEGIN_MESSAGE_MAP(CSplitSheet, CAcUiDialog) ON_BN_CLICKED(IDC_RADIO_ROW, OnBnClickedRadio) ON_BN_CLICKED(IDC_RADIO_COL, OnBnClickedRadio) ON_BN_CLICKED(IDC_CHECK_PICK, OnBnClickedCheckPick) END_MESSAGE_MAP() // CSplitSheet 消息处理程序 BOOL CSplitSheet::OnInitDialog() { CAcUiDialog::OnInitDialog(); m_spinHead.SetBuddy(GetDlgItem(IDC_EDIT_HEAD)); m_spinHead.SetRange(0, 100); m_spinAppoint.SetBuddy(GetDlgItem(IDC_EDIT_APPOINT)); m_spinAppoint.SetRange(0, 100); UpdateSplitMode(); UpdateVisible(); return TRUE; } void CSplitSheet::OnBnClickedRadio() { CDataExchange dx(this, true); DDX_Radio(&dx, IDC_RADIO_ROW, m_iRadio); UpdateVisible(); } void CSplitSheet::OnBnClickedCheckPick() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_PICK, m_bPick); UpdateSplitMode(); } void CSplitSheet::UpdateSplitMode() { GetDlgItem(IDC_STATIC_APPOINT)->EnableWindow(m_bPick); GetDlgItem(IDC_EDIT_APPOINT)->EnableWindow(m_bPick); GetDlgItem(IDC_SPIN_APPOINT)->EnableWindow(m_bPick); if(m_bPick) GetDlgItem(IDOK)->SetWindowText(_T("拆分")); else GetDlgItem(IDOK)->SetWindowText(_T("拆分<")); } void CSplitSheet::UpdateVisible() { CString szName; szName = (m_iRadio == 0) ? _T("指定行数:") : _T("指定列数:"); GetDlgItem(IDC_STATIC_APPOINT)->SetWindowText(szName); GetDlgItem(IDC_STATIC_HEAD)->EnableWindow(m_iRadio == 0); GetDlgItem(IDC_EDIT_HEAD)->EnableWindow(m_iRadio == 0); GetDlgItem(IDC_SPIN_HEAD)->EnableWindow(m_iRadio == 0); } void CSplitSheet::PickSplitRow() { TSheetEdJig jig; jig.SetPrompt(_T("\n请点取要拆分的起始行<退出>:")); jig.SetOperCode(TSheetEdJig::kSingleRow); int i; while(1) { if(jig.DoIt() != RTNORM) return; int nRow; AcDbObjectId id = jig.GetHitRow(nRow); if(!id) break; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet == NULL) continue; int iRowNum = pSheet->GetRowNum(); if(nRow == 0) { pSheet->close(); continue; } TDbSheet *pNewSheet1 = (TDbSheet*)pSheet->clone(); TDbSheet *pNewSheet2 = (TDbSheet*)pSheet->clone(); if(pNewSheet1 == NULL || pNewSheet2 == NULL) { pSheet->close(); continue; } for(i=nRow; iRemoveRow(nRow); } PickSet ss1(SS_FREE); ss1.IncludeBegin(); // modify by xly on 101217 设置表格所在的图层 //pNewSheet1->AddToMSpace(Adesk::kTrue); pNewSheet1->AddToMSpace(Adesk::kFalse); // 获得拆分后的原表格所在的图层 const TCHAR *pszLayer = pSheet->layer(); pNewSheet1->setLayer(pszLayer); pNewSheet1->close(); pNewSheet1 = NULL; ss1.IncludeEnd(); pSheet->setVisibility(AcDb::kInvisible); pSheet->downgradeOpen(); for(i=m_iHead; iRemoveRow(m_iHead); } if(!m_bTitle) { pNewSheet2->SetTitleHeight(0.0); pNewSheet2->SetTitleText(_T("")); } PickSet ss2(SS_FREE); ss2.IncludeBegin(); pNewSheet2->SetLocation(XPoint()); // modify by xly on 101217 设置表格所在的图层 //pNewSheet2->AddToMSpace(Adesk::kTrue); pNewSheet2->AddToMSpace(Adesk::kFalse); pNewSheet2->setLayer(pszLayer); pNewSheet2->close(); pNewSheet2 = NULL; ss2.IncludeEnd(); XPoint xp; int nRet = DragMovePickSet(ss2, _T("\n请点取插入位置<返回>: "), xp, xp); if(nRet == RTNORM) { if(pSheet->upgradeOpen()==Acad::eOk) pSheet->erase(); } else { if(pSheet->upgradeOpen()==Acad::eOk) pSheet->setVisibility(AcDb::kVisible); ss1.Delete(); ss2.Delete(); } OPENOBJ_END(); } } void CSplitSheet::PickSplitCol() { TSheetEdJig jig; jig.SetPrompt(_T("\n请点取要拆分的起始列<退出>:")); jig.SetOperCode(TSheetEdJig::kSingleCol); int i; while(1) { if(jig.DoIt() != RTNORM) return; int nCol; AcDbObjectId id = jig.GetHitColumn(nCol); if(!id) break; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet == NULL) continue; int iColNum = pSheet->GetColumnNum(); if(nCol == 0) { pSheet->close(); continue; } TDbSheet *pNewSheet1 = (TDbSheet*)pSheet->clone(); TDbSheet *pNewSheet2 = (TDbSheet*)pSheet->clone(); if(pNewSheet1 == NULL || pNewSheet2 == NULL) { pSheet->close(); continue; } for(i=nCol; iRemoveColumn(nCol); } PickSet ss1(SS_FREE); ss1.IncludeBegin(); // modify by xly on 101217 设置表格所在的图层 //pNewSheet1->AddToMSpace(Adesk::kTrue); pNewSheet1->AddToMSpace(Adesk::kFalse); // 获得拆分后的原表格所在的图层 const TCHAR *pszLayer = pSheet->layer(); pNewSheet1->setLayer(pszLayer); pNewSheet1->close(); pNewSheet1 = NULL; ss1.IncludeEnd(); pSheet->setVisibility(AcDb::kInvisible); pSheet->downgradeOpen(); for(i=0; iRemoveColumn(0); } if(!m_bTitle) { pNewSheet2->SetTitleHeight(0.0); pNewSheet2->SetTitleText(_T("")); } PickSet ss2(SS_FREE); ss2.IncludeBegin(); pNewSheet2->SetLocation(XPoint()); // modify by xly on 101217 设置表格所在的图层 //pNewSheet2->AddToMSpace(Adesk::kTrue); pNewSheet2->AddToMSpace(Adesk::kFalse); pNewSheet2->setLayer(pszLayer); pNewSheet2->close(); pNewSheet2 = NULL; ss2.IncludeEnd(); XPoint xp; int nRet = DragMovePickSet(ss2, _T("\n请点取插入位置<返回>: "), xp, xp); if(nRet == RTNORM) { if(pSheet->upgradeOpen()==Acad::eOk) pSheet->erase(); } else { if(pSheet->upgradeOpen()==Acad::eOk) pSheet->setVisibility(AcDb::kVisible); ss1.Delete(); ss2.Delete(); } OPENOBJ_END(); } } void CSplitSheet::AppointSplitRow() { Entity ent; if(SelectEntity(_T("\n选择表格:"), ent, RBList(RTDXF0, _T("ATS_SHEET"), NULL))!=RTNORM) return; int i; int iRowNum; int iStartRow = m_iAppoint + m_iHead; while(1) { if(!ent) return; TDbSheet *pNewSheet = NULL; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet == NULL) return; iRowNum = pSheet->GetRowNum(); if(iStartRow >= iRowNum) { pSheet->close(); return; } pNewSheet = (TDbSheet*)pSheet->clone(); for(i=iStartRow; iRemoveRow(iStartRow); OPENOBJ_END(); if(pNewSheet == NULL) continue; for(i=0; iRemoveRow(m_iHead); if(!m_bTitle) { pNewSheet->SetTitleHeight(0.0); pNewSheet->SetTitleText(_T("")); } XPoint ptFrom, ptTo; ptFrom = pNewSheet->GetTopLeft(TRUE); ptTo.x = ptFrom.x + DocGetPScale() * (pNewSheet->GetSheetWidth() + 10); ptTo.y = ptFrom.y; PickSet ss(SS_FREE); ss.IncludeBegin(); pNewSheet->SetLocation(ptFrom); // add by xly on 101217 获得拆分后的原表格所在的图层 const TCHAR *pszLayer = pNewSheet->layer(); AcDbObjectId eId = pNewSheet->AddToMSpace(Adesk::kTrue); pNewSheet = NULL; ss.IncludeEnd(); // modify by xly on 101217 拆分表格时生成的表格放置在与原表格同一图层 if (ss.Length()>0) { Entity entTemp = ss[0L]; SetLayerTable(entTemp, pszLayer); } // Zyu modify on 100726,支持64位 //SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (long*)ss, RTSTR, _T(""), // RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo, RTNONE); SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo, RTNONE); ads_name entName; if(acdbGetAdsName(entName, eId) != Acad::eOk) return; ent = entName; } } void CSplitSheet::AppointSplitCol() { Entity ent; if(SelectEntity(_T("\n选择表格:"), ent, RBList(RTDXF0, _T("ATS_SHEET"), NULL))!=RTNORM) return; int i; int iColNum; int iStartCol = m_iAppoint; while(1) { if(!ent) return; TDbSheet *pNewSheet = NULL; XPoint ptFrom, ptTo; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet == NULL) return; iColNum = pSheet->GetColumnNum(); if(iStartCol >= iColNum) { pSheet->close(); return; } pNewSheet = (TDbSheet*)pSheet->clone(); for(i=iStartCol; iRemoveColumn(iStartCol); ptFrom = pSheet->GetTopLeft(TRUE); ptTo.x = ptFrom.x; ptTo.y = ptFrom.y - DocGetPScale() * (pSheet->GetSheetHeight(TRUE) + 10); OPENOBJ_END(); if(pNewSheet == NULL) continue; for(i=0; iRemoveColumn(0); if(!m_bTitle) { pNewSheet->SetTitleHeight(0.0); pNewSheet->SetTitleText(_T("")); } PickSet ss(SS_FREE); ss.IncludeBegin(); pNewSheet->SetLocation(ptFrom); // add by xly on 101217 获得拆分后的原表格所在的图层 const TCHAR *pszLayer = pNewSheet->layer(); AcDbObjectId eId = pNewSheet->AddToMSpace(Adesk::kTrue); pNewSheet = NULL; ss.IncludeEnd(); // modify by xly on 101217 拆分表格时生成的表格放置在与原表格同一图层 if (ss.Length()>0) { Entity entTemp = ss[0L]; SetLayerTable(entTemp, pszLayer); } // Zyu modify on 100726,支持64位 //SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (long*)ss, RTSTR, _T(""), // RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo, RTNONE); SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo, RTNONE); ads_name entName; if(acdbGetAdsName(entName, eId) != Acad::eOk) return; ent = entName; } } void CSplitSheet::OnOK() { CAcUiDialog::OnOK(); XPushVar osmode(_T("OSMODE"), 0); if(!m_bPick) { if(m_iRadio == 0) PickSplitRow(); else PickSplitCol(); } else { if(m_iRadio == 0) AppointSplitRow(); else AppointSplitCol(); } } void SplitSheet() { CTemporaryResourceOverride vTemp; CSplitSheet dlg; dlg.DoModal(); } ////////////////////////////////////////////////////////////////////////////////// // 合并 ////////////////////////////////////////////////////////////////////////////////// void MergeSheet() { bool bFlag = true; Entity entFirst; while(1) { TCHAR szPrompt[64]; if(bFlag) _stprintf(szPrompt, _T("\n选择第一个表格或 [列合并(C)]<退出>:")); else _stprintf(szPrompt, _T("\n选择第一个表格或 [行合并(C)]<退出>:")); int nRet; INITGET_BEG(0, _T("C")); nRet = acedEntSel(szPrompt, entFirst, XPoint()); INITGET_END(); if(nRet == RTNORM) { OPENOBJ_BEGIN(entFirst, AcDb::kForRead, TDbSheet, pSheet); if(pSheet == NULL) { acutPrintf(_T("\n选择的实体不是表格实体,请重新选择!")); continue; } while(1) { Entity entNext; if(acedEntSel(_T("\n选择下一个表格<退出>:"), entNext, XPoint()) != RTNORM) break; OPENOBJ_BEGIN(entNext, AcDb::kForWrite, TDbSheet, pNextSheet); if(pNextSheet != NULL) { if(pSheet->upgradeOpen()==Acad::eOk) { pSheet->Merge(pNextSheet, bFlag); pSheet->downgradeOpen(); } pNextSheet->erase(); } else { acutPrintf(_T("\n选择的实体不是表格实体,请重新选择!")); continue; } OPENOBJ_END(); } OPENOBJ_END(); break; } else if(nRet == RTKWORD) { bFlag = !bFlag; continue; } else { return; } } } // 单元格的值取和 //////////////////////////////////////////////////////////////////////////////////// //add by FXJ 061225 void SumCellDigit() { XPushVar osmode(_T("OSMODE"), 0); XPoint pt1; int nRet=ads_getpoint(NULL, _T("\n点取第一个需累加的单元格: "), pt1); pt1 = Ucs2Wcs(pt1); AcDbObjectId idSheet=GetHitSheet(pt1); if(!idSheet) return; TSheetEdJig jig; //Select Cells jig.SetPrompt(_T("\n点取最后一个需累加的单元格: ")); jig.SetSheetId(idSheet); jig.SetOperCode(TSheetEdJig::kMultCell); jig.SetPoint1(pt1); double dTotal=0; CString sTotal; if(jig.DoIt()==RTNORM) { OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet!=NULL) { int nRowFrom, nColFrom, nRowTo, nColTo; if(jig.GetHitCells(pSheet, nRowFrom, nColFrom, nRowTo, nColTo)) { TGridCell *pCell; TGridStyle gRidStyle; for(int iRow=nRowFrom;iRow<=nRowTo;iRow++) { for(int iCol=nColFrom;iCol<=nColTo;iCol++) { pCell=(*pSheet)(iRow, iCol); //gRidStyle.SetTextColor(1); // pCell->SetGridStyle(gRidStyle); dTotal+=_tstof(pCell->GetText()); } } } } OPENOBJ_END(); } else return; sTotal.Format(_T("%lg"),dTotal); LPCTSTR lTotal=LPCTSTR(sTotal); adsout << _T("\n单元累加结果是:") << lTotal <<_T(""); //Select Destinate Cell jig.SetOperCode(TSheetEdJig::kSingleCell); jig.SetPrompt(_T("\n点取存放累加结果的单元格<退出>:" )); if(jig.DoIt()==RTNORM) { OPENOBJ_BEGIN(idSheet, AcDb::kForWrite, TDbSheet, pSheet); if(pSheet!=NULL) { int nRow, nCol; pSheet->HitTestOnCell(jig.m_ptResult, &nRow, &nCol); pSheet->assertWriteEnabled(); TGridCell *pCell2=(*pSheet)(nRow, nCol); pCell2->SetText(sTotal); } OPENOBJ_END(); } } long ColorACad2Word(short cIndex)//obsolete! { switch(cIndex) { case 1:return 6; case 2:return 7; case 3:return 4; case 4:return 3; case 5:return 2; case 6:return 5; case 7:return 8; //后面的AutoCAD颜色索引不能与Word的16色索引对应!!! case 8:return 13; case 9:return 14; case 10:return 11; case 11:return 10; case 12:return 9; case 13:return 12; case 14:return 16; case 15:return 15; default:return 1; } } void Sheet2Word() { PickSet sset(SS_FREE); if (SelectEntities(_T("\n请选择表格<退出>: "), sset, RBList(RTDXF0, _T("ATS_SHEET"), NULL)) != RTNORM) return; long size = sizeof(Cell); //CFileDialog fileDialog(FALSE, _T(""), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // _T("WORD (*.doc)|*.doc||"),AfxGetMainWnd()); //if(fileDialog.DoModal()==IDOK) { CWordApplication wordApp; // modify bu xly on 110408 判断本机是否有word //wordApp.InitWordApplication(FALSE); if(!wordApp.InitWordApplication(FALSE)) { return; } wordApp.CreateDocument(); long length=sset.Length(); acedSetStatusBarProgressMeter(_T("输出到WORD文档"),0,length-1); for (long kkk=0L; kkk< length; kkk++) { acedSetStatusBarProgressMeterPos(kkk); Entity ent=sset[kkk]; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSheet, pSheet); //准备Word表格 int rowNum = pSheet->GetRowNum(); int colNum = pSheet->GetColumnNum(); if(pSheet->GetTitle().IsVisible()) wordApp.AddText(pSheet->GetTitleText(),_T("宋体"),15,1,10,TRUE,0,ColorACad2Word(pSheet->GetTitleTextColor())); wordApp.AddText(_T(" "),_T("宋体"), 12,1,10,FALSE,0,0); wordApp.InsertEmptyLines(1);//回车控制符 double ColWidths = 0; for(int v=0;vGetColumnWidth(v); CWordArray widths; widths.SetSize(colNum); for(int x=0;xGetColumnWidth(x)/ColWidths); _Table table = wordApp.CreateTable(rowNum,colNum,widths,30); Borders border = table.GetBorders(); border.SetOutsideLineStyle(1); border.SetInsideLineStyle(1); Range range=table.GetRange(); Paragraphs paragraphs=range.GetParagraphs(); paragraphs.SetAlignment(1); _Font font=range.GetFont(); font.SetName(_T("宋体")); font.SetSize(9);//小五号字 //提前取出所有Word单元格对象 Cell *pCells=new Cell[rowNum*colNum]; for(int i=0;iGetCoordMax(TRUE); long j1=tCell.GetRange()->GetCoordMax(FALSE); wCell.Merge(pCells[i1*colNum+j1]);//对角合并 for(long k=i;k<=i1;k++) for(long l=j;l<=j1;l++) bCopyed.SetValue(k,l,true);//所有被合并单元格都不需复制了 } //复制颜色 Range range=wCell.GetRange(); long cIndex=tCell.GetGridStyle().GetTextColor(); if(cIndex!=0&&cIndex!=256)//非默认色 { font=range.GetFont(); // Zyu modify on 100726,去掉编译警告 //font.SetColorIndex(ColorACad2Word(cIndex)); font.SetColorIndex(ColorACad2Word((short)cIndex)); } //复制文本 wCell.SetVerticalAlignment(1);//垂直居中 range.SetText(tCell.GetText()); } //释放所有Word单元格对象 delete[] pCells; //留下与下一个表格的间隔 wordApp.GoToTheEnd(); wordApp.AddText(_T(" "),_T("宋体"), 12,1,10,FALSE,0,0); wordApp.InsertEmptyLines(1);//回车控制符 wordApp.AddText(_T(" "),_T("宋体"),12,1,10,FALSE,0,0); wordApp.InsertEmptyLines(1);//回车控制符 OPENOBJ_END(); } acedRestoreStatusBar(); wordApp.Show(); } } // 获取Excel表中的列名 // 0——**A,1——**B,……,25——**Z,26——*AA,27——*AB,…… // 52——*BA,……,78——*CA,676——*ZA,……,702——AAA,…… CString GetColNameString(int nColNum) { CString csResult, csCol; int nMod = nColNum%26, // 余数 nQuotient = nColNum/26; // 商 BOOL bFlag = FALSE; // 标志是否进入过循环体 // modify by xly on 110107 计算错误 表格最到到IV一共是256列 //while(nQuotient > 0) //{ // if (bFlag) // { // nMod = nMod - 1; // if (nMod == -1) // nMod = 25; // } // TCHAR szCol = _T('A') + nMod; // csCol.Format(_T("%c"), szCol); // csResult = csCol + csResult; // nQuotient = nQuotient/27; // nMod = nQuotient%26; // bFlag = TRUE; //} //if (bFlag) //{ // nMod = nMod - 1; // if (nMod == -1) // nMod = 25; //} //TCHAR szCol = _T('A') + nMod; //csCol.Format(_T("%c"), szCol); //csResult = csCol + csResult; if(nQuotient > 0) { // 第一位 TCHAR szCol = _T('A') + nQuotient - 1; csCol.Format(_T("%c"), szCol); csResult = csCol + csResult; } // 第二位 TCHAR szCol = _T('A') + nMod; csCol.Format(_T("%c"), szCol); csResult = csResult + csCol ; return csResult; } // 导出Excel,sg add 090909 void Sheet2Excel() { // 选择表格对象 Entity entSheet; RBList rbMask(RTDXF0, _T("ATS_SHEET"), NULL); if (SelectEntity(_T("\n请选择表格<退出>: "), entSheet, rbMask) != RTNORM) return; // 启动Excel程序 ::CoInitialize(NULL); Ex_Application eApplication; if (!eApplication.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("不能执行Microsoft Excel!")); ::CoUninitialize(); // 卸载DLL return; } // 获得WorkBooks Ex_Workbooks workBooks; workBooks.AttachDispatch(eApplication.GetWorkbooks()); // 创建一个新的WorkBook,并置为当前 Ex_Workbook eWorkBook; COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); eWorkBook = workBooks.Add(vtOptional); // 获得Sheets Ex_Worksheets excelSheets; excelSheets.AttachDispatch(eWorkBook.GetWorksheets()); // 创建一个新的Sheet,并置为当前 Ex_Worksheet eSheet; COleVariant vtIndex((short)1); eSheet = excelSheets.GetItem(vtIndex); // 获得表格对象参数 OPENOBJ_BEGIN(entSheet, AcDb::kForRead, TDbSheet, pSheet); if (pSheet == NULL) { workBooks.Close(); eApplication.Quit(); ::CoUninitialize(); return; } int nRowNum = pSheet->GetRowNum(), // 行数 nColNum = pSheet->GetColumnNum(); // 列数 // 标题内容存在,首先合并单元格,输出标题内容 if (pSheet->GetTitle().IsVisible()) { CString csCell1 = _T("A1"), csCell2 = ::GetColNameString(nColNum-1); csCell2 = csCell2 + _T("1"); // 合并单元格 Ex_Range eRange; eRange = eSheet.GetRange(COleVariant(csCell1), COleVariant(csCell2)); eRange.Merge(COleVariant((long)0)); // 设置对齐方式 eRange.SetVerticalAlignment(COleVariant((short)2)); // 垂直对齐:居中 eRange.SetHorizontalAlignment(COleVariant((short)3)); // 水平对齐:居中 // 输出标题内容 eRange.SetValue(COleVariant(pSheet->GetTitleText())); } // 写表格内容 for (int j=0; jGetCoord(TRUE), nCol = tRange->GetCoord(FALSE); if (i==nRow && j==nCol) { // 获取合并区域内最大的行号、列号 int nMaxRow = tRange->GetCoordMax(TRUE), nMaxCol = tRange->GetCoordMax(FALSE); CString csCell1 = GetColNameString(nCol), csCell2 = GetColNameString(nMaxCol); csCell1.Format(_T("%s%d"), csCell1, (nRow+2)); csCell2.Format(_T("%s%d"), csCell2, (nMaxRow+2)); // 合并区域 Ex_Range eRange; eRange = eSheet.GetRange(COleVariant(csCell1), COleVariant(csCell2)); eRange.Merge(COleVariant((long)0)); // 设置对齐方式 eRange.SetVerticalAlignment(COleVariant((short)2)); // 垂直对齐:居中 eRange.SetHorizontalAlignment(COleVariant((short)3)); // 水平对齐:居中 /* If returnObj.TextColor(i, j) > 0 Then Excel_cad.Range(cell1, cell2).Interior.Color = returnObj.TextColor(i, j) Excel_cad.Range(cell1, cell2).Interior.Pattern = xlSolid End If */ // Interior eInterior = eRange.GetInterior(); // short nColor = tCell.GetGridStyle().GetTextColor(); // eInterior.SetColor(COleVariant(nColor)); // 设置单元格内容 eRange.SetValue(COleVariant(tCell.GetText())); } } else { CString csCell = GetColNameString(j); csCell.Format(_T("%s%d"), csCell, (i+2)); Ex_Range eRange; eRange = eSheet.GetRange(COleVariant(csCell), COleVariant(csCell)); // 设置对齐方式 eRange.SetVerticalAlignment(COleVariant((short)2)); // 垂直对齐:居中 eRange.SetHorizontalAlignment(COleVariant((short)3)); // 水平对齐:居中 /* If returnObj.TextColor(i, j) > 0 Then ExcelSheet_cad.Cells(i+2, j).Interior.Color = returnObj.TextColor(i, j) ExcelSheet_cad.Cells(i+2, j).Interior.Pattern = xlSolid End If */ // Interior eInterior = eRange.GetInterior(); // short nColor = tCell.GetGridStyle().GetTextColor(); // eInterior.SetColor(COleVariant(nColor)); // 设置单元格内容 eRange.SetValue(COleVariant(tCell.GetText())); } } } OPENOBJ_END(); // 显示Excel表格 eApplication.SetVisible(TRUE); } // 导入Excel,sg add 090914 void Excel2Sheet() { // 获取Excel程序,此处用CreateDispatch创建的方法是错误的 ::CoInitialize(NULL); CLSID clsID; HRESULT hr = NOERROR; hr = ::CLSIDFromProgID(L"Excel.Application", &clsID); LPUNKNOWN pUnk = NULL; if (::GetActiveObject(clsID, NULL, &pUnk) != S_OK) { AfxMessageBox(_T("请先打开一EXCEL文件,并框选中要复制的单元格!")); ::CoUninitialize(); return; } LPDISPATCH pExcelDisp = NULL; hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pExcelDisp); Ex_Application eApplication; eApplication.AttachDispatch(pExcelDisp); // 获取当前Sheet Ex_Worksheet eSheet; eSheet.AttachDispatch(eApplication.GetActiveSheet()); // 获取当前选择区域的左上角点(行号、列号) Ex_Range eSelection; eSelection.AttachDispatch(eApplication.GetSelection()); int nMinRow = eSelection.GetRow(), nMinCol = eSelection.GetColumn(); // 获得当前选择区域的右下角点(行号、列号) Ex_Range eRows, eCols; eRows.AttachDispatch(eSelection.GetRows()); eCols.AttachDispatch(eSelection.GetColumns()); int nMaxRow = eRows.GetCount(), nMaxCol = eCols.GetCount(); // 创建表格对象 TDbSheet *pSheet = NULL; // 询问是否创建新的表格对象,或修改已有表格 int nAnswer = AfxMessageBox(_T("是否在图中新建一表格?Y-新建,N-更新(注意行列匹配)。"), MB_YESNO); if (nAnswer == IDNO) // 更新已有表格对象 { // 选择表格对象 Entity entSheet; if (acedEntSel(_T("\n请选择表格<退出>: "), entSheet, XPoint()) != RTNORM) { pUnk->Release(); ::CoUninitialize(); return; } if (!entSheet.Is(_T("ATS_SHEET"))) { AfxMessageBox(_T("选择失败! 请正确选择上华表格。")); pUnk->Release(); ::CoUninitialize(); return; } AcDbObjectId idSheet; if (acdbGetObjectId(idSheet, entSheet) != Acad::eOk) { pUnk->Release(); ::CoUninitialize(); return; } AcDbEntity *pEnt; if (acdbOpenAcDbEntity(pEnt, idSheet, AcDb::kForWrite) != Acad::eOk) { pUnk->Release(); ::CoUninitialize(); return; } pSheet = TDbSheet::cast(pEnt); int nRowNum = pSheet->GetRowNum(), // 行数 nColNum = pSheet->GetColumnNum(); // 列数 // 所选表格对象的行数、列数必须与Excel中所选区域匹配 if (nRowNum!=nMaxRow || nColNum!=nMaxCol) { pSheet->close(); AfxMessageBox(_T("表格行数或列数不匹配! 请正确选择上华表格。")); pUnk->Release(); ::CoUninitialize(); return; } // 首先把已被合并的单元格恢复 for (int i=0; iExplodeCell(i, j); } } } else // 新建表格对象"左上角点或 [参考点(R)]<退出>:" { // 由用户输入表格位置 BOOL bHasRef(FALSE); // 标记是否选择了参考点 XPoint ptLoc, ptRef; while (1) { int nResult(0); INITGET_BEG(0, _T("R")); if (bHasRef) nResult = ads_getpoint(ptRef, _T("\n左上角点或 [参考点(R)]<退出>:"), ptLoc); else nResult = ads_getpoint(NULL, _T("\n左上角点或 [参考点(R)]<退出>:"), ptLoc); INITGET_END(); if (nResult == RTKWORD) // 关键字 { bHasRef = TRUE; if (ads_getpoint(NULL, _T("\n参考点:"), ptRef) != RTNORM) { delete pSheet; pUnk->Release(); ::CoUninitialize(); return; } continue; } else if (nResult != RTNORM) // 退出 { delete pSheet; pUnk->Release(); ::CoUninitialize(); return; } break; } ptLoc = Ucs2Wcs(ptLoc); ptLoc.z = 0; // 文字样式 XString sTextStyle; xg_getvar(_T("TEXTSTYLE"), sTextStyle); AcDbObjectId idTextStyle = GetTextStyleId(sTextStyle); if (!idTextStyle) { delete pSheet; pUnk->Release(); ::CoUninitialize(); return; } pSheet = new TDbSheet; // 增加布局转角的设置,解决导入UCS图的问题 pSheet->SetRotation(Ucs2Wcs(0.0)); // 设置标题,包括:标题高度、隐藏标题 TSheetTitle &title = pSheet->GetTitle(); title.SetVisible(FALSE); pSheet->SetTitleHeight(7.0); TGridStyle gridStyle; gridStyle.SetOverrideAll(TRUE); gridStyle.SetTextHeight(3.5); gridStyle.SetTextStyleId(idTextStyle); pSheet->SetGridStyle(gridStyle); pSheet->SetLocation(ptLoc); pSheet->InitSheet(nMaxRow, nMaxCol, 7.0, 40.0); } // 填写表格内容 for (int i=0; iMergeCells(nMergeMinRow, nMergeMinCol, nMergeMaxRow, nMergeMaxCol); } if (!bDbMerge) { _bstr_t vtText = eCell.GetText().bstrVal; tCell.SetText((const TCHAR*)vtText); } } } // modify by xly on 101217 读入表格时,如果是新建的表格可支持图层切换 if (nAnswer == IDYES) // 新建的表格对象 { //pSheet->AddToCSpace(Adesk::kTrue); AddToSpace(Adesk::kTrue, pSheet); } else // 写打开的表格对象 { pSheet->close(); SHads_command(RTSTR, _T("REGEN"), RTNONE); } pUnk->Release(); ::CoUninitialize(); return; }