| 145 | } |
| 146 | |
| 147 | ModelObject AirLoopHVACOutdoorAirSystem_Impl::clone(Model model) const { |
| 148 | auto oaclone = ModelObject_Impl::clone(model).cast<AirLoopHVACOutdoorAirSystem>(); |
| 149 | |
| 150 | // Clone OA controller |
| 151 | auto controllerOutdoorAir = getControllerOutdoorAir().clone(model).cast<ControllerOutdoorAir>(); |
| 152 | oaclone.setControllerOutdoorAir(controllerOutdoorAir); |
| 153 | |
| 154 | oaclone.setString(oaclone.mixedAirPort(), ""); |
| 155 | oaclone.setString(oaclone.returnAirPort(), ""); |
| 156 | oaclone.setString(oaclone.outdoorAirPort(), ""); |
| 157 | oaclone.setString(oaclone.reliefAirPort(), ""); |
| 158 | |
| 159 | Node oaNodeClone(model); |
| 160 | model.connect(oaNodeClone, oaNodeClone.outletPort(), oaclone, oaclone.outdoorAirPort()); |
| 161 | |
| 162 | Node reliefNodeClone(model); |
| 163 | model.connect(oaclone, oaclone.reliefAirPort(), reliefNodeClone, reliefNodeClone.inletPort()); |
| 164 | |
| 165 | // Clone oa stream comps |
| 166 | // Note that in the case of AirToAirComponent, this also does stuff to the relief side! |
| 167 | auto oaComps = oaComponents(); |
| 168 | std::reverse(oaComps.begin(), oaComps.end()); |
| 169 | std::vector<Node> oaNodes; |
| 170 | |
| 171 | for (const auto& comp : oaComps) { |
| 172 | if (comp.iddObjectType() == Node::iddObjectType()) { |
| 173 | oaNodes.push_back(comp.cast<Node>()); |
| 174 | } else { |
| 175 | auto compClone = comp.clone(model).cast<HVACComponent>(); |
| 176 | compClone.addToNode(oaNodeClone); |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | auto oaNodeClones = subsetCastVector<Node>(oaclone.oaComponents()); |
| 181 | std::reverse(oaNodeClones.begin(), oaNodeClones.end()); |
| 182 | |
| 183 | if (oaNodes.size() == oaNodeClones.size()) { |
| 184 | for (size_t i = 0; i < oaNodes.size(); ++i) { |
| 185 | const auto node = oaNodes[i]; |
| 186 | auto cloneNode = oaNodeClones[i]; |
| 187 | |
| 188 | auto spms = node.setpointManagers(); |
| 189 | for (const auto& spm : spms) { |
| 190 | auto spmclone = spm.clone(model).cast<SetpointManager>(); |
| 191 | spmclone.addToNode(cloneNode); |
| 192 | } |
| 193 | } |
| 194 | } |
| 195 | |
| 196 | // Clone relief stream comps |
| 197 | |
| 198 | auto reliefComps = reliefComponents(); |
| 199 | |
| 200 | auto reliefAirToAirComps = subsetCastVector<AirToAirComponent>(reliefComps); |
| 201 | |
| 202 | std::vector<Node> reliefNodes; |
| 203 | |
| 204 | if (reliefAirToAirComps.empty()) { |
nothing calls this directly
no test coverage detected