我想把一个简单CAD系统的用户界面放在一个决策表中。但我关心的是如何将这些东西放在一个表中。
首先,有一个当前模式(CurMode),它可以是:移动、旋转、删除
接下来,有如下的鼠标操作:
OnLButtonDown OnLButtonUp OnRButtonDown OnRButtonUp OnMButtonDown OnMButtonUp OnMouseMove
也许在当前鼠标光标下有一个对象的附加测试,如下面的ObjectUnderMouse (true/False)
使用这些参数和其他参数,我想为以下规则做出决定:
如果模式为删除,并且对象在鼠标下方,并且按下了OnLButtonDown,则删除该对象。
如果按下MButtonUp (MouseWheel),则按下zoom +;如果按下MButtonDown (MouseWheel),则按下zoom -
如果模式为移动,并且对象在鼠标下方,并且按下了OnLButtonDown,则将该对象放入缓冲区中。如果模式为Move,并且OnLButtonDown和object in Buffer和OnMouseMove动作,则移动对象
.诸若此类。
你明白这个场景了吗?
我在谷歌上搜索了很多,看到了非常简单的DT,但对于一个拥有数百个参数、状态、模式和UI操作的大型CAD系统来说,如何做才是一个良好的开端。
对于这样的CAD系统来说,决策表的最佳设计是什么?
提前感谢
发布于 2013-02-06 07:06:34
Statestep (http://statestep.com)可能就是您要找的。网站上给出的示例是针对用户界面的,并且描述了它在非常大的系统(具有覆盖数百万种可能性的规则的决策表)中的使用。有C语言的代码生成。
发布于 2013-02-06 07:40:23
感谢您的回复。我将仔细研究statestep (我们不使用QT)。但一般来说,我在确定我的cad系统的哪一部分是条件、动作、条件选择等定义像wiki这样的决策表时会遇到问题。Wiki Decision Table
发布于 2021-02-03 17:49:44
我有一个类似的决策过程要实现,这是我想出来的。也许可以重写得更漂亮,但那是另一个话题!
您还可以将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;
}
https://stackoverflow.com/questions/14710875
复制相似问题