CAD自定义实体

本文详细介绍了如何从AcDbEntity基类派生自定义实体,并重写了如subWorldDraw、dwgInFields、dwgOutFields等关键接口。通过这些接口实现了数据输入输出、几何变换、爆炸、获取伸展点等功能。此外,还特别强调了在重写dwgOutFields时添加const的重要性,以避免复制到剪切板时出现错误。
摘要由CSDN通过智能技术生成

自定义实体的基类

	自定义实体可以从AcDb实体类的任何一个类进行继承,如果想扩展AcDbPolyline类,那么我们可以从AcDbPolyline进行继承。但是本文是从AcDbEntity进行继承,下文也是按照ACDBEntity进行讲解;

重写函数

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年3月8号
     */
    virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler *);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler *) const;

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年3月8号
     */
    virtual Acad::ErrorStatus setOutPlineId(const AcDbObjectId &);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d &);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray &) const;

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subGetGeomExtents(AcDbExtents &) const;

    /* @接口
     * @返回
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray &) const;

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray &, const AcGeVector3d &);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray &, const AcGeVector3d &);

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray &, AcDbIntArray &, AcDbIntArray &) const;

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray &, const AcGeVector3d &, const int );

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subGetGripPoints(AcDbGripDataPtrArray &, const double , const int , const AcGeVector3d &, const int ) const;

    /* @接口
     * @类名 [DoxPolyline]
     * @邮箱 575814050@qq.com
     * @时间 2022年2月26号
     */
    virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode , Adesk::GsMarker , const AcGePoint3d &, const AcGePoint3d &, const AcGeMatrix3d &, AcGePoint3dArray &, AcDbIntArray &) const;

具体实现


Adesk::Boolean DoxPolyline::subWorldDraw(AcGiWorldDraw *pWd)
{
    assertReadEnabled();
    if(!ENTDATA m_pPline) return Adesk::kTrue;
    CGiWorldDrawPush worldDraw(pWd, this);
    return ENTDATA m_pPline->worldDraw(pWd);
}

Acad::ErrorStatus DoxPolyline::dwgInFields(AcDbDwgFiler *pFiler)
{
    assertWriteEnabled();
    Acad::ErrorStatus es = Acad::eOk;
    if((es = AcDbEntity::dwgInFields(pFiler)) != Acad::eOk) return es;
    if((es = AcDbEntityDwgInFields(this, pFiler)) != Acad::eOk) return es;
    if((es = AcDbPolylineDwgInFields(pFiler)) != Acad::eOk) return es;
    return Acad::eOk;
}

Acad::ErrorStatus DoxPolyline::dwgOutFields(AcDbDwgFiler *pFiler) const
{
    assertReadEnabled();
    Acad::ErrorStatus es = Acad::eOk;
    if((es = AcDbEntity::dwgOutFields(pFiler)) != Acad::eOk) return es;
    if((es = AcDbEntityDwgOutFields(pFiler, this)) != Acad::eOk) return es;
    if((es = AcDbPolylineDwgOutFields(pFiler)) != Acad::eOk) return es;
    return Acad::eOk;
}

Acad::ErrorStatus DoxPolyline::subTransformBy(const AcGeMatrix3d &xform)
{
    return ENTDATA m_pPline->transformBy(xform);
}

Acad::ErrorStatus DoxPolyline::subGetGeomExtents(AcDbExtents &extents) const
{
    return ENTDATA m_pPline->getGeomExtents(extents);
}

Acad::ErrorStatus DoxPolyline::subExplode(AcDbVoidPtrArray &entitySet) const
{
    entitySet.append(ENTDATA m_pPline);
    return Acad::eOk;
}

Acad::ErrorStatus DoxPolyline::subGetStretchPoints(AcGePoint3dArray &stretchPoints) const
{
    return ENTDATA m_pPline->getStretchPoints(stretchPoints);
}

Acad::ErrorStatus DoxPolyline::AcDbEntityDwgInFields(AcDbEntity *pEnt, AcDbDwgFiler *pFiler)
{
    Adesk::UInt16 colorIndex = 0;
    pFiler->readUInt16(&colorIndex);
    pEnt->setColorIndex(colorIndex);
    Adesk::Int16 lineWeight = 0;;
    pFiler->readInt16(&lineWeight);
    pEnt->setLineWeight((AcDb::LineWeight)lineWeight);
    return pFiler->filerStatus();
}

Acad::ErrorStatus DoxPolyline::AcDbEntityDwgOutFields(AcDbDwgFiler *pFiler, const AcDbEntity *pEnt) const
{
    pFiler->writeUInt16(pEnt->colorIndex());
    pFiler->writeInt16((Adesk::Int16)pEnt->lineWeight());
    return pFiler->filerStatus();
}

Acad::ErrorStatus DoxPolyline::subMoveGripPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset)
{
    return ENTDATA m_pPline->moveGripPointsAt(indices, offset);
}

Acad::ErrorStatus DoxPolyline::subMoveStretchPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset)
{
    return ENTDATA m_pPline->moveStretchPointsAt(indices, offset);
}

Acad::ErrorStatus DoxPolyline::subGetGripPoints(AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const
{
    return ENTDATA m_pPline->getGripPoints(gripPoints, osnapModes, geomIds);
}

Acad::ErrorStatus DoxPolyline::subMoveGripPointsAt(const AcDbVoidPtrArray &gripAppData, const AcGeVector3d &offset, const int bitflags)
{
    return ENTDATA m_pPline->moveGripPointsAt(gripAppData, offset, bitflags);
}

Acad::ErrorStatus DoxPolyline::subGetGripPoints(AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d &curViewDir, const int bitflags) const
{
    return ENTDATA m_pPline->getGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitflags);
}

Acad::ErrorStatus DoxPolyline::subGetOsnapPoints(AcDb::OsnapMode osnapMode, Adesk::GsMarker gsSelectionMark, const AcGePoint3d &pickPoint, const AcGePoint3d &lastPoint, const AcGeMatrix3d &viewXform, AcGePoint3dArray &snapPoints, AcDbIntArray &geomIds) const
{
    return ENTDATA m_pPline->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds);
}

添加宏信息

ACRX_DXF_DEFINE_MEMBERS(DoxPolyline, AcDbEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kNoOperation, DOXPOLYLINE, DoxCAD);

注册

	DoxPolyline::rxInit();
    acrxBuildClassHierarchy();

运行结果

图片: 属性面板中可以看到实体名称:DOXPOLYLINE

注意

在重写dwgOutFields这个函数的时候,一定要加const,否则会出现“无法复制到剪切板”的错误;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值