Exemple #1
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            doc.Objects.UnselectAll();

            ObjRef obj_ref1;
            var    rc1 = RhinoGet.GetOneObject("first curve", true, ObjectType.Curve, out obj_ref1);

            if (rc1 != Result.Success)
            {
                return(rc1);
            }
            Curve curve_a = null;

            if (obj_ref1 != null)
            {
                curve_a = obj_ref1.Curve();
            }
            if (curve_a == null)
            {
                return(Result.Failure);
            }

            // Since you already selected a curve if you don't unselect it
            // the next GetOneObject won't stop as it considers that curve
            // input, i.e., curveA and curveB will point to the same curve.
            // Another option would be to use an instance of Rhino.Input.Custom.GetObject
            // instead of Rhino.Input.RhinoGet as GetObject has a DisablePreSelect() method.
            doc.Objects.UnselectAll();

            ObjRef obj_ref2;
            var    rc2 = RhinoGet.GetOneObject("second curve", true, ObjectType.Curve, out obj_ref2);

            if (rc2 != Result.Success)
            {
                return(rc2);
            }
            Curve curve_b = null;

            if (obj_ref2 != null)
            {
                curve_b = obj_ref2.Curve();
            }
            if (curve_b == null)
            {
                return(Result.Failure);
            }

            var tolerance = doc.ModelAbsoluteTolerance;

            double max_distance;
            double max_distance_parameter_a;
            double max_distance_parameter_b;
            double min_distance;
            double min_distance_parameter_a;
            double min_distance_parameter_b;

            DeviationConduit conduit;

            if (!Curve.GetDistancesBetweenCurves(curve_a, curve_b, tolerance, out max_distance,
                                                 out max_distance_parameter_a, out max_distance_parameter_b,
                                                 out min_distance, out min_distance_parameter_a, out min_distance_parameter_b))
            {
                RhinoApp.WriteLine("Unable to find overlap intervals.");
                return(Result.Success);
            }
            else
            {
                if (min_distance <= RhinoMath.ZeroTolerance)
                {
                    min_distance = 0.0;
                }
                var max_dist_pt_a = curve_a.PointAt(max_distance_parameter_a);
                var max_dist_pt_b = curve_b.PointAt(max_distance_parameter_b);
                var min_dist_pt_a = curve_a.PointAt(min_distance_parameter_a);
                var min_dist_pt_b = curve_b.PointAt(min_distance_parameter_b);

                conduit = new DeviationConduit(curve_a, curve_b, min_dist_pt_a, min_dist_pt_b, max_dist_pt_a, max_dist_pt_b)
                {
                    Enabled = true
                };
                doc.Views.Redraw();

                RhinoApp.WriteLine("Minimum deviation = {0}   pointA({1}), pointB({2})", min_distance, min_dist_pt_a, min_dist_pt_b);
                RhinoApp.WriteLine("Maximum deviation = {0}   pointA({1}), pointB({2})", max_distance, max_dist_pt_a, max_dist_pt_b);
            }

            var str = "";

            RhinoGet.GetString("Press Enter when done", true, ref str);
            conduit.Enabled = false;

            return(Result.Success);
        }
    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      doc.Objects.UnselectAll();

      ObjRef obj_ref1;
      var rc1 = RhinoGet.GetOneObject("first curve", true, ObjectType.Curve, out obj_ref1);
      if (rc1 != Result.Success)
        return rc1;
      Curve curve_a = null;
      if (obj_ref1 != null)
        curve_a = obj_ref1.Curve();
      if (curve_a == null)
        return Result.Failure;

      // Since you already selected a curve if you don't unselect it
      // the next GetOneObject won't stop as it considers that curve 
      // input, i.e., curveA and curveB will point to the same curve.
      // Another option would be to use an instance of Rhino.Input.Custom.GetObject
      // instead of Rhino.Input.RhinoGet as GetObject has a DisablePreSelect() method.
      doc.Objects.UnselectAll();

      ObjRef obj_ref2;
      var rc2 = RhinoGet.GetOneObject("second curve", true, ObjectType.Curve, out obj_ref2);
      if (rc2 != Result.Success)
        return rc2;
      Curve curve_b = null;
      if (obj_ref2 != null)
        curve_b = obj_ref2.Curve();
      if (curve_b == null)
        return Result.Failure;

      var tolerance = doc.ModelAbsoluteTolerance;

      double max_distance;
      double max_distance_parameter_a;
      double max_distance_parameter_b;
      double min_distance;
      double min_distance_parameter_a;
      double min_distance_parameter_b;

      DeviationConduit conduit;
      if (!Curve.GetDistancesBetweenCurves(curve_a, curve_b, tolerance, out max_distance, 
                out max_distance_parameter_a, out max_distance_parameter_b,
                out min_distance, out min_distance_parameter_a, out min_distance_parameter_b))
      {
        RhinoApp.WriteLine("Unable to find overlap intervals.");
        return Result.Success;
      }
      else
      {
        if (min_distance <= RhinoMath.ZeroTolerance)
          min_distance = 0.0;
        var max_dist_pt_a = curve_a.PointAt(max_distance_parameter_a);
        var max_dist_pt_b = curve_b.PointAt(max_distance_parameter_b);
        var min_dist_pt_a = curve_a.PointAt(min_distance_parameter_a);
        var min_dist_pt_b = curve_b.PointAt(min_distance_parameter_b);

        conduit = new DeviationConduit(curve_a, curve_b, min_dist_pt_a, min_dist_pt_b, max_dist_pt_a, max_dist_pt_b) {Enabled = true};
        doc.Views.Redraw();

        RhinoApp.WriteLine("Minimum deviation = {0}   pointA({1}), pointB({2})", min_distance, min_dist_pt_a, min_dist_pt_b);
        RhinoApp.WriteLine("Maximum deviation = {0}   pointA({1}), pointB({2})", max_distance, max_dist_pt_a, max_dist_pt_b);
      }

      var str = "";
      RhinoGet.GetString("Press Enter when done", true, ref str);
      conduit.Enabled = false;

      return Result.Success;
    }