找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 809|回复: 4

[讨论]:拖动选择集

[复制链接]
发表于 2002-9-10 09:56:33 | 显示全部楼层 |阅读模式

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

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

×
我做了一个拖动选择集,但不知在下面 update()中还要加些什么,另外程序运行是出错,出错信息在附件中
class AsdkEllipse : public AcEdJig
{
class SelectionSet : public AcDbEntity
{
        AcDbObjectIdArray m_idArray;
        AcGeMatrix3d m_mat;
    public:
        void setTransform(const AcGeMatrix3d& mat)
        {
                m_mat = mat;
        }
        Acad::ErrorStatus setSelectionSet(const ads_name ss)
        {
                long len;
                Acad::ErrorStatus es;;
                if (acedSSLength(ss,& len)!=RTNORM)
                        return Acad::eInvalidInput;
                        ads_name ename;
                        AcDbObjectId id;
                        for (int i=0;i < len;i++)
                        {
                        if (acedSSName(ss,i,ename)!=RTNORM)
                        return Acad::eInvalidInput;
                        if ((es=acdbGetObjectId(id,ename))!=Acad::eOk)
                        return es;
                               
                        m_idArray.append(id);
                }
                if (m_idArray.length()==0)
                        return Acad::eInvalidInput;
                        return Acad::eOk;
                }
};
public :
        AsdkEllipse();
        void doIt();
        virtual DragStatus sampler();
        virtual Adesk::Boolean update();
        virtual AcDbEntity * entity()const;
private:
        SelectionSet pZFSSelect;
        AcGePoint3d m_point1,m_point2;
        ads_name m_name;
};
//************************************
AsdkEllipse::AsdkEllipse()
{
}
void AsdkEllipse::doIt()
{
        if(acedSSGet(NULL,NULL,NULL,NULL,m_name)!=RTNORM)
                return;
        if(acedGetPoint(NULL,NULL,asDblArray(m_point1))!=RTNORM)
                return;
        pZFSSelect.setSelectionSet(m_name);
        AcEdJig::DragStatus stat=drag();
        append();
        acedSSFree(m_name);
}
AcEdJig::DragStatus AsdkEllipse::sampler()
{
        DragStatus stat;
        static AcGePoint3d p1;
        stat=acquirePoint(m_point2);
        if(m_point2!=p1)
                p1=m_point2;
        else if(stat==AcEdJig::kNormal)
                return AcEdJig::kNoChange;
        return stat;
}

Adesk::Boolean AsdkEllipse::update()
{
        AcGeMatrix3d mat;
        mat(0,0)=1,mat(0,1)=0,mat(0,2)=0,mat(0,3)=m_point2.x-m_point1.x;
        mat(1,0)=0,mat(1,1)=1,mat(1,2)=0,mat(1,3)=m_point2.y-m_point1.y;
        mat(2,0)=0,mat(2,1)=0,mat(2,2)=1,mat(2,3)=0;
        mat(3,0)=0,mat(3,1)=0,mat(3,2)=0,mat(3,3)=1;
        pZFSSelect.setTransform(mat);
        //***//
        return Adesk::kTrue;
}

AcDbEntity * AsdkEllipse::entity()const
{
        return const_cast < AsdkEllipse::SelectionSet* >(&pZFSSelect);
}

void SUYxuanzedd()
{
        AsdkEllipse *pJig=new AsdkEllipse;
        pJig->doIt();
        delete pJig;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2002-9-10 10:35:08 | 显示全部楼层
我重做了一个,还是有错误,如果我不加“pLine->upgradeOpen();”提示另一个错误
class AsdkEllipse : public AcEdJig
{
public :
        AsdkEllipse();
        void doIt();
        virtual DragStatus sampler();
        virtual Adesk::Boolean update();
        virtual AcDbEntity * entity()const;
private:
        AcDbLine *pLine;
        AcGePoint3d m_point1,m_point2;
};

AsdkEllipse::AsdkEllipse()
{
}
void AsdkEllipse::doIt()
{
        ads_point p1;
        ads_name name1;
        AcDbObjectId objId;
        acedEntSel(NULL,name1,p1);
        acdbGetObjectId(objId,name1);
        acdbOpenAcDbEntity((AcDbEntity *&)pLine,objId,AcDb::kForRead);
        m_point1=asPnt3d(p1);
        AcEdJig::DragStatus stat=drag();
        append();
}
AcEdJig::DragStatus AsdkEllipse::sampler()
{
        DragStatus stat;
        static AcGePoint3d p1;
        stat=acquirePoint(m_point2,m_point1);
        if(m_point2!=p1)
                p1=m_point2;
        else if(stat==AcEdJig::kNormal)
                return AcEdJig::kNoChange;
        return stat;
}

Adesk::Boolean AsdkEllipse::update()
{
        AcGeMatrix3d mat;
        mat(0,0)=1,mat(0,1)=0,mat(0,2)=0,mat(0,3)=m_point2.x-m_point1.x;
        mat(1,0)=0,mat(1,1)=1,mat(1,2)=0,mat(1,3)=m_point2.y-m_point1.y;
        mat(2,0)=0,mat(2,1)=0,mat(2,2)=1,mat(2,3)=0;
        mat(3,0)=0,mat(3,1)=0,mat(3,2)=0,mat(3,3)=1;
        pLine->upgradeOpen();
        pLine->transformBy(mat);
        return Adesk::kTrue;
}

AcDbEntity * AsdkEllipse::entity()const
{
        return pLine;
}

void SUYtrddaa()
{
        AsdkEllipse *pJig=new AsdkEllipse();
        pJig->doIt();
        delete pJig;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-9-10 11:07:37 | 显示全部楼层
我估计,我以前做过一个和你的思路相似的东西,可以交流一下,不过,首先,你得说明一下,什么是拖动选择集?和AutoCAD中的什么命令相似
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-9-10 13:36:50 | 显示全部楼层
类似move命令,选择一部分对象(自己给的,不需要用户选择),然后鼠标离动时,这些对象能跟着离动
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 08:23 , Processed in 0.194988 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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