Message 1 of 3
Problem with custom blockReference

Not applicable
05-25-2020
03:36 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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.