⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inspectorbar.cpp

📁 AUTOCAD 程序员使用的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//-----------------------------------------------------------------------------
//----- InspectorBar.cpp : implementation file
#include "StdAfx.h"
#include "StdArx.h"
#include "resource.h"

#include "SmartPtr.h"
#include "AcDialogBar.h"
#include "InspectorBar.h"

#pragma warning (disable : 4101)

//-----------------------------------------------------------------------------
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//-----------------------------------------------------------------------------
#define MODIFIED_COLOR RGB (255, 0, 0)

extern HINSTANCE _hdllInstance ;
extern HINSTANCE hBitmapRes ;

//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC (CInspectorBar, CAcDialogBar)

BEGIN_MESSAGE_MAP(CInspectorBar, CAcDialogBar)
	//{{AFX_MSG_MAP(CInspectorBar)
	ON_WM_SIZE()
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_MENU, OnMenu)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI_RANGE (0x0000, 0xffff, OnUpdateUI) //----- See TN031

	ON_COMMAND (ID_SEEICONS, OnSeeIcons)
	ON_COMMAND (ID_SEEKEYS, OnSeeKeys)
	ON_COMMAND (ID_SEESYMBOLNAMES, OnSeeSymbolNames)
	ON_COMMAND (ID_SEEDXFNAMES, OnSeeDxfNames)
	ON_COMMAND (ID_SEEOBJECTIDS, OnSeeObjectIds)
	ON_COMMAND (ID_SEEERASEDOBJECTS, OnSeeErasedObjects)
	ON_COMMAND (ID_AUTOSCROLL, OnAutoScroll)
	ON_COMMAND (ID_ABOUT, OnAbout)
END_MESSAGE_MAP()

//-----------------------------------------------------------------------------
CInspectorBar::CInspectorBar () : CAcDialogBar () {
	//{{AFX_DATA_INIT(CInspectorBar)
	//}}AFX_DATA_INIT

	//----- Tree control
	mpTree =NULL ;

	//----- Options
	mbSeeIcons =TRUE ;
	mbSeeKeys =TRUE ;
	mbSeeSymbolNames =TRUE ;
	mbSeeDxfNames =FALSE ; //----- versus AcDb names
	mbSeeObjectIds =TRUE ;
	mbSeePersReactors =FALSE ;
	mbSeeXdatas =FALSE ;
	mbSeeReactors =FALSE ;
	mbSeeErasedObjects =TRUE ;

	mbFlag =FALSE ;
}

CInspectorBar::~CInspectorBar () {
	if ( mpTree )
		delete mpTree ;
}

void CInspectorBar::DoDataExchange (CDataExchange *pDX) {
	CAcDialogBar::DoDataExchange (pDX) ;
	//{{AFX_DATA_MAP(CInspectorBar)
	//}}AFX_DATA_MAP
}

//-----------------------------------------------------------------------------
void CInspectorBar::OnUpdateUI (CCmdUI *pCmdUI) {
}

//-----------------------------------------------------------------------------
BOOL CInspectorBar::Create (CFrameWnd *pParent, UINT nIDTemplate, UINT style, UINT nID) {
	if ( !CAcDialogBar::Create (pParent, nIDTemplate, style, nID) )
		return (FALSE) ;

	//----- Docked-Resize feature
	mSizeCurrent =m_sizeDefault ;

	//----- Custom Tree control
	mpTree =new TTreeCtrl ;
	mpTree->mbEnableMenu =FALSE ;
	mpTree->SubclassDlgItem (IDC_TREE, this) ;

	//----- Set Image list
	AssignImages () ;

	//----- Give the focus to AutoCAD, if not doing this all
	//----- keyboard inputs will be invalid inputs...
	acedGetAcadDockCmdLine ()->PostMessage (WM_SETFOCUS, 0L, 0L) ;

	return (TRUE) ;
}

