public void Add(CostSchedule item) { if (!schedules.Add(item)) { return; } if (relations.Any()) { relations[0].RelatedDefinitions.Add(item.Entity); return; } if (project.Entity.Model.SchemaVersion == Xbim.Common.Step21.XbimSchemaVersion.Ifc2X3) { return; } var rel = create.New <IfcRelDeclares>(r => r.RelatingContext = project.Entity as IfcProject); relations.Add(rel); rel.RelatedDefinitions.Add(item.Entity); }
private void TransformPlacements() { var toRemove = new List <IfcLocalPlacement>(); foreach (var alignment in _alignments) { var segments = alignment.Segments.ToList(); foreach (var element in alignment.Elements) { // only transform local placements var lPlacement = element.ObjectPlacement as IfcLocalPlacement; if (lPlacement == null) { continue; } // get placement aggregated to the level of site (excluding site) var matrix = GetMatrixRelativeToSite(element); var position = matrix.Transform(new XbimPoint3D(0, 0, 0)); var intersection = GetIntersection2D(segments, position); if (intersection == null) { Log.Warning($"Object placement for {element} could not be created because intersection was not found."); continue; } // invert the matrix for the directions matrix.Invert(); var vertDir = matrix.Transform(new XbimVector3D(0, 0, 1)).Normalized(); var xDir = matrix.Transform(new XbimVector3D(1, 0, 0)).Normalized(); _model.Delete(element.ObjectPlacement); element.ObjectPlacement = i.New <IfcLinearPlacement>(lp => { lp.Distance = i.New <IfcDistanceExpression>(d => { d.AlongHorizontal = true; d.OffsetVertical = position.Z; d.DistanceAlong = intersection.DistanceAlong; d.OffsetLateral = intersection.OffsetLateral; }); lp.PlacementRelTo = SitePlacement; lp.PlacementMeasuredAlong = alignment.Alignment.Axis; lp.Orientation = i.New <IfcOrientationExpression>(o => { o.VerticalAxisDirection = i.New <IfcDirection>(d => d.SetXYZ(vertDir.X, vertDir.Y, vertDir.Z)); o.LateralAxisDirection = i.New <IfcDirection>(d => d.SetXYZ(xDir.X, xDir.Y, xDir.Z)); }); }); toRemove.Add(lPlacement); } } // remove unused local placements from the model if (toRemove.Any()) { _model.Delete(toRemove); } }