Ejemplo n.º 1
0
def create_upper_leg():
    l1, l2 = 50, 80
    pts = [(0, 0), (0, height / 2), (l1, height / 2 - 5), (l2, 0)]
    upper_leg_hole = (l2 - 10, 0)

    upper_leg = (
        cq.Workplane()
        .polyline(pts)
        .mirrorX()
        .pushPoints([upper_leg_hole])
        .circle(diam / 2 + tol)
        .extrude(thickness)
        .edges("|Z and (not <X)")
        .fillet(4)
    )

    axle = (
        cq.Workplane("XZ", origin=(0, height / 2 + thickness + tol, thickness / 2))
        .circle(diam / 2)
        .extrude(2 * (height / 2 + thickness + tol))
    )

    upper_leg = upper_leg.union(axle)

    # tag mating points
    upper_leg.faces(">Z").edges(cq.NearestToPointSelector(upper_leg_hole)).tag("top")
    upper_leg.faces("<Z").edges(cq.NearestToPointSelector(upper_leg_hole)).tag("bottom")

    return upper_leg
Ejemplo n.º 2
0
def make_ball_reactor_seg(outputs=['stp', 'neutronics', 'svg', 'stl', 'html']):

    my_reactor = paramak.SegmentedBlanketBallReactor(
        inner_bore_radial_thickness=5,
        inboard_tf_leg_radial_thickness=25,
        center_column_shield_radial_thickness=45,
        divertor_radial_thickness=150,
        inner_plasma_gap_radial_thickness=50,
        plasma_radial_thickness=300,
        outer_plasma_gap_radial_thickness=50,
        firstwall_radial_thickness=15,
        blanket_radial_thickness=50,
        blanket_rear_wall_radial_thickness=30,
        elongation=2,
        triangularity=0.55,
        number_of_tf_coils=16,
        rotation_angle=180,
        pf_coil_radial_thicknesses=[50, 50, 50, 50],
        pf_coil_vertical_thicknesses=[50, 50, 50, 50],
        pf_coil_to_rear_blanket_radial_gap=50,
        pf_coil_to_tf_coil_radial_gap=50,
        outboard_tf_coil_radial_thickness=100,
        outboard_tf_coil_poloidal_thickness=50,
        gap_between_blankets=30,
        number_of_blanket_segments=15,
        blanket_fillet_radius=15,
    )

    # finds the correct edges to fillet
    x_coord = my_reactor.major_radius
    front_face = my_reactor._blanket.solid.faces(
        cq.NearestToPointSelector((x_coord, 0, 0)))
    front_edge = front_face.edges(cq.NearestToPointSelector((x_coord, 0, 0)))
    front_edge_length = front_edge.val().Length()
    my_reactor._blanket.solid = my_reactor._blanket.solid.edges(
        paramak.EdgeLengthSelector(front_edge_length)).fillet(
        my_reactor.blanket_fillet_radius)

    # cuts away the breeder zone
    my_reactor._blanket.solid = my_reactor._blanket.solid.cut(
        my_reactor._blanket.solid)

    my_reactor._blanket.export_stp('firstwall_with_fillet.stp')

    if 'stp' in outputs:
        my_reactor.export_stp(output_folder='SegmentedBlanketBallReactor')
    if 'neutronics' in outputs:
        my_reactor.export_neutronics_description(
            'SegmentedBlanketBallReactor/manifest.json')
    if 'svg' in outputs:
        my_reactor.export_svg('SegmentedBlanketBallReactor/reactor.svg')
    if 'stl' in outputs:
        my_reactor.export_stl(output_folder='SegmentedBlanketBallReactor')
    if 'html' in outputs:
        my_reactor.export_html('SegmentedBlanketBallReactor/reactor.html')
