diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/hvst.iml b/.idea/hvst.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/.idea/hvst.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..38ca391
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a7e652c
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0547121
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hvst.py b/hvst.py
index d58d73f..2541cab 100644
--- a/hvst.py
+++ b/hvst.py
@@ -1,5 +1,8 @@
from cadquery import *
import math
+import logging
+
+logger = logging.getLogger()
tabletop_depth = 800 # currently, almost all parameters are derived from the table depth
#tabletop_depth = 600
@@ -8,11 +11,13 @@ alpha_max = 70
tabletop_adjuster_assembly_spacing = 100 # symmetric distancing assumed
+# cube in adjuster assembly
feet_adjuster_width = 60 # feet_adjuster is moving part inside adjuster assembly
feet_adjuster_lenght = 60
feet_adjuster_height = 60
adjuster_assembly_wall_thickness = 20 # might be different for front and back...
+adjuster_assembly_slider_width = 10
adjuster_assembly_length = tabletop_depth - 2*tabletop_adjuster_assembly_spacing
adjuster_assembly_width = feet_adjuster_width + 2*adjuster_assembly_wall_thickness
adjuster_assembly_height = feet_adjuster_height + 2*adjuster_assembly_wall_thickness
@@ -26,9 +31,11 @@ lower_h = ld * math.sqrt(2)*math.sin(math.radians(alpha_max))
lower_feet_assambly_pivot_point_from_fixed_leg = ld * math.sqrt(2)*math.cos(math.radians(alpha_max))
lower_feet_assambly_pivot_point_from_moving_end = ld - lower_feet_assambly_pivot_point_from_fixed_leg
+logger.info(f"Lower h is: {lower_h} (between joins of leg only)")
+
lower_foot_width = 80
lower_foot_height = 50
-lower_foot_length = lower_feet_bore_holes_distance + lower_foot_height
+lower_foot_length = 2*ld/math.sqrt(2)
lower_feet_assembly_base_plate_height = 20
lower_feet_assembly_side_wall_thickness = 25
lower_feet_assembly_width = 100
@@ -46,58 +53,102 @@ lower_feet_assembly_pin_diameter = 10
## parameter end!
+def get_adjuster_assembly_old():
+ left = Workplane("XZ").vLine(adjuster_assembly_height/2).hLine(adjuster_assembly_wall_thickness+adjuster_assembly_slider_width).vLine(-(adjuster_assembly_height-feet_adjuster_height)/2).hLine(-adjuster_assembly_slider_width).vLineTo(0).mirrorX().extrude(adjuster_assembly_length-2*adjuster_assembly_wall_thickness)
+ right = left.mirror("YZ", basePointVector = (adjuster_assembly_width/2,0,0))
+ left = left.union(right)
+ return left
+
+#return Workplane("XY").box(adjuster_assembly_wall_thickness,adjuster_assembly_length,adjuster_assembly_height).center(10,0).box(10,10,10)
+
+
+def get_adjuster_assembly_left():
+ return Workplane("XZ").vLine(adjuster_assembly_height/2).hLine(adjuster_assembly_wall_thickness+adjuster_assembly_slider_width).vLine(-(adjuster_assembly_height-feet_adjuster_height)/2).hLine(-adjuster_assembly_slider_width).vLineTo(0).mirrorX().extrude(adjuster_assembly_length-2*adjuster_assembly_wall_thickness)
+
+def get_adjuster_assembly_right():
+ #left.mirror("YZ", basePointVector = (adjuster_assembly_width/2,0,0))
+ return get_adjuster_assembly_left().mirror("YZ")
+
+def get_adjuster_assembly_front_back_plate():
+ return Workplane("XY").box(adjuster_assembly_width,adjuster_assembly_wall_thickness,adjuster_assembly_height).faces(">Y").workplane().hole(22)
+
+def get_adjuster_assembly():
+ a = Assembly(None)
+ a.add(get_adjuster_assembly_left(), name="l")
+ a.add(get_adjuster_assembly_right(), name="r", color=Color("red"))
+ a.add(get_adjuster_assembly_front_back_plate(), name="f", color=Color("orange"))
+ a.add(get_adjuster_assembly_front_back_plate(), name="b")
+ a.constrain("l@faces@Y", "Plane")
+ a.constrain("l@faces@>Y", "f@faces@Y", "Plane")
+ a.constrain("r@faces@>Y", "f@faces@X", "f@faces@>X", "Axis")
+ a.constrain("l@faces@X", "b@faces@>X", "Axis")
+ a.constrain("l@faces@Z").fillet(lower_feet_assembly_side_wall_radius)\
- .faces("-X").edges(">Z").fillet(lower_feet_assembly_side_wall_thickness/2)\
- .faces("+X").workplane()\
- .center(lower_foot_length/2-lower_feet_assembly_side_wall_bearing_hole_distance_from_outer,0).hole(2*lower_feet_assembly_bearing_hole_radius,lower_feet_assembly_bearing_hole_depth)\
+def get_lower_foot_base_plate():
+ return Workplane("XY").box(lower_feet_assembly_width,lower_feet_assembly_length,lower_feet_assembly_base_plate_height)\
+ .edges("|Z").fillet(lower_feet_assembly_side_wall_thickness/2)
-lower_foot_bearing_pin_slide = Workplane("YZ",origin=((lower_feet_assembly_side_wall_thickness-lower_feet_assembly_bearing_hole_depth)/2,\
- -(lower_feet_bore_holes_distance-lower_feet_assambly_pivot_point_from_moving_end)/2,\
- 0))\
- .box(lower_feet_assambly_pivot_point_from_moving_end,lower_feet_assembly_pin_diameter,lower_feet_assembly_bearing_hole_depth)
+def get_lower_foot_side_wall_left():
+ lower_foot_side_wall_left = Workplane("YZ").box(lower_feet_assembly_length,lower_feet_assembly_side_wall_height,lower_feet_assembly_side_wall_thickness)\
+ .faces("|Y").edges(">Z").fillet(lower_feet_assembly_side_wall_radius)\
+ .faces("-X").edges(">Z").fillet(lower_feet_assembly_side_wall_thickness/2)\
+ .faces("+X").workplane()\
+ .center(lower_feet_assembly_length/2-lower_feet_assembly_side_wall_bearing_hole_distance_from_outer,0).hole(2*lower_feet_assembly_bearing_hole_radius,lower_feet_assembly_bearing_hole_depth)\
-lower_foot_bearing_pin_slide = lower_foot_bearing_pin_slide\
- .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
- -(lower_feet_bore_holes_distance/2-lower_feet_assambly_pivot_point_from_moving_end),0.00001))\
- .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))\
- .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
- -(lower_feet_bore_holes_distance/2),0))\
- .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))
+ lower_foot_bearing_pin_slide = Workplane("YZ",origin=((lower_feet_assembly_side_wall_thickness-lower_feet_assembly_bearing_hole_depth)/2,\
+ -(lower_feet_bore_holes_distance-lower_feet_assambly_pivot_point_from_moving_end)/2,\
+ 0))\
+ .box(lower_feet_assambly_pivot_point_from_moving_end,lower_feet_assembly_pin_diameter,lower_feet_assembly_bearing_hole_depth)
+
+ lower_foot_bearing_pin_slide = lower_foot_bearing_pin_slide\
+ .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
+ -(lower_feet_bore_holes_distance/2-lower_feet_assambly_pivot_point_from_moving_end),0.00001))\
+ .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))\
+ .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
+ -(lower_feet_bore_holes_distance/2),0))\
+ .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))
+
+ lower_foot_side_wall_left = lower_foot_side_wall_left.cut(lower_foot_bearing_pin_slide)
+ return lower_foot_side_wall_left
+
+
+def get_lower_foot_side_wall_right():
+ return get_lower_foot_side_wall_left().mirror(mirrorPlane="YZ")
+
+def get_lower_foot_front_wall():
+ return Workplane("XY").box(lower_feet_assembly_width-2*lower_feet_assembly_side_wall_thickness,lower_feet_assembly_side_wall_radius,lower_feet_assembly_side_wall_radius)\
+ .faces(">X").vertices(">YZ").workplane(centerOption="CenterOfMass")\
+ .circle(lower_feet_assembly_side_wall_radius).cutThruAll()
-lower_foot_side_wall_left = lower_foot_side_wall_left.cut(lower_foot_bearing_pin_slide)
-#show_object(lower_foot_side_wall_left)
-#show_object(lower_foot_bearing_pin_slide)
-#bearing_pin_slot = Workplane("YZ").center(200,0).box(lower_feet_assambly_pivot_point_from_moving_end,lower_feet_assembly_pin_diameter,lower_feet_assembly_bearing_hole_depth)\
-# .workplane(offset=-lower_feet_assembly_bearing_hole_depth/2)\
-# .center(-lower_feet_assambly_pivot_point_from_moving_end/2,0).circle(lower_feet_assembly_pin_diameter/2,0).extrude(lower_feet_assembly_bearing_hole_depth)\
-# .center(lower_feet_assambly_pivot_point_from_moving_end-0.00001,0).circle(lower_feet_assembly_pin_diameter/2,0).extrude(lower_feet_assembly_bearing_hole_depth)
+def get_lower_foot_end_wall():
+ return get_lower_foot_front_wall().mirror(mirrorPlane="XZ")
-#show_object(bearing_pin_slot)
+def get_lower_foot_assembly():
+ return Assembly(get_lower_foot_base_plate(), name='base_plate')\
+ .add(get_lower_foot_side_wall_left(), name='wall_left',color=Color(1,0,1,0.5), loc=Location(Vector(-(lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))\
+ .add(get_lower_foot_side_wall_right(), name='wall_right',color=Color(0.5,0,1,0.5), loc=Location(Vector((lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))\
+ .add(get_lower_foot_front_wall(), name='wall_front',color=Color(1,0,1,0.5), loc=Location(Vector(0,-(lower_feet_assembly_length-lower_feet_assembly_side_wall_radius)/2,lower_feet_assembly_base_plate_height)))\
+ .add(get_lower_foot_end_wall(), name='wall_end',color=Color(1,0,1,0.5), loc=Location(Vector(0,(lower_feet_assembly_length-lower_feet_assembly_side_wall_radius)/2,lower_feet_assembly_base_plate_height)))
+#show_object(get_lower_foot_assembly())
-#lower_foot_side_wall_left = lower_foot_side_wall_left.cut(bearing_pin_slot)
-#show_object(Workplane("YZ").box(lower_feet_assambly_pivot_point_from_moving_end,lower_feet_assembly_pin_diameter,lower_feet_assembly_bearing_hole_depth)\
-# .faces("|Y").edges("|X").fillet(4.8))
+test_a = Assembly()\
+ .add(get_lower_foot_assembly(), name="left_foot_assembly", color=Color("red"), loc=Location(Vector(0,0,0)))\
+ .add(get_lower_foot_assembly(), name="right_foot_assembly", color=Color("white"), loc=Location(Vector(500,0,0)))
-lower_foot_side_wall_right = lower_foot_side_wall_left.mirror(mirrorPlane="YZ")
-#show_object(lower_foot_base_plate)
-#show_object(lower_foot_side_wall_left)
-#show_object(lower_foot_side_wall_right)
+#show_object(get_lower_foot_front_wall())
+#show_object(get_lower_foot_end_wall())
+#show_object(assy)
-
-lower_foot_assy_left = (
- Assembly(lower_foot_base_plate, name='base_plate',loc=Location(Vector(0,0,0)))
- .add(lower_foot_side_wall_left, name='wall_left',color=Color(1,0,1,0.5), loc=Location(Vector(-(lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))
- .add(lower_foot_side_wall_right, name='wall_right',color=Color(0.5,0,1,0.5), loc=Location(Vector((lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))
-
-)
-
-show_object(lower_foot_assy_left)
-
-#show_object(assy)
\ No newline at end of file
diff --git a/test_assembly.py b/test_assembly.py
new file mode 100644
index 0000000..91de54f
--- /dev/null
+++ b/test_assembly.py
@@ -0,0 +1,107 @@
+from cadquery import *
+import math
+
+
+tabletop_depth = 800 # currently, almost all parameters are derived from the table depth
+#tabletop_depth = 600
+
+alpha_max = 70
+
+tabletop_adjuster_assembly_spacing = 100 # symmetric distancing assumed
+
+feet_adjuster_width = 60 # feet_adjuster is moving part inside adjuster assembly
+feet_adjuster_lenght = 60
+feet_adjuster_height = 60
+
+adjuster_assembly_wall_thickness = 20 # might be different for front and back...
+adjuster_assembly_length = tabletop_depth - 2*tabletop_adjuster_assembly_spacing
+adjuster_assembly_width = feet_adjuster_width + 2*adjuster_assembly_wall_thickness
+adjuster_assembly_height = feet_adjuster_height + 2*adjuster_assembly_wall_thickness
+
+
+bore_holes_distance_feet_adjuster = adjuster_assembly_length - 2*adjuster_assembly_wall_thickness - feet_adjuster_width
+ld = bore_holes_distance_feet_adjuster
+lower_feet_bore_holes_distance = bore_holes_distance_feet_adjuster # this is only the case, if min feet angle is 45 degrees
+
+lower_h = ld * math.sqrt(2)*math.sin(math.radians(alpha_max))
+lower_feet_assambly_pivot_point_from_fixed_leg = ld * math.sqrt(2)*math.cos(math.radians(alpha_max))
+lower_feet_assambly_pivot_point_from_moving_end = ld - lower_feet_assambly_pivot_point_from_fixed_leg
+
+lower_foot_width = 80
+lower_foot_height = 50
+lower_foot_length = lower_feet_bore_holes_distance + lower_foot_height
+lower_feet_assembly_base_plate_height = 20
+lower_feet_assembly_side_wall_thickness = 25
+lower_feet_assembly_width = 100
+lower_feet_assembly_length = lower_feet_bore_holes_distance + lower_foot_height # 2* 1/2 lower_foot_height
+lower_feet_assembly_height = lower_feet_assembly_base_plate_height + lower_foot_height
+lower_feet_assembly_side_wall_height = lower_foot_height
+lower_feet_assembly_side_wall_radius = lower_foot_height/2
+lower_feet_assembly_side_wall_bearing_hole_distance_from_outer = lower_feet_assembly_side_wall_radius
+lower_feet_assembly_side_wall_bearing_hole_distance_from_bottom = lower_feet_assembly_side_wall_radius
+lower_feet_assembly_bearing_hole_distance_from_assembly_bottom = lower_feet_assembly_base_plate_height + lower_foot_height/2
+lower_feet_assembly_bearing_hole_radius = 11
+lower_feet_assembly_bearing_hole_depth = 10
+lower_feet_assembly_pin_diameter = 10
+
+def get_lower_foot_base_plate():
+ return Workplane("XY").box(lower_feet_assembly_width,lower_foot_length,lower_feet_assembly_base_plate_height)\
+ .edges("|Z").fillet(lower_feet_assembly_side_wall_thickness/2)
+
+def get_lower_foot_side_wall_left():
+ lower_foot_side_wall_left = Workplane("YZ").box(lower_foot_length,lower_feet_assembly_side_wall_height,lower_feet_assembly_side_wall_thickness)\
+ .faces("|Y").edges(">Z").fillet(lower_feet_assembly_side_wall_radius)\
+ .faces("-X").edges(">Z").fillet(lower_feet_assembly_side_wall_thickness/2)\
+ .faces("+X").workplane()\
+ .center(lower_foot_length/2-lower_feet_assembly_side_wall_bearing_hole_distance_from_outer,0).hole(2*lower_feet_assembly_bearing_hole_radius,lower_feet_assembly_bearing_hole_depth)\
+
+ lower_foot_bearing_pin_slide = Workplane("YZ",origin=((lower_feet_assembly_side_wall_thickness-lower_feet_assembly_bearing_hole_depth)/2,\
+ -(lower_feet_bore_holes_distance-lower_feet_assambly_pivot_point_from_moving_end)/2,\
+ 0))\
+ .box(lower_feet_assambly_pivot_point_from_moving_end,lower_feet_assembly_pin_diameter,lower_feet_assembly_bearing_hole_depth)
+
+ lower_foot_bearing_pin_slide = lower_foot_bearing_pin_slide\
+ .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
+ -(lower_feet_bore_holes_distance/2-lower_feet_assambly_pivot_point_from_moving_end),0.00001))\
+ .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))\
+ .union(Workplane("YZ",origin=(lower_feet_assembly_side_wall_thickness/2-lower_feet_assembly_bearing_hole_depth,
+ -(lower_feet_bore_holes_distance/2),0))\
+ .circle(lower_feet_assembly_pin_diameter/2).extrude(lower_feet_assembly_bearing_hole_depth))
+
+ lower_foot_side_wall_left = lower_foot_side_wall_left.cut(lower_foot_bearing_pin_slide)
+ return lower_foot_side_wall_left
+
+
+def get_lower_foot_side_wall_right():
+ return get_lower_foot_side_wall_left().mirror(mirrorPlane="YZ")
+
+#show_object(lower_foot_base_plate)
+#show_object(lower_foot_side_wall_left)
+#show_object(lower_foot_side_wall_right)
+
+b1 = Workplane("XY").box(10,5,5)
+b2 = Workplane("XY").box(5,10,5)
+b3 = Workplane("YZ").box(4,4,4)
+
+b1 = get_lower_foot_base_plate()
+b2 = get_lower_foot_side_wall_left()
+b3 = get_lower_foot_side_wall_right()
+
+#show_object(b1)
+
+a1 = Assembly(b1, name="1", color=Color("red"),loc=Location(Vector(0,0,0)))\
+ .add(b2, name="2", loc=Location(Vector(-(lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))\
+ .add(b3, name="3", color=Color("red"), loc=Location(Vector((lower_feet_assembly_width-lower_feet_assembly_side_wall_thickness)/2,0,lower_feet_assembly_base_plate_height/2+lower_feet_assembly_side_wall_radius)))
+
+#show_object(a1)
+
+a2 = Assembly()\
+ .add(a1, name="a1", color=Color(0,1,0,0.8))\
+ .add(a1, name="a2",color=Color(1,1,0,0.8), loc=Location(Vector(200,0,0)))
+
+a3 = Assembly()\
+ .add(a2, name="a2a", color=Color(0,1,0,0.8))\
+ .add(a2, name="a3",color=Color(1,1,0,0.8), loc=Location(Vector(0,800,0)))
+
+
+show_object(a2)
\ No newline at end of file