int main(int argc, char** argv) { IfcHierarchyHelper file; IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( guid(), 0, S("Blender's Suzanne"), null, null, 0, 0, null, null); file.addBuildingProduct(product); product->setOwnerHistory(file.getSingle<IfcSchema::IfcOwnerHistory>()); product->setObjectPlacement(file.addLocalPlacement()); IfcSchema::IfcRepresentation::list::ptr reps (new IfcSchema::IfcRepresentation::list); IfcSchema::IfcRepresentationItem::list::ptr items (new IfcSchema::IfcRepresentationItem::list); std::vector< std::vector< double > > vertices_vector = create_vector_from_array(vertices, sizeof(vertices) / sizeof(vertices[0])); std::vector< std::vector< int > > indices_vector = create_vector_from_array(indices, sizeof(indices) / sizeof(indices[0])); IfcSchema::IfcCartesianPointList3D* coordinates = new IfcSchema::IfcCartesianPointList3D(vertices_vector); IfcSchema::IfcTriangulatedFaceSet* faceset = new IfcSchema::IfcTriangulatedFaceSet(coordinates, null, null, indices_vector, null); items->push(faceset); IfcSchema::IfcShapeRepresentation* rep = new IfcSchema::IfcShapeRepresentation( file.getRepresentationContext("Model"), S("Body"), S("SurfaceModel"), items); reps->push(rep); IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps); file.addEntity(shape); product->setRepresentation(shape); const std::string filename = "tesselated_faceset.ifc"; file.header().file_name().name(filename); std::ofstream f(filename.c_str()); f << file; }
int main() { IfcHierarchyHelper file; file.header().file_name().name("ifc_curve_rebar.ifc"); create_curve_rebar(file); std::ofstream f("ifc_curve_rebar.ifc"); f << file; return 0; }
int main(int argc, char** argv) { const char filename[] = "IfcCompositeProfileDef.ifc"; IfcHierarchyHelper file; file.header().file_name().name(filename); double coords1[] = {100.0, 0.0}; double coords2[] = {200.0, 0.0}; double coords3[] = {300.0, 0.0}; IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list()); IfcSchema::IfcCartesianTransformationOperator2D* transform1 = new IfcSchema::IfcCartesianTransformationOperator2D(file.addDoublet<IfcSchema::IfcDirection>(1, 0), file.addDoublet<IfcSchema::IfcDirection>(0, -1), file.addDoublet<IfcSchema::IfcCartesianPoint>(40, 0), null); IfcSchema::IfcCartesianTransformationOperator2D* transform2 = new IfcSchema::IfcCartesianTransformationOperator2D(file.addDoublet<IfcSchema::IfcDirection>(0, -1), file.addDoublet<IfcSchema::IfcDirection>(1, 0), file.addDoublet<IfcSchema::IfcCartesianPoint>(40, 0), 0.3); IfcSchema::IfcProfileDef* p1 = new Ifc2x3::IfcIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, file.addPlacement2d(), 25.0, 50.0, 5.0, 5.0, 2.0); IfcSchema::IfcProfileDef* p2 = new Ifc2x3::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, file.addPlacement2d(), 50.0, 25.0, 5.0, 1.0, 2.0, 2.0, null, null); IfcSchema::IfcProfileDef* p3 = new Ifc2x3::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, file.addPlacement2d(), 50.0, 40.0, 10.0, 10.0, 3.0, 2.0, 1.0, 2.0, 2.0, null); IfcSchema::IfcProfileDef* p4 = new Ifc2x3::IfcCShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, file.addPlacement2d(80.), 50.0, 25.0, 5.0, 10.0, 2.0, null); file.addEntity(p2); file.addEntity(p3); file.addEntity(transform1); file.addEntity(transform2); IfcSchema::IfcDerivedProfileDef* p5 = new IfcSchema::IfcDerivedProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, p2, transform1, null); IfcSchema::IfcDerivedProfileDef* p6 = new IfcSchema::IfcDerivedProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, p3, transform2, null); profiles->push(p1); profiles->push(p5); profiles->push(p6); profiles->push(p4); file.addEntities(profiles->generalize()); IfcSchema::IfcCompositeProfileDef* composite = new IfcSchema::IfcCompositeProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, S("IFC"), profiles, null); IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( guid(), 0, S("profile"), null, null, 0, 0, null, null); file.addBuildingProduct(product); product->setOwnerHistory(file.getSingle<IfcSchema::IfcOwnerHistory>()); product->setObjectPlacement(file.addLocalPlacement()); IfcSchema::IfcExtrudedAreaSolid* solid = new IfcSchema::IfcExtrudedAreaSolid(composite, file.addPlacement3d(), file.addTriplet<IfcSchema::IfcDirection>(0, 0, 1), 20.0); file.addEntity(composite); file.addEntity(solid); IfcSchema::IfcRepresentation::list::ptr reps (new IfcSchema::IfcRepresentation::list()); IfcSchema::IfcRepresentationItem::list::ptr items (new IfcSchema::IfcRepresentationItem::list()); items->push(solid); IfcSchema::IfcShapeRepresentation* rep = new IfcSchema::IfcShapeRepresentation( file.getSingle<IfcSchema::IfcRepresentationContext>(), S("Body"), S("SweptSolid"), items); reps->push(rep); IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(boost::none, boost::none, reps); file.addEntity(rep); file.addEntity(shape); product->setRepresentation(shape); file.getSingle<IfcSchema::IfcProject>()->setName("IfcCompositeProfileDef"); std::ofstream f(filename); f << file; }
int main() { // The IfcHierarchyHelper is a subclass of the regular IfcFile that provides several // convenience functions for working with geometry in IFC files. IfcHierarchyHelper file; file.header().file_name().name("IfcAdvancedHouse.ifc"); IfcSchema::IfcBuilding* building = file.addBuilding(); // By adding a building, a hierarchy has been automatically created that consists of the following // structure: IfcProject > IfcSite > IfcBuilding // Lateron changing the name of the IfcProject can be done by obtaining a reference to the // project, which has been created automatically. file.getSingle<IfcSchema::IfcProject>()->setName("IfcOpenHouse"); // To demonstrate the ability to serialize arbitrary opencascade solids a building envelope is // constructed by applying boolean operations. Naturally, in IFC, building elements should be // modeled separately, with rich parametric and relational semantics. Creating geometry in this // way does not preserve any history and is merely a demonstration of technical capabilities. TopoDS_Shape outer = BRepPrimAPI_MakeBox(gp_Pnt(-5000., -180., -2000.), gp_Pnt(5000., 5180., 3000.)).Shape(); TopoDS_Shape inner = BRepPrimAPI_MakeBox(gp_Pnt(-4640., 180., 0.), gp_Pnt(4640., 4820., 3000.)).Shape(); TopoDS_Shape window1 = BRepPrimAPI_MakeBox(gp_Pnt(-5000., -180., 400.), gp_Pnt( 500., 1180., 2000.)).Shape(); TopoDS_Shape window2 = BRepPrimAPI_MakeBox(gp_Pnt( 2070., -180., 400.), gp_Pnt(3930., 180., 2000.)).Shape(); TopoDS_Shape building_shell = BRepAlgoAPI_Cut( BRepAlgoAPI_Cut( BRepAlgoAPI_Cut(outer, inner), window1 ), window2 ); // Since the solid consists only of planar faces and straight edges it can be serialized as an // IfcFacetedBRep. If it would not be a polyhedron, serialise() can only be successful when linked // to the IFC4 model and with `advanced` set to `true` which introduces IfcAdvancedFace. It would // return `0` otherwise. IfcSchema::IfcProductDefinitionShape* building_shape = IfcGeom::serialise(building_shell, false); file.addEntity(building_shape); IfcSchema::IfcRepresentation* rep = *building_shape->Representations()->begin(); rep->setContextOfItems(file.getRepresentationContext("model")); building->setRepresentation(building_shape); // A pale white colour is assigned to the building. file.setSurfaceColour( building_shape, 0.75, 0.73, 0.68); // For the ground mesh of the IfcSite we will use a Nurbs surface created in Open Cascade. Only // in IFC4 the surface can be directly serialized. In IFC2X3 the it will have to be tesselated. TopoDS_Shape shape; createGroundShape(shape); IfcSchema::IfcProductDefinitionShape* ground_representation = IfcGeom::serialise(shape, true); if (!ground_representation) { ground_representation = IfcGeom::tesselate(shape, 100.); } file.getSingle<IfcSchema::IfcSite>()->setRepresentation(ground_representation); IfcSchema::IfcRepresentation::list::ptr ground_reps = file.getSingle<IfcSchema::IfcSite>()->Representation()->Representations(); for (IfcSchema::IfcRepresentation::list::it it = ground_reps->begin(); it != ground_reps->end(); ++it) { (*it)->setContextOfItems(file.getRepresentationContext("Model")); } file.addEntity(ground_representation); file.setSurfaceColour(ground_representation, 0.15, 0.25, 0.05); /* // Note that IFC lacks elementary surfaces that STEP does have, such as spherical_surface. // BRepBuilderAPI_NurbsConvert can be used to serialize such surfaces as nurbs surfaces. TopoDS_Shape sphere = BRepPrimAPI_MakeSphere(gp_Pnt(), 1000.).Shape(); IfcSchema::IfcProductDefinitionShape* sphere_representation = IfcGeom::serialise(sphere, true); if (S(IfcSchema::Identifier) == "IFC4") { sphere = BRepBuilderAPI_NurbsConvert(sphere, true).Shape(); sphere_representation = IfcGeom::serialise(sphere, true); } */ // Finally create a file stream for our output and write the IFC file to it. std::ofstream f("IfcAdvancedHouse.ifc"); f << file; }