4.0 KiB
4.0 KiB
refac vs root (historical)
The refac version is now the main version (root Command.py, Program.py, Plotter.py). This doc is kept for reference.
Original comparison of the core modules: Command.py, Program.py, Plotter.py.
Command.py
| Aspect | Root | refac |
|---|---|---|
| import math | ❌ Missing (bug: rotate() uses math.cos/math.sin) |
✅ Present |
| Class attributes | inicoms, scalecoms, movecoms only |
Same + abscoms, relcoms, arccoms (for PA/PD/PU, PR, CI/AA) |
| scalable / movable | return True if ... else False |
return self.name in ... and self.args (shorter, same meaning) |
| x | self.args[0] if self.movable else None |
self.args[0] if self.args else None |
| y | self.args[1] if self.movable else None (and len(self.args)<2 check with wrong indent) |
self.args[-1] if self.args else None (works for single-arg commands like CI) |
| rotate() | Command((self.name, ...), (...)) → bug: first arg is a tuple, not name |
✅ Command(self.name, ...) |
| flip() | Command(self.name, self.y, -self.x) → wrong: swaps x/y |
✅ Command(self.name, self.x, -self.y) (mirror in y) |
Summary: refac fixes missing math, corrects rotate() and flip(), and adds command-type sets used by Program parsing/simulation.
Program.py
| Aspect | Root | refac |
|---|---|---|
| init | commands or []; no bounds |
commands (can be None); if commands given, computes bounds once via __simulate() |
| Bounds (xmin, xmax, …) | @property – computed from commands each time | Set once in init from __simulate() (no property; no update if commands change) |
| parsefile / parse | Instance methods: p.parsefile(f) mutates self.commands |
@staticmethod: Program.parsefile(f) / Program.parse(code) return new Program |
| Parsing | One Command per semicolon; all args in one list | Multi-point PA/PD/PU: if len(args)>2, splits into (x,y) pairs and creates one Command per point |
| show() | ❌ Not in Program (show in main.py) | ✅ Program.show(): flip, rotate 270°, fitin to 1024×600, Tk canvas |
| fitin(), scaleto(), moveto() | ❌ Not in root | ✅ Present (scale/move to rectangle with alignment fx, fy) |
| multi(w, h) | ❌ Not in root | ✅ Tile program in w×h grid with spacing |
| Program.parse() return | N/A (mutates self) | Returns Program(commands) |
Summary: refac adds static parsing (return new Program), multi-point parsing, simulation for bounds, and helpers: show(), fitin(), scaleto(), moveto(), multi().
Plotter.py
| Aspect | Root | refac |
|---|---|---|
| Import | import pyserial (wrong name; should be serial) |
import serial |
| Boundaries storage | self.__boundaries (private) |
self.boundaries (public) |
| p0incenter | True |
False |
| getoutput() | self.ser.read() → str; returns ''.join(s) |
Bytes: outstr used as-is; x == b"\x0d"; returns b''.join(s).decode() |
| write() | self.ser.write(str(programm)) (str) |
self.ser.write(str(programm).encode()) (bytes) |
| full(prog) | ✅ Scale prog to fit plotter bounds | ❌ Removed (scaling done elsewhere, e.g. Program.fitin) |
| centralize() | Same logic | Same logic (behavior differs only if p0incenter differs) |
Summary: refac uses proper serial and bytes for Python 3; drops full(); different default for p0incenter.
Overall
- refac = cleaned-up, Python‑3‑friendly version: correct Command (math, rotate, flip), static Program parsing, multi-point parsing, bounds simulation, fitin/show/multi, and serial over bytes.
- Root = older version: Command has bugs (no math, wrong rotate/flip), instance-method parsing only, no fitin/show/multi, and broken
pyserialimport.
Recommendation: use refac as the main implementation and, if needed, replace root with it (or make root a thin wrapper around refac).