def assemble(list_conns):
    bricks_ = bricks.Bricks(10000, '0')

    z = 0
    dir_cur = 0

    brick_ = brick.Brick()
    brick_.set_position([0, 0, z])
    brick_.set_direction(dir_cur)

    bricks_.add(brick_)

    for conn in list_conns:
        z += 1
        print(list_rules[conn])

        dir_cur = (dir_cur + list_rules[conn][1][0]) % 2

        brick_ = brick.Brick()
        brick_.set_position(list_rules[conn][1][1] + [z])
        brick_.set_direction(dir_cur)

        bricks_.add(brick_)

    return bricks_
def align_bricks(bricks_):
    list_bricks = bricks_.get_bricks()

    list_positions = []
    for brick_ in list_bricks:
        list_positions.append(brick_.get_position())
    positions = np.array(list_positions)

    trans = np.array([
        np.min(positions[:, 0]),
        np.min(positions[:, 1]),
        np.min(positions[:, 2]),
    ])

    list_bricks_new = []
    for brick_ in list_bricks:
        position_new = copy.deepcopy(brick_.get_position())
        direction_new = copy.deepcopy(brick_.get_direction())

        position_new -= trans

        brick_new = brick.Brick()
        brick_new.set_position(position_new)
        brick_new.set_direction(direction_new)
        list_bricks_new.append(brick_new)

    bricks_aligned = bricks.Bricks(bricks_.get_length())
    bricks_aligned.bricks = list_bricks_new
    bricks_aligned.validate_all()

    return bricks_aligned
Example #3
0
def test_set_configuration():
    brick_ = brick.Brick()

    assert brick_.get_position() == None

    pos = [5, -2, 3]
    direc = 1
    config = {
        'position': pos,
        'direction': direc
    }

    brick_.set_configuration(config)
    assert np.all(brick_.get_position() == np.array(pos))

    vertices = np.array([
        [7.0, -1.0, 3.0],
        [7.0, -3.0, 3.0],
        [3.0, -1.0, 3.0],
        [3.0, -3.0, 3.0],
        [7.0, -1.0, 4.0],
        [7.0, -3.0, 4.0],
        [3.0, -1.0, 4.0],
        [3.0, -3.0, 4.0],
    ])
    print(brick_.get_vertices())
    assert np.all(brick_.get_vertices() == vertices)
    def get_possible_contacts(self, str_type=None):
        list_bricks = self.get_bricks()
        new_bricks = []

        for brick_ in list_bricks:
            cur_type = get_cur_type(copy.deepcopy(brick_))

            if self.str_type == 'mixed' and str_type is None:
                ind_rules = np.random.choice(len(rules.ALL_TYPES))
                str_type = rules.ALL_TYPES[ind_rules]

                rules_, _, size_upper, size_lower = get_rules(cur_type, str_type)
            elif self.str_type == 'mixed' and str_type is not None:
                rules_, _, size_upper, size_lower = get_rules(cur_type, str_type)
            else:
                rules_, _, size_upper, size_lower = get_rules(cur_type, self.str_type)

            cur_position = brick_.get_position()
            cur_direction = brick_.get_direction()

            for rule in rules_:
                translations = rule['translations']
                direction = rule['direction']
                
                for trans in translations:
                    # upper
                    new_brick = brick.Brick(size_upper=size_upper, size_lower=size_lower)
                    new_brick.set_position(cur_position + np.concatenate((np.array(trans), [new_brick.height])))
                    new_brick.set_direction((cur_direction + direction) % 2)
                    if new_brick.get_position()[2] >= 0:
                        new_bricks.append(new_brick)

                    # lower
                    new_brick = brick.Brick(size_upper=size_upper, size_lower=size_lower)
                    new_brick.set_position(cur_position + np.concatenate((np.array(trans), [-1 * new_brick.height])))
                    new_brick.set_direction((cur_direction + direction) % 2)
                    if new_brick.get_position()[2] >= 0:
                        new_bricks.append(new_brick)

        new_bricks = self._validate_bricks(new_bricks)
        
        return new_bricks
