@@ -398,10 +398,15 @@ oms_status_enu_t oms::System::exportToSSD(pugi::xml_node& node, pugi::xml_node&
398398 return logError (" export of system ElementGeometry failed" );
399399
400400 // export top level system connectors
401- pugi::xml_node connectors_node = node.append_child (oms::ssp::Draft20180219::ssd::connectors);
402- for (const auto & connector : connectors)
403- if (connector)
404- connector->exportToSSD (connectors_node);
401+ if (connectors.size () > 1 )
402+ {
403+ pugi::xml_node connectors_node = node.append_child (oms::ssp::Draft20180219::ssd::connectors);
404+ for (const auto & connector : connectors)
405+ {
406+ if (connector)
407+ connector->exportToSSD (connectors_node);
408+ }
409+ }
405410
406411 // export top level parameter bindings
407412 if (Flags::ExportParametersInline ()) // export as inline
@@ -413,29 +418,41 @@ oms_status_enu_t oms::System::exportToSSD(pugi::xml_node& node, pugi::xml_node&
413418 values.exportToSSV (ssvNode); // export to ssv file
414419 }
415420
416- pugi::xml_node elements_node = node.append_child (oms::ssp::Draft20180219::ssd::elements);
417-
418- for (const auto & subsystem : subsystems)
421+ if (subelements.size () > 1 )
419422 {
420- pugi::xml_node system_node = elements_node.append_child (oms::ssp::Draft20180219::ssd::system);
421- if (oms_status_ok != subsystem.second ->exportToSSD (system_node, ssvNode))
422- return logError (" export of system failed" );
423+ pugi::xml_node elements_node = node.append_child (oms::ssp::Draft20180219::ssd::elements);
424+ for (const auto & subsystem : subsystems)
425+ {
426+ pugi::xml_node system_node = elements_node.append_child (oms::ssp::Draft20180219::ssd::system);
427+ if (oms_status_ok != subsystem.second ->exportToSSD (system_node, ssvNode))
428+ return logError (" export of system failed" );
429+ }
430+ for (const auto & component : components)
431+ {
432+ pugi::xml_node component_node = elements_node.append_child (oms::ssp::Draft20180219::ssd::component);
433+ if (oms_status_ok != component.second ->exportToSSD (component_node, ssvNode))
434+ return logError (" export of component failed" );
435+ }
423436 }
424437
425- for (const auto & component : components)
426- {
427- pugi::xml_node component_node = elements_node.append_child (oms::ssp::Draft20180219::ssd::component);
428- if (oms_status_ok != component.second ->exportToSSD (component_node, ssvNode))
429- return logError (" export of component failed" );
430- }
438+ std::vector<oms::Connection*> busconnections, ssdconnections;
431439
432- std::vector<oms::Connection*> busconnections;
433- pugi::xml_node connections_node = node.append_child (oms::ssp::Draft20180219::ssd::connections);
434440 for (const auto & connection : connections)
441+ {
435442 if (connection && connection->getType () == oms_connection_single)
436- connection-> exportToSSD (connections_node );
443+ ssdconnections. push_back (connection );
437444 else if (connection)
438445 busconnections.push_back (connection);
446+ }
447+
448+ if (!ssdconnections.empty ())
449+ {
450+ pugi::xml_node connections_node = node.append_child (oms::ssp::Draft20180219::ssd::connections);
451+ for (const auto & ssdconnection : ssdconnections)
452+ {
453+ ssdconnection->exportToSSD (connections_node);
454+ }
455+ }
439456
440457#if !defined(NO_TLM)
441458 if (busconnectors[0 ] || tlmbusconnectors[0 ] || !busconnections.empty ())
@@ -504,65 +521,6 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
504521 }
505522 else if (name == oms::ssp::Draft20180219::ssd::connections)
506523 {
507- // check for ssvFileSource exist and set the values before the connections
508- if (!ssvFileSources.empty ())
509- {
510- for (const auto & ssvFileSource : ssvFileSources)
511- {
512- std::string tempdir = getModel ()->getTempDirectory ();
513- filesystem::path temp_root (tempdir);
514- pugi::xml_document ssvdoc;
515- pugi::xml_parse_result result = ssvdoc.load_file ((temp_root / ssvFileSource).string ().c_str ());
516- pugi::xml_node parameterSet, parameters;
517-
518- if (result) // check from ssv file
519- {
520- parameterSet = ssvdoc.document_element (); // ssv:ParameterSet
521- parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
522- }
523- else if (getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
524- {
525- parameterSet = getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file).child (oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
526- parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
527- }
528- else
529- {
530- return logError (" loading \" " + std::string (ssvFileSource) + " \" failed (" + std::string (result.description ()) + " )" );
531- }
532-
533- if (parameters)
534- {
535- for (pugi::xml_node_iterator itparameters = parameters.begin (); itparameters != parameters.end (); ++itparameters)
536- {
537- std::string name = itparameters->name ();
538- if (name == oms::ssp::Version1_0::ssv::parameter)
539- {
540- ComRef cref = ComRef (itparameters->attribute (" name" ).as_string ());
541- if (itparameters->child (oms::ssp::Version1_0::ssv::real_type))
542- {
543- double value = itparameters->child (oms::ssp::Version1_0::ssv::real_type).attribute (" value" ).as_double ();
544- setReal (cref, value);
545- }
546- else if (itparameters->child (oms::ssp::Version1_0::ssv::integer_type))
547- {
548- int value = itparameters->child (oms::ssp::Version1_0::ssv::integer_type).attribute (" value" ).as_int ();
549- setInteger (cref, value);
550- }
551- else if (itparameters->child (oms::ssp::Version1_0::ssv::boolean_type))
552- {
553- bool value = itparameters->child (oms::ssp::Version1_0::ssv::boolean_type).attribute (" value" ).as_bool ();
554- setBoolean (cref, value);
555- }
556- else
557- {
558- logError (" Failed to import " + std::string (oms::ssp::Version1_0::ssv::parameter) + " :Unknown ParameterBinding-type" );
559- }
560- }
561- }
562- }
563- }
564- }
565-
566524 for (pugi::xml_node_iterator itConnectors = (*it).begin (); itConnectors != (*it).end (); ++itConnectors)
567525 {
568526 ComRef startElement = ComRef (itConnectors->attribute (" startElement" ).as_string ());
@@ -750,6 +708,65 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
750708 else
751709 return logError (" wrong xml schema detected: " + name);
752710 }
711+
712+ // check for ssvFileSource exist and set the values before the connections
713+ if (!ssvFileSources.empty ())
714+ {
715+ for (const auto & ssvFileSource : ssvFileSources)
716+ {
717+ std::string tempdir = getModel ()->getTempDirectory ();
718+ filesystem::path temp_root (tempdir);
719+ pugi::xml_document ssvdoc;
720+ pugi::xml_parse_result result = ssvdoc.load_file ((temp_root / ssvFileSource).string ().c_str ());
721+ pugi::xml_node parameterSet, parameters;
722+
723+ if (result) // check from ssv file
724+ {
725+ parameterSet = ssvdoc.document_element (); // ssv:ParameterSet
726+ parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
727+ }
728+ else if (getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
729+ {
730+ parameterSet = getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file).child (oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
731+ parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
732+ }
733+ else
734+ {
735+ return logError (" loading \" " + std::string (ssvFileSource) + " \" failed (" + std::string (result.description ()) + " )" );
736+ }
737+
738+ if (parameters)
739+ {
740+ for (pugi::xml_node_iterator itparameters = parameters.begin (); itparameters != parameters.end (); ++itparameters)
741+ {
742+ std::string name = itparameters->name ();
743+ if (name == oms::ssp::Version1_0::ssv::parameter)
744+ {
745+ ComRef cref = ComRef (itparameters->attribute (" name" ).as_string ());
746+ if (itparameters->child (oms::ssp::Version1_0::ssv::real_type))
747+ {
748+ double value = itparameters->child (oms::ssp::Version1_0::ssv::real_type).attribute (" value" ).as_double ();
749+ setReal (cref, value);
750+ }
751+ else if (itparameters->child (oms::ssp::Version1_0::ssv::integer_type))
752+ {
753+ int value = itparameters->child (oms::ssp::Version1_0::ssv::integer_type).attribute (" value" ).as_int ();
754+ setInteger (cref, value);
755+ }
756+ else if (itparameters->child (oms::ssp::Version1_0::ssv::boolean_type))
757+ {
758+ bool value = itparameters->child (oms::ssp::Version1_0::ssv::boolean_type).attribute (" value" ).as_bool ();
759+ setBoolean (cref, value);
760+ }
761+ else
762+ {
763+ logError (" Failed to import " + std::string (oms::ssp::Version1_0::ssv::parameter) + " :Unknown ParameterBinding-type" );
764+ }
765+ }
766+ }
767+ }
768+ }
769+ }
753770 }
754771 else if (name == oms::ssp::Draft20180219::ssd::annotations)
755772 {
0 commit comments