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

📄 smileyentity.cpp

📁 autocad 编程 对autocad 开发软件的朋友提供
💻 CPP
📖 第 1 页 / 共 2 页
字号:
STDMETHODIMP CSmileyEntity::put_MouthLeft(VARIANT var)
{
    try
    {
        AcAxPoint3d pt = var;
        AXEntityDocLock(m_objId);

        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForWrite,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        
        pSmiley->setMouthLeft(pt);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
    catch(const HRESULT hr)
    {
        return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
    }
	return S_OK;
}

STDMETHODIMP CSmileyEntity::get_MouthBottom(VARIANT* pv)
{
	CHECKOUTPARAM(pv);
    try
    {
        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForRead,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        AcAxPoint3d pt = pSmiley->mouthBottom();
        pt.setVariant(pv);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
    catch(const HRESULT hr)
    {
        return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
    }
	return S_OK;
}

STDMETHODIMP CSmileyEntity::put_MouthBottom(VARIANT var)
{
    try
    {
        AcAxPoint3d pt = var;
        AXEntityDocLock(m_objId);

        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForWrite,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        
        pSmiley->setMouthBottom(pt);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
    catch(const HRESULT hr)
    {
        return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
    }
	return S_OK;
}

STDMETHODIMP CSmileyEntity::get_MouthRight(VARIANT* pv)
{
	CHECKOUTPARAM(pv);
    try
    {
        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForRead,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        AcAxPoint3d pt = pSmiley->mouthRight();
        pt.setVariant(pv);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
    catch(const HRESULT hr)
    {
        return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
    }
	return S_OK;
}

STDMETHODIMP CSmileyEntity::put_MouthRight(VARIANT var)
{
    try
    {
        AcAxPoint3d pt = var;
        AXEntityDocLock(m_objId);

        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForWrite,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        
        pSmiley->setMouthRight(pt);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
    catch(const HRESULT hr)
    {
        return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
    }
	return S_OK;
}

STDMETHODIMP CSmileyEntity::ScaleRadius(double r)
{
    try 
    {
        AXEntityDocLock(m_objId);

        Acad::ErrorStatus es;
        AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForWrite,Adesk::kTrue);
	    if((es=pSmiley.openStatus()) != Acad::eOk)
            throw es;
        
        pSmiley->scaleRadius(r);
    }
    catch(const Acad::ErrorStatus)
    {
        return Error(L"Failed to open object.",IID_ISmileyEntity,E_FAIL);
    }
	return S_OK;
}


// IOPMPropertyExpander
// This is used to get the value for an element in a group.
// The element is identified by the dwCookie parameter
STDMETHODIMP CSmileyEntity::GetElementValue(
	/* [in] */ DISPID dispID,
	/* [in] */ DWORD dwCookie,
	/* [out] */ VARIANT * pVarOut)
{
    CHECKOUTPARAM(pVarOut);
    if ( 0x02 == dispID || 0x03 == dispID || ( dispID >= 0x07 && dispID <= 0x0A ))
    {
        try
        {
            if( dwCookie > 2 )
                throw Acad::eInvalidInput;
            Acad::ErrorStatus es;
            AcDbObjectPointer<AsdkSmiley> pSmiley(m_objId,AcDb::kForRead,Adesk::kTrue);
	        if(( es = pSmiley.openStatus()) != Acad::eOk)
                throw es;

            AcAxPoint3d pt;
			switch( dispID )
            {
			    case 0x02:
					pt = pSmiley->center();
					break;
			    case 0x03:
				    pt = pSmiley->normal();
					break;
			    case 0x07:
				    pt = pSmiley->mouthCenter();
					break;
			    case 0x08:
				    pt = pSmiley->mouthLeft();
					break;
			    case 0x09:
				    pt = pSmiley->mouthBottom();
					break;
			    case 0x0A:
				    pt = pSmiley->mouthRight();
					break;
			    default:
				    throw Acad::eInvalidInput;
			}
			acdbWcs2Ucs( asDblArray( pt ), asDblArray( pt ), Adesk::kTrue );
			::VariantCopy( pVarOut,&CComVariant( pt[dwCookie] ));
        }
        catch( const Acad::ErrorStatus )
        {
            return Error( L"Failed to open object", IID_ISmileyEntity, E_FAIL );
        }
        catch( const HRESULT hr )
        {
            return Error( L"Invalid argument.", IID_ISmileyEntity, hr );
        }
    }
	return S_OK;
}

// IOPMPropertyExpander
// This is used to set the value for an element in a group.
// The element is identified by the dwCookie parameter
STDMETHODIMP CSmileyEntity::SetElementValue(
	/* [in] */ DISPID dispID,
	/* [in] */ DWORD dwCookie,
	/* [in] */ VARIANT VarIn)
{
    if ( 0x02 == dispID || 0x03 == dispID || ( dispID >= 0x08 && dispID <= 0x0A ))
    {
        try
        {
            if ( dwCookie > 2 )
                throw Acad::eInvalidInput;
            Acad::ErrorStatus es;
            AcDbObjectPointer<AsdkSmiley> pSmiley( m_objId, AcDb::kForWrite, Adesk::kTrue );
	        if(( es = pSmiley.openStatus()) != Acad::eOk )
                throw es;

            AcAxPoint3d pt;
			switch( dispID )
            {
			    case 0x02:
					pt = pSmiley->center();
					break;
			    case 0x03:
				    pt = pSmiley->normal();
					break;
			    case 0x08:
				    pt = pSmiley->mouthLeft();
					break;
			    case 0x09:
				    pt = pSmiley->mouthBottom();
					break;
			    case 0x0A:
				    pt = pSmiley->mouthRight();
					break;
			    default:
				    throw Acad::eInvalidInput;
			}
            //translate from wcs to ucs
            acdbEcs2Ucs(asDblArray(pt),asDblArray(pt),asDblArray(pSmiley->normal()),Adesk::kTrue);

			pt[dwCookie] = V_R8(&VarIn);

            acdbUcs2Wcs(asDblArray(pt),asDblArray(pt),Adesk::kTrue);

			switch ( dispID )
            {
			    case 0x02:
					pSmiley->setCenter( pt );
					break;
			    case 0x03:
				    pSmiley->setNormal( pt.asVector() );
					break;
			    case 0x08:
				    pSmiley->setMouthLeft( pt );
					break;
			    case 0x09:
				    pSmiley->setMouthBottom( pt );
					break;
			    case 0x0A:
				    pSmiley->setMouthRight( pt );
					break;
			}
        }
        catch(const Acad::ErrorStatus)
        {
            return Error(L"Failed to open object",IID_ISmileyEntity,E_FAIL);
        }
        catch(const HRESULT hr)
        {
            return Error(L"Invalid argument.",IID_ISmileyEntity,hr);
        }

    }
	return S_OK;
}

// IOPMPropertyExpander
// This is called to get the display string for each element in a group.
// We return strings for each coordinate for this object
STDMETHODIMP CSmileyEntity::GetElementStrings( 
	/* [in] */ DISPID dispID,
	/* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,
	/* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut)
{
    if ( 0x02 == dispID || 0x03 == dispID || ( dispID >= 0x07 && dispID <= 0x0A ))
    {
        long size = 3;
        pCaStringsOut->pElems = (LPOLESTR *)::CoTaskMemAlloc(sizeof(LPOLESTR) * size);
        pCaCookiesOut->pElems = (DWORD *)::CoTaskMemAlloc(sizeof(DWORD) * size);
        for ( long i=0; i<size; i++)
            pCaCookiesOut->pElems[i] = i;
        pCaStringsOut->cElems = size;
        pCaCookiesOut->cElems = size;

		switch ( dispID )
        {
			case 0x02:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"Center X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"Center Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"Center Z");
				break;
			case 0x03:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"Normal X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"Normal Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"Normal Z");
				break;
			case 0x07:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"MouthCenter X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"MouthCenter Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"MouthCenter Z");
				break;
			case 0x08:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"MouthLeft X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"MouthLeft Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"MouthLeft Z");
				break;
			case 0x09:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"MouthBottom X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"MouthBottom Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"MouthBottom Z");
				break;
			case 0x0A:
				pCaStringsOut->pElems[0] = ::SysAllocString(L"MouthRight X");
				pCaStringsOut->pElems[1] = ::SysAllocString(L"MouthRight Y");
				pCaStringsOut->pElems[2] = ::SysAllocString(L"MouthRight Z");
				break;
		}
    }

    return S_OK;
}

// IOPMPropertyExpander
// This function is called to determine the number of elements in a group
// It defaults to the number of elements in the array (3 in this case)
STDMETHODIMP CSmileyEntity::GetElementGrouping(
    /* [in] */ DISPID dispID,
	/* [out] */ short *groupingNumber)
{
    return E_NOTIMPL;
}

// IOPMPropertyExpander
// This function is called to determine how many groups there are in
// the array.
// For example in case of the polyline this is the number of vertices.
// We are not implementing this because it defaults to nGroupCnt = 0
STDMETHODIMP CSmileyEntity::GetGroupCount(
    /* [in] */ DISPID dispID,
	/* [out] */ long *nGroupCnt)
{
    return E_NOTIMPL;
}

// OPM calls this function for each property to obtain a list of strings and cookies if they are available.
// This function is declared on the IPerPropertyBrowsing interface. Our IOPMPropertyExtensionImpl
// class implements this member by reading the values in the OPM property map.
STDMETHODIMP CSmileyEntity::GetPredefinedStrings(DISPID dispID, CALPOLESTR *pCaStringsOut, CADWORD *pCaCookiesOut)
{
	return IOPMPropertyExtensionImpl<CSmileyEntity>::GetPredefinedStrings(dispID,pCaStringsOut,pCaCookiesOut);
}

// OPM calls this function when the user selects an element from a drop down list. OPM provides
// the cookie that we associated with the element in the GetPredefinedStrings function. We are
// responsible for mapping this cookie back to a value that the properties corresponding put_ function
// can understand. 
// In this particular case all we need to do is to provide the name of the text style as
// the put_TextStyle method needs that.
STDMETHODIMP CSmileyEntity::GetPredefinedValue(DISPID dispID, DWORD dwCookie, VARIANT *pVarOut)
{
	return IOPMPropertyExtensionImpl<CSmileyEntity>::GetPredefinedValue(dispID,dwCookie,pVarOut);
}

STDMETHODIMP CSmileyEntity::GetCategoryName(PROPCAT propcat, LCID lcid, BSTR* pbstrName)
{
	switch ( propcat )
	{
	case PROPCAT_Face:
		*pbstrName = ::SysAllocString(L"Face");
		break;
	case PROPCAT_Eyes:
		*pbstrName = ::SysAllocString(L"Eyes");
		break;
	case PROPCAT_Mouth:
		*pbstrName = ::SysAllocString(L"Mouth");
		break;
	default:
		return S_FALSE;
	}
	return S_OK;
}

⌨️ 快捷键说明

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