1 #include "builtin.h"
2 #include "function.h"
3 #include "module.h"
4 #include "expression.h"
5
6 std::unordered_map<std::string, const std::vector<std::string>> Builtins::keywordList;
7
instance(bool erase)8 Builtins *Builtins::instance(bool erase)
9 {
10 static Builtins *builtins = new Builtins;
11 if (erase) {
12 delete builtins;
13 builtins = nullptr;
14 }
15 return builtins;
16 }
17
init(const std::string & name,class AbstractModule * module)18 void Builtins::init(const std::string &name, class AbstractModule *module)
19 {
20 #ifndef ENABLE_EXPERIMENTAL
21 if (module->is_experimental()) return;
22 #endif
23 Builtins::instance()->modules.emplace(name, module);
24 }
25
init(const std::string & name,class AbstractModule * module,const std::vector<std::string> & calltipList)26 void Builtins::init(const std::string &name, class AbstractModule *module, const std::vector<std::string> &calltipList)
27 {
28 #ifndef ENABLE_EXPERIMENTAL
29 if (module->is_experimental()) return;
30 #endif
31 Builtins::instance()->modules.emplace(name, module);
32 Builtins::keywordList.insert({name, calltipList});
33 }
34
init(const std::string & name,class AbstractFunction * function,const std::vector<std::string> & calltipList)35 void Builtins::init(const std::string &name, class AbstractFunction *function, const std::vector<std::string> &calltipList)
36 {
37 #ifndef ENABLE_EXPERIMENTAL
38 if (function->is_experimental()) return;
39 #endif
40 Builtins::instance()->functions.emplace(name, function);
41 Builtins::keywordList.insert({name, calltipList});
42 }
43
44 extern void register_builtin_functions();
45 extern void register_builtin_group();
46 extern void register_builtin_csgops();
47 extern void register_builtin_transform();
48 extern void register_builtin_color();
49 extern void register_builtin_primitives();
50 extern void register_builtin_surface();
51 extern void register_builtin_control();
52 extern void register_builtin_render();
53 extern void register_builtin_import();
54 extern void register_builtin_projection();
55 extern void register_builtin_cgaladv();
56 extern void register_builtin_offset();
57 extern void register_builtin_dxf_linear_extrude();
58 extern void register_builtin_dxf_rotate_extrude();
59 extern void register_builtin_text();
60 extern void initialize_builtin_dxf_dim();
61
62 /*!
63 Registers all builtin functions.
64 Call once for the whole app.
65 */
initialize()66 void Builtins::initialize()
67 {
68 Builtins::initKeywordList();
69
70 register_builtin_functions();
71 initialize_builtin_dxf_dim();
72
73 register_builtin_group();
74 register_builtin_csgops();
75 register_builtin_transform();
76 register_builtin_color();
77 register_builtin_primitives();
78 register_builtin_surface();
79 register_builtin_control();
80 register_builtin_render();
81 register_builtin_import();
82 register_builtin_projection();
83 register_builtin_cgaladv();
84 register_builtin_offset();
85 register_builtin_dxf_linear_extrude();
86 register_builtin_dxf_rotate_extrude();
87 register_builtin_text();
88
89 this->deprecations.emplace("dxf_linear_extrude", "linear_extrude()");
90 this->deprecations.emplace("dxf_rotate_extrude", "rotate_extrude()");
91 this->deprecations.emplace("import_stl", "import()");
92 this->deprecations.emplace("import_dxf", "import()");
93 this->deprecations.emplace("import_off", "import()");
94 this->deprecations.emplace("assign", "a regular assignment");
95 }
96
isDeprecated(const std::string & name) const97 std::string Builtins::isDeprecated(const std::string &name) const
98 {
99 if (this->deprecations.find(name) != this->deprecations.end()) {
100 return this->deprecations.at(name);
101 }
102 return {};
103 }
104
Builtins()105 Builtins::Builtins()
106 {
107 this->assignments.emplace_back(new Assignment("$fn", make_shared<Literal>(0.0)) );
108 this->assignments.emplace_back(new Assignment("$fs", make_shared<Literal>(2.0)) );
109 this->assignments.emplace_back(new Assignment("$fa", make_shared<Literal>(12.0)) );
110 this->assignments.emplace_back(new Assignment("$t", make_shared<Literal>(0.0)) );
111 this->assignments.emplace_back(new Assignment("$preview", make_shared<Literal>(Value::undefined.clone())) ); //undef as should always be overwritten.
112 this->assignments.emplace_back(new Assignment("$vpt", make_shared<Literal>(VectorType(0.0, 0.0, 0.0))) );
113 this->assignments.emplace_back(new Assignment("$vpr", make_shared<Literal>(VectorType(0.0, 0.0, 0.0))) );
114 this->assignments.emplace_back(new Assignment("$vpd", make_shared<Literal>(500)) );
115 this->assignments.emplace_back(new Assignment("$vpf", make_shared<Literal>(22.5)) );
116 }
117
initKeywordList()118 void Builtins::initKeywordList()
119 {
120 Builtins::keywordList.insert({"else", {}});
121 Builtins::keywordList.insert({"each", {}});
122 Builtins::keywordList.insert({"module", {}});
123 Builtins::keywordList.insert({"function", {}});
124 Builtins::keywordList.insert({"true", {}});
125 Builtins::keywordList.insert({"false", {}});
126 Builtins::keywordList.insert({"undef", {}});
127 Builtins::keywordList.insert({"use", {}});
128 Builtins::keywordList.insert({"include", {}});
129 }
130