Example #5
0
def test_create_brick():
    brick_ = brick.Brick()

    assert brick_.get_position() == None
    assert brick_.get_direction() == 0
    assert brick_.get_vertices() == None

    size_upper, size_lower, height = brick_.get_size()
    assert np.all(size_upper == [2, 4])
    assert np.all(size_lower == [2, 4])
    assert height == 1
    def _sample_one(self, str_type=None):
        list_bricks = self.get_bricks()
        ind_brick = np.random.choice(self.get_length())
        brick_sampled = list_bricks[ind_brick]

        cur_type = get_cur_type(copy.deepcopy(brick_sampled))

        cur_position = brick_sampled.get_position()
        cur_direction = brick_sampled.get_direction()

        if self.str_type == 'mixed' and str_type is None:
            ind_rules = np.random.choice(len(rules.ALL_TYPES))
            str_type = rules.ALL_TYPES[ind_rules]

            rules_, probs_rules_, size_upper, size_lower = get_rules(cur_type, str_type)
        elif self.str_type == 'mixed' and str_type is not None:
            rules_, probs_rules_, size_upper, size_lower = get_rules(cur_type, str_type)
        else:
            rules_, probs_rules_, size_upper, size_lower = get_rules(cur_type, self.str_type)

        ind_rule = np.random.choice(len(rules_), p=probs_rules_)
        cur_rule = rules_[ind_rule]

        translations = copy.deepcopy(cur_rule['translations'])
        direction = copy.deepcopy(cur_rule['direction'])

        ind_trans = np.random.choice(len(translations))
        trans = translations[ind_trans]

        if cur_direction == 1:
            angle = np.pi * 3.0 / 2.0
            trans = np.dot(np.array([
                    [np.cos(angle), -np.sin(angle)],
                    [np.sin(angle), np.cos(angle)],
                ]), trans)

        upper_lower = np.random.choice(2) * 2.0 - 1.0

        new_brick = brick.Brick(size_upper=size_upper, size_lower=size_lower)
        new_brick.set_position(cur_position + np.concatenate((np.array(trans), [new_brick.height * upper_lower])))
        new_brick.set_direction((cur_direction + direction) % 2)

        new_brick = self._validate_bricks([new_brick])

        if len(new_brick) == 0:
            return None
        else:
            return new_brick[0]
def convert_to_bricks(X, A):
    list_bricks = []
    for bx, ba in zip(X, A):
        brick_ = brick.Brick()
        brick_.set_position(bx[:3])
        brick_.set_direction(bx[3])

        list_bricks.append(brick_)

    bricks_ = Bricks(len(list_bricks))
    bricks_.bricks = list_bricks
    try:
        bricks_.validate_all()
    except:
        bricks_ = None

    return bricks_
def align_bricks_to_origin(bricks_):
    list_bricks = bricks_.get_bricks()

    list_positions = []
    for brick_ in list_bricks:
        list_positions.append(brick_.get_position())
    positions = np.array(list_positions)
    bottoms = np.where(positions[:, 2] == np.min(positions[:, 2]))[0]
    ind_origin = np.random.choice(bottoms, 1)
    ind_origin = ind_origin[0]

    brick_origin = copy.deepcopy(list_bricks[ind_origin])

    list_bricks_new = []
    for brick_ in list_bricks:
        position_new = copy.deepcopy(brick_.get_position())
        direction_new = copy.deepcopy(brick_.get_direction())

        position_new -= brick_origin.get_position()

        if brick_origin.get_direction() == 1:
            angle_rotated = np.pi * 1.0 / 2.0
            position_new_ = copy.deepcopy(position_new)
            position_new_.astype(np.float)
            position_new.astype(np.float)

            position_new[0] = np.round(np.cos(angle_rotated) * position_new_[0]) - np.round(np.sin(angle_rotated) * position_new_[1])
            position_new[1] = np.round(np.sin(angle_rotated) * position_new_[0]) + np.round(np.cos(angle_rotated) * position_new_[1])

            position_new = np.round(position_new)

            direction_new = (direction_new + brick_origin.get_direction()) % 2

        brick_new = brick.Brick()
        brick_new.set_position(position_new)
        brick_new.set_direction(direction_new)
        list_bricks_new.append(brick_new)

    bricks_aligned = bricks.Bricks(bricks_.get_length())
    bricks_aligned.bricks = list_bricks_new
    bricks_aligned.validate_all()

    return bricks_aligned
