AcEdJig类

来源:互联网 发布:云播软件 编辑:程序博客网 时间:2024/06/05 14:32

以多段线类举例:

class AsdkPolyLineJig : public AcEdJig

{

public:

    AsdkPolyLineJig(constAcGePoint3d po);

    ~AsdkPolyLineJig()

    {

 

    }

         voiddoIt();                                                                 //操作画图的主流程
         virtualDragStatus sampler();                       //采样函数
         virtualAdesk::Boolean update();                 //更新函数
         virtualAcDbEntity* entity() const;              //返回实体

private:

    AcDbPolyline*mpPolyLine;

    int num;

    int index;

    double dist;

    AcGePoint3dArray*mpPointArray;

};

//一般第一个点或者中心点在外部获取之后从外部传入。并且不用到皮筋线时,不要在该类中进行。例如三点画半圆时,确定第一个和第二个点后,在将其传入jig类中。

AsdkPolyLineJig::AsdkPolyLineJig(const AcGePoint3d po)

{

    num = 4;

    index = 0;

    mpPointArray= new AcGePoint3dArray;

    mpPointArray->setLogicalLength(num);

    mpPointArray->setAt(index,po);

}

//主操作流程函数

//在画多段线时,需要将构造多段线的添加函数放在此函数中。由于sample和update函数都是实时更新的,无法判断获取的数据是否为所需要的,和sample、update函数的执行次数。所以在doIt函数中执行添加定点和判断获取到第几个点的操作。

void AsdkPolyLineJig::doIt()                {

    mpPolyLine =new AcDbPolyline;

    mpPolyLine->addVertexAt(index,asPnt2d(asDblArray(mpPointArray->at(index))));

    index++;

    CString cs ="\n Please Input Point!";

    setDispPrompt(cs);

    AcEdJig::DragStatusstat = drag(); 

    mpPolyLine->addVertexAt(index,asPnt2d(asDblArray(mpPointArray->at(index))));

    index++;

    cs = "\nPlease Input Point!";

    setDispPrompt(cs);

    AcEdJig::DragStatusstat2 = drag();

    mpPolyLine->addVertexAt(index,asPnt2d(asDblArray(mpPointArray->at(index))));

    index++;

    cs = "\nPlease Input Point!";

    setDispPrompt(cs);

    AcEdJig::DragStatusstat3 = drag();

    mpPolyLine->addVertexAt(index,asPnt2d(asDblArray(mpPointArray->at(index))));

    index++;

    append();

}

//获取实时数据,点、距离、角度

AcEdJig::DragStatus AsdkPolyLineJig::sampler()              {

    DragStatus stat;

    setUserInputControls((UserInputControls)            //设置预处理条件

        (AcEdJig::kAccept3dCoordinates

        | AcEdJig::kNoNegativeResponseAccepted

        | AcEdJig::kNoZeroResponseAccepted));

    static AcGePoint3dLp3d;

    AcGePoint3d p3d;

    //acquirePoint函数动态实时的获取数据点,随意晃动和点击所获得的点的返回值均为knormal

    //所以无法确认所获取的点是否为所需数据。

    stat = acquirePoint(p3d,mpPointArray->at(index - 1));

    if (Lp3d != p3d)

    {

        Lp3d = p3d;

    }

    else if (stat== kNormal)

    {

        return kNoChange;

    }

    //index标示当前取第几个点

    mpPointArray->setAt(index,p3d);

    return stat;

}

 

// 更新函数

// 画椭圆和圆时可以直接在该函数中更新,但是多段线的更新无法再该处进行。

Adesk::Boolean AsdkPolyLineJig::update()

{

    AcGePoint2d p2d= asPnt2d(asDblArray(mpPointArray->at(index)));

    return Adesk::kTrue;

}

 

AcDbEntity* AsdkPolyLineJig::entity() const

{

    return mpPolyLine;

}

0 0