3802 lines
110 KiB
C++
3802 lines
110 KiB
C++
#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;
|
||
}
|