2
0

RobotControlMaker.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "RobotControlMaker.h"
  9. #include <AzToolsFramework/Entity/EditorEntityHelpers.h>
  10. #include <ROS2/RobotImporter/RobotImporterBus.h>
  11. #include <RobotImporter/Utils/RobotImporterUtils.h>
  12. namespace ROS2
  13. {
  14. RobotControlMaker::ControlHookCallOutcome RobotControlMaker::AddPlugin(
  15. AZ::EntityId entityId, const sdf::Plugin& plugin, const sdf::Model& model, const SDFormat::CreatedEntitiesMap& createdEntities)
  16. {
  17. SDFormat::ModelPluginImporterHooksStorage pluginHooks;
  18. ROS2::RobotImporterRequestBus::BroadcastResult(pluginHooks, &ROS2::RobotImporterRequest::GetModelPluginHooks);
  19. for (const auto& hook : pluginHooks)
  20. {
  21. const AZStd::string query(plugin.Filename().c_str());
  22. if (hook.m_pluginNames.contains(query))
  23. {
  24. AZ::Entity* entity = AzToolsFramework::GetEntityById(entityId);
  25. const auto outcome = hook.m_sdfPluginToComponentCallback(*entity, plugin, model, createdEntities);
  26. if (outcome.IsSuccess())
  27. {
  28. const auto pluginElement = plugin.Element();
  29. const auto& unsupportedPluginParams =
  30. Utils::SDFormat::GetUnsupportedParams(pluginElement, hook.m_supportedPluginParams);
  31. AZStd::string status;
  32. if (unsupportedPluginParams.empty())
  33. {
  34. status = AZStd::string::format(
  35. "%s (filename %s) created successfully", plugin.Name().c_str(), plugin.Filename().c_str());
  36. }
  37. else
  38. {
  39. status = AZStd::string::format(
  40. "%s (filename %s) created, %lu parameters not parsed: ",
  41. plugin.Name().c_str(),
  42. plugin.Filename().c_str(),
  43. unsupportedPluginParams.size());
  44. for (const auto& up : unsupportedPluginParams)
  45. {
  46. status.append("\n\t - " + up);
  47. }
  48. }
  49. m_status.emplace(AZStd::move(status));
  50. return AZ::Success();
  51. }
  52. else
  53. {
  54. const auto message = AZStd::string::format(
  55. "%s (filename %s) not created: %s", plugin.Name().c_str(), plugin.Filename().c_str(), outcome.GetError().c_str());
  56. m_status.emplace(message);
  57. return AZ::Failure(message);
  58. }
  59. }
  60. }
  61. const auto message =
  62. AZStd::string::format("%s (filename %s) not created: cannot find the hook", plugin.Name().c_str(), plugin.Filename().c_str());
  63. m_status.emplace(message);
  64. return AZ::Failure(message);
  65. }
  66. void RobotControlMaker::AddControlPlugins(
  67. const sdf::Model& model, AZ::EntityId entityId, const SDFormat::CreatedEntitiesMap& createdEntities)
  68. {
  69. const auto plugins = model.Plugins();
  70. for (const auto& plugin : plugins)
  71. {
  72. const auto outcome = AddPlugin(entityId, plugin, model, createdEntities);
  73. AZ_Warning("RobotControlMaker", outcome.IsSuccess(), outcome.GetError().c_str());
  74. }
  75. }
  76. const AZStd::set<AZStd::string>& RobotControlMaker::GetStatusMessages() const
  77. {
  78. return m_status;
  79. }
  80. } // namespace ROS2