Merge "Draw Basic 2020 Field Spline GUI"
diff --git a/frc971/control_loops/python/constants.py b/frc971/control_loops/python/constants.py
index 7b45215..e0b4878 100644
--- a/frc971/control_loops/python/constants.py
+++ b/frc971/control_loops/python/constants.py
@@ -11,18 +11,31 @@
args = arg_parser.parse_args()
SCREEN_SIZE = args.size
-WIDTH_OF_FIELD_IN_METERS = 8.258302
-
WIDTH_OF_ROBOT = 0.65
LENGTH_OF_ROBOT = 0.8
-ROBOT_SIDE_TO_BALL_CENTER = 0.15 #Placeholder value
+ROBOT_SIDE_TO_BALL_CENTER = 0.15 # Placeholder value
BALL_RADIUS = 0.165
-ROBOT_SIDE_TO_HATCH_PANEL = 0.1 #Placeholder value
+ROBOT_SIDE_TO_HATCH_PANEL = 0.1 # Placeholder value
HATCH_PANEL_WIDTH = 0.4826
-def pxToM(p):
+FIELD = 2020
+
+if FIELD == 2019:
+ WIDTH_OF_FIELD_IN_METERS = 8.258302 # Half Field
+elif FIELD == 2020:
+ WIDTH_OF_FIELD_IN_METERS = 15.98295 # Full Field
+ LENGTH_OF_FIELD_IN_METERS = 8.21055 # Full Field
+
+def pxToM(p, length = False):
+ if(length):
+ return p * LENGTH_OF_FIELD_IN_METERS / (SCREEN_SIZE/2)
return p * WIDTH_OF_FIELD_IN_METERS / SCREEN_SIZE
-def mToPx(m):
+def mToPx(m, length = False):
+ if(length):
+ return (m*(SCREEN_SIZE/2)/LENGTH_OF_FIELD_IN_METERS)
return (m*SCREEN_SIZE/WIDTH_OF_FIELD_IN_METERS)
+
+def inToM(i):
+ return (i*0.0254)
diff --git a/frc971/control_loops/python/drawing_constants.py b/frc971/control_loops/python/drawing_constants.py
index 89979f0..a2ddf5d 100644
--- a/frc971/control_loops/python/drawing_constants.py
+++ b/frc971/control_loops/python/drawing_constants.py
@@ -3,7 +3,6 @@
from constants import *
import numpy as np
-
def set_color(cr, color, a=1):
if color.a == 1.0:
cr.set_source_rgba(color.r, color.g, color.b, a)
@@ -37,6 +36,11 @@
cr.stroke()
set_color(cr, palette["WHITE"])
+def draw_circle(cr, x, y, radius, color=palette["RED"]):
+ set_color(cr, color)
+ cr.arc(x, y, radius, 0, 2*np.pi)
+ cr.fill()
+ cr.stroke()
def draw_control_points(cr, points, width=10, radius=4, color=palette["BLUE"]):
for i in range(0, len(points)):
@@ -46,12 +50,131 @@
cr.fill()
set_color(cr, palette["WHITE"])
-
def display_text(cr, text, widtha, heighta, widthb, heightb):
cr.scale(widtha, -heighta)
cr.show_text(text)
cr.scale(widthb, -heightb)
+def markers(cr):
+ SHOW_MARKERS = False
+ if SHOW_MARKERS:
+ # Shield Generator Reference
+ color = palette["BLUE"]
+ yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+ # Top Left
+ draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True), 10, color)
+ # Top Right
+ draw_circle(cr, mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True), 10, color)
+ # Bottom Right
+ draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True), 10, color)
+ # Bottom Left
+ draw_circle(cr, mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True), 10, color)
+
+ # Trench Run Reference
+ color = palette["GREEN"]
+ # Bottom Trench Run
+ # Bottom Right
+ draw_circle(cr, mToPx(inToM(206.625)), yorigin, 10, color)
+ # Top Right
+ draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True), 10, color)
+ # Top Left
+ draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True), 10, color)
+ # Bottom Left
+ draw_circle(cr, mToPx(inToM(422.625)), yorigin, 10, color)
+
+ # Top Trench Run
+ # Top Right
+ draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(323.25), True), 10, color)
+ # Bottom Right
+ draw_circle(cr, mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True), 10, color)
+ # Top Left
+ draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True), 10, color)
+ # Bottom Left
+ draw_circle(cr, mToPx(inToM(422.625)), yorigin + mToPx(inToM(323.25), True), 10, color)
+ cr.stroke()
+
+def draw_init_lines(cr):
+ yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+ set_color(cr, palette["RED"])
+ cr.move_to(mToPx(inToM(120)), yorigin)
+ cr.line_to(mToPx(inToM(120)), yorigin + mToPx(8.21055, True))
+
+ cr.move_to(mToPx(inToM(505.25)), yorigin)
+ cr.line_to(mToPx(inToM(505.25)), yorigin + mToPx(8.21055, True))
+
+ cr.stroke()
+
+def draw_trench_run(cr):
+ set_color(cr, palette["GREEN"])
+ yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+ cr.move_to(mToPx(inToM(206.625)), yorigin)
+ cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True))
+
+ cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True))
+
+ cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(422.625)), yorigin)
+
+ cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(323.25), True))
+ cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True))
+
+ cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True))
+
+ cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(323.25), True))
+
+ cr.stroke()
+
+def draw_shield_generator(cr):
+ set_color(cr, palette["BLUE"])
+ yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+
+ cr.move_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True))
+ cr.line_to(mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True))
+
+ cr.move_to(mToPx(inToM(373.616)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True))
+
+ cr.move_to(mToPx(inToM(422.625)), yorigin + mToPx(inToM(124.67), True))
+ cr.line_to(mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True))
+
+ cr.move_to(mToPx(inToM(255.634)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(206.625)), yorigin + mToPx(inToM(212.097), True))
+
+ cr.stroke()
+
+def draw_control_panel(cr): # Base plates are not included
+ set_color(cr, palette["LIGHT_GREY"])
+ yorigin = 0-SCREEN_SIZE/2 # Move origin to bottom left
+ # Bottom Control Panel
+ # Top Line
+ cr.move_to(mToPx(inToM(225.624)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(285.624)), yorigin + mToPx(inToM(55.5), True))
+
+ # Left Line
+ cr.move_to(mToPx(inToM(225.624)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(225.624)), yorigin)
+
+ # Right Line
+ cr.move_to(mToPx(inToM(285.624)), yorigin + mToPx(inToM(55.5), True))
+ cr.line_to(mToPx(inToM(285.624)), yorigin)
+
+ # Top Control Panel
+ # Bottom Line
+ cr.move_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(281.26), True))
+
+ # Right Line
+ cr.move_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(403.616)), yorigin + mToPx(inToM(323.25), True))
+
+ # Left Line
+ cr.move_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(281.26), True))
+ cr.line_to(mToPx(inToM(343.616)), yorigin + mToPx(inToM(323.25), True))
+
+ cr.stroke()
def draw_HAB(cr):
# BASE Constants
@@ -307,7 +430,6 @@
mToPx(1.41605))
cr.stroke()
-
def draw_points(cr, p, size):
for i in range(0, len(p)):
draw_px_cross(cr, p[i][0], p[i][1], size,
diff --git a/frc971/control_loops/python/path_edit.py b/frc971/control_loops/python/path_edit.py
index d04089b..ddc38ac 100755
--- a/frc971/control_loops/python/path_edit.py
+++ b/frc971/control_loops/python/path_edit.py
@@ -93,9 +93,17 @@
return self.all_controls[self.get_index_of_nearest_point()]
def draw_field_elements(self, cr):
- draw_HAB(cr)
- draw_rockets(cr)
- draw_cargo_ship(cr)
+ if FIELD == 2019:
+ draw_HAB(cr)
+ draw_rockets(cr)
+ draw_cargo_ship(cr)
+ elif FIELD == 2020:
+ set_color(cr, palette["BLACK"])
+ markers(cr)
+ draw_shield_generator(cr)
+ draw_trench_run(cr)
+ draw_init_lines(cr)
+ draw_control_panel(cr)
def draw_robot_at_point(self, cr, i, p, spline):
p1 = [mToPx(spline.Point(i)[0]), mToPx(spline.Point(i)[1])]
@@ -206,16 +214,16 @@
self.extents_y_max - self.extents_y_min)
cr.fill()
- #Drawing the switch and scale in the field
cr.move_to(0, 50)
cr.show_text('Press "e" to export')
cr.show_text('Press "i" to import')
- set_color(cr, palette["WHITE"])
- cr.rectangle(0, -mToPx(8.2296 / 2.0), SCREEN_SIZE, SCREEN_SIZE)
- cr.fill()
set_color(cr, palette["BLACK"])
- cr.rectangle(0, -mToPx(8.2296 / 2.0), SCREEN_SIZE, SCREEN_SIZE)
+ if FIELD == 2020:
+ cr.rectangle(0, mToPx(-7.991475), SCREEN_SIZE, SCREEN_SIZE/2)
+ else:
+ cr.rectangle(0, mToPx(-7.991475), SCREEN_SIZE, SCREEN_SIZE)
+ print(mToPx(-7.991475))
cr.set_line_join(cairo.LINE_JOIN_ROUND)
cr.stroke()
self.draw_field_elements(cr)