研究了两天,终于实现了利用xBIM自动输出墙和门窗
比较粗糙的源码如下:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //first create and initialise a model called Hello Wall 4 Console.WriteLine("Initialising the IFC Project...."); 5 using (var model = CreateandInitModel("HelloWall")) 6 { 7 if (model != null) 8 { 9 IfcBuilding building = CreateBuilding(model, "Default Building"); 10 IfcWallStandardCase wall = CreateWall(model, 4000, 300, 2400); 11 IfcDoor door = CreateDoor(model, wall, 1000, 300, 2200); 12 IfcWindow widnow = CreateWindow(model, wall, 1000, 300, 1000); 13 if (wall != null) AddPropertiesToWall(model, wall); 14 using (var txn = model.BeginTransaction("Add Wall")) 15 { 16 building.AddElement(wall); 17 building.AddElement(door); 18 building.AddElement(widnow); 19 txn.Commit(); 20 } 21 22 if (wall != null) 23 { 24 try 25 { 26 Console.WriteLine("Standard Wall successfully created...."); 27 //保存到文件 28 model.SaveAs("HelloWallIfc4.ifc", IfcStorageType.Ifc); 29 Console.WriteLine("HelloWallIfc4.ifc has been successfully written"); 30 } 31 catch (Exception ex) 32 { 33 Console.WriteLine("Failed to save HelloWall.ifc"); 34 Console.WriteLine(ex.Message); 35 } 36 } 37 } 38 else 39 { 40 Console.WriteLine("Failed to initialise the model"); 41 } 42 } 43 Console.WriteLine("Press any key to exit to view the IFC file...."); 44 Console.ReadKey(); 45 // LaunchNotepad("HelloWallIfc4.ifc"); 46 } 47 // private static void LaunchNotepad(string fileName) 48 //{ 49 // Process p; 50 // try 51 // { 52 53 // p = new Process {StartInfo = {FileName = fileName, CreateNoWindow = false}}; 54 // p.Start(); 55 // } 56 // catch (Exception ex) 57 // { 58 // Console.WriteLine("Exception Occurred :{0},{1}", 59 // ex.Message, ex.StackTrace); 60 // } 61 //} 62 63 private static IfcBuilding CreateBuilding(IfcStore model, string name) 64 { 65 //启动事务 66 using (var txn = model.BeginTransaction("Create Building")) 67 { 68 var building = model.Instances.New<IfcBuilding>(); 69 building.Name = name; 70 71 building.CompositionType = IfcElementCompositionEnum.ELEMENT; 72 var localPlacement = model.Instances.New<IfcLocalPlacement>(); 73 building.ObjectPlacement = localPlacement; 74 var placement = model.Instances.New<IfcAxis2Placement3D>(); 75 localPlacement.RelativePlacement = placement; 76 placement.Location = model.Instances.New<IfcCartesianPoint>(p=>p.SetXYZ(0,0,0)); 77 //获取项目 78 var project = model.Instances.OfType<IfcProject>().FirstOrDefault(); 79 project.AddBuilding(building); 80 txn.Commit(); 81 return building; 82 } 83 } 84 85 86 87 /// <summary> 88 /// 设置模型的基本参数、单元、所有权等 89 /// </summary> 90 /// <param name="projectName">项目名称</param> 91 /// <returns></returns> 92 private static IfcStore CreateandInitModel(string projectName) 93 { 94 //首先我们需要为模型创建凭证、这个在之前的文章都有解释 95 var credentials = new XbimEditorCredentials 96 { 97 ApplicationDevelopersName = "xBimTeam", 98 ApplicationFullName = "Hello Wall Application", 99 ApplicationIdentifier = "HelloWall.exe", 100 ApplicationVersion = "1.0", 101 EditorsFamilyName = "Team", 102 EditorsGivenName = "xBIM", 103 EditorsOrganisationName = "xBimTeam" 104 }; 105 //那么先创建 IfcStore,IfcStore 是IFC4 格式存放在内存中而不是数据库 106 //如果模型大于50MB的Ifc或者需要强大的事务处理,数据库在性能方面通常会更好 107 108 var model = IfcStore.Create(credentials, IfcSchemaVersion.Ifc4,XbimStoreType.InMemoryModel); 109 // 启动事务、将所有的模型更改为 ACID 110 using (var txn = model.BeginTransaction("Initialise Model")) 111 { 112 113 //常见项目信息 114 var project = model.Instances.New<IfcProject>(); 115 //设置单位 这里是英制 116 project.Initialize(ProjectUnits.SIUnitsUK); 117 project.Name = projectName; 118 119 //提交修改 120 txn.Commit(); 121 } 122 return model; 123 124 } 125 126 /// <summary> 127 /// 创建墙 128 /// </summary> 129 /// <param name="model"></param> 130 /// <param name="length">矩形的长度 </param> 131 /// <param name="width">矩形占地面积的宽度(墙的宽度)</param> 132 /// <param name="height">墙高度</param> 133 /// <returns></returns> 134 static private IfcWallStandardCase CreateWall(IfcStore model, double length, double width, double height) 135 { 136 137 //启动事务 138 using (var txn = model.BeginTransaction("Create Wall")) 139 { 140 var wall = model.Instances.New<IfcWallStandardCase>(); 141 wall.Name = "A Standard rectangular wall"; 142 143 144 145 // 墙的矩形剖面 146 //var rectProf = model.Instances.New<IfcRectangleProfileDef>(); 147 //rectProf.ProfileType = IfcProfileTypeEnum.AREA; 148 //rectProf.XDim = width; 149 //rectProf.YDim = length; 150 151 //var insertPoint = model.Instances.New<IfcCartesianPoint>(); 152 //insertPoint.SetXY(0, 400); //在任意位置插入 153 //rectProf.Position = model.Instances.New<IfcAxis2Placement2D>(); 154 //rectProf.Position.Location = insertPoint; 155 156 //var curve=model.Instances.New<IfcCurve>(); 157 IfcPolyline curve = model.Instances.New<IfcPolyline>(); 158 var pt0 = model.Instances.New<IfcCartesianPoint>(); 159 pt0.SetXY(0, 0); //在任意位置插入 160 var pt1 = model.Instances.New<IfcCartesianPoint>(); 161 pt1.SetXY(0, length / 2); //在任意位置插入 162 var pt2 = model.Instances.New<IfcCartesianPoint>(); 163 pt2.SetXY(0, length); //在任意位置插入 164 curve.Points.Add(pt0); 165 curve.Points.Add(pt1); 166 curve.Points.Add(pt2); 167 168 var rectProf = model.Instances.New<IfcCenterLineProfileDef>(); 169 rectProf.ProfileType = IfcProfileTypeEnum.AREA; 170 rectProf.Thickness = width; 171 rectProf.Curve = curve; 172 173 //模型区域实心 174 var body = model.Instances.New<IfcExtrudedAreaSolid>(); 175 body.Depth = height; 176 body.SweptArea = rectProf; 177 body.ExtrudedDirection = model.Instances.New<IfcDirection>(); 178 body.ExtrudedDirection.SetXYZ(0, 0, 1); 179 180 //在模型中插入几何参数 181 var origin = model.Instances.New<IfcCartesianPoint>(); 182 origin.SetXYZ(0, 0, 0); 183 body.Position = model.Instances.New<IfcAxis2Placement3D>(); 184 body.Position.Location = origin; 185 186 //创建一个定义形状来保存几何 187 var shape = model.Instances.New<IfcShapeRepresentation>(); 188 var modelContext = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 189 shape.ContextOfItems = modelContext; 190 shape.RepresentationType = "SweptSolid"; 191 shape.RepresentationIdentifier = "Body"; 192 shape.Items.Add(body); 193 194 //创建产品定义并将模型几何添加到墙上 195 var rep = model.Instances.New<IfcProductDefinitionShape>(); 196 rep.Representations.Add(shape); 197 wall.Representation = rep; 198 199 //把墙放到模型中 200 var lp = model.Instances.New<IfcLocalPlacement>(); 201 var ax3D = model.Instances.New<IfcAxis2Placement3D>(); 202 ax3D.Location = origin; 203 ax3D.RefDirection = model.Instances.New<IfcDirection>(); 204 ax3D.RefDirection.SetXYZ(0, 1, 0); 205 ax3D.Axis = model.Instances.New<IfcDirection>(); 206 ax3D.Axis.SetXYZ(0, 0, 1); 207 lp.RelativePlacement = ax3D; 208 wall.ObjectPlacement = lp; 209 210 //Where子句:IfcWallStandard依赖于提供一个IfcMaterialLayerSetUsage 211 var ifcMaterialLayerSetUsage = model.Instances.New<IfcMaterialLayerSetUsage>(); 212 var ifcMaterialLayerSet = model.Instances.New<IfcMaterialLayerSet>(); 213 var ifcMaterialLayer = model.Instances.New<IfcMaterialLayer>(); 214 ifcMaterialLayer.LayerThickness = 10; 215 ifcMaterialLayerSet.MaterialLayers.Add(ifcMaterialLayer); 216 ifcMaterialLayerSetUsage.ForLayerSet = ifcMaterialLayerSet; 217 ifcMaterialLayerSetUsage.LayerSetDirection = IfcLayerSetDirectionEnum.AXIS2; 218 ifcMaterialLayerSetUsage.DirectionSense = IfcDirectionSenseEnum.NEGATIVE; 219 ifcMaterialLayerSetUsage.OffsetFromReferenceLine = 150; 220 221 //添加材料到墙上 222 var material = model.Instances.New<IfcMaterial>(); 223 material.Name = "some material"; 224 var ifcRelAssociatesMaterial = model.Instances.New<IfcRelAssociatesMaterial>(); 225 ifcRelAssociatesMaterial.RelatingMaterial = material; 226 ifcRelAssociatesMaterial.RelatedObjects.Add(wall); 227 228 ifcRelAssociatesMaterial.RelatingMaterial = ifcMaterialLayerSetUsage; 229 230 //IfcPresentationLayerAssignment对于IfcWall或IfcWallStandardCase中的CAD演示是必需的 231 var ifcPresentationLayerAssignment = model.Instances.New<IfcPresentationLayerAssignment>(); 232 ifcPresentationLayerAssignment.Name = "some ifcPresentationLayerAssignment"; 233 ifcPresentationLayerAssignment.AssignedItems.Add(shape); 234 // 如果IfcPolyline具有两个点,则对于IfcWall是必需的 235 var ifcPolyline = model.Instances.New<IfcPolyline>(); 236 var startPoint = model.Instances.New<IfcCartesianPoint>(); 237 startPoint.SetXY(0, 0); 238 var endPoint = model.Instances.New<IfcCartesianPoint>(); 239 endPoint.SetXY(4000, 0); 240 ifcPolyline.Points.Add(startPoint); 241 ifcPolyline.Points.Add(endPoint); 242 243 var shape2D = model.Instances.New<IfcShapeRepresentation>(); 244 shape2D.ContextOfItems = modelContext; 245 shape2D.RepresentationIdentifier = "Axis"; 246 shape2D.RepresentationType = "Curve2D"; 247 shape2D.Items.Add(ifcPolyline); 248 rep.Representations.Add(shape2D); 249 250 251 //var rectDoor = model.Instances.New<IfcRectangleProfileDef>(); 252 //rectDoor.ProfileType = IfcProfileTypeEnum.AREA; 253 //rectDoor.XDim = width; 254 //rectDoor.YDim = length; 255 256 //var insertPoint = model.Instances.New<IfcCartesianPoint>(); 257 //insertPoint.SetXY(0, 400); //在任意位置插入 258 //rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>(); 259 //rectDoor.Position.Location = insertPoint; 260 ////模型区域实心 261 //var body_door = model.Instances.New<IfcExtrudedAreaSolid>(); 262 //body_door.Depth = height; 263 //body_door.SweptArea = rectDoor; 264 //body_door.ExtrudedDirection = model.Instances.New<IfcDirection>(); 265 //body_door.ExtrudedDirection.SetXYZ(0, 0, 1); 266 267 ////在模型中插入几何参数 268 //body_door.Position = model.Instances.New<IfcAxis2Placement3D>(); 269 //body_door.Position.Location = origin; 270 271 ////创建一个定义形状来保存几何 272 //var shape_door = model.Instances.New<IfcShapeRepresentation>(); 273 //var modelContext_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 274 //shape_door.ContextOfItems = modelContext_door; 275 //shape_door.RepresentationType = "SweptSolid"; 276 //shape_door.RepresentationIdentifier = "Body"; 277 //shape_door.Items.Add(body_door); 278 279 ////创建产品定义并将模型几何添加到墙上 280 //var rep_door = model.Instances.New<IfcProductDefinitionShape>(); 281 //rep_door.Representations.Add(shape_door); 282 283 //var door = model.Instances.New<IfcDoor>(); 284 //door.Name = "A Door"; 285 //var lp_door = model.Instances.New<IfcLocalPlacement>(); 286 //var ax3D_door = model.Instances.New<IfcAxis2Placement3D>(); 287 //ax3D_door.Location = origin; 288 //ax3D_door.RefDirection = model.Instances.New<IfcDirection>(); 289 //ax3D_door.RefDirection.SetXYZ(0, 1, 0); 290 //ax3D_door.Axis = model.Instances.New<IfcDirection>(); 291 //ax3D_door.Axis.SetXYZ(0, 0, 1); 292 //lp_door.RelativePlacement = ax3D_door; 293 //door.ObjectPlacement = lp_door; 294 //door.Representation = rep_door; 295 //var m_OpeningEle = model.Instances.New<IfcOpeningElement>(); 296 //m_OpeningEle.Name = "Openings"; 297 298 //var m_RelFills = model.Instances.New<IfcRelFillsElement>(); 299 //m_RelFills.RelatingOpeningElement = m_OpeningEle; 300 //m_RelFills.RelatedBuildingElement = door; 301 //var voidRel = model.Instances.New<IfcRelVoidsElement>(); 302 //voidRel.RelatedOpeningElement = m_OpeningEle; 303 //voidRel.RelatingBuildingElement = wall; 304 305 txn.Commit(); 306 return wall; 307 } 308 309 } 310 static private IfcDoor CreateDoor(IfcStore model, IfcWallStandardCase wall, double length, double width, double height) 311 { 312 //启动事务 313 using (var txn = model.BeginTransaction("Create Door")) 314 { 315 var rectDoor = model.Instances.New<IfcRectangleProfileDef>(); 316 rectDoor.ProfileType = IfcProfileTypeEnum.AREA; 317 rectDoor.XDim = width-100; 318 rectDoor.YDim = length; 319 320 var insertPoint = model.Instances.New<IfcCartesianPoint>(); 321 insertPoint.SetXY(0, 0); //在任意位置插入 322 rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>(); 323 rectDoor.Position.Location = insertPoint; 324 325 //模型区域实心 326 var body_door = model.Instances.New<IfcExtrudedAreaSolid>(); 327 body_door.Depth = height; 328 body_door.SweptArea = rectDoor; 329 body_door.ExtrudedDirection = model.Instances.New<IfcDirection>(); 330 body_door.ExtrudedDirection.SetXYZ(0, 0, 1); 331 332 var origin = model.Instances.New<IfcCartesianPoint>(); 333 origin.SetXYZ(0, 0, 0); 334 //在模型中插入几何参数 335 body_door.Position = model.Instances.New<IfcAxis2Placement3D>(); 336 body_door.Position.Location = origin; 337 338 //创建一个定义形状来保存几何 339 var shape_door = model.Instances.New<IfcShapeRepresentation>(); 340 var modelContext_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 341 shape_door.ContextOfItems = modelContext_door; 342 shape_door.RepresentationType = "SweptSolid"; 343 shape_door.RepresentationIdentifier = "Body"; 344 shape_door.Items.Add(body_door); 345 346 //创建产品定义并将模型几何添加到墙上 347 var rep_door = model.Instances.New<IfcProductDefinitionShape>(); 348 rep_door.Representations.Add(shape_door); 349 350 var door = model.Instances.New<IfcDoor>(); 351 door.Name = "A Door"; 352 door.PredefinedType = IfcDoorTypeEnum.GATE; 353 door.OperationType = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT; 354 door.OverallHeight = 400; 355 door.OverallWidth = 400; 356 357 358 var lp_door = model.Instances.New<IfcLocalPlacement>(); 359 var wallplace = wall.ObjectPlacement; 360 var ax3D_door = model.Instances.New<IfcAxis2Placement3D>(); 361 var origin2 = model.Instances.New<IfcCartesianPoint>(); 362 origin2.SetXYZ(0, 1500, 10); 363 364 ax3D_door.RefDirection = model.Instances.New<IfcDirection>(); 365 ax3D_door.RefDirection.SetXYZ(1,0, 0);//x轴 366 ax3D_door.Axis = model.Instances.New<IfcDirection>(); 367 ax3D_door.Axis.SetXYZ(0, 0, 1);//Z轴 368 ax3D_door.Location = origin2; 369 //lp_door.RelativePlacement = wallplace.RelativePlacement; 370 lp_door.RelativePlacement = ax3D_door; 371 lp_door.PlacementRelTo =wallplace; 372 door.ObjectPlacement = lp_door; 373 door.Representation = rep_door; 374 375 //////////////////////////////////////////////////////////////////// 376 var m_OpeningEle = model.Instances.New<IfcOpeningElement>(); 377 m_OpeningEle.Name = "My Openings"; 378 m_OpeningEle.PredefinedType = IfcOpeningElementTypeEnum.OPENING; 379 380 var rectOpening = model.Instances.New<IfcRectangleProfileDef>(); 381 rectOpening.ProfileType = IfcProfileTypeEnum.AREA; 382 rectOpening.XDim = width; 383 rectOpening.YDim = length; 384 rectOpening.Position = model.Instances.New<IfcAxis2Placement2D>(); 385 rectOpening.Position.Location = insertPoint; 386 387 //模型区域实心 388 var body_Opeinging = model.Instances.New<IfcExtrudedAreaSolid>(); 389 body_Opeinging.Depth = height; 390 body_Opeinging.SweptArea = rectOpening; 391 body_Opeinging.ExtrudedDirection = model.Instances.New<IfcDirection>(); 392 body_Opeinging.ExtrudedDirection.SetXYZ(0, 0, 1); 393 body_Opeinging.Position = model.Instances.New<IfcAxis2Placement3D>(); 394 body_Opeinging.Position.Location = origin; 395 var shape__Opeinging = model.Instances.New<IfcShapeRepresentation>(); 396 var modelContext__Opeinging = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 397 shape__Opeinging.ContextOfItems = modelContext__Opeinging; 398 shape__Opeinging.RepresentationType = "SweptSolid"; 399 shape__Opeinging.RepresentationIdentifier = "Body"; 400 shape__Opeinging.Items.Add(body_Opeinging); 401 402 //创建产品定义并将模型几何添加到墙上 403 var rep_Opening = model.Instances.New<IfcProductDefinitionShape>(); 404 rep_Opening.Representations.Add(shape__Opeinging); 405 m_OpeningEle.ObjectPlacement = lp_door; 406 m_OpeningEle.Representation = rep_Opening; 407 408 var m_RelFills = model.Instances.New<IfcRelFillsElement>(); 409 m_RelFills.RelatingOpeningElement = m_OpeningEle; 410 m_RelFills.RelatedBuildingElement = door; 411 var voidRel = model.Instances.New<IfcRelVoidsElement>(); 412 voidRel.RelatedOpeningElement = m_OpeningEle; 413 voidRel.RelatingBuildingElement = wall; 414 415 416 var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv => 417 { 418 psv.Name = "Reference"; 419 psv.Description = "Reference"; 420 psv.NominalValue = new IfcTimeMeasure(150.0); 421 psv.Unit = model.Instances.New<IfcSIUnit>(siu => 422 { 423 siu.UnitType = IfcUnitEnum.TIMEUNIT; 424 siu.Name = IfcSIUnitName.SECOND; 425 }); 426 }); 427 //设置模型元素数量 428 var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps => 429 { 430 ps.Name = "Pset_DoorCommon"; 431 ps.Description = "Property Set"; 432 ps.HasProperties.Add(ifcPropertySingleValue); 433 434 }); 435 //需建立关系 436 model.Instances.New<IfcRelDefinesByProperties>( 437 rdbp => 438 { 439 rdbp.Name = "Property Association"; 440 rdbp.Description = "IfcPropertySet associated to wall"; 441 rdbp.RelatedObjects.Add(door); 442 rdbp.RelatingPropertyDefinition = ifcPropertySet; 443 }); 444 445 txn.Commit(); 446 return door; 447 } 448 449 } 450 static private IfcWindow CreateWindow(IfcStore model, IfcWallStandardCase wall, double length, double width, double height) 451 { 452 //启动事务 453 using (var txn = model.BeginTransaction("Create Window")) 454 { 455 var rectDoor = model.Instances.New<IfcRectangleProfileDef>(); 456 rectDoor.ProfileType = IfcProfileTypeEnum.CURVE; 457 rectDoor.XDim = width - 100; 458 rectDoor.YDim = length; 459 460 var insertPoint = model.Instances.New<IfcCartesianPoint>(); 461 insertPoint.SetXY(0, 0); //在任意位置插入 462 rectDoor.Position = model.Instances.New<IfcAxis2Placement2D>(); 463 rectDoor.Position.Location = insertPoint; 464 465 //模型区域实心 466 var body_door = model.Instances.New<IfcExtrudedAreaSolid>(); 467 body_door.Depth = height; 468 body_door.SweptArea = rectDoor; 469 body_door.ExtrudedDirection = model.Instances.New<IfcDirection>(); 470 body_door.ExtrudedDirection.SetXYZ(0, 0, 1); 471 472 var origin = model.Instances.New<IfcCartesianPoint>(); 473 origin.SetXYZ(0, 0, 0); 474 //在模型中插入几何参数 475 body_door.Position = model.Instances.New<IfcAxis2Placement3D>(); 476 body_door.Position.Location = origin; 477 478 //创建一个定义形状来保存几何 479 var shape_door = model.Instances.New<IfcShapeRepresentation>(); 480 var modelContext_door = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 481 shape_door.ContextOfItems = modelContext_door; 482 shape_door.RepresentationType = "SweptSolid"; 483 shape_door.RepresentationIdentifier = "Body"; 484 shape_door.Items.Add(body_door); 485 486 //创建产品定义并将模型几何添加到墙上 487 var rep_door = model.Instances.New<IfcProductDefinitionShape>(); 488 rep_door.Representations.Add(shape_door); 489 490 // var door = model.Instances.New<IfcDoorStandardCase>(); 491 //door.Name = "A Door"; 492 //door.PredefinedType = IfcDoorTypeEnum.GATE; 493 //door.OperationType = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT; 494 //door.OverallHeight = 400; 495 //door.OverallWidth = 400; 496 var door = model.Instances.New<IfcWindow>(); 497 door.Name = "A Door"; 498 door.PredefinedType = IfcWindowTypeEnum.WINDOW; 499 // door.OperationType = IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT; 500 door.OverallHeight = 400; 501 door.OverallWidth = 400; 502 door.PartitioningType = IfcWindowTypePartitioningEnum.SINGLE_PANEL; 503 504 var windowType = model.Instances.New<IfcWindowType>(); 505 windowType.Name = "Window"; 506 windowType.Description = "ddddd"; 507 windowType.PartitioningType = IfcWindowTypePartitioningEnum.SINGLE_PANEL; 508 var windowType_Rel= model.Instances.New<IfcRelDefinesByType>(); 509 windowType_Rel.RelatedObjects.Add(door); 510 windowType_Rel.RelatingType = windowType; 511 var lp_door = model.Instances.New<IfcLocalPlacement>(); 512 var wallplace = wall.ObjectPlacement; 513 var ax3D_door = model.Instances.New<IfcAxis2Placement3D>(); 514 var origin2 = model.Instances.New<IfcCartesianPoint>(); 515 origin2.SetXYZ(0, 3000, 1000); 516 517 ax3D_door.RefDirection = model.Instances.New<IfcDirection>(); 518 ax3D_door.RefDirection.SetXYZ(1, 0, 0);//x轴 519 ax3D_door.Axis = model.Instances.New<IfcDirection>(); 520 ax3D_door.Axis.SetXYZ(0, 0, 1);//Z轴 521 ax3D_door.Location = origin2; 522 //lp_door.RelativePlacement = wallplace.RelativePlacement; 523 lp_door.RelativePlacement = ax3D_door; 524 lp_door.PlacementRelTo = wallplace; 525 door.ObjectPlacement = lp_door; 526 door.Representation = rep_door; 527 // var m_door_style = model.Instances.New<IfcSurfaceStyle>(); 528 //////////////////////////////////////////////////////////////////// 529 var m_OpeningEle = model.Instances.New<IfcOpeningElement>(); 530 m_OpeningEle.Name = "My Openings"; 531 m_OpeningEle.PredefinedType = IfcOpeningElementTypeEnum.OPENING; 532 533 var rectOpening = model.Instances.New<IfcRectangleProfileDef>(); 534 rectOpening.ProfileType = IfcProfileTypeEnum.AREA; 535 rectOpening.XDim = width; 536 rectOpening.YDim = length; 537 rectOpening.Position = model.Instances.New<IfcAxis2Placement2D>(); 538 rectOpening.Position.Location = insertPoint; 539 540 //模型区域实心 541 var body_Opeinging = model.Instances.New<IfcExtrudedAreaSolid>(); 542 body_Opeinging.Depth = height; 543 body_Opeinging.SweptArea = rectOpening; 544 body_Opeinging.ExtrudedDirection = model.Instances.New<IfcDirection>(); 545 body_Opeinging.ExtrudedDirection.SetXYZ(0, 0, 1); 546 body_Opeinging.Position = model.Instances.New<IfcAxis2Placement3D>(); 547 body_Opeinging.Position.Location = origin; 548 var shape__Opeinging = model.Instances.New<IfcShapeRepresentation>(); 549 var modelContext__Opeinging = model.Instances.OfType<IfcGeometricRepresentationContext>().FirstOrDefault(); 550 shape__Opeinging.ContextOfItems = modelContext__Opeinging; 551 shape__Opeinging.RepresentationType = "SweptSolid"; 552 shape__Opeinging.RepresentationIdentifier = "Body"; 553 shape__Opeinging.Items.Add(body_Opeinging); 554 555 //创建产品定义并将模型几何添加到墙上 556 var rep_Opening = model.Instances.New<IfcProductDefinitionShape>(); 557 rep_Opening.Representations.Add(shape__Opeinging); 558 m_OpeningEle.ObjectPlacement = lp_door; 559 m_OpeningEle.Representation = rep_Opening; 560 561 var m_RelFills = model.Instances.New<IfcRelFillsElement>(); 562 m_RelFills.RelatingOpeningElement = m_OpeningEle; 563 m_RelFills.RelatedBuildingElement = door; 564 var voidRel = model.Instances.New<IfcRelVoidsElement>(); 565 voidRel.RelatedOpeningElement = m_OpeningEle; 566 voidRel.RelatingBuildingElement = wall; 567 568 var material98 = model.Instances.New<IfcMaterial>(); 569 material98.Name = "Glass"; 570 var material100 = model.Instances.New<IfcMaterial>(); 571 material100.Name = "Wood"; 572 573 var n_ifcMaterialConstituentSet = model.Instances.New<IfcMaterialConstituentSet>(); 574 var n_ifcMaterialConstituent = model.Instances.New<IfcMaterialConstituent>(); 575 n_ifcMaterialConstituent.Category = "Framing"; 576 n_ifcMaterialConstituent.Material = material98; 577 var n_ifcMaterialConstituent100 = model.Instances.New<IfcMaterialConstituent>(); 578 n_ifcMaterialConstituent100.Category = "Framing"; 579 n_ifcMaterialConstituent100.Material = material100; 580 //n_ifcMaterialConstituent.Model = door; 581 n_ifcMaterialConstituentSet.MaterialConstituents.Add(n_ifcMaterialConstituent); 582 n_ifcMaterialConstituentSet.MaterialConstituents.Add(n_ifcMaterialConstituent100); 583 var ifcRelAssociatesMaterial = model.Instances.New<IfcRelAssociatesMaterial>(); 584 ifcRelAssociatesMaterial.RelatingMaterial = n_ifcMaterialConstituentSet; 585 ifcRelAssociatesMaterial.RelatedObjects.Add(door); 586 587 var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv => 588 { 589 psv.Name = "Reference"; 590 psv.Description = "Reference"; 591 psv.NominalValue = new IfcTimeMeasure(150.0); 592 psv.Unit = model.Instances.New<IfcSIUnit>(siu => 593 { 594 siu.UnitType = IfcUnitEnum.TIMEUNIT; 595 siu.Name = IfcSIUnitName.SECOND; 596 }); 597 }); 598 var ifcPropertySingleValue2 = model.Instances.New<IfcPropertySingleValue>(psv => 599 { 600 psv.Name = "FireRating"; 601 psv.Description = ""; 602 603 }); 604 var ifcPropertySingleValue3 = model.Instances.New<IfcPropertySingleValue>(psv => 605 { 606 psv.Name = "AcousticRating"; 607 psv.Description = "AcousticRating"; 608 609 }); 610 var ifcPropertySingleValue4 = model.Instances.New<IfcPropertySingleValue>(psv => 611 { 612 psv.Name = "IsExternal"; 613 psv.Description = "IsExternal"; 614 psv.NominalValue = new IfcBoolean(true); 615 616 }); 617 var ifcPropertySingleValue5 = model.Instances.New<IfcPropertySingleValue>(psv => 618 { 619 psv.Name = "Infiltration"; 620 psv.Description = "Infiltration"; 621 psv.NominalValue = new IfcReal(0.3); 622 623 }); 624 var ifcPropertySingleValue6 = model.Instances.New<IfcPropertySingleValue>(psv => 625 { 626 psv.Name = "ThermalTransmittance"; 627 psv.Description = "ThermalTransmittance"; 628 psv.NominalValue = new IfcReal(0.24); 629 630 }); 631 //设置模型元素数量 632 var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps => 633 { 634 ps.Name = "Pset_WindowCommon"; 635 ps.Description = "Property Set"; 636 ps.HasProperties.Add(ifcPropertySingleValue); 637 ps.HasProperties.Add(ifcPropertySingleValue2); 638 ps.HasProperties.Add(ifcPropertySingleValue3); 639 ps.HasProperties.Add(ifcPropertySingleValue4); 640 ps.HasProperties.Add(ifcPropertySingleValue5); 641 ps.HasProperties.Add(ifcPropertySingleValue6); 642 }); 643 //需建立关系 644 model.Instances.New<IfcRelDefinesByProperties>( 645 rdbp => 646 { 647 rdbp.Name = "Property Association"; 648 rdbp.Description = "IfcPropertySet associated to wall"; 649 rdbp.RelatedObjects.Add(door); 650 rdbp.RelatingPropertyDefinition = ifcPropertySet; 651 }); 652 653 txn.Commit(); 654 return door; 655 } 656 657 } 658 /// <summary> 659 /// 给墙添加属性 660 /// </summary> 661 /// <param name="model">XbimModel</param> 662 /// <param name="wall"></param> 663 static private void AddPropertiesToWall(IfcStore model, IfcWallStandardCase wall) 664 { 665 using (var txn = model.BeginTransaction("Create Wall")) 666 { 667 CreateElementQuantity(model, wall); 668 CreateSimpleProperty(model, wall); 669 txn.Commit(); 670 } 671 } 672 673 private static void CreateSimpleProperty(IfcStore model, IfcWallStandardCase wall) 674 { 675 var ifcPropertySingleValue = model.Instances.New<IfcPropertySingleValue>(psv => 676 { 677 psv.Name = "IfcPropertySingleValue:Time"; 678 psv.Description = ""; 679 psv.NominalValue = new IfcTimeMeasure(150.0); 680 psv.Unit = model.Instances.New<IfcSIUnit>(siu => 681 { 682 siu.UnitType = IfcUnitEnum.TIMEUNIT; 683 siu.Name = IfcSIUnitName.SECOND; 684 }); 685 }); 686 var ifcPropertyEnumeratedValue = model.Instances.New<IfcPropertyEnumeratedValue>(pev => 687 { 688 pev.Name = "IfcPropertyEnumeratedValue:Music"; 689 pev.EnumerationReference = model.Instances.New<IfcPropertyEnumeration>(pe => 690 { 691 pe.Name = "Notes"; 692 pe.EnumerationValues.Add(new IfcLabel("Do")); 693 pe.EnumerationValues.Add(new IfcLabel("Re")); 694 pe.EnumerationValues.Add(new IfcLabel("Mi")); 695 pe.EnumerationValues.Add(new IfcLabel("Fa")); 696 pe.EnumerationValues.Add(new IfcLabel("So")); 697 pe.EnumerationValues.Add(new IfcLabel("La")); 698 pe.EnumerationValues.Add(new IfcLabel("Ti")); 699 }); 700 pev.EnumerationValues.Add(new IfcLabel("Do")); 701 pev.EnumerationValues.Add(new IfcLabel("Re")); 702 pev.EnumerationValues.Add(new IfcLabel("Mi")); 703 704 }); 705 var ifcPropertyBoundedValue = model.Instances.New<IfcPropertyBoundedValue>(pbv => 706 { 707 pbv.Name = "IfcPropertyBoundedValue:Mass"; 708 pbv.Description = ""; 709 pbv.UpperBoundValue = new IfcMassMeasure(5000.0); 710 pbv.LowerBoundValue = new IfcMassMeasure(1000.0); 711 pbv.Unit = model.Instances.New<IfcSIUnit>(siu => 712 { 713 siu.UnitType = IfcUnitEnum.MASSUNIT; 714 siu.Name = IfcSIUnitName.GRAM; 715 siu.Prefix = IfcSIPrefix.KILO; 716 }); 717 }); 718 719 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), }; 720 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), }; 721 var ifcPropertyTableValue = model.Instances.New<IfcPropertyTableValue>(ptv => 722 { 723 ptv.Name = "IfcPropertyTableValue:Sound"; 724 foreach (var item in definingValues) 725 { 726 ptv.DefiningValues.Add(item); 727 } 728 foreach (var item in definedValues) 729 { 730 ptv.DefinedValues.Add(item); 731 } 732 ptv.DefinedUnit = model.Instances.New<IfcContextDependentUnit>(cd => 733 { 734 cd.Dimensions = model.Instances.New<IfcDimensionalExponents>(de => 735 { 736 de.LengthExponent = 0; 737 de.MassExponent = 0; 738 de.TimeExponent = 0; 739 de.ElectricCurrentExponent = 0; 740 de.ThermodynamicTemperatureExponent = 0; 741 de.AmountOfSubstanceExponent = 0; 742 de.LuminousIntensityExponent = 0; 743 }); 744 cd.UnitType = IfcUnitEnum.FREQUENCYUNIT; 745 cd.Name = "dB"; 746 }); 747 748 749 }); 750 751 var listValues = new List<IfcLabel> { new IfcLabel("Red"), new IfcLabel("Green"), new IfcLabel("Blue"), new IfcLabel("Pink"), new IfcLabel("White"), new IfcLabel("Black"), }; 752 var ifcPropertyListValue = model.Instances.New<IfcPropertyListValue>(plv => 753 { 754 plv.Name = "IfcPropertyListValue:Colours"; 755 foreach (var item in listValues) 756 { 757 plv.ListValues.Add(item); 758 } 759 }); 760 761 var ifcMaterial = model.Instances.New<IfcMaterial>(m => 762 { 763 m.Name = "Brick"; 764 }); 765 var ifcPrValueMaterial = model.Instances.New<IfcPropertyReferenceValue>(prv => 766 { 767 prv.Name = "IfcPropertyReferenceValue:Material"; 768 prv.PropertyReference = ifcMaterial; 769 }); 770 771 772 var ifcMaterialList = model.Instances.New<IfcMaterialList>(ml => 773 { 774 ml.Materials.Add(ifcMaterial); 775 ml.Materials.Add(model.Instances.New<IfcMaterial>(m =>{m.Name = "Cavity";})); 776 ml.Materials.Add(model.Instances.New<IfcMaterial>(m => { m.Name = "Block"; })); 777 }); 778 779 780 var ifcMaterialLayer = model.Instances.New<IfcMaterialLayer>(ml => 781 { 782 ml.Material = ifcMaterial; 783 ml.LayerThickness = 100.0; 784 }); 785 var ifcPrValueMatLayer = model.Instances.New<IfcPropertyReferenceValue>(prv => 786 { 787 prv.Name = "IfcPropertyReferenceValue:MaterialLayer"; 788 prv.PropertyReference = ifcMaterialLayer; 789 }); 790 791 var ifcDocumentReference = model.Instances.New<IfcDocumentReference>(dr => 792 { 793 dr.Name = "Document"; 794 dr.Location = "c://Documents//TheDoc.Txt"; 795 }); 796 var ifcPrValueRef = model.Instances.New<IfcPropertyReferenceValue>(prv => 797 { 798 prv.Name = "IfcPropertyReferenceValue:Document"; 799 prv.PropertyReference = ifcDocumentReference; 800 }); 801 802 var ifcTimeSeries = model.Instances.New<IfcRegularTimeSeries>(ts => 803 { 804 ts.Name = "Regular Time Series"; 805 ts.Description = "Time series of events"; 806 ts.StartTime = new IfcDateTime("2015-02-14T12:01:01"); 807 ts.EndTime = new IfcDateTime("2015-05-15T12:01:01"); 808 ts.TimeSeriesDataType = IfcTimeSeriesDataTypeEnum.CONTINUOUS; 809 ts.DataOrigin = IfcDataOriginEnum.MEASURED; 810 ts.TimeStep = 604800; //7 days in secs 811 }); 812 813 var ifcPrValueTimeSeries = model.Instances.New<IfcPropertyReferenceValue>(prv => 814 { 815 prv.Name = "IfcPropertyReferenceValue:TimeSeries"; 816 prv.PropertyReference = ifcTimeSeries; 817 }); 818 819 var ifcAddress = model.Instances.New<IfcPostalAddress>(a => 820 { 821 a.InternalLocation = "Room 101"; 822 a.AddressLines.AddRange(new[] { new IfcLabel("12 New road"), new IfcLabel("DoxField" ) }); 823 a.Town = "Sunderland"; 824 a.PostalCode = "DL01 6SX"; 825 }); 826 var ifcPrValueAddress = model.Instances.New<IfcPropertyReferenceValue>(prv => 827 { 828 prv.Name = "IfcPropertyReferenceValue:Address"; 829 prv.PropertyReference = ifcAddress; 830 }); 831 var ifcTelecomAddress = model.Instances.New<IfcTelecomAddress>(a => 832 { 833 a.TelephoneNumbers.Add(new IfcLabel("01325 6589965")); 834 a.ElectronicMailAddresses.Add(new IfcLabel("bob@bobsworks.com")); 835 }); 836 var ifcPrValueTelecom = model.Instances.New<IfcPropertyReferenceValue>(prv => 837 { 838 prv.Name = "IfcPropertyReferenceValue:Telecom"; 839 prv.PropertyReference = ifcTelecomAddress; 840 }); 841 842 843 844 //设置模型元素数量 845 var ifcPropertySet = model.Instances.New<IfcPropertySet>(ps => 846 { 847 ps.Name = "Test:IfcPropertySet"; 848 ps.Description = "Property Set"; 849 ps.HasProperties.Add(ifcPropertySingleValue); 850 ps.HasProperties.Add(ifcPropertyEnumeratedValue); 851 ps.HasProperties.Add(ifcPropertyBoundedValue); 852 ps.HasProperties.Add(ifcPropertyTableValue); 853 ps.HasProperties.Add(ifcPropertyListValue); 854 ps.HasProperties.Add(ifcPrValueMaterial); 855 ps.HasProperties.Add(ifcPrValueMatLayer); 856 ps.HasProperties.Add(ifcPrValueRef); 857 ps.HasProperties.Add(ifcPrValueTimeSeries); 858 ps.HasProperties.Add(ifcPrValueAddress); 859 ps.HasProperties.Add(ifcPrValueTelecom); 860 }); 861 862 //需建立关系 863 model.Instances.New<IfcRelDefinesByProperties>(rdbp => 864 { 865 rdbp.Name = "Property Association"; 866 rdbp.Description = "IfcPropertySet associated to wall"; 867 rdbp.RelatedObjects.Add(wall); 868 rdbp.RelatingPropertyDefinition = ifcPropertySet; 869 }); 870 } 871 872 private static void CreateElementQuantity(IfcStore model, IfcWallStandardCase wall) 873 { 874 //创建模型元素数量 875 //首先我们需模型简单物理量,首先将使用模型量长度 876 var ifcQuantityArea = model.Instances.New<IfcQuantityLength>(qa => 877 { 878 qa.Name = "IfcQuantityArea:Area"; 879 qa.Description = ""; 880 qa.Unit = model.Instances.New<IfcSIUnit>(siu => 881 { 882 siu.UnitType = IfcUnitEnum.LENGTHUNIT; 883 siu.Prefix = IfcSIPrefix.MILLI; 884 siu.Name = IfcSIUnitName.METRE; 885 }); 886 qa.LengthValue = 100.0; 887 888 }); 889 //上下文相关单元的数量计数 890 var ifcContextDependentUnit = model.Instances.New<IfcContextDependentUnit>(cd => 891 { 892 cd.Dimensions = model.Instances.New<IfcDimensionalExponents>(de => 893 { 894 de.LengthExponent = 1; 895 de.MassExponent = 0; 896 de.TimeExponent = 0; 897 de.ElectricCurrentExponent = 0; 898 de.ThermodynamicTemperatureExponent = 0; 899 de.AmountOfSubstanceExponent = 0; 900 de.LuminousIntensityExponent = 0; 901 }); 902 cd.UnitType = IfcUnitEnum.LENGTHUNIT; 903 cd.Name = "Elephants"; 904 }); 905 var ifcQuantityCount = model.Instances.New<IfcQuantityCount>(qc => 906 { 907 qc.Name = "IfcQuantityCount:Elephant"; 908 qc.CountValue = 12; 909 qc.Unit = ifcContextDependentUnit; 910 }); 911 912 913 //使用转换单位 914 var ifcConversionBasedUnit = model.Instances.New<IfcConversionBasedUnit>(cbu => 915 { 916 cbu.ConversionFactor = model.Instances.New<IfcMeasureWithUnit>(mu => 917 { 918 mu.ValueComponent = new IfcRatioMeasure(25.4); 919 mu.UnitComponent = model.Instances.New<IfcSIUnit>(siu => 920 { 921 siu.UnitType = IfcUnitEnum.LENGTHUNIT; 922 siu.Prefix = IfcSIPrefix.MILLI; 923 siu.Name = IfcSIUnitName.METRE; 924 }); 925 926 }); 927 cbu.Dimensions = model.Instances.New<IfcDimensionalExponents>(de => 928 { 929 de.LengthExponent = 1; 930 de.MassExponent = 0; 931 de.TimeExponent = 0; 932 de.ElectricCurrentExponent = 0; 933 de.ThermodynamicTemperatureExponent = 0; 934 de.AmountOfSubstanceExponent = 0; 935 de.LuminousIntensityExponent = 0; 936 }); 937 cbu.UnitType = IfcUnitEnum.LENGTHUNIT; 938 cbu.Name = "Inch"; 939 }); 940 var ifcQuantityLength = model.Instances.New<IfcQuantityLength>(qa => 941 { 942 qa.Name = "IfcQuantityLength:Length"; 943 qa.Description = ""; 944 qa.Unit = ifcConversionBasedUnit; 945 qa.LengthValue = 24.0; 946 }); 947 948 //lets create the IfcElementQuantity 949 var ifcElementQuantity = model.Instances.New<IfcElementQuantity>(eq => 950 { 951 eq.Name = "Test:IfcElementQuantity"; 952 eq.Description = "Measurement quantity"; 953 eq.Quantities.Add(ifcQuantityArea); 954 eq.Quantities.Add(ifcQuantityCount); 955 eq.Quantities.Add(ifcQuantityLength); 956 }); 957 958 //下步 建议关系 959 model.Instances.New<IfcRelDefinesByProperties>(rdbp => 960 { 961 rdbp.Name = "Area Association"; 962 rdbp.Description = "IfcElementQuantity associated to wall"; 963 rdbp.RelatedObjects.Add(wall); 964 rdbp.RelatingPropertyDefinition = ifcElementQuantity; 965 }); 966 } 967 968 }
参考资料:
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
原文:https://www.cnblogs.com/yhlx125/p/10978404.html