ObjectARX

Reply
Active Member
masterhe3000
Posts: 10
Registered: ‎06-01-2009
Message 1 of 3 (215 Views)
Accepted Solution

SubEntity in SDK sample can't work.

215 Views, 2 Replies
09-10-2012 07:04 PM

I try to run SubEntity sample in autocad2007/8/9,but Property Palette can't display the properties of the sub-entity selected.Can somebody help me? Thanks!

Hi,

 

I have replied to your other thread.

Posting the same here for completeness and it might help others in future.

 

<<<<

Thanks to my colleague Gopinath Taget who got this sample working with help from the engineering team.

 

Here are the changes and the sample project :

 

 

The key is to inherit from IAcadSubEntity in the IDL file for your interface:

 

interface ICrank : IAcadSubEntity

 

And in the implementation header, Inherit from the IAcadBaseSubEntityImpl and IOPMPropertyExtensionImpl templates like this:

 

//----- CCrank

class ATL_NO_VTABLE CCrank :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CCrank, &CLSID_Crank>,

public ISupportErrorInfo,

public IAcadBaseSubEntityImpl<CCrank, &CLSID_Crank, ICrank, &IID_ICrank, &LIBID_AsdkSliderCrankDbLib>,

public IOPMPropertyExtensionImpl<CCrank>

 

Also make sure that the inherted templates are properly mapped like this:

 

BEGIN_COM_MAP(CCrank)

COM_INTERFACE_ENTRY(ICrank)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(ISupportErrorInfo)

COM_INTERFACE_ENTRY(IConnectionPointContainer)

COM_INTERFACE_ENTRY(IRetrieveApplication)

COM_INTERFACE_ENTRY(IAcadSubEntity)

COM_INTERFACE_ENTRY(IAcadBaseSubEntity)

COM_INTERFACE_ENTRY(IOPMPropertyExtension)

END_COM_MAP()

 

Finally, implement the GetResourceInstance and GetDisplayName methods of the IOpmPropertyExtension/IOpmPropertyExtensionImpl interfaces like this:

 

virtual HINSTANCE GetResourceInstance()

{

HINSTANCE hi = _AtlBaseModule.GetResourceInstance();

HINSTANCE dllHi = _hdllInstance;

return hi;

}

 

STDMETHODIMP GetDisplayName(

DISPID dispID,

BSTR *pBstr)

{

if (dispID == 0x401) { // magic dispID meaning object itself

if (pBstr==NULL)

return E_POINTER;

*pBstr = ::smileyfrustrated:ysAllocString(L"TheCrank");

return S_OK;

}

return IOPMPropertyExtensionImpl<CCrank>::GetDisplayName(

dispID, pBstr);

}

 

The proper implementation of GetDisplayName method is vital for the subentity OPM to work.

 

I am attaching the sample with these modifications to the Crank subentity. Similar modifications need to be made to the other sub entities as well.

>>>>

ADN Support Specialist
Balaji_Ram
Posts: 733
Registered: ‎03-21-2011
Message 2 of 3 (196 Views)

Re: SubEntity in SDK sample can't work.

09-14-2012 07:53 AM in reply to: masterhe3000

Sorry, This is a known issue.

To my understanding, the sample was not fixed.



Balaji
Developer Technical Services
Autodesk Developer Network

ADN Support Specialist
Balaji_Ram
Posts: 733
Registered: ‎03-21-2011
Message 3 of 3 (181 Views)

Re: SubEntity in SDK sample can't work.

09-18-2012 12:03 AM in reply to: masterhe3000

Hi,

 

I have replied to your other thread.

Posting the same here for completeness and it might help others in future.

 

<<<<

Thanks to my colleague Gopinath Taget who got this sample working with help from the engineering team.

 

Here are the changes and the sample project :

 

 

The key is to inherit from IAcadSubEntity in the IDL file for your interface:

 

interface ICrank : IAcadSubEntity

 

And in the implementation header, Inherit from the IAcadBaseSubEntityImpl and IOPMPropertyExtensionImpl templates like this:

 

//----- CCrank

class ATL_NO_VTABLE CCrank :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CCrank, &CLSID_Crank>,

public ISupportErrorInfo,

public IAcadBaseSubEntityImpl<CCrank, &CLSID_Crank, ICrank, &IID_ICrank, &LIBID_AsdkSliderCrankDbLib>,

public IOPMPropertyExtensionImpl<CCrank>

 

Also make sure that the inherted templates are properly mapped like this:

 

BEGIN_COM_MAP(CCrank)

COM_INTERFACE_ENTRY(ICrank)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(ISupportErrorInfo)

COM_INTERFACE_ENTRY(IConnectionPointContainer)

COM_INTERFACE_ENTRY(IRetrieveApplication)

COM_INTERFACE_ENTRY(IAcadSubEntity)

COM_INTERFACE_ENTRY(IAcadBaseSubEntity)

COM_INTERFACE_ENTRY(IOPMPropertyExtension)

END_COM_MAP()

 

Finally, implement the GetResourceInstance and GetDisplayName methods of the IOpmPropertyExtension/IOpmPropertyExtensionImpl interfaces like this:

 

virtual HINSTANCE GetResourceInstance()

{

HINSTANCE hi = _AtlBaseModule.GetResourceInstance();

HINSTANCE dllHi = _hdllInstance;

return hi;

}

 

STDMETHODIMP GetDisplayName(

DISPID dispID,

BSTR *pBstr)

{

if (dispID == 0x401) { // magic dispID meaning object itself

if (pBstr==NULL)

return E_POINTER;

*pBstr = ::smileyfrustrated:ysAllocString(L"TheCrank");

return S_OK;

}

return IOPMPropertyExtensionImpl<CCrank>::GetDisplayName(

dispID, pBstr);

}

 

The proper implementation of GetDisplayName method is vital for the subentity OPM to work.

 

I am attaching the sample with these modifications to the Crank subentity. Similar modifications need to be made to the other sub entities as well.

>>>>



Balaji
Developer Technical Services
Autodesk Developer Network

Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Announcements
Are You Going To Be @ AU 2014? Feel free to drop by our AU topic post and share your plans, plug a class that you're teaching, or simply check out who else from the community might be in attendance. Ohh and don't forgot to stop by the Autodesk Help | Learn | Collaborate booths in the Exhibit Hall and meet our community team if you get a chance!