def body_record(body): """Create a one-line ASCII data record to transmit for each body.""" position = "%f %f %f " % body.position xaxis, yaxis = quaternion_to_xaxis_yaxis(body.orientation) xvec = "%f %f %f " % tuple(xaxis) yvec = "%f %f %f\n" % tuple(yaxis) return position + xvec + yvec
def make_plane_list(self): """Return the received rigid body frames as a list of Plane or None (for missing data), one entry per rigid body stream.""" # convert each quaternion into a pair of X,Y basis vectors basis_vectors = [quaternion_to_xaxis_yaxis(rot) for rot in self.rotations] # Extract the X and Y axis basis elements into lists of Vector3d objects. xaxes = [Rhino.Geometry.Vector3d(*(basis[0])) for basis in basis_vectors] yaxes = [Rhino.Geometry.Vector3d(*(basis[1])) for basis in basis_vectors] # Generate either Plane or None for each coordinate frame. planes = [plane_or_null(origin, x, y) for origin,x,y in zip(self.positions, xaxes, yaxes)] return planes
def all_Planes(take, stride=1): """Return a DataTree of trajectories containing Planes or None. The tree has one branch for each rigid body; each branch contains a list of objects, either Plane for a valid sample or None if the sample is missing. Due to implicit ghpython conversions, the branches will end up described by paths {0;0},{0;1},{0;2}, etc. :param stride: the skip factor to apply for subsampling input (default=1, no subsampling) """ # Extract the origin position data and convert to Point3d objects within a # Python list structure. The subsampling is handled within the # comprehension. Note that missing data is returned as None. Each 'body' # in the take.rigid_bodies dictionary is a RigidBody object. body.positions # is a list with one element per frame, either None or [x,y,z]. origins = [ [rotated_point(pos) for pos in itertools.islice(body.positions, 0, len(body.positions), stride)] \ for body in take.rigid_bodies.values()] # Similar to extract a tree of quaternion trajectories. The leaves are # numbers, the dimensions are (num_bodies, num_frames, 4). quats = [ [rotated_orientation(rot) for rot in itertools.islice(body.rotations, 0, len(body.rotations), stride)] \ for body in take.rigid_bodies.values()] # Generate a tree of basis vector pairs (xaxis, yaxis). Dimensions are (num_bodies, num_frames, 2, 3) basis_vectors = [[quaternion_to_xaxis_yaxis(rot) for rot in body] for body in quats] # Extract the X axis basis elements into a tree of Vector3d objects with dimension (num_bodies, num_frames). xaxes = [[Rhino.Geometry.Vector3d(*(basis[0])) for basis in body] for body in basis_vectors] # Same for Y. yaxes = [[Rhino.Geometry.Vector3d(*(basis[1])) for basis in body] for body in basis_vectors] # Iterate over the 2D list structures, combining them into a 2D list of Plane objects. planes = [[ plane_or_null(origin, x, y) for origin, x, y in zip(os, xs, ys) ] for os, xs, ys in zip(origins, xaxes, yaxes)] # Recursively convert from a Python tree to a data tree. return list_to_tree(planes)
def all_Planes(take, stride=1): """Return a DataTree of trajectories containing Planes or None. The tree has one branch for each rigid body; each branch contains a list of objects, either Plane for a valid sample or None if the sample is missing. Due to implicit ghpython conversions, the branches will end up described by paths {0;0},{0;1},{0;2}, etc. :param stride: the skip factor to apply for subsampling input (default=1, no subsampling) """ # Extract the origin position data and convert to Point3d objects within a # Python list structure. The subsampling is handled within the # comprehension. Note that missing data is returned as None. Each 'body' # in the take.rigid_bodies dictionary is a RigidBody object. body.positions # is a list with one element per frame, either None or [x,y,z]. origins = [ [rotated_point(pos) for pos in itertools.islice(body.positions, 0, len(body.positions), stride)] \ for body in take.rigid_bodies.values()] # Similar to extract a tree of quaternion trajectories. The leaves are # numbers, the dimensions are (num_bodies, num_frames, 4). quats = [ [rotated_orientation(rot) for rot in itertools.islice(body.rotations, 0, len(body.rotations), stride)] \ for body in take.rigid_bodies.values()] # Generate a tree of basis vector pairs (xaxis, yaxis). Dimensions are (num_bodies, num_frames, 2, 3) basis_vectors = [[quaternion_to_xaxis_yaxis(rot) for rot in body] for body in quats] # Extract the X axis basis elements into a tree of Vector3d objects with dimension (num_bodies, num_frames). xaxes = [[Rhino.Geometry.Vector3d(*(basis[0])) for basis in body] for body in basis_vectors] # Same for Y. yaxes = [[Rhino.Geometry.Vector3d(*(basis[1])) for basis in body] for body in basis_vectors] # Iterate over the 2D list structures, combining them into a 2D list of Plane objects. planes = [[plane_or_null(origin, x, y) for origin,x,y in zip(os,xs,ys)] for os,xs,ys in zip(origins, xaxes, yaxes)] # Recursively convert from a Python tree to a data tree. return list_to_tree(planes)