//-----------------------------------------------------------------------------
void CInspectorBar::PasteBmpInBmp (CBitmap *org, CBitmap *dest, COLORREF corg /*=RGB (255, 0, 255)*/) {
	CDC *pdc =GetDC () ;
	CDC memdc1 ;
	memdc1.CreateCompatibleDC (pdc) ;
	CBitmap *old1 =memdc1.SelectObject (org) ;
	CDC memdc2 ;
	memdc2.CreateCompatibleDC (pdc) ;
	CBitmap *old2 =memdc2.SelectObject (dest) ;

	for ( int i =0 ; i < 16 ; i++ ) {
		for ( int j =0 ; j < 16 ; j++ ) {
			COLORREF cr =memdc1.GetPixel (i, j) ;
			if ( cr != corg )
				memdc2.SetPixel (i, j, cr) ;
		}
	}
	memdc1.SelectObject (old1) ;
	memdc2.SelectObject (old2) ;
	ReleaseDC (pdc) ;
}

void CInspectorBar::CleanBmp (CBitmap *bm, COLORREF corg /*=RGB (192, 192, 192)*/, COLORREF ncr /*=RGB (255, 255, 255)*/) {
	CDC *pdc =GetDC () ;
	CDC memdc1 ;
	memdc1.CreateCompatibleDC (pdc) ;
	CBitmap *old1 =memdc1.SelectObject (bm) ;
	for ( int i =0 ; i < 16 ; i++ ) {
		for ( int j =0 ; j < 16 ; j++ ) {
			COLORREF r =memdc1.GetPixel (i, j) ;
			if ( memdc1.GetPixel (i, j) == corg )
				memdc1.SetPixel (i, j, ncr) ;
		}
	}
	memdc1.SelectObject (old1) ;
	ReleaseDC (pdc) ;
}

//-----------------------------------------------------------------------------
#define NB_BMP		46
#define ERASED		1
#define MODIFIED	2
#define ER_AND_MD	3 //----- ERASED and MODIFIED

#define LOADBMINIMG(h,a,b) \
	AfxSetResourceHandle (h) ;\
	pBitmap->LoadBitmap (b) ;\
	CleanBmp (pBitmap) ;\
	mImgMap.SetAt (a, (void *)mImgIcons.Add (pBitmap, RGB (254, 255, 255))) ;\
	PasteBmpInBmp (&erased, pBitmap, RGB (255, 0, 255)) ;\
	mImgIcons.Add (pBitmap, RGB (254, 255, 255)) ;\
	pBitmap->LoadBitmap (b) ;\
	CleanBmp (pBitmap) ;\
	PasteBmpInBmp (&modified, pBitmap, RGB (255, 0, 255)) ;\
	mImgIcons.Add (pBitmap, RGB (254, 255, 255)) ;\
	PasteBmpInBmp (&erased, pBitmap, RGB (255, 0, 255)) ;\
	mImgIcons.Add (pBitmap, RGB (254, 255, 255)) ;

