/// <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; }