找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 949|回复: 6

[求助]:实现象窗口一样能缩放的矩形框

[复制链接]
发表于 2006-8-26 12:06:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
小弟初学OBJECTARX,老板让我完成一个缩放矩形框的功能.就是要能够选择到已画出的矩形框的边,然后拉动这条边,其余边不动.最终效果也是矩形框,其实就是完成象我们窗口一样,能够横向或纵向缩放的功能,希望各位大哥能给出一点思路.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-8-27 09:53:30 | 显示全部楼层
学习一下自定义类技术就可以轻而易举实现,如果还没学到这个,那就继续学,没有其它任何捷径可走。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-27 12:22:31 | 显示全部楼层
恩,先学自定义实体,再深入学习学习拖动类,就OK!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-28 14:30:57 | 显示全部楼层
到处用自定义实体到底好不好?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-29 16:16:55 | 显示全部楼层
to jeniful:
自定义实体有它的好处也有它的弊端,我见意你用反应器实现这一功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-29 23:43:56 | 显示全部楼层
自定义实体很好啊,我所有的实体都是自定义实体
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-30 15:27:24 | 显示全部楼层
我按照REDCAD的意思,自定义了一个矩形类.但是不知道为什么当我拖放完成时候会出现致命错误.无法完成矩形的最终绘制.
哪位大哥可以帮小弟看看是什么原因.

拖放结束后出现: Unhandled Expception C0000005(Access Violation Reading Ox0054)at address 65462AC9h
关掉AUTCAD后 出现 :INTERNAL ERROR!XCOMMAND.cpp@3337:Was Open For Write
代码如下:

class  CMARectWindow : public AcDbEntity
{
public:
       
        ACRX_DECLARE_MEMBERS(CMARectWindow);
       
        CMARectWindow();
        virtual ~CMARectWindow();
       
        virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
        virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
        virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);
       
        AcGePoint3d m_UpLeftPt;
        AcGePoint3d m_DownRightPt;
        AcGePoint3d m_DownLeftPt;
        AcGePoint3d m_UpRightPt;
private:
       
};




ACRX_DXF_DEFINE_MEMBERS(CMARectWindow, AcDbEntity,
                        AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
                        AcDbProxyEntity::kNoOperation,
                        CMAWINDO_INFO, PGL_02);


CMARectWindow::CMARectWindow():m_UpLeftPt(0,0,0),m_DownRightPt(0,0,0)
{

}

CMARectWindow::~CMARectWindow()
{}



Adesk::Boolean CMARectWindow::worldDraw(AcGiWorldDraw* mode)
{
        assertReadEnabled();
         
        m_DownLeftPt[0]=m_UpLeftPt[0];
        m_DownLeftPt[1]=m_DownRightPt[1];
        m_UpRightPt[0]=m_DownRightPt[0];
        m_UpRightPt[1]=m_UpLeftPt[1];
        AcGePoint3d pLineArray[5];
        pLineArray[0] =m_UpLeftPt;
        pLineArray[1] =m_UpRightPt;
        pLineArray[2] =m_DownRightPt;
        pLineArray[3] =m_DownLeftPt;
        pLineArray[4] =m_UpLeftPt;
        mode->geometry().polyline(5, pLineArray);
        return AcDbEntity::worldDraw(mode);       
}

Acad::ErrorStatus CMARectWindow::dwgInFields(AcDbDwgFiler* pFiler)
{
        assertReadEnabled();
       
        Acad::ErrorStatus es;
        if ((es = AcDbEntity::dwgInFields(pFiler)) != Acad::eOk)
        {
                return es;
        }
       
        pFiler->readItem(&m_UpLeftPt);
        pFiler->readItem(&m_DownRightPt);
        return pFiler->filerStatus();
}

Acad::ErrorStatus CMARectWindow::dwgOutFields(AcDbDwgFiler* pFiler) const
{
        assertReadEnabled();
       
        Acad::ErrorStatus es;
        if ((es = AcDbEntity::dwgOutFields(pFiler)) != Acad::eOk)
        {
                return es;
        }
       
        pFiler->writeItem(m_UpLeftPt);
        pFiler->writeItem(m_DownRightPt);
        return pFiler->filerStatus();
}

class AsdkRectJig:public AcEdJig
{
public:
        AsdkRectJig(AcGePoint3d &);
        void doIt();
        virtual DragStatus sampler();
        virtual Adesk::Boolean update();
        virtual AcDbEntity* entity() const;
protected:
private:
        CMARectWindow *mpRect;
        AcGePoint3d mUpLeftPt,mDownRightPt;
        double m_length,m_height;
        AcGeVector3d mNormal;
};

AsdkRectJig::AsdkRectJig(AcGePoint3d &Pt)
{
        mpRect=new CMARectWindow();
        mpRect->m_UpLeftPt=Pt;
}

void AsdkRectJig::doIt()
{
       
        setDispPrompt("\nRect choose the second point:");
        AcEdJig::DragStatus stat=drag();
        if (stat==kNormal)
        {
                append();
        }
        else
                delete mpRect;
}

AcEdJig::DragStatus
AsdkRectJig::sampler()
{
        DragStatus stat;
        setUserInputControls((UserInputControls)
                (AcEdJig::kGovernedByOrthoMode
                |AcEdJig::kAccept3dCoordinates
                |AcEdJig::kNoNegativeResponseAccepted
                |AcEdJig::kNoZeroResponseAccepted));
        static AcGePoint3d axispointTemp;
        stat=acquirePoint(mDownRightPt);
        if (axispointTemp!=mDownRightPt)
        {
                axispointTemp=mDownRightPt;
        }
        else if(stat==AcEdJig::kNormal)
        {
                return AcEdJig::kNoChange;
        }
        return stat;
}

Adesk::Boolean
AsdkRectJig::update()
{
        mpRect->m_DownRightPt=mDownRightPt;
        return Adesk::kTrue;
}

AcDbEntity *
AsdkRectJig::entity() const
{
        return mpRect;
}

// This is command 'REC'
void studyrectrec()
{
        // TODO: Implement the command
        AcGePoint3d tempPt;
        struct resbuf rbFrom,rbTo;
        ads_getpoint(NULL,"\nRect choose the first point:",asDblArray(tempPt));
        rbFrom.restype=RTSHORT;
        rbFrom.resval.rint=1;
        rbTo.restype=RTSHORT;
        rbTo.resval.rint=0;
        ads_trans(asDblArray(tempPt),&rbFrom,&rbTo,Adesk::kFalse,asDblArray(tempPt));
        AsdkRectJig *pJig=new AsdkRectJig(tempPt);
        pJig->doIt();
        delete pJig;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 16:37 , Processed in 0.421570 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表