Site Tools


projects:tesla_car:doorhandles

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projects:tesla_car:doorhandles [2018/05/02 00:40] adminprojects:tesla_car:doorhandles [2018/09/11 00:50] (current) – [Mylar sheet] admin
Line 15: Line 15:
 A solution for the switches was to combine both moving switches in a stationary holder. After designing with FreeCAD, the following came out: A solution for the switches was to combine both moving switches in a stationary holder. After designing with FreeCAD, the following came out:
  
- +==== Mylar sheet ==== 
 +One of the objectives is to make the doorhandles water-proof. For this the following material has been tested: 
 +  * IASOPET OAN 26μm, Zolltarif PET Folie 39206219, BOPP Folie 39202021 (delivered from the company Strohmeier+Ernst GmbH & Co KG, Pilgerplatt 10, 33378 Rheda-Wiedenbrück, Mr. Gottlieb Ernst, Tlf. 05242-406603, Kunde Nr. 500002) 
 +  * Hostaphan RNT/36μm, (Delivered by the company Pütz GmbH + Co. Folien KG, Obere Waldstr. 26 + 26a, 65232 Taunusstein-Wehen, Tlf. Mrs. Manuela Erdmann, Tlf. 06128-964270) 
 + 
 +==== FreeCad ==== 
 +The following script creates the RR_RH part: 
 +<code python> 
 +#!/usr/bin/python 
 +# This script creates a small 3d printable enclosure for two switches 
 +# to improve the constuction of a tesla retracting door handle. 
 +
 +# copyright: Marc Nijdam 
 +# Date of creation: 05.02.2018 
 +
 + 
 +# To run this independent of an instance of freecad, uncomment following lines. 
 +#import sys 
 +#sys.path.append("/usr/lib/freecad/lib"
 +#import FreeCAD 
 +#import FreeCADGui 
 +# Otherwise, copy paste this code into the freecad python console. 
 + 
 +import WebGui 
 +import PartDesignGui 
 +import math 
 +import Part 
 +import os.path 
 + 
 +# helper functions 
 + 
 +# sketches a line from a to b on a sketch object: App.getDocument("tesla_RR_RH").some_sketch 
 +def sketch_line(pl_obj,a,b): 
 + return pl_obj.addGeometry(Part.LineSegment(App.Vector(a[0],a[1]),App.Vector(b[0],b[1])),False) 
 + 
 +# returns sum of two coordinates 
 +def addp(a,b): 
 + return ([a[0] + b[0], a[1] + b[1]]) 
 + 
 +
 +# coordinate system 
 +#     ________      
 +#    !       \_     
 +#    !            
 +#    !            
 +#  ^ !     ____!    
 +#  y !_(o)!         
 +#                   
 +#    x >            
 +
 +# creation mode: 0:final shape, 1:3d printable shape 
 +print_3d = 1 
 +# parameters: stack 
 +hb = 2.0 # height of bottom area 
 +hb1 = 4.0 # thickness of base 1 
 +hb_mid = 4.0 # thickness of base_mid 
 +# parameters: wall thickness 
 +#     _____         
 +#    !    !##2##    
 +#    !    !1      
 +#    !    !##4##    
 +#  ^ !     ____!    
 +#  y !_(o)!         
 +#                   
 +#    x >            
 +tw1 = 1.8 # thickness wall 1 
 +tw2 = 1.0 # thickness wall 2 
 +tw3 = 1.8 # thickness wall 3 
 +tw4 = 1.8 # thickness wall 4 
 +# parameters: switch Panasonic ASQ10410 
 +sw_dim = [5.4, 13.3, 12.3] # switch (W x L x H) 
 +sw_area = [13.4, 10.0, hb] # left bottom area where switches are [x,y,z] 
 +sw_offset = [2.71, 6.66, 7.25] # offset for switch left bottom front corner 
 +sw_rotation = [90, 0, 90] # default rotation angle for importing switch 
 +sw_gap = 0.1 # extra margin around switch 
 +bc_vpos = 3.2 # bottom corner vertical space 
 +
 +#  (switch side view) 
 +#                               
 +#               _^_ 
 +#              !  !             
 +#             #####___-----     
 +#                       ! 
 +#                       ! 
 +#             ! ()     {} !    () pin     {} hole 
 +#             !___________! 
 +#               #   #   # 
 +# left bottom ^ 
 +# corner is reference point (0,0) 
 +
 +sw_pin = [2.7, 7.2] # position of pin referenced to left bottom corner 
 +pin_d = 3.0 # diameter of side pins at switches 
 +pin_p = 1.5 # sideways distance of protruding pin 
 +sw_hole = [2.7 + 8.3, 7.2] # position of hole referenced to left bottom corner 
 +
 +#     (switches top view) 
 +#    _..__  _   
 +#   [_<>__||_] SW1: Width: 13.3, pin: 2.7, pin > hole: 8.3, rest: 2.3 
 +#     ''__.._   
 +#    [||__<>_] SW2: Width: 13.3, hole: 2.3, hole > pin : 8.3, rest: 2.7, D_hole-right border = 13.3-2.3 = 11.0 
 +#         ''    
 +# Total width for reciprocal switch mounting: 2.7 + 11.0 = 13.7mm = sw_pin[0] + (sw_dim[1] - (sw_dim[1] - sw_hole[0])) 
 +#  = sw_pin[0] + sw_hole[0] 
 +# Therefore y dimension of wall 2 to position in sw_area = max(sw_dim[1], sw_pin[0] + sw_hole[0]) 
 +sw_fname = "/home/mni/Backup/projects/programming/freecad/tesla_adapter_pieces/asq10410.step" # file obtained from Panasonic 
 +# parameters: mounting hole position 
 +mnt_pos = [10.0, 5.0] # [x,y] 
 +mnt_hole1 = 10.0 # diameter of hole at base 1 
 +mnt_hole2 = 3.0 # diameter of hole at base 2 
 +# parameters: total object size 
 +obj_dim = [26.0, 26.0, sw_dim[2] + hb + sw_gap] # maximum dimensions of object 
 +# parameters: pipe dimensions 
 +w_trench = 2.5 # diameter of trench for cable 
 +# parameters: small corner to cut away 
 +crn_dim = [3.0, 1.5, obj_dim[2]] # small corner to cut material away 
 +crn_c_angle = 88 # ref drawing 9b 
 +# Screwhead 
 +screw_head_d = 4 # screwhead diameter 
 + 
 +### deriving points 
 +
 +# calculations based on choniometrical identities 
 +# Using: 
 +#   w_trench: closest distance between two (parallel) lines PQ and MN 
 +#         : closest wall thickness (distance between lines HG and QP, FG and PN, MN and EF) 
 +#   point F is pivot point 
 +#   point A, B, C, D, F, I, J, K and L are fixed points. 
 +#   other points depend on value of w and w_trench. 
 +#   Point X is in the middle, between point I and L 
 +
 +#   Line PS is perpendicular to line MN (drawing is not to scale) 
 +#     _________________________ 
 +#    !                        B----------------------------------C 
 +#    !                        |                                  | 
 +#    !                        |  J---------------------------K   | 
 +#    !                        |  |                             | 
 +#    !                        |  |                             | 
 +#    !                        |  |                             | 
 +#    !                        |  |                             | 
 +#    !                        |  |                             | 
 +#    !                        |  |                             | 
 +#    !                        |  I------Q         M----S---L   T 
 +#    !                        |          \        \          | 
 +#    !                        A-----H            \     E-----D 
 +#    !                                          \V    W 
 +#    !                                \            \     \ 
 +#    !                                            \     \ 
 +#    !                                  \     P-----.----N     \ 
 +#    !                                                      \ 
 +#    !              (0)       ____________G-----------Z----------F 
 +#    !                       ) 
 +#    !                     _/ 
 +#    !--------------------- 
 +#                                    (Drawing 4 - wall) 
 +
 +
 +
 +
 +#   Additionally helper points U, V and W are defined, as well as T 
 +#   Calculation is based on defining helper line XZ, parallel to SF. 
 +#   In the middle between points U and W, is point V, which is also 
 +#   the middle point between points X and F. The line UW is perpendicular 
 +#   to line XZ. Furthermore, the distance of the line: 
 +#     UW = 0.5 * w_trench + w 
 +#   Therefore the distance of points UV is m = 0.5 * UW 
 +#   With that we can calculate the angles a and b which we use to calculate 
 +#   the coordinates of the remaining points. 
 +
 +sw_width = max(sw_dim[1], sw_pin[0] + sw_hole[0]) # maximum width (in y-direction) for two reciprocal positioned switches 
 +Xmax = min(sw_area[0] + sw_dim[0] * 2 + tw3, obj_dim[0]) # Make sure, wall thickness never exceed maximum object size 
 +Ymax = min(sw_area[1] + sw_width + tw2, obj_dim[1]) # Make sure, wall thickness never exceed maximum object size 
 +w = max(max(max(tw1,tw2),tw3),tw4) # find the thickest wall as base to create strong walls around the wire trench 
 +m = (0.5 * w_trench + w) * 0.5 
 +XV = math.sqrt( ((obj_dim[0] - sw_area[0] - sw_dim[0]) / 2) ** 2 +  ((sw_area[1] - bc_vpos) / 2) ** 2) 
 +a = math.asin(m/XV) # in radians 
 +b = math.asin( (sw_area[1] - bc_vpos) / (XV * 2) ) # in radians 
 +wh_trench = w_trench / math.sin(a + b) 
 +wh = w / math.sin(a + b) 
 + 
 +# outer wall 
 +pt_a = [sw_area[0] - tw1, sw_area[1] - tw4] # starting point 
 +pt_b = [sw_area[0] - tw1, Ymax] 
 +pt_c = [Xmax, Ymax] 
 +pt_d = [Xmax, sw_area[1] - tw4] 
 +pt_f = [obj_dim[0], bc_vpos] 
 +pt_x = [sw_area[0] + sw_dim[0], sw_area[1]] 
 +pt_e = [obj_dim[0] - (sw_area[1] - tw4 - bc_vpos) / math.tan(a + b), sw_area[1] - tw4] 
 +pt_g = addp(pt_f, [ - (2 * wh + wh_trench), 0]) 
 +pt_h = [pt_g[0] - (pt_f[0] - pt_e[0]), pt_a[1]] 
 + 
 +# inner wall 
 +pt_i = [sw_area[0], sw_area[1]] 
 +pt_j = addp(pt_b, [tw1, -tw2]) 
 +pt_k = addp(pt_c, [-tw3, -tw2]) 
 +pt_l = addp(pt_d, [-tw3, tw4]) 
 +pt_m = addp(pt_x, [wh_trench/2, 0]) 
 +pt_n = [pt_m[0] + (sw_area[1] - bc_vpos - w) / math.tan(a + b), bc_vpos + w] 
 +pt_p = addp(pt_n, [-wh_trench, 0]) 
 +pt_q = addp(pt_m, [-wh_trench, 0]) 
 + 
 +# Initialization 
 +App.newDocument("tesla_RR_RH"
 +App.setActiveDocument("tesla_RR_RH"
 +App.ActiveDocument=App.getDocument("tesla_RR_RH"
 +Gui.ActiveDocument=Gui.getDocument("tesla_RR_RH"
 +App.activeDocument().saveAs("/home/mni/Backup/projects/programming/freecad/tesla_adapter_pieces/rear_right_side6.fcstd"
 +ad = App.getDocument("tesla_RR_RH"
 +gd = Gui.getDocument("tesla_RR_RH"
 + 
 +# 0. Create grid (key g, key r), set camera position 
 +Gui.activateWorkbench("DraftWorkbench"
 +gd.activeView().setCamera('#Inventor V2.1 ascii \n OrthographicCamera {\n viewportMapping ADJUST_CAMERA \n position 0 0 87 \n orientation 0 0 1  0 \n nearDistance -112.88701 \n farDistance 287.28702 \n aspectRatio 1 \n focalDistance 87 \n height 143.52005 }') 
 + 
 +# 1. Create sketch for ground object 
 +#     _____         
 +#    !####        
 +#    !####        
 +#    !####!_____    
 +#  ^ !#########   
 +#  y !#(o)!         
 +#                   
 +#    x >            
 +r = mnt_hole1/2.0 
 +q = 8.2 # bottom corner horizontal space 
 +a1=-math.asin((mnt_pos[0]-q)/r) # starting angle of arc 
 +a2=-math.pi/2 - math.asin((mnt_pos[0]-q)/r) # end angle of arc 
 +xa1=mnt_pos[0] + math.sqrt(r ** 2 - (mnt_pos[1]-bc_vpos) ** 2) 
 +ya2=mnt_pos[1] - math.sqrt(r ** 2 - (mnt_pos[0]-q) ** 2) 
 +Gui.activateWorkbench("PartDesignWorkbench"
 +ad.addObject('PartDesign::Body','sw_housing_RR_RH'
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','base_sketch'
 +ad.base_sketch.Support = (ad.XY_Plane, ['']) 
 +ad.base_sketch.MapMode = 'FlatFace' 
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('base_sketch'
 +so=ad.base_sketch # sketch object 
 +gd.setEdit('base_sketch'
 +sketch_line(so, [0.0, 0.0]                          , [0.0, obj_dim[1]]) 
 +sketch_line(so, [0.0, obj_dim[1]]                   , [sw_area[0] - tw1, obj_dim[1]]) 
 +sketch_line(so, [sw_area[0] - tw1, obj_dim[1]]      , [sw_area[0]-tw1, sw_area[1]-tw4]) 
 +sketch_line(so, [sw_area[0] - tw1, sw_area[1] - tw4], pt_h) 
 +sketch_line(so, pt_h, pt_p) 
 +sketch_line(so, pt_p, pt_n) 
 +sketch_line(so, pt_n, pt_e) 
 +sketch_line(so, pt_e, [obj_dim[0], sw_area[1]-tw4]) 
 +sketch_line(so, [obj_dim[0], sw_area[1]-tw4]    , [obj_dim[0], bc_vpos]) 
 +sketch_line(so, [obj_dim[0], bc_vpos]           , [xa1, bc_vpos]) 
 +so.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(mnt_pos[0],mnt_pos[1]),App.Vector(0,0,1), r),a2,a1),False) 
 +sketch_line(so, [q, ya2], [q, 0.0]) 
 +sketch_line(so, [q, 0.0], [0.0, 0.0]) 
 +so.addGeometry(Part.Circle(App.Vector(mnt_pos[0],mnt_pos[1]),App.Vector(0,0,1), mnt_hole2/2.0),False) 
 +ad.recompute() 
 +# ... pad base_sketch 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pad","base"
 +ad.base.Profile = so 
 +ad.base.Length = hb1 + hb_mid 
 +ad.base.Length2 = 100.000000 
 +ad.base.Type = 0 
 +ad.base.UpToFace = None 
 +ad.base.Reversed = 0 
 +ad.base.Midplane = 0 
 +ad.base.Offset = 0.000000 
 +gd.setEdit('base', 0) 
 +Gui.Selection.clearSelection() 
 +gd.base.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.base.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.base.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.base.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.base.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +so.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 2. create maximum size floor under switch area and pad 
 +#     _____         
 +#    !    !#####    
 +#    !    !#####    
 +#    !    !#####    
 +#  ^ !     ____!    
 +#  y !_(o)!         
 +#                   
 +#    x >            
 +gd.activeView().viewAxonometric() 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','floorbase'
 +ad.floorbase.Support = (ad.XY_Plane, ['']) 
 +ad.floorbase.MapMode = 'FlatFace' 
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('floorbase'
 +bs=ad.floorbase 
 +gd.setEdit('floorbase'
 +sketch_line(bs, [sw_area[0]-tw1, sw_area[1]-tw4], [sw_area[0]-tw1, obj_dim[1]    ]) 
 +sketch_line(bs, [sw_area[0]-tw1, obj_dim[1]    ], [obj_dim[0]    , obj_dim[1]    ]) 
 +sketch_line(bs, [obj_dim[0]    , obj_dim[1]    ], [obj_dim[0]    , sw_area[1]-tw4]) 
 +sketch_line(bs, [obj_dim[0]    , sw_area[1]-tw4], pt_e) 
 +sketch_line(bs, pt_e, pt_n) 
 +sketch_line(bs, pt_n, pt_p) 
 +sketch_line(bs, pt_p, pt_h) 
 +sketch_line(bs, pt_h, [sw_area[0]-tw1, sw_area[1]-tw4]) 
 +ad.recompute() 
 +# ... pad main_switchfloor 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pad","main_switchfloor"
 +ad.main_switchfloor.Profile = bs 
 +ad.main_switchfloor.Length = hb 
 +ad.main_switchfloor.Length2 = 100.000000 
 +ad.main_switchfloor.Type = 0 
 +ad.main_switchfloor.UpToFace = None 
 +ad.main_switchfloor.Reversed = 0 
 +ad.main_switchfloor.Midplane = 0 
 +ad.main_switchfloor.Offset = 0.000000 
 +gd.setEdit('main_switchfloor', 0) 
 +Gui.Selection.clearSelection() 
 +gd.main_switchfloor.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.main_switchfloor.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.main_switchfloor.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.main_switchfloor.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.main_switchfloor.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +bs.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 3. Create sketch for switch walls and pad 
 +#  ref. Drawing 4 - wall 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','switch_walls_sketch'
 +ad.switch_walls_sketch.Support = (ad.main_switchfloor,["Face14"]) # found by testing... 
 +ad.switch_walls_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('switch_walls_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('switch_walls_sketch'
 +wsk=ad.switch_walls_sketch 
 +# sketch for outside wall: 
 +sketch_line(wsk, pt_a, pt_b) 
 +sketch_line(wsk, pt_b, pt_c) 
 +sketch_line(wsk, pt_c, pt_d) 
 +sketch_line(wsk, pt_d, pt_e) 
 +sketch_line(wsk, pt_e, pt_f) 
 +sketch_line(wsk, pt_f, pt_g) 
 +sketch_line(wsk, pt_g, pt_h) 
 +sketch_line(wsk, pt_h, pt_a) 
 +# sketch for inside wall: 
 +sketch_line(wsk, pt_i, pt_j) 
 +sketch_line(wsk, pt_j, pt_k) 
 +sketch_line(wsk, pt_k, pt_l) 
 +sketch_line(wsk, pt_l, pt_m) 
 +sketch_line(wsk, pt_m, pt_n) 
 +sketch_line(wsk, pt_n, pt_p) 
 +sketch_line(wsk, pt_p, pt_q) 
 +sketch_line(wsk, pt_q, pt_i) 
 +ad.recompute() 
 +# ... Pad walls 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pad","switch_walls"
 +ad.switch_walls.Profile = wsk 
 +ad.switch_walls.Length = obj_dim[2] - hb 
 +ad.switch_walls.Length2 = 100.0 
 +ad.switch_walls.Type = 0 
 +ad.switch_walls.UpToFace = None 
 +ad.switch_walls.Reversed = 0 
 +ad.switch_walls.Midplane = 0 
 +ad.switch_walls.UpToFace = None 
 +gd.setEdit('switch_walls', 0) 
 +Gui.Selection.clearSelection() 
 +gd.switch_walls.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.switch_walls.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.switch_walls.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.switch_walls.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.switch_walls.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +wsk.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 5. create a maximum 0.8mm fillet for inside bottom edges 
 +Gui.activateWorkbench("PartDesignWorkbench"
 +ad.sw_housing_RR_RH.newObject("PartDesign::Fillet","Fillet"
 +ad.Fillet.Radius = min(0.8, w_trench / 4) 
 +ad.Fillet.Base = (App.ActiveDocument.switch_walls,["Face26"]) 
 +Gui.Selection.clearSelection() 
 +gd.hide("switch_walls"
 +ad.recompute() 
 +gd.setEdit('Fillet', 0) 
 +gd.Fillet.ShapeColor=Gui.ActiveDocument.sw_housing_RR_RH.ShapeColor 
 +gd.Fillet.LineColor=Gui.ActiveDocument.sw_housing_RR_RH.LineColor 
 +gd.Fillet.PointColor=Gui.ActiveDocument.sw_housing_RR_RH.PointColor 
 +gd.Fillet.Transparency=Gui.ActiveDocument.sw_housing_RR_RH.Transparency 
 +gd.Fillet.DisplayMode=Gui.ActiveDocument.sw_housing_RR_RH.DisplayMode 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 6. Create sketch for m3 screwhead 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','screwhead_sketch'
 +ad.screwhead_sketch.Support = (ad.Fillet,["Face4"]) # found by testing... 
 +ad.screwhead_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('screwhead_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('screwhead_sketch'
 +ssk=ad.screwhead_sketch 
 +ssk.addGeometry(Part.Circle(App.Vector(mnt_pos[0],mnt_pos[1],0),App.Vector(0,0,1),screw_head_d),False) 
 +ad.recompute() 
 +# ... create a pocket from top downwards 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","screwhead"
 +ad.screwhead.Profile = ssk 
 +ad.screwhead.Length = obj_dim[2]-(hb1+hb_mid) 
 +ad.screwhead.Length2 = 100.0 
 +ad.screwhead.Type = 0 
 +ad.screwhead.UpToFace = None 
 +ad.screwhead.Reversed = 0 
 +ad.screwhead.Midplane = 0 
 +ad.screwhead.UpToFace = None 
 +ad.screwhead.Offset = 0.0 
 +gd.setEdit('screwhead', 0) 
 +Gui.Selection.clearSelection() 
 +gd.screwhead.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.screwhead.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.screwhead.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.screwhead.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.screwhead.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +ssk.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 7. Create sketch for slope 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','slope_sketch'
 +ad.slope_sketch.Support = (ad.screwhead,["Face35"]) # found by testing... 
 +ad.slope_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('slope_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('slope_sketch'
 +lsk=ad.slope_sketch 
 +sketch_line(lsk, [-10.5, hb1 + hb_mid], [-obj_dim[0], hb]) # previous height: sw_pin[2] + hb - pin_d/2 
 +sketch_line(lsk, [-obj_dim[0], hb]                  , [-obj_dim[0], obj_dim[2]]) 
 +sketch_line(lsk, [-obj_dim[0], obj_dim[2]]          , [-10.5, obj_dim[2]]) 
 +sketch_line(lsk, [-10.5, obj_dim[2]]                , [-10.5, hb1 + hb_mid]) 
 +ad.recompute() 
 +# ... create a pocket for the slope with 11.5mm 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","slope"
 +ad.slope.Profile = lsk 
 +ad.slope.Length = sw_area[0] - tw1 
 +ad.slope.Length2 = 100.0 
 +ad.slope.Type = 0 
 +ad.slope.UpToFace = None 
 +ad.slope.Reversed = 0 
 +ad.slope.Midplane = 0 
 +ad.slope.UpToFace = None 
 +gd.setEdit('slope', 0) 
 +Gui.Selection.clearSelection() 
 +gd.slope.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.slope.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.slope.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.slope.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.slope.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +lsk.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 8. create pockets for switch side pin 
 +
 +#____(2)_____(3)   <----- Top of object 
 +#  \  !       ! 
 +#  \  !       ! 
 +#  \  !       ! 
 +#  \  !       ! 
 +#  \  !<----->   width corresponds with pin diameter 
 +#  \  !       ! 
 +#  \  !       ! 
 +#  \ (1)  0  (4)   <------ Pin center (ref: sw_hole) 
 +#  \       /   
 +#  \    '-_-' 
 +
 +#     pin radius: pin_d / 2 
 +#     pin thickness: tw1 - 0.3 
 +#     column height: tw1 
 +#     column length: sw_dim[2] - sw_pin[2] 
 +#     column width: pin_d 
 +
 +# Pocket 1 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','switch1_pocket_sketch'
 +ad.switch1_pocket_sketch.Support = (ad.slope,["Face5"]) # found by testing... 
 +ad.switch1_pocket_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('switch1_pocket_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('switch1_pocket_sketch'
 +swp1=ad.switch1_pocket_sketch 
 +# all coordinates relative to pin center 
 +sp_0 = [sw_area[1] + sw_pin[0] , obj_dim[2] - sw_dim[2] + sw_pin[1]] 
 +sp_1 = addp(sp_0, [- pin_d / 2, 0]) 
 +sp_2 = [sp_1[0], obj_dim[2]] 
 +sp_3 = addp(sp_2, [pin_d, 0]) 
 +sp_4 = addp(sp_1, [pin_d, 0]) 
 +sketch_line(swp1, sp_1, sp_2) 
 +sketch_line(swp1, sp_2, sp_3) 
 +sketch_line(swp1, sp_3, sp_4) 
 +swp1.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(sp_0[0], sp_0[1]), App.Vector(0,0,1), pin_d / 2), math.pi, 0),False) 
 +ad.recompute() 
 +# ... create a pocket for the switch side-pin 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","switch1_pocket"
 +ad.switch1_pocket.Profile = swp1 
 +ad.switch1_pocket.Length = tw1 - 0.3 
 +ad.switch1_pocket.Length2 = 100.0 
 +ad.switch1_pocket.Type = 0 
 +ad.switch1_pocket.UpToFace = None 
 +ad.switch1_pocket.Reversed = 0 
 +ad.switch1_pocket.Midplane = 0 
 +ad.switch1_pocket.UpToFace = None 
 +gd.setEdit('switch1_pocket', 0) 
 +Gui.Selection.clearSelection() 
 +gd.switch1_pocket.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.switch1_pocket.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.switch1_pocket.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.switch1_pocket.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.switch1_pocket.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +swp1.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 +# Pocket 2 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','switch2_pocket_sketch'
 +ad.switch2_pocket_sketch.Support = (ad.switch1_pocket,["Face23"]) # found by testing... 
 +ad.switch2_pocket_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('switch2_pocket_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('switch2_pocket_sketch'
 +swp2=ad.switch2_pocket_sketch 
 +# all coordinates relative to pin center 
 +sp_0 = [-(sw_area[1] + sw_hole[0]) , obj_dim[2] - sw_dim[2] + sw_pin[1]] 
 +sp_1 = addp(sp_0, [- pin_d / 2, 0]) 
 +sp_2 = [sp_1[0], obj_dim[2]] 
 +sp_3 = addp(sp_2, [pin_d, 0]) 
 +sp_4 = addp(sp_1, [pin_d, 0]) 
 +sketch_line(swp2, sp_1, sp_2) 
 +sketch_line(swp2, sp_2, sp_3) 
 +sketch_line(swp2, sp_3, sp_4) 
 +swp2.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(sp_0[0], sp_0[1]), App.Vector(0,0,1), pin_d / 2), math.pi, 0),False) 
 +ad.recompute() 
 +# ... create a pocket for the switch side-pin 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","switch2_pocket"
 +ad.switch2_pocket.Profile = swp2 
 +ad.switch2_pocket.Length = tw3 - 0.3 
 +ad.switch2_pocket.Length2 = 100.0 
 +ad.switch2_pocket.Type = 0 
 +ad.switch2_pocket.UpToFace = None 
 +ad.switch2_pocket.Reversed = 0 
 +ad.switch2_pocket.Midplane = 0 
 +ad.switch2_pocket.UpToFace = None 
 +gd.setEdit('switch2_pocket', 0) 
 +Gui.Selection.clearSelection() 
 +gd.switch2_pocket.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.switch2_pocket.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.switch2_pocket.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.switch2_pocket.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.switch2_pocket.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +swp2.ViewObject.Visibility=False 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 + 
 + 
 + 
 + 
 +# 9. cut away small corner 
 +
 +# Coordinate system: 
 +#     _____         
 +#    !    !####  <--- small corner to cut away 
 +#    !    !#   #    
 +#    !    !## ##    
 +#  ^ !     __\\_    
 +# -y !_(o)!         
 +#   +x >     
 +#            .--- crn_dim[0] 
 +#           \/  
 +#       2_______1    
 +#      !        !  \ 
 +#      !        !  !_   crn_dim[1] 
 +#      3__    c !  ! 
 +#         ''--__4 / 
 +
 +#      (drawing 9b - corner cut) 
 +
 +#      Angle c is somewhat smaller 
 +#      than 90 degrees 
 +
 +#                  
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','corner_cut_sketch'
 +ad.corner_cut_sketch.Support = (ad.switch2_pocket,["Face39"]) # found by testing... 
 +ad.corner_cut_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('corner_cut_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('corner_cut_sketch'
 +ccs=ad.corner_cut_sketch 
 +cc_1 = [obj_dim[0], -obj_dim[1]] 
 +cc_2 = addp(cc_1, [-crn_dim[0], 0]) 
 +cc_4 = addp(cc_1, [0          , crn_dim[1]]) 
 +cc_3 = addp(cc_4, [-crn_dim[0], -crn_dim[0]/math.tan(crn_c_angle * math.pi / 180)]) 
 + 
 +sketch_line(ccs, cc_1, cc_2) 
 +sketch_line(ccs, cc_2, cc_3) 
 +sketch_line(ccs, cc_3, cc_4) 
 +sketch_line(ccs, cc_4, cc_1) 
 +ad.recompute() 
 +gd.resetEdit() 
 +# create pocket 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","corner_cut"
 +ad.corner_cut.Profile = ccs 
 +ad.corner_cut.Length = obj_dim[2] * 1.5 
 +ad.corner_cut.Length2 = 100.0 
 +ad.corner_cut.Type = 0 
 +ad.corner_cut.UpToFace = None 
 +ad.corner_cut.Reversed = 0 
 +ad.corner_cut.Midplane = 0 
 +ad.corner_cut.UpToFace = None 
 +gd.setEdit('corner_cut', 0) 
 +Gui.Selection.clearSelection() 
 +ccs.ViewObject.Visibility=False 
 +gd.corner_cut.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.corner_cut.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.corner_cut.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.corner_cut.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.corner_cut.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 10. last final operation: create pocket from 
 +#     circle on bottom face for the print_3d option: 
 +# if set, cut out cylinder which cannot be 3d printed 
 +r_circle = mnt_hole1/2.0 
 +ad.sw_housing_RR_RH.newObject('Sketcher::SketchObject','cut_sketch'
 +ad.cut_sketch.Support = (ad.corner_cut,["Face38"]) # found by testing... 
 +ad.cut_sketch.MapMode = 'FlatFace' 
 +gd.setEdit('cut_sketch'
 +Gui.activateWorkbench('SketcherWorkbench'
 +ActiveSketch = ad.getObject('cut_sketch'
 +csk=ad.cut_sketch 
 +csk.addGeometry(Part.Circle(App.Vector(mnt_pos[0],-mnt_pos[1],0),App.Vector(0,0,1), r_circle),False) 
 +ad.recompute() 
 +gd.resetEdit() 
 +# create pocket 
 +Gui.activateWorkbench('PartDesignWorkbench'
 +ad.sw_housing_RR_RH.newObject("PartDesign::Pocket","baseprt"
 +ad.baseprt.Profile = csk 
 +ad.baseprt.Length = hb1 
 +ad.baseprt.Length2 = 100.0 
 +ad.baseprt.Type = 0 
 +ad.baseprt.UpToFace = None 
 +ad.baseprt.Reversed = 0 
 +ad.baseprt.Midplane = 0 
 +ad.baseprt.UpToFace = None 
 +gd.setEdit('baseprt', 0) 
 +Gui.Selection.clearSelection() 
 +csk.ViewObject.Visibility=False 
 +gd.baseprt.ShapeColor=gd.sw_housing_RR_RH.ShapeColor 
 +gd.baseprt.LineColor=gd.sw_housing_RR_RH.LineColor 
 +gd.baseprt.PointColor=gd.sw_housing_RR_RH.PointColor 
 +gd.baseprt.Transparency=gd.sw_housing_RR_RH.Transparency 
 +gd.baseprt.DisplayMode=gd.sw_housing_RR_RH.DisplayMode 
 +ad.recompute() 
 +gd.resetEdit() 
 + 
 +# 11. import switches if file is present 
 +if os.path.isfile(sw_fname) and print_3d == 1: 
 + import ImportGui 
 + # import switch1 
 + ImportGui.insert(sw_fname,"tesla_RR_RH"
 + App.activeDocument().Part__Feature.Placement=App.Placement(App.Vector(sw_offset[0] + sw_area[0], sw_offset[1] + sw_area[1], sw_offset[2] + sw_area[2] + sw_gap), App.Rotation(90,0,90), App.Vector(0,0,0)) 
 + #import switch2 
 + ImportGui.insert(sw_fname,"tesla_RR_RH"
 + App.activeDocument().Part__Feature001.Placement=App.Placement(App.Vector(sw_offset[0] + sw_area[0] + sw_dim[0], sw_offset[1] + sw_area[1] + (sw_pin[1] - (sw_dim[1] - sw_hole[1])), sw_offset[2] + sw_area[2] + sw_gap), App.Rotation(-90,0,90), App.Vector(0,0,0)) 
 + 
 + 
 +# finished 
 +Gui.SendMsgToActiveView("ViewFit"
 +Gui.activeDocument().activeView().viewAxonometric() 
 +</code>
projects/tesla_car/doorhandles.1525214436.txt.gz · Last modified: 2018/05/02 00:40 by admin