Ejemplo n.º 3
0
def create_base(rotate=False):
    x1, x2 = 0.63, 0.87
    base_holes = {
        "right_back": (-x1 * length, -x1 * width),
        "right_middle": (0, -x2 * width),
        "right_front": (x1 * length, -x1 * width),
        "left_back": (-x1 * length, x1 * width),
        "left_middle": (0, x2 * width),
        "left_front": (x1 * length, x1 * width),
    }
    stand_holes = {
        "front_stand": (0.75 * length, 0),
        "back_stand": (-0.8 * length, 0)
    }

    workplane = cq.Workplane()
    if rotate:
        workplane = workplane.transformed(rotate=(30, 45, 60))

    base = (workplane.ellipseArc(
        length, width, 25, -25, startAtCurrent=False).close().pushPoints(
            list(base_holes.values())).circle(diam / 2 + tol).moveTo(
                *stand_holes["back_stand"]).rect(
                    thickness + 2 * tol, width / 2 +
                    2 * tol).moveTo(*stand_holes["front_stand"]).rect(
                        thickness + 2 * tol,
                        width / 2 + 2 * tol).extrude(thickness))
    base

    # tag mating points
    if rotate:
        l_coord = lambda vec2d: workplane.plane.toWorldCoords(vec2d).toTuple()
        l_nps = lambda vec2d: cq.NearestToPointSelector(l_coord(vec2d))

        base.faces(f"<{l_coord((0,0,1))}").tag("bottom")
        base.faces(f">{l_coord((0,0,1))}").tag("top")

        for name, hole in base_holes.items():
            base.faces(f"<{l_coord((0,0,1))}").edges(l_nps(hole)).tag(name)

        for name, hole in stand_holes.items():
            base.faces(f"<{l_coord((0,0,1))}").wires(l_nps(hole)).tag(name)
    else:
        base.faces("<Z").tag("bottom")
        base.faces(">Z").tag("top")

        for name, hole in base_holes.items():
            base.faces("<Z").wires(cq.NearestToPointSelector(hole)).tag(name)

        for name, hole in stand_holes.items():
            base.faces("<Z").wires(cq.NearestToPointSelector(hole)).tag(name)

    return base
Ejemplo n.º 4
0
    def _make_blankets_layers(self):
        super()._make_blankets_layers()
        azimuth_placement_angles = np.linspace(
            0, 360, self.number_of_blanket_segments, endpoint=False)
        thin_cutter = paramak.BlanketCutterStar(
            distance=self.gap_between_blankets,
            azimuth_placement_angle=azimuth_placement_angles)

        thick_cutter = paramak.BlanketCutterStar(
            distance=self.gap_between_blankets +
            2 * self.firstwall_radial_thickness,
            azimuth_placement_angle=azimuth_placement_angles)

        self._blanket.cut = [self._center_column_cutter, thick_cutter]

        if self.blanket_fillet_radius != 0:
            # tried firstwall start radius here already
            x = self.major_radius + 1
            front_face_b = self._blanket.solid.faces(
                cq.NearestToPointSelector((0, x, 0)))
            front_edge_b = front_face_b.edges(
                cq.NearestToPointSelector((0, x, 0)))
            front_edge_length_b = front_edge_b.val().Length()
            self._blanket.solid = self._blanket.solid.edges(
                paramak.EdgeLengthSelector(front_edge_length_b)).fillet(
                self.blanket_fillet_radius)
        self._firstwall.thickness += self.blanket_radial_thickness
        self._firstwall.cut = [
            self._center_column_cutter,
            thin_cutter,
            self._blanket]

        # TODO this segfaults at the moment but works as an opperation on the
        # reactor after construction in jupyter
        # tried different x values and (0, x, 0)
        # noticed that it much quicker as a post process so perhaps some
        # unwanted looping is happening
        # if self.blanket_fillet_radius != 0:
        #     x = self.major_radius # tried firstwall start radius here already
        #     front_face = \
        #       self._firstwall.solid.faces(
        #           cq.NearestToPointSelector((x, 0, 0)))
        #     print('found front face')
        #     front_edge = front_face.edges(
        #           cq.NearestToPointSelector((x, 0, 0)))
        #     print('found front edge')
        #     front_edge_length = front_edge.val().Length()
        #     print('found front edge length', front_edge_length)
        #     self._firstwall.solid = self._firstwall.solid.edges(
        #         paramak.EdgeLengthSelector(front_edge_length)).fillet(self.blanket_fillet_radius)
        # print('finished')

        return [self._firstwall, self._blanket, self._blanket_rear_wall]
