mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-16 21:42:43 +00:00
fix: resolve relative input paths given on the command line (#14803)
Opening a model with a relative path, for example `orca-slicer ./some.3mf`, failed with "Loading of a model file failed." and "The file does not contain any geometry data.", while the same file opened by an absolute path or by drag and drop worked. GUI_App::init_app_config() changes the working directory to <data_dir>/log, and it runs from the GUI_App constructor because the app config is needed early for instance checking. The input files are opened much later, in post_init(), so a path still relative at that point resolved against the log directory instead of the directory OrcaSlicer was started from, and the 3MF reader failed to open it. Resolve the input paths in CLI::setup(), which runs before GUI_App is constructed and therefore before the working directory moves. Absolute paths are returned unchanged, so the forms that open today are unaffected, and custom open protocol URLs are passed through since post_init() hands those to the downloader rather than the file loader. The working directory change is left alone. It was added in #3248 so the TUTK logs land in the data directory instead of the working directory (#3209).
This commit is contained in:
@@ -314,6 +314,9 @@ extern unsigned get_current_pid();
|
||||
std::string per_user_temp_id();
|
||||
// Per-user temp root under `base`; an empty `user_id` returns `base` unchanged.
|
||||
std::string per_user_temp_dir(const std::string &base, const std::string &user_id);
|
||||
// Completes a relative command line input path against the current working directory. Absolute
|
||||
// paths and custom open protocol URLs are returned unchanged.
|
||||
std::string resolve_cli_input_path(const std::string &path);
|
||||
// BBS: backup & restore
|
||||
std::string get_process_name(int pid);
|
||||
|
||||
|
||||
@@ -1339,6 +1339,19 @@ std::string per_user_temp_dir(const std::string &base, const std::string &user_i
|
||||
return base + "/orcaslicer_" + user_id;
|
||||
}
|
||||
|
||||
std::string resolve_cli_input_path(const std::string &path)
|
||||
{
|
||||
const boost::filesystem::path input(path);
|
||||
if (path.empty() || is_supported_open_protocol(path) || input.is_absolute())
|
||||
return path;
|
||||
|
||||
boost::system::error_code ec;
|
||||
const boost::filesystem::path resolved = boost::filesystem::system_complete(input, ec);
|
||||
if (ec)
|
||||
return path;
|
||||
return resolved.lexically_normal().make_preferred().string();
|
||||
}
|
||||
|
||||
// BBS: backup & restore
|
||||
std::string get_process_name(int pid)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user