1251 lines
34 KiB
C++
1251 lines
34 KiB
C++
#include "stdafx.h"
|
|
#include "TextStyleDlg.h"
|
|
#include "SingleRowText.h"
|
|
#include "MutiRowTextDlg.h"
|
|
#include "FindParser.h"
|
|
|
|
extern int Big5ToGB(const TCHAR *szSrc, XString &sDest, void *pCodeTable);
|
|
extern int GBToBig5(const TCHAR *szSrc, XString &sDest, void *pCodeTable);
|
|
|
|
extern TARCH_IMPEXP int g_bTextAdjust;
|
|
extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle);
|
|
|
|
// add by xly On 101213 设置文字对象的图层切换属性
|
|
extern TARCH_IMPEXP BOOL g_bTextDefaultLayer;
|
|
// add by xly On 101213 引入设置实体的图层并将实体添加到图纸中
|
|
extern AcDbObjectId AddToSpace(Adesk::Boolean bClosed, TDbEntity *pEntSymb);
|
|
////////////////////////////////////////////////////////////////
|
|
// Add by lcf 2005-06-30
|
|
// 单行文字
|
|
class TSimgleRowTextJig : public AcEdJig
|
|
{
|
|
public:
|
|
TSimgleRowTextJig(TDbText *pEnt);
|
|
|
|
int start(int *pKeyIndex = NULL);
|
|
AcDbEntity* entity() const;
|
|
DragStatus sampler();
|
|
Adesk::Boolean update();
|
|
void SetPrompt(const TCHAR *pszPrompt);
|
|
void SetKeyword(const TCHAR *pszKeyword);
|
|
|
|
private:
|
|
const TCHAR *m_pszPrompt; //提示信息
|
|
const TCHAR *m_pszKeyword; //关键字
|
|
TDbText *m_pDrawEnt; //临时实体
|
|
AcGePoint3d m_ptIns;
|
|
};
|
|
|
|
TSimgleRowTextJig::TSimgleRowTextJig(TDbText *pEnt)
|
|
: m_pDrawEnt(pEnt)
|
|
, m_pszPrompt(NULL)
|
|
, m_pszKeyword(NULL)
|
|
{
|
|
}
|
|
|
|
void TSimgleRowTextJig::SetPrompt(const TCHAR *pszPrompt)
|
|
{
|
|
m_pszPrompt = pszPrompt;
|
|
}
|
|
|
|
void TSimgleRowTextJig::SetKeyword(const TCHAR *pszKeyword)
|
|
{
|
|
m_pszKeyword = pszKeyword;
|
|
}
|
|
|
|
int TSimgleRowTextJig::start(int *keyIndex)
|
|
{
|
|
setDispPrompt( m_pszPrompt );
|
|
AcEdJig::DragStatus stat = drag();
|
|
|
|
if ( kNormal == stat )
|
|
append();
|
|
else
|
|
delete m_pDrawEnt;
|
|
|
|
int nRet;
|
|
if (stat == AcEdJig::kCancel)
|
|
nRet = RTCAN;
|
|
else if(stat == AcEdJig::kNull)
|
|
nRet = RTNONE;
|
|
else if (stat <= 0)
|
|
nRet = RTNORM;
|
|
else
|
|
{
|
|
if(keyIndex) *keyIndex = stat;
|
|
nRet = RTKWORD;
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
AcEdJig::DragStatus TSimgleRowTextJig::sampler()
|
|
{
|
|
setUserInputControls( ( UserInputControls )
|
|
( kNullResponseAccepted | kAccept3dCoordinates ));
|
|
|
|
if(m_pszKeyword)setKeywordList(m_pszKeyword);
|
|
|
|
AcGePoint3d point;
|
|
DragStatus stat = acquirePoint(point);
|
|
if (stat == kNormal)
|
|
{
|
|
if (point == m_ptIns)
|
|
return AcEdJig::kNoChange;
|
|
else
|
|
m_ptIns = point;
|
|
}
|
|
return stat;
|
|
}
|
|
|
|
Adesk::Boolean TSimgleRowTextJig::update()
|
|
{
|
|
m_pDrawEnt->SetLocation(m_ptIns);
|
|
return Adesk::kTrue;
|
|
}
|
|
|
|
AcDbEntity *TSimgleRowTextJig::entity() const
|
|
{
|
|
return m_pDrawEnt;
|
|
}
|
|
|
|
|
|
// Modify by lcf 2005-06-30
|
|
void TextLine()
|
|
{
|
|
extern TARCH_IMPEXP BOOL g_bAutoFocus;
|
|
XPushMemVar<BOOL> vf(g_bAutoFocus,FALSE);//add by whl on 070605,单行文字不支持自动恢复焦点
|
|
InitLayer(LAY_TEXT);
|
|
CSingleRowText dlg(FALSE, acedGetAcadFrame());
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
if(!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
|
return;
|
|
}
|
|
dlg.ShowWindow(SW_SHOW);
|
|
|
|
while(1)
|
|
{
|
|
acedGetAcadDwgView()->SetFocus();
|
|
TDbText *pEnt = new TDbText;
|
|
dlg.Dlg2Obj(pEnt);
|
|
dlg.m_bPost = TRUE;
|
|
// pEnt->SetRotation(Ucs2Wcs(0.0));
|
|
|
|
// modify by xly on 101213 设置单行文字的图层控制
|
|
//pEnt->setLayer(pEnt->GetDefaultLayer());
|
|
if (g_bTextDefaultLayer)
|
|
{
|
|
pEnt->setLayer(pEnt->GetDefaultLayer());
|
|
}
|
|
|
|
TSimgleRowTextJig jig(pEnt);
|
|
jig.SetKeyword(_T("`"));
|
|
jig.SetPrompt(_T("\n请点取插入位置<退出>:"));
|
|
int nRet = jig.start();
|
|
if(nRet == RTNORM)
|
|
{
|
|
dlg.AddToRecent();
|
|
if(!dlg.m_bContinue)
|
|
break;
|
|
dlg.m_bPost = FALSE;
|
|
}
|
|
else if(nRet == RTKWORD)
|
|
{
|
|
if(dlg.m_nOperCode == 0)
|
|
dlg.GetTextHeight();
|
|
else if(dlg.m_nOperCode == 1)
|
|
dlg.GetPickText();
|
|
else if(dlg.m_nOperCode == 2)
|
|
dlg.GetTextAngle();
|
|
}
|
|
else
|
|
{
|
|
if(::IsWindow(dlg.m_hWnd))
|
|
dlg.DestroyWindow();
|
|
return;
|
|
}
|
|
}
|
|
if(::IsWindow(dlg.m_hWnd))
|
|
dlg.DestroyWindow();
|
|
}
|
|
|
|
|
|
void TextStyleEx()
|
|
{
|
|
int nDrawMode=DocGetDrawMode();
|
|
DocSetDrawMode(DRAW_2D);
|
|
CTextStyleDlg dlg(acedGetAcadFrame());
|
|
CTemporaryResourceOverride vTemp;
|
|
dlg.DoModal(); // DLG only has IDOK;
|
|
DocSetDrawMode(nDrawMode);
|
|
}
|
|
|
|
// 编辑单行文字
|
|
int EditLineText(AcDbObjectId id)
|
|
{
|
|
double nHeight = 0.0;
|
|
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbText, pText);
|
|
if(!pText)
|
|
return RTERROR;
|
|
|
|
CSingleRowText dlg(TRUE, acedGetAcadFrame());
|
|
dlg.Obj2Dlg(pText);
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
if(dlg.DoModal() != IDOK)
|
|
return RTNONE;
|
|
}
|
|
|
|
if(pText->upgradeOpen()!=Acad::eOk)
|
|
return RTERROR;
|
|
|
|
pText->assertWriteEnabled();
|
|
dlg.Dlg2Obj(pText);
|
|
pText->downgradeOpen();
|
|
OPENOBJ_END();
|
|
return RTNONE;
|
|
}
|
|
|
|
void TextLine0()
|
|
{
|
|
XString sTextStyle;
|
|
xg_getvar(_T("TEXTSTYLE"), sTextStyle);
|
|
AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle);
|
|
if(!idTextStyle)
|
|
return;
|
|
double nHeight=0.0, nRot=0.0;
|
|
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
|
|
ASSERT(pStyle);
|
|
nHeight=pStyle->textSize();
|
|
OPENOBJ_END();
|
|
|
|
XString sText(256);
|
|
XPoint ptText;
|
|
if(XGetPoint(NULL, _T("\n位置"), ptText)==RTNORM &&
|
|
ads_getstring(1, _T("\n文字: "), sText)==RTNORM && !!sText) {
|
|
ptText=Ucs2Wcs(ptText);
|
|
if(nHeight<1.0E-3) {
|
|
if(XGetDist(ptText, _T("\n文字高度"), nHeight, RSG_NOZERO|RSG_NONEG)==RTCAN)
|
|
return;
|
|
nHeight /= DocGetPScale();
|
|
}
|
|
if(ads_getangle(ptText, _T("\n旋转角度<0.0>:"), &nRot)==RTCAN)
|
|
return;
|
|
ptText=Ucs2Wcs(ptText);
|
|
TDbText *pText=new TDbText;
|
|
pText->SetStyleId(idTextStyle);
|
|
pText->SetLocation(ptText);
|
|
pText->SetHeight(nHeight);
|
|
pText->SetRotation(nRot);
|
|
pText->SetText(sText);
|
|
pText->AddToCSpace(Adesk::kTrue);
|
|
}
|
|
}
|
|
|
|
// 编辑多行文字
|
|
int EditMutiText(AcDbObjectId id)
|
|
{
|
|
double nHeight = 0.0, nPageWidth = 0.0;
|
|
|
|
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMText, pText);
|
|
if(!pText)
|
|
return RTERROR;
|
|
|
|
CMutiRowTextDlg dlg(TRUE, acedGetAcadFrame());
|
|
dlg.Obj2Dlg(pText);
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
if(dlg.DoModal() != IDOK)
|
|
return RTNONE;
|
|
}
|
|
|
|
if(pText->upgradeOpen()!=Acad::eOk)
|
|
return RTERROR;
|
|
|
|
pText->assertWriteEnabled();
|
|
|
|
dlg.Dlg2Obj(pText);
|
|
pText->downgradeOpen();
|
|
OPENOBJ_END();
|
|
//return RTNONE;
|
|
return RTNORM;//modified by whl
|
|
}
|
|
|
|
void TextMLine()
|
|
{
|
|
double nHeight = 0.0,
|
|
nRot = 0.0,
|
|
nPageWidth = 0.0;
|
|
|
|
CMutiRowTextDlg dlg(FALSE, acedGetAcadFrame());
|
|
|
|
// modify by xly on 110310 从图纸中获得文字样式
|
|
//// modify by xly on 101014 记录文字样式
|
|
////XString sTextStyle;
|
|
////xg_getvar(_T("TEXTSTYLE"), sTextStyle);
|
|
//static XString sTextStyle;
|
|
//if (sTextStyle.Length()<1)
|
|
//{
|
|
// xg_getvar(_T("TEXTSTYLE"), sTextStyle);
|
|
//}
|
|
|
|
|
|
//// add by xly on 110106 如果使用新创建的文字样式,图纸切换时产生bug
|
|
//bool bIsHas(false);// 标记文字样式中,是否有当前样式
|
|
//for (int m =0; m < dlg.m_lstStyle.Length(); m++)
|
|
//{
|
|
// // 标记文字样式中有当前样式
|
|
// if (dlg.m_lstStyle[m] == sTextStyle)
|
|
// {
|
|
// bIsHas = true;
|
|
// break;
|
|
// }
|
|
//}
|
|
|
|
//// 没有当前样式,设置默认样式Stantard
|
|
//if (!bIsHas)
|
|
//{
|
|
// xg_getvar(_T("TEXTSTYLE"), sTextStyle);
|
|
//}
|
|
|
|
static XString sTextStyle;
|
|
sTextStyle = DocGetTgSingleTextStyle();
|
|
|
|
// sg add 110523,检查当前记忆的文字样式是否被PU掉
|
|
{
|
|
bool bExist = false;
|
|
|
|
AcDbDatabase *pCurDwg = acdbCurDwg();
|
|
AcDbTextStyleTable* pTT = NULL;
|
|
VERIFY(pCurDwg->getSymbolTable(pTT, AcDb::kForRead)==Acad::eOk);
|
|
|
|
AcDbTextStyleTableIterator* pIter = NULL;
|
|
VERIFY(pTT->newIterator(pIter)==Acad::eOk);
|
|
pTT->close();
|
|
|
|
for (pIter->start(); !pIter->done(); pIter->step())
|
|
{
|
|
AcDbTextStyleTableRecord* pTTR;
|
|
if (pIter->getRecord(pTTR, AcDb::kForRead) != Acad::eOk)
|
|
continue;
|
|
|
|
const TCHAR* pName = NULL;
|
|
if (pTTR->getName(pName) == Acad::eOk && pName != NULL)
|
|
{
|
|
if (_tcsicmp(pName, sTextStyle) == 0) // 如果存在该样式
|
|
{
|
|
pTTR->close();
|
|
bExist = true;
|
|
continue;
|
|
}
|
|
}
|
|
pTTR->close();
|
|
}
|
|
delete pIter;
|
|
|
|
if (!bExist)
|
|
{
|
|
TCHAR sStyle[256]=_T("");
|
|
xg_getvar(_T("TEXTSTYLE"), sStyle);
|
|
sTextStyle = sStyle;
|
|
}
|
|
}
|
|
|
|
// add by xly on 110429 文字样式不存在
|
|
if (sTextStyle == _T(""))
|
|
{
|
|
TCHAR sStyle[256]=_T("");
|
|
xg_getvar(_T("TEXTSTYLE"), sStyle);
|
|
sTextStyle = sStyle;
|
|
}
|
|
|
|
AcDbObjectId idTextStyle = GetTextStyleId(sTextStyle);
|
|
if (!idTextStyle)
|
|
return;
|
|
|
|
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
|
|
ASSERT(pStyle);
|
|
dlg.m_strHeight.Format(_T("%.1f"), pStyle->textSize()); //读文字风格的字高
|
|
OPENOBJ_END();
|
|
|
|
dlg.m_strStyle = (const TCHAR *)sTextStyle;
|
|
|
|
// delete by xly on 101222多行文字中的转角的变量变为静态变量
|
|
// dlg.m_strRotation = _T("0");
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
if(dlg.DoModal() != IDOK || dlg.m_strInputText == _T(""))
|
|
return;
|
|
}
|
|
|
|
XPoint ptText, ptRight;
|
|
if(XGetPoint(NULL, _T("\n左上角"), ptText)==RTNORM )
|
|
{
|
|
ptText=Ucs2Wcs(ptText);
|
|
TDbMText *pText = new TDbMText;
|
|
dlg.Dlg2Obj(pText);
|
|
pText->SetLocation(ptText);
|
|
pText->SetRotation(pText->GetRotation()+Ucs2Wcs(0.0));//add by whl
|
|
|
|
// add xly on 101014 记录文字样式
|
|
sTextStyle = dlg.m_strStyle;
|
|
|
|
// add by xly on 110310保存文字样式到图纸中
|
|
DocSetTgSingleTextStyle(dlg.m_strStyle);
|
|
|
|
// modify by xly on 101213 添加实体切换图层的功能
|
|
//pText->AddToCSpace(Adesk::kTrue);
|
|
AddToSpace(Adesk::kTrue, pText);
|
|
}
|
|
}
|
|
|
|
void TextMLine0()
|
|
{
|
|
XString sTextStyle;
|
|
xg_getvar(_T("TEXTSTYLE"), sTextStyle);
|
|
AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle);
|
|
if(!idTextStyle)
|
|
return;
|
|
double nHeight=0.0, nRot=0.0;
|
|
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
|
|
ASSERT(pStyle);
|
|
nHeight=pStyle->textSize();
|
|
OPENOBJ_END();
|
|
|
|
XString sText(2048);
|
|
XPoint ptText, ptRight;
|
|
if(XGetPoint(NULL, _T("\n左上角"), ptText)==RTNORM &&
|
|
XGetPoint(ptText, _T("\n右上角"), ptRight)==RTNORM &&
|
|
ads_getstring(1, _T("\n文字: "), sText)==RTNORM && !!sText) {
|
|
if(nHeight<1.0E-3) {
|
|
if(XGetDist(ptText, _T("\n文字高度"), nHeight, RSG_NOZERO|RSG_NONEG)==RTCAN)
|
|
return;
|
|
nHeight /= DocGetPScale();
|
|
}
|
|
TDbMText *pText=new TDbMText;
|
|
pText->SetStyleId(idTextStyle);
|
|
pText->SetLocation(ptText);
|
|
pText->SetHeight(nHeight);
|
|
pText->SetRotation(ads_angle(ptText, ptRight));
|
|
pText->SetText(sText);
|
|
pText->SetPageWidth(ptText.Distance2d(ptRight), FALSE);
|
|
pText->SetLineSpace(nHeight/4);
|
|
pText->AddToCSpace(Adesk::kTrue);
|
|
}
|
|
}
|
|
|
|
// Command: 转化文字 (AcDbText -> TDbText)
|
|
void TextConvert()
|
|
{
|
|
RBList mask(RTDXF0, _T("TEXT"), NULL);
|
|
PickSet ss(SS_FREE);
|
|
|
|
if(SelectEntities(_T("\n请选择ACAD单行文字: "), ss, mask)==RTNORM) {
|
|
PickSet ss1(SS_FREE|SS_CREATE);
|
|
long lCount=ss.Length();
|
|
for(long i=0; i<lCount; i++) {
|
|
Entity ent=ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pText);
|
|
if(pText) {
|
|
TDbText *pNewText = new TDbText;
|
|
if(pNewText->ConvertFrom(pText)) {
|
|
|
|
//add by whl on 070108
|
|
if(pNewText->GetAlignment()>9)
|
|
pNewText->SetAlignment(XExplodeDraw::kBottomLeft);
|
|
|
|
AddToCurrentSpace(pNewText, Adesk::kTrue);
|
|
pText->erase();
|
|
} else {
|
|
ss1 += ent;
|
|
delete pNewText;
|
|
}
|
|
} else {
|
|
ss1 += ent;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
/*
|
|
long num=ss1.Length();
|
|
if(num) {
|
|
adsout << _T("\n有") << int(num) << _T("个对象不能被转化!");
|
|
ss1.Redraw(3);
|
|
} else {
|
|
adsout << _T("\n全部选中的") << int(lCount) << _T("个ACAD文字成功的转化为上华文字!");
|
|
}*/
|
|
}
|
|
}
|
|
static double g_textCmpHeight;//add by whl
|
|
static bool IsSameLine(const TDbText*p1,const TDbText*p2)
|
|
{
|
|
XPoint pt1=p1->GetLocation(),pt2=p2->GetLocation();
|
|
double nRot=p1->GetRotation();
|
|
ads_matrix mat;
|
|
pt1.GetRotationMatrix(-nRot,mat);
|
|
pt2.TransformBy(mat);
|
|
|
|
if((pt1.y-pt2.y>g_textCmpHeight)||(pt2.y-pt1.y>g_textCmpHeight))
|
|
return false;
|
|
return true;
|
|
}
|
|
static int CompTextPos(const TDbText *p1, const TDbText *p2)
|
|
{
|
|
//modified by whl on 061113,使用包围盒的ptMin来比较
|
|
//XPoint pt1=p1->GetLocation(),pt2=p2->GetLocation();
|
|
//ads_matrix mat;
|
|
//pt1.GetRotationMatrix(-nRot,mat);
|
|
//pt2.TransformBy(mat);
|
|
double nRot=p1->GetRotation();
|
|
TDbText *pText1=(TDbText*)p1->clone();
|
|
TDbText *pText2=(TDbText*)p2->clone();
|
|
AcGeMatrix3d matRot;
|
|
matRot.setToRotation(-nRot,AcGeVector3d::kZAxis);
|
|
pText1->transformBy(matRot);
|
|
pText2->transformBy(matRot);
|
|
XPoint ptTemp,pt1,pt2;
|
|
pText1->GetExtents2d(pt1,ptTemp);
|
|
pText2->GetExtents2d(pt2,ptTemp);
|
|
delete pText1;
|
|
delete pText2;
|
|
|
|
if(pt1.y-pt2.y>g_textCmpHeight)
|
|
return -1;
|
|
else if(pt2.y-pt1.y>g_textCmpHeight)
|
|
return 1;
|
|
else//同一行
|
|
return pt1.x<pt2.x?-1:1;
|
|
}
|
|
|
|
// Command: 合并文字
|
|
//void MergeText()
|
|
//{
|
|
// DList<TDbText> lstTexts;
|
|
// RBList mask(RTDXF0, _T("TEXT,ATS_TEXT"), NULL);
|
|
// PickSet ss(SS_FREE);
|
|
// if(SelectEntities(_T("\n请选择一排文字: "), ss, mask)!=RTNORM)
|
|
// return;
|
|
// long lCount=ss.Length();
|
|
// for(long i=0; i<lCount; i++) {
|
|
// Entity ent=ss[i];
|
|
// OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
|
// ASSERT(pEnt);
|
|
// if(pEnt->isKindOf(TDbText::desc()))
|
|
// lstTexts.Append((TDbText *)pEnt->clone());
|
|
// else if(pEnt->isKindOf(AcDbText::desc())){
|
|
// TDbText *pText=new TDbText;
|
|
// if(pText->ConvertFrom((AcDbText *)pEnt))
|
|
// lstTexts.Append(pText);
|
|
// else {
|
|
// delete pText;
|
|
// adsout << _T("\n发现不能转换的文字: ") << ((AcDbText *)pText)->textString();
|
|
// return;
|
|
// }
|
|
// }
|
|
// OPENOBJ_END();
|
|
// }
|
|
// if(lstTexts.Length()<2)
|
|
// return;
|
|
// double nRot=lstTexts[0]->GetRotation();
|
|
// double nHeight=lstTexts[0]->GetHeight();
|
|
// for(int n=1; n<lstTexts.Length(); n++) {
|
|
// if(!CT_IsExactSameDrt(nRot, lstTexts[n]->GetRotation(), _angSnap)) {
|
|
// adsout << _T("\n旋转角度不一致, 无法合并!");
|
|
// return;
|
|
// }
|
|
// nHeight=max(lstTexts[n]->GetHeight(), nHeight);
|
|
// }
|
|
//
|
|
// lstTexts.QuickSort(CompTextPos);
|
|
// TDbText *pFirst=lstTexts[0];
|
|
// double nWidth1, nHeight1, nTemp;
|
|
// pFirst->GetExtents(&nWidth1, &nHeight1, &nTemp);
|
|
// XPoint ptBase = pFirst->Align2Base(pFirst->GetLocation(), XPoint(nWidth1, nHeight1,nTemp));
|
|
// pFirst->SetHeight(nHeight);
|
|
// CString sText=(const TCHAR *)pFirst->GetText();
|
|
// for(n=1; n<lstTexts.Length(); n++) {
|
|
// TDbText *pText=lstTexts[n];
|
|
// sText += (const TCHAR *)pText->GetText();
|
|
// }
|
|
// pFirst->SetAlignment(XExplodeDraw::kBottomLeft);
|
|
// pFirst->SetLocation(ptBase);
|
|
// pFirst->SetText(sText);
|
|
//
|
|
// ss.Erase();
|
|
// AddToCurrentSpace((TDbText *)pFirst->clone(), Adesk::kTrue);
|
|
//}
|
|
|
|
void MergeText()
|
|
{
|
|
DList<TDbText> lstTexts;
|
|
RBList mask(RTDXF0, _T("TEXT,ATS_TEXT"), NULL);
|
|
PickSet ss(SS_FREE);
|
|
if(SelectEntities(_T("\n请选择要合并的文字段落<退出>: "), ss, mask)!=RTNORM)
|
|
return;
|
|
long lCount=ss.Length();
|
|
for(long i=0; i<lCount; i++) {
|
|
Entity ent=ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
|
ASSERT(pEnt);
|
|
if(pEnt->isKindOf(TDbText::desc()))
|
|
lstTexts.Append((TDbText *)pEnt->clone());
|
|
else if(pEnt->isKindOf(AcDbText::desc())){
|
|
TDbText *pText=new TDbText;
|
|
if(pText->ConvertFrom((AcDbText *)pEnt))
|
|
lstTexts.Append(pText);
|
|
else {
|
|
adsout << _T("\n发现不能转换的文字: ") << ((AcDbText *)pEnt)->textString();
|
|
delete pText;
|
|
return;
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
if(lstTexts.Length()<2)
|
|
return;
|
|
double nRot=lstTexts[0]->GetRotation();
|
|
double nHeight=lstTexts[0]->GetHeight();
|
|
for(int n=1; n<lstTexts.Length(); n++) {
|
|
if(!CT_IsExactSameDrt(nRot, lstTexts[n]->GetRotation(), _angSnap)) {
|
|
adsout << _T("\n旋转角度不一致, 无法合并!");
|
|
return;
|
|
}
|
|
nHeight=max(lstTexts[n]->GetHeight(), nHeight);
|
|
}
|
|
g_textCmpHeight=nHeight*DocGetPScale();//add by whl
|
|
lstTexts.QuickSort(CompTextPos);
|
|
TDbText *pFirst=lstTexts[0];
|
|
CString sText=(const TCHAR *)pFirst->GetText();
|
|
|
|
bool bMLine;
|
|
TCHAR sKey[256];
|
|
int nRet;
|
|
INITGET_BEG(0,_T("D"));
|
|
nRet=acedGetKword(_T("\n[合并为单行文字(D)]<合并为多行文字>:"),sKey);
|
|
INITGET_END();
|
|
if(nRet==RTNORM)
|
|
bMLine=false;
|
|
else if(nRet==RTNONE)
|
|
bMLine=true;
|
|
else if(nRet==RTCAN)
|
|
return;
|
|
|
|
TDbText*pLast=pFirst;
|
|
for(n=1; n<lstTexts.Length(); n++)
|
|
{
|
|
TDbText *pText=lstTexts[n];
|
|
if(!bMLine)
|
|
sText +=(const TCHAR*)pText->GetText();
|
|
else if(IsSameLine(pLast,pText))
|
|
//sText +=CString(_T(" "))+(const TCHAR*)pText->GetText();
|
|
sText +=(const TCHAR*)pText->GetText();//modified by whl on 051118
|
|
else
|
|
sText += CString(_T("\r\n"))+(const TCHAR *)pText->GetText();
|
|
pLast=pText;
|
|
}
|
|
XPoint ptLow,ptUp;
|
|
ss.GetExtend(ptLow,ptUp);
|
|
ptLow.y=ptUp.y;
|
|
double width=ptUp.x-ptLow.x;
|
|
|
|
PickSet ssRes(SS_FREE);
|
|
ssRes.IncludeBegin();
|
|
if(bMLine)
|
|
{
|
|
TDbMText *pMText=new TDbMText;
|
|
pMText->CopyPropertiesFrom(pFirst,AcDbMatchProperties::kSetAllFlagsOn);
|
|
pMText->SetLocation(ptLow);
|
|
pMText->SetText(sText);
|
|
pMText->SetLineSpace(0.4*nHeight);
|
|
XPoint pt0,pt1;
|
|
pMText->GetExtents2d(pt0,pt1);
|
|
if(pt1.x-pt0.x>_DIST_SNAP)//因为在页宽为0时有时有问题
|
|
width=pt1.x-pt0.x;
|
|
pMText->SetPageWidth(width,FALSE);
|
|
pMText->SetAlignment(XExplodeDraw::kLeft);
|
|
AddToCurrentSpace(pMText, Adesk::kTrue);
|
|
}
|
|
else
|
|
{
|
|
TDbText *pText=(TDbText*)(pFirst->clone());
|
|
pText->SetLocation(ptLow);
|
|
pText->SetText(sText);
|
|
AddToCurrentSpace(pText,Adesk::kTrue);
|
|
}
|
|
ssRes.IncludeEnd();
|
|
TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal);
|
|
TADSGePoint3d pt(Wcs2Ucs(ptLow));
|
|
XPoint xp;
|
|
nRet= TchExport::DragMovePickSet(ssRes,_T("\n移动到目标位置<替换原文字>:"),pt,xp);
|
|
if(nRet==RTNONE)
|
|
ss.Erase();
|
|
else if(nRet!=RTNORM)
|
|
ssRes.Erase();
|
|
}
|
|
|
|
// Command: 文字自调(调角度)
|
|
void TextAdjust()
|
|
{
|
|
RBList mask(RTDXF0, _T("ATS_TEXT"), NULL);
|
|
PickSet ss(SS_FREE);
|
|
if(SelectEntities(_T("\n请选择上华文字: "),ss, mask)!=RTNORM)
|
|
return;
|
|
|
|
for(long i=0;i<ss.Length();i++)
|
|
{
|
|
Entity ent=ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbText, pText);
|
|
if(pText)
|
|
{
|
|
BOOL bOldVal=g_bTextAdjust;
|
|
g_bTextAdjust=TRUE;
|
|
pText->transformBy(AcGeMatrix3d::kIdentity);
|
|
g_bTextAdjust = bOldVal;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
|
|
void TextTogAdjust()
|
|
{
|
|
BOOL bAdjust=g_bTextAdjust!=0;
|
|
int nAns=YesNoQuestion(_T("\n是否打开文字自调开关"), bAdjust? Q_YES : Q_NO);
|
|
BOOL bNewAdjust=(nAns==Q_YES)? TRUE : FALSE;
|
|
if(g_bTextAdjust!=bNewAdjust)
|
|
g_bTextAdjust=bNewAdjust;
|
|
}
|
|
|
|
|
|
void TextMaskArg(BOOL bTrue)
|
|
{
|
|
PickSet ss(SS_FREE);
|
|
RBList mask(RTDXF0, _T("ATS_SPACE,ATS_TEXT"), NULL);
|
|
if(SelectEntities(_T("\n选择文字:"), ss, mask)==RTNORM) {
|
|
long lCount=ss.Length();
|
|
for(long i=0L;i<lCount;i++) {
|
|
Entity ent=ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
|
|
if(pEnt->isKindOf(TDbText::desc())) {
|
|
((TDbText *)pEnt)->SetMaskFlag(bTrue);
|
|
} else if(pEnt->isKindOf(TDbSpace::desc())) {
|
|
((TDbSpace *)pEnt)->SetMask(bTrue);
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Command: 文字屏蔽
|
|
void TextMask()
|
|
{
|
|
TextMaskArg(TRUE);
|
|
}
|
|
|
|
void UnTextMask()
|
|
{
|
|
TextMaskArg(FALSE);
|
|
}
|
|
|
|
|
|
|
|
void ConvertHz(BOOL bToBig5, Entity ent, unsigned char *pData)
|
|
{
|
|
if(ent.Is(_T("INSERT"))) {
|
|
Entity entNext, entTemp=ent;
|
|
BOOL bUpdateIt=FALSE;
|
|
while(ads_entnext(entTemp, entNext)==RTNORM && entNext.Is(_T("ATTRIB"))) {
|
|
ConvertHz(bToBig5, entNext, pData);
|
|
entTemp=entNext;
|
|
entNext.FreeGroups();
|
|
bUpdateIt=TRUE;
|
|
}
|
|
if(bUpdateIt)
|
|
ent.Update();
|
|
} else {
|
|
/* 暂时不转扩展数据
|
|
RBList ebufx=DlgHzChg::bConvertWhole?
|
|
ads_entgetx(ent, (resbuf *)&Groups(_T("*"))) : ads_entget(ent);
|
|
resbuf * rb=ebufx;
|
|
int bModified=0;
|
|
while(DlgHzChg::bConvertWhole && (rb=AT_get_resbuf(rb, XD_STR))) {
|
|
assert(rb->resval.rstring!=NULL);
|
|
unsigned char szOut[2048]=_T("");
|
|
unsigned int nOut;
|
|
if(nConvertCode==CHG_FTOJ)
|
|
big_2_gb((unsigned char *)rb->resval.rstring, _tcslen(rb->resval.rstring), szOut, &nOut, szBuf);
|
|
else if(nConvertCode==CHG_JTOF)
|
|
gb_2_big((unsigned char *)rb->resval.rstring, _tcslen(rb->resval.rstring), szOut, &nOut, szBuf);
|
|
else AntiUnicode((unsigned char *)rb->resval.rstring, szOut);
|
|
free(rb->resval.rstring);
|
|
rb->resval.rstring=strdup((const char *)szOut);
|
|
bModified=1;
|
|
rb=rb->rbnext;
|
|
}
|
|
*/
|
|
// Then Change Data of Entity TEXT, ATTDEF, ATTRIB
|
|
XString sEntType;
|
|
ent.GetData(0, sEntType);
|
|
TCHAR szWild[40]=_T("TCH_*");
|
|
if(sEntType==_T("ATTDEF") || sEntType==_T("ATTRIB") || sEntType==_T("TEXT")) {
|
|
XString szOut; //[2048]=_T("");
|
|
TCHAR szIn[2048]=_T("");
|
|
ent.GetData(1, szIn);
|
|
int nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
|
|
if(nRet==RTNORM)
|
|
ent.SetData(1, (const TCHAR *)szOut);
|
|
if(sEntType==_T("ATTDEF") || sEntType==_T("ATTRIB")) {
|
|
VERIFY(ent.GetData(2, szIn)==RTNORM);
|
|
nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
|
|
if(nRet==RTNORM)
|
|
ent.SetData(2, (const TCHAR *)szOut);
|
|
if(sEntType==_T("ATTDEF")) {
|
|
VERIFY(ent.GetData(3, szIn)==RTNORM);
|
|
nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
|
|
if(nRet==RTNORM)
|
|
ent.SetData(3, (const TCHAR *)szOut);
|
|
}
|
|
}
|
|
ent.Modify();
|
|
/*
|
|
unsigned int nOut;
|
|
if(nConvertCode==CHG_FTOJ)
|
|
big_2_gb(szIn, _tcslen((TCHAR *)szIn), szOut, &nOut, szBuf);
|
|
else
|
|
gb_2_big(szIn, _tcslen((TCHAR *)szIn), szOut, &nOut, szBuf);
|
|
*/
|
|
|
|
} else if(ads_wcmatch(sEntType, sEntType)==RTNORM) {
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
|
|
if(pEnt) {
|
|
if(pEnt->isKindOf(TDbEntity::desc())) {
|
|
((TDbEntity *)pEnt)->ConvertText(bToBig5? GBToBig5 : Big5ToGB, pData);
|
|
} else if(pEnt->isKindOf(TDbCurveEntity::desc())) {
|
|
((TDbCurveEntity *)pEnt)->ConvertText(bToBig5? GBToBig5 : Big5ToGB, pData);
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
class CComplexToSimplyDlg : public CAcUiDialog
|
|
{
|
|
DECLARE_DYNAMIC(CComplexToSimplyDlg)
|
|
|
|
public:
|
|
CComplexToSimplyDlg(CWnd* pParent = NULL); // 标准构造函数
|
|
virtual ~CComplexToSimplyDlg();
|
|
virtual BOOL OnInitDialog();
|
|
|
|
// 对话框数据
|
|
enum { IDD = IDD_DLGSIMTOCOM };
|
|
protected:
|
|
static BOOL g_bToSimply;//TRUE 到简体 FALSE 到繁体
|
|
static BOOL g_bSelectAll;//TRUE 当前图面全选 FALSE 窗选
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
public:
|
|
afx_msg void OnBnClickedTocomplex();
|
|
afx_msg void OnBnClickedTosimply();
|
|
afx_msg void OnBnClickedAll();
|
|
afx_msg void OnBnClickedSelect();
|
|
afx_msg void OnBnClickedOk();
|
|
afx_msg void OnBnClickedCancel();
|
|
};
|
|
|
|
|
|
// CComplexToSimplyDlg 对话框
|
|
BOOL CComplexToSimplyDlg::g_bSelectAll = FALSE;
|
|
BOOL CComplexToSimplyDlg::g_bToSimply = TRUE;
|
|
|
|
extern void HzConvertArg(BOOL bToBig5, BOOL bSelectAll);
|
|
|
|
IMPLEMENT_DYNAMIC(CComplexToSimplyDlg, CAcUiDialog)
|
|
CComplexToSimplyDlg::CComplexToSimplyDlg(CWnd* pParent /*=NULL*/)
|
|
: CAcUiDialog(CComplexToSimplyDlg::IDD, pParent)
|
|
{
|
|
}
|
|
|
|
CComplexToSimplyDlg::~CComplexToSimplyDlg()
|
|
{
|
|
}
|
|
|
|
void CComplexToSimplyDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CAcUiDialog::DoDataExchange(pDX);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CComplexToSimplyDlg, CAcUiDialog)
|
|
ON_BN_CLICKED(IDC_TOCOMPLEX, OnBnClickedTocomplex)
|
|
ON_BN_CLICKED(IDC_TOSIMPLY, OnBnClickedTosimply)
|
|
ON_BN_CLICKED(IDC_ALL, OnBnClickedAll)
|
|
ON_BN_CLICKED(IDC_SELECT, OnBnClickedSelect)
|
|
ON_BN_CLICKED(IDOK, OnBnClickedOk)
|
|
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
BOOL CComplexToSimplyDlg::OnInitDialog()
|
|
{
|
|
BOOL bRes = CAcUiDialog::OnInitDialog();
|
|
CWnd* pWnd = NULL;
|
|
if (g_bToSimply)
|
|
pWnd = GetDlgItem(IDC_TOSIMPLY);
|
|
else
|
|
pWnd = GetDlgItem(IDC_TOCOMPLEX);
|
|
((CButton*)pWnd)->SetCheck(1);
|
|
if(g_bSelectAll)
|
|
pWnd = GetDlgItem(IDC_ALL);
|
|
else
|
|
pWnd = GetDlgItem(IDC_SELECT);
|
|
((CButton*)pWnd)->SetCheck(1);
|
|
return bRes;
|
|
}
|
|
// CComplexToSimplyDlg 消息处理程序
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedTocomplex()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
g_bToSimply = FALSE;
|
|
}
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedTosimply()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
g_bToSimply = TRUE;
|
|
}
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedAll()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
g_bSelectAll = TRUE;
|
|
}
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedSelect()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
g_bSelectAll = FALSE;
|
|
}
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedOk()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
// BeginEditorCommand(); //将控制权交给CAD
|
|
OnOK();
|
|
if (g_bToSimply)
|
|
{
|
|
if(g_bSelectAll)
|
|
HzConvertArg(FALSE, TRUE);
|
|
else
|
|
HzConvertArg(FALSE, FALSE);
|
|
}
|
|
else
|
|
{
|
|
if(g_bSelectAll)
|
|
HzConvertArg(TRUE, TRUE);
|
|
else
|
|
HzConvertArg(TRUE, FALSE);
|
|
}
|
|
// CompleteEditorCommand();//将控制权交给对话框
|
|
}
|
|
|
|
void CComplexToSimplyDlg::OnBnClickedCancel()
|
|
{
|
|
// TODO: 在此添加控件通知处理程序代码
|
|
OnCancel();
|
|
}
|
|
//modified by zkm on 050530
|
|
void HzConvertArg(BOOL bToBig5, BOOL bSelectAll)
|
|
{
|
|
unsigned char *szBuf=NULL;
|
|
const TCHAR *szTabFile=(!bToBig5)? _T("GB.TBL"):_T("BIG_5.TBL");
|
|
XString sTabPath(128);
|
|
if(!FindFile(szTabFile, sTabPath)) {
|
|
adsout << _T("\nCan not find file ") << szTabFile;
|
|
return;
|
|
}
|
|
|
|
FILE *fp=_tfopen(sTabPath, _T("rb"));
|
|
if(!fp) {
|
|
adsout << _T("\nCan not open file ") << szTabFile << _T(" to read!");
|
|
return;
|
|
}
|
|
|
|
// Zyu modify on 100726,去掉编译警告
|
|
//long fsize=filelength(fileno(fp));
|
|
long fsize = _filelength(_fileno(fp));
|
|
if(fsize>=65535L) {
|
|
_tprintf(_T("\nHz code table is large than 64K!"));
|
|
return;
|
|
}
|
|
szBuf=new unsigned char [(unsigned int)(fsize+1)];
|
|
fread(szBuf, sizeof(char), (unsigned int)fsize, fp);
|
|
fclose(fp);
|
|
szBuf[(unsigned int)fsize]=0;
|
|
|
|
PickSet ssAll(SS_FREE);
|
|
if(!bSelectAll)
|
|
{
|
|
RBList mask(RTDXF0, _T("TEXT,ATTDEF,INSERT,TCH_*"), NULL);
|
|
if(SelectEntities(_T("\n选择包含文字的图元:"), ssAll, mask)==RTNORM)
|
|
{
|
|
long len=ssAll.Length();
|
|
for(long i=0; i<len; i++)
|
|
{
|
|
Entity ent=ssAll[i];
|
|
ConvertHz(bToBig5, ent, szBuf);
|
|
}
|
|
}
|
|
}
|
|
//ADD BY ZKM
|
|
else
|
|
{
|
|
ssAll.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TEXT,ATTDEF,INSERT,TCH_*"), NULL));
|
|
long len=ssAll.Length();
|
|
for(long i=0; i<len; i++)
|
|
{
|
|
Entity ent=ssAll[i];
|
|
ConvertHz(bToBig5, ent, szBuf);
|
|
}
|
|
}
|
|
delete[] szBuf;
|
|
}
|
|
//void HzConvertArg(BOOL bToBig5)
|
|
//{
|
|
// unsigned char *szBuf=NULL;
|
|
// char *szTabFile=(!bToBig5)? "GB.TBL":"BIG_5.TBL";
|
|
// XString sTabPath(128);
|
|
// if(!FindFile(szTabFile, sTabPath)) {
|
|
// adsout << "\nCan not find file " << szTabFile;
|
|
// return;
|
|
// }
|
|
//
|
|
// FILE *fp=fopen(sTabPath, "rb");
|
|
// if(!fp) {
|
|
// adsout << "\nCan not open file " << szTabFile << " to read!";
|
|
// return;
|
|
// }
|
|
//
|
|
// long fsize=filelength(fileno(fp));
|
|
// if(fsize>=65535L) {
|
|
// printf("\nHz code table is large than 64K!");
|
|
// return;
|
|
// }
|
|
// szBuf=new unsigned char [(unsigned int)(fsize+1)];
|
|
// fread(szBuf, sizeof(char), (unsigned int)fsize, fp);
|
|
// fclose(fp);
|
|
// szBuf[(unsigned int)fsize]=0;
|
|
//
|
|
//
|
|
// PickSet ssAll(SS_FREE);
|
|
// RBList mask(RTDXF0, "TEXT,ATTDEF,INSERT,TCH_*", NULL);
|
|
// if(SelectEntities("\n选择包含文字的图元:", ssAll, mask)==RTNORM) {
|
|
// long len=ssAll.Length();
|
|
// for(long i=0; i<len; i++) {
|
|
// Entity ent=ssAll[i];
|
|
// ConvertHz(bToBig5, ent, szBuf);
|
|
// }
|
|
// }
|
|
// delete[] szBuf;
|
|
//}
|
|
//void BIG5_GB()
|
|
//{
|
|
// HzConvertArg(FALSE);
|
|
//}
|
|
|
|
//add by zkm
|
|
void BIG5_GB()//简繁转换
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
CComplexToSimplyDlg simDlg;
|
|
simDlg.DoModal();
|
|
}
|
|
|
|
|
|
void FindAndReplace0()
|
|
{
|
|
RBList mask(RTDXF0, _T("ATS_TEXT"), NULL);
|
|
Entity ent;
|
|
XString sSubText, sRepText;
|
|
if(ads_getstring(0, _T("\n输入待查找文字:"), sSubText)==RTNORM &&
|
|
ads_getstring(0, _T("\n待替换文字:"), sRepText)==RTNORM &&
|
|
ent.FilterSelect(_T("\n选择文字:"), mask)==RTNORM) {
|
|
int nPos=0;
|
|
XScreenDc dc(1,1);
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbText, pText);
|
|
CString csText=pText->GetText();
|
|
XPoint ptExt=pText->GetExtents(); //x, y方向的尺寸
|
|
XPoint ptTextBase=pText->Align2Base(pText->GetLocation(), ptExt); //左下角
|
|
double nRot=pText->GetRotation(); //转角
|
|
|
|
XPoly2D polyExt(1);
|
|
BOOL bRepAll=FALSE;
|
|
int nFindAndReplace=0, nFindNum=0;
|
|
while(1) {
|
|
int nFindPos=csText.Find(sSubText, nPos);
|
|
if(nFindPos<0)
|
|
break;
|
|
|
|
nFindNum++;
|
|
// Zyu modify on 100726,去掉编译警告
|
|
//XString sPrefix(_tcslen(csText)+1), sSuffix(_tcslen(csText)+1);
|
|
XString sPrefix((int)_tcslen(csText)+1), sSuffix((int)_tcslen(csText)+1);
|
|
StrCpy(sPrefix, csText, &((const TCHAR *)csText)[nFindPos]); //前面的字符串
|
|
StrCpy(sSuffix, &((const TCHAR *)csText)[nFindPos+_tcslen(sSubText)], NULL);
|
|
XString sKeyWord;
|
|
if(!bRepAll) {
|
|
XPoint ptLowLeft;
|
|
TDbText *pClone=(TDbText *)pText->clone();
|
|
pClone->SetText(sPrefix);
|
|
XPoint extTemp=pClone->GetExtents();
|
|
ads_polar(ptTextBase, nRot, extTemp.x, ptLowLeft);
|
|
pClone->SetText(sSubText);
|
|
extTemp = pClone->GetExtents();
|
|
delete pClone;
|
|
|
|
// 求找到的位置范围
|
|
polyExt.Reset();
|
|
polyExt.AppendNode(ptLowLeft);
|
|
XPoint ptTemp;
|
|
ads_polar(ptLowLeft, nRot, extTemp.x, ptTemp);
|
|
polyExt.AppendNode(ptTemp);
|
|
ads_polar(ptTemp, nRot+PI/2, extTemp.y, ptTemp);
|
|
polyExt.AppendNode(ptTemp);
|
|
ads_polar(ptLowLeft, nRot+PI/2, extTemp.y, ptTemp);
|
|
polyExt.AppendNode(ptTemp);
|
|
|
|
// 确保找到的位置范围可见
|
|
XPoint ptMin, ptMax;
|
|
polyExt.GetExtend(ptMin, ptMax);
|
|
AssureOnScreen(ptMin, ptMax);
|
|
dc << polyExt;
|
|
|
|
adsout << _T("\n替换[R]/全部替换[A]/下一个[N]/<结束>:");
|
|
int nRetCode;
|
|
INITGET_BEG(0, _T("R A N"));
|
|
nRetCode=ads_getkword(_T(""), sKeyWord);
|
|
INITGET_END();
|
|
|
|
ads_redraw(NULL, 1);
|
|
if(nRetCode!=RTNORM)
|
|
return;
|
|
}
|
|
if(bRepAll || sKeyWord[0]==_T('R') || sKeyWord[0]==_T('A')) { //替换并转到下一个
|
|
CString csNewString;
|
|
csNewString += (const TCHAR *)sPrefix;
|
|
csNewString += (const TCHAR *)sRepText;
|
|
csNewString += (const TCHAR *)sSuffix;
|
|
// Zyu modify on 100726,去掉编译警告
|
|
//nPos = nFindPos + _tcslen(sRepText);
|
|
nPos = nFindPos + (int)_tcslen(sRepText);
|
|
//if(nPos==nFindPos)
|
|
// nPos++;
|
|
csText=csNewString;
|
|
if(pText->upgradeOpen()==Acad::eOk) {
|
|
pText->SetText(csNewString);
|
|
pText->downgradeOpen();
|
|
} else {
|
|
adsout << _T("\n无法修改文字对象!");
|
|
return;
|
|
}
|
|
nFindAndReplace++;
|
|
if(!bRepAll) {
|
|
if(sKeyWord[0]==_T('A'))
|
|
bRepAll=TRUE;
|
|
}
|
|
} else if(sKeyWord[0]==_T('N')) {
|
|
//if(!nFindPos)
|
|
// nPos ++;
|
|
//else
|
|
// Zyu modify on 100726,去掉编译警告
|
|
//nPos=nFindPos+_tcslen(sSubText);
|
|
nPos = nFindPos + (int)_tcslen(sSubText);
|
|
}
|
|
}
|
|
adsout << _T("\n找到") << nFindNum << _T("个; 替换") << nFindAndReplace << _T("个");
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
|
|
void ReplaceFindText()
|
|
{
|
|
RBList mask(RTDXF0, _T("TCH_*"), NULL);
|
|
PickSet ss(SS_FREE);
|
|
XString sSubText, sRepText;
|
|
if(ads_getstring(0, _T("\n输入待查找文字:"), sSubText)!=RTNORM ||
|
|
ads_getstring(0, _T("\n待替换文字:"), sRepText)!=RTNORM ||
|
|
SelectEntities(_T("\n选择文字:"), ss, mask)!=RTNORM)
|
|
return;
|
|
|
|
XScreenDc dc(1,1);
|
|
BOOL bRepAll=FALSE;
|
|
int nFindAndReplace=0, nFindNum=0;
|
|
|
|
// sg add 110504,解决查找时,可能受“全字匹配”影响的问题,临时去掉全字匹配的设置
|
|
DWORD dwMaskOld = g_FindParser.GetFindOption(),
|
|
dwMaskNew = dwMaskOld;
|
|
dwMaskNew = dwMaskNew & ~FP_WHOLE_WORD;
|
|
g_FindParser.SetFindOption(dwMaskNew);
|
|
|
|
long lCount=ss.Length();
|
|
for(long i=0L; i<lCount; i++) {
|
|
Entity ent=ss[i];
|
|
int nPos=0;
|
|
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead,TDbEntity, pText);
|
|
if(!pText) continue;
|
|
TTextPosition pos;
|
|
while(1) {
|
|
TTextRange range;
|
|
TTextPosition posFind=pText->FindSubText(sSubText, pos, &range);
|
|
if(!posFind)
|
|
break;
|
|
|
|
nFindNum++;
|
|
XString sKeyWord;
|
|
if(!bRepAll) {
|
|
XPoint ptMin, ptMax;
|
|
if(range.GetExtend(ptMin, ptMax)) {
|
|
AssureInCurrentView(ptMin, ptMax);
|
|
for(int n=0; n<range.m_lstRanges.Length(); n++)
|
|
dc << (*range.m_lstRanges[n]);
|
|
}
|
|
adsout << _T("\n替换[R]/全部替换[A]/下一个[N]/<结束>:");
|
|
int nRetCode;
|
|
INITGET_BEG(0, _T("R A N"));
|
|
nRetCode=ads_getkword(_T(""), sKeyWord);
|
|
INITGET_END();
|
|
ads_redraw(NULL, 1);
|
|
if(nRetCode!=RTNORM)
|
|
return;
|
|
}
|
|
if(bRepAll || sKeyWord[0]==_T('R') || sKeyWord[0]==_T('A')) { //替换并转到下一个
|
|
if(pText->upgradeOpen()==Acad::eOk) {
|
|
pos=pText->ReplaceSubText(posFind, sRepText);
|
|
pText->downgradeOpen();
|
|
} else {
|
|
adsout << _T("\n无法修改文字对象!");
|
|
break;;
|
|
}
|
|
nFindAndReplace++;
|
|
if(!bRepAll) {
|
|
if(sKeyWord[0]==_T('A'))
|
|
bRepAll=TRUE;
|
|
}
|
|
} else if(sKeyWord[0]==_T('N')) {
|
|
|
|
}
|
|
if(!pos)
|
|
break;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
// sg add 110504,解决查找时,可能受“全字匹配”影响的问题,恢复默认
|
|
g_FindParser.SetFindOption(dwMaskOld);
|
|
|
|
adsout << _T("\n找到") << nFindNum << _T("个; 替换") << nFindAndReplace << _T("个");
|
|
}
|