internal static IfcSurfaceCurveSweptAreaSolid ProfileSurfaceSweptSolidCreate(IfcStore model, IfcProfileDef prof, List <Point3D> lstPoints, IfcDirection planeZaxis = null, IfcDirection refDir = null) { IfcSurfaceCurveSweptAreaSolid body = model.Instances.New <IfcSurfaceCurveSweptAreaSolid>(); IfcPolyline pLine = model.Instances.New <IfcPolyline>(); for (int i = 0; i < lstPoints.Count; i++) { IfcCartesianPoint point = model.Instances.New <IfcCartesianPoint>(); point.SetXYZ(lstPoints[i].X, lstPoints[i].Y, lstPoints[i].Z); pLine.Points.Add(point); } body.Directrix = pLine; body.SweptArea = prof; var plane = model.Instances.New <IfcPlane>(); plane.Position = model.Instances.New <IfcAxis2Placement3D>(); plane.Position.Location = model.Instances.New <IfcCartesianPoint>(); plane.Position.Location.SetXYZ(lstPoints[0].X, lstPoints[0].Y, lstPoints[0].Z); plane.Position.Axis = planeZaxis; plane.Position.RefDirection = refDir; body.ReferenceSurface = plane; //body.FixedReference.SetXYZ(1, 0, 0); return(body); }
private static IfcSurfaceCurveSweptAreaSolid ToIfcSurfaceCurveSweptAreaSolid(this Sweep sweep, Document doc) { var position = new Transform().ToIfcAxis2Placement3D(doc); var sweptArea = sweep.Profile.Perimeter.ToIfcArbitraryClosedProfileDef(doc); var directrix = sweep.Curve.ToIfcCurve(doc); var profile = new IfcArbitraryOpenProfileDef(IfcProfileTypeEnum.CURVE, directrix); var extrudeDir = Vector3.ZAxis.ToIfcDirection(); var extrudeSurfPosition = new Transform(0, 0, -100).ToIfcAxis2Placement3D(doc); doc.AddEntity(extrudeSurfPosition); var surface = new IfcSurfaceOfLinearExtrusion(profile, position, extrudeDir, 100); // You must use the version of this constructor that has position, startParam, // and endParam. If you don't, ArchiCAD (and possibly others) will call // the geometry invalid. var solid = new IfcSurfaceCurveSweptAreaSolid(sweptArea, position, directrix, 0, 1, surface); doc.AddEntity(position); doc.AddEntity(sweptArea); doc.AddEntity(directrix); doc.AddEntity(extrudeDir); doc.AddEntity(profile); doc.AddEntity(surface); doc.AddEntity(solid); return(solid); }
static public IfcSurfaceCurveSweptAreaSolid CreateTestCase(this IfcSurfaceCurveSweptAreaSolid sweep) { IfcSurfaceCurveSweptAreaSolid sweptAreaSolid = new IfcSurfaceCurveSweptAreaSolid() { SweptArea = new IfcArbitraryProfileDefWithVoids().CreateTestCase() }; return(sweptAreaSolid); }
public static IfcSurfaceCurveSweptAreaSolid CreateTestCase(this IfcSurfaceCurveSweptAreaSolid sweep) { IfcSurfaceCurveSweptAreaSolid sweptAreaSolid = new IfcSurfaceCurveSweptAreaSolid() { SweptArea = new IfcArbitraryProfileDefWithVoids().CreateTestCase() }; return sweptAreaSolid; }
/// <summary> /// returns a Hash for the geometric behaviour of this object /// </summary> /// <param name="solid"></param> /// <returns></returns> public static int GetGeometryHashCode(this IfcSurfaceCurveSweptAreaSolid solid) { Func <double, int> f = solid.Model.ModelFactors.GetGeometryDoubleHash; return(solid.Directrix.GetGeometryHashCode() ^ solid.ReferenceSurface.GetGeometryHashCode() ^ solid.Position.GetGeometryHashCode() ^ solid.SweptArea.GetGeometryHashCode()); }
/// <summary> /// Compares two objects for geomtric equality /// </summary> /// <param name="a"></param> /// <param name="b">object to compare with</param> /// <returns></returns> public static bool GeometricEquals(this IfcSurfaceCurveSweptAreaSolid a, IfcRepresentationItem b) { IfcSurfaceCurveSweptAreaSolid scsa = b as IfcSurfaceCurveSweptAreaSolid; if (scsa == null) { return(false); //different types are not the same } double precision = a.Model.ModelFactors.Precision; return(a.Directrix.GeometricEquals(scsa.Directrix) && a.StartParam == scsa.EndParam && a.EndParam == scsa.EndParam && a.ReferenceSurface.GeometricEquals(scsa.ReferenceSurface) && a.Position.GeometricEquals(scsa.Position) && a.SweptArea.GeometricEquals(scsa.SweptArea)); }
private static IfcSurfaceCurveSweptAreaSolid ToIfcSurfaceCurveSweptAreaSolid(this ISweepAlongCurve sweep, Transform transform, Document doc) { var position = transform.ToIfcAxis2Placement3D(doc); var sweptArea = sweep.Profile.Perimeter.ToIfcArbitraryClosedProfileDef(doc); var directrix = sweep.Curve.ToIfcCurve(doc); var extrudeDir = Vector3.ZAxis.ToIfcDirection(); var profile = new IfcArbitraryClosedProfileDef(IfcProfileTypeEnum.CURVE, directrix); var surface = new IfcSurfaceOfLinearExtrusion(profile, position, extrudeDir, new IfcPositiveLengthMeasure(1.0)); var solid = new IfcSurfaceCurveSweptAreaSolid(sweptArea, position, directrix, sweep.StartSetback, sweep.EndSetback, surface); doc.AddEntity(position); doc.AddEntity(sweptArea); doc.AddEntity(directrix); doc.AddEntity(extrudeDir); doc.AddEntity(profile); doc.AddEntity(surface); doc.AddEntity(solid); return(solid); }
public IXbimSolid CreateSolid(IfcSurfaceCurveSweptAreaSolid ifcSolid) { return(_engine.CreateSolid(ifcSolid)); }
internal static IfcSurfaceCurveSweptAreaSolid ProfileSurfaceSweptSolidCreateByCompositeCurve(IfcStore model, IfcProfileDef prof, Entity profPath) { IfcSurfaceCurveSweptAreaSolid body = model.Instances.New <IfcSurfaceCurveSweptAreaSolid>(); IfcCompositeCurve compositeCurve = model.Instances.New <IfcCompositeCurve>(); if (profPath is LinearPath) { LinearPath linearPath = profPath as LinearPath; IfcCompositeCurveSegment segment = model.Instances.New <IfcCompositeCurveSegment>(); IfcPolyline pLine = model.Instances.New <IfcPolyline>(); for (int i = 0; i < linearPath.Vertices.Length; i++) { IfcCartesianPoint point = model.Instances.New <IfcCartesianPoint>(); point.SetXYZ(linearPath.Vertices[i].X, linearPath.Vertices[i].Y, linearPath.Vertices[i].Z); pLine.Points.Add(point); } segment.ParentCurve = pLine; segment.Transition = IfcTransitionCode.CONTINUOUS; compositeCurve.Segments.Add(segment); } else { CompositeCurve compCurvePath = profPath as CompositeCurve; for (int i = 0; i < compCurvePath.CurveList.Count; i++) { if (compCurvePath.CurveList[i] is Line) { Line line = compCurvePath.CurveList[i] as Line; IfcCompositeCurveSegment segment = model.Instances.New <IfcCompositeCurveSegment>(); IfcPolyline pLine = model.Instances.New <IfcPolyline>(); for (int j = 0; j < line.Vertices.Length; j++) { IfcCartesianPoint point = model.Instances.New <IfcCartesianPoint>(); point.SetXYZ(line.Vertices[j].X, line.Vertices[j].Y, line.Vertices[j].Z); pLine.Points.Add(point); } segment.ParentCurve = pLine; segment.Transition = IfcTransitionCode.CONTINUOUS; compositeCurve.Segments.Add(segment); } else { Arc arc = compCurvePath.CurveList[i] as Arc; IfcCompositeCurveSegment segment = model.Instances.New <IfcCompositeCurveSegment>(); IfcTrimmedCurve trimmedCurve = model.Instances.New <IfcTrimmedCurve>(); IfcCircle cir = model.Instances.New <IfcCircle>(e => e.Radius = arc.Radius); cir.Position = model.Instances.New <IfcAxis2Placement3D>(e => e.Location = model.Instances.New <IfcCartesianPoint>(p => p.SetXYZ(arc.Center.X, arc.Center.Y, arc.Center.Z))); trimmedCurve.BasisCurve = cir; trimmedCurve.Trim1.Add(model.Instances.New <IfcCartesianPoint>(p => p.SetXYZ(arc.StartPoint.X, arc.StartPoint.Y, arc.StartPoint.Z))); trimmedCurve.Trim2.Add(model.Instances.New <IfcCartesianPoint>(p => p.SetXYZ(arc.EndPoint.X, arc.EndPoint.Y, arc.EndPoint.Z))); trimmedCurve.SenseAgreement = arc.Plane.AxisZ == Vector3D.AxisZ ? false : true; trimmedCurve.MasterRepresentation = IfcTrimmingPreference.CARTESIAN; segment.ParentCurve = trimmedCurve; segment.Transition = IfcTransitionCode.CONTINUOUS; compositeCurve.Segments.Add(segment); } } } body.Directrix = compositeCurve; body.SweptArea = prof; var plane = model.Instances.New <IfcPlane>(); plane.Position = model.Instances.New <IfcAxis2Placement3D>(); plane.Position.Location = model.Instances.New <IfcCartesianPoint>(); //plane.Position.Location.SetXYZ(profPath.X, lstPoints[0].Y, lstPoints[0].Z); plane.Position.Axis = model.Instances.New <IfcDirection>(); plane.Position.Axis.SetXYZ(0, 0, 1); plane.Position.RefDirection = model.Instances.New <IfcDirection>(); plane.Position.RefDirection.SetXYZ(1, 0, 0); body.ReferenceSurface = plane; //body.FixedReference.SetXYZ(1, 0, 0); return(body); }
internal static IfcSurfaceCurveSweptAreaSolid ProfileSurfaceSweptSolidCreate(IfcStore model, IfcProfileDef prof, Entity profPath) { IfcSurfaceCurveSweptAreaSolid body = model.Instances.New <IfcSurfaceCurveSweptAreaSolid>(); if (profPath is LinearPath) { List <Point3D> lstPoints = (profPath as LinearPath).Vertices.ToList(); IfcPolyline pLine = model.Instances.New <IfcPolyline>(); for (int i = 0; i < lstPoints.Count; i++) { IfcCartesianPoint point = model.Instances.New <IfcCartesianPoint>(); point.SetXYZ(lstPoints[i].X, lstPoints[i].Y, lstPoints[i].Z); pLine.Points.Add(point); } body.Directrix = pLine; body.SweptArea = prof; var plane = model.Instances.New <IfcPlane>(); plane.Position = model.Instances.New <IfcAxis2Placement3D>(); plane.Position.Location = model.Instances.New <IfcCartesianPoint>(); plane.Position.Location.SetXYZ(lstPoints[0].X, lstPoints[0].Y, lstPoints[0].Z); plane.Position.Axis = model.Instances.New <IfcDirection>(); plane.Position.Axis.SetXYZ(0, 0, 1); plane.Position.RefDirection = model.Instances.New <IfcDirection>(); plane.Position.RefDirection.SetXYZ(1, 0, 0); body.ReferenceSurface = plane; } else if (profPath is Circle) { Circle cadCircle = profPath as Circle; IfcCircle c = model.Instances.New <IfcCircle>(); c.Radius = cadCircle.Radius * 2; IfcAxis2Placement3D placement = model.Instances.New <IfcAxis2Placement3D>(); placement.Location = model.Instances.New <IfcCartesianPoint>(); placement.Location.SetXYZ(cadCircle.Center.X, cadCircle.Center.Y, cadCircle.Center.Z); c.Position = placement; body.Directrix = c; body.SweptArea = prof; IfcPlane plane = model.Instances.New <IfcPlane>(); plane.Position = model.Instances.New <IfcAxis2Placement3D>(); plane.Position.Location = model.Instances.New <IfcCartesianPoint>(); plane.Position.Location.SetXYZ(cadCircle.Center.X, cadCircle.Center.Y, cadCircle.Center.Z); plane.Position.RefDirection = model.Instances.New <IfcDirection>(); plane.Position.RefDirection.SetXYZ(1, 0, 0); plane.Position.Axis = model.Instances.New <IfcDirection>(); plane.Position.Axis.SetXYZ(0, 0, 1); body.ReferenceSurface = plane; //plane containing directrix //body.StartParam = 0; //body.EndParam = 360; } //body.FixedReference.SetXYZ(1, 0, 0); return(body); }