bool MgCmdManagerImpl::setCommand(const MgMotion* sender, const char* name, MgStorage* s) { if (strcmp(name, "@draw") == 0) { // 将 @draw 换成上一次绘图命令名 name = _drawcmd.empty() ? "splines" : _drawcmd.c_str(); } MgCommand* cmd = findCommand(name); if (!cmd) { cmd = sender->view->getCmdSubject()->createCommand(sender, name); if (cmd) { _cmds[name] = cmd; LOGD("createCommand %d: %s", (int)_cmds.size(), name); } } if (strcmp(name, "erase") == 0 && _cmdname == "select") { // 在选择命令中点橡皮擦 MgSelection *sel = getSelection(); if (sel && sel->deleteSelection(sender)) { // 直接删除选中的图形 return false; // 不切换到橡皮擦命令 } } cancel(sender); bool ret = false; std::string oldname(_cmdname); if (cmd) { _cmdname = cmd->getName(); ret = cmd->initialize(sender, s); if (!ret) { _cmdname = oldname; } else if (cmd->isDrawingCommand()) { _drawcmd = _cmdname; } } else { if (strcmp(name, "erasewnd") == 0) { eraseWnd(sender); } else { _cmdname = "select"; cmd = findCommand(_cmdname.c_str()); cmd->initialize(sender, s); } } if (MgBaseShape::minTol().equalPoint() < 1e-5) { MgBaseShape::minTol().setEqualPoint(sender->view->xform()->displayToModel(1.f, true)); } if (oldname != _cmdname) { sender->view->commandChanged(); } return ret; }
bool GiCoreViewImpl::drawCommand(GcBaseView* view, const MgMotion& motion, GiGraphics& gs) { bool ret = false; if (view == curview) { MgDynShapeLock locker(false, this); MgCommand* cmd = _cmds->getCommand(); ret = cmd && cmd->draw(&motion, &gs); if (ret && cmd->isDrawingCommand()) { getCmdSubject()->drawInShapeCommand(&motion, cmd, &gs); } } return ret; }
bool MgCmdManagerImpl::doAction(const MgMotion* sender, int action) { MgView* view = sender->view; MgSelection *sel = getSelection(); bool ret = false; switch (action) { case kMgActionSelAll: ret = sel && sel->selectAll(sender); break; case kMgActionSelReset: if (sel) sel->resetSelection(sender); break; case kMgActionDraw: ret = setCommand(sender, "@draw", NULL); break; case kMgActionCancel: ret = setCommand(sender, "select", NULL); break; case kMgActionDelete: ret = sel && sel->deleteSelection(sender); break; case kMgActionClone: ret = sel && sel->cloneSelection(sender); break; case kMgActionGroup: ret = sel && sel->groupSelection(sender); break; case kMgActionUngroup: ret = sel && sel->ungroupSelection(sender); break; case kMgActionFixedLength: case kMgActionFreeLength: ret = sel && sel->setFixedLength(sender, !sel->isFixedLength(view)); break; case kMgActionLocked: case kMgActionUnlocked: ret = sel && sel->setLocked(sender, !sel->isLocked(view)); break; case kMgActionEditVertex: case kMgActionHideVertex: ret = sel && sel->setEditMode(sender, !sel->isEditMode(view)); break; case kMgActionClosed: case kMgActionOpened: ret = sel && sel->switchClosed(sender); break; case kMgActionAddVertex: ret = sel && sel->insertVertext(sender); break; case kMgActionDelVertex: ret = sel && sel->deleteVertext(sender); break; case kMgActionOverturn: ret = sel && sel->overturnPolygon(sender); break; default: { ret = sender->view->getCmdSubject()->doAction(sender, action); MgCommand* cmd = getCommand(); ret = ret || (cmd && cmd->doContextAction(sender, action)); if (!ret && cmd && !cmd->isDrawingCommand()) { ret = sender->view->getCmdSubject()->doEndAction(sender, action); cmd = findCommand(_drawcmd.c_str()); ret = ret || (cmd && cmd->doContextAction(sender, action)); } break; } } LOGD("doAction(%d) %s", action, ret ? "ok" : "fail"); return ret; }