| 842 | } |
| 843 | |
| 844 | bool Space_Impl::isEnclosedVolume() const { |
| 845 | if (m_cachedIsEnclosed.has_value()) { |
| 846 | return m_cachedIsEnclosed.get(); |
| 847 | } |
| 848 | auto volumePoly = this->polyhedron(); |
| 849 | auto isVolEnclosed = volumePoly.isEnclosedVolume(); |
| 850 | if (!isVolEnclosed) { |
| 851 | const auto edgesNot2 = volumePoly.edgesNotTwo(); |
| 852 | LOG(Warn, briefDescription() << " is not enclosed, there are " << edgesNot2.size() << " edges that aren't used exactly twice"); |
| 853 | for (const auto& edge : edgesNot2) { |
| 854 | LOG(Debug, edge); |
| 855 | } |
| 856 | } |
| 857 | return isVolEnclosed; |
| 858 | } |
| 859 | |
| 860 | double Space_Impl::ceilingHeight() const { |
| 861 | boost::optional<double> value = getDouble(OS_SpaceFields::CeilingHeight, true); |