1

我正在将 Python 脚本转换为 C#,并且在此过程中偶尔会遇到问题。这一次是将一个点从一个位置重新定位到另一个位置。在 python 脚本中,它是我不知道如何转换的方法的第二行。我已经查看了 Rhino 文档,但我仍然感到困惑。

def move(self):
    self.trailPts.append(self.pos)
    self.pos = rs.PointCoordinates(rs.MoveObject(self.id, self.vec))

这是我目前所处的位置:

Transform trans = new Transform(Transform.Translation(Vec));
Pos = PointID.Transform(Pos, trans, true);

但这是不正确的。我在第 2 行遇到了 Transform 的过载错误。任何帮助都会很棒。谢谢!

这也是我的 C# 构造函数:

public Agent(Point3d pos, Vector3d vec, Point3d pointID, List<Point3d> listOfAgents, List<Point3d> navPoints, List<Circle> pipeProfiles)
        {
            Pos = pos;
            Vec = vec;
            PointID = pointID;
            ListOfAgents = listOfAgents;
            NavPoints = navPoints;
            PipeProfiles = pipeProfiles;

            TrailPoints.Add(new Point3d(Pos));
        }

和原来的python构造函数:

 def __init__(self, POS, VEC, POINTID, LISTOFAGENTS, NAVPOINTS, PIPEPROFILES):
        self.pos = POS
        self.vec = VEC
        self.id = POINTID
        self.list = LISTOFAGENTS
        self.nav = NAVPOINTS
        self.trailPts = []
        self.trailPts.append(self.pos)
        self.trailID = "empty"
        self.pipeProfiles = PIPEPROFILES
        print("made an agent")
4

1 回答 1

0

MoveObject()是一个包装器,用于MoveObjects返回第一个结果值而不是列表。查看RhinoScript 的实现,MoveObjects我们看到:

xf = Rhino.Geometry.Transform.Translation(translation)
rc = TransformObjects(object_ids, xf)
return rc

translation对象在哪里Vector3d

然后看着TransformObjects 电话归结为

scriptcontext.doc.Objects.Transform(id, xf, True)

PointCoordinates()函数获取MoveObject()返回的 GUID 并再次找到您的对象,然后为您提供该对象的几何位置(通过coercegeometry()并提供.Geometry一个Point实例);跳过测试和函数以转换可能的其他可接受的类型,这归结为:

scriptcontext.doc.Objects.Find(id).Geometry.Location

将这些转换为 RhinoCommon 对象将是:

using Rhino.Geometry;
using System;

Transform xf = Transform.Translation(vec);
id = doc.Objects.Transform(id, xf, true);
Point pos = doc.Objects.Find(id).Geometry as Point
Point3d pos3d = pos.Location;

wherevec是一个Rhino.Geometry.Vector3d实例和id一个对象引用。

另请参阅Rhino.Geometry.Transform.Translation()文档,其中包括 C# 示例和ObjectTable.Transform方法

注意Rhino.Geometry.Transform.Translation()静态方法已经返回了一个Transform实例,这里不需要使用new Transform()。而且没有PointID类型;也许你在找Rhino.Geometry.Point3D?但是,该Point3D.Transform()方法将在该点上运行,而不是在具有给定id.

于 2018-11-06T15:19:35.107 回答