diff --git a/convert.py b/convert.py new file mode 100644 index 0000000..d905daa --- /dev/null +++ b/convert.py @@ -0,0 +1,147 @@ +import os +import subprocess +import tkinter as tk +from tkinter import filedialog, messagebox, scrolledtext +from pathlib import Path + +class MarkdownToPDFApp: + def __init__(self, root): + self.root = root + self.root.title("Markdown → DOCX/PDF Converter") + self.root.geometry("650x480") + self.root.resizable(False, False) + + self.folder_path = tk.StringVar() + self.output_name = tk.StringVar(value="manuale") + self.template_path = tk.StringVar() + self.use_template = tk.BooleanVar(value=False) + self.generate_pdf = tk.BooleanVar(value=True) + + # --- UI --- + tk.Label(root, text="Cartella Markdown:").pack(anchor="w", padx=10, pady=(10, 0)) + frame1 = tk.Frame(root) + frame1.pack(fill="x", padx=10) + tk.Entry(frame1, textvariable=self.folder_path, width=50).pack(side="left", fill="x", expand=True) + tk.Button(frame1, text="Sfoglia...", command=self.choose_folder).pack(side="right", padx=5) + + tk.Label(root, text="Nome base file output (senza estensione):").pack(anchor="w", padx=10, pady=(10, 0)) + tk.Entry(root, textvariable=self.output_name, width=40).pack(fill="x", padx=10) + + tk.Checkbutton(root, text="Usa template DOCX", variable=self.use_template, command=self.toggle_template).pack(anchor="w", padx=10, pady=(10, 0)) + frame2 = tk.Frame(root) + frame2.pack(fill="x", padx=10) + tk.Entry(frame2, textvariable=self.template_path, width=50, state="disabled").pack(side="left", fill="x", expand=True) + tk.Button(frame2, text="Seleziona template", command=self.choose_template, state="disabled").pack(side="right", padx=5) + self.template_frame = frame2 + + tk.Checkbutton(root, text="Genera anche PDF finale", variable=self.generate_pdf).pack(anchor="w", padx=10, pady=(10, 0)) + + tk.Button(root, text="Genera Documento", command=self.generate_output, bg="#3c9", fg="white").pack(pady=10) + + tk.Label(root, text="Log:").pack(anchor="w", padx=10) + self.log_box = scrolledtext.ScrolledText(root, height=13, state="disabled") + self.log_box.pack(fill="both", expand=True, padx=10, pady=(0, 10)) + + # --- Utility methods --- + def log(self, text): + self.log_box.configure(state="normal") + self.log_box.insert(tk.END, text + "\n") + self.log_box.configure(state="disabled") + self.log_box.see(tk.END) + self.root.update_idletasks() + + def choose_folder(self): + folder = filedialog.askdirectory(title="Seleziona la cartella Markdown") + if folder: + self.folder_path.set(folder) + + def toggle_template(self): + state = "normal" if self.use_template.get() else "disabled" + for widget in self.template_frame.winfo_children(): + widget.configure(state=state) + + def choose_template(self): + file = filedialog.askopenfilename(title="Seleziona template DOCX", filetypes=[("Word Template", "*.docx")]) + if file: + self.template_path.set(file) + + def generate_output(self): + folder = self.folder_path.get().strip() + output_name = self.output_name.get().strip() + template = self.template_path.get().strip() + use_template = self.use_template.get() + make_pdf = self.generate_pdf.get() + + if not folder: + messagebox.showwarning("Attenzione", "Seleziona una cartella contenente i file Markdown.") + return + + folder_path = Path(folder) + output_docx = folder_path / f"{output_name}.docx" + output_pdf = folder_path / f"{output_name}.pdf" + + # Trova i file Markdown numerati + md_files = sorted(folder_path.glob("[0-9][0-9]_*.md")) + if not md_files: + messagebox.showerror("Errore", "Nessun file Markdown numerato trovato nella cartella.") + return + + self.log(f"Trovati {len(md_files)} file Markdown:") + for f in md_files: + self.log(f" - {f.name}") + + combined_md = folder_path / "_manuale_unico_temp.md" + self.log(f"\nUnione dei file in {combined_md.name}...") + + try: + with open(combined_md, "w", encoding="utf-8") as out: + for f in md_files: + out.write(f"\n\n# --- {f.name} ---\n\n") + out.write(f.read_text(encoding="utf-8")) + out.write("\n\n") + self.log("File unito con successo.") + except Exception as e: + messagebox.showerror("Errore durante unione", str(e)) + return + + # Comando Pandoc per generare DOCX + cmd_docx = ["pandoc", str(combined_md), "-o", str(output_docx)] + if use_template: + if not Path(template).exists(): + messagebox.showerror("Template non trovato", f"Il file {template} non esiste.") + return + cmd_docx.extend(["--reference-doc", str(template)]) + + self.log("\nEsecuzione Pandoc (DOCX)...") + result = subprocess.run(cmd_docx, capture_output=True, text=True) + if result.returncode != 0: + self.log("❌ Errore Pandoc (DOCX):") + self.log(result.stderr) + messagebox.showerror("Errore Pandoc", result.stderr) + return + + self.log(f"✅ DOCX generato correttamente: {output_docx}") + + # Generazione PDF opzionale + if make_pdf: + self.log("\nGenerazione PDF dal DOCX...") + cmd_pdf = ["pandoc", str(output_docx), "-o", str(output_pdf)] + result = subprocess.run(cmd_pdf, capture_output=True, text=True) + if result.returncode == 0: + self.log(f"✅ PDF generato: {output_pdf}") + messagebox.showinfo("Completato", f"PDF generato: {output_pdf}") + else: + self.log("❌ Errore durante conversione PDF:") + self.log(result.stderr) + messagebox.showerror("Errore PDF", result.stderr) + else: + messagebox.showinfo("Completato", f"DOCX generato: {output_docx}") + + # Pulisce file temporaneo + if combined_md.exists(): + combined_md.unlink() + +if __name__ == "__main__": + root = tk.Tk() + app = MarkdownToPDFApp(root) + root.mainloop() diff --git a/doc/manual/manuale.docx b/doc/manual/manuale.docx new file mode 100644 index 0000000..7597ad3 Binary files /dev/null and b/doc/manual/manuale.docx differ diff --git a/doc/manual/manuale.pdf b/doc/manual/manuale.pdf index 5aca7bb..346a853 100644 Binary files a/doc/manual/manuale.pdf and b/doc/manual/manuale.pdf differ diff --git a/istemato posizionamento in azimuth dei target b/istemato posizionamento in azimuth dei target new file mode 100644 index 0000000..74570f6 --- /dev/null +++ b/istemato posizionamento in azimuth dei target @@ -0,0 +1,324 @@ + + SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS + + Commands marked with * may be preceded by a number, _N. + Notes in parentheses indicate the behavior if _N is given. + A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K. + + h H Display this help. + q :q Q :Q ZZ Exit. + --------------------------------------------------------------------------- + + MMOOVVIINNGG + + e ^E j ^N CR * Forward one line (or _N lines). + y ^Y k ^K ^P * Backward one line (or _N lines). + ESC-j * Forward one file line (or _N file lines). + ESC-k * Backward one file line (or _N file lines). + f ^F ^V SPACE * Forward one window (or _N lines). + b ^B ESC-v * Backward one window (or _N lines). + z * Forward one window (and set window to _N). + w * Backward one window (and set window to _N). + ESC-SPACE * Forward one window, but don't stop at end-of-file. + ESC-b * Backward one window, but don't stop at beginning-of-file. + d ^D * Forward one half-window (and set half-window to _N). + u ^U * Backward one half-window (and set half-window to _N). + ESC-) RightArrow * Right one half screen width (or _N positions). + ESC-( LeftArrow * Left one half screen width (or _N positions). + ESC-} ^RightArrow Right to last column displayed. + ESC-{ ^LeftArrow Left to first column. + F Forward forever; like "tail -f". + ESC-F Like F but stop when search pattern is found. + r ^R ^L Repaint screen. + R Repaint screen, discarding buffered input. + --------------------------------------------------- + Default "window" is the screen height. + Default "half-window" is half of the screen height. + --------------------------------------------------------------------------- + + SSEEAARRCCHHIINNGG + + /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line. + ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line. + n * Repeat previous search (for _N-th occurrence). + N * Repeat previous search in reverse direction. + ESC-n * Repeat previous search, spanning files. + ESC-N * Repeat previous search, reverse dir. & spanning files. + ^O^N ^On * Search forward for (_N-th) OSC8 hyperlink. + ^O^P ^Op * Search backward for (_N-th) OSC8 hyperlink. + ^O^L ^Ol Jump to the currently selected OSC8 hyperlink. + ESC-u Undo (toggle) search highlighting. + ESC-U Clear search highlighting. + &_p_a_t_t_e_r_n * Display only matching lines. + --------------------------------------------------- + Search is case-sensitive unless changed with -i or -I. + A search pattern may begin with one or more of: + ^N or ! Search for NON-matching lines. + ^E or * Search multiple files (pass thru END OF FILE). + ^F or @ Start search at FIRST file (for /) or last file (for ?). + ^K Highlight matches, but don't move (KEEP position). + ^R Don't use REGULAR EXPRESSIONS. + ^S _n Search for match in _n-th parenthesized subpattern. + ^W WRAP search if no match found. + ^L Enter next character literally into pattern. + --------------------------------------------------------------------------- + + JJUUMMPPIINNGG + + g < ESC-< * Go to first line in file (or line _N). + G > ESC-> * Go to last line in file (or line _N). + p % * Go to beginning of file (or _N percent into file). + t * Go to the (_N-th) next tag. + T * Go to the (_N-th) previous tag. + { ( [ * Find close bracket } ) ]. + } ) ] * Find open bracket { ( [. + ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>. + ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>. + --------------------------------------------------- + Each "find close bracket" command goes forward to the close bracket + matching the (_N-th) open bracket in the top line. + Each "find open bracket" command goes backward to the open bracket + matching the (_N-th) close bracket in the bottom line. + + m_<_l_e_t_t_e_r_> Mark the current top line with . + M_<_l_e_t_t_e_r_> Mark the current bottom line with . + '_<_l_e_t_t_e_r_> Go to a previously marked position. + '' Go to the previous position. + ^X^X Same as '. + ESC-m_<_l_e_t_t_e_r_> Clear a mark. + --------------------------------------------------- + A mark is any upper-case or lower-case letter. + Certain marks are predefined: + ^ means beginning of the file + $ means end of the file + --------------------------------------------------------------------------- + + CCHHAANNGGIINNGG FFIILLEESS + + :e [_f_i_l_e] Examine a new file. + ^X^V Same as :e. + :n * Examine the (_N-th) next file from the command line. + :p * Examine the (_N-th) previous file from the command line. + :x * Examine the first (or _N-th) file from the command line. + ^O^O Open the currently selected OSC8 hyperlink. + :d Delete the current file from the command line list. + = ^G :f Print current file name. + --------------------------------------------------------------------------- + + MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS + + -_<_f_l_a_g_> Toggle a command line option [see OPTIONS below]. + --_<_n_a_m_e_> Toggle a command line option, by name. + __<_f_l_a_g_> Display the setting of a command line option. + ___<_n_a_m_e_> Display the setting of an option, by name. + +_c_m_d Execute the less cmd each time a new file is examined. + + !_c_o_m_m_a_n_d Execute the shell command with $SHELL. + #_c_o_m_m_a_n_d Execute the shell command, expanded like a prompt. + |XX_c_o_m_m_a_n_d Pipe file between current pos & mark XX to shell command. + s _f_i_l_e Save input to a file. + v Edit the current file with $VISUAL or $EDITOR. + V Print version number of "less". + --------------------------------------------------------------------------- + + OOPPTTIIOONNSS + + Most options may be changed either on the command line, + or from within less by using the - or -- command. + Options may be given in one of two forms: either a single + character preceded by a -, or a name preceded by --. + + -? ........ --help + Display help (from command line). + -a ........ --search-skip-screen + Search skips current screen. + -A ........ --SEARCH-SKIP-SCREEN + Search starts just after target line. + -b [_N] .... --buffers=[_N] + Number of buffers. + -B ........ --auto-buffers + Don't automatically allocate buffers for pipes. + -c ........ --clear-screen + Repaint by clearing rather than scrolling. + -d ........ --dumb + Dumb terminal. + -D xx_c_o_l_o_r . --color=xx_c_o_l_o_r + Set screen colors. + -e -E .... --quit-at-eof --QUIT-AT-EOF + Quit at end of file. + -f ........ --force + Force open non-regular files. + -F ........ --quit-if-one-screen + Quit if entire file fits on first screen. + -g ........ --hilite-search + Highlight only last match for searches. + -G ........ --HILITE-SEARCH + Don't highlight any matches for searches. + -h [_N] .... --max-back-scroll=[_N] + Backward scroll limit. + -i ........ --ignore-case + Ignore case in searches that do not contain uppercase. + -I ........ --IGNORE-CASE + Ignore case in all searches. + -j [_N] .... --jump-target=[_N] + Screen position of target lines. + -J ........ --status-column + Display a status column at left edge of screen. + -k _f_i_l_e ... --lesskey-file=_f_i_l_e + Use a compiled lesskey file. + -K ........ --quit-on-intr + Exit less in response to ctrl-C. + -L ........ --no-lessopen + Ignore the LESSOPEN environment variable. + -m -M .... --long-prompt --LONG-PROMPT + Set prompt style. + -n ......... --line-numbers + Suppress line numbers in prompts and messages. + -N ......... --LINE-NUMBERS + Display line number at start of each line. + -o [_f_i_l_e] .. --log-file=[_f_i_l_e] + Copy to log file (standard input only). + -O [_f_i_l_e] .. --LOG-FILE=[_f_i_l_e] + Copy to log file (unconditionally overwrite). + -p _p_a_t_t_e_r_n . --pattern=[_p_a_t_t_e_r_n] + Start at pattern (from command line). + -P [_p_r_o_m_p_t] --prompt=[_p_r_o_m_p_t] + Define new prompt. + -q -Q .... --quiet --QUIET --silent --SILENT + Quiet the terminal bell. + -r -R .... --raw-control-chars --RAW-CONTROL-CHARS + Output "raw" control characters. + -s ........ --squeeze-blank-lines + Squeeze multiple blank lines. + -S ........ --chop-long-lines + Chop (truncate) long lines rather than wrapping. + -t _t_a_g .... --tag=[_t_a_g] + Find a tag. + -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e] + Use an alternate tags file. + -u -U .... --underline-special --UNDERLINE-SPECIAL + Change handling of backspaces, tabs and carriage returns. + -V ........ --version + Display the version number of "less". + -w ........ --hilite-unread + Highlight first new line after forward-screen. + -W ........ --HILITE-UNREAD + Highlight first new line after any forward movement. + -x [_N[,...]] --tabs=[_N[,...]] + Set tab stops. + -X ........ --no-init + Don't use termcap init/deinit strings. + -y [_N] .... --max-forw-scroll=[_N] + Forward scroll limit. + -z [_N] .... --window=[_N] + Set size of window. + -" [_c[_c]] . --quotes=[_c[_c]] + Set shell quote characters. + -~ ........ --tilde + Don't display tildes after end of file. + -# [_N] .... --shift=[_N] + Set horizontal scroll amount (0 = one half screen width). + + --exit-follow-on-close + Exit F command on a pipe when writer closes pipe. + --file-size + Automatically determine the size of the input file. + --follow-name + The F command changes files if the input file is renamed. + --form-feed + Stop scrolling when a form feed character is reached. + --header=[_L[,_C[,_N]]] + Use _L lines (starting at line _N) and _C columns as headers. + --incsearch + Search file as each pattern character is typed in. + --intr=[_C] + Use _C instead of ^X to interrupt a read. + --lesskey-context=_t_e_x_t + Use lesskey source file contents. + --lesskey-src=_f_i_l_e + Use a lesskey source file. + --line-num-width=[_N] + Set the width of the -N line number field to _N characters. + --match-shift=[_N] + Show at least _N characters to the left of a search match. + --modelines=[_N] + Read _N lines from the input file and look for vim modelines. + --mouse + Enable mouse input. + --no-edit-warn + Don't warn when using v command on a file opened via LESSOPEN. + --no-keypad + Don't send termcap keypad init/deinit strings. + --no-histdups + Remove duplicates from command history. + --no-number-headers + Don't give line numbers to header lines. + --no-paste + Ignore pasted input. + --no-search-header-lines + Searches do not include header lines. + --no-search-header-columns + Searches do not include header columns. + --no-search-headers + Searches do not include header lines or columns. + --no-vbell + Disable the terminal's visual bell. + --redraw-on-quit + Redraw final screen when quitting. + --rscroll=[_C] + Set the character used to mark truncated lines. + --save-marks + Retain marks across invocations of less. + --search-options=[EFKNRW-] + Set default options for every search. + --show-preproc-errors + Display a message if preprocessor exits with an error status. + --proc-backspace + Process backspaces for bold/underline. + --PROC-BACKSPACE + Treat backspaces as control characters. + --proc-return + Delete carriage returns before newline. + --PROC-RETURN + Treat carriage returns as control characters. + --proc-tab + Expand tabs to spaces. + --PROC-TAB + Treat tabs as control characters. + --status-col-width=[_N] + Set the width of the -J status column to _N characters. + --status-line + Highlight or color the entire line containing a mark. + --use-backslash + Subsequent options use backslash as escape char. + --use-color + Enables colored text. + --wheel-lines=[_N] + Each click of the mouse wheel moves _N lines. + --wordwrap + Wrap lines at spaces. + + + --------------------------------------------------------------------------- + + LLIINNEE EEDDIITTIINNGG + + These keys can be used to edit text being entered + on the "command line" at the bottom of the screen. + + RightArrow ..................... ESC-l ... Move cursor right one character. + LeftArrow ...................... ESC-h ... Move cursor left one character. + ctrl-RightArrow ESC-RightArrow ESC-w ... Move cursor right one word. + ctrl-LeftArrow ESC-LeftArrow ESC-b ... Move cursor left one word. + HOME ........................... ESC-0 ... Move cursor to start of line. + END ............................ ESC-$ ... Move cursor to end of line. + BACKSPACE ................................ Delete char to left of cursor. + DELETE ......................... ESC-x ... Delete char under cursor. + ctrl-BACKSPACE ESC-BACKSPACE ........... Delete word to left of cursor. + ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor. + ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line. + UpArrow ........................ ESC-k ... Retrieve previous command line. + DownArrow ...................... ESC-j ... Retrieve next command line. + TAB ...................................... Complete filename & cycle. + SHIFT-TAB ...................... ESC-TAB Complete filename & reverse cycle. + ctrl-L ................................... Complete filename, list all. diff --git a/settings.json b/settings.json index 7c5e794..fafad32 100644 --- a/settings.json +++ b/settings.json @@ -2,8 +2,8 @@ "general": { "scan_limit": 60, "max_range": 100, - "geometry": "1409x1110+159+173", - "last_selected_scenario": "corto", + "geometry": "1492x992+71+262", + "last_selected_scenario": "scenario_dritto", "connection": { "target": { "type": "sfp", diff --git a/target_simulator.bundle b/target_simulator.bundle new file mode 100644 index 0000000..bb0b7db Binary files /dev/null and b/target_simulator.bundle differ diff --git a/target_simulator/_version.py b/target_simulator/_version.py index d7ab5e9..83a336b 100644 --- a/target_simulator/_version.py +++ b/target_simulator/_version.py @@ -6,10 +6,10 @@ import re # --- Version Data (Generated) --- -__version__ = "v.0.0.0.68-0-g6c4b064" -GIT_COMMIT_HASH = "6c4b064cf69a41658f7dbc60cadf6a638c1e8f26" +__version__ = "v.0.0.0.85-0-ga1a0266-dirty" +GIT_COMMIT_HASH = "a1a0266851620d788ac355e9093d303f93b70775" GIT_BRANCH = "master" -BUILD_TIMESTAMP = "2025-11-03T12:15:17.423483+00:00" +BUILD_TIMESTAMP = "2025-11-12T07:32:41.986440+00:00" IS_GIT_REPO = True # --- Default Values (for comparison or fallback) --- @@ -17,7 +17,6 @@ DEFAULT_VERSION = "0.0.0+unknown" DEFAULT_COMMIT = "Unknown" DEFAULT_BRANCH = "Unknown" - # --- Helper Function --- def get_version_string(format_string=None): """ @@ -45,39 +44,29 @@ def get_version_string(format_string=None): replacements = {} try: - replacements["version"] = __version__ if __version__ else DEFAULT_VERSION - replacements["commit"] = GIT_COMMIT_HASH if GIT_COMMIT_HASH else DEFAULT_COMMIT - replacements["commit_short"] = ( - GIT_COMMIT_HASH[:7] - if GIT_COMMIT_HASH and len(GIT_COMMIT_HASH) >= 7 - else DEFAULT_COMMIT - ) - replacements["branch"] = GIT_BRANCH if GIT_BRANCH else DEFAULT_BRANCH - replacements["timestamp"] = BUILD_TIMESTAMP if BUILD_TIMESTAMP else "Unknown" - replacements["timestamp_short"] = ( - BUILD_TIMESTAMP.split("T")[0] - if BUILD_TIMESTAMP and "T" in BUILD_TIMESTAMP - else "Unknown" - ) - replacements["is_git"] = "Git" if IS_GIT_REPO else "Unknown" - replacements["dirty"] = ( - "-dirty" if __version__ and __version__.endswith("-dirty") else "" - ) + replacements['version'] = __version__ if __version__ else DEFAULT_VERSION + replacements['commit'] = GIT_COMMIT_HASH if GIT_COMMIT_HASH else DEFAULT_COMMIT + replacements['commit_short'] = GIT_COMMIT_HASH[:7] if GIT_COMMIT_HASH and len(GIT_COMMIT_HASH) >= 7 else DEFAULT_COMMIT + replacements['branch'] = GIT_BRANCH if GIT_BRANCH else DEFAULT_BRANCH + replacements['timestamp'] = BUILD_TIMESTAMP if BUILD_TIMESTAMP else "Unknown" + replacements['timestamp_short'] = BUILD_TIMESTAMP.split('T')[0] if BUILD_TIMESTAMP and 'T' in BUILD_TIMESTAMP else "Unknown" + replacements['is_git'] = "Git" if IS_GIT_REPO else "Unknown" + replacements['dirty'] = "-dirty" if __version__ and __version__.endswith('-dirty') else "" tag = DEFAULT_VERSION if __version__ and IS_GIT_REPO: - match = re.match(r"^(v?([0-9]+(?:\.[0-9]+)*))", __version__) + match = re.match(r'^(v?([0-9]+(?:\.[0-9]+)*))', __version__) if match: tag = match.group(1) - replacements["tag"] = tag + replacements['tag'] = tag output_string = format_string for placeholder, value in replacements.items(): - pattern = re.compile(r"{{\s*" + re.escape(placeholder) + r"\s*}}") - output_string = pattern.sub(str(value), output_string) + pattern = re.compile(r'{{\s*' + re.escape(placeholder) + r'\s*}}') + output_string = pattern.sub(str(value), output_string) - if re.search(r"{\s*\w+\s*}", output_string): - pass # Or log a warning: print(f"Warning: Unreplaced placeholders found: {output_string}") + if re.search(r'{\s*\w+\s*}', output_string): + pass # Or log a warning: print(f"Warning: Unreplaced placeholders found: {output_string}") return output_string diff --git a/todo.md b/todo.md index 350c844..55fc06a 100644 --- a/todo.md +++ b/todo.md @@ -20,6 +20,11 @@ - [x] Aggiungere un tasto per duplicare uno scenario da uno già presente e dargli un nome diverso - [ ] aggiungere una funzione automatica durante il salvataggio dello scenario che cancelli quelli più vecchi di 10 salvataggi fa, per evitare che aumentino in numero senza controllo +- [ ] Aggiungere comunicazione con simulatore mathlab. Invece di mandare informazioni al server devo salvare in locale in una cartella un file csv con dentro le informazioni dei target da simulare. +_.csv + + + # FIXME List