r5973 - in developers/werner/cncmap: . g2gp

werner at docs.openmoko.org werner at docs.openmoko.org
Thu Jul 29 01:58:09 CEST 2010


Author: werner
Date: 2010-07-29 01:58:08 +0200 (Thu, 29 Jul 2010)
New Revision: 5973

Added:
   developers/werner/cncmap/g2gp/
   developers/werner/cncmap/g2gp/Makefile
   developers/werner/cncmap/g2gp/g2gp.c
Modified:
   developers/werner/cncmap/README
Log:
Added G-code to gnuplot converter.



Modified: developers/werner/cncmap/README
===================================================================
--- developers/werner/cncmap/README	2010-07-17 10:34:09 UTC (rev 5972)
+++ developers/werner/cncmap/README	2010-07-28 23:58:08 UTC (rev 5973)
@@ -39,6 +39,9 @@
 align: map the model (in gnuplot format) to the workspace coordinates
 obtained from "rect". This  [...]
 
+g2gp: convert G-code generated by HeeksCAD to the "gnuplot" format. This
+strips all machine parameters.
+
 gp2rml: generate RML commands from a file in "gnuplot" format. Machine
 parameters like speed and clearance are passed on the command line.
 

Added: developers/werner/cncmap/g2gp/Makefile
===================================================================
--- developers/werner/cncmap/g2gp/Makefile	                        (rev 0)
+++ developers/werner/cncmap/g2gp/Makefile	2010-07-28 23:58:08 UTC (rev 5973)
@@ -0,0 +1,25 @@
+#
+# g2gp/Makefile - Build the G-code to gnuplot converter
+#
+# Written 2010 by Werner Almesberger
+# Copyright 2010 Werner Almesberger
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+
+
+MAIN=g2gp
+
+OBJS=g2gp.o
+
+CFLAGS = -g -Wall -Wshadow
+LDFLAGS = -lm
+
+$(MAIN):	$(OBJS)
+#		$(CC) $(LDFLAGS) -o $(MAIN) $(OBJS)
+
+clean:
+		rm -f $(OBJS)

Added: developers/werner/cncmap/g2gp/g2gp.c
===================================================================
--- developers/werner/cncmap/g2gp/g2gp.c	                        (rev 0)
+++ developers/werner/cncmap/g2gp/g2gp.c	2010-07-28 23:58:08 UTC (rev 5973)
@@ -0,0 +1,205 @@
+/*
+ * g2gp.c - Convert from G-code to gnuplot
+ *
+ * Written 2010 by Werner Almesberger
+ * Copyright 2010 Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+
+static int up = 1;
+
+
+static void flush_move(double x, double y, double z)
+{
+	if (up)
+		return;
+	printf("%f %f %f\n\n", x, y, z);
+	up = 1;
+}
+
+
+static void do_move(double x, double y, double z)
+{
+	printf("%f %f %f\n", x, y, z);
+	up = 0;
+}
+
+
+static void process_command(char ch, double n)
+{
+	static double x, y, z;
+
+	switch (ch) {
+	case 'F':
+		/* ignore feed rate */
+		break;
+	case 'G':
+		switch ((int) n) {
+		case 0:	/* rapid positioning */
+			flush_move(x, y, z);
+			break;
+		case 1:	/* linear interpolation */
+			do_move(x, y, z);
+			break;
+		case 10: /* coordinate system origin */
+			break;
+		case 17: /* xy plane */
+		case 21: /* millimeter */
+			break;
+		case 54: /* preset coordinate system 1 */
+			break;
+		case 90: /* absolute */
+			break;
+		default:
+			fprintf(stderr, "igoring G%02d\n", (int) n);
+			break;
+		}
+		break;
+	case 'L':
+		/* loops */
+		break;
+	case 'M':
+		switch ((int) n) {
+		case 2:	/* program end */
+			flush_move(x, y, z);
+			break;
+		case 3:	/* turn spindle clockwise */
+			break;
+		case 6:	/* tool change */
+			break;
+		default:
+			fprintf(stderr, "igoring M%02d\n", (int) n);
+			break;
+		}
+		break;
+	case 'N':
+		/* ignore line numbers */
+		break;
+	case 'O':
+		/* ??? */
+		break;
+	case 'P':
+		/* dwell time */
+		break;
+	case 'R':
+		/* arc radius */
+		break;
+	case 'S':
+		/* spindle speed */
+		break;
+	case 'T':
+		/* tool selection */
+		break;
+	case 'X':
+		x = n;
+		break;
+	case 'Y':
+		y = n;
+		break;
+	case 'Z':
+		z = n;
+		break;
+	default:
+		abort();
+	}
+}
+
+
+static void process_file(FILE *file)
+{
+	char last_ch = 0;
+	double n = 0;
+	double f = 1.0;
+	int text = 0;
+	int minus = 0;
+	char ch;
+	
+	while ((ch = fgetc(file)) != EOF) {
+		if (text) {
+			if (ch == ')')
+				text = 0;
+			continue;
+		}
+		if (strchr("FGLMNOPRSTXYZ", toupper(ch))) {
+			if (last_ch)
+				process_command(last_ch, minus ? -n : n);
+			n = 0;
+			f = 1.0;
+			minus = 0;
+			last_ch = ch;
+			continue;
+		}
+		if (strchr("0123456789", ch)) {
+			if (f > 0.5) {
+				n = n*10+(ch-'0');
+			} else {
+				n += f*(ch-'0');
+				f /= 10;
+			}
+			continue;
+		}
+		if (ch == '.') {
+			f = 0.1;
+			continue;
+		}
+		if (ch == '-') {
+			minus = !minus;
+			continue;
+		}
+		if (ch == '(') {
+			text = 1;
+			continue;
+		}
+		if (strchr("\t \r\n", ch))
+			continue;
+		fprintf(stderr, "ignoring \"%c\"\n", ch);
+	}
+}
+
+
+static void usage(const char *name)
+{
+	fprintf(stderr, "usage: %s [file]\n\n", name);
+	exit(1);
+}
+
+
+int main(int argc, const char **argv)
+{
+	FILE *file;
+
+	switch (argc) {
+	case 1:
+		file = stdin;
+		break;
+	case 2:
+		file = fopen(argv[1], "r");
+		if (!file) {
+			perror(argv[1]);
+			return 1;
+		}
+		break;
+	default:
+		usage(*argv);
+	}
+
+	process_file(file);
+
+	if (ferror(stdout))
+		perror("stdout");
+	if (fclose(stdout) == EOF)
+		perror("stdout");
+
+	return 0;
+}




More information about the commitlog mailing list