diff --git a/mainwin.cc b/mainwin.cc index fcf70988..c6f2f1f6 100644 --- a/mainwin.cc +++ b/mainwin.cc @@ -411,7 +411,7 @@ void MainWindow::compile(bool procevents) root_ctx.set_variable("$vpr", vpr); last_compiled_doc = editor->toPlainText(); - root_module = parse(last_compiled_doc.toAscii().data(), false); + root_module = parse((last_compiled_doc + commandline_commands).toAscii().data(), false); delete highlighter; highlighter = new Highlighter(editor->document()); diff --git a/openscad.cc b/openscad.cc index fc9efc89..571ead5c 100644 --- a/openscad.cc +++ b/openscad.cc @@ -30,11 +30,13 @@ static void help(const char *progname) { - fprintf(stderr, "Usage: %s [ -m make_command ] [ filename ]\n", progname); - fprintf(stderr, " %s { -s stl_file | -o off_file } [ -d deps_file ] [ -m make_command ] filename\n", progname); + fprintf(stderr, "Usage: %s [ { -s stl_file | -o off_file } [ -d deps_file ] ]\\\n" + "%*s[ -m make_command ] [ -D var=val [..] ] filename\n", + progname, strlen(progname)+8, ""); exit(1); } +QString commandline_commands; const char *make_command = NULL; QSet dependencies; @@ -80,7 +82,7 @@ int main(int argc, char **argv) int opt; - while ((opt = getopt(argc, argv, "s:o:d:m:")) != -1) + while ((opt = getopt(argc, argv, "s:o:d:m:D:")) != -1) { switch (opt) { @@ -104,6 +106,9 @@ int main(int argc, char **argv) help(argv[0]); make_command = optarg; break; + case 'D': + commandline_commands += QString(optarg) + QString(";\n"); + break; default: help(argv[0]); } diff --git a/openscad.h b/openscad.h index 17a22a12..e34c4911 100644 --- a/openscad.h +++ b/openscad.h @@ -828,6 +828,7 @@ public slots: extern AbstractModule *parse(const char *text, int debug); extern int get_fragments_from_r(double r, double fn, double fs, double fa); +extern QString commandline_commands; extern int parser_error_pos; extern QPointer current_win; diff --git a/parser.y b/parser.y index 8578fdd0..7d742093 100644 --- a/parser.y +++ b/parser.y @@ -112,9 +112,19 @@ statement: } } | TOK_ID '=' expr ';' { - module->assignments_var.append($1); - module->assignments_expr.append($3); - free($1); + bool add_new_assignment = true; + for (int i = 0; i < module->assignments_var.size(); i++) { + if (module->assignments_var[i] != QString($1)) + continue; + delete module->assignments_expr[i]; + module->assignments_expr[i] = $3; + add_new_assignment = false; + } + if (add_new_assignment) { + module->assignments_var.append($1); + module->assignments_expr.append($3); + free($1); + } } | TOK_MODULE TOK_ID '(' arguments_decl optional_commas ')' { Module *p = module;