Ejemplo n.º 5
0
    def make(self):
        corner_protection = 16
        s1 = self.leg_s1
        s2 = self.leg_s2
        s3 = self.leg_s3
        s4 = self.leg_s4

        x0 = self.cx + self.ins_l / 2.0 + corner_protection
        x1 = self.cx - self.ins_l / 2.0 + corner_protection
        x2 = x1 - 25
        x3 = 100
        x4 = 80
        x5 = x3 - 55

        y0 = self.height
        y2 = self.height_1 - self.shelf_t + self.ins_d
        y1 = y2 - 12
        y3 = y2 - self.ins_d
        y5 = self.height_2 - self.ins_d
        y4 = y5 + self.ins_d
        y6 = y5 + 12
        y7 = y0 - 30

        m = cq.Workplane("XZ", origin = (-corner_protection, self.leg_t / 2, -self.height)).moveTo(0, y0).lineTo(x4, y0).sagittaArc((x2, y1), s1) \
            .lineTo(x1, y1).lineTo(x1, y2).lineTo(x0, y2).lineTo(x0, y3).sagittaArc((x0, y4), s2) \
            .lineTo(x0, y5).lineTo(x1, y5).lineTo(x1, y6).lineTo(x2, y6).sagittaArc((x3, 0), s3) \
            .lineTo(x5, 0).sagittaArc((0, y7), s4) \
            .close().extrude(self.leg_t)

        m = m.edges("|Y").edges(
            cq.NearestToPointSelector(
                (0 - corner_protection, 0, y7 - self.height))).fillet(100)
        m = m.edges("|Y").edges(
            cq.NearestToPointSelector(
                (x2 - corner_protection, 0, y1 - self.height))).fillet(20)
        m = m.edges("|Y").edges(
            cq.NearestToPointSelector(
                (x1 - corner_protection, 0, y1 - self.height))).fillet(8)
        m = m.edges("|Y").edges(
            cq.NearestToPointSelector(
                (x1 - corner_protection, 0, y6 - self.height))).fillet(8)
        m = m.edges("|Y").edges(
            cq.NearestToPointSelector(
                (x2 - corner_protection, 0, y6 - self.height))).fillet(20)
        m = m.edges("%CIRCLE").fillet(7)

        hole = cq.Workplane(
            "XY",
            origin=(self.cx, 0, -self.height)).circle(4).extrude(self.height)
        m = m.cut(hole)

        return m
Ejemplo n.º 6
0
def cslot(length=100):
    out = (cq.Workplane().tag("base").box(
        dims.outer.x, dims.base_depth, length,
        centered=(True, False, False)).workplaneFromTagged("base").center(
            dims.outer.x / 2 - dims.base_depth / 2,
            0).box(dims.base_depth,
                   dims.outer.y,
                   length,
                   centered=(True, False,
                             False)).workplaneFromTagged("base").center(
                                 -dims.outer.x / 2 + dims.base_depth / 2,
                                 0).box(dims.base_depth,
                                        dims.outer.y,
                                        length,
                                        centered=(True, False,
                                                  False)).tag("unslotted"))
    points = []
    for idx in range(4):
        points.append((
            -dims.outer.x / 2 + dims.base_depth / 2 +
            idx * dims.base_depth  # x
            ,
            0  # y
            ,
            0  # rotation
        ))
    for side in [-1, 1]:
        for idx in range(2):
            points.append(
                (side * dims.outer.x / 2,
                 dims.base_depth / 2 + idx * dims.base_depth, 180 - 90 * side))
    for xval, yval, rot in points:
        out = out.cut(cq.Workplane().center(xval, yval).tag("centered").hLine(
            9.16 / 2).polarLine(4, 45 + 90).hLineTo(0).mirrorY(
            ).extrude(length).workplaneFromTagged("centered").center(
                0, 1.8 + 1.5 / 2).rect(
                    11,
                    1.5, centered=True).extrude(length).workplaneFromTagged(
                        "centered").center(0, 1.8 + 4.3 / 2).rect(
                            6.5, 4.3,
                            centered=True).extrude(length).edges("|Z").edges(
                                cq.NearestToPointSelector(
                                    (xval + 6.5 / 2, yval + 1.8 + 1.5,
                                     0))).chamfer(2).edges("|Z").edges(
                                         cq.NearestToPointSelector(
                                             (xval - 6.5 / 2, yval + 1.8 + 1.5,
                                              0))).chamfer(2).rotate(
                                                  (xval, yval, 0),
                                                  (xval, yval, 1), rot))
    return out
def make_link(length, width=2, height=1):
    link = (cq.Workplane("YZ").rect(length + 4, width + 2).pushPoints(
        ((-length / 2, 0),
         (length / 2, 0))).circle(1).extrude(height).edges("|X").fillet(1.99))
    link.faces(">X").wires(cq.NearestToPointSelector(
        (0, length / 2))).tag("mate")
    return link
