// FindAndReplaceDlg.cpp : implementation file // #include "stdafx.h" #include "WGroupCtrl.h" #include "WGroupDlg.h" #include "FindAndReplaceDlg.h" #include "actrans.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static CFindAndReplaceDlg *pDlg = NULL; // Zyu delete on 101019,代码封装到CFARInsert类中 //int GetAttribNum(AcDbBlockReference &entInsert) //{ // int num=0; // AcDbObjectIterator *pIter=entInsert.attributeIterator(); // for(pIter->start(); !pIter->done(); pIter->step()) { // num++; // } // delete pIter; // return num; //} // //BOOL GetAttribText(AcDbBlockReference &entInsert, int idx, TDbText &text, AcDbObjectId &idObjRet) //{ // AcDbObjectIterator *pIter=entInsert.attributeIterator(); // int num=0; // BOOL bRet=FALSE; // for(pIter->start(); !pIter->done(); pIter->step()) { // if(num==idx) { // AcDbObjectId idObj=pIter->objectId(); // OPENOBJ_BEGIN(idObj, AcDb::kForRead, AcDbAttribute, pAttr); // if(pAttr && !pAttr->isInvisible()) { // if(text.ConvertFrom(pAttr)) { // idObjRet=idObj; // bRet=TRUE; // } // } // OPENOBJ_END(); // break; // } // num++; // } // delete pIter; // return bRet; //} // Zyu add on 100927,查找对象文本的几个函数 // Begin //// 搜索上华对象内的文字 //TTextPosition FindInTDbEnt(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) //{ // TDbEntity *pText = TDbEntity::cast(pEnt); // return pText->FindSubText(sSubText, posStart, pRange); //} // //TTextPosition FindInInsert(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) //{ // TTextPosition posFind; // XPushMemVar vTemp(g_bTextStyleEx, FALSE); // AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt); // int nLen=GetAttribNum(*pInsert); // //int nCode=RTNONE; // TTextPosition posNext=posStart; // for(int i=posStart.m_nCookies; i vTemp(g_bTextStyleEx, FALSE); // TDbText text; // AcDbText *pText = AcDbText::cast(pEnt); // if(text.ConvertFrom(pText)) // { // posFind = text.FindSubText(sSubText, posStart, pRange); // } // return posFind; //} // //TTextPosition FindInMText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) //{ // TTextPosition posFind; // XPushMemVar vTemp(g_bTextStyleEx, FALSE); // AcDbVoidPtrArray arEnts; // if (Acad::eOk == pEnt->explode(arEnts)) // { // for (int i = posStart.m_nCookies; i < arEnts.length(); i++) // { // posFind = FindInText((AcDbEntity*)arEnts.at(i), sSubText, posStart, pRange); // if (!!posFind) // { // break; // } // else // { // posStart.m_nTextPos = -1; // } // } // ReleaseEntSet(arEnts); // } // return posFind; //} // //TTextPosition FindInDimension(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) //{ // TTextPosition posFind; // AcDbDimension *pDim = AcDbDimension::cast(pEnt); // if (NULL != pDim) // { // AcDbVoidPtrArray arEnts; // if (Acad::eOk == pDim->explode(arEnts)) // { // for(int i = 0; i < arEnts.length(); i++) // { // AcDbEntity *pEntity = (AcDbEntity*)arEnts.at(i); // AcDbMText *pText = AcDbMText::cast(pEntity); // if (NULL != pText) // { // posFind = FindInMText(pText, sSubText, posStart, pRange); // } // } // ReleaseEntSet(arEnts); // } // } // return posFind; //} //// End // Zyu delete on 101019,代码移植到CFARUtil类中 /* TTextPosition FindEntText(Entity ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) { TTextPosition posFind; if(!sSubText || !sSubText[0]) return posFind; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(pEnt->isKindOf(TDbEntity::desc())) { TDbEntity *pText=TDbEntity::cast(pEnt); posFind=pText->FindSubText(sSubText, posStart, pRange); } else if(pEnt->isKindOf(AcDbText::desc())) { XPushMemVar vTemp(g_bTextStyleEx, FALSE); TDbText text; AcDbText *pText=AcDbText::cast(pEnt); if(text.ConvertFrom(pText)) { posFind = text.FindSubText(sSubText, posStart, pRange); } } else if(pEnt->isA()==AcDbBlockReference::desc()) { XPushMemVar vTemp(g_bTextStyleEx, FALSE); AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt); int nLen=GetAttribNum(*pInsert); //int nCode=RTNONE; TTextPosition posNext=posStart; for(int i=posStart.m_nCookies; iisKindOf(TDbEntity::desc())) { TDbEntity *pText=TDbEntity::cast(pEnt); if(pText->upgradeOpen()==Acad::eOk) { posStart = pText->ReplaceSubText(posFind, szRepText); pText->downgradeOpen(); } else { adsout << _T("\n无法修改文字对象!"); } } else if(pEnt->isKindOf(AcDbText::desc())) { XPushMemVar vTemp(g_bTextStyleEx, FALSE); TDbText text; AcDbText *pText=AcDbText::cast(pEnt); if(text.ConvertFrom(pText)) { posStart = text.ReplaceSubText(posFind, szRepText); if(pText->upgradeOpen()==Acad::eOk) { pText->setTextString((const TCHAR *)text.GetText()); pText->downgradeOpen(); } else { adsout << _T("\n无法修改文字对象!"); } } } else if(pEnt->isA()==AcDbBlockReference::desc()) { XPushMemVar vTemp(g_bTextStyleEx, FALSE); AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt); int numAttrib=GetAttribNum(*pInsert);; posStart.m_nBufLen=_tcslen(szRepText); posStart.m_nCookies=posFind.m_nCookies; if(!posFind || posFind.m_nCookies>=(unsigned int)numAttrib) { ; } else { TDbText dimText; TTextPosition posRet; AcDbObjectId idObj; if(GetAttribText(*pInsert, posFind.m_nCookies, dimText, idObj)) { posRet=dimText.ReplaceSubText(posFind, szRepText); OPENOBJ_BEGIN(idObj, AcDb::kForWrite, AcDbAttribute, pText); if(pText) { pText->setTextString(dimText.GetText()); } OPENOBJ_END(); } if(!posRet) { if(posRet.m_nCookies<(unsigned int)(numAttrib-1)) { posRet.m_nCookies=posFind.m_nCookies+1; posRet.m_nTextPos=0; } } posStart=posRet; } } OPENOBJ_END(); return posStart; } */ ////////////////////////////////////////////////////////////////////////// // Zyu add on 100925,关联XML和表格的类 CTextTypeFileReader::CTextTypeFileReader() { ::CoInitialize(NULL); m_pLstCtrl = NULL; m_sFilePath = _T(""); m_pDoc = NULL; } CTextTypeFileReader::~CTextTypeFileReader() { ::CoUninitialize(); m_pLstCtrl = NULL; m_pDoc = NULL; } // 设置xml文件位置 void CTextTypeFileReader::SetFilePath(LPCTSTR pszFilePath) { m_sFilePath = pszFilePath; } // 设置xml文件关联的列表控件 void CTextTypeFileReader::SetListCtrl(CListCtrl *pCmbCtrl) { m_pLstCtrl = pCmbCtrl; } // 初始化 bool CTextTypeFileReader::Init() { HRESULT hr = m_pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60)); return SUCCEEDED(hr); } // 保存列表控件内容到xml文件 bool CTextTypeFileReader::SaveToXML() { if (NULL == m_pDoc || NULL == m_pLstCtrl) { return false; } // 读取文件 if(m_pDoc->load((LPCTSTR)m_sFilePath) != VARIANT_TRUE) { return false; } // 得到settings一级 MSXML2::IXMLDOMElementPtr pRoot = m_pDoc->GetdocumentElement(); if (NULL == pRoot) { return false; } MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes(); if (NULL == pNodeList) { return false; } pNodeList->reset(); for (int i = 0; i < pNodeList->Getlength(); i++) { // 得到content一级 MSXML2::IXMLDOMNodePtr pNode = pNodeList->nextNode(); if (NULL != pNode) { CString sName; BOOL bSelected = false; // 得到content里的属性 MSXML2::IXMLDOMNamedNodeMapPtr pNodeMap = pNode->Getattributes(); if (NULL != pNodeMap) { MSXML2::IXMLDOMNodePtr pNameAttr = pNodeMap->getNamedItem(_bstr_t(_T("name"))); if (NULL != pNameAttr) { _variant_t var = pNameAttr->GetnodeValue(); sName = (LPCTSTR)_bstr_t(var.bstrVal); MSXML2::IXMLDOMNodePtr pSeletedAttr = pNodeMap->getNamedItem(_bstr_t(_T("selected"))); // 如果名称相同,更新content中的selected值 if (NULL != pSeletedAttr && sName == m_pLstCtrl->GetItemText(i, 0)) { pSeletedAttr->PutnodeValue((_variant_t)(m_pLstCtrl->GetCheck(i) != FALSE)); } } } } } m_pDoc->save((LPCTSTR)m_sFilePath); return true; } // 读取xml文件内容到列表 bool CTextTypeFileReader::LoadToCmbCtrl() { if (NULL == m_pDoc || NULL == m_pLstCtrl) { return false; } // 在表格中添加两列 m_pLstCtrl->InsertColumn(0, _T(""), LVCFMT_CENTER, 150); m_pLstCtrl->InsertColumn(0, _T(""), LVCFMT_CENTER, 150); // 读取文件 m_pDoc->async = VARIANT_FALSE; m_pDoc->validateOnParse = VARIANT_FALSE; if(m_pDoc->load((LPCTSTR)m_sFilePath) != VARIANT_TRUE) { return false; } // 得到settings一级 MSXML2::IXMLDOMElementPtr pRoot = m_pDoc->GetdocumentElement(); if (NULL == pRoot) { return false; } // 得到content一级 MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes(); if (NULL == pNodeList) { return false; } pNodeList->reset(); // 遍历每一个content,获得name,selected,DXF码 for (int i = 0; i < pNodeList->Getlength(); i++) { MSXML2::IXMLDOMNodePtr pNode = pNodeList->nextNode(); if (NULL != pNode) { CString sName; BOOL bSelected = false; MSXML2::IXMLDOMNamedNodeMapPtr pNodeMap = pNode->Getattributes(); if (NULL != pNodeMap) { MSXML2::IXMLDOMNodePtr pNameAttr = pNodeMap->getNamedItem(_bstr_t(_T("name"))); if (NULL != pNameAttr) { _variant_t var = pNameAttr->GetnodeValue(); sName = (LPCTSTR)_bstr_t(var.bstrVal); } MSXML2::IXMLDOMNodePtr pSeletedAttr = pNodeMap->getNamedItem(_bstr_t(_T("selected"))); if (NULL != pSeletedAttr) { _variant_t var = pSeletedAttr->GetnodeValue(); bSelected = _tcscmp((LPCTSTR)var.bstrVal, _T("0")); } } MSXML2::IXMLDOMNodeListPtr pNodeLst = pNode->GetchildNodes(); CString sDXFCode; if (NULL != pNodeLst) { for (int j = 0; j < pNodeLst->Getlength(); j++) { MSXML2::IXMLDOMNodePtr pNodeDxf = pNodeLst->nextNode(); if (NULL != pNodeDxf) { _bstr_t var = pNodeDxf->Gettext(); sDXFCode += (LPCTSTR)var; } } } // 信息添加到表格 int iPos = m_pLstCtrl->GetItemCount(); m_pLstCtrl->InsertItem(iPos, sName); m_pLstCtrl->SetItemText(iPos, 1, sDXFCode); m_pLstCtrl->SetCheck(iPos, bSelected); } } return true; } ////////////////////////////////////////////////////////////////////////// // CSymDefDlg 对话框 // Zyu add on 100925,通配符定义对话框 IMPLEMENT_DYNAMIC(CSymDefDlg, CDialog) CSymDefDlg::CSymDefDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CSymDefDlg::IDD, pParent) { } CSymDefDlg::~CSymDefDlg() { } BOOL CSymDefDlg::OnInitDialog() { // 填入表格的内容 CListCtrl *pLstCtrl = (CListCtrl*)GetDlgItem(IDC_LST_DEFINE); pLstCtrl->SetExtendedStyle(pLstCtrl->GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); if (NULL != pLstCtrl) { pLstCtrl->InsertColumn(0, _T("字符"), LVCFMT_LEFT, 100); pLstCtrl->InsertColumn(1, _T("定义"), LVCFMT_LEFT, 400); pLstCtrl->InsertItem(0, _T("#(井号)")); pLstCtrl->SetItemText(0, 1, _T("匹配任意数字字符")); pLstCtrl->InsertItem(1, _T("@(At)")); pLstCtrl->SetItemText(1, 1, _T("匹配任意字母字符")); pLstCtrl->InsertItem(2, _T(".(句号)")); pLstCtrl->SetItemText(2, 1, _T("匹配任意非字母数字字符")); pLstCtrl->InsertItem(3, _T("*(星号)")); pLstCtrl->SetItemText(3, 1, _T("匹配任意字符串,可以在搜索字符串的任意位置使用")); pLstCtrl->InsertItem(4, _T("?(问号)")); pLstCtrl->SetItemText(4, 1, _T("匹配任意单个字符,例如,?BC匹配ABC、3BC等等")); pLstCtrl->InsertItem(5, _T("~(波浪号)")); pLstCtrl->SetItemText(5, 1, _T("匹配不包含自身的任意字符串,例如~*AB*匹配所以有不包含AB的字符串")); pLstCtrl->InsertItem(6, _T("[]")); pLstCtrl->SetItemText(6, 1, _T("匹配括号中包含的任意一个字符,例如,[AB]C匹配AC和BC")); pLstCtrl->InsertItem(7, _T("[~]")); pLstCtrl->SetItemText(7, 1, _T("匹配括号中未包含的任意字符,例如,[~AB]C匹配XC而不匹配AC")); pLstCtrl->InsertItem(8, _T("[-]")); pLstCtrl->SetItemText(8, 1, _T("指定单个字符的范围,例如,[A-G]C匹配AC、BC等,直到GC,但不匹配HC")); pLstCtrl->InsertItem(9, _T("'(单引号)")); pLstCtrl->SetItemText(9, 1, _T("逐字读取其后的字符;例如,'~AB匹配~AB")); } return CDialog::OnInitDialog(); } BEGIN_MESSAGE_MAP(CSymDefDlg, CModelessDialog) END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// // Zyu add on 100917,设置选项 BOOL CFindAndReplaceDlg::m_bFind = true; BOOL CFindAndReplaceDlg::m_bReplace = true; BOOL CFindAndReplaceDlg::m_bPrefix = true; BOOL CFindAndReplaceDlg::m_bSuffix = false; BOOL CFindAndReplaceDlg::m_bIncrement = true; BOOL CFindAndReplaceDlg::m_bAutoZoom = true; BOOL CFindAndReplaceDlg::m_bCaseSencitive = true; BOOL CFindAndReplaceDlg::m_bWordMatch = false; BOOL CFindAndReplaceDlg::m_bWordMatchOld = false; BOOL CFindAndReplaceDlg::m_bWildcards = false; BOOL CFindAndReplaceDlg::m_bWildcardsOld = false; BOOL CFindAndReplaceDlg::m_bSearchXref = false; BOOL CFindAndReplaceDlg::m_bSearchBlock = true; BOOL CFindAndReplaceDlg::m_bNoHidden = true; BOOL CFindAndReplaceDlg::m_bWidthSensitive = false; BOOL CFindAndReplaceDlg::m_bGrpSetStatus = false; int CFindAndReplaceDlg::m_iReplaceType = 0; CFindAndReplaceDlg::CFindAndReplaceDlg(CWnd* pParent /*=NULL*/) : WGroupDlg(CFindAndReplaceDlg::IDD, pParent), m_ssText(SS_FREE), m_ssTextAll(SS_FREE) ,m_dwPosFind(0) ,m_dwPosReplace(0) ,m_bBlkAttrib(0) ,m_strDefaultFilter(_T("")) { //{{AFX_DATA_INIT(CFindAndReplaceDlg) m_sFindText = _T(""); m_sReplaceText =_T(""); m_iFindRange = -1; // Zyu delete on 100916,删除无用数据 //m_bAttdef = FALSE; //}}AFX_DATA_INIT m_nTextNum = 0; m_nTextNumAll = 0; m_sOldFindText = _T(""); m_bIsFindEnd = FALSE; m_crPrompt = RGB(0,0,0); } void CFindAndReplaceDlg::DoDataExchange(CDataExchange* pDX) { WGroupDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFindAndReplaceDlg) DDX_Control(pDX, IDC_COMBO_FINDTEXTS, m_comboFindText); DDX_Control(pDX, IDC_COMBO_REPLACETEXT, m_comboReplaceText); DDX_Control(pDX, IDC_CMB_PREFIX, m_cmbPrefix); DDX_Control(pDX, IDC_CMB_SUFFIX, m_cmbSuffix); DDX_Control(pDX, IDC_CMB_INCREMENT, m_cmbIncrement); DDX_CBString(pDX, IDC_COMBO_FINDTEXTS, m_sFindText); DDX_CBString(pDX, IDC_COMBO_REPLACETEXT, m_sReplaceText); DDX_CBString(pDX, IDC_CMB_PREFIX, m_sPrefixText); DDX_CBString(pDX, IDC_CMB_SUFFIX, m_sSuffixText); DDX_CBString(pDX, IDC_CMB_INCREMENT, m_sIncrementText); DDX_CBIndex(pDX, IDC_COMBO_FINDRANGE, m_iFindRange); // Zyu delete on 100916,删除无用控件 //DDX_Check(pDX, IDC_CHECK_ATTDEF, m_bAttdef); DDX_Check(pDX, IDC_CHK_SEARCH, m_bFind); DDX_Check(pDX, IDC_CHK_REPLACE, m_bReplace); DDX_Check(pDX, IDC_CHK_PREFIX, m_bPrefix); DDX_Check(pDX, IDC_CHK_SUFFIX, m_bSuffix); DDX_Check(pDX, IDC_CHK_INCREMENT, m_bIncrement); DDX_Check(pDX, IDC_CHK_AUTOZOOM, m_bAutoZoom); DDX_Check(pDX, IDC_CHK_CASESENSITIVE, m_bCaseSencitive); DDX_Check(pDX, IDC_CHK_WORDMATCH, m_bWordMatch); DDX_Check(pDX, IDC_CHK_WILDCARDS, m_bWildcards); DDX_Check(pDX, IDC_CHK_SEARCHXREF, m_bSearchXref); DDX_Check(pDX, IDC_CHK_SEARCHBLOCK, m_bSearchBlock); DDX_Check(pDX, IDC_CHK_NOHIDDEN, m_bNoHidden); DDX_Check(pDX, IDC_CHK_WIDTHSENSITIVE, m_bWidthSensitive); DDX_Control(pDX, IDC_STC_SET, m_grpSet); DDX_GroupStatus(pDX,IDC_STC_SET, m_bGrpSetStatus); DDX_Control(pDX, IDC_LST_TYPE, m_lstStyle); //}}AFX_DATA_MAP DDX_Radio(pDX, IDC_RAD_REPLACE, m_iReplaceType); } BEGIN_MESSAGE_MAP(CFindAndReplaceDlg, WGroupDlg) //{{AFX_MSG_MAP(CFindAndReplaceDlg) ON_BN_CLICKED(IDC_BUTTON_FIND, OnButtonFind) ON_BN_CLICKED(IDC_BUTTON_REPLACE, OnButtonReplace) ON_BN_CLICKED(IDC_BUTTON_REPLACEALL, OnButtonReplaceall) ON_BN_CLICKED(IDC_BUTTON_SELECT, OnButtonSelect) ON_CBN_SELCHANGE(IDC_COMBO_FINDRANGE, OnSelchangeComboFindrange) ON_CBN_EDITCHANGE(IDC_COMBO_FINDTEXTS, OnCbnEditchangeComboFindtexts) ON_CBN_KILLFOCUS(IDC_COMBO_REPLACETEXT, OnCbnKillfocusComboReplacetext) ON_CBN_KILLFOCUS(IDC_CMB_PREFIX, OnCbnKillfocusCmbPrefix) ON_CBN_KILLFOCUS(IDC_CMB_SUFFIX, OnCbnKillfocusCmbSuffix) ON_CBN_KILLFOCUS(IDC_CMB_INCREMENT, OnCbnKillfocusCmbIncrement) ON_CBN_KILLFOCUS(IDC_COMBO_FINDTEXTS, OnCbnKillfocusComboFindtexts) ON_CBN_SELCHANGE(IDC_COMBO_FINDTEXTS, OnCbnSelchangeComboFindtexts) ON_WM_DESTROY() ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_RAD_REPLACE, OnBnClickedRadReplace) ON_BN_CLICKED(IDC_RAD_INFIX, OnBnClickedRadInfix) ON_BN_CLICKED(IDC_RAD_INCREMENT, OnBnClickedRadIncrement) ON_BN_CLICKED(IDC_CHK_SEARCH, OnBnClickedChkSearch) ON_BN_CLICKED(IDC_CHK_REPLACE, OnBnClickedChkReplace) ON_BN_CLICKED(IDC_CHK_PREFIX, OnBnClickedChkPrefixOrSuffix) ON_BN_CLICKED(IDC_CHK_SUFFIX, OnBnClickedChkPrefixOrSuffix) ON_BN_CLICKED(IDC_CHK_INCREMENT, OnBnClickedChkIncrement) ON_BN_CLICKED(IDC_CHK_WORDMATCH, OnBnClickedChkWordmatch) ON_BN_CLICKED(IDC_CHK_WILDCARDS, OnBnClickedChkWildcards) ON_BN_CLICKED(IDC_CHK_SEARCHXREF, OnBnClickedChkSearchxref) ON_BN_CLICKED(IDC_CHK_CASESENSITIVE, OnBnClickedChkCasesensitive) ON_BN_CLICKED(IDC_CHK_NOHIDDEN, OnBnClickedChkNohidden) ON_BN_CLICKED(IDC_CHK_WIDTHSENSITIVE, OnBnClickedChkWidthsensitive) ON_BN_CLICKED(IDC_CHK_SEARCHBLOCK, OnBnClickedChkSearchblock) ON_BN_CLICKED(IDC_BTN_FIND, OnBnClickedBtnFind) ON_BN_CLICKED(IDC_BTN_REPLACE, OnBnClickedBtnReplace) ON_BN_CLICKED(IDC_BTN_MARKALL, OnBnClickedBtnMarkall) ON_BN_CLICKED(IDC_BTN_UNMARKALL, OnBnClickedBtnUnmarkall) ON_BN_CLICKED(IDC_BTN_WILDCARDS, OnBnClickedBtnWildcards) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LST_TYPE, OnLvnItemchangedLstType) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() //查找字符串 void CFindAndReplaceDlg::OnButtonFind() { UpdateData( TRUE ); // Zyu modify on 101028,新需求允许不给出查找内容 //if (m_sFindText.IsEmpty()) //{ // AfxMessageBox(_T("查找不能为空!")); // GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus(); // return; //} // Zyu add on 101013,设置查找选项 SetFindOption(); // Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串 //InsertFindText(); //InsertReplaceText(); //add by xlc on 090630 解决了查找时替换字符串改变的问题 //查找字符串 if (!FindText()) { return; } CString str; // Zyu add on 101029,提示文字变为黑色 m_crPrompt = RGB(0, 0, 0); str.Format(_T("已找到%d个"),m_nFindCount); GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str); //判断是否完成对整个图形或者当前选择图形的查找 if ( m_nTextNum >= m_nTextNumAll) { m_bIsFindEnd = TRUE; CString str; // Zyu modify on 101216,查找完毕后,弹出对话框提示 //str.Format(_T("共找到%d个\r\n查找完毕"),m_nFindCount); //GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str); str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount); ResetFind(); MessageBox(str, _T("查找替换")); //m_nFindCount =0; //m_nCount++; //AfxMessageBox(_T("查找完毕!")); } } //逐个替换字符串 void CFindAndReplaceDlg::OnButtonReplace() { UpdateData( TRUE ); // Zyu modify on 101028,新需求允许不给出查找内容 //if (m_sFindText.IsEmpty()) //{ // AfxMessageBox(_T("查找不能为空!")); // GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus(); // return; //} CString sFindText; // 搜索的字符串 CString sReplaceText; // 替换的字符串 GetFindText(sFindText); if (!GetReplaceText(sReplaceText)) { return; } else { SetDlgItemText(IDC_EDIT_RESULT, _T("")); m_crPrompt = RGB(0, 0, 0); } // Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串 //InsertFindText(); //InsertReplaceText(); //判断查找的字符串是否变换,若变,则使找按钮不能被选择 //if ( m_sOldFindText != m_sFindText ) if ( m_sOldFindText != sFindText ) { // Zyu modify on 101029,使用新的函数 //CWnd* pWnd = GetDlgItem(IDC_BUTTON_REPLACE); //pWnd->EnableWindow( FALSE ); EnableReplace(); return; } //m_sOldFindText = m_sFindText; m_sOldFindText = sFindText; if ( m_nTextNum > m_nTextNumAll) { AfxMessageBox( _T("查找完毕!") ); return; } long nTextNum = m_nTextNum; nTextNum = m_nTextNum; Entity ent = m_ssText[nTextNum]; int nLen = m_ssText.Length(); ASSERT(nLen != 0); acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); // Zyu modify on 101019,使用新的替换函数 //m_posStart=ReplaceEntText(ent, m_posFind, m_sReplaceText); m_posStart = m_farUtil.ReplaceEntText(ent, m_posFind, sReplaceText); acDocManager->unlockDocument(curDoc()); //static int nCount =0; // Zyu add on 101029,提示文字变为黑色 m_crPrompt = RGB(0, 0, 0); if (m_posStart.m_nBufLen>0) { m_nCount++; CString str; str.Format(_T("已替换%d个"),m_nCount); GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str); SHads_command(RTSTR, _T("REGEN"), RTNONE); } if(!m_posStart) m_nTextNum++; //刷新 // acedRedraw(NULL,1); TPickEntSet ssTemp; // add by lgh.改变刷新方式,只刷新本实体的显示 ssTemp += ent; UpdateGraphic(ssTemp); actrTransactionManager->flushGraphics(); acedUpdateDisplay(); // 设置查找选项 SetFindOption(); FindText();//查找字符串 if ( m_nTextNum >= m_nTextNumAll) { m_bIsFindEnd = TRUE; // Zyu add on 101215,“全部替换”按钮也变灰 CString str; str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount); ResetFind(); MessageBox(str, _T("查找替换")); return; } } //替换所有与查找字符串相匹配的字符串 void CFindAndReplaceDlg::OnButtonReplaceall() { UpdateData( TRUE ); // 设置查找选项 SetFindOption(); // Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串 //InsertFindText(); //InsertReplaceText(); // Zyu modify on 101028,新需求允许不给出查找内容 //if (m_sFindText.IsEmpty()) //{ // AfxMessageBox(_T("查找不能为空!")); // GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus(); // return; //} CString sFindText; // 搜索的字符串 CString sReplaceText; // 替换的字符串 GetFindText(sFindText); //if ( m_sOldFindText != m_sFindText ) if ( m_sOldFindText != sFindText ) { m_bIsFindEnd = FALSE; m_nTextNum = 0; } // sg modify 110818,从循环中拿出来,主要是解决执行撤销操作的时候,希望一次性全部撤销的情况 acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); BOOL bFind = FALSE; // Zyu delete on 101104,替换数量包括单个替换的实体 //int nCount = 0; //modify by xlc on 070810 // for( long i = m_nTextNum; i < m_nTextNumAll; i++) { // Zyu modify on 101216,全部替换从当前位置开始 //for( long i = 0; i < m_nTextNumAll; i++) { for( long i = m_nTextNum; i < m_nTextNumAll; i++) { Entity ent=m_ssText[i]; //TTextPosition pos; while(1) { TTextRange range; // Zyu modify on 101019,使用新的搜索函数 //TTextPosition posFind = FindEntText(ent, m_sFindText, pos, &range); if (!m_posFind) { m_posFind = m_farUtil.FindEntText(ent, sFindText, m_posStart, &range); if(!m_posFind) break; m_nFindCount++; } // Zyu add on 101028,得到要替换的字符串 if (!GetReplaceText(sReplaceText)) { break; } bFind=TRUE; // Zyu modify on 101019,使用新的替换函数 //pos = ReplaceEntText(ent, posFind, m_sReplaceText); // sg delete 110818,删除了2句话,移到了循环外 //acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); m_posStart = m_farUtil.ReplaceEntText(ent, m_posFind, sReplaceText); //acDocManager->unlockDocument(curDoc()); if (m_posStart.m_nBufLen>0) { // Zyu modify on 101104,替换数量包括单个替换的实体 //nCount++; m_nCount++; m_posFind = TTextPosition(); } if(!m_posStart) break; } m_posStart = TTextPosition(); m_posFind = TTextPosition(); } // sg modify 110818,从循环中拿出来,主要是解决执行撤销操作的时候,希望一次性全部撤销的情况 acDocManager->unlockDocument(curDoc()); //刷新 actrTransactionManager->flushGraphics(); acedUpdateDisplay(); acedRedraw(NULL,1); SHads_command(RTSTR, _T("REGEN"), RTNONE); if (bFind == FALSE) { CString prompt = _T("没有\"") + m_sFindText + _T("\"!"); //AfxMessageBox(prompt); } else { m_sOldFindText = m_sFindText; //AfxMessageBox(_T("替换完毕!")); } // Zyu add on 101029,提示文字变为黑色 m_crPrompt = RGB(0, 0, 0); // Zyu modify on 101104,不需再提示 //CString strRes; //strRes.Format(_T("共替换了%d个!"),nCount); // Zyu modify on 101216,全部替换完毕后,弹出对话框提示 CString str; str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount); ResetFind(); MessageBox(str, _T("查找替换")); } //选取对象“选择对象”按钮后,重新构造字符串选择集 void CFindAndReplaceDlg::OnButtonSelect() { // Zyu modify on 101101,简化代码 /* UpdateData(TRUE); HideDialog(TRUE); const TCHAR *szPrompt[2]={_T("请选择需要查找和替换的字符串的范围:"), _T("移除物体")}; RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL); m_ssText.Free(); if(m_ssText.Get(_T(":$"), szPrompt, NULL, TextList) == RTNORM) { m_nTextNum = 0; m_nTextNumAll = m_ssText.Length(); m_iFindRange = 0; m_posFind=TTextPosition(); m_posStart=TTextPosition(); } else { m_nTextNum = 0; m_nTextNumAll = 0; m_iFindRange = 0; m_posFind=TTextPosition(); m_posStart=TTextPosition(); } HideDialog(FALSE); UpdateData(FALSE); */ UpdateData(TRUE); // 隐藏对话框 HideDialog(TRUE); // 搜索范围修改为用户选择 m_iFindRange = 2; UpdateData(FALSE); ResetFind(); // 用户选择 const TCHAR *szPrompt[2]={_T("请选择需要查找和替换的字符串的范围:"), _T("移除物体")}; RBList TextList(RTDXF0, GetFilterString(), NULL); m_ssTextAll.Free(); m_ssText.Free(); m_ssTextAll.Get(_T(":$"), szPrompt, NULL, TRBList()); m_ssText += m_ssTextAll; m_ssText.BaseFilter(TextList); m_nTextNumAll = m_ssText.Length(); // 显示对话框 HideDialog(FALSE); } BOOL CFindAndReplaceDlg::OnInitDialog() { WGroupDlg::OnInitDialog(); m_nCount =0; m_nFindCount=0; m_sOldFindText = m_sFindText; // Zyu modify on 101215,采用新函数 //CWnd* pWnd = GetDlgItem(IDC_BUTTON_FIND); //pWnd->SetWindowText(_T("查找")); //pWnd = GetDlgItem(IDC_BUTTON_REPLACE); //pWnd->EnableWindow(FALSE); // Zyu add on 100925,从XML文件中读取文字样式 CString sFilePath = g_sAppPath; //获得Sys目录的路径 #ifdef _WIN64 sFilePath = sFilePath.Left(sFilePath.GetLength() - 10) + _T("\\sys\\TFindRepFilter.xml"); #else sFilePath = sFilePath.Left(sFilePath.GetLength() - 7) + _T("\\sys\\TFindRepFilter.xml"); #endif m_lstStyle.SetExtendedStyle(m_lstStyle.GetExtendedStyle() | LVS_EX_CHECKBOXES); m_xmlReader.SetFilePath(sFilePath); m_xmlReader.SetListCtrl(&m_lstStyle); if (m_xmlReader.Init()) { m_xmlReader.LoadToCmbCtrl(); } else { m_strDefaultFilter = _T("TCH_*,INSERT,TEXT,MTEXT"); } //构造字符串的选择集,如果当前图形已经选择了实体,则对当前选择 //的图形选择集,否则对整个图形构造 //RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL); m_ssText.Free(); m_ssTextAll.Free(); /* if ( m_ssText.Get(_T("I"), NULL, NULL, TextList) == RTNORM ) { m_nTextNumAll = m_ssText.Length(); }*/ if(g_ssPickFirst.Length()) m_ssTextAll += g_ssPickFirst; m_ssText += m_ssTextAll; RBList TextList(RTDXF0, GetFilterString(), NULL); m_ssText.BaseFilter(TextList); m_nTextNumAll=m_ssText.Length(); //判断当前是否有被选中的字符串 if ( m_nTextNumAll != 0 ) { // Zyu modify on 100926,调整组合框内容和顺序 //m_iFindRange = 0; m_iFindRange = 2; } else { // Zyu modify on 101101,拾取实体 //m_ssText.Free(); //if( m_ssText.Get(_T("X"), NULL, NULL, TextList ) == RTNORM) { // m_nTextNumAll = m_ssText.Length(); //} m_iFindRange = 0; UpdateData(FALSE); PickEntities(); } //加载“选择对象”按钮的位图 CBitmap bitmap; bitmap.LoadBitmap(IDB_SELECTOBJECT); CButton *pButton = (CButton *)GetDlgItem(IDC_BUTTON_SELECT); // Zyu add on 100919,加载按钮位图 CButton *pBtnFind = (CButton *)GetDlgItem(IDC_BTN_FIND); CButton *pBtnReplace = (CButton *)GetDlgItem(IDC_BTN_REPLACE); pBtnFind->SetBitmap((HBITMAP)bitmap); pBtnReplace->SetBitmap((HBITMAP)bitmap); pButton->SetBitmap((HBITMAP)bitmap); bitmap.Detach(); // Zyu modify on 100919,添加部分控件的提示 CButton *pBtnAutoZoom = (CButton *)GetDlgItem(IDC_CHK_AUTOZOOM); //if (!m_wndToolTip.Create(pButton)) if (!m_wndToolTip.Create(pButton) && !m_wndToolTip.Create(pBtnFind) && !m_wndToolTip.Create(pBtnReplace) && !m_wndToolTip.Create(pBtnAutoZoom)) { return FALSE; } m_wndToolTip.AddTool(pButton, _T("选取对象")); m_wndToolTip.AddTool(pBtnFind, _T("屏幕取词")); m_wndToolTip.AddTool(pBtnReplace, _T("屏幕取词")); m_wndToolTip.AddTool(pBtnAutoZoom, _T("勾选此项后,对于当前查找到的文字内容,程序自动放大到屏幕中心位置显示。")); m_wndToolTip.SetMaxTipWidth(230); // Zyu modify on 100919,使用统一的读写文件函数 //初始化“查找"和“替换”字符串 //LoadFindText(); //LoadReplaceText(); LoadText((LPTSTR)_T("findtext.his"), m_comboFindText, m_sFindText); LoadText((LPTSTR)_T("replacetext.his"), m_comboReplaceText, m_sReplaceText); LoadText((LPTSTR)_T("prefixtext.his"), m_cmbPrefix, m_sPrefixText); LoadText((LPTSTR)_T("suffixtext.his"), m_cmbSuffix, m_sSuffixText); LoadText((LPTSTR)_T("incrementtext.his"), m_cmbIncrement, m_sIncrementText); UpdateData(FALSE); // Zyu add on 100919,更新控件状态 EnableCtrls(); SetCtrlsVisible(); // HideDialog(FALSE); return TRUE; } //选择了查找范围后,重新构造字符串的选择集 void CFindAndReplaceDlg::OnSelchangeComboFindrange() { UpdateData(TRUE); // Zyu add on 101101,重新选择实体 ResetFind(); if (m_iFindRange == 0) { #if ADS<17 OnButtonSelect(); #endif } /* else { if(m_iFindRange == 1) { RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL); m_ssText.Free(); if(m_ssText.Get(_T("X"), NULL, NULL, TextList ) == RTNORM) { m_nTextNumAll = m_ssText.Length(); m_nTextNum=0; m_posFind=TTextPosition(); m_posStart=TTextPosition(); } } } */ } void CFindAndReplaceDlg::OnCbnEditchangeComboFindtexts() { ResetFind(); } void CFindAndReplaceDlg::OnCbnKillfocusComboFindtexts() { UpdateData(TRUE); CWnd* pWnd = GetDlgItem(IDC_BUTTON_REPLACE); //modify by xlc on 070810 /*if ( m_sOldFindText == m_sFindText ) { pWnd->EnableWindow( TRUE ); } else { m_bIsFindEnd = FALSE; pWnd->EnableWindow( FALSE ); }*/ if ( m_sOldFindText != m_sFindText ) { m_bIsFindEnd = FALSE; pWnd->EnableWindow( FALSE ); m_nTextNum = 0; m_nTextNumAll = m_ssText.Length(); m_posFind=TTextPosition(); m_posStart=TTextPosition(); //modify by xlc on 090720 修改查找内容后计数置0 m_nFindCount=0; } InsertText(m_sFindText, m_comboFindText); } void CFindAndReplaceDlg::OnCbnKillfocusComboReplacetext() { UpdateData(TRUE); InsertText(m_sReplaceText, m_comboReplaceText); } void CFindAndReplaceDlg::OnCbnKillfocusCmbPrefix() { UpdateData(TRUE); InsertText(m_sPrefixText, m_cmbPrefix); } void CFindAndReplaceDlg::OnCbnKillfocusCmbSuffix() { UpdateData(TRUE); InsertText(m_sSuffixText, m_cmbSuffix); } void CFindAndReplaceDlg::OnCbnKillfocusCmbIncrement() { UpdateData(TRUE); InsertText(m_sIncrementText, m_cmbIncrement); } void CFindAndReplaceDlg::OnCbnSelchangeComboFindtexts() { ResetFind(); } void CFindAndReplaceDlg::OnBnClickedRadReplace() { SetCtrlsVisible(); EnableCtrls(); m_bWildcards = m_bWildcardsOld; m_bWordMatch = m_bWordMatchOld; UpdateData(FALSE); } void CFindAndReplaceDlg::OnBnClickedRadInfix() { SetCtrlsVisible(); EnableCtrls(); m_bWildcards = m_bWildcardsOld; m_bWordMatch = m_bWordMatchOld; UpdateData(FALSE); } void CFindAndReplaceDlg::OnBnClickedRadIncrement() { SetCtrlsVisible(); EnableCtrls(); } void CFindAndReplaceDlg::OnBnClickedChkCasesensitive() { ResetFind(); } void CFindAndReplaceDlg::OnBnClickedChkWordmatch() { UpdateData(TRUE); // 全字匹配与通配符不能同时选中 if (m_bWordMatch) { m_bWildcards = false; } UpdateData(FALSE); m_bWordMatchOld = m_bWordMatch; ResetFind(); } void CFindAndReplaceDlg::OnBnClickedChkWildcards() { UpdateData(TRUE); // 全字匹配与通配符不能同时选中 if (m_bWildcards) { m_bWordMatch = false; } UpdateData(FALSE); m_bWildcardsOld = m_bWildcards; ResetFind(); } void CFindAndReplaceDlg::OnBnClickedBtnFind() { UpdateData(TRUE); CString sText; // 拾取文字 if (PickText(sText)) { // 按光标位置替换 int iStart = LOWORD(m_dwPosFind); int iEnd = HIWORD(m_dwPosFind); m_sFindText.Delete(iStart, iEnd - iStart); m_sFindText.Insert(iStart, sText); InsertText(m_sFindText, m_comboFindText); UpdateData(FALSE); } ResetFind(); } void CFindAndReplaceDlg::OnBnClickedBtnReplace() { UpdateData(TRUE); CString sText; // 拾取文字 if (PickText(sText)) { // 按光标位置替换 int iStart = LOWORD(m_dwPosReplace); int iEnd = HIWORD(m_dwPosReplace); m_sReplaceText.Delete(iStart, iEnd - iStart); m_sReplaceText.Insert(iStart, sText); InsertText(m_sReplaceText, m_comboReplaceText); UpdateData(FALSE); } } void CFindAndReplaceDlg::OnBnClickedBtnMarkall() { int iLen = m_lstStyle.GetItemCount(); // 勾选所有列表中的项目 for (int i = 0; i < iLen; i++) { m_lstStyle.SetCheck(i, TRUE); } ResetFind(); } void CFindAndReplaceDlg::OnBnClickedBtnUnmarkall() { int iLen = m_lstStyle.GetItemCount(); // 取消勾选所有列表中的项目 for (int i = 0; i < iLen; i++) { m_lstStyle.SetCheck(i, FALSE); } ResetFind(); } void CFindAndReplaceDlg::OnBnClickedBtnWildcards() { // 显示通配符定义对话框 CSymDefDlg dlg; dlg.DoModal(); } void CFindAndReplaceDlg::OnBnClickedChkIncrement() { UpdateData(TRUE); if (m_bIncrement) { m_bWordMatchOld = m_bWordMatch; m_bWildcardsOld = m_bWildcards; } else { m_bWordMatch = m_bWordMatchOld; m_bWildcards = m_bWildcardsOld; UpdateData(FALSE); } EnableCtrls(); } void CFindAndReplaceDlg::OnBnClickedChkReplace() { EnableCtrls(); } void CFindAndReplaceDlg::OnBnClickedChkPrefixOrSuffix() { EnableCtrls(); } void CFindAndReplaceDlg::OnBnClickedChkSearch() { EnableCtrls(); ResetFind(); } void CFindAndReplaceDlg::OnLvnItemchangedLstType(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); BOOL bPrevState = (BOOL)(((pNMLV->uOldState & LVIS_STATEIMAGEMASK) >> 12) - 1); BOOL bChecked = (BOOL)(((pNMLV->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1); if (bPrevState != bChecked) { ResetFind(); } *pResult = 0; } HBRUSH CFindAndReplaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = WGroupDlg::OnCtlColor(pDC, pWnd, nCtlColor); // 设置提示编辑框的文字颜色 if (pWnd->GetDlgCtrlID() == IDC_EDIT_RESULT) { pDC->SetTextColor(m_crPrompt); } return hbr; } void CFindAndReplaceDlg::OnBnClickedChkSearchxref() { ResetFind(); } void CFindAndReplaceDlg::OnBnClickedChkSearchblock() { ResetFind(); } void CFindAndReplaceDlg::OnBnClickedChkNohidden() { ResetFind(); } void CFindAndReplaceDlg::OnBnClickedChkWidthsensitive() { ResetFind(); } //隐藏或者显示对话框(查找替换对话框) void CFindAndReplaceDlg::HideDialog(BOOL bFlag) { if (bFlag) { // GetParent()->EnableWindow(TRUE); GetParent()->SetFocus(); GetParent()->SetActiveWindow(); ShowWindow(SW_HIDE); // GetParent()->RedrawWindow(); } else { // GetParent()->EnableWindow(FALSE); // EnableWindow(TRUE); SetActiveWindow(); ShowWindow(SW_SHOW); // Zyu add on 101214,解决提示控件不起作用的问题 // GetParent()->EnableWindow(TRUE); } // if (bFlag) { // GetParent()->EnableWindow(TRUE); // GetParent()->SetFocus(); // GetParent()->SetActiveWindow(); // ShowWindow(SW_HIDE); // GetParent()->RedrawWindow(); // } // else { // GetParent()->EnableWindow(FALSE); // EnableWindow(TRUE); // SetActiveWindow(); // ShowWindow(SW_SHOW); // // Zyu add on 101214,解决提示控件不起作用的问题 // GetParent()->EnableWindow(TRUE); // } } bool CFindAndReplaceDlg::FindText() { // UpdateData(TRUE); // Zyu add on 101028,被搜索的字符串 CString sFindText; if (!GetFindText(sFindText)) { return false; } // 判断查找字符串组合框中的字符串是否变换,若变换 // 则重新开始从所构造的选择集中查找和替换 //if (m_sOldFindText != m_sFindText) if (m_sOldFindText != sFindText) { // Zyu modify on 101028,使用统一的搜索还原函数 //m_bIsFindEnd = FALSE; //m_nTextNum = 0; ResetFind(); } // 选择此按钮后,重新设置它上面的文本 CWnd* pWnd = GetDlgItem(IDC_BUTTON_FIND); pWnd->SetWindowText(_T("查找下一个")); //m_sOldFindText = m_sFindText; m_sOldFindText = sFindText; acedRedraw(NULL,1); // 下面是对字符串的查找,坐标的判断,若所查找的字符串 // 不可见,则使其能可见,若被对话框挡住,则移动对话框 // 使字符串能对用户可见 BOOL bFind = FALSE; while (m_nTextNum < m_nTextNumAll) { int n__len = m_ssText.Length(); ASSERT(n__len > 0); Entity ent = m_ssText[m_nTextNum]; XScreenDc dc(1,1); dc.m_nFlag |= IMG_WCS2UCS; XPoint ptMin, ptMax; TTextRange range; // Zyu modify on 101019,使用新的替换函数 //m_posFind = FindEntText(ent, m_sFindText, m_posStart, &range); m_posFind = m_farUtil.FindEntText(ent, sFindText, m_posStart, &range); //if (m_posFind.m_nBufLen>0) //{ // m_nFindCount++; //} if (!m_posFind) { m_nTextNum++; m_posStart.m_nTextPos = 0; m_posStart.m_nCookies = 0; // sg add 090115 } else { bFind = TRUE; // Zyu add on 101101,切换到实体所在空间 TCString sSpaceName; TCString sSpaceNameEnt; TGGetVar(_T("CTAB"), &sSpaceName); if (ent.GetData(410, sSpaceNameEnt) == RTNORM) { if (sSpaceNameEnt != sSpaceName) { TGSetVar(_T("CTAB"), sSpaceNameEnt); } } if (range.GetExtend(ptMin, ptMax)) { // Zyu modify on 101101,自动缩放 // 确保找到的位置范围可见 //AssureInCurrentView(ptMin, ptMax); if (m_bAutoZoom) { // 方向矢量 AcGeVector3d vDir; vDir = ptMax - ptMin; // 比例因子 double dFactor = (vDir.x > vDir.y) ? vDir.x / vDir.y : vDir.y / vDir.x; dFactor = (dFactor > 10) ? 10 : dFactor; // 调整zoom的范围 AcGePoint3d ptMaxTemp = ptMax + vDir * 10 / dFactor; AcGePoint3d ptMinTemp = ptMin - vDir * 10 / dFactor; ArxZoom(ptMinTemp, ptMaxTemp); } else { // 确保找到的位置范围可见 AssureInCurrentView(ptMin, ptMax); } for (int n=0; nGetWindowRect(dwgViewRect); int ptx, pty; ptx = dwgViewRect.left; pty = dwgViewRect.top; cptMin.x += ptx; cptMin.y += pty; cptMax.x += ptx; cptMax.y += pty; this->GetWindowRect(dlgRect); CRect newRect = dlgRect; // 若字符串被挡住,则移动对话框 BOOL bMove = FALSE; int width, height; width = GetSystemMetrics(SM_CXSCREEN); height = GetSystemMetrics(SM_CYSCREEN); while (newRect.PtInRect(cptMin)!=0 || newRect.PtInRect(cptMax)!=0) { bMove = FALSE; newRect.OffsetRect(0, 5); if (newRect.bottom >= height) { newRect = dlgRect; while (newRect.PtInRect(cptMin)!=0 || newRect.PtInRect(cptMax)!=0) { bMove = FALSE; newRect.OffsetRect(0, -5); if (newRect.top <= 0) { break; } bMove = TRUE; } break; } bMove = TRUE; } if (bMove == TRUE) { this->MoveWindow(newRect); } break; } } // 刷新 actrTransactionManager->flushGraphics(); acedUpdateDisplay(); pWnd = GetDlgItem(IDC_BUTTON_REPLACE); if (bFind == TRUE) { // Zyu modify on 101215,采用新的函数 //pWnd->EnableWindow(TRUE); EnableReplace(); } else { pWnd->EnableWindow(FALSE); // Zyu add on 101215,“全部替换”按钮也变灰 GetDlgItem(IDC_BUTTON_REPLACEALL)->EnableWindow(FALSE); // Zyu delete on 101216,此处不重置 //m_nCount =0; } return true; } // Zyu modify on 100919,统一成读写文件的函数 // Begin //初始化用作查找的字符串 //void CFindAndReplaceDlg::LoadFindText() //{ // TCHAR strTmpPath[100] = _T(""); // GetTempPath(100, strTmpPath); // _tcscat(strTmpPath, _T("findtext.his")); // ///* m_lstFindText.RemoveAll(); // std::ifstream in(strTmpPath); // if (!(!in)) // { // TCHAR line[256]; // in.getline(line, 255); // if(!(!in)) // { // m_lstFindText.AddTail(strnew(line)); // while(!(!in)) // { // in.getline(line, 255); // if(!in) // { // break; // } // m_lstFindText.AddTail(strnew(line)); // for(int i = (m_lstFindText.GetCount() - 2); i >= 0; i--) // { // POSITION site = m_lstFindText.FindIndex(i); // if (m_lstFindText.GetAt(site) == m_lstFindText.GetTail()) // { // m_lstFindText.RemoveTail(); // break; // } // } // } // } // } // CComboBox* pComboFind = (CComboBox*)GetDlgItem(IDC_COMBO_FINDTEXTS); // pComboFind->ResetContent(); // for (int i = 0; i < m_lstFindText.GetCount(); i++) // { // POSITION site = m_lstFindText.FindIndex(i); // pComboFind->InsertString(i, m_lstFindText.GetAt(site)); // } // pComboFind->GetLBText(0, m_sFindText);*/ // // int nNum=0; // std::ifstream in(_AS(strTmpPath)); // while(!(!in)) { // char line[256]; // in.getline(line, 255); // if(!in) break; // nNum++; // if(nNum>MAXTEXTNUM) break; // m_comboFindText.AddString(TString(line)); // } // if (m_comboFindText.GetCount()>0) { // m_comboFindText.GetLBText(0,m_sFindText); // } //} // ////初始化用作替换的字符串 //void CFindAndReplaceDlg::LoadReplaceText() //{ // TCHAR strTmpPath[100] = _T(""); // GetTempPath(100, strTmpPath); // _tcscat(strTmpPath, _T("replacetext.his")); // // /* m_lstReplaceText.RemoveAll(); // std::ifstream in(strTmpPath); // if (!(!in)) // { // TCHAR line[256]; // in.getline(line, 255); // if(!(!in)) // { // m_lstReplaceText.AddTail(strnew(line)); // while(!(!in)) // { // TCHAR line[256]; // in.getline(line, 255); // if(!in) // { // break; // } // m_lstReplaceText.AddTail(strnew(line)); // for(int i = (m_lstReplaceText.GetCount() - 2); i >= 0; i--) // { // POSITION site = m_lstReplaceText.FindIndex(i); // if (m_lstReplaceText.GetAt(site) == m_lstReplaceText.GetTail()) // { // m_lstReplaceText.RemoveTail(); // break; // } // } // } // } // } // CComboBox* pComboReplace = (CComboBox*)GetDlgItem(IDC_COMBO_REPLACETEXT); // pComboReplace->ResetContent(); // for (int i =0; i < m_lstReplaceText.GetCount(); i++) // { // POSITION site = m_lstReplaceText.FindIndex(i); // pComboReplace->InsertString(i, m_lstReplaceText.GetAt(site)); // } // pComboReplace->GetLBText(0, m_sReplaceText);*/ // // int nNum=0; // std::ifstream in(_AS(strTmpPath)); // while(!(!in)) { // char line[256]; // in.getline(line, 255); // if(!in) break; // nNum++; // if(nNum>MAXTEXTNUM) break; // m_comboReplaceText.AddString(TString(line)); // } // if (m_comboReplaceText.GetCount()>0) { // m_comboReplaceText.GetLBText(0,m_sReplaceText); // } //} // // ////保存用作查找的字符串 //void CFindAndReplaceDlg::SaveFindText() //{ //// if (m_sFindText.IsEmpty()) return; // int len = m_comboFindText.GetCount(); // if (len <= 0) return; // // TCHAR strTmpPath[256] = _T(""); // GetTempPath(255, strTmpPath); // _tcscat(strTmpPath, _T("findtext.his")); // ///* std::ofstream out(strTmpPath); // out << (const TCHAR*)m_sFindText << _T("\n"); // int len = m_lstFindText.GetCount(); // for( int i=0; i < len && i < MAXTEXTNUM; i++) { // POSITION site = m_lstFindText.FindIndex(i); // if (m_lstFindText.GetAt(site) != m_sFindText && // m_lstFindText.GetAt(site) != _T("")) { // out << (const TCHAR*)m_lstFindText.GetAt(site) << _T("\n"); // } // }*/ // // std::ofstream out(_AS(strTmpPath)); // for( int i=0; i < len && i < MAXTEXTNUM-1; i++) { // CString sText = _T(""); // m_comboFindText.GetLBText(i,sText); // if (!sText.IsEmpty()) { // out << (const char*)(_AS(sText)) << "\n"; // } // } //} // ////保存用作替换的字符串 //void CFindAndReplaceDlg::SaveReplaceText() //{ //// if (m_sReplaceText.IsEmpty()) return; // int len = m_comboReplaceText.GetCount(); // if (len <= 0) return; // // TCHAR strTmpPath[256] = _T(""); // GetTempPath(255, strTmpPath); // _tcscat(strTmpPath, _T("replacetext.his")); // ///* std::ofstream out(strTmpPath); // out << (const TCHAR*)m_sReplaceText << _T("\n"); // int len = m_lstReplaceText.GetCount(); // for( int i=0; i < len && i < MAXTEXTNUM; i++) { // POSITION site = m_lstReplaceText.FindIndex(i); // if (m_lstReplaceText.GetAt(site) != m_sReplaceText && // m_lstReplaceText.GetAt(site) != _T("")) { // out << (const TCHAR*)m_lstReplaceText.GetAt(site) << _T("\n"); // } // }*/ // // std::ofstream out(_AS(strTmpPath)); // for( int i=0; i < len && i < MAXTEXTNUM-1; i++) { // CString sText = _T(""); // m_comboReplaceText.GetLBText(i,sText); // if (!sText.IsEmpty()) { // out << (const char*)_AS(sText) << "\n"; // } // } //} void CFindAndReplaceDlg::LoadText(TCHAR *pFileName, CComboBox &cmbText, CString &sText) { TCHAR strTmpPath[100] = _T(""); GetTempPath(100, strTmpPath); _tcscat(strTmpPath, pFileName); int nNum=0; std::ifstream in(_AS(strTmpPath)); while(!(!in)) { char line[256]; in.getline(line, 255); if(!in) break; nNum++; if(nNum>MAXTEXTNUM) break; cmbText.AddString(TString(line)); } if (cmbText.GetCount()>0) { cmbText.GetLBText(0, sText); } } void CFindAndReplaceDlg::SaveText(TCHAR *pFileName, CComboBox &cmbText) { int len = cmbText.GetCount(); if (len <= 0) return; TCHAR strTmpPath[256] = _T(""); GetTempPath(255, strTmpPath); _tcscat(strTmpPath, pFileName); std::ofstream out(_AS(strTmpPath)); for( int i=0; i < len && i < MAXTEXTNUM-1; i++) { CString sText = _T(""); cmbText.GetLBText(i,sText); if (!sText.IsEmpty()) { out << (const char*)(_AS(sText)) << "\n"; } } } // 初始化搜索 void CFindAndReplaceDlg::ResetFind() { UpdateData(TRUE); m_bIsFindEnd = FALSE; m_nTextNum = 0; m_posFind = TTextPosition(); m_posStart = TTextPosition(); m_farUtil.ResetFind(); m_nCount = 0; m_nFindCount = 0; EnableReplace(); PickEntities(); SetDlgItemText(IDC_EDIT_RESULT, _T("")); SetDlgItemText(IDC_BUTTON_FIND, _T("查找")); } // 从图中选取实体 void CFindAndReplaceDlg::PickEntities() { UpdateData(TRUE); m_ssText.Free(); switch (m_iFindRange) { // 整个图形 case 0: { TRBList TextList(RTDXF0, GetFilterString(), NULL); m_ssText.Get(_T("X"), NULL, NULL, TextList); m_nTextNumAll = m_ssText.Length(); } break; // 当前空间/布局 case 1: { TCString sSpaceName; TGGetVar(_T("CTAB"), sSpaceName); TRBList TextList(RTDXF0, GetFilterString(), 410, sSpaceName, NULL); m_ssText.Get(_T("X"), NULL, NULL, TextList); m_nTextNumAll = m_ssText.Length(); } break; // 当前选择 case 2: { m_ssText += m_ssTextAll; TRBList TextList(RTDXF0, GetFilterString(), NULL); m_ssText.BaseFilter(TextList); m_nTextNumAll = m_ssText.Length(); } break; default: { } } } // 设置查找选项 void CFindAndReplaceDlg::SetFindOption() { UpdateData(TRUE); DWORD dwMask = g_FindParser.GetFindOption(); dwMask = m_bIncrement && (m_iReplaceType == 2) ? (dwMask | FP_INCREMENT) : (dwMask & ~FP_INCREMENT); dwMask = m_bCaseSencitive ? (dwMask | FP_MATCH_CASE) : (dwMask & ~FP_MATCH_CASE); dwMask = m_bWordMatch ? (dwMask | FP_WHOLE_WORD) : (dwMask & ~FP_WHOLE_WORD); dwMask = m_bWildcards ? (dwMask | FP_WILDCARD) : (dwMask & ~FP_WILDCARD); dwMask = m_bWidthSensitive ?(dwMask | FP_WORD_WIDTH) : (dwMask & ~FP_WORD_WIDTH); g_FindParser.SetFindOption(dwMask); // 设置对块的搜索方式 m_farUtil.SetFindOption(m_bBlkAttrib, m_bSearchBlock, m_bSearchXref, m_bNoHidden); } // 控制替换按钮是否可用 void CFindAndReplaceDlg::EnableReplace() { UpdateData(TRUE); bool bEnable = false; switch (m_iReplaceType) { case 0: bEnable = !!m_bReplace; break; case 1: bEnable = m_bPrefix || m_bSuffix; break; case 2: bEnable = !!m_bIncrement; break; } GetDlgItem(IDC_BUTTON_REPLACEALL)->EnableWindow(bEnable); bEnable = bEnable && (m_nFindCount != 0) && !m_bIsFindEnd; GetDlgItem(IDC_BUTTON_REPLACE)->EnableWindow(bEnable); } // 设置控件是否显示 void CFindAndReplaceDlg::SetCtrlsVisible() { UpdateData(TRUE); int iCmdShow = (m_iReplaceType == 0) ? SW_SHOW : SW_HIDE; GetDlgItem(IDC_CHK_REPLACE)->ShowWindow(iCmdShow); GetDlgItem(IDC_COMBO_REPLACETEXT)->ShowWindow(iCmdShow); GetDlgItem(IDC_BTN_REPLACE)->ShowWindow(iCmdShow); iCmdShow = (m_iReplaceType == 1) ? SW_SHOW : SW_HIDE; GetDlgItem(IDC_CHK_PREFIX)->ShowWindow(iCmdShow); GetDlgItem(IDC_CMB_PREFIX)->ShowWindow(iCmdShow); GetDlgItem(IDC_CHK_SUFFIX)->ShowWindow(iCmdShow); GetDlgItem(IDC_CMB_SUFFIX)->ShowWindow(iCmdShow); iCmdShow = (m_iReplaceType == 2) ? SW_SHOW : SW_HIDE; GetDlgItem(IDC_CHK_INCREMENT)->ShowWindow(iCmdShow); GetDlgItem(IDC_CMB_INCREMENT)->ShowWindow(iCmdShow); } // 更新控件 void CFindAndReplaceDlg::EnableCtrls() { UpdateData(TRUE); GetDlgItem(IDC_COMBO_FINDTEXTS)->EnableWindow(m_bFind); GetDlgItem(IDC_BTN_FIND)->EnableWindow(m_bFind); GetDlgItem(IDC_COMBO_REPLACETEXT)->EnableWindow(m_bReplace); GetDlgItem(IDC_BTN_REPLACE)->EnableWindow(m_bReplace); GetDlgItem(IDC_CMB_PREFIX)->EnableWindow(m_bPrefix); GetDlgItem(IDC_CMB_SUFFIX)->EnableWindow(m_bSuffix); GetDlgItem(IDC_CHK_INCREMENT)->EnableWindow(m_bFind); GetDlgItem(IDC_CMB_INCREMENT)->EnableWindow(m_bFind && m_bIncrement); GetDlgItem(IDC_CHK_CASESENSITIVE)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_WORDMATCH)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_WILDCARDS)->EnableWindow(m_bFind); GetDlgItem(IDC_BTN_WILDCARDS)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_SEARCHXREF)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_SEARCHBLOCK)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_NOHIDDEN)->EnableWindow(m_bFind); GetDlgItem(IDC_CHK_WIDTHSENSITIVE)->EnableWindow(m_bFind); if (m_bIncrement && GetDlgItem(IDC_CHK_INCREMENT)->IsWindowEnabled() && m_iReplaceType == 2) { SetDlgItemText(IDC_CHK_SEARCH, _T("起始编号:")); GetDlgItem(IDC_CHK_WORDMATCH)->EnableWindow(false); ((CButton*)GetDlgItem(IDC_CHK_WORDMATCH))->SetCheck(BST_CHECKED); GetDlgItem(IDC_CHK_WILDCARDS)->EnableWindow(false); ((CButton*)GetDlgItem(IDC_CHK_WILDCARDS))->SetCheck(BST_UNCHECKED); GetDlgItem(IDC_BTN_WILDCARDS)->EnableWindow(false); } else { SetDlgItemText(IDC_CHK_SEARCH, _T("查找内容:")); } EnableReplace(); } bool CFindAndReplaceDlg::PickText(CString &sText) { HideDialog(TRUE); Entity ent; RBList mask(RTDXF0,_T("TCH_*,TEXT"),NULL); XPoint pt; if(SelectEntity(_T("\n屏幕拾取文字内容:"),ent,pt,mask) != RTNORM) { HideDialog(FALSE); return false; } PickSet ss(SS_FREE); ss+=ent; TSubText* pSubText = HitTestOnText(ss,Ucs2Wcs(pt)); if(pSubText!=NULL) { sText = pSubText->GetText(); delete pSubText; UpdateData(FALSE); } HideDialog(FALSE); return true; } // 获得过滤字符串 CString CFindAndReplaceDlg::GetFilterString() { if (!m_strDefaultFilter.IsEmpty()) return m_strDefaultFilter; UpdateData(TRUE); CString sFilter; // 查找外部参照 if (m_bSearchXref) { sFilter += _T("INSERT,"); } // 查找块 if (m_bSearchBlock) { sFilter += _T("INSERT,AEC_BLOCK_INSERT,"); } // 查找xml文件中的设置 for (int i = 0; i < m_lstStyle.GetItemCount(); i++) { if (m_lstStyle.GetItemText(i, 0) == _T("块属性值")) { m_bBlkAttrib = m_lstStyle.GetCheck(i); } if (m_lstStyle.GetCheck(i)) { sFilter += m_lstStyle.GetItemText(i, 1); } } return sFilter; } // 获得搜索字符串 bool CFindAndReplaceDlg::GetFindText(CString &sFind) { UpdateData(TRUE); // 如果“查找内容”文本框可用,不允许输入为空 if (((CButton*)GetDlgItem(IDC_CHK_SEARCH))->GetCheck()) { if (m_sFindText.IsEmpty()) { // 以红色进行提示 m_crPrompt = RGB(255, 0, 0); SetDlgItemText(IDC_EDIT_RESULT, _T("查找内容不能为空!")); return false; } else { sFind = m_sFindText; } } return true; } // 获得替换字符串 bool CFindAndReplaceDlg::GetReplaceText(CString &sReplace) { UpdateData(TRUE); switch (m_iReplaceType) { case 0: { // 如果“替换为”文本框可用,直接使用用户输入的文字 if (m_bReplace) sReplace = m_sReplaceText; else return false; } break; case 1: { // 如果进行增量替换,使用搜索到的文本加前/后缀 if (m_bPrefix || m_bSuffix) { // 前后缀为空时不进行操作 if (m_sSuffixText.IsEmpty() && m_sPrefixText.IsEmpty()) { return false; } // 程序默认始终在字串的起始端和末尾端添加前后缀 sReplace = g_FindParser.GetDestString(); if (m_bPrefix) { sReplace = m_sPrefixText + sReplace; } if (m_bSuffix) { sReplace += m_sSuffixText; } m_posFind.m_nTextPos = 0; m_posFind.m_nBufLen = g_FindParser.GetDestString().GetLength(); } else return false; } break; case 2: { // 如果进行增量替换,使用搜索到的文本加增量 if (m_bIncrement) { // 增量输入不是数字,停止操作 if (!IsNumber(m_sIncrementText)) { m_crPrompt = RGB(255, 0, 0); SetDlgItemText(IDC_EDIT_RESULT, _T("请输入数字增量!")); return false; } CString sSymble; CString sNumber; g_FindParser.DivideString(g_FindParser.GetResult(), sSymble, sNumber); CString sSum; sSum.Format(_T("%f"), _tstof(sNumber) + _tstof(m_sIncrementText)); int iMaxAccu = max(GetAccuracy(sNumber), GetAccuracy(m_sIncrementText)); int iAccu = GetAccuracy(sSum); if (iMaxAccu < iAccu) { sSum = sSum.Mid(0, sSum.GetLength() + iMaxAccu - iAccu); } sReplace = sSymble + sSum; } else return false; } break; default: return false; } return true; } bool CFindAndReplaceDlg::IsNumber(LPCTSTR pszNumber, bool bDot, bool bNeg) const { CString sInput(pszNumber); short nLength = sInput.GetLength(); if (0 >= nLength) { return false; } if (sInput.GetAt(0) == _T('.')) { return false; } TCHAR chTemp; bool bExistDot = false; for (short i = 0; i < nLength; i++) { chTemp = sInput.GetAt(i); if (chTemp < _T('0') || chTemp > _T('9')) { if (bDot && _T('.') == chTemp && !bExistDot) { bExistDot = true; } else if (!(bNeg && 0 == i && _T('-') == chTemp)) { return false; } } } return true; } // 获得一个数字字符串的小数点位数 int CFindAndReplaceDlg::GetAccuracy(const CString& sNumber) const { int iPos = sNumber.ReverseFind(_T('.')); if (iPos < 0) { return 0; } else { return sNumber.GetLength() - iPos; } } // End BOOL CFindAndReplaceDlg::PreTranslateMessage(MSG* pMsg) { m_wndToolTip.RelayEvent(pMsg); // Zyu add on 101101,保存在查找/替换组合框文本高亮选中的位置 if (pMsg->message == WM_LBUTTONUP || pMsg->message == WM_KEYUP) { CWnd* pWnd = this->GetFocus(); if (NULL != pWnd) { int iId = pWnd->GetDlgCtrlID(); if (iId == IDC_COMBO_FINDTEXTS || iId == IDC_COMBO_REPLACETEXT) { m_dwPosFind = m_comboFindText.GetEditSel(); m_dwPosReplace = m_comboReplaceText.GetEditSel(); } } } return WGroupDlg::PreTranslateMessage(pMsg); } void CFindAndReplaceDlg::OnDestroy() { m_wndToolTip.DestroyWindow(); WGroupDlg::OnDestroy(); delete this; pDlg = NULL; } // Zyu modify on 100919,统一成向组合框中插入文本的函数 // Begin /* void CFindAndReplaceDlg::InsertFindText() { if (m_sFindText.IsEmpty()) return; int nPos = m_comboFindText.FindString(-1,m_sFindText); int nCount = m_comboFindText.GetCount(); if (nPos==CB_ERR) { if (nCount >= MAXTEXTNUM) { m_comboFindText.DeleteString(MAXTEXTNUM-1); } m_comboFindText.InsertString(0,m_sFindText); } else { if (nPos>=0 && nPos= MAXTEXTNUM) { m_comboReplaceText.DeleteString(MAXTEXTNUM-1); } m_comboReplaceText.InsertString(0,m_sReplaceText); } else { if (nPos>=0 && nPos= MAXTEXTNUM) { cmbText.DeleteString(MAXTEXTNUM-1); } cmbText.InsertString(0, sText); } else { if (nPos>=0 && nPosCreate(CFindAndReplaceDlg::IDD, acedGetAcadFrame()); } pDlg->ShowWindow(SW_SHOW); // dlg.DoModal(); // acedRedraw(NULL,1); }