Skip to main content

Manipula信号代理介绍

在Manipula中存在众多的库和插件。为了将这些组件进行解耦的同时,还可以在彼此之间传递特定数据,添加了一个信号代理对象SignalProxy

获取信号代理的实例

可以通过sdk中SignalProxy::Get()接口,获取到Manipula中的信号代理的单例实例。例如:

mpl::SignalProxy* proxy = mpl::SignalProxy::Get();

该实例是继承自QObject类型的对象,可以利用Qt的相关特性对其进行操作。例如,获取其代理的所有信号;进行信号和槽的连接等。

可以通过以下的方法,获取SignalProxy代理的所有信号:

// 打印所有信号
auto meta = proxy->metaObject();
for (int i = 0, j = meta->methodCount(); i < j; ++i) {
qDebug() << "method: " << meta->method(i).methodSignature();
}

在确定要连接的信号后,可以将其连接到指定的槽函数。例如:

QObject::connect(proxy, &mpl::SignalProxy::pointCloudSelected,
this, &MyClass::onPointcloudSelected);

或者使用lambda表达式,例如:

QObject::connect(proxy, &mpl::SignalProxy::snapPositionChanged, [](const mpl::Pos& pos) {
std::cout << pos.x << ", " << pos.y << ", " << pos.z << std::endl;
});

公有方法

static SignalProxy* Get()

获取 SignalProxy 的单例实例。

信号列表

void customOperationMenuClicked(unsigned menuIndex, unsigned operationId)

当自定义操作菜单被点击时发出此信号。

  • menuIndex: 菜单索引
  • operationId: 工序Id

void faceClicked(unsigned bodyId, unsigned faceIndex, const TopoDS_Face& face, int btn, int modifiers)

当几何体的面被点击时发出此信号。

  • bodyId: 几何体Id
  • faceIndex: 面的索引
  • face: 被点击的面对象(OpenCASCADE的TopoDS_Face类型,使用时需要 include <TopoDS_Face.hxx>
  • btn: 鼠标按钮(Qt鼠标按钮枚举值)
  • modifiers: 键盘修饰键(Qt键盘修饰符枚举值)

注:sdk链接了一份非全量的OpenCASCADE库,您可以直接使用相关的类。

void edgeClicked(unsigned bodyId, const TopoDS_Edge& edge, int btn, int modifiers)

当几何体的边被点击时发出此信号。

  • bodyId: 几何体Id
  • edge: 被点击的边对象(OpenCASCADE的TopoDS_Edge类型,使用时需要 include <TopoDS_Edge.hxx>
  • btn: 鼠标按钮(Qt鼠标按钮枚举值)
  • modifiers: 键盘修饰键(Qt键盘修饰符枚举值)

void nothingClicked(int btn, int modifiers)

当点击空白区域(未点击任何几何体)时发出此信号。

  • btn: 鼠标按钮(Qt鼠标按钮枚举值)
  • modifiers: 键盘修饰键(Qt键盘修饰符枚举值)

void snapPositionChanged(const Pos& pointWorldPos)

当捕捉位置发生变化时发出此信号。

  • pointWorldPos: 世界坐标系下的点位置

void pointCloudSelected(const mpl::PointCloudResults* results)

当点云被选择时发出此信号。

  • results: 指向点云选择结果的指针,PointCloudResultsstd::unordered_map<unsigned, std::vector<size_t>>的类型别名。其中key是点云对象的id; value是选择的点的序号集合。