CAD系统用户界面的决策表示例

Decision Table example for a CAD system user interface

本文关键字:决策表 表示 决策 系统 用户界面 CAD      更新时间:2023-10-16

我想把一个简单CAD系统的用户界面放在决策表中。但我很担心如何把这些东西放在桌子上。

首先,有一个当前模式(CurMode),它可以是:移动、旋转、删除

接下来,鼠标操作如下:

OnLButtonDownOnLButtonUpOnR按钮向下OnRButtonUpOnMButtonDownOnMButtonUpOnMouseMove

也许在当前鼠标光标下有一个对象的添加测试,如下所示ObjectUnderMouse(真/假)

有了这些和其他参数,我想决定以下规则:

如果"模式"为"删除",并且鼠标下有一个对象,并且按下了OnLButtonDown,则删除该对象。

如果按下MButtonUp(鼠标滚轮),则缩放+如果按下MButtonDown(鼠标滚轮),则缩放-

如果"模式"为"移动",并且对象位于鼠标下方,并且按下了OnLButtonDown,则将对象放入缓冲区。如果模式为移动和OnLButtonDown,缓冲区中的对象和OnMouseMove动作,则移动对象

等等

你明白这个场景吗?

我在谷歌上搜索了很多,看到了非常简单的DT,但对于一个拥有数百个参数、状态、模式和UI操作。

在这样的CAD系统中,决策表的最佳设计是什么?

提前感谢

Statestep(http://statestep.com)可能就是你想要的。网站上给出的例子是针对用户界面的,并描述了它在一个非常大的系统中的使用(包含数百万种可能性的规则的决策表)。有C.的代码生成

感谢您的回复。我将仔细研究statestep(我们不使用QT)。但总的来说,我很难决定我的cad系统的哪一部分是条件、动作、条件替代品等来定义像wiki这样的决策表。Wiki决策表

我有一个类似的决策过程需要实现,下面是我的想法。也许可以重写得更漂亮,但那是另一个话题!

您还可以将if语句中的布尔值对齐,使其始终位于同一列上,使其看起来更像一个表。

////////////////////////////////////////////////////////////////////////////////
EditToolMode *EditTool::decideToolMode()
{   
    bool const isLongPress = (m_lastReleaseTime - m_lastPressTime) > sm_longPressThreshold;
    bool const isMouseMoved = (m_startCoords.get() - m_currentCoords.get()).norm() > sm_movedMouseThreshold;
    bool const isOnPoint = m_closestPoint.is_initialized() && (m_closestPointDistance2d < sm_onPointThreshold);
    bool const isOnEdge = m_selectedPolyline.is_initialized();
    bool const isOngoingSelection = !m_ongoingSelection.empty();
    bool const isEndEdit = m_editChronology == END_EDIT;
    bool const isOnOngoingSelection = isPointOnOngoingSelection(m_ongoingSelection, m_closestPoint);
    if (isOngoingSelection && isOnPoint && isOnOngoingSelection)
    {
        return new ...;
    }
    if (isOngoingSelection && !isMouseMoved && !isOnEdge)
    {
        return new ...;
    }
    if (!isMouseMoved && !isOnEdge && isEndEdit)
    {
        return new ...;
    }
    if (!isMouseMoved && isOnPoint && isLongPress)
    {
        return new ...;
    }
    if (!isMouseMoved && isOnEdge && isLongPress)
    {
        return new ...;
    }
    if (isMouseMoved)
    {
        return new ...;
    }
    return nullptr;
}