Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

3802 lines
110 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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; i<nColumn; i++) {
XString sFieldDesc;
// Zyu modify on 100726,成员变量名称改变
// sFieldDesc=pFieldArray[i].name;
// int nWidthOfHead=pFieldArray[i].len;
sFieldDesc=pFieldArray[i].m_strName.toCString();
int nWidthOfHead=pFieldArray[i].m_nLen;
TSheetColumn column;
column.SetWidth(nWidthOfHead*nTextSize);
pSheet->SetColumnAt(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; iCol<nColumn; iCol++) {
TGridCell &cell=*(*pSheet)(iRow, iCol);;
XFieldContent *pField=pTable->GetFieldContent(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<AcDbObjectId> 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; i<lCount; i++) {
AcDbObjectId ent=*ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSheet, pSheet);
if(pSheet && pSheet->IsValid()) {
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<CBlockStruct> 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; i<nRowNum; i++) {
pSheet->AddRowAt(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; i<nColNum; i++) {
pSheet->AddColumnAt(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<nLen; i++) {
if(szKey[i]==c) {
nRet=i;
break;
}
}
return nRet;
}
// 单元格编辑
void EditCell()
{
XPushVar<int> 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<int> 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<nLen; i++) {
if(szKey[i]==c) {
nRet=i;
break;
}
}
return nRet;
}
// Command: 表列编辑
void EditColumn()
{
XPushVar<int> 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; i<nColNum; i++)
pSheet->AddColumnAt(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<nLen; i++) {
if(szKey[i]==c) {
nRet=i;
break;
}
}
return nRet;
}
// Command: 表行编辑
void EditRow()
{
XPushVar<int> 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; i<nRowNum; i++)
pSheet->AddRowAt(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<int> osmode(_T("OSMODE"), 0);
return EditSheetProp(id);
}
// 沈睿ADD
////////////////////////////////////////////////////////////////////////////////////
// 删除表行
////////////////////////////////////////////////////////////////////////////////////
void SheetDelRow()
{
XPushVar<int> 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<int> 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<int> 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<int> 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("<or"), RTDXF0, _T("ATS_TEXT"), RTDXF0, _T("TEXT"), -4, _T("or>"), NULL);
BOOL bIsCopy = FALSE;
BOOL bIsBlk = FALSE;
Entity entText;
TSheetEdJig jig;
CString csCopyText;
TGridStyle oldStyle;
int nOldRow, nOldCol;
AcDbObjectId idOld = NULL;
XPushVar<int> 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<int> 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<iZeroNum; kk++)
sText << _T("0");
}
sText << szNext;
csRet = (const TCHAR*)sText;
}
}
if(csRet != csRes)
return csRet;
CString csChinaDigit[] = {_T("一"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六"),_T("七"),_T("八"),_T("九"),_T("十"),};
// modify by xly on 101110 修改为从1——10的大写,原来版本可能是写错了
//CString csChinaDigit2[] = {_T("零"),_T("贰"),_T("叁"),_T("肆"),_T("伍"),_T("陆"),_T("柒"),_T("捌"),_T("玖"),_T("拾"),};
CString csChinaDigit2[] = {_T("壹"),_T("贰"),_T("叁"),_T("肆"),_T("伍"),_T("陆"),_T("柒"),_T("捌"),_T("玖"),_T("拾"),};
CString cs12Digit[] = {_T("Ⅰ"),_T("Ⅱ"),_T("Ⅲ"),_T("Ⅳ"),_T("Ⅴ"),_T("Ⅵ"),_T("Ⅶ"),_T("Ⅷ"),_T("Ⅸ"),_T("Ⅹ"),_T("Ⅺ"),_T("Ⅻ")};
CString csLetter[] = {_T("a"),_T("b"),_T("c"),_T("d"),_T("e"),_T("f"),_T("g"),_T("h"),_T("i"),_T("j"),_T("k"),_T("l"),_T("m"),_T("n"),_T("o"),_T("p"),_T("q"),_T("r"),_T("s"),_T("t"),_T("u"),_T("v"),_T("w"),_T("x"),_T("y"),_T("z")};
CString csLetter2[] = {_T("A"),_T("B"),_T("C"),_T("D"),_T("E"),_T("F"),_T("G"),_T("H"),_T("I"),_T("J"),_T("K"),_T("L"),_T("M"),_T("N"),_T("O"),_T("P"),_T("Q"),_T("R"),_T("S"),_T("T"),_T("U"),_T("V"),_T("W"),_T("X"),_T("Y"),_T("Z")};
CString csRightTmp2, csLeftTmp2;
int len = csRes.GetLength();
int iIdx(0);
/////////////////////////////////////////////////////////////////////////
//对后面特殊字符进行递增
for(int m=0;m<10;m++){
// add by xly on 101028 递增文字命令支持中文数字的递增变化
if (bHasChineseNum)
{
// modify by xly 在6编译其中中文是2个字节长度
#if (ADS < 17)
csRightTmp2 = csRes.Right(2);
// acutPrintf(csChinaDigit[m]); // lgh 删除的测试代码
if(csRightTmp2 == csChinaDigit[m]){
// modify by xly on 101028 不应该去掉两个长度,这样会吞掉汉字数字的前一位
//CString csLeftTmp = csRes.Left(len - 2);
CString csLeftTmp = csRes.Left(len - 2);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+10) % 10;
csRightTmp2 = csChinaDigit[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
#else
csRightTmp2 = csRes.Right(1);
if(csRightTmp2 == csChinaDigit[m]){
// modify by xly on 101028 不应该去掉两个长度,这样会吞掉汉字数字的前一位
//CString csLeftTmp = csRes.Left(len - 2);
CString csLeftTmp = csRes.Left(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+10) % 10;
csRightTmp2 = csChinaDigit[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
#endif
}
}
for(m=0;m<10;m++){
// add by xly on 101110 递增文字命令支持中文数字的递增变化
if (bHasChineseNum)
{
csRightTmp2 = csRes.Right(1);
}
if(csRightTmp2 == csChinaDigit2[m])
{
// modify by xly on 101110 不应该去掉两个长度,这样会吞掉汉字数字的前一位
//CString csLeftTmp = csRes.Left(len - 2);
CString csLeftTmp = csRes.Left(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+10) % 10;
csRightTmp2 = csChinaDigit2[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
}
for(m=0;m<12;m++){
// add by xly on 101110 递增文字命令支持中文数字的递增变化
if (bHasChineseNum)
{
csRightTmp2 = csRes.Right(1);
}
if(csRightTmp2 == cs12Digit[m]){
// modify by xly on 101110 不应该去掉两个长度,这样会吞掉汉字数字的前一位
//CString csLeftTmp = csRes.Left(len - 2);
CString csLeftTmp = csRes.Left(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+12) % 12;
csRightTmp2 = cs12Digit[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
}
for(m=0;m<26;m++){
csRightTmp2 = csRes.Right(1);
if(csRightTmp2 == csLetter[m]){
CString csLeftTmp = csRes.Left(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+26) % 26;
csRightTmp2 = csLetter[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
}
for(m=0;m<26;m++){
csRightTmp2 = csRes.Right(1);
if(csRightTmp2 == csLetter2[m]){
CString csLeftTmp = csRes.Left(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+26) % 26;
csRightTmp2 = csLetter2[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp, csRightTmp2);
return csRet;
}
}
/////////////////////////////////////////////////////////////////////////
//对前面特殊字符进行递增
for(m=0;m<10;m++){
if(csLeftTmp2 == csChinaDigit[m]){
CString csRightTmp = csRes.Right(len - 2);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+10) % 10;
csLeftTmp2 = csChinaDigit[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp2, csRightTmp);
return csRet;
}
}
for(m=0;m<10;m++){
if(csLeftTmp2 == csChinaDigit2[m]){
CString csRightTmp = csRes.Right(len - 2);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+10) % 10;
csLeftTmp2 = csChinaDigit2[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp2, csRightTmp);
return csRet;
}
}
for(m=0;m<12;m++){
if(csLeftTmp2 == cs12Digit[m]){
CString csRightTmp = csRes.Right(len - 2);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+12) % 12;
csLeftTmp2 = cs12Digit[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp2, csRightTmp);
return csRet;
}
}
for(m=0;m<26;m++){
csLeftTmp2 = csRes.Left(1);
if(csLeftTmp2 == csLetter[m]){
CString csRightTmp = csRes.Right(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+26) % 26;
csLeftTmp2 = csLetter[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp2, csRightTmp);
return csRet;
}
}
for(m=0;m<26;m++){
csLeftTmp2 = csRes.Left(1);
if(csLeftTmp2 == csLetter2[m]){
CString csRightTmp = csRes.Right(len - 1);
if(bIsPlus)
iIdx = m + step;
else
iIdx = m - step;
iIdx = (iIdx+26) % 26;
csLeftTmp2 = csLetter2[iIdx];
csRet.Format(_T("%s%s"), csLeftTmp2, csRightTmp);
return csRet;
}
}
return csRet;
}
void CopyCellAndPlus()
{
int nRowFrom, nColFrom, nRowTo, nColTo;
XPoint ptSize, ptStart, ptEnd, ptPick;
XPushVar<int> 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;i<len;i++){
ptSize = pSheet->GetCellSize(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;i<len;i++){
ptSize = pSheet->GetCellSize(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;i<len;i++){
ptSize = pSheet->GetCellSize(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;i<len;i++){
ptSize = pSheet->GetCellSize(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; i<iRowNum; i++)
{
pNewSheet1->RemoveRow(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; i<nRow; i++)
{
pNewSheet2->RemoveRow(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; i<iColNum; i++)
{
pNewSheet1->RemoveColumn(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; i<nCol; i++)
{
pNewSheet2->RemoveColumn(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; i<iRowNum; i++)
pSheet->RemoveRow(iStartRow);
OPENOBJ_END();
if(pNewSheet == NULL)
continue;
for(i=0; i<m_iAppoint; i++)
pNewSheet->RemoveRow(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; i<iColNum; i++)
pSheet->RemoveColumn(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; i<iStartCol; i++)
pNewSheet->RemoveColumn(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<int> 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<int> 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;v<colNum;v++)
ColWidths = ColWidths + pSheet->GetColumnWidth(v);
CWordArray widths;
widths.SetSize(colNum);
for(int x=0;x<colNum;x++)
widths[x] =(int) (428*pSheet->GetColumnWidth(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;i<rowNum;i++)
for(int j=0;j<colNum;j++)
pCells[i*colNum+j]=table.Cell(i+1,j+1);
//复制所有TGridCell单元格
BitMatrix bCopyed(rowNum,colNum);//控制矩阵,用于合并单元格复制控制
for(i=0;i<rowNum;i++)
for(long j=0;j<colNum;j++)
if(!bCopyed(i,j))//还未复制
{
Cell wCell=pCells[i*colNum+j];
TGridCell &tCell=*(*pSheet)(i,j);
//复制结构
if(tCell.IsRange())//需要合并
{
long i1=tCell.GetRange()->GetCoordMax(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; j<nColNum; j++)
{
for (int i=0; i<nRowNum; i++)
{
// 当前单元格
TGridCell &tCell = *(*pSheet)(i, j);
// 需要合并单元格
if (tCell.IsRange())
{
const TGridRange *tRange = tCell.GetRange();
int nRow = tRange->GetCoord(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; i<nMaxRow; i++)
{
for (int j=0; j<nMaxCol; j++)
{
// 当前单元格
TGridCell &tCell = *(*pSheet)(i, j);
if (tCell.IsRange())
pSheet->ExplodeCell(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; i<nMaxRow; i++)
{
for (int j=0; j<nMaxCol; j++)
{
// 获取当前单元格编号,如:A1,B1
//LH 2012.8.30 修改csCell.Format(_T("%s%d"), csCell, nMinRow+i);
// 错误原因是Format不可以自身,这样内存可能会紊乱
CString csCellTemp = ::GetColNameString(nMinCol+j-1);
CString csCell = _T("");
if (csCellTemp.IsEmpty())
{
continue;
}
else
{
csCell.Format(_T("%s%d"), csCellTemp, nMinRow+i);
}
Ex_Range eCell;
eCell = eSheet.GetRange(COleVariant(csCell), COleVariant(csCell));
// 判断Excel表格中的当前单元格,是否为被合并的单元格
_variant_t vtMerge = eCell.GetMergeCells();
BOOL bExcelMerge = (bool)vtMerge;
// 判断表格对象中的对应单元格,是否为被合并的单元格
TGridCell &tCell = *(*pSheet)(i, j);
BOOL bDbMerge = tCell.IsRange();
// 需要合并表格对象中的单元格
if (bExcelMerge && !bDbMerge)
{
// 获取被合并的区域
Ex_Range eMergeArea;
eMergeArea.AttachDispatch(eCell.GetMergeArea());
eRows.AttachDispatch(eMergeArea.GetRows());
eCols.AttachDispatch(eMergeArea.GetColumns());
// 计算合并区域的大小
int nMergeMinRow = eMergeArea.GetRow() - nMinRow,
nMergeMinCol = eMergeArea.GetColumn() - nMinCol,
nMergeMaxRow = eRows.GetCount() + nMergeMinRow - 1,
nMergeMaxCol = eCols.GetCount() + nMergeMinCol - 1;
pSheet->MergeCells(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;
}