Files
envi-code/SourceCode/Code2026/tg_shs/shs_public/toolbar.cpp
T
2026-09-28 15:28:50 +08:00

597 lines
14 KiB
C++

#include "stdafx.h"
#include <actrans.h>
#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\\<<Unnamed Profile>>"), csRegUnname);
CString sTemp = csRegUnname;
csRegUnname.Format(_T("%s\\Profiles\\<<Unnamed Profile>>"), 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;i<cnt;i++){
VARIANT vtName;
vtName.vt = VT_I4;
vtName.lVal = i;
mnuGrp = pMenuGroups->Item(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;i<cnt;i++){
VARIANT vtName;
vtName.vt = VT_I4;
vtName.lVal = i;
mnuGrp = pMenuGroups->Item(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;i<cnt;i++){
VARIANT vtName;
vtName.vt = VT_I4;
vtName.lVal = i;
mnuGrp = pMenuGroups->Item(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<CToolbarData> 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;i<cnt;i++){
VARIANT vtName;
vtName.vt = VT_I4;
vtName.lVal = i;
mnuGrp = pMenuGroups->Item(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;j<count;j++){
if(lstToolbarData[j]->m_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();
}