void CInspectorBar::AssignImages () {
	//----- Temporary objects
	AfxSetResourceHandle (_hdllInstance) ;

	CBitmap erased, modified ;
	erased.LoadBitmap (IDB_SMALL_ERASED) ;
	modified.LoadBitmap (IDB_SMALL_MODIFIED) ;

	//----- Image Initialization
	CBitmap *pBitmap =new CBitmap ;
	mImgIcons.Create (16, 16, FALSE, 4 * NB_BMP, 8) ;

	//----- Load Bitmaps/Icons
	//----- General
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcRxObject"), IDB_OBJECT) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbEntity"), IDB_ENTITY) ;

	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbProxyObject"), IDB_PROXY) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbProxyEntity"), IDB_PROXY) ;

	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbDatabase"), IDB_DATABASE) ;

	//----- Database Resident
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbSymbolTable"), IDB_SYMBOLTABLE) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbSymbolTableRecord"), IDB_SYMBOLTABLERECORD) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbDictionary"), IDB_DICTIONARY) ;

	//----- Basics
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbPoint"), _T(/*NOXLATE*/"ICON_16_POINT")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbFace"), _T(/*NOXLATE*/"ICON_16_3DFACE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbSolid"), _T(/*NOXLATE*/"ICON_16_SOLID")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbTrace"), _T(/*NOXLATE*/"ICON_16_TRACE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbFcf"), _T(/*NOXLATE*/"ICON_16_TOLERA")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbMline"), _T(/*NOXLATE*/"ICON_16_MLINE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbShape"), _T(/*NOXLATE*/"ICON_16_SHAPE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbText"), _T(/*NOXLATE*/"ICON_16_TEXT")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbAttribute"), _T(/*NOXLATE*/"ICON_16_ATTEDI")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbAttributeDefinition"), _T(/*NOXLATE*/"ICON_16_ATTDEF")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbMText"), _T(/*NOXLATE*/"ICON_16_MTEXT")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbViewport"), _T(/*NOXLATE*/"ICON_16_VPORTS")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbFrame"), _T(/*NOXLATE*/"ICON16_16_INSOLE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbHatch"), _T(/*NOXLATE*/"ICON_16_HATCH")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbImage"), _T(/*NOXLATE*/"ICON_16_IMAGE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbPolyFaceMesh"), _T(/*NOXLATE*/"ICON_16_3DFACE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbPolygonMesh"), _T(/*NOXLATE*/"ICON_16_3DMESH")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbBlockReference"), _T(/*NOXLATE*/"ICON_16_BLOCK")) ;
	//----- Curves
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbLine"), _T(/*NOXLATE*/"ICON_16_LINE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbRay"), _T(/*NOXLATE*/"ICON_16_RAY")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbXline"), _T(/*NOXLATE*/"ICON_16_XLINE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbArc"), _T(/*NOXLATE*/"ICON_16_ARC3PT")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbCircle"), _T(/*NOXLATE*/"ICON_16_CIRCLE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbEllipse"), _T(/*NOXLATE*/"ICON_16_ELLIPS")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbSpline"), _T(/*NOXLATE*/"ICON_16_SPLINE")) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbLeader"), IDB_LEADER) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbPolyline"), _T(/*NOXLATE*/"ICON_16_PLINE")) ;
	//----- Complex
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDb2dPolyline"), _T(/*NOXLATE*/"ICON_16_PLINE")) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDb3dPolyline"), _T(/*NOXLATE*/"ICON_16_3DPOLY")) ;
	//----- Dimensions
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbDimension"), _T(/*NOXLATE*/"ICON_16_DIMBAS")) ;
	//----- Subentities
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbVertex"), IDB_SUBENTITY) ;
	//----- Bracket Entities
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbBlockBegin"), IDB_BEGIN) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbBlockEnd"), IDB_SEQEND) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbSequenceEnd"), IDB_SEQEND) ;
	//----- ACIS based
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDbBody"), IDB_BODY) ;
	LOADBMINIMG (_hdllInstance, _T(/*NOXLATE*/"AcDb3dSolid"), IDB_3DSOLID) ;
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbRegion"), _T(/*NOXLATE*/"ICON_16_REGION")) ;
	//----- Others
	LOADBMINIMG (hBitmapRes, _T(/*NOXLATE*/"AcDbGroup"), _T(/*NOXLATE*/"ICON_16_GROUP")) ;

	//----- Restoring AutoCAD resource instance
	AfxSetResourceHandle (acedGetAcadResourceInstance ()) ;

	//----- Attach Image List to the Tree Control
	if ( mbSeeIcons )
		mpTree->SetImageList (&mImgIcons, TVSIL_NORMAL) ;

	delete pBitmap ;
}

//-----------------------------------------------------------------------------
void CInspectorBar::OnSize(UINT nType, int cx, int cy) {
	CAcDialogBar::OnSize (nType, cx, cy) ;
	
	if ( mpTree != NULL ) {
		//----- Move Tree
		CRect rectTree ;
		mpTree->GetWindowRect (rectTree) ;
		ScreenToClient (rectTree) ;
		rectTree.right =cx - rectTree.left ;
		rectTree.bottom =cy - rectTree.left ;
		mpTree->MoveWindow (rectTree, TRUE) ;
	}
}

