Custom block can't be dynamic

Custom block can't be dynamic

Anonymous
Not applicable
373 Views
1 Reply
Message 1 of 2

Custom block can't be dynamic

Anonymous
Not applicable

Hi,

 

I created a new class (PICBlock) inherited from AcDbBlockReference  I also create a wrapper(MgPICBlock) to use it in .Net.

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)
[Autodesk::AutoCAD::Runtime::Wrapper("PICBlock")]
		public ref class MgPICBlock : public Autodesk::AutoCAD::DatabaseServices::BlockReference
		{
		public:
			MgPICBlock();
			MgPICBlock(Point3d position, Autodesk::AutoCAD::DatabaseServices::ObjectId blockTableRecord);

		internal:
			MgPICBlock(System::IntPtr unmanagedPointer, bool autoDelete);

			// Here is the method which will consistently give us our unmanaged (AsdkSimpleSquare) object.
			inline PICBlock* GetImpObj()
			{
				// UnmanagedObject() is a method of the AutoCAD managed wrappers which always
				// gives us a way to access the underlying ObjectARX objects so we can use them
				// within our C++ application freely.
				return static_cast<PICBlock*>(UnmanagedObject.ToPointer());
			}

		public:

			// Here are the methods defined to support exposure of our event.
			event PICBlockModifiedHandler^ PICBlockModified
			{
			public:
				void add(PICBlockModifiedHandler^);
				void remove(PICBlockModifiedHandler^);
				void raise(Autodesk::AutoCAD::DatabaseServices::ObjectId);
			}

		private:
			// Here is our member delegate which represents the event for this object.
			PICBlockModifiedHandler^ m_pPICBlockModifiedHandler;
		};

MgPICBlock::MgPICBlock() : Autodesk::AutoCAD::DatabaseServices::BlockReference(System::IntPtr(new PICBlock()), true)
		{
			GetImpObj()->setManagedWrapper(this);
			m_pPICBlockModifiedHandler = nullptr;
		}

		MgPICBlock::MgPICBlock(Point3d position, Autodesk::AutoCAD::DatabaseServices::ObjectId blockTableRecord) : 
			Autodesk::AutoCAD::DatabaseServices::BlockReference(System::IntPtr(new PICBlock(AcGePoint3d(position.X, position.Y, position.Z), AcDbObjectId((const AcDbStub*)blockTableRecord.OldIdPtr.ToInt64()))), true)
		{
			GetImpObj()->setManagedWrapper(this);
			m_pPICBlockModifiedHandler = nullptr;
		}


		//////////////////////////////////////////////////////////////////////////
		// constructor for the managed wrapper  This form takes an already established unmanaged object
		// and simply attaches this wrapper to it.
		MgPICBlock::MgPICBlock(System::IntPtr unmanagedPointer, bool autoDelete)
			: Autodesk::AutoCAD::DatabaseServices::BlockReference(unmanagedPointer, autoDelete)
		{
			m_pPICBlockModifiedHandler = nullptr;
		}

If I create a blockrefrence from a dynamic block it works BUT if I create a PICBloc with the same blockrecord

I loose the dynamic properties.

I create blockrefrence  and MgPICBlock in the same way.

MgPICBlock picblock = new MgPICBlock(position, blockRecId);
BlockReference blockref = new BlockReference (position, blockRecId);

 

What I'm doing wrong ?

thanks

 

0 Likes
374 Views
1 Reply
Reply (1)
Message 2 of 2

lena.talkhina
Alumni
Alumni

Hello @Anonymous  !

Great to see you here on ObjecrARX forum!

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