summaryrefslogtreecommitdiff
path: root/app/bin/dxfformat.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/dxfformat.c')
-rw-r--r--app/bin/dxfformat.c252
1 files changed, 145 insertions, 107 deletions
diff --git a/app/bin/dxfformat.c b/app/bin/dxfformat.c
index 3b79c7e..ac634cf 100644
--- a/app/bin/dxfformat.c
+++ b/app/bin/dxfformat.c
@@ -17,14 +17,8 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
#include <dynstring.h>
#include "dxfformat.h"
@@ -32,8 +26,9 @@
extern char *sProdNameUpper;
extern long units; /**< meaning is 0 = English, 1 = metric */
-static char *dxfDimensionDefaults[][3] = { /**< default values for dimensions, English, metric and DXF variable name */
- { "1.0", "25.0", "$DIMTXT" },
+static char *dxfDimensionDefaults[][3] = {
+ /**< default values for dimensions, English, metric and DXF variable name */
+ { "1.0", "25.0", "$DIMTXT" },
{ "0.8", "20.0", "$DIMASZ"}
};
@@ -48,14 +43,27 @@ static char *dxfDimensionDefaults[][3] = { /**< default values for dimensions, E
void DxfLayerName(DynString *result, char *name, int layer)
{
- DynStringPrintf(result, DXF_INDENT "8\n%s%d\n", name, layer);
+ DynStringPrintf(result, DXF_INDENT "8\n%s%d\n", name, layer);
+}
+
+/**
+* Build and format an integer.
+*
+* \param result OUT buffer for result
+* \param type IN type of integer following DXF specs
+* \param value IN position
+*/
+
+void DxfFormatInteger(DynString *result, int type, int value)
+{
+ DynStringPrintf(result, DXF_INDENT "%d\n%d\n", type, value);
}
/**
* Build and format a position. If it specifies a point the value
* is assumed to be in inches and will be converted to millimeters
* if the metric system is active.
-* If it is an angle (group codes 50 to 59) it is not converted.
+* If it is an angle (group codes 50 to 59) it is not converted.
*
* \param result OUT buffer for result
* \param type IN type of position following DXF specs
@@ -64,26 +72,30 @@ void DxfLayerName(DynString *result, char *name, int layer)
void DxfFormatPosition(DynString *result, int type, double value)
{
- if (units == 1)
- {
- if( type < 50 || type > 58 )
+ if (units == 1) {
+ if( type < 50 || type > 58 ) {
value *= 25.4;
+ }
}
-
- DynStringPrintf(result, DXF_INDENT "%d\n%0.6f\n", type, value);
+
+ DynStringPrintf(result, DXF_INDENT "%d\n%0.6f\n", type, value);
}
/**
* Build and format the line style definition
*
* \param result OUT buffer for result
-* \param type IN line style TRUE for dashed, FALSE for solid lines
+* \param type IN line style
*/
-void DxfLineStyle(DynString *result, int isDashed)
+void DxfLineStyle(DynString *result, int style)
{
- DynStringPrintf(result, DXF_INDENT "6\n%s\n",
- (isDashed ? "DASHED" : "CONTINUOUS"));
+ char* s = "CONTINUOUS";
+ switch ( style ) {
+ case 1: s = "DASHEDTINY"; break;
+ case 2: s = "DOTTINY"; break;
+ }
+ DynStringPrintf(result, DXF_INDENT "6\n%s\n", s);
}
/**
@@ -98,11 +110,11 @@ void DxfLineStyle(DynString *result, int isDashed)
static void
DxfAppendLayerName(DynString *output, int layer)
{
- DynString formatted = NaS;
- DynStringMalloc(&formatted, 0);
- DxfLayerName(&formatted, sProdNameUpper, layer);
- DynStringCatStr(output, &formatted);
- DynStringFree(&formatted);
+ DynString formatted = NaS;
+ DynStringMalloc(&formatted, 0);
+ DxfLayerName(&formatted, sProdNameUpper, layer);
+ DynStringCatStr(output, &formatted);
+ DynStringFree(&formatted);
}
/**
@@ -116,28 +128,46 @@ DxfAppendLayerName(DynString *output, int layer)
static void
DxfAppendPosition(DynString *output, int type, double value)
{
- DynString formatted = NaS;
- DynStringMalloc(&formatted, 0);
- DxfFormatPosition(&formatted, type, value);
- DynStringCatStr(output, &formatted);
- DynStringFree(&formatted);
+ DynString formatted = NaS;
+ DynStringMalloc(&formatted, 0);
+ DxfFormatPosition(&formatted, type, value);
+ DynStringCatStr(output, &formatted);
+ DynStringFree(&formatted);
+}
+
+/**
+* Build and format an integer. The result is appended to the existing result buffer.
+*
+* \param output OUT buffer for result
+* \param type IN type of integer following DXF specs
+* \param value IN position
+*/
+
+static void
+DxfAppendInteger(DynString *output, int type, int value)
+{
+ DynString formatted = NaS;
+ DynStringMalloc(&formatted, 0);
+ DxfFormatInteger(&formatted, type, value);
+ DynStringCatStr(output, &formatted);
+ DynStringFree(&formatted);
}
/**
* Build and format the line style definition. The result is appended to the existing result buffer.
*
* \param result OUT buffer for result
-* \param type IN line style TRUE for dashed, FALSE for solid lines
+* \param type IN line style 0 CONTINUOUS, 1 DASHED or 2 DOT
*/
static void
DxfAppendLineStyle(DynString *output, int style)
{
- DynString formatted = NaS;
- DynStringMalloc(&formatted, 0);
- DxfLineStyle(&formatted, style);
- DynStringCatStr(output, &formatted);
- DynStringFree(&formatted);
+ DynString formatted = NaS;
+ DynStringMalloc(&formatted, 0);
+ DxfLineStyle(&formatted, style);
+ DynStringCatStr(output, &formatted);
+ DynStringFree(&formatted);
}
/**
@@ -148,19 +178,21 @@ DxfAppendLineStyle(DynString *output, int style)
* \param x0, y0 IN first endpoint
* \param x1, y1 IN second endpoint
* \param style IN line style, TRUE for dashed, FALSE for continuous
+* \param color IN line color
*/
void
DxfLineCommand(DynString *result, int layer, double x0,
- double y0, double x1, double y1, int style)
+ double y0, double x1, double y1, int style, int color)
{
- DynStringCatCStr(result, DXF_INDENT "0\nLINE\n");
- DxfAppendLayerName(result, layer);
- DxfAppendPosition(result, 10, x0);
- DxfAppendPosition(result, 20, y0);
- DxfAppendPosition(result, 11, x1);
- DxfAppendPosition(result, 21, y1);
- DxfAppendLineStyle(result, style);
+ DynStringCatCStr(result, DXF_INDENT "0\nLINE\n");
+ DxfAppendLayerName(result, layer);
+ DxfAppendPosition(result, 10, x0);
+ DxfAppendPosition(result, 20, y0);
+ DxfAppendPosition(result, 11, x1);
+ DxfAppendPosition(result, 21, y1);
+ DxfAppendLineStyle(result, style);
+ DxfAppendInteger(result, 420, color);
}
/**
@@ -171,18 +203,20 @@ DxfLineCommand(DynString *result, int layer, double x0,
* \param x, y IN center point
* \param r IN radius
* \param style IN line style, TRUE for dashed, FALSE for continuous
+* \param color IN line color
*/
void
DxfCircleCommand(DynString *result, int layer, double x,
- double y, double r, int style)
+ double y, double r, int style, int color)
{
- DynStringCatCStr(result, DXF_INDENT "0\nCIRCLE\n");
- DxfAppendPosition(result, 10, x);
- DxfAppendPosition(result, 20, y);
- DxfAppendPosition(result, 40, r);
- DxfAppendLayerName(result, layer);
- DxfAppendLineStyle(result, style);
+ DynStringCatCStr(result, DXF_INDENT "0\nCIRCLE\n");
+ DxfAppendPosition(result, 10, x);
+ DxfAppendPosition(result, 20, y);
+ DxfAppendPosition(result, 40, r);
+ DxfAppendLayerName(result, layer);
+ DxfAppendLineStyle(result, style);
+ DxfAppendInteger(result, 420, color);
}
/**
@@ -195,20 +229,22 @@ DxfCircleCommand(DynString *result, int layer, double x,
* \param a0 IN starting angle
* \param a1 IN ending angle
* \param style IN line style, TRUE for dashed, FALSE for continuous
+* \param color IN line color
*/
void
DxfArcCommand(DynString *result, int layer, double x, double y,
- double r, double a0, double a1, int style)
+ double r, double a0, double a1, int style, int color)
{
- DynStringCatCStr(result, DXF_INDENT "0\nARC\n");
- DxfAppendPosition(result, 10, x);
- DxfAppendPosition(result, 20, y);
- DxfAppendPosition(result, 40, r);
- DxfAppendPosition(result, 50, a0);
- DxfAppendPosition(result, 51, a0+a1);
- DxfAppendLayerName(result, layer);
- DxfAppendLineStyle(result, style);
+ DynStringCatCStr(result, DXF_INDENT "0\nARC\n");
+ DxfAppendPosition(result, 10, x);
+ DxfAppendPosition(result, 20, y);
+ DxfAppendPosition(result, 40, r);
+ DxfAppendPosition(result, 50, a0);
+ DxfAppendPosition(result, 51, a0+a1);
+ DxfAppendLayerName(result, layer);
+ DxfAppendLineStyle(result, style);
+ DxfAppendInteger(result, 420, color);
}
/**
@@ -219,18 +255,20 @@ DxfArcCommand(DynString *result, int layer, double x, double y,
* \param x, y IN text position
* \param size IN font size
* \param text IN text
+* \param color IN text color
*/
void
DxfTextCommand(DynString *result, int layer, double x,
- double y, double size, char *text)
+ double y, double size, char *text, int color)
{
- DynStringCatCStr(result, DXF_INDENT "0\nTEXT\n");
- DynStringCatCStrs(result, DXF_INDENT "1\n", text, "\n", NULL);
- DxfAppendPosition(result, 10, x);
- DxfAppendPosition(result, 20, y);
- DxfAppendPosition(result, 40, size/72.0);
- DxfAppendLayerName(result, layer);
+ DynStringCatCStr(result, DXF_INDENT "0\nTEXT\n");
+ DynStringCatCStrs(result, DXF_INDENT "1\n", text, "\n", NULL);
+ DxfAppendPosition(result, 10, x);
+ DxfAppendPosition(result, 20, y);
+ DxfAppendPosition(result, 40, size/72.0);
+ DxfAppendLayerName(result, layer);
+ DxfAppendInteger(result, 420, color);
}
/**
@@ -244,29 +282,29 @@ DxfTextCommand(DynString *result, int layer, double x,
void
DxfUnits(DynString *result)
{
- char *value;
- DynStringCatCStr(result, DXF_INDENT "9\n$MEASUREMENT\n 70\n");
+ char *value;
+ DynStringCatCStr(result, DXF_INDENT "9\n$MEASUREMENT\n 70\n");
- if (units == 1) {
- value = "1\n";
- } else {
- value = "0\n";
- }
+ if (units == 1) {
+ value = "1\n";
+ } else {
+ value = "0\n";
+ }
- DynStringCatCStr(result, value);
- DynStringCatCStr(result, DXF_INDENT "9\n$INSUNITS\n 70\n");
+ DynStringCatCStr(result, value);
+ DynStringCatCStr(result, DXF_INDENT "9\n$INSUNITS\n 70\n");
- if (units == 1) {
- value = "4\n";
- } else {
- value = "1\n";
- }
+ if (units == 1) {
+ value = "4\n";
+ } else {
+ value = "1\n";
+ }
- DynStringCatCStr(result, value);
+ DynStringCatCStr(result, value);
}
/**
-* Define a size of dimensions. The default values are taken from
+* Define a size of dimensions. The default values are taken from
* static array dxfDimensionDefaults
*
* \PARAM result OUT the completed command is appended to this buffer
@@ -279,10 +317,10 @@ DxfDimensionSize(DynString *result, enum DXF_DIMENSIONS dimension )
DynString formatted;
DynStringMalloc(&formatted, 0);
- DynStringPrintf(&formatted,
- DXF_INDENT "9\n%s\n 40\n%s\n",
- dxfDimensionDefaults[dimension][2],
- dxfDimensionDefaults[dimension][units]);
+ DynStringPrintf(&formatted,
+ DXF_INDENT "9\n%s\n 40\n%s\n",
+ dxfDimensionDefaults[dimension][2],
+ dxfDimensionDefaults[dimension][units]);
DynStringCatStr(result, &formatted);
DynStringFree(&formatted);
@@ -302,24 +340,24 @@ void
DxfPrologue(DynString *result, int layerCount, double x0, double y0, double x1,
double y1)
{
- int i;
- DynString layer = NaS;
- DynStringMalloc(&layer, 0);
- DynStringCatCStr(result, "\
+ int i;
+ DynString layer = NaS;
+ DynStringMalloc(&layer, 0);
+ DynStringCatCStr(result, "\
0\nSECTION\n\
2\nHEADER\n\
9\n$ACADVER\n 1\nAC1009\n");
DxfUnits(result);
DxfDimensionSize(result, DXF_DIMTEXTSIZE);
DxfDimensionSize(result, DXF_DIMARROWSIZE);
-
- DynStringCatCStr(result, " 9\n$EXTMIN\n");
- DxfAppendPosition(result, 10, x0);
- DxfAppendPosition(result, 20, y0);
- DynStringCatCStr(result, " 9\n$EXTMAX\n");
- DxfAppendPosition(result, 10, x1);
- DxfAppendPosition(result, 20, y1);
- DynStringCatCStr(result, "\
+
+ DynStringCatCStr(result, " 9\n$EXTMIN\n");
+ DxfAppendPosition(result, 10, x0);
+ DxfAppendPosition(result, 20, y0);
+ DynStringCatCStr(result, " 9\n$EXTMAX\n");
+ DxfAppendPosition(result, 10, x1);
+ DxfAppendPosition(result, 20, y1);
+ DynStringCatCStr(result, "\
9\n$TEXTSTYLE\n 7\nSTANDARD\n\
0\nENDSEC\n\
0\nSECTION\n\
@@ -340,14 +378,14 @@ DxfPrologue(DynString *result, int layerCount, double x0, double y0, double x1,
2\nLAYER\n\
70\n0\n");
- for (i = 0; i < layerCount; i++) {
- DynStringPrintf(&layer,
- DXF_INDENT"0\nLAYER\n 2\n%s%d\n 6\nCONTINUOUS\n 62\n7\n 70\n0\n",
- sProdNameUpper, i + 1);
- DynStringCatStr(result, &layer);
- }
+ for (i = 0; i < layerCount; i++) {
+ DynStringPrintf(&layer,
+ DXF_INDENT"0\nLAYER\n 2\n%s%d\n 6\nCONTINUOUS\n 62\n7\n 70\n0\n",
+ sProdNameUpper, i + 1);
+ DynStringCatStr(result, &layer);
+ }
- DynStringCatCStr(result, "\
+ DynStringCatCStr(result, "\
0\nENDTAB\n\
0\nENDSEC\n\
0\nSECTION\n\
@@ -364,5 +402,5 @@ DxfPrologue(DynString *result, int layerCount, double x0, double y0, double x1,
void
DxfEpilogue(DynString *result)
{
- DynStringCatCStr(result, DXF_INDENT "0\nENDSEC\n" DXF_INDENT "0\nEOF\n");
+ DynStringCatCStr(result, DXF_INDENT "0\nENDSEC\n" DXF_INDENT "0\nEOF\n");
}