//-----------------------------------------------------------------------------
//----- AutoCAD Database related
HTREEITEM CInspectorBar::InsertItem (LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter, AcRxObject *pObj, int image) {
	TV_INSERTSTRUCT tvInsertStruct ;

	tvInsertStruct.hParent =hParent ;
	tvInsertStruct.hInsertAfter =hInsertAfter ;
	tvInsertStruct.item.mask =TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_STATE ;
	tvInsertStruct.item.pszText =(LPTSTR)lpszItem ;
	tvInsertStruct.item.iImage =image ;
	tvInsertStruct.item.iSelectedImage =image ;
	tvInsertStruct.item.state =TVIS_BOLD ;
	tvInsertStruct.item.stateMask =TVIS_STATEIMAGEMASK | TVIS_BOLD ;
	tvInsertStruct.item.cChildren =0 ;
	if ( pObj->isKindOf (AcDbObject::desc ()) ) {
		tvInsertStruct.item.lParam =(LPARAM)((AcDbObject *)pObj)->objectId ().asOldId () ;
		if ( ((AcDbObject *)pObj)->isErased () == Adesk::kTrue )
			tvInsertStruct.item.state =0 ;
	} else {
		tvInsertStruct.item.lParam =(LPARAM)pObj ;
	}

	HTREEITEM hItem =mpTree->InsertItem (&tvInsertStruct) ;

	if ( pObj->isKindOf (AcDbObject::desc ()) && ((AcDbObject *)pObj)->isModified () )
		mpTree->SetItemColor (hItem, MODIFIED_COLOR) ;

	mpTree->Invalidate (FALSE) ;
	return (hItem) ;
}

HTREEITEM CInspectorBar::CreateItem (LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter, AcRxObject *pObj) {
	HTREEITEM hItem =InsertItem (lpszItem, hParent, hInsertAfter, pObj, GetImage (pObj)) ;

	return (hItem) ;
}

