forked from MDL29/JacoBot
Compare commits
7 Commits
e83daae8c3
...
8181556898
Author | SHA1 | Date | |
---|---|---|---|
8181556898 | |||
041307a28c | |||
21d334ddb9 | |||
5008db05e1 | |||
9513e5d5bc | |||
c1771906e4 | |||
e31eec876a |
86
doc/openscad/lph_base_pad.scad
Normal file
86
doc/openscad/lph_base_pad.scad
Normal file
|
@ -0,0 +1,86 @@
|
|||
BASE_LARGEUR=35;
|
||||
BASE_HAUTEUR=20;
|
||||
BASE_EPAISSEUR=5;
|
||||
|
||||
BASE_TRIANGLE=20;
|
||||
|
||||
RESISTANCE_HAUTEUR=14;
|
||||
RESISTANCE_LARGEUR=5;
|
||||
RESISTANCE_EPAISSEUR=3;
|
||||
|
||||
PICOT_DIAMETER=3;
|
||||
PICOT_POSITION_HAUTEUR=18;
|
||||
PICOT_HAUTEUR=2;
|
||||
PICOT_1_LARGEUR=6;
|
||||
|
||||
//avance=[[0,0], [round(BASE_LARGEUR/2),20], [BASE_LARGEUR,0]];
|
||||
avance=[[0,0], [17.5,20], [35,0]];
|
||||
avance_path=[0, 1, 2];
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
// cube de base
|
||||
cube([BASE_LARGEUR, BASE_HAUTEUR, BASE_EPAISSEUR]);
|
||||
// forme
|
||||
translate([0, BASE_HAUTEUR,0]) {
|
||||
linear_extrude(height=BASE_EPAISSEUR) {
|
||||
polygon(points=avance); //, paths=avance_path);
|
||||
}
|
||||
}
|
||||
// deux picots
|
||||
translate([PICOT_1_LARGEUR, PICOT_POSITION_HAUTEUR, BASE_EPAISSEUR]) {
|
||||
cylinder(h=PICOT_HAUTEUR, d1=PICOT_DIAMETER, d2=PICOT_DIAMETER-1, $fn=20);
|
||||
}
|
||||
translate([BASE_LARGEUR-PICOT_1_LARGEUR, PICOT_POSITION_HAUTEUR, BASE_EPAISSEUR]) {
|
||||
cylinder(h=PICOT_HAUTEUR, d1=PICOT_DIAMETER, d2=PICOT_DIAMETER-1, $fn=20);
|
||||
}
|
||||
}
|
||||
|
||||
translate([(BASE_LARGEUR/2)-(RESISTANCE_HAUTEUR/2),9,2]) {
|
||||
cube([RESISTANCE_HAUTEUR, RESISTANCE_LARGEUR, RESISTANCE_EPAISSEUR + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
CLIP_RAYON=17.5;
|
||||
CLIP_EPAISSEUR=2.5;
|
||||
RES_PATTE_RAYON=0.90;
|
||||
RES_PATTE_EPAISSEUR=4;
|
||||
|
||||
#translate([BASE_LARGEUR/2, BASE_HAUTEUR, BASE_EPAISSEUR]) {
|
||||
difference() {
|
||||
cylinder(h=CLIP_EPAISSEUR,r=CLIP_RAYON, $fn=60);
|
||||
translate([-CLIP_RAYON, 0,-1]) {
|
||||
cube([CLIP_RAYON*2, CLIP_RAYON, CLIP_EPAISSEUR+2]);
|
||||
}
|
||||
// deux trous picots
|
||||
translate([-(BASE_LARGEUR/2) + PICOT_1_LARGEUR,
|
||||
-BASE_HAUTEUR + PICOT_POSITION_HAUTEUR, -0.5]) {
|
||||
cylinder(h=CLIP_EPAISSEUR, d=PICOT_DIAMETER, $fn=20);
|
||||
}
|
||||
translate([(BASE_LARGEUR/2) - PICOT_1_LARGEUR,
|
||||
-BASE_HAUTEUR + PICOT_POSITION_HAUTEUR, -0.5]) {
|
||||
cylinder(h=CLIP_EPAISSEUR, d=PICOT_DIAMETER, $fn=20);
|
||||
}
|
||||
// trou pour l'aimant
|
||||
translate([0, -2, -0.5]) {
|
||||
cylinder(h=CLIP_EPAISSEUR, d=PICOT_DIAMETER, $fn=20);
|
||||
}
|
||||
// autre trou pour l'aimant
|
||||
translate([0, -BASE_HAUTEUR + 5, -0.5]) {
|
||||
cylinder(h=CLIP_EPAISSEUR, d=PICOT_DIAMETER, $fn=20);
|
||||
}
|
||||
// trous pour la résistance
|
||||
translate([-5, -4, -0.5]) {
|
||||
cylinder(h=RES_PATTE_EPAISSEUR, d=RES_PATTE_RAYON, $fn=20);
|
||||
}
|
||||
translate([ 5, -4, -0.5]) {
|
||||
cylinder(h=RES_PATTE_EPAISSEUR, d=RES_PATTE_RAYON, $fn=20);
|
||||
}
|
||||
translate([-5, -8.5, -0.5]) {
|
||||
cylinder(h=RES_PATTE_EPAISSEUR, d=RES_PATTE_RAYON, $fn=20);
|
||||
}
|
||||
translate([ 5, -8.5, -0.5]) {
|
||||
cylinder(h=RES_PATTE_EPAISSEUR, d=RES_PATTE_RAYON, $fn=20);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,9 +17,9 @@ poetry install
|
|||
~~~
|
||||
Run the virtual pad with :
|
||||
~~~
|
||||
poetry run jacovirt-pad
|
||||
poetry run jacovirt pad
|
||||
~~~
|
||||
Run the virtual bot with :
|
||||
~~~
|
||||
poetry run jacovirt-bot
|
||||
~~~
|
||||
poetry run jacovirt bot
|
||||
~~~
|
||||
|
|
56
jacovirt/jacovirt/args.py
Normal file
56
jacovirt/jacovirt/args.py
Normal file
|
@ -0,0 +1,56 @@
|
|||
import argparse
|
||||
import logging
|
||||
|
||||
import jacovirt.logger
|
||||
|
||||
log_level = {
|
||||
"CRITICAL": logging.CRITICAL,
|
||||
"ERROR": logging.ERROR,
|
||||
"WARN": logging.WARNING,
|
||||
"INFO": logging.INFO,
|
||||
"DEBUG": logging.DEBUG,
|
||||
}
|
||||
|
||||
def main():
|
||||
|
||||
# General parser
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
|
||||
# Subparser
|
||||
sub = parser.add_subparsers(dest="sub")
|
||||
|
||||
parser.add_argument(
|
||||
"-l",
|
||||
"--log",
|
||||
choices=log_level.keys(),
|
||||
default="WARN",
|
||||
help=("Set level log"),
|
||||
dest="log",
|
||||
)
|
||||
|
||||
|
||||
# Parser for JacoVirt Pad
|
||||
pad = sub.add_parser("pad", help="Run JacoVirt Pad")
|
||||
|
||||
# Parser for JacoVirt Bot
|
||||
bot = sub.add_parser("bot", help="Run JacoVirt Bot")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.sub is None:
|
||||
parser.print_help()
|
||||
exit(1)
|
||||
|
||||
logging.getLogger().setLevel(args.log)
|
||||
|
||||
match args.sub:
|
||||
case "pad":
|
||||
logging.info("Lunch JacoVirt Pad")
|
||||
from jacovirt.pad import window
|
||||
window.main()
|
||||
case "bot":
|
||||
logging.info("Lunch JacoVirt Bot")
|
||||
from jacovirt.bot import window
|
||||
window.main()
|
||||
case _:
|
||||
SystemExit
|
|
@ -1,4 +1,8 @@
|
|||
import logging
|
||||
from rich.logging import RichHandler
|
||||
|
||||
# Set level INFO log for Arcade library
|
||||
logging.getLogger("arcade").setLevel(logging.INFO)
|
||||
|
||||
# Logger config
|
||||
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", datefmt='%m/%d/%Y %H:%M:%S', level=logging.INFO)
|
||||
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", datefmt="%m/%d/%Y %H:%M:%S", handlers=[RichHandler()])
|
||||
|
|
|
@ -25,8 +25,6 @@ class Token_generator(arcade.Sprite):
|
|||
|
||||
self.image_file_name = ":resources:images/tiles/boxCrate_double.png"
|
||||
|
||||
self.tokens = arcade.SpriteList()
|
||||
|
||||
# Call the parent
|
||||
super().__init__(self.image_file_name, scale, hit_box_algorithm="None")
|
||||
|
||||
|
@ -34,8 +32,9 @@ class Token_generator(arcade.Sprite):
|
|||
# Create a token
|
||||
token = Token(self.type)
|
||||
token.position = x, y
|
||||
self.tokens.append(token)
|
||||
return token
|
||||
|
||||
def draw_tokens(self):
|
||||
self.tokens.draw()
|
||||
|
||||
class Token_trash(arcade.SpriteSolidColor):
|
||||
def __init__(self, height, width, color=arcade.color.AMERICAN_ROSE):
|
||||
super().__init__(width, height, color)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import arcade
|
||||
import jacovirt.logger
|
||||
import logging
|
||||
from jacovirt.pad.token import Token, Token_generator
|
||||
from jacovirt.pad.token import Token, Token_generator, Token_trash
|
||||
|
||||
# Screen title and size
|
||||
SCREEN_TITLE = "Jaco Pad"
|
||||
|
@ -25,6 +25,9 @@ class Pad(arcade.Window):
|
|||
# List of token generator
|
||||
self.tokens_generator = arcade.SpriteList()
|
||||
|
||||
# List of trash
|
||||
self.tokens_trash = arcade.SpriteList()
|
||||
|
||||
# The held token
|
||||
self.held_token = None
|
||||
|
||||
|
@ -49,6 +52,11 @@ class Pad(arcade.Window):
|
|||
token_generator.position = 800, 500
|
||||
self.tokens_generator.append(token_generator)
|
||||
|
||||
# Create a trash for token
|
||||
trash = Token_trash(200, 200)
|
||||
trash.position = 500, 800
|
||||
self.tokens_trash.append(trash)
|
||||
|
||||
def on_draw(self):
|
||||
"""Render the screen"""
|
||||
|
||||
|
@ -58,9 +66,16 @@ class Pad(arcade.Window):
|
|||
# Draw the token generator
|
||||
self.tokens_generator.draw()
|
||||
|
||||
# Draw the trash
|
||||
self.tokens_trash.draw()
|
||||
|
||||
# Draw the tokens
|
||||
self.tokens.draw()
|
||||
|
||||
# Draw the held tokens
|
||||
if self.held_token is not None:
|
||||
self.held_token.draw()
|
||||
|
||||
def on_key_press(self, symbol, modifiers):
|
||||
"""Called when the user presses key"""
|
||||
if symbol == arcade.key.R:
|
||||
|
@ -80,14 +95,12 @@ class Pad(arcade.Window):
|
|||
|
||||
# Have we clicked on a token?
|
||||
if len(tokens) > 0:
|
||||
|
||||
# Might be a stack of tokens, get the top one
|
||||
primary_token = tokens[-1]
|
||||
self.tokens.remove(primary_token)
|
||||
|
||||
# All other cases, grab the token we are clicking on
|
||||
self.held_token = primary_token
|
||||
# Save the position
|
||||
self.held_token_original_position = self.held_token.position
|
||||
|
||||
return
|
||||
|
||||
|
@ -101,13 +114,22 @@ class Pad(arcade.Window):
|
|||
|
||||
# Create a token and take it
|
||||
self.held_token = generator.create_token(x, y)
|
||||
self.tokens.append(self.held_token)
|
||||
|
||||
def on_mouse_release(self, x, y, button, modifiers):
|
||||
"""Called when the user presses a mouse button"""
|
||||
logging.info(f"Mouse relase at {x},{y}")
|
||||
|
||||
|
||||
# Get list of tokens_trash we've release on
|
||||
tokens_trash = arcade.get_sprites_at_point((x, y), self.tokens_trash)
|
||||
|
||||
# If we are on a tokens_trash
|
||||
if len(tokens_trash) > 0:
|
||||
# Delete the held token
|
||||
self.held_token = None
|
||||
|
||||
# remove token from hand
|
||||
if self.held_token != None:
|
||||
self.tokens.append(self.held_token)
|
||||
self.held_token = None
|
||||
|
||||
def on_mouse_motion(self, x: float, y: float, dx: float, dy: float):
|
||||
|
|
|
@ -10,15 +10,17 @@ python = "^3.11"
|
|||
arcade = "^2.6.17"
|
||||
redis = "^5.0.3"
|
||||
pydantic = "^2.7.1"
|
||||
rich = "^13.7.1"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
flake8 = "^7.0.0"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry.scripts]
|
||||
jacovirt-bot = "jacovirt.bot.window:main"
|
||||
jacovirt-pad = "jacovirt.pad.window:main"
|
||||
jacovirt = "jacovirt.args:main"
|
||||
|
||||
[[tool.poetry.include]]
|
||||
path = "jacovirt/jacovirt/Img/*"
|
||||
|
|
Loading…
Reference in New Issue
Block a user