diff --git a/src/serializers/schema_dependent/XmlSerializer.cpp b/src/serializers/schema_dependent/XmlSerializer.cpp index e38a6eac1b..d02a97d8d7 100644 --- a/src/serializers/schema_dependent/XmlSerializer.cpp +++ b/src/serializers/schema_dependent/XmlSerializer.cpp @@ -383,7 +383,7 @@ void format_quantities(IfcSchema::IfcPhysicalQuantity::list::ptr quantities, ptr // Format IfcTask instances and insert into the DOM. void format_tasks(IfcSchema::IfcTask* task, ptree& node) { ptree* ntask = format_entity_instance(task, node); - + if (ntask) { #ifdef SCHEMA_IfcTask_HAS_TaskTime IfcSchema::IfcTaskTime* task_time = task->TaskTime(); @@ -439,16 +439,44 @@ void format_tasks(IfcSchema::IfcTask* task, ptree& node) { IfcSchema::IfcObjectDefinition::list::ptr objects = operation->RelatedObjects(); for (IfcSchema::IfcObjectDefinition::list::it it2 = objects->begin(); it2 != objects->end(); ++it2) { - IfcSchema::IfcObjectDefinition* object = (*it2); + IfcSchema::IfcObjectDefinition* object = *it2; ptree nobject; nobject.put(".id", object->GlobalId()); - nobject.put(".Type", object->declaration().name()); - ntask->add_child("OperatesOn", nobject); + if (object->declaration().is(IfcSchema::IfcProduct::Class())) + { + ntask->add_child("Input", nobject); + } + else if (object->declaration().is(IfcSchema::IfcResource::Class())) + { + ntask->add_child("Resource", nobject); + } + else if (object->declaration().is(IfcSchema::IfcControl::Class())) + { + ntask->add_child("Control", nobject); + } + else + { + nobject.put(".Type", object->declaration().name()); + ntask->add_child("OperatesOn", nobject); + } } } } #endif + IfcSchema::IfcRelAssigns::list::ptr assignments = task->HasAssignments(); + for (IfcSchema::IfcRelAssigns::list::it i = assignments->begin(); i != assignments->end(); ++i) + { + IfcSchema::IfcRelAssigns* assignment = *i; + if (assignment->declaration().is(IfcSchema::IfcRelAssignsToProduct::Class())) { + IfcSchema::IfcRelAssignsToProduct* assign_to_product = assignment->as(); + IfcSchema::IfcProduct* product = assign_to_product->RelatingProduct()->as(); + ptree nobject; + nobject.put(".id", product->GlobalId()); + ntask->add_child("Output", nobject); + } + } + #ifdef SCHEMA_IfcObjectDefinition_HAS_IsNestedBy IfcSchema::IfcRelNests::list::ptr nested_by = task->IsNestedBy(); for (IfcSchema::IfcRelNests::list::it it = nested_by->begin(); it != nested_by->end(); ++it) @@ -465,7 +493,7 @@ void format_tasks(IfcSchema::IfcTask* task, ptree& node) { } #endif } -} +} } // ~unnamed namespace