コード例 #1
0
ファイル: IFCHelper.cs プロジェクト: 15831944/CADTo3D-1
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        static public IfcSurfaceCurveSweptAreaSolid CreateTestCase(this IfcSurfaceCurveSweptAreaSolid sweep)
        {
            IfcSurfaceCurveSweptAreaSolid sweptAreaSolid = new IfcSurfaceCurveSweptAreaSolid()
            {
                SweptArea = new IfcArbitraryProfileDefWithVoids().CreateTestCase()
            };

            return(sweptAreaSolid);
        }
コード例 #4
0
        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));
        }
コード例 #7
0
        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);
        }
コード例 #8
0
 public IXbimSolid CreateSolid(IfcSurfaceCurveSweptAreaSolid ifcSolid)
 {
     return(_engine.CreateSolid(ifcSolid));
 }
コード例 #9
0
ファイル: IFCHelper.cs プロジェクト: 15831944/CADTo3D-1
        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);
        }
コード例 #10
0
ファイル: IFCHelper.cs プロジェクト: 15831944/CADTo3D-1
        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);
        }