Inscread plate strap size
Also fix mass printing on all objects Signed-off-by: Arnaud Morin <arnaud.gfpv@mailops.fr>
This commit is contained in:
6
arm.py
6
arm.py
@@ -147,7 +147,5 @@ if "show_object" not in globals(): # running outside CQ-editor
|
|||||||
show_object(result)
|
show_object(result)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
vol = result.val().Volume()
|
v = result.val().Volume()
|
||||||
m = vol * CF_DENSITY
|
print("%-12s %.2f g" % ("arm", v * CF_DENSITY))
|
||||||
print(f"arm mass {m:.2f} g each, {4*m:.2f} g for four")
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
import cadquery as cq
|
import cadquery as cq
|
||||||
from math import sqrt
|
from math import sqrt
|
||||||
|
from frame_params import TPU_DENSITY
|
||||||
|
|
||||||
def camera_mount():
|
def camera_mount():
|
||||||
|
|
||||||
@@ -130,9 +131,5 @@ if "show_object" not in globals(): # running outside CQ-editor
|
|||||||
show_object(result)
|
show_object(result)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
TPU_DENSITY = 1.21e-3 # g/mm3
|
v = result.val().Volume()
|
||||||
|
print("%-12s %.2f g" % ("camera mount", v * TPU_DENSITY))
|
||||||
solid = result.val()
|
|
||||||
|
|
||||||
print("camera_mount %.2f g in TPU"
|
|
||||||
% (solid.Volume() * TPU_DENSITY))
|
|
||||||
|
|||||||
14
fc.py
14
fc.py
@@ -3,13 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import cadquery as cq
|
import cadquery as cq
|
||||||
|
from frame_params import PCB_DENSITY
|
||||||
# A flight controller is not a material, it is a stack: two boards, their
|
|
||||||
# spacers, and everything soldered to them. This models only the envelope, as
|
|
||||||
# one solid, so the density is FR4's -- bare PCB -- and the dense parts (FETs,
|
|
||||||
# inductors, connectors) stand in for the air between the boards. It lands the
|
|
||||||
# block at about 12 g, which is what a real 25.5 mm FC plus 4-in-1 ESC weighs.
|
|
||||||
PCB_DENSITY = 1.85e-3 # g/mm3, FR4
|
|
||||||
|
|
||||||
|
|
||||||
def fc():
|
def fc():
|
||||||
@@ -76,8 +70,6 @@ if "show_object" not in globals(): # running outside CQ-editor
|
|||||||
|
|
||||||
show_object(result)
|
show_object(result)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
v = result.val().Volume()
|
||||||
print("fc %.2f g" % (result.val().Volume() * PCB_DENSITY))
|
print("%-12s %.2f g" % ("fc", v * PCB_DENSITY))
|
||||||
|
|
||||||
|
|||||||
@@ -7,24 +7,27 @@ from math import cos, radians, sin, sqrt
|
|||||||
# --- material ---------------------------------------------------------------
|
# --- material ---------------------------------------------------------------
|
||||||
|
|
||||||
THICKNESS = 2.0
|
THICKNESS = 2.0
|
||||||
CF_DENSITY = 1.55e-3 # g/mm3, for mass reporting
|
CF_DENSITY = 1.55e-3 # g/mm3
|
||||||
|
TPU_DENSITY = 1.21e-3 # g/mm3
|
||||||
|
PCB_DENSITY = 1.85e-3 # g/mm3
|
||||||
|
ALU_DENSITY = 2.70e-3 # g/mm3, for mass reporting
|
||||||
|
|
||||||
# --- joint fit --------------------------------------------------------------
|
# --- joint fit --------------------------------------------------------------
|
||||||
|
|
||||||
FIT = 0.2 # a mortise is its tenon's length + FIT (0.1 per
|
FIT = 0.2 # a mortise is its tenon's length + FIT (0.1 per
|
||||||
# side); the width is a snug match, no FIT added
|
# side); the width is a snug match, no FIT added
|
||||||
TBONE_D = 1.0 # T-bone relief circle = one cutter diameter
|
TBONE_D = 1.0 # T-bone relief circle = one cutter diameter
|
||||||
TENON_L = 4.0 # every tenon in the frame is this long -- the arm's
|
TENON_L = 4.0 # every tenon in the frame is this long -- the arm's
|
||||||
# tip block and the spar's own tenon both key off it
|
# tip block and the spar's own tenon both key off it
|
||||||
|
|
||||||
# --- overall layout ---------------------------------------------------------
|
# --- overall layout ---------------------------------------------------------
|
||||||
|
|
||||||
SPAR_H = 4.0
|
SPAR_H = 4.0
|
||||||
SPAR_OFFSET = 2.5 # spar centreline clears the motor axis by this much,
|
SPAR_OFFSET = 2.5 # spar centreline clears the motor axis by this much,
|
||||||
# outboard -- feeds R_SPAR_LINE below. motor_base.py
|
# outboard -- feeds R_SPAR_LINE below. motor_base.py
|
||||||
# and spar.py each hold their own matching copy of
|
# and spar.py each hold their own matching copy of
|
||||||
# this value now, not linked by import any more, so
|
# this value now, not linked by import any more, so
|
||||||
# keep them in step by hand
|
# keep them in step by hand
|
||||||
|
|
||||||
# clear gap between the two plates
|
# clear gap between the two plates
|
||||||
PLATE_GAP = 15.0
|
PLATE_GAP = 15.0
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import cadquery as cq
|
import cadquery as cq
|
||||||
|
from frame_params import TPU_DENSITY
|
||||||
|
|
||||||
|
|
||||||
def lollipop():
|
def lollipop():
|
||||||
@@ -126,6 +127,5 @@ show_object(result)
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
TPU_DENSITY = 1.21e-3 # g/mm3
|
v = result.val().Volume()
|
||||||
|
print("%-12s %.2f g" % ("lollipop", v * TPU_DENSITY))
|
||||||
print("lollipop %.2f g in TPU" % (result.val().Volume() * TPU_DENSITY))
|
|
||||||
|
|||||||
@@ -114,11 +114,6 @@ if "show_object" not in globals(): # running outside CQ-editor
|
|||||||
|
|
||||||
show_object(result)
|
show_object(result)
|
||||||
|
|
||||||
# Mass report
|
|
||||||
def report():
|
|
||||||
vol = result.val().Volume()
|
|
||||||
print(f" Mass = {vol * CF_DENSITY:5.2f} g")
|
|
||||||
print(f" Mass x4 = {4 * vol * CF_DENSITY:5.2f} g")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
report()
|
v = result.val().Volume()
|
||||||
|
print("%-12s %.2f g" % ("motor base", v * CF_DENSITY))
|
||||||
|
|||||||
25
plate.py
25
plate.py
@@ -106,33 +106,37 @@ def plate():
|
|||||||
p = p.cut(bones.rotate((0, 0, 0), (0, 0, 1), a).translate((x, y, 0)))
|
p = p.cut(bones.rotate((0, 0, 0), (0, 0, 1), a).translate((x, y, 0)))
|
||||||
|
|
||||||
# Triangle cuts to reduce weight
|
# Triangle cuts to reduce weight
|
||||||
|
# the small one near center
|
||||||
cut1 = (
|
cut1 = (
|
||||||
cq.Workplane("XY")
|
cq.Workplane("XY")
|
||||||
.polyline([
|
.polyline([
|
||||||
(6.5, -9),
|
(7, -7),
|
||||||
(6.5, 9),
|
(7, 7),
|
||||||
(1, 0),
|
(1.5, 0),
|
||||||
]).close()
|
]).close()
|
||||||
.extrude(THICKNESS)
|
.extrude(THICKNESS)
|
||||||
.edges("|Z")
|
.edges("|Z")
|
||||||
.fillet(1.0)
|
.fillet(1.0)
|
||||||
)
|
)
|
||||||
|
# strap holes
|
||||||
cut2 = (
|
cut2 = (
|
||||||
cq.Workplane("XY")
|
cq.Workplane("XY")
|
||||||
.polyline([
|
.polyline([
|
||||||
(9.5, -9),
|
(11, -8),
|
||||||
(9.5, 9),
|
(11, 8),
|
||||||
(15, 0),
|
(13, 8),
|
||||||
|
(13, -8),
|
||||||
]).close()
|
]).close()
|
||||||
.extrude(THICKNESS)
|
.extrude(THICKNESS)
|
||||||
.edges("|Z")
|
.edges("|Z")
|
||||||
.fillet(1.0)
|
.fillet(0.99)
|
||||||
)
|
)
|
||||||
|
# the big one
|
||||||
cut3 = (
|
cut3 = (
|
||||||
cq.Workplane("XY")
|
cq.Workplane("XY")
|
||||||
.polyline([
|
.polyline([
|
||||||
(11, 15),
|
(10, 15),
|
||||||
(-11, 15),
|
(-10, 15),
|
||||||
(0, 4),
|
(0, 4),
|
||||||
]).close()
|
]).close()
|
||||||
.extrude(THICKNESS)
|
.extrude(THICKNESS)
|
||||||
@@ -168,6 +172,5 @@ show_object(result)
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
v = result.val().Volume()
|
v = result.val().Volume()
|
||||||
print("plate mass %.2f g each, %.2f g for two" % (v * CF_DENSITY, 2 * v * CF_DENSITY))
|
print("%-12s %.2f g" % ("plate", v * CF_DENSITY))
|
||||||
|
|||||||
9
spar.py
9
spar.py
@@ -111,12 +111,6 @@ result = spar()
|
|||||||
|
|
||||||
assert result.solids().size() == 1, "spar is not one solid"
|
assert result.solids().size() == 1, "spar is not one solid"
|
||||||
|
|
||||||
# Mass report
|
|
||||||
def report():
|
|
||||||
vol = result.val().Volume()
|
|
||||||
print(f" Mass = {vol * CF_DENSITY:5.2f} g")
|
|
||||||
print(f" Mass x4 = {4 * vol * CF_DENSITY:5.2f} g")
|
|
||||||
|
|
||||||
# Running outside CQ-editor
|
# Running outside CQ-editor
|
||||||
if "show_object" not in globals():
|
if "show_object" not in globals():
|
||||||
def show_object(*args, **kwargs):
|
def show_object(*args, **kwargs):
|
||||||
@@ -125,4 +119,5 @@ if "show_object" not in globals():
|
|||||||
show_object(result)
|
show_object(result)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
report()
|
v = result.val().Volume()
|
||||||
|
print("%-12s %.2f g" % ("spar", v * CF_DENSITY))
|
||||||
|
|||||||
12
standoff.py
12
standoff.py
@@ -4,12 +4,9 @@
|
|||||||
|
|
||||||
import cadquery as cq
|
import cadquery as cq
|
||||||
|
|
||||||
from frame_params import PLATE_GAP
|
from frame_params import (ALU_DENSITY, PLATE_GAP)
|
||||||
|
|
||||||
OD = 3.5 # round M2 standoff
|
OD = 3.5 # round M2 standoff
|
||||||
ALU_DENSITY = 2.70e-3 # g/mm3, for mass reporting
|
|
||||||
PLATE_GAP=16
|
|
||||||
|
|
||||||
|
|
||||||
def standoff():
|
def standoff():
|
||||||
p = (cq.Workplane("XY")
|
p = (cq.Workplane("XY")
|
||||||
@@ -39,8 +36,5 @@ show_object(result)
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
solid = result.val()
|
v = result.val().Volume()
|
||||||
|
print("%-12s %.2f g" % ("standoff", v * ALU_DENSITY))
|
||||||
print("standoff %.3f g each, %.3f g for four"
|
|
||||||
% (solid.Volume() * ALU_DENSITY,
|
|
||||||
4 * solid.Volume() * ALU_DENSITY))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user