Ejemplo n.º 8
0
def create_lower_leg():
    w, l1, l2 = 15, 20, 120
    pts = [(0, 0), (l1, w), (l2, 0)]
    lower_leg_hole = (l1 - 10, 0)

    lower_leg = (cq.Workplane().polyline(pts).mirrorX().pushPoints([
        lower_leg_hole
    ]).circle(diam / 2 + tol).extrude(thickness).edges("|Z").fillet(5))

    # tag mating points
    lower_leg.faces(">Z").edges(
        cq.NearestToPointSelector(lower_leg_hole)).tag("top"),
    lower_leg.faces("<Z").edges(
        cq.NearestToPointSelector(lower_leg_hole)).tag("bottom")

    return lower_leg
Ejemplo n.º 9
0
cq.exporters.export(box.rotate((0, 0, 0), (0, 1, 0), -90), "box.stl")
cq.exporters.export(box.rotate((0, 0, 0), (0, 1, 0), -90), "box.step")

show_object(box)

if GEARS:
    g = gear.spur(mod,teeth,bore,width,helixAngle)\
        .rotate((0,0,0),(0,1,0),90).translate((-l/2,0,0))

    vpts = [(-l / 2, od / 2 + d2), (0, od / 2 - d2), (l / 2, od / 2 + d2)]
    apts = [(-l / 2, od / 2 - d2), (0, od / 2 + d2), (l / 2, od / 2 - d2)]

    a = WP().polyline(vpts).close()
    b = WP().polyline(apts).close()
    a = a.revolve(360,(0,0,0),(1,0,0)).edges("%circle")\
        .edges(cq.NearestToPointSelector((0,od/2,0))).fillet(2)\

    w = (2.5**2 - 1.9**2)**0.5

    b = b.revolve(360,(0,0,0),(1,0,0)).edges("%circle")\
        .edges(cq.NearestToPointSelector((0,od/2,0))).fillet(3)

    a = g.cut(a)
    b = g.union(b)

    b = b.cut(WP("YZ").circle(10 / 2).extrude(l, both=True))
    a = a.cut(
        WP("YZ").moveTo(1.9, -w).threePointArc(
            (-2.5, 0), (1.9, w)).close().extrude(l, both=True))

    b = b.translate((0, od, 0))
Ejemplo n.º 10
0
    "back",
    back.faces("<Z", tag="unslotted").val(),
    "bracket",
    bracket_module.bracket.faces(">Z").val(),
    "Axis",
)

clamp = clamp_module.clamp.rotate((0, 0, 0), (0, 0, 1), 180)
assy.add(clamp, name="clamp")
assy.constrain("bracket@faces@<Y", "clamp@faces@>Y", "Plane")
assy.constrain("bracket@faces@<Z", "clamp@faces@>Z", "Axis")

spindle = spindle_module.spindle
assy.add(spindle, name="spindle", color=cq.Color(0.9, 0.7, 0.8))
spindle_lower_face = (spindle.faces(
    cq.NearestToPointSelector(
        (0, 0, dims.spindle.body.length / 2))).edges("<Z").val())
clamp_lower_face = clamp.faces("<Z").edges("%CIRCLE").val()
assy.constrain(
    "clamp",
    clamp_lower_face,
    "spindle",
    spindle_lower_face.translate((0, 0, dims.spindle.body.clamp_end_offset)),
    "Plane",
)

vac_brack = vac_brack_module.bracket
assy.add(vac_brack, name="vac_brack", color=cq.Color(0.2, 0.2, 0.2, 0.8))
backpoint2 = back.faces("<Z", tag="unslotted").edges("<Y").vertices(">X").val()
vac_brack_point = vac_brack.faces("<Z").edges(">Y").vertices(">X").val()
assy.constrain("back", backpoint2, "vac_brack", vac_brack_point, "Point")
assy.constrain("back?unslotted@faces@<Z", "vac_brack@faces@>Z", "Axis")
Ejemplo n.º 11
0
disk = cq.Workplane().circle(r_disk + 2 * nr).extrude(thickness)
nipple = cq.Workplane().circle(nr).extrude(thickness)
disk = disk.cut(nipple).union(nipple.translate((r_disk, 0, thickness)))

pivot_base = cq.Workplane().circle(2 * nr).extrude(thickness)
base = (cq.Workplane().rect(
    6 * nr + dist_pivot, 6 * nr).extrude(thickness).translate(
        (dist_pivot / 2, 0,
         0)).union(nipple.translate(
             (dist_pivot, 0,
              thickness))).union(pivot_base.translate(
                  (0, 0,
                   thickness))).union(nipple.translate(
                       (0, 0, 2 * thickness))).edges("|Z").fillet(3))
base.faces(">Z[-2]").wires(cq.NearestToPointSelector(
    (dist_pivot + r_disk, 0))).tag("mate")

