/* * Sets the line type and the scaling of the line pattern * * Don McCormick CSIRO Division of Applied Physics National Measurements * Laboritory Bradfield Road Lindfield 2018 N.S.W. * * NOTE: default length for a line pattern is approx 6.5 mm on A4 size paper. */ #include "defn.h" float linescale; int linestyle; linetype(line) int line; { float down1, down2; float up1, up2; float diagonal; end_draw(); if (line == LINE_TYPE_SCALE) /* HP-GL only */ { if (SIGNED_NUMERIC) { if ((linestyle = rint(getval())) > 6) linestyle = 6; else if (linestyle < -6) linestyle = -6; } else { SETDOT = 0; printf("[] 0 setdash\n"); return; } diagonal = pow((xmax - xmin),2.0) + pow((ymax - ymin),2.0); diagonal = pow(diagonal,0.5); if (SIGNED_NUMERIC) linescale = getval() * 0.01 * diagonal * XSCALE * SCALE * 0.2; else linescale = 0.015 * diagonal * XSCALE * SCALE * 0.2; } else if (line == LINESCALE) /* DXY commands only */ { if (SIGNED_NUMERIC) linescale = getval() / 80 * SCALE; else return; } else if (line == LINETYPE) /* DXY commands only */ { if (SIGNED_NUMERIC) { if ((linestyle = rint(getval())) > 5) linestyle = 5; else if (linestyle < -5) linestyle = -5; } else return; } else { fprintf(stderr, "Error: Unknown line flag in linetype.c\n"); exit(1); } /* * select a line style/type and scale/pitch */ switch (linestyle) { case 6: down1 = 2.0; up1 = up2 = 1.5; down2 = 1.5; break; case 5: down1 = 3.0; up1 = up2 = 1.0; down2 = 1.5; break; case 4: down1 = 4.0; up1 = up2 = 0.75; down2 = 1.0; break; case 3: down1 = 5.0; up1 = up2 = 1.0; down2 = 0.5; break; case 2: down1 = 5.5; up1 = 1.0; up2 = down2 = 0.0; break; case 1: down1 = 5.0; up1 = 1.5; up2 = down2 = 0.0; break; case -1: down1 = 1.5; up1 = 3.5; down2 = 1.5; up2 = 0.0; break; case -2: down1 = 2.0; up1 = 2.5; down2 = 2.0; up2 = 0.0; break; case -3: down1 = 2.5; up1 = up2 = 1.75; down2 = 0.5; break; case -4: down1 = 2.5; up1 = up2 = 1.5; down2 = 1.5; break; case -5: down1 = down2 = 2.0; up1 = up2 = 1.25; break; case -6: down1 = down2 = 1.75; up1 = up2 = 1.5; break; } if (linestyle == 0) { SETDOT = 1; /* For HP-GL only */ printf("[] 0 setdash\n"); /* For DXY commands */ } else { SETDOT = 0; /* For HP-GL only */ if (linescale <= 0) linescale = SCALE; down1 *= linescale; up2 *= linescale; up1 *= linescale; down2 *= linescale; printf("[%g mm %g mm %g mm %g mm] 0 setdash\n", down1, up1, down2, up2); } }