std::vector<ThermalZone> AirLoopHVACZoneSplitter_Impl::thermalZones() { std::vector<ThermalZone> zones; std::vector<ModelObject> modelObjects; std::vector<ModelObject> _outletModelObjects = outletModelObjects(); OptionalAirLoopHVAC _airLoopHVAC = airLoopHVAC(); OptionalNode demandOutletNode; OptionalNode demandInletNode; if( _airLoopHVAC ) { demandOutletNode = _airLoopHVAC->demandOutletNode(); demandInletNode = _airLoopHVAC->demandInletNode(); } else { return zones; } modelObjects = _airLoopHVAC->demandComponents( demandInletNode.get(), demandOutletNode.get(), ThermalZone::iddObjectType() ); for( std::vector<ModelObject>::iterator it = modelObjects.begin(); it < modelObjects.end(); it++ ) { OptionalThermalZone zone; zone = it->optionalCast<ThermalZone>(); if( zone ) { zones.push_back(*zone); } } return zones; }
bool WaterToAirComponent_Impl::removeFromPlantLoop() { boost::optional<PlantLoop> _loop = plantLoop(); OptionalNode targetModelObject; OptionalNode sourceModelObject; OptionalUnsigned targetPort; OptionalUnsigned sourcePort; OptionalModelObject target2ModelObject; OptionalModelObject source2ModelObject; OptionalUnsigned target2Port; OptionalUnsigned source2Port; HVACComponent thisObject = getObject<HVACComponent>(); if( _loop && _loop->demandComponent(handle()) ) { targetModelObject = waterOutletModelObject()->optionalCast<Node>(); sourceModelObject = waterInletModelObject()->optionalCast<Node>(); targetPort = connectedObjectPort(waterOutletPort()); sourcePort = connectedObjectPort(waterInletPort()); target2ModelObject = targetModelObject->outletModelObject(); source2ModelObject = sourceModelObject->inletModelObject(); target2Port = targetModelObject->connectedObjectPort(targetModelObject->outletPort()); source2Port = sourceModelObject->connectedObjectPort(sourceModelObject->inletPort()); boost::optional<Node> demandInletNode = _loop->demandInletNode(); boost::optional<Node> demandOutletNode = _loop->demandOutletNode(); Mixer mixer = _loop->demandMixer(); Splitter splitter = _loop->demandSplitter(); // If the component is stuck directly between the inlet and outlet node. if( demandInletNode->handle() == waterInletModelObject()->handle() && demandOutletNode->handle() == waterOutletModelObject()->handle() ) { model().disconnect(thisObject,waterOutletPort()); model().disconnect(thisObject,waterInletPort()); model().connect( demandInletNode.get(), demandInletNode->outletPort(), demandOutletNode.get(), demandOutletNode->inletPort() ); return true; } // If the component is at the very end of the supply path, but there is another component preceeding this one. else if( demandOutletNode->handle() == waterOutletModelObject()->handle() ) { model().disconnect(thisObject,waterOutletPort()); model().disconnect(thisObject,waterInletPort()); model().connect( source2ModelObject.get(), source2Port.get(), demandOutletNode.get(), demandOutletNode->inletPort() ); sourceModelObject->remove(); return true; } // If the component is the only component (except nodes) between a splitter mixer pair else if( (target2ModelObject.get() == mixer) && (source2ModelObject.get() == splitter) ) { Model _model = model(); int i = splitter.branchIndexForOutletModelObject(sourceModelObject.get()); int j = mixer.branchIndexForInletModelObject(targetModelObject.get()); BOOST_ASSERT(i == j); splitter.removePortForBranch(i); mixer.removePortForBranch(i); _model.disconnect(thisObject,waterOutletPort()); _model.disconnect(thisObject,waterInletPort()); targetModelObject->remove(); sourceModelObject->remove(); if( ! splitter.lastOutletModelObject() ) { Node newNode(_model); _model.connect(splitter,splitter.nextOutletPort(),newNode,newNode.inletPort()); _model.connect(newNode,newNode.outletPort(),mixer,mixer.nextInletPort()); } return true; } // Else remove the component and the outlet node else { model().disconnect(thisObject,waterOutletPort()); model().disconnect(thisObject,waterInletPort()); model().connect( sourceModelObject.get(), sourcePort.get(), target2ModelObject.get(), target2Port.get() ); targetModelObject->remove(); return true; } } return false; }