Display conduit used by the SampleCsAnimator command
Inheritance: MRhinoDisplayConduit
Beispiel #1
0
        /// <summary>
        /// This gets called when when the user runs this command.
        /// </summary>
        public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
        {
            // Select objects to animate
            MRhinoGetObject go = new MRhinoGetObject();

            go.SetCommandPrompt("Select objects to animate");
            go.GetObjects(1, 0);
            if (go.CommandResult() != IRhinoCommand.result.success)
            {
                return(go.CommandResult());
            }

            // Select path curve
            MRhinoGetObject gc = new MRhinoGetObject();

            gc.SetCommandPrompt("Select path curve");
            gc.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object);
            gc.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.open_curve);
            gc.EnableDeselectAllBeforePostSelect(false);
            gc.GetObjects(1, 1);
            if (gc.CommandResult() != IRhinoCommand.result.success)
            {
                return(gc.CommandResult());
            }

            // Get the curve
            IOnCurve crv = gc.Object(0).Curve();

            if (null == crv)
            {
                return(IRhinoCommand.result.failure);
            }

            // Create an array of normalized curve parameters
            List <double> slist = new List <double>(m_max_steps);

            for (int i = 0; i < m_max_steps; i++)
            {
                double s = (double)i / ((double)m_max_steps - 1);
                slist.Add(s);
            }

            // Get the real parameters along the curve
            double[] tlist = new double[m_max_steps];
            if (!crv.GetNormalizedArcLengthPoints(slist.ToArray(), ref tlist))
            {
                return(IRhinoCommand.result.failure);
            }

            // Create the display conduit
            SampleCsAnimatorConduit conduit = new SampleCsAnimatorConduit();

            // Get points along curve
            On3dPoint        start = new On3dPoint(crv.PointAtStart());
            List <On3dPoint> plist = new List <On3dPoint>(tlist.Length);

            for (int i = 0; i < m_max_steps; i++)
            {
                On3dPoint pt = new On3dPoint(crv.PointAt(tlist[i]));
                plist.Add(pt);
            }

            // Hide objects and add them to conduit's object array
            for (int i = 0; i < go.ObjectCount(); i++)
            {
                MRhinoObjRef objref = go.Object(i);
                context.m_doc.HideObject(objref);
                conduit.m_objects.Add(objref.Object());
            }

            // Do animation...
            conduit.Enable();

            for (int i = 0; i < m_max_steps; i++)
            {
                On3dVector v = plist[i] - start;
                conduit.m_xform.Translation(v);
                context.m_doc.Redraw();
                Thread.Sleep(100);
            }

            for (int i = m_max_steps - 1; i >= 0; i--)
            {
                On3dVector v = plist[i] - start;
                conduit.m_xform.Translation(v);
                if (0 != i)
                {
                    context.m_doc.Redraw();
                    Thread.Sleep(100);
                }
            }

            conduit.Disable();

            // Show hidden objects
            for (int i = 0; i < go.ObjectCount(); i++)
            {
                MRhinoObjRef objref = go.Object(i);
                context.m_doc.ShowObject(objref);
            }

            context.m_doc.Redraw();

            return(IRhinoCommand.result.success);
        }
        /// <summary> 
        /// This gets called when when the user runs this command.
        /// </summary>
        public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
        {
            // Select objects to animate
              MRhinoGetObject go = new MRhinoGetObject();
              go.SetCommandPrompt("Select objects to animate");
              go.GetObjects(1, 0);
              if (go.CommandResult() != IRhinoCommand.result.success)
            return go.CommandResult();

              // Select path curve
              MRhinoGetObject gc = new MRhinoGetObject();
              gc.SetCommandPrompt("Select path curve");
              gc.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object);
              gc.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.open_curve);
              gc.EnableDeselectAllBeforePostSelect(false);
              gc.GetObjects(1, 1);
              if (gc.CommandResult() != IRhinoCommand.result.success)
            return gc.CommandResult();

              // Get the curve
              IOnCurve crv = gc.Object(0).Curve();
              if (null == crv )
            return IRhinoCommand.result.failure;

              // Create an array of normalized curve parameters
              List<double> slist = new List<double>(m_max_steps);
              for (int i = 0; i < m_max_steps; i++ )
              {
            double s = (double)i / ( (double)m_max_steps - 1 );
            slist.Add(s);
              }

              // Get the real parameters along the curve
              double[] tlist = new double[m_max_steps];
              if (!crv.GetNormalizedArcLengthPoints(slist.ToArray(), ref tlist))
            return IRhinoCommand.result.failure;

              // Create the display conduit
              SampleCsAnimatorConduit conduit = new SampleCsAnimatorConduit();

              // Get points along curve
              On3dPoint start = new On3dPoint(crv.PointAtStart());
              List<On3dPoint> plist = new List<On3dPoint>(tlist.Length);
              for (int i = 0; i < m_max_steps; i++)
              {
            On3dPoint pt = new On3dPoint(crv.PointAt(tlist[i]));
            plist.Add(pt);
              }

              // Hide objects and add them to conduit's object array
              for (int i = 0; i < go.ObjectCount(); i++ )
              {
            MRhinoObjRef objref = go.Object(i);
            context.m_doc.HideObject(objref);
            conduit.m_objects.Add(objref.Object());
              }

              // Do animation...
              conduit.Enable();

              for (int i = 0; i < m_max_steps; i++)
              {
            On3dVector v = plist[i] - start;
            conduit.m_xform.Translation(v);
            context.m_doc.Redraw();
            Thread.Sleep(100);
              }

              for (int i = m_max_steps - 1; i >= 0; i--)
              {
            On3dVector v = plist[i] - start;
            conduit.m_xform.Translation(v);
            if (0 != i)
            {
              context.m_doc.Redraw();
              Thread.Sleep(100);
            }
              }

              conduit.Disable();

              // Show hidden objects
              for (int i = 0; i < go.ObjectCount(); i++)
              {
            MRhinoObjRef objref = go.Object(i);
            context.m_doc.ShowObject(objref);
              }

              context.m_doc.Redraw();

              return IRhinoCommand.result.success;
        }