def __init__(self, nema_size=17, base_motor_d=6., base_d=4., base_h=16., wall_thick=4., motor_thick=4., reinf_thick=4., motor_min_h=10., motor_max_h=20., motor_xtr_space=2., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., chmf_r=1., opt_sides=1, axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'base' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h self.motor_w = kcomp.NEMA_W[nema_size] self.motor_bolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] self.motor_bolt_d = kcomp.NEMA_BOLT_D[nema_size] self.base_motor_h = motor_thick + motor_max_h + 2 * bolt_wall_d + 30. # calculation of the bolt to hold the base to the profile self.boltshank_r_tol = kcomp.D912[bolt1_wall_d]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt1_wall_d]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt1_wall_d]['head_r'] self.bolthead_l = kcomp.D912[bolt1_wall_d]['head_l'] # calculation of the bolt wall d self.boltwallshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.boltwallhead_l = kcomp.D912[bolt_wall_d]['head_l'] self.boltwallhead_r = kcomp.D912[bolt_wall_d]['head_r'] self.washer_thick = kcomp.WASH_D125_T[bolt_wall_d] # calculation of the bolt wall separation self.max_bolt_wall_sep = self.motor_w - 2 * self.boltwallhead_r if bolt_wall_sep == 0: self.bolt_wall_sep = self.max_bolt_wall_sep elif bolt_wall_sep > self.max_bolt_wall_sep: logger.debug('bolt separation too large:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.max_bolt_wall_sep logger.debug('taking largest value:' + str(self.bolt_wall_sep)) elif bolt_wall_sep < 4 * self.boltwallhead_r: logger.debug('bolt separation too short:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.self.max_bolt_wall_sep logger.debug('taking smallest value:' + str(self.bolt_wall_sep)) # distance from the motor to the inner wall (in axis_d) self.motor_inwall_space = motor_xtr_space + self.boltwallhead_l + self.washer_thick # making the big box that will contain everything and will be cut self.tot_h = wall_thick + base_h + self.base_motor_h self.tot_d = base_d + 2 * self.bolthead_r if opt_sides == 0: self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space else: self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space + 4 * self.bolthead_r_tol + 8. # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(wall_thick + 2 * self.bolthead_r) self.h_o[3] = self.vec_h(wall_thick + base_h) self.h_o[4] = self.vec_h(wall_thick + base_h + motor_thick) self.h_o[5] = self.vec_h(wall_thick + base_h + motor_thick + motor_min_h) self.h_o[6] = self.vec_h(wall_thick + base_h + motor_thick) self.h_o[7] = self.vec_h(wall_thick + base_h + motor_thick + (motor_min_h + motor_max_h) / 4.) self.h_o[8] = self.vec_h(wall_thick + base_h + motor_thick + 2 * (motor_min_h + motor_max_h) / 4.) self.h_o[9] = self.vec_h(wall_thick + base_h + motor_thick + 3 * (motor_min_h + motor_max_h) / 4.) self.h_o[10] = self.vec_h(wall_thick + base_h + motor_thick + (motor_min_h + motor_max_h)) self.h_o[11] = self.vec_h(wall_thick + base_h + motor_thick + 5 * (motor_min_h + motor_max_h) / 4.) self.h_o[12] = self.vec_h(wall_thick + base_h + motor_thick + motor_max_h) self.h_o[13] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(base_d) self.d_o[2] = self.vec_d(base_motor_d) self.d_o[3] = self.vec_d(self.tot_d / 2.) self.d_o[4] = self.vec_d(base_d + self.bolthead_r_tol) self.d_o[5] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w if opt_sides == 0: self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep / 2.) self.w_o[2] = self.vec_w(-self.motor_bolt_sep / 2.) self.w_o[3] = self.vec_w(-self.tot_w / 2.) else: self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep / 2.) self.w_o[2] = self.vec_w(-self.motor_bolt_sep / 2.) self.w_o[3] = self.vec_w( -(2 * reinf_thick + self.motor_w + 2 * motor_xtr_space) / 2.) self.w_o[4] = self.vec_w( -(2 * reinf_thick + self.motor_w + 2 * motor_xtr_space + 2 * self.bolthead_r_tol + 4.) / 2.) self.w_o[5] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box if opt_sides == 0: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.pos_o) super().add_child(shp_box, 1, 'shp_box') shp_box_int = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=base_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) super().add_child(shp_box_int, 0, 'shp_box_int') shp_box_ext = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.base_motor_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(2, 0, 3)) super().add_child(shp_box_ext, 0, 'shp_box_ext') shp_box_init = fcfun.shp_box_dir(box_w=self.tot_w + 2 * self.bolthead_r_tol, box_d=self.tot_d, box_h=wall_thick, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(5, 0, 0)) super().add_child(shp_box_init, 0, 'shp_box_init') # holes to hold the profile shp_hole1 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, -2, 0)) super().add_child(shp_hole1, 0, 'shp_hole1') shp_hole2 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, 2, 0)) super().add_child(shp_hole2, 0, 'shp_hole2') # holes to hold the Nema Motor Holder shp_cen_bolt1 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 6)) super().add_child(shp_cen_bolt1, 0, 'shp_cen_bolt1') shp_cen_bolt2 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 6)) super().add_child(shp_cen_bolt2, 0, 'shp_cen_bolt2') shp_cen_bolt3 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 7)) super().add_child(shp_cen_bolt3, 0, 'shp_cen_bolt3') shp_cen_bolt4 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 7)) super().add_child(shp_cen_bolt4, 0, 'shp_cen_bolt4') shp_cen_bolt5 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 8)) super().add_child(shp_cen_bolt5, 0, 'shp_cen_bolt5') shp_cen_bolt6 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 8)) super().add_child(shp_cen_bolt6, 0, 'shp_cen_bolt6') shp_cen_bolt7 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 9)) super().add_child(shp_cen_bolt7, 0, 'shp_cen_bolt7') shp_cen_bolt8 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 9)) super().add_child(shp_cen_bolt8, 0, 'shp_cen_bolt8') shp_cen_bolt9 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 10)) super().add_child(shp_cen_bolt9, 0, 'shp_cen_bolt9') shp_cen_bolt10 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 10)) super().add_child(shp_cen_bolt10, 0, 'shp_cen_bolt10') shp_cen_bolt11 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 11)) super().add_child(shp_cen_bolt11, 0, 'shp_cen_bolt11') shp_cen_bolt12 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 11)) super().add_child(shp_cen_bolt12, 0, 'shp_cen_bolt12') else: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.pos_o) super().add_child(shp_box, 1, 'shp_box') shp_box_int = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=base_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) super().add_child(shp_box_int, 0, 'shp_box_int') shp_box_ext = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.base_motor_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(2, 0, 3)) super().add_child(shp_box_ext, 0, 'shp_box_ext') shp_box_init = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=wall_thick, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(5, 0, 0)) super().add_child(shp_box_init, 0, 'shp_box_init') shp_box_lat1 = fcfun.shp_box_dir(box_w=2 * +self.bolthead_r_tol + 4., box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(0, -4, 1)) super().add_child(shp_box_lat1, 0, 'shp_box_lat1') shp_box_lat2 = fcfun.shp_box_dir(box_w=2 * +self.bolthead_r_tol + 4., box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(0, 4, 1)) super().add_child(shp_box_lat2, 0, 'shp_box_lat2') # holes to hold the profile # self.get_d_ab(5,4).x shp_hole1 = fcfun.shp_stadium_dir( self.tot_d - 2 * ((self.d_o[5] - self.d_o[4]).Length), radius=self.boltshank_r_tol, height=wall_thick, fc_axis_h=self.axis_h, fc_axis_l=self.axis_d.negative(), fc_axis_s=V0, ref_l=2, ref_s=1, ref_h=2, xtr_nh=1, pos=self.get_pos_dwh(4, -4, 0)) super().add_child(shp_hole1, 0, 'shp_hole1') shp_hole2 = fcfun.shp_stadium_dir( self.tot_d - 2 * ((self.d_o[5] - self.d_o[4]).Length), radius=self.boltshank_r_tol, height=wall_thick, fc_axis_h=self.axis_h, fc_axis_l=self.axis_d.negative(), fc_axis_s=V0, ref_l=2, ref_s=1, ref_h=2, xtr_nh=1, pos=self.get_pos_dwh(4, 4, 0)) super().add_child(shp_hole2, 0, 'shp_hole2') shp_hole3 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, -2, 0)) super().add_child(shp_hole3, 0, 'shp_hole3') shp_hole4 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, 2, 0)) super().add_child(shp_hole4, 0, 'shp_hole4') # holes to hold the Nema Motor Holder shp_cen_bolt1 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 6)) super().add_child(shp_cen_bolt1, 0, 'shp_cen_bolt1') shp_cen_bolt2 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 6)) super().add_child(shp_cen_bolt2, 0, 'shp_cen_bolt2') shp_cen_bolt3 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 7)) super().add_child(shp_cen_bolt3, 0, 'shp_cen_bolt3') shp_cen_bolt4 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 7)) super().add_child(shp_cen_bolt4, 0, 'shp_cen_bolt4') shp_cen_bolt5 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 8)) super().add_child(shp_cen_bolt5, 0, 'shp_cen_bolt5') shp_cen_bolt6 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 8)) super().add_child(shp_cen_bolt6, 0, 'shp_cen_bolt6') shp_cen_bolt7 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 9)) super().add_child(shp_cen_bolt7, 0, 'shp_cen_bolt7') shp_cen_bolt8 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 9)) super().add_child(shp_cen_bolt8, 0, 'shp_cen_bolt8') shp_cen_bolt9 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 10)) super().add_child(shp_cen_bolt9, 0, 'shp_cen_bolt9') shp_cen_bolt10 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 10)) super().add_child(shp_cen_bolt10, 0, 'shp_cen_bolt10') shp_cen_bolt11 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, -1, 11)) super().add_child(shp_cen_bolt11, 0, 'shp_cen_bolt11') shp_cen_bolt12 = fcfun.shp_bolt_dir( r_shank=self.boltwallshank_r_tol, l_bolt=base_motor_d, r_head=self.boltwallhead_r, l_head=self.boltwallhead_l, xtr_head=1, xtr_shank=1, fc_normal=self.axis_d, pos_n=0, pos=self.get_pos_dwh(0, 1, 11)) super().add_child(shp_cen_bolt12, 0, 'shp_cen_bolt12') super().make_parent(name) chmf_reinf_r = min(base_motor_d - base_d, base_h) self.shp = fcfun.shp_filletchamfer_dirpt(self.shp, self.axis_w, fc_pt=self.get_pos_dwh( 2, 0, 3), fillet=0, radius=(chmf_reinf_r - TOL)) if opt_sides == 0: for pt_w in (-3, 3): for pt_h in (0, 13): self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, self.axis_d, fc_pt=self.get_pos_dwh(0, pt_w, pt_h), fillet=1, radius=chmf_r) self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, self.axis_d, fc_pt=self.get_pos_dwh(5, pt_w, 1), fillet=1, radius=chmf_r) else: for pt_w in (-5, 5): for pt_h in (0, 1): self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, self.axis_d, fc_pt=self.get_pos_dwh(0, pt_w, pt_h), fillet=1, radius=chmf_r) for pt_w in (-3, 3): for pt_h in (1, 13): self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, self.axis_d, fc_pt=self.get_pos_dwh(0, pt_w, pt_h), fillet=1, radius=chmf_r) fuse = [] fuse.append(self.shp) shp_box_ref = fcfun.shp_box_dir(box_w=2 * self.bolthead_r, box_d=2 * self.bolthead_r, box_h=2 * self.bolthead_r, fc_axis_w=self.axis_w, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) shp_box_ref = fcfun.shp_filletchamfer_dirpt( shp_box_ref, self.axis_w, fc_pt=self.get_pos_dwh(5, 0, 2), fillet=0, radius=2 * self.bolthead_r - TOL) fuse.append(shp_box_ref) shp_final = fcfun.fuseshplist(fuse) self.shp = shp_final # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__( self, pitch=2., n_teeth=20, toothed_h=7.5, top_flange_h=1., bot_flange_h=0, tot_h=16., flange_d=15., base_d=15., shaft_d=5., tol=0, axis_d=VX, axis_w=VY, axis_h=VZ, pos_d=0, pos_w=0, pos_h=0, pos=V0, model_type=1, # dimensional model name=None): if name == None: name = 'gt' + str(int(pitch)) + '_pulley_' + str(n_teeth) self.name = name if (((axis_d is None) or (axis_d == V0)) and ((axis_w is None) or (axis_w == V0))): # both are null, we create a random perpendicular vectors axis_d = fcfun.get_fc_perpend1(axis_h) axis_w = axis_h.cross(axis_d) else: if ((axis_d is None) or (axis_d == V0)): axis_d = axis_w.cross(axis_h) elif ((axis_w is None) or (axis_w == V0)): axis_w = axis_h.cross(axis_d) # all axis are defined Obj3D.__init__(self, axis_d, axis_w, axis_h, name) if (top_flange_h > 0 or bot_flange_h > 0) and flange_d == 0: logger.debug("Flange height is not null, but diameter is null") logger.debug("Flange diameter will be the same as the base") flange_d = base_d self.flange_d = flange_flange_d # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) # belt dictionary: self.belt_dict = kcomp.GT[pitch] # diameters of the pulley: # pitch diameter, it is not on the pulley, but outside, on the belt self.pitch_d = n_teeth * pitch / math.pi self.pitch_r = self.pitch_d / 2. # out radius and diameter, diameter at the outer part of the teeth self.tooth_out_r = self.pitch_r - self.belt_dict['PLD'] self.tooth_out_d = 2 * self.tooth_out_r # inner radius and diameter, diameter at the inner part of the teeth self.tooth_in_r = self.tooth_out_r - self.belt_dict['TOOTH_H'] self.tooth_in_d = 2 * self.tooth_in_r self.base_r = base_d / 2. self.shaft_r = shaft_d / 2. self.flange_r = flange_d / 2. self.base_d = base_d # height of the base, without the toothed part and the flange self.base_h = tot_h - toothed_h - top_flange_h - bot_flange_h self.tot_h = tot_h self.toothed_h = toothed_h self.top_flange_h = top_flange_h self.bot_flange_h = bot_flange_h self.h0_cen = 0 self.d0_cen = 1 # symmetrical self.w0_cen = 1 # symmetrical # vectors from the origin to the points along axis_h: self.h_o[0] = V0 self.h_o[1] = self.vec_h(self.base_h) self.h_o[2] = self.vec_h(self.base_h + self.bot_flange_h) self.h_o[3] = self.vec_h(self.base_h + self.bot_flange_h + toothed_h / 2.) self.h_o[4] = self.vec_h(self.tot_h - top_flange_h) self.h_o[5] = self.vec_h(self.tot_h) # vectors from the origin to the points along axis_d: # these are negative because actually the pos_d indicates a negative # position along axis_d (this happens when it is symmetrical) self.d_o[0] = V0 self.d_o[1] = self.vec_d(-self.shaft_r) self.d_o[2] = self.vec_d(-self.tooth_in_r) self.d_o[3] = self.vec_d(-self.tooth_out_r) self.d_o[4] = self.vec_d(-self.pitch_r) self.d_o[5] = self.vec_d(-self.base_r) self.d_o[6] = self.vec_d(-self.flange_r) # position along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.shaft_r) self.w_o[2] = self.vec_w(-self.tooth_in_r) self.w_o[3] = self.vec_w(-self.tooth_out_r) self.w_o[4] = self.vec_w(-self.pitch_r) self.w_o[5] = self.vec_w(-self.base_r) self.w_o[6] = self.vec_w(-self.flange_r) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() shp_fuse_list = [] # Cilynder with a hole, with an extra for the fusion # calculation of the extra at the bottom to make the fusion if self.bot_flange_h > 0: xtr_bot = self.bot_flange_h / 2. elif self.base_d > self.tooth_out_d: xtr_bot = self.base_h / 2. else: xtr_bot = 0 # external diameter (maybe later teeth will be made shp_tooth_cyl = fcfun.shp_cylhole_gen( r_out=self.tooth_out_r, r_in=self.shaft_r + tol, h=self.toothed_h, axis_h=self.axis_h, pos_h=1, #position at the bottom xtr_top=top_flange_h / 2., xtr_bot=xtr_bot, pos=self.get_pos_h(2)) shp_fuse_list.append(shp_tooth_cyl) if self.bot_flange_h > 0: # same width if self.flange_d == self.base_d: shp_base_flg_cyl = fcfun.shp_cylholedir( r_out=self.base_r, r_in=self.shaft_r + tol, h=self.base_h + self.bot_flange_h, normal=self.axis_h, pos=self.pos_o) shp_fuse_list.append(shp_base_flg_cyl) else: shp_base_cyl = fcfun.shp_cylholedir(r_out=self.base_r, r_in=self.shaft_r + tol, h=self.base_h, normal=self.axis_h, pos=self.pos_o) shp_bot_flange_cyl = fcfun.shp_cylholedir( r_out=self.flange_r, r_in=self.shaft_r + tol, h=self.bot_flange_h, normal=self.axis_h, pos=self.get_pos_h(1)) shp_fuse_list.append(shp_base_cyl) shp_fuse_list.append(shp_bot_flange_cyl) else: #no bottom flange shp_base_cyl = fcfun.shp_cylholedir(r_out=self.base_r, r_in=self.shaft_r + tol, h=self.base_h, normal=self.axis_h, pos=self.pos_o) shp_fuse_list.append(shp_base_cyl) if self.top_flange_h > 0: shp_top_flange_cyl = fcfun.shp_cylholedir(r_out=self.flange_r, r_in=self.shaft_r + tol, h=self.top_flange_h, normal=self.axis_h, pos=self.get_pos_h(4)) shp_fuse_list.append(shp_top_flange_cyl) shp_pulley = fcfun.fuseshplist(shp_fuse_list) shp_pulley = shp_pulley.removeSplitter() self.shp = shp_pulley # normal axes to print without support self.prnt_ax = self.axis_h super().create_fco() # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i])
def __init__( self, # motor parameters nema_size=17, base_l=32., shaft_l=24., shaft_r=0, circle_r=11., circle_h=2., chmf_r=1, rear_shaft_l=0, bolt_depth=3., # pulley parameters pulley_pitch=2., pulley_n_teeth=20, pulley_toothed_h=7.5, pulley_top_flange_h=1., pulley_bot_flange_h=0, pulley_tot_h=16., pulley_flange_d=15., pulley_base_d=15., pulley_tol=0, pulley_pos_h=-1, # general parameters axis_d=VX, axis_w=None, axis_h=VZ, pos_d=0, pos_w=0, pos_h=1, pos=V0, group=1, name=''): if name == None: name = 'nema' + str(nema_size) + '_pulley_set' self.name = name if (axis_w is None) or (axis_w == V0): axis_w = axis_h.cross(axis_d) Obj3D.__init__(self, axis_d, axis_w, axis_h, name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) # pos_w = 0 and pos_d are at the center, pos_h self.d0_cen = 1 #symmetric self.w0_cen = 1 #symmetric self.h0_cen = 0 # creation of the motor, we don't know all the relative positions # so we create it at pos_d=pos_w = 0, pos_h = 1 nema_motor = PartNemaMotor(nema_size=nema_size, base_l=base_l, shaft_l=shaft_l, shaft_r=shaft_r, circle_r=circle_r, circle_h=circle_h, chmf_r=chmf_r, rear_shaft_l=rear_shaft_l, bolt_depth=bolt_depth, bolt_out=0, cut_extra=0, axis_d=self.axis_d, axis_w=self.axis_w, axis_h=self.axis_h, pos_d=0, pos_w=0, pos_h=0, pos=pos) super().append_part(nema_motor) nema_motor.parent = self self.shaft_r = nema_motor.shaft_r self.circle_r = nema_motor.circle_r self.circle_h = nema_motor.circle_h # creation of the pulley. Locate it at pos_d,w,h = 0 gt_pulley = PartGtPulley(pitch=pulley_pitch, n_teeth=pulley_n_teeth, toothed_h=pulley_toothed_h, top_flange_h=pulley_top_flange_h, bot_flange_h=pulley_bot_flange_h, tot_h=pulley_tot_h, flange_d=pulley_flange_d, base_d=pulley_base_d, shaft_d=2 * self.shaft_r, tol=0, axis_d=self.axis_d, axis_w=self.axis_w, axis_h=self.axis_h, pos_d=0, pos_w=0, pos_h=0, pos=pos, model_type=1) # dimensional model if pulley_pos_h < 0: #top of the pulley aligned with top of the shaft # shaft_l includes the length of the circle pulley_pos_h = shaft_l - gt_pulley.tot_h if pulley_pos_h < 0: pulley_pos_h = 0 self.pulley_pos_h = pulley_pos_h elif pulley_pos_h + gt_pulley.base_h > shaft_l: logger.warning("pulley seems to be out of the shaft") super().append_part(gt_pulley) gt_pulley.parent = self # conversions of the relative points from the parts to the total set self.d_o[0] = nema_motor.d_o[0] # V0 self.d_o[1] = nema_motor.d_o[1] self.d_o[2] = nema_motor.d_o[2] self.d_o[3] = nema_motor.d_o[3] self.d_o[4] = nema_motor.d_o[4] self.d_o[5] = gt_pulley.d_o[2] self.d_o[6] = gt_pulley.d_o[3] self.d_o[7] = gt_pulley.d_o[4] self.d_o[8] = gt_pulley.d_o[5] self.d_o[9] = gt_pulley.d_o[6] self.w_o[0] = nema_motor.w_o[0] # V0 self.w_o[1] = nema_motor.w_o[1] self.w_o[2] = nema_motor.w_o[2] self.w_o[3] = nema_motor.w_o[3] self.w_o[4] = nema_motor.w_o[4] self.w_o[5] = gt_pulley.w_o[2] self.w_o[6] = gt_pulley.w_o[3] self.w_o[7] = gt_pulley.w_o[4] self.w_o[8] = gt_pulley.w_o[5] self.w_o[9] = gt_pulley.w_o[6] self.h_o[0] = nema_motor.h_o[0] # V0 (origin) base of the shaft self.h_o[1] = nema_motor.h_o[1] # end of the circle self.h_o[2] = nema_motor.h_o[2] # end of the shaft self.h_o[3] = nema_motor.h_o[3] # bottom end of the bolt holes self.h_o[4] = nema_motor.h_o[4] # bottom of the base self.h_o[5] = nema_motor.h_o[5] # rear shaft # position of the base of the shaft (including the circle) # + nema_motor.h_o[0] = V0 (not needed) # relative position of the base of the pulley: V0 (not needed) # + gt_pulley.h_o[0] = V0 -> base of the pulley # distance from the base of the shaft (circle included) to the base # of the pulley: # + self.vec_h(self.pulley_pos_h): #self.h_o[6] = ( nema_motor.h_o[0] + gt_pulley.h_o[0] # + self.vec_h(self.pulley_pos_h)) self.h_o[6] = self.vec_h(self.pulley_pos_h) self.h_o[7] = self.h_o[6] + gt_pulley.h_o[1] self.h_o[8] = self.h_o[6] + gt_pulley.h_o[2] self.h_o[9] = self.h_o[6] + gt_pulley.h_o[3] self.h_o[10] = self.h_o[6] + gt_pulley.h_o[4] self.h_o[11] = self.h_o[6] + gt_pulley.h_o[5] # check if the pulley is on top of the shaft or not: if self.h_o[11].Length > self.h_o[5].Length: self.tot_h = self.h_o[11].Length + self.h_o[0].Length else: self.tot_h = self.h_o[5].Length + self.h_o[0].Length super().set_pos_o(adjust=1) super().set_part_place(nema_motor) super().set_part_place(gt_pulley, self.get_o_to_h(6)) super().place_fcos() if group == 1: super().make_group()
def __init__(self, nema_size=17, base_motor_d=6., base_d=4., base_h=16., wall_thick=4., motor_thick=4., reinf_thick=4., motor_min_h=10., motor_max_h=20., motor_xtr_space=2., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., rail=1, chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'NemaMotorHolderBase' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h self.motor_w = kcomp.NEMA_W[nema_size] self.motor_bolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] self.motor_bolt_d = kcomp.NEMA_BOLT_D[nema_size] # calculation of the bolt to hold the base to the profile self.boltshank_r_tol = kcomp.D912[bolt1_wall_d]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt1_wall_d]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt1_wall_d]['head_r'] self.bolthead_l = kcomp.D912[bolt1_wall_d]['head_l'] self.bolthead_l_tol = kcomp.D912[bolt1_wall_d]['head_l_tol'] # calculation of the bolt wall d self.boltwallshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.boltwallhead_l = kcomp.D912[bolt_wall_d]['head_l'] self.boltwallhead_r = kcomp.D912[bolt_wall_d]['head_r'] self.washer_thick = kcomp.WASH_D125_T[bolt_wall_d] # calculation of the bolt wall separation self.max_bolt_wall_sep = self.motor_w - 2 * self.boltwallhead_r self.min_bolt_wall_sep = 4 * self.boltwallhead_r if bolt_wall_sep == 0: self.bolt_wall_sep = self.max_bolt_wall_sep elif bolt_wall_sep > self.max_bolt_wall_sep: logger.debug('bolt separation too large:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.max_bolt_wall_sep logger.debug('taking largest value:' + str(self.bolt_wall_sep)) elif bolt_wall_sep < 4 * self.boltwallhead_r: logger.debug('bolt separation too short:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.self.max_bolt_wall_sep logger.debug('taking smallest value:' + str(self.bolt_wall_sep)) # distance from the motor to the inner wall (in axis_d) self.motor_inwall_space = motor_xtr_space + self.boltwallhead_l + self.washer_thick # making the big box that will contain everything and will be cut self.tot_h = wall_thick + base_h + motor_thick + motor_max_h + 2 * bolt_wall_d self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space self.tot_d = base_motor_d + wall_thick + self.motor_w + self.motor_inwall_space # distance from the motor axis to the wall (in axis_d) self.motax2wall = wall_thick + self.motor_inwall_space + self.motor_w / 2. # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(wall_thick + base_h) self.h_o[3] = self.vec_h(wall_thick + base_h + motor_thick) self.h_o[4] = self.vec_h(wall_thick + base_h + motor_thick + motor_min_h) self.h_o[5] = self.vec_h(wall_thick + base_h + motor_thick + motor_max_h) self.h_o[6] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(base_d) self.d_o[2] = self.vec_d(base_motor_d) self.d_o[3] = self.vec_d(base_d + self.bolthead_r_tol) self.d_o[4] = self.vec_d(base_d + 2 * self.bolthead_r) self.d_o[5] = self.vec_d(base_motor_d + wall_thick) self.d_o[6] = self.vec_d(base_motor_d + self.motax2wall - self.motor_bolt_sep / 2.) self.d_o[7] = self.vec_d(base_motor_d + self.motax2wall) self.d_o[8] = self.vec_d(base_motor_d + self.motax2wall + self.motor_bolt_sep / 2.) self.d_o[9] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep / 2.) self.w_o[2] = self.vec_w(-self.motor_bolt_sep / 2.) self.w_o[3] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # base motherboard = base(nema_size=17, base_motor_d=8., base_d=6., base_h=16., wall_thick=6., motor_thick=6., reinf_thick=1., motor_min_h=10., motor_max_h=50., motor_xtr_space=3., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=0, pos_d=0, pos_w=0, pos=self.get_pos_dwh(0, 0, 0)) self.append_part(motherboard) motorholder = NemaMotorHolder(nema_size=17, base_motor_d=8., base_d=6., base_h=16., wall_thick=6., motor_thick=6., reinf_thick=1., motor_min_h=10., motor_max_h=50., rail=1, motor_xtr_space=3., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=0, pos_d=0, pos_w=0, pos=self.get_pos_dwh(2, 0, 2)) self.append_part(motorholder) super().make_group() # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, nema_size=17, base_l=32., shaft_l=20., shaft_r=0, circle_r=11., circle_h=2., chmf_r=1, rear_shaft_l=0, bolt_depth=3., bolt_out=2., cut_extra=0, axis_d=VX, axis_w=None, axis_h=VZ, pos_d=0, pos_w=0, pos_h=0, pos=V0, name=None): if name == None: name = 'nema' + str(nema_size) + '_motor_l' + str(int(base_l)) self.name = name if (axis_w is None) or (axis_w == V0): axis_w = axis_h.cross(axis_d) Obj3D.__init__(self, axis_d, axis_w, axis_h, name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.motor_w = kcomp.NEMA_W[nema_size] if shaft_r == 0: self.shaft_d = kcomp.NEMA_SHAFT_D[nema_size] self.shaft_r = self.shaft_d / 2. shaft_r = self.shaft_r self.shaft_l = shaft_l self.base_l = base_l self.rear_shaft_l = rear_shaft_l self.nemabolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] nemabolt_d = kcomp.NEMA_BOLT_D[nema_size] self.nemabolt_d = nemabolt_d self.nemabolt_r = nemabolt_d / 2. mtol = kcomp.TOL - 0.1 if circle_r == 0 or circle_h == 0: # No circle circle_r = 0 circle_h = 0 self.circle_r = 0 self.circle_h = 0 self.h0_cen = 0 self.d0_cen = 1 # symmetrical self.w0_cen = 1 # symmetrical # vectors from the origin to the points along axis_h: self.h_o[0] = V0 # base of the shaft: origin self.h_o[1] = self.vec_h(self.circle_h) self.h_o[2] = self.vec_h(self.shaft_l) #includes circle_h self.h_o[3] = self.vec_h(-bolt_depth) self.h_o[4] = self.vec_h(-self.base_l) self.h_o[5] = self.vec_h(-self.base_l - self.rear_shaft_l) # vectors from the origin to the points along axis_d: # these are negative because actually the pos_d indicates a negative # position along axis_d (this happens when it is symmetrical) self.d_o[0] = V0 self.d_o[1] = self.vec_d(-self.shaft_r) self.d_o[2] = self.vec_d(-self.circle_r) self.d_o[3] = self.vec_d(-self.nemabolt_sep / 2.) self.d_o[4] = self.vec_d(-self.motor_w / 2.) # position along axis_w (similar to axis_d) self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.shaft_r) self.w_o[2] = self.vec_w(-self.circle_r) self.w_o[3] = self.vec_w(-self.nemabolt_sep / 2.) self.w_o[4] = self.vec_w(-self.motor_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # ---------- building of the piece ------------------ # -------- base of the motor # if cut_extra, there will be extra at each side, since the piece # is built from the center of symmetry, it will be equally extended # on each side shp_base = fcfun.shp_box_dir(box_w=self.motor_w + 2 * cut_extra, box_d=self.motor_w + 2 * cut_extra, box_h=self.base_l, fc_axis_w=self.axis_w, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=1, ch=0, pos=self.get_pos_h(4)) shp_base = fcfun.shp_filletchamfer_dir(shp_base, self.axis_h, fillet=0, radius=chmf_r) shp_base = shp_base.removeSplitter() fuse_list = [] holes_list = [] # --------- bolts (holes or extensions if cut_extra > 0) for pt_d in (-3, 3): for pt_w in (-3, 3): if cut_extra == 0: # there will be holes for the bolts # pos_h=3 is at the end of the hole for the bolts bolt_pos = self.get_pos_dwh(pt_d, pt_w, 3) shp_hole = fcfun.shp_cylcenxtr(r=self.nemabolt_r, h=bolt_depth, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=0, pos=bolt_pos) holes_list.append(shp_hole) else: # the bolts will protude to make holes in the shape to cut # pos_h=0 is at the the base of the shaft bolt_pos = self.get_pos_dwh(pt_d, pt_w, 0) shp_hole = fcfun.shp_cylcenxtr(r=self.nemabolt_r, h=bolt_out, normal=self.axis_h, ch=0, xtr_top=0, xtr_bot=1, pos=bolt_pos) fuse_list.append(shp_hole) if cut_extra == 0: shp_holes = fcfun.fuseshplist(holes_list) shp_base = shp_base.cut(shp_holes) shp_base = shp_base.removeSplitter() # -------- circle (flat cylinder) at the base of the shaft # could add cut_extra to circle_h or circle_r, but it can be # set in the arguments if circle_r > 0 and circle_h > 0: shp_circle = fcfun.shp_cylcenxtr( r=circle_r, h=circle_h, normal=self.axis_h, ch=0, # not centered xtr_top=0, # no extra at top xtr_bot=1, # extra to fuse pos=self.pos_o) fuse_list.append(shp_circle) # ------- Shaft shp_shaft = fcfun.shp_cylcenxtr( r=self.shaft_r, h=self.shaft_l, normal=self.axis_h, ch=0, # not centered xtr_top=0, # no extra at top xtr_bot=1, # extra to fuse # shaft length stats from the base # not from the circle pos=self.pos_o) fuse_list.append(shp_shaft) if rear_shaft_l > 0: shp_rearshaft = fcfun.shp_cylcenxtr( r=self.shaft_r, h=self.rear_shaft_l, normal=self.axis_h, ch=0, # not centered xtr_top=1, # to fuse xtr_bot=0, # no extra at bottom pos=self.get_pos_h(5)) fuse_list.append(shp_rearshaft) shp_motor = shp_base.multiFuse(fuse_list) shp_motor = shp_motor.removeSplitter() self.shp = shp_motor super().create_fco(self.name) # Save the arguments that have not been created yet frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.model_type = 1 # Dimensional model
def __init__(self, nema_size=17, base_motor_d=6., base_d=4., base_h=16., wall_thick=4., motor_thick=4., reinf_thick=4., motor_min_h=10., motor_max_h=20., motor_xtr_space=2., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., rail=1, chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'NemaMotorHolder' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # save the arguments as attributes frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) # normal axes to print without support self.prnt_ax = self.axis_h self.motor_w = kcomp.NEMA_W[nema_size] self.motor_bolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] self.motor_bolt_d = kcomp.NEMA_BOLT_D[nema_size] # calculation of the bolt wall d self.boltwallshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.boltwallhead_l = kcomp.D912[bolt_wall_d]['head_l'] self.boltwallhead_r = kcomp.D912[bolt_wall_d]['head_r'] self.washer_thick = kcomp.WASH_D125_T[bolt_wall_d] # calculation of the bolt wall separation self.max_bolt_wall_sep = self.motor_w - 2 * self.boltwallhead_r self.min_bolt_wall_sep = 4 * self.boltwallhead_r if bolt_wall_sep == 0: self.bolt_wall_sep = self.max_bolt_wall_sep elif bolt_wall_sep > self.max_bolt_wall_sep: logger.debug('bolt separation too large:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.max_bolt_wall_sep logger.debug('taking largest value:' + str(self.bolt_wall_sep)) elif bolt_wall_sep < self.min_bolt_wall_sep: #elif bolt_wall_sep < 4 * self.boltwallhead_r: logger.debug('bolt separation too short:' + str(bolt_wall_sep)) #self.bolt_wall_sep = self.self.max_bolt_wall_sep self.bolt_wall_sep = self.min_bolt_wall_sep logger.debug('taking smallest value:' + str(self.bolt_wall_sep)) # distance from the motor to the inner wall (in axis_d) self.motor_inwall_space = motor_xtr_space + self.boltwallhead_l + self.washer_thick # making the big box that will contain everything and will be cut self.tot_h = motor_thick + motor_max_h + 2 * bolt_wall_d self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space self.tot_d = wall_thick + self.motor_w + self.motor_inwall_space # distance from the motor axis to the wall (in axis_d) self.motax2wall = wall_thick + self.motor_inwall_space + self.motor_w / 2. # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(motor_thick) self.h_o[2] = self.vec_h(motor_thick + motor_min_h) self.h_o[3] = self.vec_h(motor_thick + motor_max_h) self.h_o[4] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(wall_thick) self.d_o[2] = self.vec_d(self.motax2wall - self.motor_bolt_sep / 2.) self.d_o[3] = self.vec_d(self.motax2wall) self.d_o[4] = self.vec_d(self.motax2wall + self.motor_bolt_sep / 2.) self.d_o[5] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep / 2.) self.w_o[2] = self.vec_w(-self.motor_bolt_sep / 2.) self.w_o[3] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box, extra height and depth to cut all the way back and down shp_box1 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.pos_o) # little chamfer at the corners, if fillet there are some problems shp_box2 = fcfun.shp_filletchamfer_dir(shp_box1, self.axis_h, fillet=0, radius=chmf_r) # chamfer of the box to make a 'triangular' reinforcement chmf_reinf_r = min(self.tot_d - wall_thick, self.tot_h - motor_thick) shp_box3 = fcfun.shp_filletchamfer_dirpt(shp_box2, self.axis_w, fc_pt=self.get_pos_dwh( 5, 0, 4), fillet=0, radius=chmf_reinf_r) super().add_child(shp_box3, 1, 'shp_box3') # holes # the space for the motor shp_motor = fcfun.shp_box_dir(box_w=self.motor_w + 2 * motor_xtr_space, box_d=self.tot_d + chmf_r, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) shp_motor = fcfun.shp_filletchamfer_dir(shp_motor, self.axis_h, fillet=0, radius=chmf_r) super().add_child(shp_motor, 0, 'shp_motor') # central circle of the motor shp_hole1 = fcfun.shp_cylcenxtr( r=(self.motor_bolt_sep - self.motor_bolt_d) / 2., h=motor_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_d(3)) super().add_child(shp_hole1, 0, 'shp_hole1') # motor bolt holes shp_hole2 = fcfun.shp_cylcenxtr(r=self.motor_bolt_d / 2. + TOL, h=motor_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(2, -2, 0)) super().add_child(shp_hole2, 0, 'shp_hole2') shp_hole3 = fcfun.shp_cylcenxtr(r=self.motor_bolt_d / 2. + TOL, h=motor_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(2, 2, 0)) super().add_child(shp_hole3, 0, 'shp_hole3') shp_hole4 = fcfun.shp_cylcenxtr(r=self.motor_bolt_d / 2. + TOL, h=motor_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, -2, 0)) super().add_child(shp_hole4, 0, 'shp_hole4') shp_hole5 = fcfun.shp_cylcenxtr(r=self.motor_bolt_d / 2. + TOL, h=motor_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, 2, 0)) super().add_child(shp_hole5, 0, 'shp_hole5') # rail holes if rail == 1: shp_hole6 = fcfun.shp_box_dir_xtr(box_w=2 * self.boltwallshank_r_tol, box_d=wall_thick, box_h=motor_max_h - motor_min_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=1, xtr_nd=1, pos=self.get_pos_dwh(0, -1, 2)) super().add_child(shp_hole6, 0, 'shp_hole6') shp_hole7 = fcfun.shp_box_dir_xtr(box_w=2 * self.boltwallshank_r_tol, box_d=wall_thick, box_h=motor_max_h - motor_min_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=1, xtr_nd=1, pos=self.get_pos_dwh(0, 1, 2)) super().add_child(shp_hole7, 0, 'shp_hole7') # hole for the ending of the rails (4 semicircles) shp_hole8 = fcfun.shp_cylcenxtr(r=self.boltwallshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(0, -1, 2)) super().add_child(shp_hole8, 0, 'shp_hole8') shp_hole9 = fcfun.shp_cylcenxtr(r=self.boltwallshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(0, 1, 2)) super().add_child(shp_hole9, 0, 'shp_hole9') shp_hole10 = fcfun.shp_cylcenxtr(r=self.boltwallshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(0, -1, 3)) super().add_child(shp_hole10, 0, 'shp_hole10') shp_hole11 = fcfun.shp_cylcenxtr(r=self.boltwallshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(0, 1, 3)) super().add_child(shp_hole11, 0, 'shp_hole11') super().make_parent(name) # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, nema_size=17, base_motor_d=6., base_d=4., base_h=16., wall_thick=4., motor_thick=4., reinf_thick=4., motor_min_h=10., motor_max_h=20., motor_xtr_space=2., bolt_wall_d=4., bolt1_wall_d=5., bolt_wall_sep=30., chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'base' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h self.motor_w = kcomp.NEMA_W[nema_size] self.motor_bolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] self.motor_bolt_d = kcomp.NEMA_BOLT_D[nema_size] # calculation of the bolt to hold the base to the profile self.boltshank_r_tol = kcomp.D912[bolt1_wall_d]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt1_wall_d]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt1_wall_d]['head_r'] self.bolthead_l = kcomp.D912[bolt1_wall_d]['head_l'] # calculation of the bolt wall d self.boltwallhead_l = kcomp.D912[bolt_wall_d]['head_l'] self.boltwallhead_r = kcomp.D912[bolt_wall_d]['head_r'] self.washer_thick = kcomp.WASH_D125_T[bolt_wall_d] # calculation of the bolt wall separation self.max_bolt_wall_sep = self.motor_w - 2 * self.boltwallhead_r if bolt_wall_sep == 0: self.bolt_wall_sep = self.max_bolt_wall_sep elif bolt_wall_sep > self.max_bolt_wall_sep: logger.debug('bolt separation too large:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.max_bolt_wall_sep logger.debug('taking largest value:' + str(self.bolt_wall_sep)) elif bolt_wall_sep < 4 * self.boltwallhead_r: logger.debug('bolt separation too short:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.self.max_bolt_wall_sep logger.debug('taking smallest value:' + str(self.bolt_wall_sep)) # distance from the motor to the inner wall (in axis_d) self.motor_inwall_space = motor_xtr_space + self.boltwallhead_l + self.washer_thick # making the big box that will contain everything and will be cut self.tot_h = wall_thick + base_h + motor_thick + motor_max_h + 2 * bolt_wall_d self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space self.tot_d = base_motor_d + wall_thick + self.motor_w + self.motor_inwall_space # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(wall_thick + base_h) self.h_o[3] = self.vec_h(wall_thick + base_h + motor_thick) self.h_o[4] = self.vec_h(wall_thick + base_h + motor_thick + motor_min_h) self.h_o[5] = self.vec_h(wall_thick + base_h + motor_thick + motor_max_h) self.h_o[6] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(base_d) self.d_o[2] = self.vec_d(base_motor_d) self.d_o[3] = self.vec_d(base_d + self.bolthead_r_tol) self.d_o[4] = self.vec_d(base_d + 2 * self.bolthead_r) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep / 2.) self.w_o[2] = self.vec_w(-self.motor_bolt_sep / 2.) self.w_o[3] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.pos_o) super().add_child(shp_box, 1, 'shp_box') shp_box_int = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=base_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) super().add_child(shp_box_int, 0, 'shp_box_int') shp_box_ext = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=motor_thick + motor_max_h + 2 * bolt_wall_d, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(2, 0, 2)) super().add_child(shp_box_ext, 0, 'shp_box_ext') shp_box_init = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=wall_thick, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(4, 0, 0)) super().add_child(shp_box_init, 0, 'shp_box_init') shp_hole1 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(3, -2, 0)) super().add_child(shp_hole1, 0, 'shp_hole1') shp_hole2 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(3, 2, 0)) super().add_child(shp_hole2, 0, 'shp_hole2') super().make_parent(name) chmf_reinf_r = min(base_motor_d - base_d, base_h) self.shp = fcfun.shp_filletchamfer_dirpt(self.shp, self.axis_w, fc_pt=self.get_pos_dwh( 2, 0, 2), fillet=0, radius=(chmf_reinf_r - TOL)) # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, d_endstop, rail_l = 15, base_h = 5., h = 0, holder_out = 2., #csunk = 1, mbolt_d = 3., endstop_nut_dist = 0, min_d = 0, axis_d = VX, axis_w = V0, axis_h = VZ, pos_d = 1, pos_w = 1, pos_h = 1, pos = V0, wfco = 1, name = 'simple_enstop_holder'): self.pos = FreeCAD.Vector(0,0,0) self.position = pos self.wfco = wfco self.name = name self.base_h = base_h, # normalize the axis axis_h = DraftVecUtils.scaleTo(axis_h,1) axis_d = DraftVecUtils.scaleTo(axis_d,1) if axis_w == V0: axis_w = axis_h.cross(axis_d) else: axis_w = DraftVecUtils.scaleTo(axis_w,1) axis_h_n = axis_h.negative() axis_d_n = axis_d.negative() axis_w_n = axis_w.negative() self.axis_h = axis_h self.axis_d = axis_d self.axis_w = axis_w self.d0_cen = 0 self.w0_cen = 1 # centered self.h0_cen = 0 self.pos_d = pos_d self.pos_w = pos_w self.pos_h = pos_h self.pos = pos Obj3D.__init__(self, axis_d, axis_w, axis_h, name) # best axis to print, to be pointing up: self.axis_print = axis_h self.d_endstop = d_endstop # :holder_out # __:________:____________: :.................. # | _________ | | : # | (_________) ----| 0 | + tot_w # | _________ ----| |-----> axis_d : # | (_________) ----| 0 | : # |__________________|_____|...................: # : : : : : : : # : :..rail_l.: : : : : # : : : : :.: : # :bolthead_d : : : +estp_bolt_dist # : : : : # bolthead_r: :.......: # : +estp_d # : : # :.estp_tot_d: # :...................._..: : # tot_d # The width depend which side is larger # # ...... ______________________ .... # mbolt_head_r ......| ________ | | : # mbolt_head_d ......| (________) ---| 0 | : #mbolt_head_d or more ......| ________ ---| | + estp_w or more # mbolt_head_d ......| (________) ---| 0 | : # mbolt_head_r ......|________________|_____|....: # it can have a second hole: # : :estop_topbolt_dist # : holder_out # __:________:______________: :.................. # | _________ | | : # | (_________) ----| 0 0 | + tot_w # | _________ ----| |-----> axis_d : # | (_________) ----| 0 0 | : # |__________________|_______|...................: # : : # mounting bolt data d_mbolt = kcomp.D912[int(mbolt_d)] #dictionary of the mounting bolt #print(str(d_mbolt)) mbolt_r_tol = d_mbolt['shank_r_tol'] mbolt_head_r = d_mbolt['head_r'] mbolt_head_r_tol = d_mbolt['head_r_tol'] mbolt_head_l = d_mbolt['head_l'] print (str(mbolt_head_l)) # endstop data. change h->d, d->h, l->w estp_tot_d = d_endstop['HT'] estp_d = d_endstop['H'] estp_bolt_dist = d_endstop['BOLT_H'] estp_bolt_sep = d_endstop['BOLT_SEP'] estp_bolt_d = d_endstop['BOLT_D'] #diameter, not depth estp_w = d_endstop['L'] # if there is a second bolt if 'BOLT_TOP_H' in d_endstop: estop_2ndbolt_topdist = d_endstop['BOLT_TOP_H'] else: estop_2ndbolt_topdist = 0 # length of the pins: estp_pin_d = estp_tot_d - estp_d if min_d == 0: tot_d = 3*mbolt_head_r + rail_l + estp_tot_d - holder_out # nut axis: (nut axis of the hexagon vertex hex_verx = axis_d else: # Taking the minimum lenght, very tight tot_d = (3*mbolt_head_r + rail_l + estp_d - holder_out + estp_pin_d/2.) hex_verx = axis_w # less space # Total width is the largest value from: # - the width(length) of the endstop # - the rail width: 2 bolt head diameters, and 2 more: 1 diameter # between, and a radius to the end tot_w = max(estp_w, 8 * mbolt_head_r) if h== 0: tot_h = base_h + mbolt_head_l else: tot_h = base_h + mbolt_head_l if tot_h > h: logger.debug('h is smaller that it should, taking: ') logger.debug(str(tot_h)) else: tot_h = h self.tot_h = tot_h self.tot_w = tot_w self.tot_d = tot_d if endstop_nut_dist == 0: endstop_nut_l = kcomp.NUT_D934_L[estp_bolt_d]+TOL else: if endstop_nut_dist > tot_h - kcomp.NUT_D934_L[estp_bolt_d]+TOL: logger.debug('endstop_nut_dist: ' + str(endstop_nut_dist) + ' larger than total height - (nut length+tol): ' + str(tot_h) + ' - ' + str( kcomp.NUT_D934_L[estp_bolt_d] + TOL)) endstop_nut_l = kcomp.NUT_D934_L[estp_bolt_d]+TOL else: endstop_nut_l = tot_h - endstop_nut_dist # ------------ DISTANCES ON AXIS_D # ref_d points: fc_axis_h # 1___2______3_______4__.5............. ref_h = 2 # | :..........: : : |:..... + h # |__:________:_____:_:_|:.....base_h.: ref_h = 1 # the end it is not on the holder because of -holder_out # distance from 1 to 2 in axis_d # vectors from the origin to the points along axis_d: self.d_o[0] = V0 self.d_o[1] = self.vec_d(2* mbolt_head_r) self.d_o[2] = self.vec_d(2* mbolt_head_r + rail_l) self.d_o[3] = self.vec_d((tot_d + holder_out) - (estp_d - estp_bolt_dist)) self.d_o[4] = self.vec_d(tot_d + holder_out) if estop_2ndbolt_topdist > 0 : self.d_o[5] = self.vec_d(tot_d + holder_out - estop_2ndbolt_topdist) else: self.d_o[5] = self.d_o[3] # vectors from the origin to the points along axis_w: self.w_o[0] = V0 self.w_o[1] = self.vec_w(estp_bolt_sep/2.) self.w_o[2] = self.vec_w(tot_w/2. - 2* mbolt_head_r) self.w_o[3] = self.vec_w(tot_w/2.) # vectors from the origin to the points along axis_h: self.h_o[0] = V0 self.h_o[1] = self.vec_h(tot_h) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # TODO: clear this parts when points d_o, w_o, h_o dis_1_2_d = 2* mbolt_head_r # d_o[1] dis_1_3_d = dis_1_2_d + rail_l # d_o[2] #dis_2_3_d = rail_l dis_1_5_d = tot_d + holder_out # d_o[4] dis_1_4_d = dis_1_5_d - (estp_d - estp_bolt_dist) # d_o[3] # distances to the new point, that is the second bolt hole, if exists if estop_2ndbolt_topdist > 0 : dis_1_6_d = dis_1_5_d - estop_2ndbolt_topdist else: # same as 4: (to avoid errors) it will be the same hole dis_1_6_d = dis_1_4_d fc_1_2_d = self.d_o[1] fc_1_3_d = self.d_o[2] fc_1_4_d = self.d_o[3] fc_1_5_d = self.d_o[4] fc_1_6_d = self.d_o[5] # vector from the reference point to point 1 on axis_d if pos_d == 0: refto_1_d = V0 elif pos_d == 1: refto_1_d = fc_1_2_d.negative() elif pos_d == 2: refto_1_d = fc_1_3_d.negative() elif pos_d == 3: refto_1_d = fc_1_4_d.negative() elif pos_d == 4: refto_1_d = fc_1_5_d.negative() elif pos_d == 5: refto_1_d = fc_1_6_d.negative() else: logger.error('wrong reference point') # ------------ DISTANCES ON AXIS_W # ref_w points # fc_axis_w # _____________________ : # | ________ | |: # | (________) ---| 0 |: # 1 ________ ---| |:-----> fc_axis_d. # 3 (________) ---| 2 |: # 4________________|____|: # distance from 1 to 2 on axis_w dis_1_2_w = estp_bolt_sep/2. dis_1_4_w = tot_w/2. dis_1_3_w = dis_1_4_w - 2* mbolt_head_r fc_1_2_w = self.w_o[1] fc_1_3_w = self.w_o[2] fc_1_4_w = self.w_o[3] # vector from the reference point to point 1 on axis_w if pos_w == 0: refto_1_w = V0 elif pos_w == 1: refto_1_w = fc_1_2_w.negative() elif pos_w == 2: refto_1_w = fc_1_3_w.negative() elif pos_w == 3: refto_1_w = fc_1_4_w.negative() else: logger.error('wrong reference point') # ------------ DISTANCES ON AXIS_H fc_1_2_h = DraftVecUtils.scale(axis_h, tot_h) fc_2_1_h = fc_1_2_h.negative() if pos_h == 0: refto_2_h = self.h_o[1] elif pos_h == 1: refto_2_h = V0 else: logger.error('wrong reference point') # Situation of the point on d=1, s=1, h=2 # ____________ # / # * d1_w1_h2 # /____________ # | # # this is an absolute position # super().get_pos_dwh(pos_d,pos_w,pos_h) d1_w1_h2_pos = self.pos + refto_1_d + refto_1_w + refto_2_h d1_w1_h1_pos = d1_w1_h2_pos + fc_2_1_h # draw the box from this point d1 s1 h2 shp_box = fcfun.shp_box_dir(box_w = tot_w, box_d = tot_d, box_h = tot_h, fc_axis_h = axis_h_n, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = d1_w1_h2_pos) shp_box = fcfun.shp_filletchamfer_dir(shp_box, fc_axis = axis_h, fillet=1, radius = 2) holes = [] # holes for the endstop bolts, point: d4 w2 h1 for fc_1_2_wi in [fc_1_2_w, fc_1_2_w.negative()]: pos_estpbolt = d1_w1_h1_pos + fc_1_4_d + fc_1_2_wi # hole with the nut hole shp_estpbolt = fcfun.shp_bolt_dir ( r_shank= (estp_bolt_d+TOL)/2., l_bolt = tot_h, # 1 TOL didnt fit r_head = (kcomp.NUT_D934_D[estp_bolt_d]+2*TOL)/2., l_head = endstop_nut_l, hex_head = 1, xtr_head = 1, xtr_shank = 1, fc_normal = axis_h, fc_verx1 = hex_verx, pos = pos_estpbolt) holes.append(shp_estpbolt) # it can have a second hole if estop_2ndbolt_topdist >0: pos_estp_top_bolt = d1_w1_h1_pos + fc_1_6_d + fc_1_2_wi # hole with the nut hole shp_estpbolt = fcfun.shp_bolt_dir ( r_shank= (estp_bolt_d+TOL)/2., l_bolt = tot_h, # 1 TOL didnt fit r_head = (kcomp.NUT_D934_D[estp_bolt_d]+2*TOL)/2., l_head = endstop_nut_l, hex_head = 1, xtr_head = 1, xtr_shank = 1, fc_normal = axis_h, fc_verx1 = hex_verx, pos = pos_estp_top_bolt) holes.append(shp_estpbolt) # holes for the rails, point d2 w3 h2 for fc_1_3_wi in [fc_1_3_w, fc_1_3_w.negative()]: #hole for the rails, use the function stadium rail_pos = d1_w1_h2_pos + fc_1_2_d + fc_1_3_wi shp_rail_sunk = fcfun.shp_stadium_dir ( length = rail_l, radius = mbolt_head_r_tol, height = mbolt_head_l, fc_axis_l = axis_d, fc_axis_h = axis_h_n, ref_l = 2, #at the center of semicircle ref_s = 1, # symmetrical on the short side ref_h = 2, xtr_h = 0, xtr_nh = 1, pos = rail_pos) shp_rail = fcfun.shp_stadium_dir ( length = rail_l, radius = mbolt_r_tol, height = tot_h, fc_axis_l = axis_d, fc_axis_h = axis_h_n, ref_l = 2, ref_s = 1, ref_h = 2, xtr_h = 1, xtr_nh = 0, pos = rail_pos) holes.append(shp_rail) holes.append(shp_rail_sunk) shp_holes = fcfun.fuseshplist(holes) shp_holder = shp_box.cut(shp_holes) self.shp = shp_holder if wfco == 1: super().create_fco() # Need to set first in (0,0,0) and after that set the real placement. # This enable to do rotations without any issue self.fco.Placement.Base = FreeCAD.Vector(0,0,0) self.fco.Placement.Base = self.position
def __init__(self, filter_l=60., filter_w=25., filter_t=2.5, base_h=6., hold_d=12., filt_supp_in=2., filt_rim=3., filt_cen_d=0, fillet_r=1., # linear guides SEBLV16 y SEBS15, y MGN12H: boltcol1_dist=20 / 2., boltcol2_dist=12.5, # thorlabs breadboard distance boltcol3_dist=25, boltrow1_h=0, boltrow1_2_dist=12.5, # linear guide MGN12H boltrow1_3_dist=20., # linear guide SEBLV16 and SEBS15 boltrow1_4_dist=25., bolt_cen_mtr=4, bolt_linguide_mtr=3, # linear guide bolts beltclamp_t=3., beltclamp_l=12., beltclamp_h=8., clamp_post_dist=4., sm_beltpost_r=1., tol=kcomp.TOL, axis_d=VX, axis_w=VY, axis_h=VZ, pos_d=0, pos_w=0, pos_h=0, pos=V0, model_type=0, # exact name=''): default_name = 'filter_holder' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # calculation of the dimensions: # hole for the filter, including tolerances: # Note that now the dimensions width and length are changed. # to depth and width # they are relative to the holder, not to the filter # no need to have the tolerances here: self.filt_hole_d = filter_w # + tol # depth self.filt_hole_w = filter_l # + tol # width in holder axis self.filt_hole_h = filter_t # + tol/2. # 0.5 tolerance for height # The hole under the filter to let the light go through # and big enough to hold the filter # we could take filter_hole dimensions or filter dimensiones # just the tolerance difference self.filt_supp_d = self.filt_hole_d - 2 * filt_supp_in self.filt_supp_w = self.filt_hole_w - 2 * filt_supp_in # look for the largest bolt head in the first row: # dictionary of the center bolt and 2nd and 3rd column self.bolt_cen_dict = kcomp.D912[bolt_cen_mtr] self.bolt_cen_head_r_tol = self.bolt_cen_dict['head_r_tol'] self.bolt_cen_r_tol = self.bolt_cen_dict['shank_r_tol'] self.bolt_cen_head_l_tol = self.bolt_cen_dict['head_l_tol'] # dictionary of the 1st column bolts (for the linear guide) self.bolt_linguide_dict = kcomp.D912[bolt_linguide_mtr] self.bolt_linguide_head_r_tol = self.bolt_linguide_dict['head_r_tol'] self.bolt_linguide_r_tol = self.bolt_linguide_dict['shank_r_tol'] self.bolt_linguide_head_l_tol = self.bolt_linguide_dict['head_l_tol'] max_row1_head_r_tol = max(self.bolt_linguide_head_r_tol, self.bolt_cen_head_r_tol) if boltrow1_h == 0: self.boltrow1_h = 2 * max_row1_head_r_tol elif boltrow1_h < 2 * max_row1_head_r_tol: self.boltrow1_h = 2 * max_row1_head_r_tol msg1 = 'boltrow1_h smaller than bolt head diameter' msg2 = 'boltrow1_h will be bolt head diameter' logger.warning(msg1 + msg2 + str(self.boltrow1_h)) # else # it will be as it is self.hold_h = (base_h + self.boltrow1_h + boltrow1_4_dist + 2 * self.bolt_linguide_head_r_tol) self.tot_h = self.hold_h + beltclamp_h self.beltclamp_blk_t = (hold_d - beltclamp_t) / 2. # the large radius of the belt post self.lr_beltpost_r = (hold_d - 3) / 2. min_filt_cen_d = hold_d + filt_rim + filter_w / 2. if filt_cen_d == 0: filt_cen_d = hold_d + filt_rim + filter_w / 2. elif filt_cen_d < min_filt_cen_d: filt_cen_d = hold_d + filt_rim + filter_w / 2. msg = 'filt_cen_d is smaller than needed, taking: ' logger.warning(msg + str(filt_cen_d)) self.filt_cen_d = filt_cen_d self.tot_d = self.filt_cen_d + filter_w / 2. + filt_rim # find out if the max width if given by the filter or the holder base_w = filter_l + 2 * filt_rim hold_w = 2 * boltcol3_dist + 4 * self.bolt_cen_head_r_tol self.tot_w = max(base_w, hold_w) self.beltpost_l = (3 * self.lr_beltpost_r) + sm_beltpost_r self.clamp_lrbeltpostcen_dist = (self.beltpost_l - self.lr_beltpost_r + self.clamp_post_dist) self.d0_cen = 0 self.w0_cen = 1 # symmetrical self.h0_cen = 0 self.d_o[0] = V0 self.d_o[1] = self.vec_d(self.beltclamp_blk_t) self.d_o[2] = self.vec_d(hold_d / 2.) self.d_o[3] = self.vec_d(hold_d - self.beltclamp_blk_t) # at the beginning of the bolt head hole for the central bolt self.d_o[4] = self.vec_d(hold_d - self.bolt_cen_head_l_tol) self.d_o[5] = self.vec_d(hold_d - self.bolt_linguide_head_l_tol) self.d_o[6] = self.vec_d(hold_d) # at the beginning of the hole of the porta (no tolerance): self.d_o[7] = self.vec_d(self.filt_cen_d - filter_w / 2.) # inner side of porta thruhole self.d_o[8] = self.d_o[7] + self.vec_d(filt_supp_in) # at the center of the porta: self.d_o[9] = self.vec_d(self.filt_cen_d) # outer side of porta thruhole self.d_o[10] = self.vec_d(self.filt_cen_d + filter_w / 2. - filt_supp_in) # at the end of the hole of the porta (no tolerance): self.d_o[11] = self.vec_d(self.filt_cen_d + filter_w / 2.) self.d_o[12] = self.vec_d(self.tot_d) # these are negative because actually the pos_w indicates a negative # position along axis_w self.w_o[0] = V0 # 1: at the first bolt column self.w_o[1] = self.vec_w(-boltcol1_dist) # 2: at the second bolt column self.w_o[2] = self.vec_w(-boltcol2_dist) # 3: at the third bolt column self.w_o[3] = self.vec_w(-boltcol3_dist) # 4: at the inner side of the clamp post (larger circle) self.w_o[4] = self.vec_w(self.beltpost_l + clamp_post_dist + beltclamp_l - self.tot_w / 2.) # 5: at the outer side of the clamp post (smaller circle) self.w_o[5] = self.vec_w(clamp_post_dist + beltclamp_l - self.tot_w / 2.) # 6: at the inner side of the clamp rails # add belt_clamp because w_o are negative self.w_o[6] = self.vec_w(beltclamp_l - self.tot_w / 2.) # 7: at the end of the piece self.w_o[7] = self.vec_w(-self.tot_w / 2.) # 0: at the bottom (base) self.h_o[0] = V0 # 1: at the base for the porta self.h_o[1] = self.vec_h(base_h - self.filt_hole_h) # 2: at the top of the base self.h_o[2] = self.vec_h(base_h) # 3: first row of bolts self.h_o[3] = self.vec_h(base_h + self.boltrow1_h) # 4: second row of bolts self.h_o[4] = self.h_o[3] + self.vec_h(boltrow1_2_dist) # 5: third row of bolts, taking self.h_o[3] self.h_o[5] = self.h_o[3] + self.vec_h(boltrow1_3_dist) # 6: 4th row of bolts self.h_o[6] = self.h_o[3] + self.vec_h(boltrow1_4_dist) # 7: at the base of the belt clamp self.h_o[7] = self.vec_h(self.hold_h) # 8: at the middle of the belt clamp self.h_o[8] = self.vec_h(self.hold_h + self.beltclamp_h / 2.) # 9: at the top of the piece self.h_o[9] = self.vec_h(self.tot_h) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # -------- building of the piece # the base shp_base = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=base_h, fc_axis_w=self.axis_w, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.pos_o) shp_base = fcfun.shp_filletchamfer_dir(shp_base, self.axis_h, fillet=1, radius=fillet_r) shp_base = shp_base.removeSplitter() # the holder to attach to a linear guide shp_holder = fcfun.shp_boxdir_fillchmfplane( box_w=self.tot_w, box_d=hold_d, box_h=self.hold_h, axis_d=self.axis_d, axis_h=self.axis_h, cw=1, cd=0, ch=0, fillet=1, radius=fillet_r, plane_fill=self.axis_d.negative(), both_planes=0, edge_dir=self.axis_h, pos=self.pos_o) shp_base = shp_base.removeSplitter() shp_l = shp_base.fuse(shp_holder) shp_l = shp_l.removeSplitter() # pos (6,0,2): position at the corner of the L shp_l = fcfun.shp_filletchamfer_dirpt(shp_l, fc_axis=self.axis_w, fc_pt=self.get_pos_dwh(6, 0, 2), fillet=0, radius=fillet_r) shp_l = shp_l.removeSplitter() # now we have the L shape with its chamfers and fillets # ------------------- Holes for the filter # include tolerances, along nh: only half of it, along h= 1 to make # the cut # pos (9,0,1) position at the center of the porta, at its bottom shp_filter_hole = fcfun.shp_box_dir_xtr(box_w=self.filt_hole_w, box_d=self.filt_hole_d, box_h=self.filt_hole_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=1, ch=0, xtr_h=1, xtr_nh=tol / 2., xtr_d=tol, xtr_nd=tol, xtr_w=tol, xtr_nw=tol, pos=self.get_pos_dwh(9, 0, 1)) # pos (9,0,0) position at the center of the porta, at the bottom of the # piece # no extra on top because it will be fused with shp_filter_hole shp_filter_thruhole = fcfun.shp_box_dir_xtr(box_w=self.filt_supp_w, box_d=self.filt_supp_d, box_h=base_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=1, ch=0, xtr_h=0, xtr_nh=1, xtr_d=tol, xtr_nd=tol, xtr_w=tol, xtr_nw=tol, pos=self.get_pos_dwh(9, 0, 0)) shp_fuse_filter_hole = shp_filter_hole.fuse(shp_filter_thruhole) shp_l = shp_l.cut(shp_fuse_filter_hole) shp_l = shp_l.removeSplitter() # the L with the hole in the base is done # ---------------- Holes for the bolts bolt_list = [] shp_cen_bolt = fcfun.shp_bolt_dir(r_shank=self.bolt_cen_r_tol, l_bolt=hold_d, r_head=self.bolt_cen_head_r_tol, l_head=self.bolt_cen_head_l_tol, xtr_head=1, xtr_shank=1, support=0, # not at printing directi fc_normal=self.axis_d.negative(), pos_n=2, pos=self.get_pos_dwh(0, 0, 3)) bolt_list.append(shp_cen_bolt) # the rest of the bolts come in pairs: for w_side in [-1, 1]: # the wider bolts (although can be smaller) for cen_col, cen_row in zip([2, 3], [4, 3]): boltpos = self.get_pos_dwh(0, w_side * cen_col, cen_row) shp_cen_bolt = fcfun.shp_bolt_dir( r_shank=self.bolt_cen_r_tol, l_bolt=hold_d, r_head=self.bolt_cen_head_r_tol, l_head=self.bolt_cen_head_l_tol, xtr_head=1, xtr_shank=1, support=0, # not at printing directi fc_normal=self.axis_d.negative(), pos_n=2, pos=boltpos) bolt_list.append(shp_cen_bolt) # the smaller bolts (although can be larger). Linear guide # first row: boltpos = self.get_pos_dwh(0, w_side * 1, 3) shp_lin_bolt = fcfun.shp_bolt_dir( r_shank=self.bolt_linguide_r_tol, l_bolt=hold_d, r_head=self.bolt_linguide_head_r_tol, l_head=self.bolt_linguide_head_l_tol, xtr_head=1, xtr_shank=1, support=0, # not at printing directi fc_normal=self.axis_d.negative(), pos_n=2, pos=boltpos) bolt_list.append(shp_lin_bolt) # 3rd and 4th row. Just 2 shanks and a stadium per side for linrow in [5, 6]: boltpos = self.get_pos_dwh(0, w_side * 1, linrow) shp_lin_shank = fcfun.shp_cylcenxtr( r=self.bolt_linguide_r_tol, h=hold_d, normal=self.axis_d, ch=0, xtr_top=0, # no need: stadium xtr_bot=1, pos=boltpos) bolt_list.append(shp_lin_shank) # the stadium for both bolts head (they are too close) stadpos = self.get_pos_dwh(6, w_side * 1, 5) shp_stad = fcfun.shp_stadium_dir( length=boltrow1_4_dist - boltrow1_3_dist, radius=self.bolt_linguide_head_r_tol, height=self.bolt_linguide_head_l_tol, fc_axis_h=self.axis_d.negative(), fc_axis_l=self.axis_h, ref_l=2, ref_h=2, xtr_h=0, xtr_nh=1, pos=stadpos) bolt_list.append(shp_stad) shp_bolts = fcfun.fuseshplist(bolt_list) shp_l = shp_l.cut(shp_bolts) # ---------------- Belt clamps # at both sides clamp_list = [] for w_side in [-1, 1]: clamp_pos = self.get_pos_dwh(0, w_side * 7, 7) if w_side == 1: clamp_axis_w = self.axis_w.negative() else: clamp_axis_w = self.axis_w shp_clamp = fcfun.shp_box_dir_xtr( box_w=beltclamp_l, box_d=self.beltclamp_blk_t, box_h=beltclamp_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, fc_axis_w=clamp_axis_w, cw=0, cd=0, ch=0, xtr_nh=1, pos=clamp_pos) # fillet the corner shp_clamp = fcfun.shp_filletchamfer_dirpt(shp_clamp, self.axis_h, fc_pt=clamp_pos, fillet=1, radius=fillet_r) shp_clamp = shp_clamp.removeSplitter() clamp_list.append(shp_clamp) # the other clamp, with no fillet clamp_pos = self.get_pos_dwh(6, w_side * 7, 7) shp_clamp = fcfun.shp_box_dir_xtr( box_w=beltclamp_l, box_d=self.beltclamp_blk_t, box_h=beltclamp_h, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d.negative(), fc_axis_w=clamp_axis_w, cw=0, cd=0, ch=0, xtr_nh=1, pos=clamp_pos) clamp_list.append(shp_clamp) # the belt post beltpost_pos = self.get_pos_dwh(2, w_side * 5, 7) shp_beltpost = fcfun.shp_belt_dir( center_sep=2 * self.lr_beltpost_r, rad1=sm_beltpost_r, rad2=self.lr_beltpost_r, height=beltclamp_h, fc_axis_h=self.axis_h, fc_axis_l=clamp_axis_w, ref_l=3, ref_h=2, xtr_h=0, xtr_nh=1, pos=beltpost_pos) clamp_list.append(shp_beltpost) shp_filterholder = shp_l.multiFuse(clamp_list) shp_filterholder = shp_filterholder.removeSplitter() self.shp = shp_filterholder # Then the Part super().create_fco() # Need to set first in (0,0,0) and after that set the real placement. # This enable to do rotations without any issue self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): # so we keep the attributes by CylHole setattr(self, i, values[i])
def __init__ (self, block_dict, rail_dict, axis_d = VX, axis_w = V0, axis_h = VZ, pos_d = 0, pos_w = 0, pos_h = 0, pos = V0, model_type = 1, # dimensional model name = None): self.pos = FreeCAD.Vector(0,0,0) self.position = pos if name == None: self.name = block_dict['name'] + '_block' if rail_dict is None: self.rail_h = 0 self.rail_w = 0 else: self.rail_h = rail_dict['rh'] self.rail_w = rail_dict['rw'] if (axis_w is None) or (axis_w == V0): axis_w = axis_h.cross(axis_d) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) self.block_d = block_dict['bl'] self.block_ds = block_dict['bls'] self.block_w = block_dict['bw'] self.block_ws = block_dict['bws'] self.block_h = block_dict['bh'] self.linguide_h = block_dict['lh'] self.bolt_dsep = block_dict['boltlsep'] self.bolt_wsep = block_dict['boltwsep'] self.bolt_d = block_dict['boltd'] self.bolt_l = block_dict['boltl'] linguide_h = block_dict['lh'] # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self,i): setattr(self, i, values[i]) self.d0_cen = 1 # symmetric self.w0_cen = 1 # symmetric self.h0_cen = 0 if self.bolt_l == 0: # thruhole self.bolt_l = self.block_h self.thruhole = 1 else: self.thruhole = 0 if self.rail_h == 0 or linguide_h == 0: self.rail_h = 0 self.linguide_h = 0 self.rail_ins_h = 0 self.rail_bot_h = 0 else: self.rail_ins_h = self.block_h - (self.linguide_h - self.rail_h) self.rail_bot_h = self.rail_h - self.rail_ins_h # vectors from the origin to the points along axis_d: self.d_o[0] = V0 # Origin (center symmetric) self.d_o[1] = self.vec_d(-self.bolt_dsep/2.) self.d_o[2] = self.vec_d(-self.block_ds/2.) self.d_o[3] = self.vec_d(-self.block_d/2.) # vectors from the origin to the points along axis_w: self.w_o[0] = V0 # Origin (center symmetric) self.w_o[1] = self.vec_w(-self.rail_w/2.) self.w_o[2] = self.vec_w(-self.bolt_wsep/2.) self.w_o[3] = self.vec_w(-self.block_ws/2.) self.w_o[4] = self.vec_w(-self.block_w/2.) # vectors from the origin to the points along axis_h: # could make more sense to have the origin at the top self.h_o[0] = V0 # Origin at the bottom self.h_o[1] = self.vec_h(self.rail_ins_h) self.h_o[2] = self.vec_h(self.block_h - self.bolt_l) self.h_o[3] = self.vec_h(self.block_h) self.h_o[4] = self.vec_h(-self.rail_bot_h) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # the main block shp_mblock = fcfun.shp_box_dir (box_w = self.block_w, box_d = self.block_ds, box_h = self.block_h, fc_axis_w = self.axis_w, fc_axis_d = self.axis_d, fc_axis_h = self.axis_h, cw = 1, cd = 1, ch = 0, pos = self.pos_o) # the extra block shp_exblock = fcfun.shp_box_dir (box_w = self.block_ws, box_d = self.block_d, box_h = self.block_h, fc_axis_w = self.axis_w, fc_axis_d = self.axis_d, fc_axis_h = self.axis_h, cw = 1, cd = 1, ch = 0, pos = self.pos_o) # fusion of these blocks shp_block = shp_mblock.fuse(shp_exblock) holes_list = [] # rail hole: if self.rail_h > 0 and self.rail_w > 0: wire_rail = fcfun.wire_lgrail( rail_w = self.rail_w, rail_h = self.rail_h, axis_w = self.axis_w, axis_h = self.axis_h, pos_w = 0, pos_h = 0, pos = self.get_pos_h(4)) face_rail = Part.Face(wire_rail) shp_rail = fcfun.shp_extrud_face (face = face_rail, length = self.block_d + 2, vec_extr_axis = self.axis_d, centered = 1) #Part.show(shp_rail) holes_list.append(shp_rail) # bolt holes: for d_i in (-1, 1): # positions of the holes along axis_d for w_i in (-2, 2): # positions of the holes along axis_w shp_bolt = fcfun.shp_cylcenxtr ( r = self.bolt_d/2., h = self.bolt_l, normal = axis_h, ch = 0, xtr_top = 1, xtr_bot = self.thruhole, pos = self.get_pos_dwh(d_i, w_i, 2)) holes_list.append(shp_bolt) shp_holes = fcfun.fuseshplist(holes_list) shp_block = shp_block.cut(shp_holes) shp_block = shp_block.removeSplitter() self.shp = shp_block super().create_fco(self.name) # Need to set first in (0,0,0) and after that set the real placement. # This enable to do rotations without any issue self.fco.Placement.Base = FreeCAD.Vector(0,0,0) self.fco.Placement.Base = self.position
def __init__(self, alusize_d=50., alusize_w=30., alusize_h=50., dist_alu=30., dist_hole=36., wall_thick=4., bolt_wall_d=5., chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'board' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h # calculation of the bolt to hold the base to the profile self.boltshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt_wall_d]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt_wall_d]['head_r'] self.bolthead_l = kcomp.D912[bolt_wall_d]['head_l'] self.bolthead_l_tol = kcomp.D912[bolt_wall_d]['head_l_tol'] # making the big box that will contain everything and will be cut self.tot_w = alusize_w + 4.5 self.tot_h = wall_thick + alusize_h / 2. self.tot_d = 2 * alusize_d - 20. + dist_alu + 8.5 # definition of which axis is symmetrical self.h0_cen = 0 self.d0_cen = 0 # symmetrical self.w0_cen = 1 # symmetrical # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(alusize_d / 2. - 10. + 4.25) self.d_o[2] = self.vec_d(alusize_d - 10. + 4.25 + TOL) self.d_o[3] = self.vec_d(alusize_d - 10. + 4.25 + dist_alu / 2.) self.d_o[4] = self.vec_d(alusize_d - 10. + 4.25 + dist_alu - TOL) self.d_o[5] = self.vec_d(alusize_d - 10. + 4.25 + dist_alu + alusize_d / 2.) self.d_o[6] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-(dist_hole / 2.)) self.w_o[2] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.pos_o) # make the shape of the piece cut = [] cut_box1 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d - 10. + 4.25 + TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(0, 0, 1)) cut.append(cut_box1) cut_box2 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d - 10. + 4.25 + TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(4, 0, 1)) cut.append(cut_box2) # holes to hold the profile cut_hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(1, -1, 0)) cut.append(cut_hole1) cut_hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(1, 1, 0)) cut.append(cut_hole2) cut_hole3 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(5, -1, 0)) cut.append(cut_hole3) cut_hole4 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(5, 1, 0)) cut.append(cut_hole4) # holes to hold de screw hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(3, -1, 2)) cut.append(hole1) hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(3, 1, 2)) cut.append(hole2) shp_cut = fcfun.fuseshplist(cut) shp_fuse = shp_box.cut(shp_cut) for pt_d in (0, 2, 4, 6): for pt_w in (-2, 2): shp_fuse = fcfun.shp_filletchamfer_dirpt( shp_fuse, fc_axis=self.axis_h, fc_pt=self.get_pos_dwh(pt_d, pt_w, 1), fillet=1, radius=chmf_r) self.shp = shp_fuse # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__ (self, depth, aluprof_dict, xtr_d=0, xtr_nd=0, axis_d = VX, axis_w = VY, axis_h = V0, pos_d = 0, pos_w = 0, pos_h = 0, pos = V0, model_type = 1, # dimensional model name = None): width = aluprof_dict['w'] depth = depth thick = aluprof_dict['t'] slot = aluprof_dict['slot'] insquare = aluprof_dict['insq'] indiam = aluprof_dict['indiam'] # either axis_w or axis_h can be V0, but not both if (axis_w is None) or (axis_w == V0): if (axis_h is None) or (axis_h == V0): logger.error('Either axis_w or axis_h must be defined') logger.warning('getting a random perpendicular verctor') axis_w = fcfun.get_fc_perpend1(axis_d) else: axis_w = axis_h.cross(axis_d) if (axis_h is None) or (axis_h == V0): axis_h = axis_d.cross(axis_w) if name == None: name = ( 'aluprof_w' + str(int(aluprof_dict['w'])) + 'l_' + str(int(xtr_nd + depth + xtr_d))) Obj3D.__init__(self, axis_d, axis_w, axis_h, name = name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self,i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0,0,0) self.position = pos self.d0_cen = 0 self.w0_cen = 1 # symmetric self.h0_cen = 1 # symmetric # total length (depth) self.tot_d = xtr_nd + depth + xtr_d # vectors from the origin to the points along axis_d: self.d_o[0] = V0 # origin self.d_o[1] = self.vec_d(xtr_nd) #if xtr_nd= 0: same as d_o[0] # middle point, not considering xtr_nd and xtr_d self.d_o[2] = self.vec_d(xtr_nd + depth/2.) # middle point considering xtr_nd and xtr_d self.d_o[3] = self.vec_d(self.tot_d /2.) self.d_o[4] = self.vec_d(xtr_nd + depth) self.d_o[5] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w: # symmetric: negative self.w_o[0] = V0 # center: origin self.w_o[1] = self.vec_w(-insquare/2.) self.w_o[2] = self.vec_w(-(width/2. - thick)) self.w_o[3] = self.vec_w(-width/2.) # vectors from the origin to the points along axis_h: # symmetric: negative self.h_o[0] = V0 # center: origin self.h_o[1] = self.vec_h(-insquare/2.) self.h_o[2] = self.vec_h(-(width/2. - thick)) self.h_o[3] = self.vec_h(-width/2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() shp_alu_wire = fcfun.shp_aluwire_dir (width, thick, slot, insquare, fc_axis_x = self.axis_w, fc_axis_y = self.axis_h, ref_x = 1, # pos_o is centered ref_y = 1, # pos_o is centered pos = self.pos_o) # make a face of the wire shp_alu_face = Part.Face (shp_alu_wire) # inner hole if indiam > 0 : hole = Part.makeCircle (indiam/2., # Radius self.pos_o, # Position self.axis_d) # direction wire_hole = Part.Wire(hole) face_hole = Part.Face(wire_hole) shp_alu_face = shp_alu_face.cut(face_hole) # extrude it dir_extrud = DraftVecUtils.scaleTo(self.axis_d, self.tot_d) shp_aluprof = shp_alu_face.extrude(dir_extrud) self.shp = shp_aluprof super().create_fco() # Need to set first in (0,0,0) and after that set the real placement. # This enable to do rotations without any issue self.fco.Placement.Base = FreeCAD.Vector(0,0,0) self.fco.Placement.Base = self.position
def __init__(self, xtr_lat = 5., xtr_holes = 8., h_bottom = 1., d_bottom = 2., h_rail = 2., h_base = 2., dist_holes = 49., wall_thick = 4., reinf_thick = 3., arduino_w = 53., arduino_d = 105., arduino_h = 5., sides = 10., bolt = 5., chmf_r = 1., axis_h = VZ, axis_d = VX, axis_w = None, pos_h = 1, pos_d = 3, pos_w = 0, pos = V0, name = ''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'bottom_coverplate' self.set_name(name, default_name, change = 0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self,i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h # calculation of the bolt to hold the bottom coverplate to the wood self.boltshank_r_tol = kcomp.D912[bolt]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt]['head_r'] self.bolthead_l = kcomp.D912[bolt]['head_l'] # making the big box that will contain everything and will be cut self.tot_d = 2 * sides + arduino_d + d_bottom self.tot_w = arduino_w + 2 * wall_thick - 2. + 2 * xtr_holes self.tot_h = h_base + arduino_h + h_bottom # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(h_base) self.h_o[2] = self.vec_h(h_base + arduino_h - h_rail) self.h_o[3] = self.vec_h(h_base + arduino_h) self.h_o[4] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(sides/2.) self.d_o[2] = self.vec_d(sides) self.d_o[3] = self.vec_d(sides + xtr_lat) self.d_o[4] = self.vec_d(sides + xtr_lat + xtr_holes/2.) self.d_o[5] = self.vec_d(sides + xtr_lat + xtr_holes) self.d_o[6] = self.vec_d(sides + arduino_d - 3. - xtr_holes) self.d_o[7] = self.vec_d(sides + arduino_d - 3. - xtr_lat) self.d_o[8] = self.vec_d(sides + arduino_d - 3. - xtr_holes/2) self.d_o[9] = self.vec_d(sides + arduino_d + d_bottom - xtr_holes) self.d_o[10] = self.vec_d(sides + arduino_d + d_bottom - xtr_holes/2) self.d_o[11] = self.vec_d(sides + arduino_d - 3.) self.d_o[12] = self.vec_d(sides + arduino_d) self.d_o[13] = self.vec_d(sides + arduino_d + d_bottom) self.d_o[14] = self.vec_d(sides + arduino_d + d_bottom + sides/2.) self.d_o[15] = self.vec_d(self.tot_d) # position along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-(arduino_w - 2. - 2 * xtr_lat)/2.) self.w_o[2] = self.vec_w(-(arduino_w - 2.)/2.) self.w_o[3] = self.vec_w(-dist_holes/2.) self.w_o[4] = self.vec_w(-(arduino_w + 2 * wall_thick - 2.)/2.) self.w_o[5] = self.vec_w(-(arduino_w + 2 * wall_thick - 2. + xtr_holes)/2.) self.w_o[6] = self.vec_w(-self.tot_w/2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box shp_box = fcfun.shp_box_dir(box_w = self.tot_w, box_d = self.tot_d, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.pos_o) cut = [] for pt_d in (0, 11): shp_lat1 = fcfun.shp_box_dir(box_w = xtr_holes, box_d = sides + xtr_lat, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(pt_d, -4, 0)) cut.append(shp_lat1) shp_lat2 = fcfun.shp_box_dir(box_w = - xtr_holes, box_d = sides + xtr_lat, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(pt_d, 4, 0)) cut.append(shp_lat2) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_box.cut(shp_cut) for pt_d in (0, 15): for pt_w in (-4, 4): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) cut = [] for pt_d in (3, 6): shp_lat3 = fcfun.shp_box_dir(box_w = xtr_holes, box_d = xtr_holes, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(pt_d, -4, 1)) cut.append(shp_lat3) shp_lat4 = fcfun.shp_box_dir(box_w = - xtr_holes, box_d = xtr_holes, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(pt_d, 4, 1)) cut.append(shp_lat4) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_final.cut(shp_cut) for pt_d in (3, 11): for pt_w in (-6, 6): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) cut = [] shp_lat5 = fcfun.shp_box_dir(box_w = xtr_holes, box_d = self.tot_d - 2 * (sides + xtr_lat + xtr_holes), box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(5, -4, 0)) cut.append(shp_lat5) shp_lat6 = fcfun.shp_box_dir(box_w = - xtr_holes, box_d = self.tot_d - 2 * (sides + xtr_lat + xtr_holes), box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 0, cd = 0, ch = 0, pos = self.get_pos_dwh(5, 4, 0)) cut.append(shp_lat6) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_final.cut(shp_cut) for pt_d in (5, 6): for pt_w in (-6, 6): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) cut = [] for pt_d in (0, 13): shp_sides = fcfun.shp_box_dir(box_w = self.tot_w, box_d = sides, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(pt_d, 0, 1)) cut.append(shp_sides) shp_intern = fcfun.shp_box_dir(box_w = arduino_w - 2., box_d = arduino_d - 3., box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(2, 0, 1)) cut.append(shp_intern) shp_int = fcfun.shp_box_dir(box_w = arduino_w - 2., box_d = arduino_d, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(2, 0, 2)) cut.append(shp_int) shp_rail = fcfun.shp_box_dir(box_w = arduino_w + 2 * TOL, box_d = arduino_d, box_h = h_rail, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(2, 0, 2)) cut.append(shp_rail) trim_mat = fcfun.shp_box_dir(box_w = arduino_w - 2. - 2 * xtr_lat, box_d = arduino_d - 3. - 2 * xtr_lat, box_h = self.tot_h, fc_axis_h = axis_h, fc_axis_d = axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(3, 0, 0)) cut.append(trim_mat) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_final.cut(shp_cut) for pt_d in (2, 13): for pt_w in (-4, 4): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) for pt_w in (-2, 2): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(12, pt_w, 3), fillet = 1, radius = chmf_r) for pt_h in (1, 3): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(2, pt_w, pt_h), fillet = 1, radius = chmf_r) cut = [] for pt_d in (1, 14): for pt_w in (-3, 3): shp_hole = fcfun.shp_cylcenxtr(r = self.boltshank_r_tol, h = h_base, normal = self.axis_h, ch = 0, xtr_top = 1, xtr_bot = 1, pos = self.get_pos_dwh(pt_d, pt_w, 0)) cut.append(shp_hole) for pt_d in (4, 8): for pt_w in (-5, 5): shp_hole = fcfun.shp_cylcenxtr(r = self.boltshank_r_tol, h = h_base, normal = self.axis_h, ch = 0, xtr_top = 1, xtr_bot = 1, pos = self.get_pos_dwh(pt_d, pt_w, 0)) cut.append(shp_hole) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_final.cut(shp_cut) shp_final = shp_final.removeSplitter() for pt_d in (5, 6): for pt_w in (-4, 4): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) for pt_d in (3, 7): for pt_w in (-1, 1): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = 4 * chmf_r) for pt_d in (3, 11): for pt_w in (-4, 4): shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_h, fc_pt = self.get_pos_dwh(pt_d, pt_w, 0), fillet = 1, radius = chmf_r) doc.recompute() self.shp = shp_final # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, alusize_d=50., alusize_w=30., alusize_h=50., dist_alu=30., wall_thick=4., bolt_wall_d=4., opt_sides=1, chmf_r=1., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'board' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h # calculation of the bolt to hold the base to the profile self.boltshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt_wall_d]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt_wall_d]['head_r'] self.bolthead_l = kcomp.D912[bolt_wall_d]['head_l'] self.bolthead_l_tol = kcomp.D912[bolt_wall_d]['head_l_tol'] # making the big box that will contain everything and will be cut self.tot_w = alusize_w self.tot_h = wall_thick + alusize_h / 2. if opt_sides == 0: self.tot_d = 2 * alusize_d + dist_alu else: self.tot_d = 2 * wall_thick + 2 * alusize_d + dist_alu # definition of which axis is symmetrical self.h0_cen = 0 self.d0_cen = 0 # symmetrical self.w0_cen = 1 # symmetrical # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(self.tot_h) # position along axis_d if opt_sides == 0: self.d_o[0] = V0 self.d_o[1] = self.vec_d(alusize_d / 4.) self.d_o[2] = self.vec_d(3 * alusize_d / 4.) self.d_o[3] = self.vec_d(alusize_d + TOL) self.d_o[4] = self.vec_d(alusize_d + dist_alu / 2.) self.d_o[5] = self.vec_d(alusize_d + dist_alu - TOL) self.d_o[6] = self.vec_d(alusize_d + dist_alu + alusize_d / 4.) self.d_o[7] = self.vec_d(alusize_d + dist_alu + 3 * alusize_d / 4.) self.d_o[8] = self.vec_d(self.tot_d) else: self.d_o[0] = V0 self.d_o[1] = self.vec_d(wall_thick - TOL) self.d_o[2] = self.vec_d(wall_thick + alusize_d / 4.) self.d_o[3] = self.vec_d(wall_thick + 3 * alusize_d / 4.) self.d_o[4] = self.vec_d(wall_thick + alusize_d + TOL) self.d_o[5] = self.vec_d(wall_thick + alusize_d + dist_alu / 2.) self.d_o[6] = self.vec_d(wall_thick + alusize_d + dist_alu - TOL) self.d_o[7] = self.vec_d(wall_thick + alusize_d + dist_alu + alusize_d / 4.) self.d_o[8] = self.vec_d(wall_thick + alusize_d + dist_alu + 3 * alusize_d / 4.) self.d_o[9] = self.vec_d(wall_thick + alusize_d + dist_alu + alusize_d + TOL) self.d_o[10] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-(alusize_w / 2. - 5.)) self.w_o[2] = self.vec_w(-self.tot_w / 2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box if opt_sides == 0: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.pos_o) super().add_child(shp_box, 1, 'shp_box') # make the shape of the piece cut_box1 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d + TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(0, 0, 1)) super().add_child(cut_box1, 0, 'cut_box1') cut_box2 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d + TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(5, 0, 1)) super().add_child(cut_box2, 0, 'cut_box2') # holes to hold the profile cut_hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(1, -1, 0)) super().add_child(cut_hole1, 0, 'cut_hole1') cut_hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(1, 1, 0)) super().add_child(cut_hole2, 0, 'cut_hole2') cut_hole3 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(2, -1, 0)) super().add_child(cut_hole3, 0, 'cut_hole3') cut_hole4 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(2, 1, 0)) super().add_child(cut_hole4, 0, 'cut_hole4') cut_hole5 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(6, -1, 0)) super().add_child(cut_hole5, 0, 'cut_hole5') cut_hole6 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(6, 1, 0)) super().add_child(cut_hole6, 0, 'cut_hole6') cut_hole7 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(7, 1, 0)) super().add_child(cut_hole7, 0, 'cut_hole7') cut_hole8 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(7, -1, 0)) super().add_child(cut_hole8, 0, 'cut_hole8') # holes to hold de screw hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(4, -1, 2)) super().add_child(hole1, 0, 'hole1') hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(4, 1, 2)) super().add_child(hole2, 0, 'hole2') else: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.pos_o) super().add_child(shp_box, 1, 'shp_box') # make the shape of the piece cut_box1 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d + 2 * TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(1, 0, 1)) super().add_child(cut_box1, 0, 'cut_box1') cut_box2 = fcfun.shp_box_dir(box_w=self.tot_w, box_d=alusize_d + 2 * TOL, box_h=alusize_h, fc_axis_d=self.axis_d, fc_axis_h=self.axis_h, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(6, 0, 1)) super().add_child(cut_box2, 0, 'cut_box2') # holes to hold the profile cut_hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(2, -1, 0)) super().add_child(cut_hole1, 0, 'cut_hole1') cut_hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(2, 1, 0)) super().add_child(cut_hole2, 0, 'cut_hole2') cut_hole3 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(3, -1, 0)) super().add_child(cut_hole3, 0, 'cut_hole3') cut_hole4 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(3, 1, 0)) super().add_child(cut_hole4, 0, 'cut_hole4') cut_hole5 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(7, -1, 0)) super().add_child(cut_hole5, 0, 'cut_hole5') cut_hole6 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(7, 1, 0)) super().add_child(cut_hole6, 0, 'cut_hole6') cut_hole7 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(8, 1, 0)) super().add_child(cut_hole7, 0, 'cut_hole7') cut_hole8 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=wall_thick, r_head=self.bolthead_r_tol, l_head=wall_thick / 2., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h, pos_n=0, pos=self.get_pos_dwh(8, -1, 0)) super().add_child(cut_hole8, 0, 'cut_hole8') # holes to hold de screw hole1 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(5, -1, 2)) super().add_child(hole1, 0, 'hole1') hole2 = fcfun.shp_bolt_dir(r_shank=self.boltshank_r_tol, l_bolt=self.tot_h, r_head=self.bolthead_r_tol, l_head=13 * self.tot_h / 20., xtr_head=1, xtr_shank=1, fc_normal=self.axis_h.negative(), pos_n=0, pos=self.get_pos_dwh(5, 1, 2)) super().add_child(hole2, 0, 'hole2') super().make_parent(name) if opt_sides == 0: for pt_d in (0, 3, 5, 8): for pt_w in (-2, 2): self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, fc_axis=self.axis_h, fc_pt=self.get_pos_dwh(pt_d, pt_w, 1), fillet=1, radius=chmf_r) else: for pt_w in (-2, 2): for pt_d in (0, 1, 4, 6, 9, 10): self.shp = fcfun.shp_filletchamfer_dirpt( self.shp, fc_axis=self.axis_h, fc_pt=self.get_pos_dwh(pt_d, pt_w, 2), fillet=1, radius=chmf_r) # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, nema_size = 17, wall_thick = 4., motor_thick = 4., reinf_thick = 4., motor_min_h = 10., motor_max_h = 20., motor_xtr_space = 2., xtr_diam_cir = 8., diam_cir = 28.,bolt_wall_d = 3., bolt_wall_d_rail = 4., bolt_wall_sep = 30., rail = 1, chmf_r = 1., angle = 45., axis_h = VZ, axis_d = VX, axis_w = None, pos_h = 1, pos_d = 3, pos_w = 0, pos = V0, name = ''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'NemaMotorHolder' self.set_name(name, default_name, change = 0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) shp_clss.Obj3D.__init__(self, axis_d, axis_w, axis_h) # save the arguments as attributes frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self,i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h self.motor_w = kcomp.NEMA_W[nema_size] self.motor_bolt_sep = kcomp.NEMA_BOLT_SEP[nema_size] self.motor_bolt_d = kcomp.NEMA_BOLT_D[nema_size] # calculation of the bolt wall d self.boltwallshank_r_tol = kcomp.D912[bolt_wall_d]['shank_r_tol'] self.boltwallhead_l = kcomp.D912[bolt_wall_d]['head_l'] self.boltwallhead_r_tol = kcomp.D912[bolt_wall_d]['head_r_tol'] self.boltwallhead_r = kcomp.D912[bolt_wall_d]['head_r'] self.washer_thick = kcomp.WASH_D125_T[bolt_wall_d] # calculation of the bolt wall d rail self.boltwallshank_r_tol_rail = kcomp.D912[bolt_wall_d_rail]['shank_r_tol'] self.boltwallhead_l_rail = kcomp.D912[bolt_wall_d_rail]['head_l'] self.boltwallhead_r_rail = kcomp.D912[bolt_wall_d_rail]['head_r'] self.washer_thick_rail = kcomp.WASH_D125_T[bolt_wall_d_rail] # calculation of the bolt wall separation self.max_bolt_wall_sep = self.motor_w - 2 * self.boltwallhead_r if bolt_wall_sep == 0: self.bolt_wall_sep = self.max_bolt_wall_sep elif bolt_wall_sep > self.max_bolt_wall_sep: logger.debug('bolt separation too large:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.max_bolt_wall_sep logger.debug('taking largest value:' + str(self.bolt_wall_sep)) elif bolt_wall_sep < 4 * self.boltwallhead_r: logger.debug('bolt separation too short:' + str(bolt_wall_sep)) self.bolt_wall_sep = self.self.max_bolt_wall_sep logger.debug('taking smallest value:' + str(self.bolt_wall_sep)) # distance from the motor to the inner wall (in axis_d) self.motor_inwall_space = motor_xtr_space + self.boltwallhead_l + self.washer_thick # making the big box that will contain everything and will be cut self.tot_h = motor_thick + motor_max_h + 2 * bolt_wall_d self.tot_w = 2 * reinf_thick + self.motor_w + 2 * motor_xtr_space self.tot_d = wall_thick + self.motor_w + self.motor_inwall_space # distance from the motor axis to the wall (in axis_d) self.motax2wall = wall_thick + self.motor_inwall_space + self.motor_w/2. # self.d_circle = math.sin(math.radians(angle))*(diam_cir/2.) self.w_circle = math.cos(math.radians(angle))*(diam_cir/2.) # definition of which axis is symmetrical self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(motor_thick) self.h_o[2] = self.vec_h(motor_thick + motor_min_h) self.h_o[3] = self.vec_h(motor_thick + motor_max_h) self.h_o[4] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(wall_thick) self.d_o[2] = self.vec_d(self.motax2wall - self.d_circle) self.d_o[3] = self.vec_d(self.motax2wall) self.d_o[4] = self.vec_d(self.motax2wall + self.d_circle) self.d_o[5] = self.vec_d(self.tot_d) # vectors from the origin to the points along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.bolt_wall_sep/2.) self.w_o[2] = self.vec_w(self.w_circle + TOL) self.w_o[3] = self.vec_w(-self.tot_w/2.) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box, extra height and depth to cut all the way back and down shp_box = fcfun.shp_box_dir(box_w = self.tot_w, box_d = self.tot_d, box_h = self.tot_h, fc_axis_h = self.axis_h, fc_axis_d = self.axis_d, cw = 1, cd = 0, ch = 0, pos = self.pos_o) # little chamfer at the corners, if fillet there are some problems shp_box = fcfun.shp_filletchamfer_dir(shp_box, self.axis_h, fillet = 0, radius = chmf_r) shp_box = shp_box.removeSplitter() # chamfer of the box to make a 'triangular' reinforcement chmf_reinf_r = min(self.tot_d - wall_thick, self.tot_h - motor_thick) shp_box = fcfun.shp_filletchamfer_dirpt(shp_box, self.axis_w, fc_pt = self.get_pos_dwh(5, 0, 4), fillet = 0, radius = chmf_reinf_r) shp_box = shp_box.removeSplitter() # holes holes = [] # the space for the motor shp_motor = fcfun.shp_box_dir(box_w = self.motor_w + 2 * motor_xtr_space, box_d = self.tot_d + chmf_r, box_h = self.tot_h, fc_axis_h = self.axis_h, fc_axis_d = self.axis_d, cw = 1, cd = 0, ch = 0, pos = self.get_pos_dwh(1, 0, 1)) shp_motor = fcfun.shp_filletchamfer_dir(shp_motor, self.axis_h, fillet = 0, radius = chmf_r) holes.append(shp_motor) # central circle of the motor shp_hole = fcfun.shp_cylcenxtr(r = (self.motor_bolt_sep - self.motor_bolt_d - xtr_diam_cir + TOL)/2., h = motor_thick, normal = self.axis_h, ch = 0, xtr_top = 1, xtr_bot = 1, pos = self.get_pos_d(3)) holes.append(shp_hole) # motor bolt holes for pt_d in (2, 4): for pt_w in (-2, 2): shp_hole = fcfun.shp_bolt_dir(r_shank = self.boltwallshank_r_tol, l_bolt = motor_thick, r_head = self.boltwallhead_r + TOL/3., l_head = 2, xtr_head = 1, xtr_shank = 1, fc_normal = self.axis_h, pos_n = 0, pos = self.get_pos_dwh(pt_d, pt_w, 0)) #shp_hole = fcfun.shp_cylcenxtr(r = self.boltwallshank_r_tol, h = motor_thick, normal = self.axis_h, ch = 0, xtr_top = 1, xtr_bot = 1, pos = self.get_pos_dwh(pt_d, pt_w, 0)) holes.append(shp_hole) # rail holes for pt_w in (-1, 1): if rail == 1: shp_hole = fcfun.shp_box_dir_xtr(box_w = 2 * self.boltwallshank_r_tol_rail, box_d = wall_thick, box_h = motor_max_h - motor_min_h, fc_axis_h = self.axis_h, fc_axis_d = self.axis_d, cw = 1, cd = 0, ch = 0, xtr_d = 1, xtr_nd = 1, pos = self.get_pos_dwh(0, pt_w, 2)) holes.append(shp_hole) # hole for the ending of the rails (4 semicircles) for pt_h in (2, 3): shp_hole = fcfun.shp_cylcenxtr(r = self.boltwallshank_r_tol_rail, h = wall_thick, normal = self.axis_d, ch = 0, xtr_top = 1, xtr_bot =1, pos = self.get_pos_dwh(0, pt_w, pt_h)) holes.append(shp_hole) shp_holes = fcfun.fuseshplist(holes) shp_motorholder = shp_box.cut(shp_holes) shp_bracket = shp_motorholder.removeSplitter() self.shp = shp_bracket # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position
def __init__(self, n_bolt=1, bra_w_1=22., bra_w_2=17., bra_d_1=21., bra_d_2=51., bra_h_1=21., bra_h_2=51., bolt=5., rail=1, d_rail=10., reinf_thick_1=3., reinf_thick_2=5., wall_thick=6., chmf_r=1., dist_bet_nuts=17., dist_hole=5., axis_h=VZ, axis_d=VX, axis_w=None, pos_h=1, pos_d=3, pos_w=0, pos=V0, name=''): if axis_w is None or axis_w == V0: axis_w = axis_h.cross(axis_d) #vector product default_name = 'alu_bracket' self.set_name(name, default_name, change=0) Obj3D.__init__(self, axis_d, axis_w, axis_h, self.name) # save the arguments as attributes: frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame) for i in args: if not hasattr(self, i): setattr(self, i, values[i]) self.pos = FreeCAD.Vector(0, 0, 0) self.position = pos # normal axes to print without support self.prnt_ax = self.axis_h # calculation of the bolt to hold the bottom coverplate to the wood self.boltshank_r_tol = kcomp.D912[bolt]['shank_r_tol'] self.bolthead_r = kcomp.D912[bolt]['head_l'] self.bolthead_r_tol = kcomp.D912[bolt]['head_r'] self.bolthead_l = kcomp.D912[bolt]['head_l'] # making the big box that will contain everything and will be cut if n_bolt == 1: self.tot_d = bra_d_1 + wall_thick self.tot_w = bra_w_1 + 2 * reinf_thick_1 self.tot_h = bra_h_1 + wall_thick else: self.tot_d = bra_d_2 + wall_thick self.tot_w = bra_w_2 + 2 * reinf_thick_2 self.tot_h = bra_h_2 + wall_thick # definition of which axis is symmetrical if n_bolt == 1: self.h0_cen = 0 self.w0_cen = 1 # symmetrical self.d0_cen = 0 else: self.h0_cen = 0 self.w0_cen = 0 self.d0_cen = 0 if n_bolt == 1: # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(wall_thick + dist_hole) self.h_o[3] = self.vec_h(wall_thick + bra_h_1 / 2.) self.h_o[4] = self.vec_h(wall_thick + dist_hole + d_rail) self.h_o[5] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(dist_hole) self.d_o[2] = self.vec_d(dist_hole + d_rail) self.d_o[3] = self.vec_d(bra_d_1 / 2.) self.d_o[4] = self.vec_d(bra_d_1) self.d_o[5] = self.vec_d(self.tot_d) # position along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-self.boltshank_r_tol) self.w_o[2] = self.vec_w(-bra_w_1 / 2.) self.w_o[3] = self.vec_w(-self.tot_w / 2.) else: # vectors from the origin to the points along axis_h self.h_o[0] = V0 self.h_o[1] = self.vec_h(wall_thick) self.h_o[2] = self.vec_h(wall_thick + dist_hole) self.h_o[3] = self.vec_h(wall_thick + dist_hole + d_rail / 2.) self.h_o[4] = self.vec_h(wall_thick + dist_hole + d_rail) self.h_o[5] = self.vec_h(wall_thick + dist_hole + d_rail + dist_bet_nuts) self.h_o[6] = self.vec_h(wall_thick + dist_hole + d_rail + dist_bet_nuts + d_rail / 2.) self.h_o[7] = self.vec_h(wall_thick + dist_hole + d_rail + dist_bet_nuts + d_rail) self.h_o[8] = self.vec_h(self.tot_h) # position along axis_d self.d_o[0] = V0 self.d_o[1] = self.vec_d(dist_hole) self.d_o[2] = self.vec_d(dist_hole + d_rail / 2.) self.d_o[3] = self.vec_d(dist_hole + d_rail) self.d_o[4] = self.vec_d(dist_hole + d_rail + dist_bet_nuts) self.d_o[5] = self.vec_d(dist_hole + d_rail + dist_bet_nuts + d_rail / 2.) self.d_o[6] = self.vec_d(dist_hole + d_rail + dist_bet_nuts + d_rail) self.d_o[7] = self.vec_d(bra_d_2) self.d_o[8] = self.vec_d(self.tot_d) # position along axis_w self.w_o[0] = V0 self.w_o[1] = self.vec_w(-reinf_thick_2) self.w_o[2] = self.vec_w(-(reinf_thick_2 + dist_hole)) self.w_o[3] = self.vec_w(-(reinf_thick_2 + dist_hole + self.boltshank_r_tol)) self.w_o[4] = self.vec_w(-(reinf_thick_2 + dist_hole + 2 * self.boltshank_r_tol)) self.w_o[5] = self.vec_w(-(reinf_thick_2 + bra_w_2)) self.w_o[6] = self.vec_w(-self.tot_w) # calculates the position of the origin, and keeps it in attribute pos_o self.set_pos_o() # make the whole box if n_bolt == 1: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=axis_h, fc_axis_d=axis_d, cw=1, cd=0, ch=0, pos=self.pos_o) cut = [] shp_box_int = fcfun.shp_box_dir(box_w=bra_w_1, box_d=bra_d_1, box_h=bra_h_1, fc_axis_h=axis_h, fc_axis_d=axis_d, cw=1, cd=0, ch=0, pos=self.get_pos_dwh(0, 0, 1)) cut.append(shp_box_int) if rail == 0: shp_hole1 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(3, 0, 0)) cut.append(shp_hole1) shp_hole2 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh(4, 0, 3)) cut.append(shp_hole2) else: shp_hole1 = fcfun.shp_box_dir_xtr( box_w=2 * self.boltshank_r_tol, box_d=d_rail, box_h=wall_thick, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=0, xtr_nd=0, pos=self.get_pos_dwh(1, 0, 0)) cut.append(shp_hole1) shp_hole2 = fcfun.shp_box_dir_xtr( box_w=2 * self.boltshank_r_tol, box_d=wall_thick, box_h=d_rail, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=0, xtr_nd=0, pos=self.get_pos_dwh(4, 0, 2)) cut.append(shp_hole2) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_box.cut(shp_cut) chmf_reinf_r = min(bra_d_1, bra_h_1) for pt_w in (-3, 3): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_w, fc_pt=self.get_pos_dwh(0, pt_w, 5), fillet=0, radius=chmf_reinf_r) shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_w, fc_pt=self.get_pos_dwh( 0, 0, 0), fillet=0, radius=chmf_r) shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_w, fc_pt=self.get_pos_dwh( 4, 0, 1), fillet=1, radius=chmf_r) for pt_h in (0, 5): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_w, fc_pt=self.get_pos_dwh(5, 0, pt_h), fillet=0, radius=chmf_r) if rail == 1: for pt_w in (-1, 1): for pt_d in (1, 2): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_h, fc_pt=self.get_pos_dwh(pt_d, pt_w, 0), fillet=1, radius=chmf_r) for pt_h in (2, 4): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_d, fc_pt=self.get_pos_dwh(4, pt_w, pt_h), fillet=1, radius=chmf_r) else: shp_box = fcfun.shp_box_dir(box_w=self.tot_w, box_d=self.tot_d, box_h=self.tot_h, fc_axis_h=axis_h, fc_axis_d=axis_d, cw=0, cd=0, ch=0, pos=self.pos_o) cut = [] shp_box_int = fcfun.shp_box_dir(box_w=bra_w_2 + reinf_thick_2, box_d=bra_d_2, box_h=bra_h_2, fc_axis_h=axis_h, fc_axis_d=axis_d, cw=0, cd=0, ch=0, pos=self.get_pos_dwh(0, 1, 1)) cut.append(shp_box_int) if rail == 0: for pt_d in (2, 5): shp_hole1 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_h, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh( pt_d, 3, 0)) cut.append(shp_hole1) for pt_h in (3, 6): shp_hole2 = fcfun.shp_cylcenxtr(r=self.boltshank_r_tol, h=wall_thick, normal=self.axis_d, ch=0, xtr_top=1, xtr_bot=1, pos=self.get_pos_dwh( 7, 3, pt_h)) cut.append(shp_hole2) else: for pt_d in (1, 4): shp_hole1 = fcfun.shp_box_dir_xtr( box_w=2 * self.boltshank_r_tol, box_d=d_rail, box_h=wall_thick, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=0, xtr_nd=0, pos=self.get_pos_dwh(pt_d, 3, 0)) cut.append(shp_hole1) for pt_h in (2, 5): shp_hole2 = fcfun.shp_box_dir_xtr( box_w=2 * self.boltshank_r_tol, box_d=wall_thick, box_h=d_rail, fc_axis_h=self.axis_h, fc_axis_d=self.axis_d, cw=1, cd=0, ch=0, xtr_d=0, xtr_nd=0, pos=self.get_pos_dwh(7, 3, pt_h)) cut.append(shp_hole2) shp_cut = fcfun.fuseshplist(cut) shp_final = shp_box.cut(shp_cut) chmf_reinf_r = min(bra_d_2, bra_h_2) shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_w, fc_pt=self.get_pos_dwh( 0, 1, 8), fillet=0, radius=chmf_reinf_r) shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_w, fc_pt=self.get_pos_dwh( 0, 0, 0), fillet=0, radius=chmf_r) shp_final = fcfun.shp_filletchamfer_dirpt(shp_final, self.axis_w, fc_pt=self.get_pos_dwh( 7, 0, 1), fillet=1, radius=chmf_r) for pt_h in (0, 8): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_w, fc_pt=self.get_pos_dwh(8, 0, pt_h), fillet=0, radius=chmf_r) if rail == 1: for pt_w in (2, 4): for pt_d in (1, 3, 4, 6): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_h, fc_pt=self.get_pos_dwh(pt_d, pt_w, 0), fillet=1, radius=chmf_r) for pt_h in (2, 4, 5, 7): shp_final = fcfun.shp_filletchamfer_dirpt( shp_final, self.axis_d, fc_pt=self.get_pos_dwh(7, pt_w, pt_h), fillet=1, radius=chmf_r) shp_final = shp_final.removeSplitter() self.shp = shp_final # Then the Part super().create_fco(name) self.fco.Placement.Base = FreeCAD.Vector(0, 0, 0) self.fco.Placement.Base = self.position