Example #9
0
def test_set_position():
    brick_ = brick.Brick()

    assert brick_.get_position() == None

    pos = [1, 2, 1]
    brick_.set_position(pos)
    assert np.all(brick_.get_position() == np.array(pos))

    vertices = np.array([
        [2.0, 4.0, 1.0],
        [2.0, 0.0, 1.0],
        [0.0, 4.0, 1.0],
        [0.0, 0.0, 1.0],
        [2.0, 4.0, 2.0],
        [2.0, 0.0, 2.0],
        [0.0, 4.0, 2.0],
        [0.0, 0.0, 2.0],
    ])
    print(brick_.get_vertices())
    assert np.all(brick_.get_vertices() == vertices)
Example #10
0
def test_set_direction():
    brick_ = brick.Brick()

    assert brick_.get_position() == None

    pos = [1, 2, 1]
    brick_.set_position(pos)
    brick_.set_direction(1)
    assert np.all(brick_.get_position() == np.array(pos))

    vertices = np.array([
        [3.0, 3.0, 1.0],
        [3.0, 1.0, 1.0],
        [-1.0, 3.0, 1.0],
        [-1.0, 1.0, 1.0],
        [3.0, 3.0, 2.0],
        [3.0, 1.0, 2.0],
        [-1.0, 3.0, 2.0],
        [-1.0, 1.0, 2.0],
    ])
    print(brick_.get_vertices())
    assert np.all(brick_.get_vertices() == vertices)
import time
import copy

from geometric_primitives import brick
from geometric_primitives import bricks
from geometric_primitives import rules
from geometric_primitives import utils_io
from geometric_primitives import utils_meshes


size_brick = [2, 4]

brick_ = brick.Brick(size_upper=size_brick, size_lower=size_brick)
brick_.set_position([0, 0, 0])
brick_.set_direction(0)

bricks_ = bricks.Bricks(100, 'mixed')
bricks_.add(brick_)

list_bricks = bricks_.get_possible_contacts(str_type='2')

for elem in list_bricks:
    bricks_copied = copy.deepcopy(bricks_)
    bricks_copied.add(elem)

    mesh_bricks, mesh_cubes = utils_meshes.get_mesh_bricks(bricks_copied)
    utils_io.visualize(mesh_bricks)
Example #12
0
import time
import copy

from geometric_primitives import brick
from geometric_primitives import bricks
from geometric_primitives import rules
from geometric_primitives import utils_io
from geometric_primitives import utils_meshes

brick_ = brick.Brick()
brick_.set_position([0, 0, 0])
brick_.set_direction(0)

bricks_ = bricks.Bricks(100, 'mixed')
bricks_.add(brick_)

for ind in range(0, 30):
    brick_ = bricks_.sample()[0]
    bricks_.add(brick_)
    print(brick_.get_position(), brick_.get_direction())

mesh_bricks, mesh_cubes = utils_meshes.get_mesh_bricks(bricks_)
utils_io.visualize(mesh_bricks)
Example #13
0
import time
import copy

from geometric_primitives import brick
from geometric_primitives import bricks
from geometric_primitives import rules
from geometric_primitives import utils_io
from geometric_primitives import utils_meshes

brick_ = brick.Brick(size_upper=[2, 2], size_lower=[2, 2])
brick_.set_position([0, 0, 0])
brick_.set_direction(0)

bricks_ = bricks.Bricks(100, '1')
bricks_.add(brick_)

for ind in range(0, 10):
    brick_ = bricks_.sample()[0]
    bricks_.add(brick_)
    print(brick_.get_position(), brick_.get_direction())

    mesh_bricks, mesh_cubes = utils_meshes.get_mesh_bricks(bricks_)
    utils_io.visualize(mesh_bricks)