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: 几何体IdfaceIndex: 面的索引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: 几何体Idedge: 被点击的边对象(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: 指向点云选择结果的指针,PointCloudResults是std::unordered_map<unsigned, std::vector<size_t>>的类型别名。其中key是点云对象的id; value是选择的点的序号集合。