diff --git a/.gitignore b/.gitignore index 96fb1b5394..2c5e2e40be 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /build*/ /install*/ /win/BuildDepsCache*.txt +/src/ifcexpressparser/__pycache__ +/src/ifcexpressparser/express_parser.py diff --git a/README.md b/README.md index 75783392dc..42c444def6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Prerequisites Dependencies ============ * [Boost](http://www.boost.org/) -* Open Cascade *optional*, but required for building IfcGeom) +* Open Cascade *optional*, but required for building IfcGeom [Official](http://www.opencascade.org/getocc/download/loadocc/) or [community edition](https://github.com/tpaviot/oce) For converting IFC representation items into BRep solids and tesselated meshes * [ICU](http://site.icu-project.org/) *optional* @@ -34,14 +34,16 @@ the cmake/ folder. The preferred way to fetch and build this project's dependencies is to use the build scripts in win/ folder. See [win/readme.md] for more information. Instructions in a nutshell -(assuming Visual Studio x64 environment variables set): +(**assuming Visual Studio 2015 x64 environment variables set**): + > git clone https://github.com/IfcOpenShell/IfcOpenShell.git > cd oce\win - > build-deps.cmd (defaults to using VS 2015 x64 RelWithDebInfo build) - > run-cmake.bat (defaults to using VS 2015 x64) + > build-deps.cmd (defaults to RelWithDebInfo build) + > run-cmake.bat > ..\build-vs2015-x64\IfcOpenShell.sln -You can now build the solution using the RelWithDebInfo configuration (freshly created solution by CMake defaults to Debug). -Build the INSTALL project to deploy the headers and binaries into a single location if wanted/needed. + +You can now build the solution using the `RelWithDebInfo` configuration (freshly created solution by CMake defaults to `Debug`). +Build the `INSTALL` project to deploy the headers and binaries into a single location if wanted/needed. Alternatively, the old Visual Studio solution and project files requiring manual work can be found from the win/sln folder. diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 568fcc71ed..67ccc975d7 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -25,7 +25,7 @@ OPTION(UNICODE_SUPPORT "Build IfcOpenShell with Unicode support (requires ICU)." OPTION(COLLADA_SUPPORT "Build IfcConvert with COLLADA support (requires OpenCOLLADA)." ON) OPTION(ENABLE_BUILD_OPTIMIZATIONS "Enable certain compiler and linker optimizations on RelWithDebInfo and Release builds." OFF) #TODO OPTION(IFCCONVERT_DOUBLE_PRECISION "IfcConvert: Use double precision floating-point numbers." OFF) -OPTION(USE_IFC4 "Use IFC 4 instead of IFC 2x3" OFF) +OPTION(USE_IFC4 "Use IFC 4 instead of IFC 2x3 (full rebuild recommended when switching this)" OFF) OPTION(BUILD_IFCPYTHON "Build IfcPython." ON) OPTION(BUILD_EXAMPLES "Build example applications." ON) # TODO QtViewer is deprecated ATM as it uses the 0.4 API @@ -217,10 +217,17 @@ if(ENABLE_BUILD_OPTIMIZATIONS) endif() IF(MSVC) + # Enforce Unicode for CRT and Win32 API calls + ADD_DEFINITIONS(-D_UNICODE -DUNICODE) # Disable warnings about unsafe C functions; we could use the safe C99 & C11 versions if we have no need for supporting old compilers. - ADD_DEFINITIONS(-D_UNICODE -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS) + ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-bigobj) # required for building the big ifcXXX.objs, https://msdn.microsoft.com/en-us/library/ms173499.aspx - + # Bump up the warning level from the default 3 to 4. + ADD_DEFINITIONS(-W4) + IF(MSVC_VERSION GREATER 1800) # > 2013 + # Disable overeager and false positives causing C4458 ("declaration of 'indentifier' hides class member"), at least for now. + ADD_DEFINITIONS(-wd4458) + ENDIF() # Link against the static VC runtime FOREACH(flag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE diff --git a/src/examples/IfcOpenHouse.cpp b/src/examples/IfcOpenHouse.cpp index 9f4887c5f9..997ef8b58c 100644 --- a/src/examples/IfcOpenHouse.cpp +++ b/src/examples/IfcOpenHouse.cpp @@ -50,7 +50,7 @@ boost::none_t const null = boost::none; // The creation of Nurbs-surface for the IfcSite mesh, to be implemented lateron void createGroundShape(TopoDS_Shape& shape); -int main(int argc, char** argv) { +int main() { // The IfcHierarchyHelper is a subclass of the regular IfcFile that provides several // convenience functions for working with geometry in IFC files. diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index 8315a8e433..bf3e65b2ca 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -128,7 +128,7 @@ void ColladaSerializer::ColladaExporter::ColladaGeometries::write(const std::str lines.setMaterial(materials[it->first].name()); lines.setCount((unsigned long)it->second.size()); int offset = 0; - lines.getInputList().push_back(COLLADASW::Input(COLLADASW::InputSemantic::VERTEX, "#" + mesh_id + COLLADASW::LibraryGeometries::VERTICES_ID_SUFFIX, 0)); + lines.getInputList().push_back(COLLADASW::Input(COLLADASW::InputSemantic::VERTEX, "#" + mesh_id + COLLADASW::LibraryGeometries::VERTICES_ID_SUFFIX, offset++)); lines.prepareToAppendValues(); lines.appendValues(it->second); lines.finish(); diff --git a/src/ifcconvert/ColladaSerializer.h b/src/ifcconvert/ColladaSerializer.h index 63421d5f85..cf3a35e733 100644 --- a/src/ifcconvert/ColladaSerializer.h +++ b/src/ifcconvert/ColladaSerializer.h @@ -22,6 +22,10 @@ #ifndef COLLADASERIALIZER_H #define COLLADASERIALIZER_H +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4201 4512) +#endif #include #include #include @@ -34,6 +38,9 @@ #include #include #include +#ifdef _MSC_VER +#pragma warning(pop) +#endif #include "../ifcgeom/IfcGeomIterator.h" @@ -41,12 +48,15 @@ class ColladaSerializer : public GeometrySerializer { + // TODO The vast amount of implement details of ColladaSerializer could be hidden to the cpp file. private: class ColladaExporter { private: class ColladaGeometries : public COLLADASW::LibraryGeometries { + ColladaGeometries(const ColladaGeometries&); //N/A + ColladaGeometries& operator =(const ColladaGeometries&); //N/A public: explicit ColladaGeometries(COLLADASW::StreamWriter& stream) : COLLADASW::LibraryGeometries(&stream) @@ -58,6 +68,9 @@ private: class ColladaScene : public COLLADASW::LibraryVisualScenes { private: + ColladaScene(const ColladaScene&); //N/A + ColladaScene& operator =(const ColladaScene&); //N/A + const std::string scene_id; bool scene_opened; public: @@ -71,9 +84,13 @@ private: }; class ColladaMaterials : public COLLADASW::LibraryMaterials { + ColladaMaterials(const ColladaMaterials&); //N/A + ColladaMaterials& operator =(const ColladaMaterials&); //N/A private: class ColladaEffects : public COLLADASW::LibraryEffects { + ColladaEffects(const ColladaEffects&); //N/A + ColladaEffects& operator =(const ColladaEffects&); //N/A public: explicit ColladaEffects(COLLADASW::StreamWriter& stream) : COLLADASW::LibraryEffects(&stream) @@ -148,7 +165,7 @@ public: bool ready(); void writeHeader(); void write(const IfcGeom::TriangulationElement* o); - void write(const IfcGeom::BRepElement* o) {} + void write(const IfcGeom::BRepElement* /*o*/) {} void finalize(); bool isTesselated() const { return true; } void setUnitNameAndMagnitude(const std::string& name, float magnitude) { diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 8bb776cc73..6cc649bad2 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -42,6 +42,8 @@ #include "../ifcconvert/XmlSerializer.h" #include "../ifcconvert/SvgSerializer.h" +#include + static std::string DEFAULT_EXTENSION = "obj"; void printVersion() { @@ -198,9 +200,7 @@ int main(int argc, char** argv) { std::set entities; for (std::vector::const_iterator it = entity_vector.begin(); it != entity_vector.end(); ++it) { std::string lowercase_type = *it; - for (std::string::iterator c = lowercase_type.begin(); c != lowercase_type.end(); ++c) { - *c = tolower(*c); - } + std::transform(lowercase_type.begin(), lowercase_type.end(), lowercase_type.begin(), ::tolower); entities.insert(lowercase_type); } @@ -217,9 +217,7 @@ int main(int argc, char** argv) { } std::string output_extension = output_filename.substr(output_filename.size()-4); - for (std::string::iterator c = output_extension.begin(); c != output_extension.end(); ++c) { - *c = tolower(*c); - } + std::transform(output_extension.begin(), output_extension.end(), output_extension.begin(), ::tolower); // If no entities are specified these are the defaults to skip from output if (entity_vector.empty()) { diff --git a/src/ifcconvert/IgesSerializer.h b/src/ifcconvert/IgesSerializer.h index 8591af9902..7536008d44 100644 --- a/src/ifcconvert/IgesSerializer.h +++ b/src/ifcconvert/IgesSerializer.h @@ -20,7 +20,6 @@ #ifndef IGESSERIALIZER_H #define IGESSERIALIZER_H -#include #include #include @@ -43,7 +42,7 @@ public: void finalize() { writer.Write(out_filename.c_str()); } - void setUnitNameAndMagnitude(const std::string& name, float magnitude) { + void setUnitNameAndMagnitude(const std::string& /*name*/, float magnitude) { const char* symbol = getSymbolForUnitMagnitude(magnitude); if (symbol) { Interface_Static::SetCVal("write.iges.unit", symbol); diff --git a/src/ifcconvert/OpenCascadeBasedSerializer.h b/src/ifcconvert/OpenCascadeBasedSerializer.h index 74a76ca341..6ee69635a4 100644 --- a/src/ifcconvert/OpenCascadeBasedSerializer.h +++ b/src/ifcconvert/OpenCascadeBasedSerializer.h @@ -25,8 +25,10 @@ #include "../ifcconvert/GeometrySerializer.h" class OpenCascadeBasedSerializer : public GeometrySerializer { + OpenCascadeBasedSerializer(const OpenCascadeBasedSerializer&); //N/A + OpenCascadeBasedSerializer& operator =(const OpenCascadeBasedSerializer&); //N/A protected: - const std::string& out_filename; + const std::string out_filename; const char* getSymbolForUnitMagnitude(float mag); public: explicit OpenCascadeBasedSerializer(const std::string& out_filename) @@ -35,10 +37,9 @@ public: {} virtual ~OpenCascadeBasedSerializer() {} void writeHeader() {} - void writeMaterial(const IfcGeom::SurfaceStyle& style) {} bool ready(); virtual void writeShape(const TopoDS_Shape& shape) = 0; - void write(const IfcGeom::TriangulationElement* o) {} + void write(const IfcGeom::TriangulationElement* /*o*/) {} void write(const IfcGeom::BRepElement* o); bool isTesselated() const { return false; } void setFile(IfcParse::IfcFile*) {} diff --git a/src/ifcconvert/StepSerializer.h b/src/ifcconvert/StepSerializer.h index 4667104a38..5e1493a020 100644 --- a/src/ifcconvert/StepSerializer.h +++ b/src/ifcconvert/StepSerializer.h @@ -20,7 +20,6 @@ #ifndef STEPSERIALIZER_H #define STEPSERIALIZER_H -#include #include #include @@ -49,7 +48,7 @@ public: writer.Write(out_filename.c_str()); std::cout.rdbuf(sb); } - void setUnitNameAndMagnitude(const std::string& name, float magnitude) { + void setUnitNameAndMagnitude(const std::string& /*name*/, float magnitude) { const char* symbol = getSymbolForUnitMagnitude(magnitude); if (symbol) { Interface_Static::SetCVal("write.step.unit", symbol); diff --git a/src/ifcconvert/SvgSerializer.cpp b/src/ifcconvert/SvgSerializer.cpp index 382873ee69..28e01fe170 100644 --- a/src/ifcconvert/SvgSerializer.cpp +++ b/src/ifcconvert/SvgSerializer.cpp @@ -178,7 +178,7 @@ void SvgSerializer::write(const IfcGeom::BRepElement* o) { typedef IfcSchema::IfcRelAggregates decomposition_element; #endif - while (true) { + for (;;) { // Iterate over the decomposing element to find the parent IfcBuildingStorey decomposition_element::list::ptr decomposes = obdef->Decomposes(); if (!decomposes->size()) { diff --git a/src/ifcconvert/SvgSerializer.h b/src/ifcconvert/SvgSerializer.h index 2efb632b6d..1c553e451d 100644 --- a/src/ifcconvert/SvgSerializer.h +++ b/src/ifcconvert/SvgSerializer.h @@ -35,7 +35,6 @@ class SvgSerializer : public GeometrySerializer { public: typedef std::pair > path_object; protected: - const char* getSymbolForUnitMagnitude(float mag); std::ofstream svg_file; double xmin, ymin, xmax, ymax, width, height; boost::optional section_height; @@ -62,15 +61,14 @@ public: virtual void growBoundingBox(double x, double y) { if (x < xmin) xmin = x; if (x > xmax) xmax = x; if (y < ymin) ymin = y; if (y > ymax) ymax = y; } virtual ~SvgSerializer() {} virtual void writeHeader(); - virtual void writeMaterial(const IfcGeom::SurfaceStyle& style) {} virtual bool ready(); - virtual void write(const IfcGeom::TriangulationElement* o) {} + virtual void write(const IfcGeom::TriangulationElement* /*o*/) {} virtual void write(const IfcGeom::BRepElement* o); virtual void write(path_object& p, const TopoDS_Wire& wire); virtual path_object& start_path(IfcSchema::IfcBuildingStorey* storey, const std::string& id); virtual bool isTesselated() const { return false; } virtual void finalize(); - virtual void setUnitNameAndMagnitude(const std::string& name, float magnitude) {} + virtual void setUnitNameAndMagnitude(const std::string& /*name*/, float /*magnitude*/) {} virtual void setFile(IfcParse::IfcFile* f) { file = f; } virtual void setBoundingRectangle(double width, double height); virtual void setSectionHeight(double h) { section_height = h; } diff --git a/src/ifcconvert/WavefrontObjSerializer.h b/src/ifcconvert/WavefrontObjSerializer.h index 7cb67909d2..1b1ae7d69d 100644 --- a/src/ifcconvert/WavefrontObjSerializer.h +++ b/src/ifcconvert/WavefrontObjSerializer.h @@ -46,10 +46,10 @@ public: void writeHeader(); void writeMaterial(const IfcGeom::Material& style); void write(const IfcGeom::TriangulationElement* o); - void write(const IfcGeom::BRepElement* o) {} + void write(const IfcGeom::BRepElement* /*o*/) {} void finalize() {} bool isTesselated() const { return true; } - void setUnitNameAndMagnitude(const std::string& name, float magnitude) {} + void setUnitNameAndMagnitude(const std::string& /*name*/, float /*magnitude*/) {} void setFile(IfcParse::IfcFile*) {} }; diff --git a/src/ifcconvert/XmlSerializer.cpp b/src/ifcconvert/XmlSerializer.cpp index 6106078999..9a8cc05d95 100644 --- a/src/ifcconvert/XmlSerializer.cpp +++ b/src/ifcconvert/XmlSerializer.cpp @@ -1,3 +1,22 @@ +/******************************************************************************** +* * +* This file is part of IfcOpenShell. * +* * +* IfcOpenShell is free software: you can redistribute it and/or modify * +* it under the terms of the Lesser GNU General Public License as published by * +* the Free Software Foundation, either version 3.0 of the License, or * +* (at your option) any later version. * +* * +* IfcOpenShell is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* Lesser GNU General Public License for more details. * +* * +* You should have received a copy of the Lesser GNU General Public License * +* along with this program. If not, see . * +* * +********************************************************************************/ + #include #include @@ -7,6 +26,8 @@ #include "XmlSerializer.h" +#include + using boost::property_tree::ptree; using namespace IfcSchema; @@ -58,7 +79,8 @@ boost::optional format_attribute(const Argument* argument, IfcUtil: unit_name = unit->Name(); } - for (std::string::iterator c = unit_name.begin(); c != unit_name.end(); ++c) *c = tolower(*c); + // TODO add toLower() and toUpper() string helper functions for the project + std::transform(unit_name.begin(), unit_name.end(), unit_name.begin(), ::tolower); value = unit_name; } diff --git a/src/ifcexpressparser/README.txt b/src/ifcexpressparser/README.txt index d4c4176084..ede43994d3 100644 --- a/src/ifcexpressparser/README.txt +++ b/src/ifcexpressparser/README.txt @@ -4,6 +4,8 @@ the IFC schema and will most likely fail on any other Express schema. The code can be invoked in the following way and results in two header files and a single implementation file named according to the schema name in the -Express file. A python 3 interpreter with the pyparsing library is required. +Express file. A python 3 interpreter with the pyparsing [1] library is required. $ python bootstrap.py express.bnf > express_parser.py && python express_parser.py IFC2X3_TC1.exp + +[1] http://pyparsing.wikispaces.com/Download+and+Installation diff --git a/src/ifcexpressparser/templates.py b/src/ifcexpressparser/templates.py index 2cd9722cd9..0ae336fe72 100644 --- a/src/ifcexpressparser/templates.py +++ b/src/ifcexpressparser/templates.py @@ -23,7 +23,6 @@ header = """ #include #include -#include #include @@ -31,6 +30,11 @@ header = """ #include "../ifcparse/IfcException.h" #include "../ifcparse/%(schema_name)senum.h" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4100) +#endif + #define IfcSchema %(schema_name)s namespace %(schema_name)s { @@ -47,6 +51,10 @@ void InitStringMap(); IfcUtil::IfcBaseClass* SchemaEntity(IfcAbstractEntity* e = 0); } +#ifdef _MSC_VER +#pragma warning(pop) +#endif + #endif """ @@ -107,6 +115,8 @@ implementation= """ #include "../ifcparse/IfcWrite.h" #include "../ifcparse/IfcWritableEntity.h" +#include + using namespace %(schema_name)s; using namespace IfcParse; using namespace IfcWrite; @@ -261,49 +271,49 @@ std::pair Type::GetEnumerationIndex(Enum t, const std::string& } std::pair Type::GetInverseAttribute(Enum t, const std::string& a) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; - while (true) { + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; + for(;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - jt = it->second.find(a); - if (jt != it->second.end()) { - return jt->second; - } - } + jt = it->second.find(a); + if (jt != it->second.end()) { + return jt->second; + } + } if ((t = Parent(t)) == -1) break; } throw IfcException("Attribute not found"); } std::set Type::GetInverseAttributeNames(Enum t) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; - std::set return_value; + std::set return_value; - while (true) { + for (;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - for (jt = it->second.begin(); jt != it->second.end(); ++jt) { - return_value.insert(jt->first); - } - } + for (jt = it->second.begin(); jt != it->second.end(); ++jt) { + return_value.insert(jt->first); + } + } if ((t = Parent(t)) == -1) break; } - - return return_value; + + return return_value; } void Type::PopulateDerivedFields(IfcWrite::IfcWritableEntity* e) { std::map >::const_iterator i = derived_map.find(e->type()); - if (i != derived_map.end()) { - for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { - e->setArgumentDerived(*it); - } - } + if (i != derived_map.end()) { + for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { + e->setArgumentDerived(*it); + } + } } """ diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index da3f95c105..c655308b72 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -101,7 +101,6 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcFace* l, TopoDS_Shape& face) { IfcSchema::IfcFaceBound::list::ptr bounds = l->Bounds(); Handle(Geom_Surface) face_surface; - bool reversed_face_surface = false; const bool is_face_surface = l->is(IfcSchema::Type::IfcFaceSurface); if (is_face_surface) { @@ -237,9 +236,9 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcFace* l, TopoDS_Shape& face) { // If the wires are reversed the face needs to be reversed as well in order // to maintain the counter-clock-wise ordering of the bounding wire's vertices. bool all_reversed = true; - TopoDS_Iterator it(outer_face_bound, false); - for (; it.More(); it.Next()) { - const TopoDS_Wire& w = TopoDS::Wire(it.Value()); + TopoDS_Iterator jt(outer_face_bound, false); + for (; jt.More(); jt.Next()) { + const TopoDS_Wire& w = TopoDS::Wire(jt.Value()); if ((w.Orientation() != TopAbs_REVERSED) == same_sense) { all_reversed = false; } @@ -856,7 +855,7 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcCompositeProfileDef* l, TopoDS builder.MakeCompound(compound); IfcSchema::IfcProfileDef::list::ptr profiles = l->Profiles(); - bool first = true; + //bool first = true; for (IfcSchema::IfcProfileDef::list::it it = profiles->begin(); it != profiles->end(); ++it) { TopoDS_Face f; if (convert_face(*it, f)) { diff --git a/src/ifcgeom/IfcGeomFunctions.cpp b/src/ifcgeom/IfcGeomFunctions.cpp index c8e430283f..f05988aab0 100644 --- a/src/ifcgeom/IfcGeomFunctions.cpp +++ b/src/ifcgeom/IfcGeomFunctions.cpp @@ -208,12 +208,11 @@ bool IfcGeom::Kernel::convert_openings(const IfcSchema::IfcProduct* entity, cons ? BRepBuilderAPI_GTransform(opening_shape_unlocated,opening_shape_gtrsf,true).Shape() : opening_shape_unlocated.Moved(opening_shape_gtrsf.Trsf()); - double opening_volume, original_shape_volume; + double opening_volume; if ( Logger::Verbosity() >= Logger::LOG_WARNING ) { opening_volume = shape_volume(opening_shape); if ( opening_volume <= ALMOST_ZERO ) Logger::Message(Logger::LOG_WARNING,"Empty opening for:",entity->entity); - original_shape_volume = shape_volume(entity_shape); } if (entity_shape.ShapeType() == TopAbs_COMPSOLID) { @@ -235,9 +234,9 @@ bool IfcGeom::Kernel::convert_openings(const IfcSchema::IfcProduct* entity, cons BRepCheck_Analyzer analyser(brep_cut_result); bool is_valid = analyser.IsValid() != 0; if (is_valid) { - TopExp_Explorer exp(brep_cut_result, TopAbs_SOLID); - for (; exp.More(); exp.Next()) { - builder.Add(compound, exp.Current()); + TopExp_Explorer exp2(brep_cut_result, TopAbs_SOLID); + for (; exp2.More(); exp2.Next()) { + builder.Add(compound, exp2.Current()); added = true; } } @@ -272,7 +271,7 @@ bool IfcGeom::Kernel::convert_openings(const IfcSchema::IfcProduct* entity, cons entity_shape = brep_cut_result; if ( Logger::Verbosity() >= Logger::LOG_WARNING ) { const double volume_after_subtraction = shape_volume(entity_shape); - + double original_shape_volume = shape_volume(entity_shape); if ( ALMOST_THE_SAME(original_shape_volume,volume_after_subtraction) ) Logger::Message(Logger::LOG_WARNING,"Subtraction yields unchanged volume:",entity->entity); } @@ -615,11 +614,11 @@ IfcSchema::IfcProductDefinitionShape* IfcGeom::tesselate(TopoDS_Shape& shape, do IfcSchema::IfcFaceOuterBound* bound = new IfcSchema::IfcFaceOuterBound(loop, face.Orientation() != TopAbs_REVERSED); IfcSchema::IfcFaceBound::list::ptr bounds (new IfcSchema::IfcFaceBound::list); bounds->push(bound); - IfcSchema::IfcFace* face = new IfcSchema::IfcFace(bounds); + IfcSchema::IfcFace* face2 = new IfcSchema::IfcFace(bounds); es->push(loop); es->push(bound); - es->push(face); - faces->push(face); + es->push(face2); + faces->push(face2); } } } @@ -703,7 +702,6 @@ bool IfcGeom::Kernel::fill_nonmanifold_wires_with_planar_faces(TopoDS_Shape& sha // Now loop over all the vertices that are part of the wire(s) to be filled for (int i = 1; i <= num_verts; ++i) { first = current = TopoDS::Vertex(vertex_to_edges.FindKey(i)); - const bool isSame = first.IsSame(current); // We keep track of the vertices we already used if (visited.find(vertex_to_edges.FindIndex(current)) != visited.end()) { continue; @@ -711,7 +709,7 @@ bool IfcGeom::Kernel::fill_nonmanifold_wires_with_planar_faces(TopoDS_Shape& sha // Given these vertices, try to find closed loops and create new // wires out of them. BRepBuilderAPI_MakeWire w; - while (true) { + for (;;) { visited.insert(vertex_to_edges.FindIndex(current)); // Find the edge that the current vertex is part of and points // away from the previous vertex (null for the first vertex). @@ -822,7 +820,7 @@ void IfcGeom::Kernel::remove_redundant_points_from_loop(TColgp_SequenceOfPnt& po if (tol <= 0.) tol = getValue(GV_POINT_EQUALITY_TOLERANCE); tol *= tol; - while (true) { + for (;;) { bool removed = false; int n = polygon.Length() - (closed ? 0 : 1); for (int i = 1; i <= n; ++i) { diff --git a/src/ifcgeom/IfcGeomHelpers.cpp b/src/ifcgeom/IfcGeomHelpers.cpp index bba462dd12..8b6ef76eac 100644 --- a/src/ifcgeom/IfcGeomHelpers.cpp +++ b/src/ifcgeom/IfcGeomHelpers.cpp @@ -287,7 +287,7 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcObjectPlacement* l, gp_Trsf& t return false; } IfcSchema::IfcLocalPlacement* current = (IfcSchema::IfcLocalPlacement*)l; - while (1) { + for (;;) { gp_Trsf trsf2; IfcSchema::IfcAxis2Placement* relplacement = current->RelativePlacement(); if ( relplacement->is(IfcSchema::Type::IfcAxis2Placement3D) ) { diff --git a/src/ifcgeom/IfcGeomIterator.h b/src/ifcgeom/IfcGeomIterator.h index fc62b3bbf4..9dc498e938 100644 --- a/src/ifcgeom/IfcGeomIterator.h +++ b/src/ifcgeom/IfcGeomIterator.h @@ -182,9 +182,7 @@ namespace IfcGeom { } if (context->hasContextType()) { std::string context_type_lc = context->ContextType(); - for (std::string::iterator c = context_type_lc.begin(); c != context_type_lc.end(); ++c) { - *c = tolower(*c); - } + std::transform(context_type_lc.begin(), context_type_lc.end(), context_type_lc.begin(), ::tolower); if (context_types.find(context_type_lc) != context_types.end()) { filtered_contexts->push(context); } @@ -287,7 +285,7 @@ namespace IfcGeom { } BRepElement

* create_shape_model_for_next_entity() { - while ( true ) { + for (;;) { IfcSchema::IfcRepresentation* representation; // Have we reached the end of our list of representations? @@ -320,16 +318,16 @@ namespace IfcGeom { // Filter the products based on the set of entities being included or excluded for // processing. The set is iterated over te able to filter on subtypes. - for ( IfcSchema::IfcProduct::list::it it = unfiltered_products->begin(); it != unfiltered_products->end(); ++it ) { + for ( IfcSchema::IfcProduct::list::it jt = unfiltered_products->begin(); jt != unfiltered_products->end(); ++jt ) { bool found = false; - for (std::set::const_iterator jt = entities_to_include_or_exclude.begin(); jt != entities_to_include_or_exclude.end(); ++jt) { - if ((*it)->is(*jt)) { + for (std::set::const_iterator kt = entities_to_include_or_exclude.begin(); kt != entities_to_include_or_exclude.end(); ++kt) { + if ((*jt)->is(*kt)) { found = true; break; } } if (found == include_entities_in_processing) { - ifcproducts->push(*it); + ifcproducts->push(*jt); } } diff --git a/src/ifcgeom/IfcGeomRepresentation.h b/src/ifcgeom/IfcGeomRepresentation.h index f94f8ab211..501ff68733 100644 --- a/src/ifcgeom/IfcGeomRepresentation.h +++ b/src/ifcgeom/IfcGeomRepresentation.h @@ -41,6 +41,8 @@ namespace IfcGeom { namespace Representation { class Representation { + Representation(const Representation&); //N/A + Representation& operator =(const Representation&); //N/A protected: const ElementSettings _settings; public: @@ -116,11 +118,11 @@ namespace IfcGeom { : Representation(shape_model.settings()) , _id(shape_model.getId()) { - for ( IfcGeom::IfcRepresentationShapeItems::const_iterator it = shape_model.begin(); it != shape_model.end(); ++ it ) { + for ( IfcGeom::IfcRepresentationShapeItems::const_iterator iit = shape_model.begin(); iit != shape_model.end(); ++ iit ) { int surface_style_id = -1; - if (it->hasStyle()) { - Material adapter(&it->Style()); + if (iit->hasStyle()) { + Material adapter(&iit->Style()); std::vector::const_iterator jt = std::find(_materials.begin(), _materials.end(), adapter); if (jt == _materials.end()) { surface_style_id = (int)_materials.size(); @@ -132,17 +134,17 @@ namespace IfcGeom { if (settings().apply_default_materials() && surface_style_id == -1) { Material material(IfcGeom::get_default_style(settings().element_type())); - std::vector::const_iterator it = std::find(_materials.begin(), _materials.end(), material); - if (it == _materials.end()) { + std::vector::const_iterator mit = std::find(_materials.begin(), _materials.end(), material); + if (mit == _materials.end()) { surface_style_id = (int)_materials.size(); _materials.push_back(material); } else { - surface_style_id = (int)(it - _materials.begin()); + surface_style_id = (int)(mit - _materials.begin()); } } - const TopoDS_Shape& s = it->Shape(); - const gp_GTrsf& trsf = it->Placement(); + const TopoDS_Shape& s = iit->Shape(); + const gp_GTrsf& trsf = iit->Placement(); // Triangulate the shape try { @@ -233,11 +235,11 @@ namespace IfcGeom { addEdge(dict[n2], dict[n3], edgecount, edges_temp); addEdge(dict[n3], dict[n1], edgecount, edges_temp); } - for ( std::vector >::const_iterator it = edges_temp.begin(); it != edges_temp.end(); ++it ) { - if (edgecount[*it] == 1) { + for ( std::vector >::const_iterator jt = edges_temp.begin(); jt != edges_temp.end(); ++jt ) { + if (edgecount[*jt] == 1) { // non manifold edge, face boundary - _edges.push_back(it->first); - _edges.push_back(it->second); + _edges.push_back(jt->first); + _edges.push_back(jt->second); } } } @@ -247,8 +249,8 @@ namespace IfcGeom { // Edges are only emitted if there are no faces. A mixed representation of faces // and loose edges is discouraged by the standard. An alternative would be to use // TopExp::MapShapesAndAncestors() to find edges that do not belong to any face. - for (TopExp_Explorer exp(s, TopAbs_EDGE); exp.More(); exp.Next()) { - BRepAdaptor_Curve crv(TopoDS::Edge(exp.Current())); + for (TopExp_Explorer texp(s, TopAbs_EDGE); texp.More(); texp.Next()) { + BRepAdaptor_Curve crv(TopoDS::Edge(texp.Current())); GCPnts_QuasiUniformDeflection tessellater(crv, settings().deflection_tolerance()); int n = tessellater.NbPoints(); int start = (int)_verts.size() / 3; diff --git a/src/ifcgeom/IfcGeomShapes.cpp b/src/ifcgeom/IfcGeomShapes.cpp index 861de7de6c..489a1ee83b 100644 --- a/src/ifcgeom/IfcGeomShapes.cpp +++ b/src/ifcgeom/IfcGeomShapes.cpp @@ -627,9 +627,9 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcCurveBoundedPlane* l, TopoDS_S BRepBuilderAPI_MakeFace mf (outer); mf.Add(outer); - IfcSchema::IfcCurve::list::ptr inner = l->InnerBoundaries(); + IfcSchema::IfcCurve::list::ptr boundaries = l->InnerBoundaries(); - for (IfcSchema::IfcCurve::list::it it = inner->begin(); it != inner->end(); ++it) { + for (IfcSchema::IfcCurve::list::it it = boundaries->begin(); it != boundaries->end(); ++it) { TopoDS_Wire inner; convert_wire(*it, inner); @@ -762,8 +762,8 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcSweptDiskSolid* l, TopoDS_Shap // Subtraction of pipes with small radii is unstable. hasInnerRadius = false; } else { - Handle(Geom_Circle) circle = new Geom_Circle(directrix, r2); - section2 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(circle)); + Handle(Geom_Circle) circle2 = new Geom_Circle(directrix, r2); + section2 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(circle2)); } } diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index c212ad6422..a06194b46c 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -184,8 +184,6 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcTrimmedCurve* l, TopoDS_Wire& bool trim_cartesian = l->MasterRepresentation() == IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN; IfcEntityList::ptr trims1 = l->Trim1(); IfcEntityList::ptr trims2 = l->Trim2(); - bool trimmed1 = false; - bool trimmed2 = false; unsigned sense_agreement = l->SenseAgreement() ? 0 : 1; double flts[2]; gp_Pnt pnts[2]; @@ -411,9 +409,9 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcEdgeLoop* l, TopoDS_Wire& resu TopoDS_Wire w; if (convert_wire(*it, w)) { if (!(*it)->Orientation()) w.Reverse(); - TopoDS_Iterator it(w, false); - for (; it.More(); it.Next()) { - const TopoDS_Edge& e = TopoDS::Edge(it.Value()); + TopoDS_Iterator topoit(w, false); + for (; topoit.More(); topoit.Next()) { + const TopoDS_Edge& e = TopoDS::Edge(topoit.Value()); mw.Add(e); } // mw.Add(w); diff --git a/src/ifcgeomserver/IfcGeomServer.cpp b/src/ifcgeomserver/IfcGeomServer.cpp index 9398bde3b7..fa3a356b4d 100644 --- a/src/ifcgeomserver/IfcGeomServer.cpp +++ b/src/ifcgeomserver/IfcGeomServer.cpp @@ -156,16 +156,16 @@ public: class Get : public Command { protected: - void read_content(std::istream& s) {} - void write_content(std::ostream& s) {} + void read_content(std::istream& /*s*/) {} + void write_content(std::ostream& /*s*/) {} public: Get() : Command(GET) {}; }; class GetLog : public Command { protected: - void read_content(std::istream& s) {} - void write_content(std::ostream& s) {} + void read_content(std::istream& /*s*/) {} + void write_content(std::ostream& /*s*/) {} public: GetLog() : Command(GET_LOG) {}; }; @@ -189,7 +189,7 @@ private: const IfcGeom::TriangulationElement* geom; bool append_line_data; protected: - void read_content(std::istream& s) {} + void read_content(std::istream& /*s*/) {} void write_content(std::ostream& s) { swrite(s, geom->id()); swrite(s, geom->guid()); @@ -238,9 +238,9 @@ protected: } { std::vector diffuse_color_array; for (std::vector::const_iterator it = geom->geometry().materials().begin(); it != geom->geometry().materials().end(); ++it) { - const IfcGeom::Material& m = *it; - if (m.hasDiffuse()) { - const double* color = m.diffuse(); + const IfcGeom::Material& mat = *it; + if (mat.hasDiffuse()) { + const double* color = mat.diffuse(); diffuse_color_array.push_back(static_cast(color[0])); diffuse_color_array.push_back(static_cast(color[1])); diffuse_color_array.push_back(static_cast(color[2])); @@ -249,8 +249,8 @@ protected: diffuse_color_array.push_back(0.f); diffuse_color_array.push_back(0.f); } - if (m.hasTransparency()) { - diffuse_color_array.push_back(static_cast(1. - m.transparency())); + if (mat.hasTransparency()) { + diffuse_color_array.push_back(static_cast(1. - mat.transparency())); } else { diffuse_color_array.push_back(1.f); } @@ -268,25 +268,21 @@ public: class Next : public Command { protected: - void read_content(std::istream& s) {} - void write_content(std::ostream& s) {} + void read_content(std::istream& /*s*/) {} + void write_content(std::ostream& /*s*/) {} public: Next() : Command(NEXT) {}; }; class Bye : public Command { protected: - void read_content(std::istream& s) {} - void write_content(std::ostream& s) {} + void read_content(std::istream& /*s*/) {} + void write_content(std::ostream& /*s*/) {} public: Bye() : Command(BYE) {}; }; -int main (int argc, char** argv) { - if (sizeof(float) != 4 || sizeof(int32_t) != 4) { - return 1; - } - +int main () { // Redirect stdout to this stream, so that involuntary // writes to stdout do not interfere with our protocol. std::ostringstream oss; @@ -308,7 +304,7 @@ int main (int argc, char** argv) { Hello().write(std::cout); int exit_code = 0; - while (1) { + for (;;) { const int32_t msg_type = sread(std::cin); switch (msg_type) { case IFC_MODEL: { diff --git a/src/ifcparse/Ifc2x3-latebound.cpp b/src/ifcparse/Ifc2x3-latebound.cpp index 289b4279c4..fcc21020e0 100644 --- a/src/ifcparse/Ifc2x3-latebound.cpp +++ b/src/ifcparse/Ifc2x3-latebound.cpp @@ -4247,48 +4247,48 @@ std::pair Type::GetEnumerationIndex(Enum t, const std::string& } std::pair Type::GetInverseAttribute(Enum t, const std::string& a) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; - while (true) { + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; + for(;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - jt = it->second.find(a); - if (jt != it->second.end()) { - return jt->second; - } - } + jt = it->second.find(a); + if (jt != it->second.end()) { + return jt->second; + } + } if ((t = Parent(t)) == -1) break; } throw IfcException("Attribute not found"); } std::set Type::GetInverseAttributeNames(Enum t) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; - std::set return_value; + std::set return_value; - while (true) { + for (;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - for (jt = it->second.begin(); jt != it->second.end(); ++jt) { - return_value.insert(jt->first); - } - } + for (jt = it->second.begin(); jt != it->second.end(); ++jt) { + return_value.insert(jt->first); + } + } if ((t = Parent(t)) == -1) break; } - - return return_value; + + return return_value; } void Type::PopulateDerivedFields(IfcWrite::IfcWritableEntity* e) { std::map >::const_iterator i = derived_map.find(e->type()); - if (i != derived_map.end()) { - for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { - e->setArgumentDerived(*it); - } - } + if (i != derived_map.end()) { + for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { + e->setArgumentDerived(*it); + } + } } #endif diff --git a/src/ifcparse/Ifc2x3.cpp b/src/ifcparse/Ifc2x3.cpp index 5406ae5c6b..51f6f7941d 100644 --- a/src/ifcparse/Ifc2x3.cpp +++ b/src/ifcparse/Ifc2x3.cpp @@ -31,6 +31,8 @@ #include "../ifcparse/IfcWrite.h" #include "../ifcparse/IfcWritableEntity.h" +#include + using namespace Ifc2x3; using namespace IfcParse; using namespace IfcWrite; diff --git a/src/ifcparse/Ifc2x3.h b/src/ifcparse/Ifc2x3.h index 963ae54e08..6e4a09500c 100644 --- a/src/ifcparse/Ifc2x3.h +++ b/src/ifcparse/Ifc2x3.h @@ -29,7 +29,6 @@ #include #include -#include #include @@ -37,6 +36,11 @@ #include "../ifcparse/IfcException.h" #include "../ifcparse/Ifc2x3enum.h" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4100) +#endif + #define IfcSchema Ifc2x3 namespace Ifc2x3 { @@ -41583,4 +41587,8 @@ void InitStringMap(); IfcUtil::IfcBaseClass* SchemaEntity(IfcAbstractEntity* e = 0); } +#ifdef _MSC_VER +#pragma warning(pop) +#endif + #endif diff --git a/src/ifcparse/Ifc4-latebound.cpp b/src/ifcparse/Ifc4-latebound.cpp index 4cb4bb0364..e136fba57c 100644 --- a/src/ifcparse/Ifc4-latebound.cpp +++ b/src/ifcparse/Ifc4-latebound.cpp @@ -4941,48 +4941,48 @@ std::pair Type::GetEnumerationIndex(Enum t, const std::string& } std::pair Type::GetInverseAttribute(Enum t, const std::string& a) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; - while (true) { + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; + for(;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - jt = it->second.find(a); - if (jt != it->second.end()) { - return jt->second; - } - } + jt = it->second.find(a); + if (jt != it->second.end()) { + return jt->second; + } + } if ((t = Parent(t)) == -1) break; } throw IfcException("Attribute not found"); } std::set Type::GetInverseAttributeNames(Enum t) { - if (inverse_map.empty()) ::InitInverseMap(); - inverse_map_t::const_iterator it; - inverse_map_t::mapped_type::const_iterator jt; + if (inverse_map.empty()) ::InitInverseMap(); + inverse_map_t::const_iterator it; + inverse_map_t::mapped_type::const_iterator jt; - std::set return_value; + std::set return_value; - while (true) { + for (;;) { it = inverse_map.find(t); if (it != inverse_map.end()) { - for (jt = it->second.begin(); jt != it->second.end(); ++jt) { - return_value.insert(jt->first); - } - } + for (jt = it->second.begin(); jt != it->second.end(); ++jt) { + return_value.insert(jt->first); + } + } if ((t = Parent(t)) == -1) break; } - - return return_value; + + return return_value; } void Type::PopulateDerivedFields(IfcWrite::IfcWritableEntity* e) { std::map >::const_iterator i = derived_map.find(e->type()); - if (i != derived_map.end()) { - for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { - e->setArgumentDerived(*it); - } - } + if (i != derived_map.end()) { + for (std::set::const_iterator it = i->second.begin(); it != i->second.end(); ++it) { + e->setArgumentDerived(*it); + } + } } #endif diff --git a/src/ifcparse/Ifc4.cpp b/src/ifcparse/Ifc4.cpp index d599ac25b8..aa49def74b 100644 --- a/src/ifcparse/Ifc4.cpp +++ b/src/ifcparse/Ifc4.cpp @@ -31,6 +31,8 @@ #include "../ifcparse/IfcWrite.h" #include "../ifcparse/IfcWritableEntity.h" +#include + using namespace Ifc4; using namespace IfcParse; using namespace IfcWrite; diff --git a/src/ifcparse/Ifc4.h b/src/ifcparse/Ifc4.h index 4f01c4f55c..23fc195b8a 100644 --- a/src/ifcparse/Ifc4.h +++ b/src/ifcparse/Ifc4.h @@ -29,7 +29,6 @@ #include #include -#include #include @@ -37,6 +36,11 @@ #include "../ifcparse/IfcException.h" #include "../ifcparse/Ifc4enum.h" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4100) +#endif + #define IfcSchema Ifc4 namespace Ifc4 { @@ -55147,4 +55151,8 @@ void InitStringMap(); IfcUtil::IfcBaseClass* SchemaEntity(IfcAbstractEntity* e = 0); } +#ifdef _MSC_VER +#pragma warning(pop) +#endif + #endif diff --git a/src/ifcparse/IfcCharacterDecoder.cpp b/src/ifcparse/IfcCharacterDecoder.cpp index 3b1b2a654e..4243efd475 100644 --- a/src/ifcparse/IfcCharacterDecoder.cpp +++ b/src/ifcparse/IfcCharacterDecoder.cpp @@ -130,7 +130,7 @@ IfcCharacterDecoder::operator std::string() { #ifdef HAVE_ICU unsigned int old_hex = 0; // for compatibility_mode #endif - while ( current_char = file->Peek() ) { + while ( (current_char = file->Peek()) != 0 ) { if ( EXPECTS_CHARACTER(parse_state) ) { #ifdef HAVE_ICU if ( previous_codepage != codepage ) { @@ -227,7 +227,7 @@ void IfcCharacterDecoder::dryRun() { unsigned int parse_state = 0; char current_char; unsigned int hex_count = 0; - while ( current_char = file->Peek() ) { + while ((current_char = file->Peek()) != 0) { if ( EXPECTS_CHARACTER(parse_state) ) { parse_state = 0; } else if ( current_char == '\'' && ! parse_state ) { @@ -340,8 +340,8 @@ IfcCharacterEncoder::operator std::string() { oss << "\\X" << num_bytes_str << "\\"; } if ( within_spf_range ) { - oss.put(ch); - if ( ch == '\\' || ch == '\'' ) oss.put(ch); + oss.put((char)ch); + if ( ch == '\\' || ch == '\'' ) oss.put((char)ch); } else { oss << std::hex << std::setw(num_bytes*2) << std::uppercase << std::setfill('0') << (int) ch; } diff --git a/src/ifcparse/IfcGlobalId.cpp b/src/ifcparse/IfcGlobalId.cpp index d1692b6bbd..f6ab34b48c 100644 --- a/src/ifcparse/IfcGlobalId.cpp +++ b/src/ifcparse/IfcGlobalId.cpp @@ -38,7 +38,7 @@ std::string base64(unsigned v, int l) { r.push_back(chars[v%64]); v /= 64; } - while ( r.size() != l ) r.push_back('0'); + while ( (int)r.size() != l ) r.push_back('0'); std::reverse(r.begin(),r.end()); return r; } @@ -70,7 +70,7 @@ std::string compress(unsigned char* v) { // Expands the base64 representation into a UUID byte array void expand(const std::string& s, std::vector& v) { - v.push_back(from_base64(s.substr(0,2))); + v.push_back((unsigned char)from_base64(s.substr(0,2))); for( unsigned i = 0; i < 5; ++i ) { unsigned d = from_base64(s.substr(2+4*i,4)); for ( unsigned j = 0; j < 3; ++ j ) { diff --git a/src/ifcparse/IfcHierarchyHelper.cpp b/src/ifcparse/IfcHierarchyHelper.cpp index d86fe6b7a4..ccaec9b587 100644 --- a/src/ifcparse/IfcHierarchyHelper.cpp +++ b/src/ifcparse/IfcHierarchyHelper.cpp @@ -290,7 +290,7 @@ void IfcHierarchyHelper::addBox(IfcSchema::IfcShapeRepresentation* rep, double w IfcSchema::IfcAxis2Placement2D* place, IfcSchema::IfcAxis2Placement3D* place2, IfcSchema::IfcDirection* dir, IfcSchema::IfcRepresentationContext* context) { - if (false) { + if (false) { // TODO What's this? IfcSchema::IfcRectangleProfileDef* profile = new IfcSchema::IfcRectangleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, boost::none, place ? place : addPlacement2d(), w, d); IfcSchema::IfcExtrudedAreaSolid* solid = new IfcSchema::IfcExtrudedAreaSolid(profile, @@ -303,10 +303,10 @@ void IfcHierarchyHelper::addBox(IfcSchema::IfcShapeRepresentation* rep, double w rep->setItems(items); } else { std::vector > points; - points.push_back(std::pair(-w/2, -d/2)); - points.push_back(std::pair(w/2, -d/2)); - points.push_back(std::pair(w/2, d/2)); - points.push_back(std::pair(-w/2, d/2)); + points.push_back(std::make_pair(-w/2, -d/2)); + points.push_back(std::make_pair(w/2, -d/2)); + points.push_back(std::make_pair(w/2, d/2)); + points.push_back(std::make_pair(-w/2, d/2)); // The call to addExtrudedPolyline() closes the polyline addExtrudedPolyline(rep, points, h, place, place2, dir, context); } diff --git a/src/ifcparse/IfcLateBoundEntity.cpp b/src/ifcparse/IfcLateBoundEntity.cpp index dbe78d1d04..d389b3461f 100644 --- a/src/ifcparse/IfcLateBoundEntity.cpp +++ b/src/ifcparse/IfcLateBoundEntity.cpp @@ -87,35 +87,35 @@ unsigned int IfcParse::IfcLateBoundEntity::getArgumentCount() const { return IfcSchema::Type::GetAttributeCount(_type); } IfcUtil::ArgumentType IfcParse::IfcLateBoundEntity::getArgumentType(unsigned int i) const { - return IfcSchema::Type::GetAttributeDerived(_type, i) + return IfcSchema::Type::GetAttributeDerived(_type, (unsigned char)i) ? IfcUtil::Argument_DERIVED - : IfcSchema::Type::GetAttributeType(_type,i); + : IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); } IfcSchema::Type::Enum IfcParse::IfcLateBoundEntity::getArgumentEntity(unsigned int i) const { - return IfcSchema::Type::GetAttributeEntity(_type, i); + return IfcSchema::Type::GetAttributeEntity(_type, (unsigned char)i); } Argument* IfcParse::IfcLateBoundEntity::getArgument(unsigned int i) const { return entity->getArgument(i); } const char* IfcParse::IfcLateBoundEntity::getArgumentName(unsigned int i) const { - return IfcSchema::Type::GetAttributeName(_type,i).c_str(); + return IfcSchema::Type::GetAttributeName(_type, (unsigned char)i).c_str(); } bool IfcParse::IfcLateBoundEntity::getArgumentOptionality(unsigned int i) const { - return IfcSchema::Type::GetAttributeOptional(_type, i); + return IfcSchema::Type::GetAttributeOptional(_type, (unsigned char)i); } void IfcParse::IfcLateBoundEntity::invalid_argument(unsigned int i, const std::string& t) { - const std::string arg_name = IfcSchema::Type::GetAttributeName(_type,i); + const std::string arg_name = IfcSchema::Type::GetAttributeName(_type, (unsigned char)i); throw IfcException(t + " is not a valid type for '" + arg_name + "'"); } void IfcParse::IfcLateBoundEntity::setArgumentAsNull(unsigned int i) { - bool is_optional = IfcSchema::Type::GetAttributeOptional(_type, i); + bool is_optional = IfcSchema::Type::GetAttributeOptional(_type, (unsigned char)i); if (is_optional) { writable_entity()->setArgument(i); } else invalid_argument(i,"NULL"); } void IfcParse::IfcLateBoundEntity::setArgumentAsInt(unsigned int i, int v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_INT) { writable_entity()->setArgument(i,v); } else if ( (arg_type == Argument_BOOL) && ( (v == 0) || (v == 1) ) ) { @@ -123,23 +123,23 @@ void IfcParse::IfcLateBoundEntity::setArgumentAsInt(unsigned int i, int v) { } else invalid_argument(i,"INTEGER"); } void IfcParse::IfcLateBoundEntity::setArgumentAsBool(unsigned int i, bool v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_BOOL) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"BOOLEAN"); } void IfcParse::IfcLateBoundEntity::setArgumentAsDouble(unsigned int i, double v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_DOUBLE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"REAL"); } void IfcParse::IfcLateBoundEntity::setArgumentAsString(unsigned int i, const std::string& a) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_STRING) { writable_entity()->setArgument(i,a); } else if (arg_type == Argument_ENUMERATION) { - std::pair enum_data = IfcSchema::Type::GetEnumerationIndex(IfcSchema::Type::GetAttributeEntity(_type, i), a); + std::pair enum_data = IfcSchema::Type::GetEnumerationIndex(IfcSchema::Type::GetAttributeEntity(_type, (unsigned char)i), a); writable_entity()->setArgument(i, enum_data.second, enum_data.first); } else if (arg_type == Argument_BINARY) { if (valid_binary_string(a)) { @@ -151,19 +151,19 @@ void IfcParse::IfcLateBoundEntity::setArgumentAsString(unsigned int i, const std } else invalid_argument(i,"STRING"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfInt(unsigned int i, const std::vector& v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_INT) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF INT"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfDouble(unsigned int i, const std::vector& v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_DOUBLE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF DOUBLE"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfString(unsigned int i, const std::vector& v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_STRING) { writable_entity()->setArgument(i,v); } else if (arg_type == Argument_AGGREGATE_OF_BINARY) { @@ -180,31 +180,31 @@ void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfString(unsigned int i } else invalid_argument(i,"AGGREGATE OF STRING"); } void IfcParse::IfcLateBoundEntity::setArgumentAsEntityInstance(unsigned int i, IfcParse::IfcLateBoundEntity* v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_ENTITY_INSTANCE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"ENTITY INSTANCE"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfEntityInstance(unsigned int i, IfcEntityList::ptr v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_ENTITY_INSTANCE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF ENTITY INSTANCE"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfAggregateOfInt(unsigned int i, const std::vector< std::vector >& v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_AGGREGATE_OF_INT) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF AGGREGATE OF INT"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfAggregateOfDouble(unsigned int i, const std::vector< std::vector >& v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF AGGREGATE OF DOUBLE"); } void IfcParse::IfcLateBoundEntity::setArgumentAsAggregateOfAggregateOfEntityInstance(unsigned int i, IfcEntityListList::ptr v) { - IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type,i); + IfcUtil::ArgumentType arg_type = IfcSchema::Type::GetAttributeType(_type, (unsigned char)i); if (arg_type == Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE) { writable_entity()->setArgument(i,v); } else invalid_argument(i,"AGGREGATE OF AGGREGATE OF ENTITY INSTANCE"); @@ -230,7 +230,7 @@ bool IfcParse::IfcLateBoundEntity::is_valid() { const Argument& arg = *getArgument(i); is_null = arg.isNull(); } catch(IfcException) {} - if (!IfcSchema::Type::GetAttributeOptional(_type,i) && is_null) { + if (!IfcSchema::Type::GetAttributeOptional(_type, (unsigned char)i) && is_null) { if (!valid) { oss << ", "; } diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 9b5f33a26b..f5bcb67237 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -143,6 +143,8 @@ void IfcSpfStream::ReadBuffer(bool inc) { offset += len; fseek(stream, offset, SEEK_SET); } +#else + (void)inc; #endif eof = feof(stream) != 0; if ( eof ) return; @@ -308,7 +310,7 @@ Token IfcSpfLexer::Next() { while ( ! stream->eof ) { // Read character and increment pointer if not starting a new token - char c = stream->Peek(); + c = stream->Peek(); if ( len && (c == '(' || c == ')' || c == '=' || c == ',' || c == ';' || c == '/') ) break; stream->Inc(); len ++; @@ -363,7 +365,7 @@ bool TokenFunc::startsWith(const Token& t, char c) { } bool TokenFunc::isOperator(const Token& t, char op) { - return (!t.first) && (!op || op == t.second); + return (!t.first) && (!op || (unsigned)op == t.second); } bool TokenFunc::isIdentifier(const Token& t) { @@ -394,8 +396,8 @@ bool TokenFunc::isInt(const Token& t) { const std::string str = asString(t); const char* start = str.c_str(); char* end; - long result = strtol(start,&end,10); - return ((end - start) == str.length()); + /*long result =*/ strtol(start,&end,10); + return ((end - start) == (ptrdiff_t)str.length()); } bool TokenFunc::isBool(const Token& t) { @@ -412,11 +414,11 @@ bool TokenFunc::isFloat(const Token& t) { const char* start = str.c_str(); char* end; #ifdef _MSC_VER - double result = _strtod_l(start,&end,locale); + /*double result =*/ _strtod_l(start,&end,locale); #else double result = strtod_l(start,&end,locale); #endif - return ((end - start) == str.length()); + return ((end - start) == (ptrdiff_t)str.length()); } int TokenFunc::asInt(const Token& t) { @@ -508,8 +510,7 @@ EntityArgument::EntityArgument(const Token& t) { // Aditionally, stores the ids (i.e. #[\d]+) in a vector // void ArgumentList::read(IfcSpfLexer* t, std::vector& ids) { - IfcParse::IfcFile* file = t->file; - + //IfcParse::IfcFile* file = t->file; Token next = t->Next(); while( next.second || next.first ) { if ( TokenFunc::isOperator(next,',') ) { @@ -517,9 +518,9 @@ void ArgumentList::read(IfcSpfLexer* t, std::vector& ids) { } else if ( TokenFunc::isOperator(next,')') ) { break; } else if ( TokenFunc::isOperator(next,'(') ) { - ArgumentList* list = new ArgumentList(); - list->read(t, ids); - push(list); + ArgumentList* alist = new ArgumentList(); + alist->read(t, ids); + push(alist); } else { if ( TokenFunc::isIdentifier(next) ) { ids.push_back(TokenFunc::asInt(next)); @@ -640,7 +641,7 @@ ArgumentList::operator IfcEntityListList::ptr() const { for ( it = list.begin(); it != list.end(); ++ it ) { const Argument* arg = *it; const ArgumentList* arg_list; - if ((arg_list = dynamic_cast(arg))) { + if ((arg_list = dynamic_cast(arg)) != 0) { IfcEntityList::ptr e = *arg_list; l->push(e); } @@ -732,7 +733,7 @@ TokenArgument::operator std::vector< std::vector >() const { throw IfcExcep TokenArgument::operator std::vector< std::vector >() const { throw IfcException("Argument is not a list of list of floats"); } TokenArgument::operator IfcEntityListList::ptr() const { throw IfcException("Argument is not a list of list of entity instances"); } unsigned int TokenArgument::size() const { return 1; } -Argument* TokenArgument::operator [] (unsigned int i) const { throw IfcException("Argument is not a list of attributes"); } +Argument* TokenArgument::operator [] (unsigned int /*i*/) const { throw IfcException("Argument is not a list of attributes"); } std::string TokenArgument::toString(bool upper) const { if ( upper && TokenFunc::isString(token) ) { return IfcWrite::IfcCharacterEncoder(TokenFunc::asString(token)); @@ -764,7 +765,7 @@ EntityArgument::operator std::vector< std::vector >() const { throw IfcExce EntityArgument::operator std::vector< std::vector >() const { throw IfcException("Argument is not a list of list of floats"); } EntityArgument::operator IfcEntityListList::ptr() const { throw IfcException("Argument is not a list of list of entity instances"); } unsigned int EntityArgument::size() const { return 1; } -Argument* EntityArgument::operator [] (unsigned int i) const { throw IfcException("Argument is not a list of arguments"); } +Argument* EntityArgument::operator [] (unsigned int /*i*/) const { throw IfcException("Argument is not a list of arguments"); } std::string EntityArgument::toString(bool upper) const { return entity->entity->toString(upper); } @@ -1070,9 +1071,9 @@ void IfcFile::addEntities(IfcEntityList::ptr es) { IfcUtil::IfcBaseClass* IfcFile::addEntity(IfcUtil::IfcBaseClass* entity) { // If this instance has been inserted before, return // a reference to the copy that was created from it. - entity_entity_map_t::iterator it = entity_file_map.find(entity); - if (it != entity_file_map.end()) { - return it->second; + entity_entity_map_t::iterator mit = entity_file_map.find(entity); + if (mit != entity_file_map.end()) { + return mit->second; } // Obtain all forward references by a depth-first @@ -1272,8 +1273,8 @@ void IfcFile::removeEntity(IfcUtil::IfcBaseClass* entity) { // moment, inversely related instances affected by the removal of the // entity being deleted are not deleted themselves. if (references) { - for (IfcEntityList::it it = references->begin(); it != references->end(); ++it) { - IfcUtil::IfcBaseEntity* related_instance = (IfcUtil::IfcBaseEntity*) *it; + for (IfcEntityList::it iit = references->begin(); iit != references->end(); ++iit) { + IfcUtil::IfcBaseEntity* related_instance = (IfcUtil::IfcBaseEntity*) *iit; for (unsigned i = 0; i < related_instance->getArgumentCount(); ++i) { Argument* attr = related_instance->getArgument(i); if (attr->isNull()) continue; @@ -1495,21 +1496,21 @@ std::pair IfcFile::getUnit(IfcSchema::IfcUnitE if (named_unit->UnitType() != type) { continue; } - IfcSchema::IfcSIUnit* unit = 0; + IfcSchema::IfcSIUnit* siunit = 0; if (named_unit->is(IfcSchema::Type::IfcConversionBasedUnit)) { IfcSchema::IfcConversionBasedUnit* u = (IfcSchema::IfcConversionBasedUnit*)named_unit; IfcSchema::IfcMeasureWithUnit* mu = u->ConversionFactor(); return_value.second *= static_cast(*mu->ValueComponent()->entity->getArgument(0)); return_value.first = named_unit; if (mu->UnitComponent()->is(IfcSchema::Type::IfcSIUnit)) { - unit = (IfcSchema::IfcSIUnit*) mu->UnitComponent(); + siunit = (IfcSchema::IfcSIUnit*) mu->UnitComponent(); } } else if (named_unit->is(IfcSchema::Type::IfcSIUnit)) { - return_value.first = unit = (IfcSchema::IfcSIUnit*) named_unit; + return_value.first = siunit = (IfcSchema::IfcSIUnit*) named_unit; } - if (unit) { - if (unit->hasPrefix()) { - return_value.second *= IfcSIPrefixToValue(unit->Prefix()); + if (siunit) { + if (siunit->hasPrefix()) { + return_value.second *= IfcSIPrefixToValue(siunit->Prefix()); } } } diff --git a/src/ifcparse/IfcSpfHeader.h b/src/ifcparse/IfcSpfHeader.h index 9edce30ea9..0b349003f5 100644 --- a/src/ifcparse/IfcSpfHeader.h +++ b/src/ifcparse/IfcSpfHeader.h @@ -29,6 +29,9 @@ class HeaderEntity : public IfcAbstractEntity { private: ArgumentList* _list; const char * const _datatype; + + HeaderEntity(const HeaderEntity&); //N/A + HeaderEntity& operator =(const HeaderEntity&); //N/A protected: HeaderEntity(const char * const datatype, IfcSpfLexer* lexer) : _datatype(datatype), _list(0) @@ -65,7 +68,7 @@ public: return (*_list)[i]; } - IfcEntityList::ptr getInverse(IfcSchema::Type::Enum type, int attribute_index) { + IfcEntityList::ptr getInverse(IfcSchema::Type::Enum /*type*/, int /*attribute_index*/) { return IfcEntityList::ptr(new IfcEntityList); } @@ -81,7 +84,7 @@ public: return (IfcSchema::Type::Enum) -1; } - bool is(IfcSchema::Type::Enum v) const { + bool is(IfcSchema::Type::Enum /*v*/) const { return false; } diff --git a/src/ifcparse/IfcUtil.h b/src/ifcparse/IfcUtil.h index cbf18333e0..cc0548d149 100644 --- a/src/ifcparse/IfcUtil.h +++ b/src/ifcparse/IfcUtil.h @@ -100,7 +100,7 @@ namespace IfcUtil { unsigned int getArgumentCount() const; Argument* getArgument(unsigned int i) const; const char* getArgumentName(unsigned int i) const; - IfcSchema::Type::Enum getArgumentEntity(unsigned int i) const { return IfcSchema::Type::UNDEFINED; } + IfcSchema::Type::Enum getArgumentEntity(unsigned int /*i*/) const { return IfcSchema::Type::UNDEFINED; } }; bool valid_binary_string(const std::string& s); diff --git a/src/ifcparse/IfcWrite.cpp b/src/ifcparse/IfcWrite.cpp index 99579f1d83..fd7739ebed 100644 --- a/src/ifcparse/IfcWrite.cpp +++ b/src/ifcparse/IfcWrite.cpp @@ -104,7 +104,6 @@ std::string IfcWritableEntity::toString(bool upper) const { ss << dt << "("; for (std::map::const_iterator it = args.begin(); it != args.end(); ++ it) { if ( it != args.begin() ) ss << ","; - const Argument* a = it->second; ss << it->second->toString(upper); } ss << ")"; @@ -140,7 +139,6 @@ void IfcWritableEntity::setArgument(int i) { } void IfcWritableEntity::setArgument(int i, Argument* a) { - IfcWrite::IfcWriteArgument* wa = new IfcWrite::IfcWriteArgument(this); IfcUtil::ArgumentType attr_type = a->type(); switch(attr_type) { case IfcUtil::Argument_NULL: @@ -182,7 +180,7 @@ void IfcWritableEntity::setArgument(int i, Argument* a) { this->setArgument(i, attr_value); } break; case IfcUtil::Argument_ENUMERATION: { - IfcSchema::Type::Enum ty = IfcSchema::Type::GetAttributeEntity(_type, i); + IfcSchema::Type::Enum ty = IfcSchema::Type::GetAttributeEntity(_type, (unsigned char)i); std::string enum_literal = a->toString(); // Remove leading and trailing '.' enum_literal = enum_literal.substr(1, enum_literal.size() - 2); @@ -291,27 +289,30 @@ void IfcWritableEntity::setArgument(int i,const std::vector< boost::dynamic_bits class SizeVisitor : public boost::static_visitor { public: - int operator()(const boost::none_t& i) const { return -1; } - int operator()(const IfcWriteArgument::Derived& i) const { return -1; } - int operator()(const int& i) const { return -1; } - int operator()(const bool& i) const { return -1; } - int operator()(const double& i) const { return -1; } - int operator()(const std::string& i) const { return -1; } - int operator()(const boost::dynamic_bitset<>& i) const { return -1; } + int operator()(const boost::none_t& /*i*/) const { return -1; } + int operator()(const IfcWriteArgument::Derived& /*i*/) const { return -1; } + int operator()(const int& /*i*/) const { return -1; } + int operator()(const bool& /*i*/) const { return -1; } + int operator()(const double& /*i*/) const { return -1; } + int operator()(const std::string& /*i*/) const { return -1; } + int operator()(const boost::dynamic_bitset<>& /*i*/) const { return -1; } int operator()(const std::vector& i) const { return (int)i.size(); } int operator()(const std::vector& i) const { return (int)i.size(); } int operator()(const std::vector< std::vector >& i) const { return (int)i.size(); } int operator()(const std::vector< std::vector >& i) const { return (int)i.size(); } int operator()(const std::vector& i) const { return (int)i.size(); } int operator()(const std::vector< boost::dynamic_bitset<> >& i) const { return (int)i.size(); } - int operator()(const IfcWriteArgument::EnumerationReference& i) const { return -1; } - int operator()(const IfcUtil::IfcBaseClass* const& i) const { return -1; } + int operator()(const IfcWriteArgument::EnumerationReference& /*i*/) const { return -1; } + int operator()(const IfcUtil::IfcBaseClass* const& /*i*/) const { return -1; } int operator()(const IfcEntityList::ptr& i) const { return i->size(); } int operator()(const IfcEntityListList::ptr& i) const { return i->size(); } }; class StringBuilderVisitor : public boost::static_visitor { private: + StringBuilderVisitor(const StringBuilderVisitor&); //N/A + StringBuilderVisitor& operator =(const StringBuilderVisitor&); //N/A + std::ostringstream& data; template void serialize(const std::vector& i) { data << "("; @@ -370,8 +371,8 @@ private: public: StringBuilderVisitor(std::ostringstream& stream, bool upper = false) : data(stream), upper(upper) {} - void operator()(const boost::none_t& i) { data << "$"; } - void operator()(const IfcWriteArgument::Derived& i) { data << "*"; } + void operator()(const boost::none_t& /*i*/) { data << "$"; } + void operator()(const IfcWriteArgument::Derived& /*i*/) { data << "*"; } void operator()(const int& i) { data << i; } void operator()(const bool& i) { data << (i ? ".T." : ".F."); } void operator()(const double& i) { data << format_double(i); } @@ -501,7 +502,7 @@ IfcWriteArgument::operator std::vector< std::vector >() const { return as >() const { return as > >(); } IfcWriteArgument::operator IfcEntityListList::ptr() const { throw; } bool IfcWriteArgument::isNull() const { return type() == IfcUtil::Argument_NULL; } -Argument* IfcWriteArgument::operator [] (unsigned int i) const { throw IfcParse::IfcException("Invalid cast"); } +Argument* IfcWriteArgument::operator [] (unsigned int /*i*/) const { throw IfcParse::IfcException("Invalid cast"); } std::string IfcWriteArgument::toString(bool upper) const { std::ostringstream str; str.imbue(std::locale::classic()); diff --git a/src/ifcwrap/IfcPython.i b/src/ifcwrap/IfcPython.i index 3aca18456c..ef42830a14 100644 --- a/src/ifcwrap/IfcPython.i +++ b/src/ifcwrap/IfcPython.i @@ -36,6 +36,15 @@ # include # include #endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4127 4244 4702 4510 4512 4610) +# if _MSC_VER > 1800 +# pragma warning(disable : 4456 4459) +# endif +#endif +// TODO add '# pragma warning(pop)' to the very end of the file %} %include "std_string.i" diff --git a/win/readme.md b/win/readme.md index ee4c3c4989..aa232dd260 100644 --- a/win/readme.md +++ b/win/readme.md @@ -14,22 +14,21 @@ the requirements for a successful execution. The script allows a few user-config which are listed in the usage instructions. Either edit the script file or set these values before running the script. -`build-deps.cmd` expects a CMake generator as `%1` and a build configuration type as `%2`. If the parameters -are not provided, the default values are used (`"Visual Studio 14 2015 Win64"` and `RelWithDebInfo` respectively). -A build type (`Build/Rebuild/Clean`) can be provided as `%3`, if wanted (defaults to `Build`). See `vs-cfg.cmd` -if you want to change the defaults. The batch file will create `deps\` and `deps-vs--installed\` +`build-deps.cmd` expects a CMake generator as `%1` and a build configuration type (`RelWithDebInfo/Release/MinSizeRel/Debug`, +defaults to `RelWithDebInfo`) as `%2`. If the generator is not provided, the generator is deduced from the Visual Studio +environment variables. A build type (`Build/Rebuild/Clean`, defaults to `Build`) can be provided as `%3`. See `vs-cfg.cmd` +if you wish to change the defaults. The batch file will create `deps\` and `deps-vs--installed\` directories to the project root. Debug and release builds of the depedencies can co-exist by simply running `build-deps.cmd Debug` and `build-deps.cmd `. -After the dependencies are build, execute `run-cmake.bat`. The batch file expects a CMake generator as -`%1` (if not provided, the same default value as above is used), or alternatively, if more parameters are provided, `%*` is passed for the CMake invokation, i.e., if one -wants to pass custom build options, the generator must be passed also using CMake's syntax: +After the dependencies are build, execute `run-cmake.bat`. The batch file expects always a CMake generator as `%1` +(if not provided, the same default value as above is used), and the rest of possible parameters are passed as is. +**If you wish to use any library from a custom location, modify the paths in `run-cmake.bat` accordingly**. The batch +script will create a folder of form `build-vs-\` which will contain the solution and project +files for Visual Studio. -`run-cmake.bat -G "Visual Studio 14 2015 Win64" -DBUILD_IFCPYTHON=0`. - -The batch script will create a folder of form `build-vs-\` which will contain the solution and project files for Visual Studio. -**If you wish to use any library from a custom location, modify the paths in run-cmake.bat -accordingly**. +Note that building IfcOpenShell as 64-bit is recommended as many of real life IFC files has been observed to take +easily more than 2 GBs of RAM while converting. After this, one can build the project using the `IfcOpenShell.sln` file in the build folder. Build the `INSTALL` project if wanted. The project will be installed to `installed-vs-\` folder in the project's root diff --git a/win/run-cmake.bat b/win/run-cmake.bat index 3ee00e731a..e689ea28ab 100644 --- a/win/run-cmake.bat +++ b/win/run-cmake.bat @@ -26,6 +26,7 @@ set PROJECT_NAME=IfcOpenShell setlocal EnableDelayedExpansion :: TODO Getting warning print in vs-cfg.cmd for missing build type although this script doesn't need it specified call vs-cfg.cmd %1 +IF NOT %ERRORLEVEL%==0 GOTO :Error :: Read Python related variables from BuildDepsCache.txt for /f "delims== tokens=1,2" %%G in (BuildDepsCache-%TARGET_ARCH%.txt) do set %%G=%%H @@ -103,7 +104,7 @@ goto :Finish :Error echo. -cecho {0C}An error occurred! Aborting!" +call %~dp0\utils\cecho.cmd 0 12 "An error occurred! Aborting!" goto :Finish :Finish diff --git a/win/vs-cfg.cmd b/win/vs-cfg.cmd index f1e41ca88e..3f8294699f 100644 --- a/win/vs-cfg.cmd +++ b/win/vs-cfg.cmd @@ -19,6 +19,12 @@ :: This script initializes various Visual Studio -related environment variables needed for building :: This batch file expects CMake generator as %1 and build configuration type as %2. +:: If %1 is not provided, it is deduced from the VisualStudioVersion environment variable and from the location of cl.exe. + +:: NOTE This batch file expects the generator string to be CMake 3.0.0 and newer format, i.e. +:: "Visual Studio 10 2010" instead of "Visual Studio 10". However, one can use this batch file +:: also with CMake 2 as the generator will be converted into the older format if necessary. + :: NOTE: The delayed environment variable expansion needs to be enabled before calling this. @echo off @@ -28,33 +34,46 @@ set GENERATOR=%1 :: TODO IDEA: Take more user-friendly VS generators and convert them to the CMake ones? :: F.ex. "vs2013-32" and/or "vc14-64" -:: TODO Print CMake and VS versions. Maybe in build-deps.cmd would be better than here. - :: Supported Visual Studio versions: -set GENERATORS[0]="Visual Studio 14 2015" -set GENERATORS[1]="Visual Studio 14 2015 Win64" -:: TODO Check CMake version and convert possible new format (>= 3.0) generator names -:: to the old versions if using older CMake for VS <= 2013, -:: see http://www.cmake.org/cmake/help/v3.0/release/3.0.0.html#other-changes -set GENERATORS[2]="Visual Studio 12" -set GENERATORS[3]="Visual Studio 12 Win64" -set GENERATORS[4]="Visual Studio 11" -set GENERATORS[5]="Visual Studio 11 Win64" -set GENERATORS[6]="Visual Studio 10" -set GENERATORS[7]="Visual Studio 10 Win64" -set GENERATORS[8]="Visual Studio 9 2008" -set GENERATORS[9]="Visual Studio 9 2008 Win64" -set GENERATOR_DEFAULT=%GENERATORS[1]% +set GENERATORS[0]="Visual Studio 9 2008 Win64" +set GENERATORS[1]="Visual Studio 9 2008" +set GENERATORS[2]="Visual Studio 10 2010 Win64" +set GENERATORS[3]="Visual Studio 10 2010" +set GENERATORS[4]="Visual Studio 11 2012 Win64" +set GENERATORS[5]="Visual Studio 11 2012" +set GENERATORS[6]="Visual Studio 12 2013 Win64" +set GENERATORS[7]="Visual Studio 12 2013" +set GENERATORS[8]="Visual Studio 14 2015 Win64" +set GENERATORS[9]="Visual Studio 14 2015" +set LAST_GENERATOR_IDX=9 -IF "!GENERATOR!"=="" ( - set GENERATOR=%GENERATOR_DEFAULT% - call utils\cecho.cmd 0 14 "%~nx0: Warning: Generator not passed - using the default '`"%GENERATOR_DEFAULT%`'`t +REM Deduce desired architecture from the location of cl.exe +where cl.exe | findstr /r /c:"amd64" >nul +set START=%ERRORLEVEL% +set STEP=2 + +IF "!GENERATOR!"=="" IF NOT "%VisualStudioVersion%"=="" ( + set VC_VER=%VisualStudioVersion:.0=% + FOR /l %%i in (%START%,%STEP%,%LAST_GENERATOR_IDX%) DO ( + REM http://stackoverflow.com/a/8758579 + REM NOTE add space before VC_VER so that e.g. "12" doesn't match with "2012" + echo(!GENERATORS[%%i]! | findstr /r /c:" !VC_VER!" >nul && ( + set GENERATOR=!GENERATORS[%%i]! + call utils\cecho.cmd black cyan "Generator not passed, but VisualStudioVersion=%VisualStudioVersion% environment variable detected:" + call utils\cecho.cmd black cyan "using '`"!GENERATOR!`'" as the generator." + GOTO :GeneratorValid + ) + ) ) -FOR /l %%i in (0,1,9) DO ( +FOR /l %%i in (0,1,%LAST_GENERATOR_IDX%) DO ( IF !GENERATOR!==!GENERATORS[%%i]! GOTO :GeneratorValid ) call utils\cecho.cmd 0 12 "%~nx0: Invalid or unsupported CMake generator string passed: '`"!GENERATOR!`'". Cannot proceed, aborting!" +echo Supported CMake generator strings: +FOR /l %%i in (0,1,%LAST_GENERATOR_IDX%) DO ( + echo !GENERATORS[%%i]! +) exit /b 1 :GeneratorValid @@ -82,6 +101,18 @@ FOR %%i IN (%GENERATOR_SPLIT%) DO ( ) ) +:: Check CMake version and convert possible new format (>= 3.0) generator names to the old versions if using older CMake for VS <= 2013, +:: see http://www.cmake.org/cmake/help/v3.0/release/3.0.0.html#other-changes +FOR /f "delims=" %%i in ('where cmake') DO set CMAKE_PATH=%%i +IF NOT "%CMAKE_PATH%"=="" ( + FOR /f "delims=" %%i in ('cmake --version ^| findstr /C:"cmake version 3"') DO GOTO :CMake3AndNewer +) +:: CMake older than 3.0.0: convert new format generators to the old format (simple brute force for simplicity) +set GENERATOR=%GENERATOR: 2013=% +set GENERATOR=%GENERATOR: 2012=% +set GENERATOR=%GENERATOR: 2010=% +:CMake3AndNewer + :: VS project file extension is different on older VS versions set VCPROJ_FILE_EXT=vcxproj IF %VS_VER%==2008 set VCPROJ_FILE_EXT=vcproj