mirror of https://github.com/vitalif/openscad
Clifford Wolf:
Fixed scalar subtraction Fixed handling of -/+ scalar prefix Fixed vector handling [0 1 2] doesn't work anymore now git-svn-id: http://svn.clifford.at/openscad/trunk@109 b57f626f-c46c-0410-a088-ec61d464b74cstl_dim
parent
7c99871720
commit
05b2eb1b90
|
@ -4,14 +4,15 @@ module example001()
|
|||
function r_from_dia(d) = d / 2;
|
||||
|
||||
module rotcy(rot, r, h) {
|
||||
rotate(90, rot) cylinder(r = r, h = h, center = true);
|
||||
rotate(90, rot)
|
||||
cylinder(r = r, h = h, center = true);
|
||||
}
|
||||
|
||||
difference() {
|
||||
sphere(r = r_from_dia(size));
|
||||
rotcy([0 0 0], cy_r, cy_h);
|
||||
rotcy([1 0 0], cy_r, cy_h);
|
||||
rotcy([ 0 1 0], cy_r, cy_h);
|
||||
rotcy([0, 0, 0], cy_r, cy_h);
|
||||
rotcy([1, 0, 0], cy_r, cy_h);
|
||||
rotcy([0, 1, 0], cy_r, cy_h);
|
||||
}
|
||||
|
||||
size = 50;
|
||||
|
|
|
@ -4,17 +4,17 @@ module example002()
|
|||
intersection() {
|
||||
difference() {
|
||||
union() {
|
||||
cube([30 30 30], center = true);
|
||||
translate([0 0 -25])
|
||||
cube([15 15 50], center = true);
|
||||
cube([30, 30, 30], center = true);
|
||||
translate([0, 0, -25])
|
||||
cube([15, 15, 50], center = true);
|
||||
}
|
||||
union() {
|
||||
cube([50 10 10], center = true);
|
||||
cube([10 50 10], center = true);
|
||||
cube([10 10 50], center = true);
|
||||
cube([50, 10, 10], center = true);
|
||||
cube([10, 50, 10], center = true);
|
||||
cube([10, 10, 50], center = true);
|
||||
}
|
||||
}
|
||||
translate([0 0 5])
|
||||
translate([0, 0, 5])
|
||||
cylinder(h = 50, r1 = 20, r2 = 5, center = true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,15 +3,15 @@ module example003()
|
|||
{
|
||||
difference() {
|
||||
union() {
|
||||
cube([30 30 30], center = true);
|
||||
cube([40 15 15], center = true);
|
||||
cube([15 40 15], center = true);
|
||||
cube([15 15 40], center = true);
|
||||
cube([30, 30, 30], center = true);
|
||||
cube([40, 15, 15], center = true);
|
||||
cube([15, 40, 15], center = true);
|
||||
cube([15, 15, 40], center = true);
|
||||
}
|
||||
union() {
|
||||
cube([50 10 10], center = true);
|
||||
cube([10 50 10], center = true);
|
||||
cube([10 10 50], center = true);
|
||||
cube([50, 10, 10], center = true);
|
||||
cube([10, 50, 10], center = true);
|
||||
cube([10, 10, 50], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,21 +1,20 @@
|
|||
|
||||
module example005()
|
||||
{
|
||||
translate([0 0 -120]) {
|
||||
translate([0, 0, -120]) {
|
||||
difference() {
|
||||
cylinder(h = 50, r = 100);
|
||||
translate([0 0 10]) cylinder(h = 50, r = 80);
|
||||
translate([100 0 35]) cube(50, center = true);
|
||||
translate([0, 0, 10]) cylinder(h = 50, r = 80);
|
||||
translate([100, 0, 35]) cube(50, center = true);
|
||||
}
|
||||
for (i = [0:5]) {
|
||||
echo(360*i/6, sin(360*i/6)*80, cos(360*i/6)*80);
|
||||
translate([sin(360*i/6)*80, cos(360*i/6)*80, 0 ])
|
||||
cylinder(h = 200, r=10);
|
||||
}
|
||||
translate([0 0 200])
|
||||
translate([0, 0, 200])
|
||||
cylinder(h = 80, r1 = 120, r2 = 0);
|
||||
}
|
||||
}
|
||||
|
||||
example005();
|
||||
|
||||
|
|
|
@ -4,12 +4,12 @@ module example006()
|
|||
module edgeprofile()
|
||||
{
|
||||
render(convexity = 2) difference() {
|
||||
cube([20 20 150], center = true);
|
||||
translate([-10 -10 0])
|
||||
cube([20, 20, 150], center = true);
|
||||
translate([-10, -10, 0])
|
||||
cylinder(h = 80, r = 10, center = true);
|
||||
translate([-10 -10 +40])
|
||||
translate([-10, -10, +40])
|
||||
sphere(r = 10);
|
||||
translate([-10 -10 -40])
|
||||
translate([-10, -10, -40])
|
||||
sphere(r = 10);
|
||||
}
|
||||
}
|
||||
|
@ -17,23 +17,23 @@ module example006()
|
|||
difference()
|
||||
{
|
||||
cube(100, center = true);
|
||||
for (rot = [ [0 0 0], [1 0 0], [0 1 0] ]) {
|
||||
for (rot = [ [0, 0, 0], [1, 0, 0], [0, 1, 0] ]) {
|
||||
rotate(90, rot)
|
||||
for (p = [[+1 +1 0], [-1 +1 90], [-1 -1 180], [+1 -1 270]]) {
|
||||
for (p = [[+1, +1, 0], [-1, +1, 90], [-1, -1, 180], [+1, -1, 270]]) {
|
||||
translate([ p[0]*50, p[1]*50, 0 ])
|
||||
rotate(p[2], [0 0 1])
|
||||
rotate(p[2], [0, 0, 1])
|
||||
edgeprofile();
|
||||
}
|
||||
}
|
||||
for (i = [
|
||||
[ 0, 0, [ [0 0] ] ],
|
||||
[ 90, 0, [ [-20 -20], [+20 +20] ] ],
|
||||
[ 180, 0, [ [-20 -25], [-20 0], [-20 +25], [+20 -25], [+20 0], [+20 +25] ] ],
|
||||
[ 270, 0, [ [0 0], [-25 -25], [+25 -25], [-25 +25], [+25 +25] ] ],
|
||||
[ 0, 90, [ [-25 -25], [0 0], [+25 +25] ] ],
|
||||
[ 0, -90, [ [-25 -25], [+25 -25], [-25 +25], [+25 +25] ] ]
|
||||
[ 0, 0, [ [0, 0] ] ],
|
||||
[ 90, 0, [ [-20, -20], [+20, +20] ] ],
|
||||
[ 180, 0, [ [-20, -25], [-20, 0], [-20, +25], [+20, -25], [+20, 0], [+20, +25] ] ],
|
||||
[ 270, 0, [ [0, 0], [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ],
|
||||
[ 0, 90, [ [-25, -25], [0, 0], [+25, +25] ] ],
|
||||
[ 0, -90, [ [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ]
|
||||
]) {
|
||||
rotate(i[0], [0 0 1]) rotate(i[1], [1 0 0]) translate([0 -50 0])
|
||||
rotate(i[0], [0, 0, 1]) rotate(i[1], [1, 0, 0]) translate([0, -50, 0])
|
||||
for (j = i[2])
|
||||
translate([j[0], 0, j[1]]) sphere(10);
|
||||
}
|
||||
|
|
|
@ -3,17 +3,17 @@ module cutout()
|
|||
{
|
||||
intersection()
|
||||
{
|
||||
rotate(90, [1 0 0])
|
||||
translate([0 0 -50])
|
||||
rotate(90, [1, 0, 0])
|
||||
translate([0, 0, -50])
|
||||
dxf_linear_extrude(
|
||||
file = "example007.dxf",
|
||||
layer = "cutout1",
|
||||
height = 100,
|
||||
convexity = 1);
|
||||
|
||||
rotate(90, [0 0 1])
|
||||
rotate(90, [1 0 0])
|
||||
translate([0 0 -50])
|
||||
rotate(90, [0, 0, 1])
|
||||
rotate(90, [1, 0, 0])
|
||||
translate([0, 0, -50])
|
||||
dxf_linear_extrude(
|
||||
file = "example007.dxf",
|
||||
layer = "cutout2",
|
||||
|
@ -29,8 +29,8 @@ module clip()
|
|||
file = "example007.dxf",
|
||||
layer="dorn",
|
||||
convexity = 3);
|
||||
for (r = [0 90])
|
||||
rotate(r, [0 0 1])
|
||||
for (r = [0, 90])
|
||||
rotate(r, [0, 0, 1])
|
||||
cutout();
|
||||
}
|
||||
}
|
||||
|
@ -41,29 +41,29 @@ module cutview()
|
|||
{
|
||||
difference()
|
||||
{
|
||||
translate([0 0 -10])
|
||||
translate([0, 0, -10])
|
||||
clip();
|
||||
|
||||
rotate(20, [0 0 1])
|
||||
rotate(-20, [0 1 0])
|
||||
translate([18 0 0])
|
||||
rotate(20, [0, 0, 1])
|
||||
rotate(-20, [0, 1, 0])
|
||||
translate([18, 0, 0])
|
||||
cube(30, center = true);
|
||||
}
|
||||
|
||||
# render(convexity = 5) intersection()
|
||||
{
|
||||
translate([0 0 -10])
|
||||
translate([0, 0, -10])
|
||||
clip();
|
||||
|
||||
rotate(20, [0 0 1])
|
||||
rotate(-20, [0 1 0])
|
||||
translate([18 0 0])
|
||||
rotate(20, [0, 0, 1])
|
||||
rotate(-20, [0, 1, 0])
|
||||
translate([18, 0, 0])
|
||||
cube(30, center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
translate([0 0 -10])
|
||||
translate([0, 0, -10])
|
||||
clip();
|
||||
|
||||
// cutview();
|
||||
|
|
|
@ -3,29 +3,29 @@ difference()
|
|||
{
|
||||
intersection()
|
||||
{
|
||||
translate([ -25 -25 -25])
|
||||
translate([ -25, -25, -25])
|
||||
dxf_linear_extrude(file = "example008.dxf",
|
||||
layer = "G", height = 50, convexity = 3);
|
||||
|
||||
rotate(90, [1 0 0])
|
||||
translate([ -25 -125 -25])
|
||||
rotate(90, [1, 0, 0])
|
||||
translate([ -25, -125, -25])
|
||||
dxf_linear_extrude(file = "example008.dxf",
|
||||
layer = "E", height = 50, convexity = 3);
|
||||
|
||||
rotate(90, [0 1 0])
|
||||
translate([ -125 -125 -25])
|
||||
rotate(90, [0, 1, 0])
|
||||
translate([ -125, -125, -25])
|
||||
dxf_linear_extrude(file = "example008.dxf",
|
||||
layer = "B", height = 50, convexity = 3);
|
||||
}
|
||||
|
||||
intersection()
|
||||
{
|
||||
translate([ -125 -25 -25])
|
||||
translate([ -125, -25, -25])
|
||||
dxf_linear_extrude(file = "example008.dxf",
|
||||
layer = "X", height = 50, convexity = 1);
|
||||
|
||||
rotate(90, [0 1 0])
|
||||
translate([ -125 -25 -25])
|
||||
rotate(90, [0, 1, 0])
|
||||
translate([ -125, -25, -25])
|
||||
dxf_linear_extrude(file = "example008.dxf",
|
||||
layer = "X", height = 50, convexity = 1);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ intersection()
|
|||
surface(file = "example010.dat",
|
||||
center = true, convexity = 5);
|
||||
|
||||
rotate(45, [0 0 1])
|
||||
rotate(45, [0, 0, 1])
|
||||
surface(file = "example010.dat",
|
||||
center = true, convexity = 5);
|
||||
}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
polyeder(
|
||||
points = [
|
||||
[10 0 0],
|
||||
[ 0 10 0],
|
||||
[ -10 0 0],
|
||||
[ 0 -10 0],
|
||||
[ 0 0 10]
|
||||
[10, 0, 0],
|
||||
[0, 10, 0],
|
||||
[-10, 0, 0],
|
||||
[0, -10, 0],
|
||||
[0, 0, 10]
|
||||
],
|
||||
triangles = [
|
||||
[0 1 2 3],
|
||||
[4 1 0],
|
||||
[4 2 1],
|
||||
[4 3 2],
|
||||
[4 0 3]
|
||||
[0, 1, 2, 3],
|
||||
[4, 1, 0],
|
||||
[4, 2, 1],
|
||||
[4, 3, 2],
|
||||
[4, 0, 3]
|
||||
]
|
||||
);
|
||||
|
|
|
@ -7,6 +7,6 @@ difference()
|
|||
{
|
||||
sphere(20);
|
||||
|
||||
translate([ -2.92 0.5 +20 ]) rotate([180 0 180])
|
||||
translate([ -2.92, 0.5, +20 ]) rotate([180, 0, 180])
|
||||
import_stl("example012.stl", convexity = 5);
|
||||
}
|
||||
|
|
3
lexer.l
3
lexer.l
|
@ -42,6 +42,7 @@ extern const char *parser_input_buffer;
|
|||
if (*parser_input_buffer) { \
|
||||
result = 1; \
|
||||
buf[0] = *(parser_input_buffer++); \
|
||||
parser_error_pos++; \
|
||||
} else { \
|
||||
result = YY_NULL; \
|
||||
} \
|
||||
|
@ -86,7 +87,7 @@ extern const char *parser_input_buffer;
|
|||
"false" return TOK_FALSE;
|
||||
"undef" return TOK_UNDEF;
|
||||
|
||||
[+-]?[0-9][0-9.]* { parserlval.number = atof(yytext); return TOK_NUMBER; }
|
||||
[0-9][0-9.]* { parserlval.number = atof(yytext); return TOK_NUMBER; }
|
||||
"$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; }
|
||||
|
||||
\"[^"]*\" {
|
||||
|
|
10
mainwin.cc
10
mainwin.cc
|
@ -354,8 +354,12 @@ void MainWindow::compile(bool procevents)
|
|||
root_ctx.set_variable("$t", Value(e_tval->text().toDouble()));
|
||||
root_module = parse(editor->toPlainText().toAscii().data(), false);
|
||||
|
||||
if (!root_module)
|
||||
if (!root_module) {
|
||||
QTextCursor cursor = editor->textCursor();
|
||||
cursor.setPosition(parser_error_pos);
|
||||
editor->setTextCursor(cursor);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
PRINT("Compiling design (CSG Tree generation)...");
|
||||
if (procevents)
|
||||
|
@ -608,7 +612,7 @@ void MainWindow::pasteViewportTranslation()
|
|||
{
|
||||
QTextCursor cursor = editor->textCursor();
|
||||
QString txt;
|
||||
txt.sprintf("[ %.2f %.2f %.2f ]", -screen->object_trans_x, -screen->object_trans_y, -screen->object_trans_z);
|
||||
txt.sprintf("[ %.2f, %.2f, %.2f ]", -screen->object_trans_x, -screen->object_trans_y, -screen->object_trans_z);
|
||||
cursor.insertText(txt);
|
||||
}
|
||||
|
||||
|
@ -616,7 +620,7 @@ void MainWindow::pasteViewportRotation()
|
|||
{
|
||||
QTextCursor cursor = editor->textCursor();
|
||||
QString txt;
|
||||
txt.sprintf("[ %.2f %.2f %.2f ]",
|
||||
txt.sprintf("[ %.2f, %.2f, %.2f ]",
|
||||
fmodf(360 - screen->object_rot_x + 90, 360), fmodf(360 - screen->object_rot_y, 360), fmodf(360 - screen->object_rot_z, 360));
|
||||
cursor.insertText(txt);
|
||||
}
|
||||
|
|
|
@ -800,6 +800,7 @@ private slots:
|
|||
extern AbstractModule *parse(const char *text, int debug);
|
||||
extern int get_fragments_from_r(double r, double fn, double fs, double fa);
|
||||
|
||||
extern int parser_error_pos;
|
||||
extern QPointer<MainWindow> current_win;
|
||||
|
||||
#ifdef ENABLE_CGAL
|
||||
|
|
24
parser.y
24
parser.y
|
@ -22,6 +22,8 @@
|
|||
|
||||
#include "openscad.h"
|
||||
|
||||
int parser_error_pos = -1;
|
||||
|
||||
int parserlex(void);
|
||||
void yyerror(char const *s);
|
||||
|
||||
|
@ -79,7 +81,6 @@ public:
|
|||
%right '?' ':'
|
||||
|
||||
%type <expr> expr
|
||||
%type <value> vector_const
|
||||
%type <expr> vector_expr
|
||||
|
||||
%type <inst> module_instantciation
|
||||
|
@ -275,11 +276,6 @@ expr:
|
|||
$$->const_value = new Value();
|
||||
$$->const_value->type = Value::VECTOR;
|
||||
} |
|
||||
'[' vector_const ']' {
|
||||
$$ = new Expression();
|
||||
$$->type = "C";
|
||||
$$->const_value = $2;
|
||||
} |
|
||||
'[' vector_expr ']' {
|
||||
$$ = $2;
|
||||
} |
|
||||
|
@ -400,18 +396,6 @@ expr:
|
|||
delete $3;
|
||||
} ;
|
||||
|
||||
vector_const:
|
||||
TOK_NUMBER TOK_NUMBER {
|
||||
$$ = new Value();
|
||||
$$->type = Value::VECTOR;
|
||||
$$->vec.append(new Value($1));
|
||||
$$->vec.append(new Value($2));
|
||||
} |
|
||||
vector_const TOK_NUMBER {
|
||||
$$ = $1;
|
||||
$$->vec.append(new Value($2));
|
||||
} ;
|
||||
|
||||
vector_expr:
|
||||
expr {
|
||||
$$ = new Expression();
|
||||
|
@ -504,6 +488,7 @@ const char *parser_input_buffer;
|
|||
AbstractModule *parse(const char *text, int debug)
|
||||
{
|
||||
lexerin = NULL;
|
||||
parser_error_pos = -1;
|
||||
parser_input_buffer = text;
|
||||
|
||||
module_stack.clear();
|
||||
|
@ -514,6 +499,9 @@ AbstractModule *parse(const char *text, int debug)
|
|||
|
||||
lexerlex_destroy();
|
||||
|
||||
if (module)
|
||||
parser_error_pos = -1;
|
||||
|
||||
return module;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue