/// <summary>
        /// Verifies a PolylineCurve is a rectangle
        /// </summary>
        public static bool IsRectangle(PolylineCurve curve)
        {
            // Curve should be a valid, closed, planar polyline curve with 5 points
              if (curve == null || !curve.IsValid || !curve.IsClosed || !curve.IsPlanar() || curve.PointCount != 5)
            return false;

              // Angle between each segment should be 90 degrees
              const double angle = 90.0 * (Math.PI / 180.0);
              for (var i = 1; i < curve.PointCount - 1; i++)
              {
            var p0 = curve.Point(i - 1);
            var p1 = curve.Point(i);
            var p2 = curve.Point(i + 1);

            var v0 = p1 - p0;
            v0.Unitize();

            var v1 = p1 - p2;
            v1.Unitize();

            var a = Vector3d.VectorAngle(v0, v1);
            if (Math.Abs(angle - a) >= RhinoMath.DefaultAngleTolerance)
              return false;
              }

              return true;
        }
        /// <summary>
        /// Creates grips
        /// </summary>
        public bool CreateGrips(PolylineCurve polylineCurve)
        {
            if (!SampleCsRectangleHelper.IsRectangle(polylineCurve))
            return false;

              if (GripCount > 0)
            return false;

              Plane plane;
              if (!polylineCurve.TryGetPlane(out plane))
            return false;
              m_plane = plane;

              m_active_rectangle = new Point3d[5];
              for (var i = 0; i < polylineCurve.PointCount; i++)
            m_active_rectangle[i] = polylineCurve.Point(i);

              m_original_rectangle = new Point3d[5];
              Array.Copy(m_active_rectangle, m_original_rectangle, 5);

              var line = new Line();
              for (var i = 0; i < 4; i++)
              {
            var gi = 2 * i;
            line.From = m_active_rectangle[i];
            line.To = m_active_rectangle[i + 1];
            m_sample_cs_rectangle_grips[gi].OriginalLocation = line.From;
            m_sample_cs_rectangle_grips[gi + 1].OriginalLocation = 0.5 * line.From + 0.5 * line.To;
            m_sample_cs_rectangle_grips[gi].Active = true;
            m_sample_cs_rectangle_grips[gi + 1].Active = true;
              }

              for (var i = 0; i < 8; i++)
            AddGrip(m_sample_cs_rectangle_grips[i]);

              return true;
        }
Ejemplo n.º 3
0
        public List<Curve> DuplicateSegments(PolylineCurve plinecurve)
        {
            List<Curve> lines = new List<Curve>(); ;

            for (int i = 1; i < plinecurve.PointCount; i++)
            {
                Point3d PtA = plinecurve.Point(i - 1);

                Point3d PtB = plinecurve.Point(i);

                lines.Add(new LineCurve(PtA, PtB));
            }

            return lines;
        }