乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 100|回复: 6

求助:为什么不能显示自定义实体的夹点,附源码

[复制链接]

32

主题

268

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
396
发表于 2012-10-29 16:31:00 | 显示全部楼层 |阅读模式
//-----------------------------------------------------------------------------
#include "dbmain.h"
//-----------------------------------------------------------------------------
class DLLIMPEXP dim_xyz1 : public AcDbEntity {
public:
        ACRX_DECLARE_MEMBERS(dim_xyz1) ;
protected:
        static Adesk::UInt32 kCurrentVersionNumber ;
public:
        dim_xyz1 () ;
        virtual ~dim_xyz1 () ;
        //----- AcDbObject protocols
        //- Dwg Filing protocol
        virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;
        virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;
        //----- AcDbEntity protocols
        //- Graphics protocol
protected:
        virtual Adesk::Boolean subWorldDraw (AcGiWorldDraw *mode) ;
        virtual Adesk::UInt32 subSetAttributes (AcGiDrawableTraits *traits) ;
        //- Osnap points protocol
public:
                virtual Acad::ErrorStatus subGetOsnapPoints (
                AcDb::OsnapMode osnapMode,
                int gsSelectionMark,
                const AcGePoint3d &pickPoint,
                const AcGePoint3d &lastPoint,
                const AcGeMatrix3d &viewXform,
                AcGePoint3dArray &snapPoints,
                AcDbIntArray &geomIds) const ;
        //- Grip points protocol
        virtual Acad::ErrorStatus subGetGripPoints (AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const ;
        
        virtual Acad::ErrorStatus subMoveGripPointsAt (const AcDbIntArray &indices, const AcGeVector3d &offset) ;
        
        virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d & xform);
        AcGePoint3d m_line_begin;
        AcGePoint3d m_line_mid;
        AcGePoint3d m_line_end;
        CString m_Text1;
        CString m_Text2;
        AcGePoint3d m_textbase_s;
        AcGePoint3d m_textbase_x;
        double TextSize;
} ;
#ifdef My_MODULE
ACDB_REGISTER_OBJECT_ENTRY_AUTO(dim_xyz1)
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//----- dim_xyz1.cpp : Implementation of dim_xyz1
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "dim_xyz1.h"
//-----------------------------------------------------------------------------
Adesk::UInt32 dim_xyz1::kCurrentVersionNumber =1 ;
//-----------------------------------------------------------------------------
ACRX_DXF_DEFINE_MEMBERS (
        dim_xyz1, AcDbEntity,
        AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
        AcDbProxyEntity::kNoOperation, DIM_XYZ1,
XTCOWMYAPP
|Product Desc:     A description for your object
|Company:          Your company name
|WEB Address:      Your company WEB site address
)
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
dim_xyz1::dim_xyz1 () : AcDbEntity () {
}
dim_xyz1::~dim_xyz1 () {
}
//-----------------------------------------------------------------------------
//----- AcDbObject protocols
//- Dwg Filing protocol
Acad::ErrorStatus dim_xyz1::dwgOutFields (AcDbDwgFiler *pFiler) const {
        assertReadEnabled () ;
        //----- Save parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dwgOutFields (pFiler) ;
        if ( es != Acad::eOk )
                return (es) ;
        //----- Object version number needs to be saved first
        if ( (es =pFiler->writeUInt32 (dim_xyz1::kCurrentVersionNumber)) != Acad::eOk )
                return (es) ;
        //----- Output params
        //.....
        return (pFiler->filerStatus ()) ;
}
Acad::ErrorStatus dim_xyz1::dwgInFields (AcDbDwgFiler *pFiler) {
        assertWriteEnabled () ;
        //----- Read parent class information first.
        Acad::ErrorStatus es =AcDbEntity::dwgInFields (pFiler) ;
        if ( es != Acad::eOk )
                return (es) ;
        //----- Object version number needs to be read first
        Adesk::UInt32 version =0 ;
        if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
                return (es) ;
        if ( version > dim_xyz1::kCurrentVersionNumber )
                return (Acad::eMakeMeProxy) ;
        //- Uncomment the 2 following lines if your current object implementation cannot
        //- support previous version of that object.
        //if ( version filerStatus ()) ;
}
//-----------------------------------------------------------------------------
//----- AcDbEntity protocols
Adesk::Boolean dim_xyz1::subWorldDraw (AcGiWorldDraw *mode) {//AcGiWorldDraw类提供产生几何体对而不随视口改变的功能。
        assertReadEnabled () ;
        // Bounding Polyline
        AcGePoint3d pts[3];
        pts[0] = m_line_begin;
        pts[1] = m_line_mid;
        pts[2] = m_line_end;
        AcGePoint3d text[2];
        text[0] = m_textbase_s;
        text[1] = m_textbase_x;
        // mode->subEntityTraits()提取AcGiSubEntityTraits类,此类用于控制图形元素当前的颜色、层、线型、填充类型和图形系统标记的属性值。
        mode->subEntityTraits().setSelectionMarker(1);// Mark 1
        //设置AcGiSubEntityTraits对象使所有已绘出的图形元素使用markerId作为图形标记,这个图形元素的标记一直作用至再次调用这个函数或当前的worldDraw()
        //或viewportDraw()执行结束后。
        //警告:基于图形系统的性能优化,在自己的worldDraw()或viewportDraw()方法中设置选择标记定制的实体类必须在任何AcGiWorldGeometry或AcGiViewprotGeometry
        //几何体创建方法(包括mesh()或shell())被调用之前通过调用AcGiSubEntityTraits::setSelectionMarker()设置第一个选择标记。
        mode->subEntityTraits().setColor(1); // Red
        mode->geometry().polyline(3,pts);//mode->geometry()调出AcGiWorldGeometry类画线
        
        // Entity's Text
        mode->subEntityTraits().setSelectionMarker(2); // Mark 2
        mode->subEntityTraits().setColor(1); // Red
        AcGiTextStyle style;//注意此类用于设置设置文本的显示属性。它作为一个参数传递给一个AcGiGeometry::text()的成员函数。
        style.setFileName(_T("txt.shx"));//设置"txt.shx"        style
        style.setBigFontFileName(_T(""));//
        style.setTextSize(TextSize);//设置文字大小
        style.loadStyleRec();//此函数加载一个字体(不是一个样式),在AcGiTextStyle::setFileName()或 AcGiTextStyle::setBigFontFileName()设置了字体文件名后运行。此函数必须在加载一个True Type字体(TTF)后运行。
        AcGePoint3d txtPt1(text[0].x+1,text[0].y+1,text[0].z) ;
        mode->geometry().text(txtPt1, AcGeVector3d::kZAxis,pts[2]-pts[1],m_Text1,m_Text1.GetLength(),Adesk::kFalse, style);
        mode->subEntityTraits().setSelectionMarker(3); // Mark 3
        mode->subEntityTraits().setColor(1); // Red
        //AcGiTextStyle style;//注意此类用于设置设置文本的显示属性。它作为一个参数传递给一个AcGiGeometry::text()的成员函数。
        style.setFileName(_T("txt.shx"));//设置"txt.shx"        style
        style.setBigFontFileName(_T(""));//
        style.setTextSize(TextSize);//设置文字大小
        style.loadStyleRec();//此函数加载一个字体(不是一个样式),在AcGiTextStyle::setFileName()或 AcGiTextStyle::setBigFontFileName()设置了字体文件名后运行。此函数必须在加载一个True Type字体(TTF)后运行。
        AcGePoint3d txtPt2(text[0].x+1,text[0].y-1-TextSize,text[0].z) ;
        mode->geometry().text(txtPt2, AcGeVector3d::kZAxis,pts[2]-pts[1],m_Text1,m_Text1.GetLength(),Adesk::kFalse, style);
        return (AcDbEntity::subWorldDraw (mode)) ;
}
Adesk::UInt32 dim_xyz1::subSetAttributes (AcGiDrawableTraits *traits) {
        assertReadEnabled () ;
        return (AcDbEntity::subSetAttributes (traits)) ;
}
//- Osnap points protocol
/**        获得捕捉点,这里添加一个中心点         
*        @param   -
*        @author
*   @date         
*   @retval  -
*   @note    这里仅用第一个变量,虽捕捉到,但是有点问题,鼠标移开后就没有了
*            This OSNAP solution handles only simple OSNAP types like CENTER, MIDPOINT and
*            ENDPOINT. Complex OSNAP modes like INTERSECTION require other methods implementations and
*            some additional procedures
*   求解步聚:-
*/
Acad::ErrorStatus dim_xyz1::subGetOsnapPoints (
        AcDb::OsnapMode osnapMode,
        int gsSelectionMark,
        const AcGePoint3d &pickPoint,
        const AcGePoint3d &lastPoint,
        const AcGeMatrix3d &viewXform,
        AcGePoint3dArray &snapPoints,
        AcDbIntArray &geomIds) const
{
                assertReadEnabled () ;
                switch (osnapMode) {
                        case AcDb::kOsModeEnd://端点
                        snapPoints.append(m_line_begin);
                        snapPoints.append(m_line_mid);
                        break;
                }
        return (AcDbEntity::subGetOsnapPoints (osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds)) ;
}
/**        获得夹点,         
*        @param   -
*        @author  
*   @date         
*   @retval  -
*   @note    -
*   求解步聚:-
*/
//- Grip points protocol
Acad::ErrorStatus dim_xyz1::subGetGripPoints (
        AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const {
        assertReadEnabled () ;
        //----- This method is never called unless you return eNotImplemented
        //----- from the new getGripPoints() method below (which is the default implementation)
        gripPoints.append(m_line_begin);
        return (AcDbEntity::subGetGripPoints (gripPoints, osnapModes, geomIds)) ;
}
/**        移动夹点         
*        @param   -
*        @author  CG
*   @date         11/4/2011
*   @retval  -
*   @note    -
*   求解步聚:-
*/
Acad::ErrorStatus dim_xyz1::subMoveGripPointsAt (const AcDbIntArray &indices, const AcGeVector3d &offset) {
        assertWriteEnabled () ;
        //----- This method is never called unless you return eNotImplemented
        //----- from the new moveGripPointsAt() method below (which is the default implementation)
        assertWriteEnabled();
        for(int i=0; i<indices.length(); i++)
        {
                int idx = indices.at(i);
                //
                if (idx==0) m_line_begin += offset;
                //
                if (idx==1) {m_line_mid += offset;m_line_end += offset;}
                //
                //if (idx==2) m_line_end += offset;
        }
        return (AcDbEntity::subMoveGripPointsAt (indices, offset)) ;
}
/**        实体的移动、旋转、缩放等等         
*        @param   -
*        @author  
*   @date         
*   @retval  -
*   @note    -
*   求解步聚:-
*/
Acad::ErrorStatus dim_xyz1::subTransformBy(const AcGeMatrix3d & xform)
{
        m_line_begin.transformBy(xform);
        m_line_mid.transformBy(xform);
        m_line_end.transformBy(xform);
        m_textbase_s.transformBy(xform);
        m_textbase_x.transformBy(xform);
        return (Acad::eOk) ;
}
回复

使用道具 举报

32

主题

268

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
396
发表于 2012-10-29 16:32:00 | 显示全部楼层
捕捉也不行阿,大侠们请指教
回复

使用道具 举报

32

主题

268

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
396
发表于 2012-10-29 17:05:00 | 显示全部楼层
元芳,怎么样阿
回复

使用道具 举报

32

主题

268

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
396
发表于 2012-10-29 17:14:00 | 显示全部楼层
跟踪了一下。以下函数没有相应
Acad::ErrorStatus dim_xyz1::subGetOsnapPoints (
        AcDb::OsnapMode osnapMode,
        int gsSelectionMark,
        const AcGePoint3d &pickPoint,
        const AcGePoint3d &lastPoint,
        const AcGeMatrix3d &viewXform,
        AcGePoint3dArray &snapPoints,
        AcDbIntArray &geomIds) const
{
                assertReadEnabled () ;
                switch (osnapMode) {
                        case AcDb::kOsModeEnd://端点
                        snapPoints.append(m_line_begin);
                        snapPoints.append(m_line_mid);
                        break;
                }
        return (AcDbEntity::subGetOsnapPoints (osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds)) ;
}
回复

使用道具 举报

32

主题

268

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
396
发表于 2012-10-29 18:34:00 | 显示全部楼层
知道了:原来的subGetOsnapPoints的参数输错了
应该为:
Acad::ErrorStatus  dim_xyz1::subGetOsnapPoints(
                                    AcDb::OsnapMode     osnapMode,
                                   Adesk::GsMarker     gsSelectionMark,
                                    const AcGePoint3d&  pickPoint,
                                    const AcGePoint3d&  lastPoint,
                                    const AcGeMatrix3d& viewXform,
                                    AcGePoint3dArray&   snapPoints,
                                    AcDbIntArray &   geomIds) const
回复

使用道具 举报

0

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
3
发表于 2014-2-5 18:12:00 | 显示全部楼层
也遇到类似问题,感谢分享经验
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2019-8-12 19:36:00 | 显示全部楼层
subGetOsnapPoints返回值改下,改为return Acad::eOK;
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 05:27 , Processed in 0.193797 second(s), 66 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表