2

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

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

接下来,有这样的鼠标动作:

OnLButtonDown OnLButtonUp OnRButtonDown OnRButtonUp OnMButtonDown OnMButtonUp OnMouseMove

也许对当前鼠标光标下的对象有一个附加测试,比如这个 ObjectUnderMouse (true/False)

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

如果 Mode 为 Delete 且对象位于鼠标下方且按下 OnLButtonDown,则删除该对象。

如果按下 MButtonUp (MouseWheel),则缩放 + 如果按下 MButtonDown (MouseWheel),则缩放 -

如果 Mode 是 Move 并且对象在鼠标下方并且 OnLButtonDown 被按下,则将对象放入缓冲区中。如果 Mode 为 Move 且 OnLButtonDown 且对象在 Buffer 和 OnMouseMove 动作,则移动对象

...... 等等。

你明白这个场景吗?

我在 Google 上搜索了很多,看到了非常简单的 DT,但是如何将这作为一个具有数百个参数、状态、模式和 UI 操作的大型 CAD 系统的良好开端。

为这样的 CAD 系统服务的决策表的最佳设计是什么?

提前致谢

4

3 回答 3

1

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

于 2013-02-06T07:06:33.833 回答
0

感谢您的回复。我将仔细研究 statestep(我们不使用 QT)。但总的来说,我在决定我的 cad 系统的哪个部分是条件、动作、条件替代等来定义像 wiki 这样的决策表时遇到问题。维基决策表

于 2013-02-06T07:40:22.960 回答
0

我有一个类似的决策过程要实施,这就是我想出的。大概可以改写更美,不过那是另外一个话题了!

您还可以将 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;
}
于 2021-02-03T17:49:44.397 回答