xBIM之二:构建墙和门窗
阅读原文时间:2023年07月10日阅读:1

研究了两天,终于实现了利用xBIM自动输出墙和门窗

比较粗糙的源码如下:

private void Form1_Load(object sender, EventArgs e)
{
//first create and initialise a model called Hello Wall
Console.WriteLine("Initialising the IFC Project….");
using (var model = CreateandInitModel("HelloWall"))
{
if (model != null)
{
IfcBuilding building = CreateBuilding(model, "Default Building");
IfcWallStandardCase wall = CreateWall(model, , , );
IfcDoor door = CreateDoor(model, wall, , , );
IfcWindow widnow = CreateWindow(model, wall, , , );
if (wall != null) AddPropertiesToWall(model, wall);
using (var txn = model.BeginTransaction("Add Wall"))
{
building.AddElement(wall);
building.AddElement(door);
building.AddElement(widnow);
txn.Commit();
}

                 if (wall != null)  
                 {  
                     try  
                     {  
                         Console.WriteLine("Standard Wall successfully created....");  
                         //保存到文件  
                         model.SaveAs("HelloWallIfc4.ifc", IfcStorageType.Ifc);  
                         Console.WriteLine("HelloWallIfc4.ifc has been successfully written");  
                     }  
                     catch (Exception ex)  
                     {  
                         Console.WriteLine("Failed to save HelloWall.ifc");  
                         Console.WriteLine(ex.Message);  
                     }  
                 }  
             }  
             else  
             {  
                 Console.WriteLine("Failed to initialise the model");  
             }  
         }  
         Console.WriteLine("Press any key to exit to view the IFC file....");  
         Console.ReadKey();  
        // LaunchNotepad("HelloWallIfc4.ifc");  
     }  
     // private static void LaunchNotepad(string fileName)  
     //{  
     //    Process p;  
     //    try  
     //    {

     //        p = new Process {StartInfo = {FileName = fileName, CreateNoWindow = false}};  
     //        p.Start();  
     //    }  
     //    catch (Exception ex)  
     //    {  
     //        Console.WriteLine("Exception Occurred :{0},{1}",  
     //                  ex.Message, ex.StackTrace);  
     //    }  
     //}

     private static IfcBuilding CreateBuilding(IfcStore model, string name)  
     {  
         //启动事务  
         using (var txn = model.BeginTransaction("Create Building"))  
         {  
             var building = model.Instances.New<IfcBuilding>();  
             building.Name = name;

             building.CompositionType = IfcElementCompositionEnum.ELEMENT;  
             var localPlacement = model.Instances.New<IfcLocalPlacement>();  
             building.ObjectPlacement = localPlacement;  
             var placement = model.Instances.New<IfcAxis2Placement3D>();  
             localPlacement.RelativePlacement = placement;  
             placement.Location = model.Instances.New<IfcCartesianPoint>(p=>p.SetXYZ(,,));  
             //获取项目  
             var project = model.Instances.OfType<IfcProject>().FirstOrDefault();  
             project.AddBuilding(building);  
             txn.Commit();  
             return building;  
         }  
     }

     /// <summary>  
     /// 设置模型的基本参数、单元、所有权等  
     /// </summary>  
     /// <param name="projectName">项目名称</param>  
     /// <returns></returns>  
     private static IfcStore CreateandInitModel(string projectName)  
     {  
         //首先我们需要为模型创建凭证、这个在之前的文章都有解释  
         var credentials = new XbimEditorCredentials  
         {  
             ApplicationDevelopersName = "xBimTeam",  
             ApplicationFullName = "Hello Wall Application",  
             ApplicationIdentifier = "HelloWall.exe",  
             ApplicationVersion = "1.0",  
             EditorsFamilyName = "Team",  
             EditorsGivenName = "xBIM",  
             EditorsOrganisationName = "xBimTeam"  
         };  
         //那么先创建 IfcStore,IfcStore 是IFC4 格式存放在内存中而不是数据库  
         //如果模型大于50MB的Ifc或者需要强大的事务处理,数据库在性能方面通常会更好

         var model = IfcStore.Create(credentials, IfcSchemaVersion.Ifc4,XbimStoreType.InMemoryModel);  
         // 启动事务、将所有的模型更改为 ACID  
         using (var txn = model.BeginTransaction("Initialise Model"))  
         {

             //常见项目信息  
             var project = model.Instances.New<IfcProject>();  
             //设置单位   这里是英制  
             project.Initialize(ProjectUnits.SIUnitsUK);  
             project.Name = projectName;

             //提交修改  
             txn.Commit();  
         }  
         return model; 

     }

     /// <summary>  
     /// 创建墙  
     /// </summary>  
     /// <param name="model"></param>  
     /// <param name="length">矩形的长度 </param>  
     /// <param name="width">矩形占地面积的宽度(墙的宽度)</param>  
     /// <param name="height">墙高度</param>  
     /// <returns></returns>  
     static private IfcWallStandardCase CreateWall(IfcStore model, double length, double width, double height)  
     {

         //启动事务  
         using (var txn = model.BeginTransaction("Create Wall"))  
         {  
             var wall = model.Instances.New<IfcWallStandardCase>();  
             wall.Name = "A Standard rectangular wall";

             // 墙的矩形剖面  
             //var rectProf = model.Instances.New<IfcRectangleProfileDef>();  
             //rectProf.ProfileType = IfcProfileTypeEnum.AREA;  
             //rectProf.XDim = width;  
             //rectProf.YDim = length;

             //var insertPoint = model.Instances.New<IfcCartesianPoint>();  
             //insertPoint.SetXY(0, 400); //在任意位置插入  
             //rectProf.Position = model.Instances.New<IfcAxis2Placement2D>();  
             //rectProf.Position.Location = insertPoint;

             //var curve=model.Instances.New<IfcCurve>();  
             IfcPolyline curve = model.Instances.New<IfcPolyline>();  
             var pt0 = model.Instances.New<IfcCartesianPoint>();  
             pt0.SetXY(, ); //在任意位置插入  
             var pt1 = model.Instances.New<IfcCartesianPoint>();  
             pt1.SetXY(, length / ); //在任意位置插入  
             var pt2 = model.Instances.New<IfcCartesianPoint>();  
             pt2.SetXY(, length); //在任意位置插入  
             curve.Points.Add(pt0);  
             curve.Points.Add(pt1);  
             curve.Points.Add(pt2);

             var rectProf = model.Instances.New<IfcCenterLineProfileDef>();  
             rectProf.ProfileType = IfcProfileTypeEnum.AREA;  
             rectProf.Thickness = width;  
             rectProf.Curve = curve;

             //模型区域实心  
             var body = model.Instances.New<IfcExtrudedAreaSolid>();  
             body.Depth = height;  
             body.SweptArea = rectProf;  
             body.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             body.ExtrudedDirection.SetXYZ(, , );

             //在模型中插入几何参数  
             var origin = model.Instances.New<IfcCartesianPoint>();  
             origin.SetXYZ(, , );  
             body.Position = model.Instances.New<IfcAxis2Placement3D>();  
             body.Position.Location = origin;

             //创建一个定义形状来保存几何  
             var shape = model.Instances.New<IfcShapeRepresentation>();  
             var modelContext = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             shape.ContextOfItems = modelContext;  
             shape.RepresentationType = "SweptSolid";  
             shape.RepresentationIdentifier = "Body";  
             shape.Items.Add(body);

             //创建产品定义并将模型几何添加到墙上  
             var rep = model.Instances.New<IfcProductDefinitionShape>();  
             rep.Representations.Add(shape);  
             wall.Representation = rep;

             //把墙放到模型中  
             var lp = model.Instances.New<IfcLocalPlacement>();  
             var ax3D = model.Instances.New<IfcAxis2Placement3D>();  
             ax3D.Location = origin;  
             ax3D.RefDirection = model.Instances.New<IfcDirection>();  
             ax3D.RefDirection.SetXYZ(, , );  
             ax3D.Axis = model.Instances.New<IfcDirection>();  
             ax3D.Axis.SetXYZ(, , );  
             lp.RelativePlacement = ax3D;  
             wall.ObjectPlacement = lp;

             //Where子句:IfcWallStandard依赖于提供一个IfcMaterialLayerSetUsage  
             var ifcMaterialLayerSetUsage = model.Instances.New<IfcMaterialLayerSetUsage>();  
             var ifcMaterialLayerSet = model.Instances.New<IfcMaterialLayerSet>();  
             var ifcMaterialLayer = model.Instances.New<IfcMaterialLayer>();  
             ifcMaterialLayer.LayerThickness = ;  
             ifcMaterialLayerSet.MaterialLayers.Add(ifcMaterialLayer);  
             ifcMaterialLayerSetUsage.ForLayerSet = ifcMaterialLayerSet;  
             ifcMaterialLayerSetUsage.LayerSetDirection = IfcLayerSetDirectionEnum.AXIS2;  
             ifcMaterialLayerSetUsage.DirectionSense = IfcDirectionSenseEnum.NEGATIVE;  
             ifcMaterialLayerSetUsage.OffsetFromReferenceLine = ;

             //添加材料到墙上  
             var material = model.Instances.New<IfcMaterial>();  
             material.Name = "some material";  
             var ifcRelAssociatesMaterial = model.Instances.New<IfcRelAssociatesMaterial>();  
             ifcRelAssociatesMaterial.RelatingMaterial = material;  
             ifcRelAssociatesMaterial.RelatedObjects.Add(wall);

             ifcRelAssociatesMaterial.RelatingMaterial = ifcMaterialLayerSetUsage;

             //IfcPresentationLayerAssignment对于IfcWall或IfcWallStandardCase中的CAD演示是必需的  
             var ifcPresentationLayerAssignment = model.Instances.New<IfcPresentationLayerAssignment>();  
             ifcPresentationLayerAssignment.Name = "some ifcPresentationLayerAssignment";  
             ifcPresentationLayerAssignment.AssignedItems.Add(shape);  
             // 如果IfcPolyline具有两个点,则对于IfcWall是必需的  
             var ifcPolyline = model.Instances.New<IfcPolyline>();  
             var startPoint = model.Instances.New<IfcCartesianPoint>();  
             startPoint.SetXY(, );  
             var endPoint = model.Instances.New<IfcCartesianPoint>();  
             endPoint.SetXY(, );  
             ifcPolyline.Points.Add(startPoint);  
             ifcPolyline.Points.Add(endPoint);

             var shape2D = model.Instances.New<IfcShapeRepresentation>();  
             shape2D.ContextOfItems = modelContext;  
             shape2D.RepresentationIdentifier = "Axis";  
             shape2D.RepresentationType = "Curve2D";  
             shape2D.Items.Add(ifcPolyline);  
             rep.Representations.Add(shape2D);

             //var rectDoor = model.Instances.New<IfcRectangleProfileDef>();  
             //rectDoor.ProfileType = IfcProfileTypeEnum.AREA;  
             //rectDoor.XDim = width;  
             //rectDoor.YDim = length;

             //var insertPoint = model.Instances.New<IfcCartesianPoint>();  
             //insertPoint.SetXY(0, 400); //在任意位置插入  
             //rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>();  
             //rectDoor.Position.Location = insertPoint;  
             ////模型区域实心  
             //var body\_door = model.Instances.New<IfcExtrudedAreaSolid>();  
             //body\_door.Depth = height;  
             //body\_door.SweptArea = rectDoor;  
             //body\_door.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             //body\_door.ExtrudedDirection.SetXYZ(0, 0, 1);

             ////在模型中插入几何参数  
             //body\_door.Position = model.Instances.New<IfcAxis2Placement3D>();  
             //body\_door.Position.Location = origin;

             ////创建一个定义形状来保存几何  
             //var shape\_door = model.Instances.New<IfcShapeRepresentation>();  
             //var modelContext\_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             //shape\_door.ContextOfItems = modelContext\_door;  
             //shape\_door.RepresentationType = "SweptSolid";  
             //shape\_door.RepresentationIdentifier = "Body";  
             //shape\_door.Items.Add(body\_door);

             ////创建产品定义并将模型几何添加到墙上  
             //var rep\_door = model.Instances.New<IfcProductDefinitionShape>();  
             //rep\_door.Representations.Add(shape\_door);

             //var door = model.Instances.New<IfcDoor>();  
             //door.Name = "A Door";  
             //var lp\_door = model.Instances.New<IfcLocalPlacement>();  
             //var ax3D\_door = model.Instances.New<IfcAxis2Placement3D>();  
             //ax3D\_door.Location = origin;  
             //ax3D\_door.RefDirection = model.Instances.New<IfcDirection>();  
             //ax3D\_door.RefDirection.SetXYZ(0, 1, 0);  
             //ax3D\_door.Axis = model.Instances.New<IfcDirection>();  
             //ax3D\_door.Axis.SetXYZ(0, 0, 1);  
             //lp\_door.RelativePlacement = ax3D\_door;  
             //door.ObjectPlacement = lp\_door;  
             //door.Representation = rep\_door;  
             //var m\_OpeningEle = model.Instances.New<IfcOpeningElement>();  
             //m\_OpeningEle.Name = "Openings";

             //var m\_RelFills = model.Instances.New<IfcRelFillsElement>();  
             //m\_RelFills.RelatingOpeningElement = m\_OpeningEle;  
             //m\_RelFills.RelatedBuildingElement = door;  
             //var voidRel = model.Instances.New<IfcRelVoidsElement>();  
             //voidRel.RelatedOpeningElement = m\_OpeningEle;  
             //voidRel.RelatingBuildingElement = wall;

             txn.Commit();  
             return wall;  
         }

     }  
     static private IfcDoor CreateDoor(IfcStore model, IfcWallStandardCase wall, double length, double width, double height)  
     {  
         //启动事务  
         using (var txn = model.BeginTransaction("Create Door"))  
         {  
             var rectDoor = model.Instances.New<IfcRectangleProfileDef>();  
             rectDoor.ProfileType = IfcProfileTypeEnum.AREA;  
             rectDoor.XDim = width-;  
             rectDoor.YDim = length;

             var insertPoint = model.Instances.New<IfcCartesianPoint>();  
             insertPoint.SetXY(, ); //在任意位置插入  
             rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>();  
             rectDoor.Position.Location = insertPoint;

             //模型区域实心  
             var body\_door = model.Instances.New<IfcExtrudedAreaSolid>();  
             body\_door.Depth = height;  
             body\_door.SweptArea = rectDoor;  
             body\_door.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             body\_door.ExtrudedDirection.SetXYZ(, , );

             var origin = model.Instances.New<IfcCartesianPoint>();  
             origin.SetXYZ(, , );  
             //在模型中插入几何参数  
             body\_door.Position = model.Instances.New<IfcAxis2Placement3D>();  
             body\_door.Position.Location = origin;

             //创建一个定义形状来保存几何  
             var shape\_door = model.Instances.New<IfcShapeRepresentation>();  
             var modelContext\_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             shape\_door.ContextOfItems = modelContext\_door;  
             shape\_door.RepresentationType = "SweptSolid";  
             shape\_door.RepresentationIdentifier = "Body";  
             shape\_door.Items.Add(body\_door);

             //创建产品定义并将模型几何添加到墙上  
             var rep\_door = model.Instances.New<IfcProductDefinitionShape>();  
             rep\_door.Representations.Add(shape\_door);

             var door = model.Instances.New<IfcDoor>();  
             door.Name = "A Door";  
             door.PredefinedType = IfcDoorTypeEnum.GATE;  
             door.OperationType = IfcDoorTypeOperationEnum.DOUBLE\_SWING\_LEFT;  
             door.OverallHeight = ;  
             door.OverallWidth = ;

             var lp\_door = model.Instances.New<IfcLocalPlacement>();  
             var wallplace = wall.ObjectPlacement;  
             var ax3D\_door = model.Instances.New<IfcAxis2Placement3D>();  
             var origin2 = model.Instances.New<IfcCartesianPoint>();  
             origin2.SetXYZ(, , );

             ax3D\_door.RefDirection = model.Instances.New<IfcDirection>();  
             ax3D\_door.RefDirection.SetXYZ(,,  );//x轴  
             ax3D\_door.Axis = model.Instances.New<IfcDirection>();  
             ax3D\_door.Axis.SetXYZ(, , );//Z轴  
             ax3D\_door.Location = origin2;  
             //lp\_door.RelativePlacement = wallplace.RelativePlacement;  
             lp\_door.RelativePlacement = ax3D\_door;  
             lp\_door.PlacementRelTo =wallplace;  
             door.ObjectPlacement = lp\_door;  
             door.Representation = rep\_door;

             ////////////////////////////////////////////////////////////////////  
             var m\_OpeningEle = model.Instances.New<IfcOpeningElement>();  
             m\_OpeningEle.Name = "My Openings";  
             m\_OpeningEle.PredefinedType = IfcOpeningElementTypeEnum.OPENING;

             var rectOpening = model.Instances.New<IfcRectangleProfileDef>();  
             rectOpening.ProfileType = IfcProfileTypeEnum.AREA;  
             rectOpening.XDim = width;  
             rectOpening.YDim = length;  
             rectOpening.Position = model.Instances.New<IfcAxis2Placement2D>();  
             rectOpening.Position.Location = insertPoint;

             //模型区域实心  
             var body\_Opeinging = model.Instances.New<IfcExtrudedAreaSolid>();  
             body\_Opeinging.Depth = height;  
             body\_Opeinging.SweptArea = rectOpening;  
             body\_Opeinging.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             body\_Opeinging.ExtrudedDirection.SetXYZ(, , );  
             body\_Opeinging.Position = model.Instances.New<IfcAxis2Placement3D>();  
             body\_Opeinging.Position.Location = origin;  
             var shape\_\_Opeinging = model.Instances.New<IfcShapeRepresentation>();  
             var modelContext\_\_Opeinging = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             shape\_\_Opeinging.ContextOfItems = modelContext\_\_Opeinging;  
             shape\_\_Opeinging.RepresentationType = "SweptSolid";  
             shape\_\_Opeinging.RepresentationIdentifier = "Body";  
             shape\_\_Opeinging.Items.Add(body\_Opeinging);

             //创建产品定义并将模型几何添加到墙上  
             var rep\_Opening = model.Instances.New<IfcProductDefinitionShape>();  
             rep\_Opening.Representations.Add(shape\_\_Opeinging);  
             m\_OpeningEle.ObjectPlacement = lp\_door;  
             m\_OpeningEle.Representation = rep\_Opening;

             var m\_RelFills = model.Instances.New<IfcRelFillsElement>();  
             m\_RelFills.RelatingOpeningElement = m\_OpeningEle;  
             m\_RelFills.RelatedBuildingElement = door;  
             var voidRel = model.Instances.New<IfcRelVoidsElement>();  
             voidRel.RelatedOpeningElement = m\_OpeningEle;  
             voidRel.RelatingBuildingElement = wall;

             var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "Reference";  
                 psv.Description = "Reference";  
                 psv.NominalValue = new IfcTimeMeasure(150.0);  
                 psv.Unit = model.Instances.New<IfcSIUnit>(siu =>  
                 {  
                     siu.UnitType = IfcUnitEnum.TIMEUNIT;  
                     siu.Name = IfcSIUnitName.SECOND;  
                 });  
             });  
             //设置模型元素数量  
             var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps =>  
             {  
                 ps.Name = "Pset\_DoorCommon";  
                 ps.Description = "Property Set";  
                 ps.HasProperties.Add(ifcPropertySingleValue);

             });  
             //需建立关系  
             model.Instances.New<IfcRelDefinesByProperties>(  
                 rdbp =>  
             {  
                 rdbp.Name = "Property Association";  
                 rdbp.Description = "IfcPropertySet associated to wall";  
                 rdbp.RelatedObjects.Add(door);  
                 rdbp.RelatingPropertyDefinition = ifcPropertySet;  
             });

             txn.Commit();  
             return door;  
         }

     }  
     static private IfcWindow CreateWindow(IfcStore model, IfcWallStandardCase wall, double length, double width, double height)  
     {  
         //启动事务  
         using (var txn = model.BeginTransaction("Create Window"))  
         {  
             var rectDoor = model.Instances.New<IfcRectangleProfileDef>();  
             rectDoor.ProfileType = IfcProfileTypeEnum.CURVE;  
             rectDoor.XDim = width - ;  
             rectDoor.YDim = length;

             var insertPoint = model.Instances.New<IfcCartesianPoint>();  
             insertPoint.SetXY(, ); //在任意位置插入  
             rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>();  
             rectDoor.Position.Location = insertPoint;

             //模型区域实心  
             var body\_door = model.Instances.New<IfcExtrudedAreaSolid>();  
             body\_door.Depth = height;  
             body\_door.SweptArea = rectDoor;  
             body\_door.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             body\_door.ExtrudedDirection.SetXYZ(, , );

             var origin = model.Instances.New<IfcCartesianPoint>();  
             origin.SetXYZ(, , );  
             //在模型中插入几何参数  
             body\_door.Position = model.Instances.New<IfcAxis2Placement3D>();  
             body\_door.Position.Location = origin;

             //创建一个定义形状来保存几何  
             var shape\_door = model.Instances.New<IfcShapeRepresentation>();  
             var modelContext\_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             shape\_door.ContextOfItems = modelContext\_door;  
             shape\_door.RepresentationType = "SweptSolid";  
             shape\_door.RepresentationIdentifier = "Body";  
             shape\_door.Items.Add(body\_door);

             //创建产品定义并将模型几何添加到墙上  
             var rep\_door = model.Instances.New<IfcProductDefinitionShape>();  
             rep\_door.Representations.Add(shape\_door);

             // var door = model.Instances.New<IfcDoorStandardCase>();  
             //door.Name = "A Door";  
             //door.PredefinedType = IfcDoorTypeEnum.GATE;  
             //door.OperationType = IfcDoorTypeOperationEnum.DOUBLE\_SWING\_LEFT;  
             //door.OverallHeight = 400;  
             //door.OverallWidth = 400;  
             var door = model.Instances.New<IfcWindow>();  
             door.Name = "A Door";  
             door.PredefinedType = IfcWindowTypeEnum.WINDOW;  
             // door.OperationType = IfcDoorTypeOperationEnum.DOUBLE\_SWING\_LEFT;  
             door.OverallHeight = ;  
             door.OverallWidth = ;  
             door.PartitioningType = IfcWindowTypePartitioningEnum.SINGLE\_PANEL;

             var windowType = model.Instances.New<IfcWindowType>();  
             windowType.Name = "Window";  
             windowType.Description = "ddddd";  
             windowType.PartitioningType = IfcWindowTypePartitioningEnum.SINGLE\_PANEL;  
             var windowType\_Rel= model.Instances.New<IfcRelDefinesByType>();  
             windowType\_Rel.RelatedObjects.Add(door);  
             windowType\_Rel.RelatingType = windowType;  
             var lp\_door = model.Instances.New<IfcLocalPlacement>();  
             var wallplace = wall.ObjectPlacement;  
             var ax3D\_door = model.Instances.New<IfcAxis2Placement3D>();  
             var origin2 = model.Instances.New<IfcCartesianPoint>();  
             origin2.SetXYZ(, , );

             ax3D\_door.RefDirection = model.Instances.New<IfcDirection>();  
             ax3D\_door.RefDirection.SetXYZ(, , );//x轴  
             ax3D\_door.Axis = model.Instances.New<IfcDirection>();  
             ax3D\_door.Axis.SetXYZ(, , );//Z轴  
             ax3D\_door.Location = origin2;  
             //lp\_door.RelativePlacement = wallplace.RelativePlacement;  
             lp\_door.RelativePlacement = ax3D\_door;  
             lp\_door.PlacementRelTo = wallplace;  
             door.ObjectPlacement = lp\_door;  
             door.Representation = rep\_door;  
            // var m\_door\_style = model.Instances.New<IfcSurfaceStyle>();  
             ////////////////////////////////////////////////////////////////////  
             var m\_OpeningEle = model.Instances.New<IfcOpeningElement>();  
             m\_OpeningEle.Name = "My Openings";  
             m\_OpeningEle.PredefinedType = IfcOpeningElementTypeEnum.OPENING;

             var rectOpening = model.Instances.New<IfcRectangleProfileDef>();  
             rectOpening.ProfileType = IfcProfileTypeEnum.AREA;  
             rectOpening.XDim = width;  
             rectOpening.YDim = length;  
             rectOpening.Position = model.Instances.New<IfcAxis2Placement2D>();  
             rectOpening.Position.Location = insertPoint;

             //模型区域实心  
             var body\_Opeinging = model.Instances.New<IfcExtrudedAreaSolid>();  
             body\_Opeinging.Depth = height;  
             body\_Opeinging.SweptArea = rectOpening;  
             body\_Opeinging.ExtrudedDirection = model.Instances.New<IfcDirection>();  
             body\_Opeinging.ExtrudedDirection.SetXYZ(, , );  
             body\_Opeinging.Position = model.Instances.New<IfcAxis2Placement3D>();  
             body\_Opeinging.Position.Location = origin;  
             var shape\_\_Opeinging = model.Instances.New<IfcShapeRepresentation>();  
             var modelContext\_\_Opeinging = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault();  
             shape\_\_Opeinging.ContextOfItems = modelContext\_\_Opeinging;  
             shape\_\_Opeinging.RepresentationType = "SweptSolid";  
             shape\_\_Opeinging.RepresentationIdentifier = "Body";  
             shape\_\_Opeinging.Items.Add(body\_Opeinging);

             //创建产品定义并将模型几何添加到墙上  
             var rep\_Opening = model.Instances.New<IfcProductDefinitionShape>();  
             rep\_Opening.Representations.Add(shape\_\_Opeinging);  
             m\_OpeningEle.ObjectPlacement = lp\_door;  
             m\_OpeningEle.Representation = rep\_Opening;

             var m\_RelFills = model.Instances.New<IfcRelFillsElement>();  
             m\_RelFills.RelatingOpeningElement = m\_OpeningEle;  
             m\_RelFills.RelatedBuildingElement = door;  
             var voidRel = model.Instances.New<IfcRelVoidsElement>();  
             voidRel.RelatedOpeningElement = m\_OpeningEle;  
             voidRel.RelatingBuildingElement = wall;

             var material98 = model.Instances.New<IfcMaterial>();  
             material98.Name = "Glass";  
             var material100 = model.Instances.New<IfcMaterial>();  
             material100.Name = "Wood";

             var n\_ifcMaterialConstituentSet = model.Instances.New<IfcMaterialConstituentSet>();  
             var n\_ifcMaterialConstituent = model.Instances.New<IfcMaterialConstituent>();  
             n\_ifcMaterialConstituent.Category = "Framing";  
             n\_ifcMaterialConstituent.Material = material98;  
             var n\_ifcMaterialConstituent100 = model.Instances.New<IfcMaterialConstituent>();  
             n\_ifcMaterialConstituent100.Category = "Framing";  
             n\_ifcMaterialConstituent100.Material = material100;  
             //n\_ifcMaterialConstituent.Model = door;  
             n\_ifcMaterialConstituentSet.MaterialConstituents.Add(n\_ifcMaterialConstituent);  
             n\_ifcMaterialConstituentSet.MaterialConstituents.Add(n\_ifcMaterialConstituent100);  
             var ifcRelAssociatesMaterial = model.Instances.New<IfcRelAssociatesMaterial>();  
             ifcRelAssociatesMaterial.RelatingMaterial = n\_ifcMaterialConstituentSet;  
             ifcRelAssociatesMaterial.RelatedObjects.Add(door);

             var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "Reference";  
                 psv.Description = "Reference";  
                 psv.NominalValue = new IfcTimeMeasure(150.0);  
                 psv.Unit = model.Instances.New<IfcSIUnit>(siu =>  
                 {  
                     siu.UnitType = IfcUnitEnum.TIMEUNIT;  
                     siu.Name = IfcSIUnitName.SECOND;  
                 });  
             });  
             var ifcPropertySingleValue2 = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "FireRating";  
                 psv.Description = "";

             });  
             var ifcPropertySingleValue3 = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "AcousticRating";  
                 psv.Description = "AcousticRating";

             });  
             var ifcPropertySingleValue4 = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "IsExternal";  
                 psv.Description = "IsExternal";  
                 psv.NominalValue = new IfcBoolean(true);

             });  
             var ifcPropertySingleValue5 = model.Instances.New<IfcPropertySingleValue>(psv =>  
             {  
                 psv.Name = "Infiltration";  
                 psv.Description = "Infiltration";  
                 psv.NominalValue = new IfcReal(0.3);

             });  
             var ifcPropertySingleValue6 = model.Instances.New<IfcPropertySingleValue>(psv =>  
              {  
                  psv.Name = "ThermalTransmittance";  
                  psv.Description = "ThermalTransmittance";  
                  psv.NominalValue = new IfcReal(0.24);

              });  
             //设置模型元素数量  
             var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps =>  
             {  
                 ps.Name = "Pset\_WindowCommon";  
                 ps.Description = "Property Set";  
                 ps.HasProperties.Add(ifcPropertySingleValue);  
                 ps.HasProperties.Add(ifcPropertySingleValue2);  
                 ps.HasProperties.Add(ifcPropertySingleValue3);  
                 ps.HasProperties.Add(ifcPropertySingleValue4);  
                 ps.HasProperties.Add(ifcPropertySingleValue5);  
                 ps.HasProperties.Add(ifcPropertySingleValue6);  
             });  
             //需建立关系  
             model.Instances.New<IfcRelDefinesByProperties>(  
                 rdbp =>  
                 {  
                     rdbp.Name = "Property Association";  
                     rdbp.Description = "IfcPropertySet associated to wall";  
                     rdbp.RelatedObjects.Add(door);  
                     rdbp.RelatingPropertyDefinition = ifcPropertySet;  
                 });

             txn.Commit();  
             return door;  
         }

     }  
     /// <summary>  
     /// 给墙添加属性  
     /// </summary>  
     /// <param name="model">XbimModel</param>  
     /// <param name="wall"></param>  
     static private void AddPropertiesToWall(IfcStore model, IfcWallStandardCase wall)  
     {  
         using (var txn = model.BeginTransaction("Create Wall"))  
         {  
             CreateElementQuantity(model, wall);  
             CreateSimpleProperty(model, wall);  
             txn.Commit();  
         }  
     }

     private static void CreateSimpleProperty(IfcStore model, IfcWallStandardCase wall)  
     {  
         var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv =>  
         {  
             psv.Name = "IfcPropertySingleValue:Time";  
             psv.Description = "";  
             psv.NominalValue = new IfcTimeMeasure(150.0);  
             psv.Unit = model.Instances.New<IfcSIUnit>(siu =>  
             {  
                 siu.UnitType = IfcUnitEnum.TIMEUNIT;  
                 siu.Name = IfcSIUnitName.SECOND;  
             });  
         });  
         var ifcPropertyEnumeratedValue = model.Instances.New<IfcPropertyEnumeratedValue>(pev =>  
         {  
             pev.Name = "IfcPropertyEnumeratedValue:Music";  
             pev.EnumerationReference = model.Instances.New<IfcPropertyEnumeration>(pe =>  
                 {  
                     pe.Name = "Notes";  
                     pe.EnumerationValues.Add(new IfcLabel("Do"));  
                     pe.EnumerationValues.Add(new IfcLabel("Re"));  
                     pe.EnumerationValues.Add(new IfcLabel("Mi"));  
                     pe.EnumerationValues.Add(new IfcLabel("Fa"));  
                     pe.EnumerationValues.Add(new IfcLabel("So"));  
                     pe.EnumerationValues.Add(new IfcLabel("La"));  
                     pe.EnumerationValues.Add(new IfcLabel("Ti"));  
                 });  
             pev.EnumerationValues.Add(new IfcLabel("Do"));  
             pev.EnumerationValues.Add(new IfcLabel("Re"));  
             pev.EnumerationValues.Add(new IfcLabel("Mi"));

         });  
         var ifcPropertyBoundedValue = model.Instances.New<IfcPropertyBoundedValue>(pbv =>  
         {  
             pbv.Name = "IfcPropertyBoundedValue:Mass";  
             pbv.Description = "";  
             pbv.UpperBoundValue = new IfcMassMeasure(5000.0);  
             pbv.LowerBoundValue = new IfcMassMeasure(1000.0);  
             pbv.Unit = model.Instances.New<IfcSIUnit>(siu =>  
             {  
                 siu.UnitType = IfcUnitEnum.MASSUNIT;  
                 siu.Name = IfcSIUnitName.GRAM;  
                 siu.Prefix = IfcSIPrefix.KILO;  
             });  
         });

         var definingValues = new List<IfcReal> { new IfcReal(100.0), new IfcReal(200.0), new IfcReal(400.0), new IfcReal(800.0), new IfcReal(1600.0), new IfcReal(3200.0), };  
         var definedValues = new List<IfcReal> { new IfcReal(20.0), new IfcReal(42.0), new IfcReal(46.0), new IfcReal(56.0), new IfcReal(60.0), new IfcReal(65.0), };  
         var ifcPropertyTableValue = model.Instances.New<IfcPropertyTableValue>(ptv =>  
         {  
             ptv.Name = "IfcPropertyTableValue:Sound";  
             foreach (var item in definingValues)  
             {  
                 ptv.DefiningValues.Add(item);  
             }  
             foreach (var item in definedValues)  
             {  
                 ptv.DefinedValues.Add(item);  
             }  
             ptv.DefinedUnit = model.Instances.New<IfcContextDependentUnit>(cd =>  
             {  
                 cd.Dimensions = model.Instances.New<IfcDimensionalExponents>(de =>  
                 {  
                     de.LengthExponent = ;  
                     de.MassExponent = ;  
                     de.TimeExponent = ;  
                     de.ElectricCurrentExponent = ;  
                     de.ThermodynamicTemperatureExponent = ;  
                     de.AmountOfSubstanceExponent = ;  
                     de.LuminousIntensityExponent = ;  
                 });  
                 cd.UnitType = IfcUnitEnum.FREQUENCYUNIT;  
                 cd.Name = "dB";  
             });

         });

         var listValues = new List<IfcLabel> { new IfcLabel("Red"), new IfcLabel("Green"), new IfcLabel("Blue"), new IfcLabel("Pink"), new IfcLabel("White"), new IfcLabel("Black"), };  
         var ifcPropertyListValue = model.Instances.New<IfcPropertyListValue>(plv =>  
         {  
             plv.Name = "IfcPropertyListValue:Colours";  
             foreach (var item in listValues)  
             {  
                 plv.ListValues.Add(item);  
             }  
         });

         var ifcMaterial = model.Instances.New<IfcMaterial>(m =>  
         {  
             m.Name = "Brick";  
         });  
         var ifcPrValueMaterial = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:Material";  
             prv.PropertyReference = ifcMaterial;  
         });

         var ifcMaterialList = model.Instances.New<IfcMaterialList>(ml =>  
             {  
                 ml.Materials.Add(ifcMaterial);  
                 ml.Materials.Add(model.Instances.New<IfcMaterial>(m =>{m.Name = "Cavity";}));  
                 ml.Materials.Add(model.Instances.New<IfcMaterial>(m => { m.Name = "Block"; }));  
             });

         var ifcMaterialLayer = model.Instances.New<IfcMaterialLayer>(ml =>  
         {  
             ml.Material = ifcMaterial;  
             ml.LayerThickness = 100.0;  
         });  
         var ifcPrValueMatLayer = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:MaterialLayer";  
             prv.PropertyReference = ifcMaterialLayer;  
         });

         var ifcDocumentReference = model.Instances.New<IfcDocumentReference>(dr =>  
         {  
             dr.Name = "Document";  
             dr.Location = "c://Documents//TheDoc.Txt";  
         });  
         var ifcPrValueRef = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:Document";  
             prv.PropertyReference = ifcDocumentReference;  
         });

         var ifcTimeSeries = model.Instances.New<IfcRegularTimeSeries>(ts =>  
         {  
             ts.Name = "Regular Time Series";  
             ts.Description = "Time series of events";  
             ts.StartTime = new IfcDateTime("2015-02-14T12:01:01");  
             ts.EndTime = new IfcDateTime("2015-05-15T12:01:01");  
             ts.TimeSeriesDataType = IfcTimeSeriesDataTypeEnum.CONTINUOUS;  
             ts.DataOrigin = IfcDataOriginEnum.MEASURED;  
             ts.TimeStep = ; //7 days in secs  
         });

         var ifcPrValueTimeSeries = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:TimeSeries";  
             prv.PropertyReference = ifcTimeSeries;  
         });

         var ifcAddress = model.Instances.New<IfcPostalAddress>(a =>  
         {  
             a.InternalLocation = "Room 101";  
             a.AddressLines.AddRange(new\[\] { new IfcLabel("12 New road"), new IfcLabel("DoxField" ) });  
             a.Town = "Sunderland";  
             a.PostalCode = "DL01 6SX";  
         });  
         var ifcPrValueAddress = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:Address";  
             prv.PropertyReference = ifcAddress;  
         });  
         var ifcTelecomAddress = model.Instances.New<IfcTelecomAddress>(a =>  
         {  
             a.TelephoneNumbers.Add(new IfcLabel("01325 6589965"));  
             a.ElectronicMailAddresses.Add(new IfcLabel("bob@bobsworks.com"));  
         });  
         var ifcPrValueTelecom = model.Instances.New<IfcPropertyReferenceValue>(prv =>  
         {  
             prv.Name = "IfcPropertyReferenceValue:Telecom";  
             prv.PropertyReference = ifcTelecomAddress;  
         });

         //设置模型元素数量  
         var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps =>  
         {  
             ps.Name = "Test:IfcPropertySet";  
             ps.Description = "Property Set";  
             ps.HasProperties.Add(ifcPropertySingleValue);  
             ps.HasProperties.Add(ifcPropertyEnumeratedValue);  
             ps.HasProperties.Add(ifcPropertyBoundedValue);  
             ps.HasProperties.Add(ifcPropertyTableValue);  
             ps.HasProperties.Add(ifcPropertyListValue);  
             ps.HasProperties.Add(ifcPrValueMaterial);  
             ps.HasProperties.Add(ifcPrValueMatLayer);  
             ps.HasProperties.Add(ifcPrValueRef);  
             ps.HasProperties.Add(ifcPrValueTimeSeries);  
             ps.HasProperties.Add(ifcPrValueAddress);  
             ps.HasProperties.Add(ifcPrValueTelecom);  
         });

         //需建立关系  
         model.Instances.New<IfcRelDefinesByProperties>(rdbp =>  
         {  
             rdbp.Name = "Property Association";  
             rdbp.Description = "IfcPropertySet associated to wall";  
             rdbp.RelatedObjects.Add(wall);  
             rdbp.RelatingPropertyDefinition = ifcPropertySet;  
         });  
     }

     private static void CreateElementQuantity(IfcStore model, IfcWallStandardCase wall)  
     {  
         //创建模型元素数量  
         //首先我们需模型简单物理量,首先将使用模型量长度  
         var ifcQuantityArea = model.Instances.New<IfcQuantityLength>(qa =>  
         {  
             qa.Name = "IfcQuantityArea:Area";  
             qa.Description = "";  
             qa.Unit = model.Instances.New<IfcSIUnit>(siu =>  
             {  
                 siu.UnitType = IfcUnitEnum.LENGTHUNIT;  
                 siu.Prefix = IfcSIPrefix.MILLI;  
                 siu.Name = IfcSIUnitName.METRE;  
             });  
             qa.LengthValue = 100.0;

         });  
         //上下文相关单元的数量计数  
         var ifcContextDependentUnit = model.Instances.New<IfcContextDependentUnit>(cd =>  
             {  
                 cd.Dimensions = model.Instances.New<IfcDimensionalExponents>(de =>  
                     {  
                         de.LengthExponent = ;  
                         de.MassExponent = ;  
                         de.TimeExponent = ;  
                         de.ElectricCurrentExponent = ;  
                         de.ThermodynamicTemperatureExponent = ;  
                         de.AmountOfSubstanceExponent = ;  
                         de.LuminousIntensityExponent = ;  
                     });  
                 cd.UnitType = IfcUnitEnum.LENGTHUNIT;  
                 cd.Name = "Elephants";  
             });  
             var ifcQuantityCount = model.Instances.New<IfcQuantityCount>(qc =>  
             {  
                 qc.Name = "IfcQuantityCount:Elephant";  
                 qc.CountValue = ;  
                 qc.Unit = ifcContextDependentUnit;  
             });

          //使用转换单位  
         var ifcConversionBasedUnit = model.Instances.New<IfcConversionBasedUnit>(cbu =>  
         {  
             cbu.ConversionFactor = model.Instances.New<IfcMeasureWithUnit>(mu =>  
             {  
                 mu.ValueComponent = new IfcRatioMeasure(25.4);  
                 mu.UnitComponent = model.Instances.New<IfcSIUnit>(siu =>  
                 {  
                     siu.UnitType = IfcUnitEnum.LENGTHUNIT;  
                     siu.Prefix = IfcSIPrefix.MILLI;  
                     siu.Name = IfcSIUnitName.METRE;  
                 });

             });  
             cbu.Dimensions = model.Instances.New<IfcDimensionalExponents>(de =>  
             {  
                 de.LengthExponent = ;  
                 de.MassExponent = ;  
                 de.TimeExponent = ;  
                 de.ElectricCurrentExponent = ;  
                 de.ThermodynamicTemperatureExponent = ;  
                 de.AmountOfSubstanceExponent = ;  
                 de.LuminousIntensityExponent = ;  
             });  
             cbu.UnitType = IfcUnitEnum.LENGTHUNIT;  
             cbu.Name = "Inch";  
         });  
         var ifcQuantityLength = model.Instances.New<IfcQuantityLength>(qa =>  
         {  
             qa.Name = "IfcQuantityLength:Length";  
             qa.Description = "";  
             qa.Unit = ifcConversionBasedUnit;  
             qa.LengthValue = 24.0;  
         });

         //lets create the IfcElementQuantity  
         var ifcElementQuantity = model.Instances.New<IfcElementQuantity>(eq =>  
         {  
             eq.Name = "Test:IfcElementQuantity";  
             eq.Description = "Measurement quantity";  
             eq.Quantities.Add(ifcQuantityArea);  
             eq.Quantities.Add(ifcQuantityCount);  
             eq.Quantities.Add(ifcQuantityLength);  
         });

         //下步 建议关系  
         model.Instances.New<IfcRelDefinesByProperties>(rdbp =>  
         {  
             rdbp.Name = "Area Association";  
             rdbp.Description = "IfcElementQuantity associated to wall";  
             rdbp.RelatedObjects.Add(wall);  
             rdbp.RelatingPropertyDefinition = ifcElementQuantity;  
         });  
     }

 }

Code

这个代码是有bug的,目前已经解决!

参考资料:

IFC4国内说明文档:http://www.vfkjsd.cn/ifc/ifc4/index.htm

IFC4官方说明文档:http://www.buildingsmart-tech.org/ifc/IFC4/final/html/link/ifcarbitraryclosedprofiledef.htm

xBIM 应用与学习https://www.cnblogs.com/w2011/p/8407286.html

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章