鼠标拖动
DrawRecJig::DrawRecJig(){
pl = NULL;
}
DrawRecJig::~DrawRecJig()
{
}
//在拖动操作期间获取用户输入的点,并基于这个点以及拖动操作的状态来决定下一步的操作
AcEdJig::DragStatus DrawRecJig::sampler()
{
setUserInputControls((AcEdJig::UserInputControls)(
//这行代码设置了这个插件接受的用户输入控制。它接受三维坐标、不接受负响应以及接受空响应。
AcEdJig::kAccept3dCoordinates |//接受z坐标
AcEdJig::kNoNegativeResponseAccepted |//不接受负值
AcEdJig::kNullResponseAccepted//空输入可接受
));
AcGePoint3d ptTemp;//临时存储拖动操作中的点
//获取用户输入的点并存储在ptTemp中
AcEdJig::DragStatus status = acquirePoint(ptTemp);
if (ptTemp != ptCurrent) {
//判断当前拖动的点是否与之前的点不同。如果不同,则更新ptCurrent为新的拖动点。
ptCurrent= ptTemp;
}
else if (status == DragStatus::kNormal) {
//如果拖动点的状态为正常(即没有特殊情况,例如无效输入或用户取消操作),
// 则返回AcEdJig::kNoChange,表示没有发生改变
return AcEdJig::kNoChange;
}
return status;
}
//绘图辅助,x型
bool DrawRecJig::update()
{
double dist = CConvertUtil::ToPoint2d(ptCenter).distanceTo(CConvertUtil::ToPoint2d(ptCurrent));
for (int i = 0; i < 4; i++)
{
double angle = i*MathUtil::PI()*0.5 + MathUtil::PI()*0.25;
AcGePoint2d pt = FymGeometry::Polar(CConvertUtil::ToPoint2d(ptCenter), angle, dist);
pl->setPointAt(i, pt);//将pt(在折线OCS坐标中)设置为索引顶点的位置,并储存在pl中
}
return true;
}
AcDbEntity * DrawRecJig::entity() const
{
return pl;
}
//创建一个四边形多段线,并提示用户拖动它。如果用户按照提示操作,
// 该方法将把多段线发布到模型空间并返回成功;否则,它将删除多段线并返回失败
bool DrawRecJig::DoIt(AcGePoint3d & ptCenter, AcDbObjectId &plId)
{
this->ptCenter = ptCenter;
pl = new AcDbPolyline();
for (int i = 0; i < 4; i++)
{
pl->addVertexAt(i, CConvertUtil::ToPoint2d(ptCenter));
}
pl->setClosed(true);
setDispPrompt(L"请拖动鼠标:");
if (drag()==kNormal) {
plId=CDwgDataBaseUtil::PostToModelSpace(pl);
return true;
}
else {
delete pl;
return false;
}
}
页:
[1]