1
0
mirror of git://projects.qi-hardware.com/cae-tools.git synced 2025-01-03 22:40:15 +02:00

cameo: added "rotate" command

- lang.l, lang.y (rotate): added command "rotate", with cumulative
  rotation
- README: documented "rotate"
- README: corrected typo in description of the translation commands
This commit is contained in:
Werner Almesberger 2011-01-03 01:25:42 -03:00
parent 45ee739c3b
commit 6f30bab648
3 changed files with 46 additions and 5 deletions

View File

@ -88,6 +88,7 @@ Horizontal adjustments:
align <ref> <x0> <y0> <x1> <y1>
array <x-step> <y-step> <x-index> <y-index>
translate <x> <y>
rotate <angle>
reset
"translate" shifts the currently loaded paths by the specified distance.
@ -110,12 +111,19 @@ The reference point is specified with a number as follows:
two arguments define the step between pieces while the second two
arguments define how many steps in each direction are taken.
"align" sets moves the toolpath to an absolute position while "array" and
"align" moves the toolpath to an absolute position while "array" and
"translate" move relative to the current position. The total translation
is remembered also across "clean", so that an alignment can be applied to
multiple toolpaths.
"reset" sets the translation to zero. The way "reset" is currently
"rotate" rotates the currenly loaded paths by the specified number of
degrees in a counter-clockwise direction. Like translations, rotations
are accumulated and are automatically applied to files loaded later.
Note that rotation is applied before translation. Therefore, using
"rotate" after "translate", "array", or "align" may yield unexpected
results.
"reset" sets translation and rotation to zero. The way "reset" is currently
implemented, it does not affect the currently loaded toolpath. (But it's
better to use it only with "clean".)

View File

@ -49,6 +49,7 @@ NUM -?[0-9]+\.?[0-9]*
<INITIAL>optimize return TOK_OPTIMIZE;
<INITIAL>remainder return TOK_REMAINDER;
<INITIAL>reset return TOK_RESET;
<INITIAL>rotate return TOK_ROTATE;
<INITIAL>translate return TOK_TRANSLATE;
<INITIAL>z return TOK_Z;

View File

@ -13,6 +13,8 @@
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "path.h"
#include "ops.h"
@ -23,7 +25,8 @@
#include "y.tab.h"
static double xo = 0, yo = 0, zo = 0;
static double xo = 0, yo = 0, zo = 0; /* origin */
static double rot = 0;
static struct path *paths = NULL;
static struct path *remain = NULL;
@ -55,6 +58,27 @@ static void translate(struct path *list, double x, double y, double z)
}
static void rotate(struct path *list, double angle)
{
double m[2][2], tmp;
struct point *p;
angle = angle/180.0*M_PI;
m[0][0] = cos(angle);
m[0][1] = -sin(angle);
m[1][0] = -m[0][1];
m[1][1] = m[0][0];
while (list) {
for (p = list->first; p; p = p->next) {
tmp = p->x*m[0][0]+p->y*m[0][1];
p->y = p->x*m[1][0]+p->y*m[1][1];
p->x = tmp;
}
list = list->next;
}
}
static double ref_pick_1(int ref, double a, double b)
{
switch (ref) {
@ -151,7 +175,7 @@ static struct path **classify(struct path **anchor, struct path *path)
%token TOK_ALIGN TOK_ARRAY TOK_CLEAR TOK_DRILL TOK_EMPTY
%token TOK_MILL TOK_OFFSET TOK_OPTIMIZE TOK_REMAINDER TOK_RESET
%token TOK_TRANSLATE TOK_Z
%token TOK_ROTATE TOK_TRANSLATE TOK_Z
%token TOK_APPEND TOK_GERBER TOK_GNUPLOT TOK_EXCELLON TOK_WRITE
%token TOK_DOG TOK_INSIDE
@ -201,7 +225,7 @@ command:
}
| TOK_RESET
{
xo = yo = 0;
xo = yo = rot = 0;
}
| TOK_OFFSET offset_options
{
@ -212,6 +236,11 @@ command:
{
paths = optimize_paths(paths);
}
| TOK_ROTATE number
{
rotate(paths, $2);
rot += $2;
}
| TOK_TRANSLATE dimen dimen
{
translate(paths, $2, $3, 0);
@ -231,6 +260,7 @@ command:
struct path *new;
new = gerber_read($3, $2/2);
rotate(new, rot);
translate(new, xo, yo, 0);
add_paths(new);
}
@ -239,6 +269,7 @@ command:
struct path *new;
new = gnuplot_read($3, $2/2);
rotate(new, rot);
translate(new, xo, yo, 0);
add_paths(new);
}
@ -247,6 +278,7 @@ command:
struct path *new;
new = excellon_read($2);
rotate(new, rot);
translate(new, xo, yo, 0);
add_paths(new);
}