CString CInspectorBar::GetTitle (AcRxObject *pObj) {
	char *pText =NULL ;

	try {
		USES_OKEYS ;
		CString st ;

		//----- SymbolTable
		if ( pObj->isKindOf (AcDbBlockTable::desc ()) )
			st =GetString (IDS_BLOCKTABLE) ;
		else if ( pObj->isKindOf (AcDbDimStyleTable::desc ()) )
			st =GetString (IDS_DIMSTYLETABLE) ;
		else if ( pObj->isKindOf (AcDbLayerTable::desc ()) )
			st =GetString (IDS_LAYERTABLE) ;
		else if ( pObj->isKindOf (AcDbLinetypeTable::desc ()) )
			st =GetString (IDS_LINETYPETABLE) ;
		else if ( pObj->isKindOf (AcDbRegAppTable::desc ()) )
			st =GetString (IDS_REGAPPTABLE) ;
		else if ( pObj->isKindOf (AcDbTextStyleTable::desc ()) )
			st =GetString (IDS_TEXTSTYLETABLE) ;
		else if ( pObj->isKindOf (AcDbUCSTable::desc ()) )
			st =GetString (IDS_UCSTABLE) ;
		else if ( pObj->isKindOf (AcDbViewTable::desc ()) )
			st =GetString (IDS_VIEWTABLE) ;
		else if ( pObj->isKindOf (AcDbViewportTable::desc ()) )
			st =GetString (IDS_VIEWPORTTABLE) ;

		//----- SymbolTableRecord
		else if ( pObj->isKindOf (AcDbSymbolTableRecord::desc ()) ) {
			ARXOK ( ((AcDbSymbolTableRecord *)pObj)->getName (pText) ) ;
			st =CString (pText) ;
			delete pText ;
			pText =NULL ;
		}

		//----- SEQEND
		else if ( pObj->isKindOf (AcDbSequenceEnd::desc ()) )
			st =GetString (IDS_SEQEND) ;

		//----- Tag of Attribute
		else if ( pObj->isKindOf (AcDbAttributeDefinition::desc ()) ) {
			ARXNULL ( pText =((AcDbAttributeDefinition *)pObj)->tag () ) ;
			st =CString (pText) ;
			delete pText ;
			pText =NULL ;
		} else if ( pObj->isKindOf (AcDbAttribute::desc ()) ) {
			ARXNULL ( pText =((AcDbAttribute *)pObj)->tag () ) ;
			st =CString (pText) ;
			delete pText ;
			pText =NULL ;
		}

		//----- Entity
		else if ( pObj->isKindOf (AcDbEntity::desc ()) ) {
			if ( pObj->isKindOf (AcDbBlockReference::desc ()) ) {
				AcDbBlockTableRecord *pRec ;
				ARXOK ( actrTransactionManager->topTransaction ()->getObject ((AcDbObject *&)pRec, ((AcDbBlockReference *)pObj)->blockTableRecord (), AcDb::kForRead, Adesk::kTrue) ) ;
				ARXOK ( pRec->getName (pText) ) ;
				st =CString (pText) ;
				delete pText ;
				pText =NULL ;
			} else {
				st.Empty () ;
			}
		}

		//----- Dictionary
		else if ( pObj->isKindOf (AcDbObject::desc ()) ) {
			AcDbObjectId idOwner =((AcDbObject *)pObj)->ownerId () ;
			if ( idOwner == AcDbObjectId::kNull ) {
				st =GetString (IDS_NOD) ;
			} else {
				AcDbObject *pOwner ;
				ARXOK ( actrTransactionManager->topTransaction ()->getObject (pOwner, idOwner, AcDb::kForRead, Adesk::kTrue) ) ;
				if ( pOwner->isKindOf (AcDbDictionary::desc ()) ) {
					AcDbDictionary *pDict =(AcDbDictionary *)pOwner ;
					pDict->nameAt (((AcDbObject *)pObj)->objectId (), pText) ;
					st =CString (pText) ;
					delete pText ;
					pText =NULL ;
				} else if ( pObj->isKindOf (AcDbDictionary::desc ()) ) {
					st =GetString (IDS_EXTDICT) ;
				}
			}
		}
		return (st) ;
	} catch (const char *szMsg) {
		if ( pText != NULL )
			delete pText ;
		return (_T("")) ;
	}
}

CString CInspectorBar::GetName (AcRxObject *pObj) {
	CString title, symbol, id ;

	if ( mbSeeKeys )
		if ( !(title =GetTitle (pObj)).IsEmpty () )
			title =_T("\"") + title + _T("\"") ;

	if ( mbSeeSymbolNames ) {
		if ( mbSeeDxfNames )
			symbol =CString (pObj->isA ()->dxfName ()) ;
		else
			symbol =CString (pObj->isA ()->name ()) ;
	}

	if ( mbSeeObjectIds && pObj->isKindOf (AcDbObject::desc ()) )
		id.Format ("(%ld)", ((AcDbObject *)pObj)->objectId ().asOldId ()) ;

	if ( !title.IsEmpty () && (!symbol.IsEmpty () || !id.IsEmpty ()) )
		title +=_T(", ") ;
	title +=symbol ;
	if ( !symbol.IsEmpty () && !id.IsEmpty () )
		title +=_T(", ") ;
	title +=id ;

	return (title) ;
}

int CInspectorBar::GetImage (AcRxObject *pObj) {
	AcRxClass *pClass =pObj->isA () ;
	int i ;
	while ( !(i =(int)(mImgMap [pClass->name ()])) && (pClass =pClass->myParent ()) != NULL ) ;
	return (i) ;
}

//-----------------------------------------------------------------------------
HTREEITEM CInspectorBar::FindItemPosition (HTREEITEM hItem, DWORD data, BOOL bRecurs /*=FALSE*/) {
	HTREEITEM hChild =NULL ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -