#include "stdafx.h" #include #include "settoolbardlg.h" #include "tapi.h" #include "twtdef.h" #if (ADS==19) #ifdef _WIN64 #include "acadi_i.c" #import "acax19enu.tlb" #else #include "acadi_i.c" #import "acax19enu.tlb" #endif #elif (ADS==18) #ifdef _WIN64 #include "acadi_i.c" #import "acax18enu.tlb" #else #include "acadi_i.c" #import "acax18enu.tlb" #endif #elif (ADS==20) #ifdef _WIN64 #include "acadi_i.c" #import "acax20enu.tlb" #else #include "acadi_i.c" #import "acax20enu.tlb" #endif #elif (ADS==21) #ifdef _WIN64 #include "acadi_i.c" #import "acax21enu.tlb" #else #include "acadi_i.c" #import "acax21enu.tlb" #endif #elif (ADS==22) #ifdef _WIN64 #include "acadi_i.c" #import "acax22enu.tlb" #else #include "acadi_i.c" #import "acax22enu.tlb" #endif #elif (ADS==17) #include "acadi_i.c" #import "acax17enu.tlb" #elif (ADS==16) #include "acadi_i.c" #import "c:\\Program Files\\Common Files\\Autodesk Shared\\acax16enu.tlb" #elif(ADS==15) #include "acad15_i.c" #import "e:\\AutoCAD 2002\\Acad.tlb" #endif using namespace AutoCAD; //卸载ARX的时候,要把上华工具条隐藏 void UnloadToolbar() { CString csReg; #if(ADS > 18) csReg = acdbHostApplicationServices()->getUserRegistryProductRootKey(); #else csReg = acrxDynamicLinker->ProductKey(); #endif CString csRegUnname = csReg; if(g_nProductId==16) csReg.Format(_T("%s\\Profiles\\TElec9"), csReg); else if(g_nProductId==14) csReg.Format(_T("%s\\Profiles\\TWT9"), csReg); CRegProperty regProp(csReg, _T("toolbars")); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.SetValue(_T("ACAD.TCH"), _T("hide bottom 0 0")); ////////////////////////////////////////////////////////////// // cet 2014.5.30 modify cad2008调试状态关闭cad时,出现异常 // csRegUnname.Format(_T("%s\\Profiles\\<>"), csRegUnname); CString sTemp = csRegUnname; csRegUnname.Format(_T("%s\\Profiles\\<>"), sTemp); CRegProperty regProp2(csRegUnname, _T("toolbars")); regProp2.SetTopRootKey(HKEY_CURRENT_USER); regProp2.SetValue(_T("ACAD.TCH"), _T("hide bottom 0 0")); } void CleanUpToolbars(IAcadToolbarsPtr &pToolbars) { CString csToolbarsName; csToolbarsName = _T("TCH"); long cnt = 0; pToolbars->get_Count(&cnt); BSTR tempName; VARIANT vtName; for ( long i=0; i < cnt; i++) { IAcadToolbarPtr pToolbar = NULL; vtName.vt = VT_I4; vtName.lVal = i; pToolbar = pToolbars->Item(vtName); pToolbar->get_Name(&tempName); CString tlbrName(tempName); SysFreeString(tempName); if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0) { pToolbar->Delete(); break; } } } BOOL IsExistToolbarItem(IAcadToolbarsPtr &pToolbars, const TCHAR* szItem) { CString csItem = szItem; long cnt = 0; pToolbars->get_Count(&cnt); BSTR tempName; VARIANT vtName; for ( long i=0; i < cnt; i++) { IAcadToolbarPtr pToolbar = NULL; vtName.vt = VT_I4; vtName.lVal = i; pToolbar = pToolbars->Item(vtName); pToolbar->get_Name(&tempName); CString tlbrName(tempName); SysFreeString(tempName); if(tlbrName.CompareNoCase(csItem)==0) return TRUE; } return FALSE; } int GetToolbarPos(IAcadToolbarsPtr &pToolbars) { CString csToolbarsName; csToolbarsName = _T("TCH"); long cnt = 0; pToolbars->get_Count(&cnt); BSTR tempName; VARIANT vtName; for ( long i=0; i < cnt; i++) { IAcadToolbarPtr pToolbar = NULL; vtName.vt = VT_I4; vtName.lVal = i; pToolbar = pToolbars->Item(vtName); pToolbar->get_Name(&tempName); CString tlbrName(tempName); SysFreeString(tempName); if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0) { BOOL bLeft(FALSE); AcToolbarDockStatus Status; pToolbar->get_DockStatus(&Status); if(Status == acToolbarDockTop) return 0; else if(Status == acToolbarDockBottom) return 1; else if(Status == acToolbarDockLeft) return 2; else if(Status == acToolbarDockRight) return 3; else return 4; } } return -1; } BOOL GetToolbarVisible() { CString csToolbarsName; csToolbarsName = _T("TCH"); BOOL ret(FALSE); CoInitialize(NULL); IAcadApplication *pApp = NULL; AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp); if (pApp == NULL) return ret; IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups(); if(pMenuGroups == NULL){ pApp->Release(); CoUninitialize(); return ret; } long cnt = 0; pMenuGroups->get_Count(&cnt); IAcadMenuGroupPtr mnuGrp = NULL; IAcadMenuGroupPtr pMnuGrp = NULL; for(long i=0;iItem(vtName); if(mnuGrp == NULL){ pApp->Release(); CoUninitialize(); return ret; } BSTR grpName; mnuGrp->get_Name(&grpName); CString cgrpName(grpName); if (cgrpName.CompareNoCase(_T("Acad"))==0) { pMnuGrp = mnuGrp; break; } } if(pMnuGrp == NULL){ pApp->Release(); CoUninitialize(); return ret; } IAcadToolbarsPtr pToolbars = NULL; pMnuGrp->get_Toolbars(&pToolbars); pToolbars->get_Count(&cnt); BSTR tempName; VARIANT vtName; for (i=0; i < cnt; i++) { IAcadToolbarPtr pToolbar = NULL; vtName.vt = VT_I4; vtName.lVal = i; pToolbar = pToolbars->Item(vtName); pToolbar->get_Name(&tempName); CString tlbrName(tempName); SysFreeString(tempName); if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0) { short flag; pToolbar->get_Visible(&flag); if(pToolbar->Visible == -1) ret = TRUE; else ret = FALSE; break; } } pApp->Release(); CoUninitialize(); return ret; } BOOL SetToolbarVisible(BOOL bOpen) { CString csToolbarsName; csToolbarsName = _T("TCH"); BOOL ret(FALSE); CoInitialize(NULL); IAcadApplication *pApp = NULL; AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp); if (pApp == NULL) return ret; IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups(); if(pMenuGroups == NULL){ pApp->Release(); CoUninitialize(); return ret; } long cnt = 0; pMenuGroups->get_Count(&cnt); IAcadMenuGroupPtr mnuGrp = NULL; IAcadMenuGroupPtr pMnuGrp = NULL; for(long i=0;iItem(vtName); if(mnuGrp == NULL){ pApp->Release(); CoUninitialize(); return ret; } BSTR grpName; mnuGrp->get_Name(&grpName); CString cgrpName(grpName); if (cgrpName.CompareNoCase(_T("Acad"))==0) { pMnuGrp = mnuGrp; break; } } if(pMnuGrp == NULL){ pApp->Release(); CoUninitialize(); return ret; } IAcadToolbarsPtr pToolbars = NULL; pMnuGrp->get_Toolbars(&pToolbars); pToolbars->get_Count(&cnt); BSTR tempName; VARIANT vtName; for (i=0; i < cnt; i++) { IAcadToolbarPtr pToolbar = NULL; vtName.vt = VT_I4; vtName.lVal = i; pToolbar = pToolbars->Item(vtName); pToolbar->get_Name(&tempName); CString tlbrName(tempName); SysFreeString(tempName); if(tlbrName.CompareNoCase((const TCHAR*)csToolbarsName)==0) { ret = TRUE; if(bOpen) pToolbar->Visible = -1; else pToolbar->put_Visible(FALSE); break; } } pApp->Release(); CoUninitialize(); return ret; } IAcadToolbarsPtr GetToolbars() { CoInitialize(NULL); IAcadApplication *pApp = NULL; AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp); if (pApp == NULL) return NULL; IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups(); if(pMenuGroups == NULL){ pApp->Release(); CoUninitialize(); return NULL; } long cnt = 0; pMenuGroups->get_Count(&cnt); IAcadMenuGroupPtr mnuGrp = NULL; IAcadMenuGroupPtr pMnuGrp = NULL; for(long i=0;iItem(vtName); if(mnuGrp == NULL){ pApp->Release(); CoUninitialize(); return NULL; } BSTR grpName; mnuGrp->get_Name(&grpName); CString cgrpName(grpName); if (cgrpName.CompareNoCase(_T("Acad"))==0) { pMnuGrp = mnuGrp; break; } } if(pMnuGrp == NULL){ pApp->Release(); CoUninitialize(); return NULL; } IAcadToolbarsPtr pToolbars = NULL; pMnuGrp->get_Toolbars(&pToolbars); pApp->Release(); CoUninitialize(); return pToolbars; } void SetToolbarPos() { CString csConfigName; if(g_nProductId==16) csConfigName = _T("TElecConfig"); else if(g_nProductId==14) csConfigName = _T("TwtConfig"); else if(g_nProductId==15) csConfigName = _T("THvacConfig"); else if(g_nProductId==1) csConfigName = _T("Settings"); IAcadToolbarsPtr pToolbars = GetToolbars(); if(pToolbars) { int pos = GetToolbarPos(pToolbars); CRegProperty regProp(GetRegLocation(), (const TCHAR*)csConfigName); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.SetValue(_T("ToolbarPos"), pos); } } void CreateToolbars() { CString csToolbarsName; csToolbarsName = _T("TCH"); CString csConfigName, csCmd; if(g_nProductId==16){ csConfigName = _T("TElecConfig"); } else if(g_nProductId==14){ csConfigName = _T("TwtConfig"); } else if(g_nProductId==15) csConfigName = _T("THvacConfig"); else if(g_nProductId==1){ csConfigName = _T("Settings"); } int iToolbarPos(-1); CRegProperty regProp(GetRegLocation(), (const TCHAR*)csConfigName); regProp.SetTopRootKey(HKEY_CURRENT_USER); regProp.GetValue(_T("ToolbarPos"), iToolbarPos); if(iToolbarPos < 0) iToolbarPos = 1; CodeBase db; XString xsDbfFile, xsDllFile; DList lstToolbarData; if(!FindFile(_T("tchdata.dbf"), xsDbfFile)) { AfxMessageBox(_T("对不起,没有发现tchdata.dbf文件!")); return; } if(!FindFile(_T("Acad.dll"), xsDllFile)) { AfxMessageBox(_T("对不起,没有发现Acad.dll文件!")); return; } lstToolbarData.Append(new CToolbarData(_T(""), _T("options"), _T("初始设置"), _T("对整个上华软件进行初始设置"), _T("TEL_16_SETTING"), 1)); lstToolbarData.Append(new CToolbarData(_T(""), _T("gjt"), _T("工 具 条"), _T("用户自定义设置上华快捷工具条: GJT"), _T("TEL_16_TOOLBAR"), 1)); lstToolbarData.Append(new CToolbarData(_T(""), _T("glxz"), _T("过滤选择"), _T("先选参考图元,选择其它符合参考图元过滤条件的图形,生成选择集"), _T("TWT_16_GLXZ"), 1)); lstToolbarData.Append(new CToolbarData(_T(""), _T("tzkb"), _T("上华拷贝"), _T("动态连续的复制对象"), _T("Tch_DragCopy"), 1)); lstToolbarData.Append(new CToolbarData(_T(""), _T("lcjb"), _T("图形导出"), _T("把上华图形文件另存为ACAD兼容的R14格式dwg, 以便与非上华环境交流, 注意字体文件shx要一致"), _T("Icon_16_Save"), 1)); lstToolbarData.Append(new CToolbarData(_T("1"), _T(""), _T(""), _T(""), _T(""), 1)); CString csName, csDescribe, csIcon, csType; int iHit; XDbfTable *pTable = db.Open(xsDbfFile); if(pTable) { pTable->MoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("chacmd"), csName); GET_FIELD(pTable, _T("engcmd"), csCmd); GET_FIELD(pTable, _T("explain"), csDescribe); GET_FIELD(pTable, _T("icon"), csIcon); GET_FIELD(pTable, _T("flag"), iHit); GET_FIELD(pTable, _T("type"), csType); if(iHit > 0) lstToolbarData.Append(new CToolbarData(csType, csCmd, csName, csDescribe, csIcon, iHit)); pTable->MoveNext(); } } else{ return; } lstToolbarData.QuickSort(CToolbarData::SortByItem); // cet 2015.1.7 add 排序后分隔符位置在索引0位置引发错误导致无法生成工具栏 if(lstToolbarData[0]->m_csType == _T("1")) { lstToolbarData.Swap(0, 5); } CoInitialize(NULL); IAcadApplication *pApp = NULL; AfxGetApp()->GetIDispatch(FALSE)->QueryInterface(__uuidof(IAcadApplication), (void **)&pApp); if (pApp == NULL) { return; } IAcadMenuGroupsPtr pMenuGroups = pApp->GetMenuGroups(); if(pMenuGroups == NULL){ pApp->Release(); CoUninitialize(); return; } long cnt = 0; pMenuGroups->get_Count(&cnt); IAcadMenuGroupPtr mnuGrp = NULL; IAcadMenuGroupPtr pMnuGrp = NULL; for(long i=0;iItem(vtName); if(mnuGrp == NULL){ pApp->Release(); CoUninitialize(); return; } BSTR grpName; mnuGrp->get_Name(&grpName); CString cgrpName(grpName); if (cgrpName.CompareNoCase(_T("Acad"))==0) { pMnuGrp = mnuGrp; break; } } if(pMnuGrp == NULL){ pApp->Release(); CoUninitialize(); return; } IAcadToolbarsPtr tlbrs = NULL; IAcadToolbarPtr tlbr = NULL; pMnuGrp->get_Toolbars(&tlbrs); CleanUpToolbars(tlbrs); _bstr_t bToolbarsName = (const TCHAR*)csToolbarsName; tlbr = tlbrs->Add(bToolbarsName); if(tlbr == NULL){ pApp->Release(); CoUninitialize(); return; } VARIANT index; index.vt = VT_I4; index.lVal = 100l; VARIANT vtFalse; vtFalse.vt = VT_BOOL; vtFalse.boolVal = VARIANT_FALSE; //VARIANT_TRUE 有下一级 int count = lstToolbarData.Length(); for(int j=0;jm_csType == _T("1")){ continue; } IAcadToolbarItemPtr button = NULL; _bstr_t bName = lstToolbarData[j]->m_csName; _bstr_t bDescribe = lstToolbarData[j]->m_csDescribe; CString csTmp = lstToolbarData[j]->m_csCmd; CString csCmd = _T("\33\33"); if(csTmp.Find(_T(";")) > -1){ //lisp命令 int idx = csTmp.Find(_T(";")); CString csLeft = csTmp.Left(idx); CString csRight = csTmp.Right(csTmp.GetLength() - idx - 1); csCmd = csCmd + csLeft + _T("\n") + csRight + _T("\n"); } else if(_tcsicmp(csTmp, _T("'OpenAllLayer")) == 0) //透明命令,不需要打断之前命令 csCmd = lstToolbarData[j]->m_csCmd + _T("\n"); else csCmd = csCmd + lstToolbarData[j]->m_csCmd + _T("\n"); _bstr_t bCmd = csCmd; _bstr_t bIcon = lstToolbarData[j]->m_csIcon; button = tlbr->AddToolbarButton(index, bName, bDescribe, bCmd, vtFalse); HINSTANCE hInstance = LoadLibrary(xsDllFile); HBITMAP hBmp = NULL; hBmp = LoadBitmap(hInstance, lstToolbarData[j]->m_csIcon); if(hBmp) button->SetBitmaps(bIcon, bIcon); if(j > 0 && lstToolbarData[j-1]->m_csType == _T("1")){ tlbr->AddSeparator(index); } } if(iToolbarPos == 0) tlbr->Dock(acToolbarDockTop); else if(iToolbarPos == 1) tlbr->Dock(acToolbarDockBottom); else if(iToolbarPos == 2) tlbr->Dock(acToolbarDockLeft); else tlbr->Dock(acToolbarDockRight); pApp->Release(); CoUninitialize(); }