OnEnteringPolygon* SITSituationVisitor::visitOnEnteringPolygon(ASTNode *node) { OnEnteringPolygon *oep = NULL; if (node != NULL) { oep = new OnEnteringPolygon(); ASTNode *n = findByKey("OBJECTID", node->getParent(), 3); if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get name from OBJECTID expected."); } oep->setID(n->getValue<uint32_t>()); n = findByKey("VERTEX2", node->getParent(), 4); if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get name from VERTEX222 expected."); } n = n->getParent()->getParent(); vector<ASTNode*> listOfEnteringPolygon = n->getChildren(); vector<ASTNode*>::iterator it = listOfEnteringPolygon.begin(); while (it != listOfEnteringPolygon.end()) { n = (*it++); if (n->getFirstChild()->getKey() == "VERTEX2") { oep->add(visitVertex3(n)); } } } return oep; }
Object SITSituationVisitor::visitObject(ASTNode *node) { Object o; if (node != NULL) { ASTNode *n = NULL; n = node->getNodeFromFirstMatchingChildFor("OBJECT"); if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get value from OBJECT expected."); } o.setName(n->getValue<string>()); n = node->getNodeFromFirstMatchingChildFor("OBJECTID"); if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get value from OBJECTID expected."); } o.setID(n->getValue<uint32_t>()); // Parse shape from child. vector<ASTNode*> listOfChildren = node->getChildren("OBJECTID"); vector<ASTNode*>::iterator it = listOfChildren.begin() + 1; // Skip first OBJECTID. while (it != listOfChildren.end()) { ASTNode *child = (*it++)->getFirstChild(); if (child != NULL) { if (child->getKey() == "SHAPENAME") { Shape *shape = visitShape(child->getParent()); o.setShape(shape); } } } n = node->getNodeFromFirstMatchingChildFor("ROTZ"); if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get value from ROTZ expected."); } o.setRotationZ(n->getValue<double>()); n = *(node->getChildren("ROTZ").begin() + 1); // BEHAVIOR starts directly after ROTZ. if (n == NULL) { OPENDAVINCI_CORE_THROW_EXCEPTION(SITSituationVisitorException, "Node to get value from BEHAVIOR expected."); } o.setBehavior(visitBehavior(n)); } return o; }