slot = (cq.Workplane().rect(2 * r_disk, 2 * nr).extrude(thickness).union(
    nipple.translate(
        (-r_disk, 0, 0))).union(nipple.translate(
            (r_disk - 1e-9, 0, 0))).translate((dist_pivot, 0, 0)))

arm = (cq.Workplane().rect(
    4 * nr + (r_disk + dist_pivot),
    4 * nr).extrude(thickness).edges("|Z").fillet(3).translate(
        ((r_disk + dist_pivot) / 2, 0, 0)).cut(nipple).cut(slot))
arm.faces(">Z").wires(cq.NearestToPointSelector((0, 0))).tag("mate")


def create_disk_arm():
    L = lambda *args: cq.Location(cq.Vector(*args))
Ejemplo n.º 12
0
            dims.brace.width + dims.chimney.mountface.width, both=True))
cutters.append(
    cq.Workplane('YZ').moveTo(
        dims.brace.mount_face[1], dims.chimney.mountface.height).lineTo(
            -dims.bracket.thick,
            dims.brace.profile1[2] + dims.chimney.mountface.height).hLineTo(
                dims.brace.mount_face[1]).close().extrude(
                    dims.brace.width + dims.chimney.mountface.width,
                    both=True))
for cutter in cutters:
    brace = brace.cut(cutter)
del cutter
cutters = []
brace = (brace.tag('mountbase').edges("|Z").edges(
    cq.NearestToPointSelector(
        (dims.brace.profile1[0] - dims.chimney.mountface.width / 2,
         -dims.bracket.thick, dims.brace.profile1[1] +
         dims.chimney.mountface.height / 2))).fillet(10).edges("|Z").edges(
             ">(1, 1, 0)").fillet(10 + dims.bracket.thick).faces(
                 ">Y[1]", tag='mountbase').workplane(
                     centerOption='ProjectedOrigin',
                     origin=(0, 0, dims.brace.profile1[2] +
                             dims.chimney.mountface.height /
                             2)).tag('bolt plane').pushPoints([
                                 (-30, 0), (30, 0)
                             ]).cboreHole(dims.vac_brack.hole.diam,
                                          dims.vac_brack.hole.cbore_diam,
                                          dims.vac_brack.hole.cbore_depth))
for sign in [-1, 1]:
    brace = (brace.faces(
        "<Y", tag="mountbase").workplane(centerOption='CenterOfMass').moveTo(
            sign *
Ejemplo n.º 13
0
                                                     dims.clamp.upper[1],
                                                     dims.clamp.dims[2],
                                                     centered=(True, False,
                                                               True)).
    workplaneFromTagged('lower').center(0, dims.clamp.upper[1]).vLine(
        -1)  # having some trouble with this shape not fusing with the base
    # shape and messing up the hole later
    .hLine(dims.clamp.shoulder.outer_x).vLine(1).lineTo(
        dims.clamp.shoulder.inner_x,
        dims.clamp.shoulder.delta_y).hLineTo(0).mirrorY().extrude(
            dims.clamp.dims[2] / 2, both=True))
edges = []
for side in [-1, 1]:
    for y0 in [
            0, dims.clamp.lower[1], dims.clamp.lower[1] + dims.clamp.upper[1]
    ]:
        edges.append(
            clamp.edges("|Z").edges(
                cq.NearestToPointSelector(
                    (side * dims.clamp.dims[0] / 2, y0, 0))).val())

clamp = (clamp.newObject(edges).chamfer(
    dims.clamp.lower[0] / 2 - dims.clamp.upper[0] / 2 -
    1e-3).workplaneFromTagged('base').workplane(
        offset=dims.clamp.dims[2] / 2 +
        1).center(dims.clamp.hole.pos[0], dims.clamp.hole.pos[1]).hole(
            dims.clamp.hole.diam, clean=False).faces("<Y").workplane().rect(
                *dims.clamp.bolt.spacing).vertices().hole(9.3))

obj = cq.Workplane().box(1, 1, 1).val()
Ejemplo n.º 14
0
from cadquery import Workplane as WP
import cadquery as cq
from math import sin , cos, pi

pts = []
np = 9
n = np*2

for p in range(n):
    if p %2:
        r= 100
    else:
        r=30
    pts.append((r*cos(2*pi/n*p),r*sin(2*pi/n*p)))

a = WP().polyline(pts).close().extrude(5)

for p in range(n):
    f = 10
    if p %2: f = 4
    a = a.edges("|Z").edges(cq.NearestToPointSelector(pts[p])).fillet(f)