Problem with custom blockReference

Problem with custom blockReference

Anonymous
Not applicable
541 Views
2 Replies
Message 1 of 3

Problem with custom blockReference

Anonymous
Not applicable

Hi,

 

I made a class inherited from AcDbBlockReference:

class PICBlock : public AcDbBlockReference
{
public:
	ACRX_DECLARE_MEMBERS(PICBlock);
	static void makeMembers(AcRxMemberCollectionBuilder& collectionBuilder, void* customData);

protected:
	static Adesk::UInt32 kCurrentVersionNumber;

public:
	PICBlock();
	PICBlock(const AcGePoint3d& position, AcDbObjectId  blockTableRec);

	Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const final;
	Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler)final;

	Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const final;
	Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler)final;

	Acad::ErrorStatus subClose()override;
	void setManagedWrapper(gcroot<Autodesk::PIC::MgPICBlock^> p);

private:

	gcroot<Autodesk::PIC::MgPICBlock^> m_pManaged; // the managed wrapper pointer.  
};


Adesk::UInt32 PICBlock::kCurrentVersionNumber = 1;

ACRX_DXF_DEFINE_MEMBERS_WITH_PROPERTIES(
	PICBlock, AcDbBlockReference,
	AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
	AcDbProxyEntity::kNoOperation, PIC-BLOCK,
	PICBLOCK
	"|Product Desc:     PIC-ACAD"
	"|Company:          So.Build"
	"|WEB Address:      www.sobuild.fr",
	PICBlock::makeMembers
	)


void PICBlock::makeMembers(
	AcRxMemberCollectionBuilder& collectionBuilder,
	void* customData)
{
	readFromResource("PIC_Attributs.xml", collectionBuilder);
}


PICBlock::PICBlock() : AcDbBlockReference()
{
	//
}

PICBlock::PICBlock(const AcGePoint3d& position, AcDbObjectId  blockTableRec) : AcDbBlockReference(position, blockTableRec)
{
	//
}

Acad::ErrorStatus PICBlock::dwgOutFields(AcDbDwgFiler* pFiler) const
{
	Acad::ErrorStatus retStat = AcDbBlockReference::dwgOutFields(pFiler);
	if (retStat != Acad::eOk)
		return retStat;

	retStat = pFiler->writeUInt32(PICBlock::kCurrentVersionNumber);
	return retStat;
}

Acad::ErrorStatus PICBlock::dwgInFields(AcDbDwgFiler* pFiler)
{
	assertWriteEnabled();
	Acad::ErrorStatus retStat = AcDbBlockReference::dwgInFields(pFiler);
	if (retStat != Acad::eOk)
		return retStat;

	Adesk::UInt32 uiVersion = 0;
	retStat = pFiler->readUInt32(&uiVersion);
	return retStat;
}

Acad::ErrorStatus PICBlock::dxfOutFields(AcDbDxfFiler* pFiler) const
{
	Acad::ErrorStatus retStat = AcDbBlockReference::dxfOutFields(pFiler);
	if (retStat != Acad::eOk)
		return retStat;

	retStat = pFiler->writeUInt32(AcDb::kDxfInt32, PICBlock::kCurrentVersionNumber);
	return retStat;
}

Acad::ErrorStatus PICBlock::dxfInFields(AcDbDxfFiler* pFiler)
{
	assertWriteEnabled();
	Acad::ErrorStatus retStat = AcDbBlockReference::dxfInFields(pFiler);
	if (retStat != Acad::eOk)
		return retStat;

	resbuf data;
	Adesk::UInt32 uiVersion = 0;
	retStat = pFiler->readItem(&data);
	if ((data.restype != AcDb::kDxfInt32) || (retStat != Acad::eOk))
		return (retStat != Acad::eOk) ? retStat : Acad::eNotApplicable;
	uiVersion = data.resval.rint;

	return retStat;
}

Acad::ErrorStatus PICBlock::subClose()
{
	Acad::ErrorStatus es;
	if ((es = AcDbBlockReference::subClose()) != Acad::eOk)
		return es;

	if (isWriteEnabled() == Adesk::kTrue)
	{
		//You have to cast it back to the managed type to do a null check:
		if (static_cast<Autodesk::PIC::MgPICBlock^>(m_pManaged) != nullptr)
		{
			// Call the method on the wrapper which will propagate to all managed
			// listeners of this event...
			m_pManaged->PICBlockModified(ToObjectId(objectId()));
		}
	}

	return Acad::eOk;
}

void PICBlock::setManagedWrapper(gcroot<Autodesk::PIC::MgPICBlock^> p)
{
	m_pManaged = p;
}


ACDB_REGISTER_OBJECT_ENTRY_AUTO(PICBlock)

 

but I can't have attributes I have an exception "illegal entity type"

and I can't create a dynamic block.

What I'm doing wrong ?

Thanks.

0 Likes
542 Views
2 Replies
Replies (2)
Message 2 of 3

artc2
Autodesk
Autodesk
Classes derived from AcDbBlockReference cannot have AcDbAttributes.
0 Likes
Message 3 of 3

lena.talkhina
Alumni
Alumni

Hello @Anonymous  !

Great to see you here on ObjectARX Forum.

Did @artc2  's suggestion helped you?
If yes, please click on the "Accept as Solution" button as then also other community users can easily find and benefit from the information.
If not please don't hesitate to give an update here in your topic so all members know what ́s the progression on your question is and what might be helpful to achieve what you ́re looking for. 🙂

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.



Лена Талхина/Lena Talkhina
Менеджер Сообщества - Русский/Community Manager - Russian

0 Likes