Compare commits

...

7 Commits

Author SHA1 Message Date
8181556898 67: create 3D tokens for jacopad 2024-04-25 17:05:01 +02:00
041307a28c Add flake8 linter 2024-04-25 14:46:29 +00:00
21d334ddb9 Improve README 2024-04-25 16:07:38 +02:00
5008db05e1 Creates a garbage zone for the virtual pad #34
close MDL29/JacoBot#34
2024-04-25 15:47:50 +02:00
9513e5d5bc Disable DEBUG level log for Arcade
close #58
2024-04-25 11:33:39 +02:00
c1771906e4 Add Rich Library for logging in JacoVirt
close #56
2024-04-25 10:10:36 +02:00
e31eec876a Add command & subcommand for JacoVirt via argparse
* Command `jacovirt`
* Sub command `jacovirt pad`
* Sub command `jacovirt bot`

close #20
2024-04-24 23:53:11 +02:00
7 changed files with 186 additions and 17 deletions

View 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);
}
}
}

View File

@ -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
View 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

View File

@ -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()])

View File

@ -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)

View File

@ -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):

View File

@ -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/*"