请教:如何修改直线坐标(z坐标归零)?

    请教大神:我想通过直接修改直线起点和终点坐标的方式修改直线,可是想象中的代码无法工作,请问是什么原因造成的?

另外我不希望修改前后的GUID发生变化。

protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
Rhino.Input.Custom.GetObject get_a = new Rhino.Input.Custom.GetObject();
get_a.SetCommandPrompt(“选择直线”);
get_a.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
get_a.DeselectAllBeforePostSelect = false;
Rhino.Input.GetResult result_a;
result_a = get_a.Get();
if (get_a.CommandResult() != Rhino.Commands.Result.Success)
return get_a.CommandResult();

        Rhino.DocObjects.ObjRef objref_a = get_a.Object(0);
        Rhino.DocObjects.RhinoObject obj_a = objref_a.Object();
        if (obj_a == null)
            return Rhino.Commands.Result.Failure;
        Rhino.Geometry.Curve a = objref_a.Curve();
        if (a == null)
            return Rhino.Commands.Result.Failure;
        obj_a.Select(false);

        Rhino.Geometry.Point3d Pa_s = a.PointAtStart;
        Rhino.Geometry.Point3d Pa_e = a.PointAtEnd;

        //将z坐标设置成0,不希望修改前后的GUID发生变化

a.SetStartPoint(new Rhino.Geometry.Point3d(Pa_s.X, Pa_s.Y, 0));//不起作用
a.SetEndPoint(new Rhino.Geometry.Point3d(Pa_e.X, Pa_e.Y, 0));//不起作用

        // TODO: complete command.
        return Result.Success;
    }

你的方法没啥问题,你只需要替换一下物体和刷新一下视窗就行了。替换物体可以使用ObjectTable.Replace Method

    if(run)
    {
      var objs = Rhino.RhinoDoc.ActiveDoc.Objects;
      var obj = objs.FindId(guid);
      var curve = obj.Geometry as Curve;
      if(curve == null)return;
      var start = curve.PointAtStart;
      var end = curve.PointAtEnd;
      curve.SetStartPoint(new Point3d(start.X, start.Y, 0.0));
      curve.SetEndPoint(new Point3d(end.X, end.Y, 0.0));
      
      //替换物体
      objs.Replace(guid, curve);
      //刷新视窗
      Rhino.RhinoDoc.ActiveDoc.Views.Redraw();
    }

移动起点

1 个赞

解决了,谢谢大神赐教 :handshake: