Replace NameStr with std::string.

This removes the arbitrary 64 byte restriction (which effectively
limits us to as little as 16 Unicode characters with CJK encodings),
makes classes smaller, and is easier to use.

As a consequence of making the length of all ex-NameStr fields
unbounded, all functions that returned a buffer derived from those
were changed to return std::string. Then, functions that are
contextually similar to the ones described above were changed
to return std::string. Then, functions that now happened to mostly
take an std::string argument converted to a C string were changed
to accept std::string.

This has produced a bit of churn, but is probably for the better.
pull/4/head
whitequark 2015-11-06 11:40:12 +03:00
parent 86f0439521
commit 11f29b1231
27 changed files with 297 additions and 341 deletions

View File

@ -86,8 +86,8 @@ void GraphicsWindow::CopySelection(void) {
cr.type = req; cr.type = req;
cr.extraPoints = e->extraPoints; cr.extraPoints = e->extraPoints;
cr.style = e->style; cr.style = e->style;
cr.str.strcpy( e->str.str); cr.str = e->str;
cr.font.strcpy( e->font.str); cr.font = e->font;
cr.construction = e->construction; cr.construction = e->construction;
{for(int i = 0; i < pts; i++) { {for(int i = 0; i < pts; i++) {
Vector pt = SK.GetEntity(e->point[i])->PointGetNum(); Vector pt = SK.GetEntity(e->point[i])->PointGetNum();
@ -133,8 +133,8 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) {
Request *r = SK.GetRequest(hr); Request *r = SK.GetRequest(hr);
r->extraPoints = cr->extraPoints; r->extraPoints = cr->extraPoints;
r->style = cr->style; r->style = cr->style;
r->str.strcpy( cr->str.str); r->str = cr->str;
r->font.strcpy( cr->font.str); r->font = cr->font;
r->construction = cr->construction; r->construction = cr->construction;
// Need to regen to get the right number of points, if extraPoints // Need to regen to get the right number of points, if extraPoints
// changed. // changed.
@ -374,14 +374,14 @@ void TextWindow::ShowPasteTransformed(void) {
shown.paste.theta*180/PI, shown.paste.theta*180/PI,
&ScreenChangePasteTransformed); &ScreenChangePasteTransformed);
Printf(false, "%Ba %Ftabout pt%E (%s, %s, %s) %Fl%Lo%f[use selected]%E", Printf(false, "%Ba %Ftabout pt%E (%s, %s, %s) %Fl%Lo%f[use selected]%E",
SS.MmToString(shown.paste.origin.x), SS.MmToString(shown.paste.origin.x).c_str(),
SS.MmToString(shown.paste.origin.y), SS.MmToString(shown.paste.origin.y).c_str(),
SS.MmToString(shown.paste.origin.z), SS.MmToString(shown.paste.origin.z).c_str(),
&ScreenPasteTransformed); &ScreenPasteTransformed);
Printf(false, "%Bd %Fttranslate%E (%s, %s, %s) %Fl%Lt%f[use selected]%E", Printf(false, "%Bd %Fttranslate%E (%s, %s, %s) %Fl%Lt%f[use selected]%E",
SS.MmToString(shown.paste.trans.x), SS.MmToString(shown.paste.trans.x).c_str(),
SS.MmToString(shown.paste.trans.y), SS.MmToString(shown.paste.trans.y).c_str(),
SS.MmToString(shown.paste.trans.z), SS.MmToString(shown.paste.trans.z).c_str(),
&ScreenPasteTransformed); &ScreenPasteTransformed);
Printf(false, "%Ba %Ftscale%E %@ %Fl%Ls%f[change]%E", Printf(false, "%Ba %Ftscale%E %@ %Fl%Ls%f[change]%E",
shown.paste.scale, shown.paste.scale,

View File

@ -487,8 +487,8 @@ bool FullScreenIsActive(void) {
return [GWDelegate isFullscreen]; return [GWDelegate isFullscreen];
} }
void ShowGraphicsEditControl(int x, int y, char *str) { void ShowGraphicsEditControl(int x, int y, const std::string &str) {
[GWView startEditing:[NSString stringWithUTF8String:str] [GWView startEditing:[NSString stringWithUTF8String:str.c_str()]
at:(NSPoint){(CGFloat)x, (CGFloat)y}]; at:(NSPoint){(CGFloat)x, (CGFloat)y}];
} }
@ -1010,8 +1010,8 @@ void SetMousePointerToHand(bool is_hand) {
[TWView setCursorHand:is_hand]; [TWView setCursorHand:is_hand];
} }
void ShowTextEditControl(int x, int y, char *str) { void ShowTextEditControl(int x, int y, const std::string &str) {
return [TWView startEditing:[NSString stringWithUTF8String:str] return [TWView startEditing:[NSString stringWithUTF8String:str.c_str()]
at:(NSPoint){(CGFloat)x, (CGFloat)y}]; at:(NSPoint){(CGFloat)x, (CGFloat)y}];
} }

View File

@ -137,30 +137,30 @@ void TextWindow::ScreenChangeCanvasSize(int link, uint32_t v) {
} }
void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) {
char buf[1024] = ""; std::string buf;
int row = 93; int row = 93;
switch(link) { switch(link) {
case 'd': case 'd':
SS.TW.edit.meaning = EDIT_G_CODE_DEPTH; SS.TW.edit.meaning = EDIT_G_CODE_DEPTH;
strcpy(buf, SS.MmToString(SS.gCode.depth)); buf += SS.MmToString(SS.gCode.depth);
row += 0; row += 0;
break; break;
case 's': case 's':
SS.TW.edit.meaning = EDIT_G_CODE_PASSES; SS.TW.edit.meaning = EDIT_G_CODE_PASSES;
sprintf(buf, "%d", SS.gCode.passes); buf += std::to_string(SS.gCode.passes);
row += 2; row += 2;
break; break;
case 'F': case 'F':
SS.TW.edit.meaning = EDIT_G_CODE_FEED; SS.TW.edit.meaning = EDIT_G_CODE_FEED;
strcpy(buf, SS.MmToString(SS.gCode.feed)); buf += SS.MmToString(SS.gCode.feed);
row += 4; row += 4;
break; break;
case 'P': case 'P':
SS.TW.edit.meaning = EDIT_G_CODE_PLUNGE_FEED; SS.TW.edit.meaning = EDIT_G_CODE_PLUNGE_FEED;
strcpy(buf, SS.MmToString(SS.gCode.plungeFeed)); buf += SS.MmToString(SS.gCode.plungeFeed);
row += 6; row += 6;
break; break;
} }
@ -168,10 +168,7 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) {
} }
void TextWindow::ScreenChangeAutosaveInterval(int link, uint32_t v) { void TextWindow::ScreenChangeAutosaveInterval(int link, uint32_t v) {
char str[1024]; SS.TW.ShowEditControl(111, 3, std::to_string(SS.autosaveInterval));
sprintf(str, "%d", SS.autosaveInterval);
SS.TW.ShowEditControl(111, 3, str);
SS.TW.edit.meaning = EDIT_AUTOSAVE_INTERVAL; SS.TW.edit.meaning = EDIT_AUTOSAVE_INTERVAL;
} }
@ -218,13 +215,13 @@ void TextWindow::ShowConfiguration(void) {
&ScreenChangeCameraTangent, 0); &ScreenChangeCameraTangent, 0);
Printf(false, "%Ft snap grid spacing%E"); Printf(false, "%Ft snap grid spacing%E");
Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.gridSpacing), SS.MmToString(SS.gridSpacing).c_str(),
&ScreenChangeGridSpacing, 0); &ScreenChangeGridSpacing, 0);
Printf(false, "%Ft digits after decimal point to show%E"); Printf(false, "%Ft digits after decimal point to show%E");
Printf(false, "%Ba %d %Fl%Ll%f%D[change]%E (e.g. '%s')", Printf(false, "%Ba %d %Fl%Ll%f%D[change]%E (e.g. '%s')",
SS.UnitDigitsAfterDecimal(), SS.UnitDigitsAfterDecimal(),
&ScreenChangeDigitsAfterDecimal, 0, &ScreenChangeDigitsAfterDecimal, 0,
SS.MmToString(SS.StringToMm("1.23456789"))); SS.MmToString(SS.StringToMm("1.23456789")).c_str());
Printf(false, ""); Printf(false, "");
Printf(false, "%Ft export scale factor (1:1=mm, 1:25.4=inch)"); Printf(false, "%Ft export scale factor (1:1=mm, 1:25.4=inch)");
@ -233,7 +230,7 @@ void TextWindow::ShowConfiguration(void) {
&ScreenChangeExportScale, 0); &ScreenChangeExportScale, 0);
Printf(false, "%Ft cutter radius offset (0=no offset) "); Printf(false, "%Ft cutter radius offset (0=no offset) ");
Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportOffset), SS.MmToString(SS.exportOffset).c_str(),
&ScreenChangeExportOffset, 0); &ScreenChangeExportOffset, 0);
Printf(false, ""); Printf(false, "");
@ -264,35 +261,35 @@ void TextWindow::ShowConfiguration(void) {
if(SS.exportCanvasSizeAuto) { if(SS.exportCanvasSizeAuto) {
Printf(false, "%Ft (by margins around exported geometry)"); Printf(false, "%Ft (by margins around exported geometry)");
Printf(false, "%Ba%Ft left: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba%Ft left: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportMargin.left), &ScreenChangeCanvasSize, 0); SS.MmToString(SS.exportMargin.left).c_str(), &ScreenChangeCanvasSize, 0);
Printf(false, "%Bd%Ft right: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Bd%Ft right: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportMargin.right), &ScreenChangeCanvasSize, 1); SS.MmToString(SS.exportMargin.right).c_str(), &ScreenChangeCanvasSize, 1);
Printf(false, "%Ba%Ft bottom: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba%Ft bottom: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportMargin.bottom), &ScreenChangeCanvasSize, 2); SS.MmToString(SS.exportMargin.bottom).c_str(), &ScreenChangeCanvasSize, 2);
Printf(false, "%Bd%Ft top: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Bd%Ft top: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportMargin.top), &ScreenChangeCanvasSize, 3); SS.MmToString(SS.exportMargin.top).c_str(), &ScreenChangeCanvasSize, 3);
} else { } else {
Printf(false, "%Ft (by absolute dimensions and offsets)"); Printf(false, "%Ft (by absolute dimensions and offsets)");
Printf(false, "%Ba%Ft width: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba%Ft width: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportCanvas.width), &ScreenChangeCanvasSize, 10); SS.MmToString(SS.exportCanvas.width).c_str(), &ScreenChangeCanvasSize, 10);
Printf(false, "%Bd%Ft height: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Bd%Ft height: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportCanvas.height), &ScreenChangeCanvasSize, 11); SS.MmToString(SS.exportCanvas.height).c_str(), &ScreenChangeCanvasSize, 11);
Printf(false, "%Ba%Ft offset x: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Ba%Ft offset x: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportCanvas.dx), &ScreenChangeCanvasSize, 12); SS.MmToString(SS.exportCanvas.dx).c_str(), &ScreenChangeCanvasSize, 12);
Printf(false, "%Bd%Ft offset y: %Fd%s %Fl%Ll%f%D[change]%E", Printf(false, "%Bd%Ft offset y: %Fd%s %Fl%Ll%f%D[change]%E",
SS.MmToString(SS.exportCanvas.dy), &ScreenChangeCanvasSize, 13); SS.MmToString(SS.exportCanvas.dy).c_str(), &ScreenChangeCanvasSize, 13);
} }
Printf(false, ""); Printf(false, "");
Printf(false, "%Ft exported g code parameters"); Printf(false, "%Ft exported g code parameters");
Printf(false, "%Ba%Ft depth: %Fd%s %Fl%Ld%f[change]%E", Printf(false, "%Ba%Ft depth: %Fd%s %Fl%Ld%f[change]%E",
SS.MmToString(SS.gCode.depth), &ScreenChangeGCodeParameter); SS.MmToString(SS.gCode.depth).c_str(), &ScreenChangeGCodeParameter);
Printf(false, "%Bd%Ft passes: %Fd%d %Fl%Ls%f[change]%E", Printf(false, "%Bd%Ft passes: %Fd%d %Fl%Ls%f[change]%E",
SS.gCode.passes, &ScreenChangeGCodeParameter); SS.gCode.passes, &ScreenChangeGCodeParameter);
Printf(false, "%Ba%Ft feed: %Fd%s %Fl%LF%f[change]%E", Printf(false, "%Ba%Ft feed: %Fd%s %Fl%LF%f[change]%E",
SS.MmToString(SS.gCode.feed), &ScreenChangeGCodeParameter); SS.MmToString(SS.gCode.feed).c_str(), &ScreenChangeGCodeParameter);
Printf(false, "%Bd%Ft plunge fd: %Fd%s %Fl%LP%f[change]%E", Printf(false, "%Bd%Ft plunge fd: %Fd%s %Fl%LP%f[change]%E",
SS.MmToString(SS.gCode.plungeFeed), &ScreenChangeGCodeParameter); SS.MmToString(SS.gCode.plungeFeed).c_str(), &ScreenChangeGCodeParameter);
Printf(false, ""); Printf(false, "");
Printf(false, " %Fd%f%Ll%s draw triangle back faces in red%E", Printf(false, " %Fd%f%Ll%s draw triangle back faces in red%E",

View File

@ -6,9 +6,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "solvespace.h" #include "solvespace.h"
char *Constraint::DescriptionString(void) { std::string Constraint::DescriptionString(void) {
static char ret[1024];
const char *s; const char *s;
switch(type) { switch(type) {
case POINTS_COINCIDENT: s = "pts-coincident"; break; case POINTS_COINCIDENT: s = "pts-coincident"; break;
@ -49,8 +47,7 @@ char *Constraint::DescriptionString(void) {
default: s = "???"; break; default: s = "???"; break;
} }
sprintf(ret, "c%03x-%s", h.v, s); return ssprintf("c%03x-%s", h.v, s);
return ret;
} }
#ifndef LIBRARY #ifndef LIBRARY

View File

@ -14,7 +14,7 @@ void TextWindow::ScreenEditTtfText(int link, uint32_t v) {
hRequest hr = { v }; hRequest hr = { v };
Request *r = SK.GetRequest(hr); Request *r = SK.GetRequest(hr);
SS.TW.ShowEditControl(13, 10, r->str.str); SS.TW.ShowEditControl(13, 10, r->str.c_str());
SS.TW.edit.meaning = EDIT_TTF_TEXT; SS.TW.edit.meaning = EDIT_TTF_TEXT;
SS.TW.edit.request = hr; SS.TW.edit.request = hr;
} }
@ -35,7 +35,7 @@ void TextWindow::ScreenSetTtfFont(int link, uint32_t v) {
if(!r) return; if(!r) return;
SS.UndoRemember(); SS.UndoRemember();
r->font.strcpy(SS.fonts.l.elem[i].FontFileBaseName().c_str()); r->font = SS.fonts.l.elem[i].FontFileBaseName();
SS.MarkGroupDirty(r->group); SS.MarkGroupDirty(r->group);
SS.ScheduleGenerateAll(); SS.ScheduleGenerateAll();
SS.ScheduleShowTW(); SS.ScheduleShowTW();
@ -61,7 +61,9 @@ void TextWindow::DescribeSelection(void) {
e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]); e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]);
#define COSTR(p) \ #define COSTR(p) \
SS.MmToString((p).x), SS.MmToString((p).y), SS.MmToString((p).z) SS.MmToString((p).x).c_str(), \
SS.MmToString((p).y).c_str(), \
SS.MmToString((p).z).c_str()
#define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)" #define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)"
#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)" #define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)"
switch(e->type) { switch(e->type) {
@ -108,7 +110,7 @@ void TextWindow::DescribeSelection(void) {
p = p1; p = p1;
Printf(false, " " PT_AS_STR, COSTR(p)); Printf(false, " " PT_AS_STR, COSTR(p));
Printf(true, " len = %Fi%s%E", Printf(true, " len = %Fi%s%E",
SS.MmToString((p1.Minus(p0).Magnitude()))); SS.MmToString((p1.Minus(p0).Magnitude())).c_str());
break; break;
} }
case Entity::CUBIC_PERIODIC: case Entity::CUBIC_PERIODIC:
@ -139,11 +141,11 @@ void TextWindow::DescribeSelection(void) {
p = SK.GetEntity(e->point[2])->PointGetNum(); p = SK.GetEntity(e->point[2])->PointGetNum();
Printf(false, " " PT_AS_STR, COSTR(p)); Printf(false, " " PT_AS_STR, COSTR(p));
double r = e->CircleGetRadiusNum(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2)); Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r)); Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
double thetas, thetaf, dtheta; double thetas, thetaf, dtheta;
e->ArcGetAngles(&thetas, &thetaf, &dtheta); e->ArcGetAngles(&thetas, &thetaf, &dtheta);
Printf(false, " arc len = %Fi%s", SS.MmToString(dtheta*r)); Printf(false, " arc len = %Fi%s", SS.MmToString(dtheta*r).c_str());
break; break;
} }
case Entity::CIRCLE: { case Entity::CIRCLE: {
@ -151,8 +153,8 @@ void TextWindow::DescribeSelection(void) {
p = SK.GetEntity(e->point[0])->PointGetNum(); p = SK.GetEntity(e->point[0])->PointGetNum();
Printf(true, " center = " PT_AS_STR, COSTR(p)); Printf(true, " center = " PT_AS_STR, COSTR(p));
double r = e->CircleGetRadiusNum(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.MmToString(r*2)); Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
Printf(false, " radius = %Fi%s", SS.MmToString(r)); Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
break; break;
} }
case Entity::FACE_NORMAL_PT: case Entity::FACE_NORMAL_PT:
@ -169,29 +171,29 @@ void TextWindow::DescribeSelection(void) {
case Entity::TTF_TEXT: { case Entity::TTF_TEXT: {
Printf(false, "%FtTRUETYPE FONT TEXT%E"); Printf(false, "%FtTRUETYPE FONT TEXT%E");
Printf(true, " font = '%Fi%s%E'", e->font.str); Printf(true, " font = '%Fi%s%E'", e->font.c_str());
if(e->h.isFromRequest()) { if(e->h.isFromRequest()) {
Printf(false, " text = '%Fi%s%E' %Fl%Ll%f%D[change]%E", Printf(false, " text = '%Fi%s%E' %Fl%Ll%f%D[change]%E",
e->str.str, &ScreenEditTtfText, e->h.request()); e->str.c_str(), &ScreenEditTtfText, e->h.request());
Printf(true, " select new font"); Printf(true, " select new font");
SS.fonts.LoadAll(); SS.fonts.LoadAll();
int i; int i;
for(i = 0; i < SS.fonts.l.n; i++) { for(i = 0; i < SS.fonts.l.n; i++) {
TtfFont *tf = &(SS.fonts.l.elem[i]); TtfFont *tf = &(SS.fonts.l.elem[i]);
if(strcmp(e->font.str, tf->FontFileBaseName().c_str())==0) { if(e->font == tf->FontFileBaseName()) {
Printf(false, "%Bp %s", Printf(false, "%Bp %s",
(i & 1) ? 'd' : 'a', (i & 1) ? 'd' : 'a',
tf->name.str); tf->name.c_str());
} else { } else {
Printf(false, "%Bp %f%D%Fl%Ll%s%E%Bp", Printf(false, "%Bp %f%D%Fl%Ll%s%E%Bp",
(i & 1) ? 'd' : 'a', (i & 1) ? 'd' : 'a',
&ScreenSetTtfFont, i, &ScreenSetTtfFont, i,
tf->name.str, tf->name.c_str(),
(i & 1) ? 'd' : 'a'); (i & 1) ? 'd' : 'a');
} }
} }
} else { } else {
Printf(false, " text = '%Fi%s%E'", e->str.str); Printf(false, " text = '%Fi%s%E'", e->str.c_str());
} }
break; break;
} }
@ -203,16 +205,16 @@ void TextWindow::DescribeSelection(void) {
Group *g = SK.GetGroup(e->group); Group *g = SK.GetGroup(e->group);
Printf(false, ""); Printf(false, "");
Printf(false, "%FtIN GROUP%E %s", g->DescriptionString()); Printf(false, "%FtIN GROUP%E %s", g->DescriptionString().c_str());
if(e->workplane.v == Entity::FREE_IN_3D.v) { if(e->workplane.v == Entity::FREE_IN_3D.v) {
Printf(false, "%FtNOT LOCKED IN WORKPLANE%E"); Printf(false, "%FtNOT LOCKED IN WORKPLANE%E");
} else { } else {
Entity *w = SK.GetEntity(e->workplane); Entity *w = SK.GetEntity(e->workplane);
Printf(false, "%FtIN WORKPLANE%E %s", w->DescriptionString()); Printf(false, "%FtIN WORKPLANE%E %s", w->DescriptionString().c_str());
} }
if(e->style.v) { if(e->style.v) {
Style *s = Style::Get(e->style); Style *s = Style::Get(e->style);
Printf(false, "%FtIN STYLE%E %s", s->DescriptionString()); Printf(false, "%FtIN STYLE%E %s", s->DescriptionString().c_str());
} else { } else {
Printf(false, "%FtIN STYLE%E none"); Printf(false, "%FtIN STYLE%E none");
} }
@ -226,7 +228,7 @@ void TextWindow::DescribeSelection(void) {
Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum(); Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum();
Printf(false, " " PT_AS_STR, COSTR(p1)); Printf(false, " " PT_AS_STR, COSTR(p1));
double d = (p1.Minus(p0)).Magnitude(); double d = (p1.Minus(p0)).Magnitude();
Printf(true, " d = %Fi%s", SS.MmToString(d)); Printf(true, " d = %Fi%s", SS.MmToString(d).c_str());
} else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) { } else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) {
Printf(false, "%FtA POINT AND A PLANE FACE"); Printf(false, "%FtA POINT AND A PLANE FACE");
Vector pt = SK.GetEntity(gs.point[0])->PointGetNum(); Vector pt = SK.GetEntity(gs.point[0])->PointGetNum();
@ -236,7 +238,7 @@ void TextWindow::DescribeSelection(void) {
Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum(); Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum();
Printf(false, " plane thru = " PT_AS_STR, COSTR(pl)); Printf(false, " plane thru = " PT_AS_STR, COSTR(pl));
double dd = n.Dot(pl) - n.Dot(pt); double dd = n.Dot(pl) - n.Dot(pt);
Printf(true, " distance = %Fi%s", SS.MmToString(dd)); Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str());
} else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) { } else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) {
Printf(false, "%FtTWO POINTS AND A VECTOR"); Printf(false, "%FtTWO POINTS AND A VECTOR");
Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum();
@ -247,7 +249,7 @@ void TextWindow::DescribeSelection(void) {
v = v.WithMagnitude(1); v = v.WithMagnitude(1);
Printf(true, " vector = " PT_AS_NUM, CO(v)); Printf(true, " vector = " PT_AS_NUM, CO(v));
double d = (p1.Minus(p0)).Dot(v); double d = (p1.Minus(p0)).Dot(v);
Printf(true, " proj_d = %Fi%s", SS.MmToString(d)); Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str());
} else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) { } else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) {
Entity *ln = SK.GetEntity(gs.entity[0]); Entity *ln = SK.GetEntity(gs.entity[0]);
Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(), Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(),
@ -258,7 +260,7 @@ void TextWindow::DescribeSelection(void) {
Vector pp = SK.GetEntity(gs.point[0])->PointGetNum(); Vector pp = SK.GetEntity(gs.point[0])->PointGetNum();
Printf(true, " point " PT_AS_STR, COSTR(pp)); Printf(true, " point " PT_AS_STR, COSTR(pp));
Printf(true, " pt-ln distance = %Fi%s%E", Printf(true, " pt-ln distance = %Fi%s%E",
SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0)))); SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str());
} else if(gs.n == 2 && gs.vectors == 2) { } else if(gs.n == 2 && gs.vectors == 2) {
Printf(false, "%FtTWO VECTORS"); Printf(false, "%FtTWO VECTORS");
@ -296,7 +298,7 @@ void TextWindow::DescribeSelection(void) {
if(fabs(theta) < 0.01) { if(fabs(theta) < 0.01) {
double d = (p1.Minus(p0)).Dot(n0); double d = (p1.Minus(p0)).Dot(n0);
Printf(true, " distance = %Fi%s", SS.MmToString(d)); Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str());
} }
} else if(gs.n == 0 && gs.stylables > 0) { } else if(gs.n == 0 && gs.stylables > 0) {
Printf(false, "%FtSELECTED:%E comment text"); Printf(false, "%FtSELECTED:%E comment text");
@ -311,7 +313,7 @@ void TextWindow::DescribeSelection(void) {
c->other ? CHECK_TRUE : CHECK_FALSE); c->other ? CHECK_TRUE : CHECK_FALSE);
} else { } else {
Printf(false, "%FtSELECTED:%E %s", Printf(false, "%FtSELECTED:%E %s",
c->DescriptionString()); c->DescriptionString().c_str());
} }
} else { } else {
int n = SS.GW.selection.n; int n = SS.GW.selection.n;
@ -327,7 +329,7 @@ void TextWindow::DescribeSelection(void) {
Printf(true, "%Fl%D%f%Ll(assign to style %s)%E", Printf(true, "%Fl%D%f%Ll(assign to style %s)%E",
shown.style.v, shown.style.v,
&ScreenAssignSelectionToStyle, &ScreenAssignSelectionToStyle,
s->DescriptionString()); s->DescriptionString().c_str());
} }
// If any of the selected entities have an assigned style, then offer // If any of the selected entities have an assigned style, then offer
// the option to remove that style. // the option to remove that style.

View File

@ -57,31 +57,31 @@ double Constraint::EllipticalInterpolation(double rx, double ry, double theta) {
return v; return v;
} }
char *Constraint::Label(void) { std::string Constraint::Label(void) {
static char Ret[1024]; std::string result;
if(type == ANGLE) { if(type == ANGLE) {
sprintf(Ret, "%.2f", valA); result = ssprintf("%.2f", valA);
} else if(type == LENGTH_RATIO) { } else if(type == LENGTH_RATIO) {
sprintf(Ret, "%.3f:1", valA); result = ssprintf("%.3f:1", valA);
} else if(type == LENGTH_DIFFERENCE) { } else if(type == LENGTH_DIFFERENCE) {
sprintf(Ret, "%.3f", valA); result = ssprintf("%.3f", valA);
} else if(type == COMMENT) { } else if(type == COMMENT) {
strcpy(Ret, comment.str); result = comment;
} else if(type == DIAMETER) { } else if(type == DIAMETER) {
if(!other) { if(!other) {
// leading spaces for diameter symbol // leading spaces for diameter symbol
sprintf(Ret, " %s", SS.MmToString(valA)); result = " " + SS.MmToString(valA);
} else { } else {
sprintf(Ret, "R%s", SS.MmToString(valA / 2)); result = "R" + SS.MmToString(valA / 2);
} }
} else { } else {
// valA has units of distance // valA has units of distance
strcpy(Ret, SS.MmToString(fabs(valA))); result = SS.MmToString(fabs(valA));
} }
if(reference) { if(reference) {
strcat(Ret, " REF"); result += " REF";
} }
return Ret; return result;
} }
void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) { void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) {
@ -92,8 +92,8 @@ void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) {
th = DEFAULT_TEXT_HEIGHT; th = DEFAULT_TEXT_HEIGHT;
} }
char *s = Label(); std::string s = Label();
double swidth = ssglStrWidth(s, th), double swidth = ssglStrWidth(s.c_str(), th),
sheight = ssglStrHeight(th); sheight = ssglStrHeight(th);
// By default, the reference is from the center; but the style could // By default, the reference is from the center; but the style could
@ -124,7 +124,7 @@ void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) {
if(dogd.drawing) { if(dogd.drawing) {
ssglWriteTextRefCenter(s, th, ref, gr, gu, LineCallback, this); ssglWriteTextRefCenter(s.c_str(), th, ref, gr, gu, LineCallback, this);
} else { } else {
double l = swidth/2 - sheight/2; double l = swidth/2 - sheight/2;
l = max(l, 5/SS.GW.scale); l = max(l, 5/SS.GW.scale);
@ -163,9 +163,9 @@ int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b) {
gr = SS.GW.projRight.WithMagnitude(1); gr = SS.GW.projRight.WithMagnitude(1);
double pixels = 1.0 / SS.GW.scale; double pixels = 1.0 / SS.GW.scale;
char *s = Label(); std::string s = Label();
double swidth = ssglStrWidth(s, DEFAULT_TEXT_HEIGHT) + 4*pixels, double swidth = ssglStrWidth(s.c_str(), DEFAULT_TEXT_HEIGHT) + 4*pixels,
sheight = ssglStrHeight(DEFAULT_TEXT_HEIGHT) + 8*pixels; sheight = ssglStrHeight(DEFAULT_TEXT_HEIGHT) + 8*pixels;
struct { struct {
Vector n; Vector n;
@ -370,7 +370,7 @@ void Constraint::DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
// complex and this looks pretty good. // complex and this looks pretty good.
double tl = atan2(rm.Dot(gu), rm.Dot(gr)); double tl = atan2(rm.Dot(gu), rm.Dot(gr));
double adj = EllipticalInterpolation( double adj = EllipticalInterpolation(
ssglStrWidth(Label(), DEFAULT_TEXT_HEIGHT)/2, ssglStrWidth(Label().c_str(), DEFAULT_TEXT_HEIGHT)/2,
ssglStrHeight(DEFAULT_TEXT_HEIGHT)/2, ssglStrHeight(DEFAULT_TEXT_HEIGHT)/2,
tl); tl);
*ref = (*ref).Plus(rm.WithMagnitude(adj + 3/SS.GW.scale)); *ref = (*ref).Plus(rm.WithMagnitude(adj + 3/SS.GW.scale));

View File

@ -7,7 +7,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "solvespace.h" #include "solvespace.h"
char *Entity::DescriptionString(void) { std::string Entity::DescriptionString(void) {
if(h.isFromRequest()) { if(h.isFromRequest()) {
Request *r = SK.GetRequest(h.request()); Request *r = SK.GetRequest(h.request());
return r->DescriptionString(); return r->DescriptionString();
@ -446,7 +446,7 @@ void Entity::GenerateBezierCurves(SBezierList *sbl) {
Vector v = topLeft.Minus(botLeft); Vector v = topLeft.Minus(botLeft);
Vector u = (v.Cross(n)).WithMagnitude(v.Magnitude()); Vector u = (v.Cross(n)).WithMagnitude(v.Magnitude());
SS.fonts.PlotString(font.str, str.str, 0, sbl, botLeft, u, v); SS.fonts.PlotString(font.c_str(), str.c_str(), 0, sbl, botLeft, u, v);
break; break;
} }
@ -608,12 +608,12 @@ void Entity::DrawOrGetDistance(void) {
if(dogd.drawing) if(dogd.drawing)
glDisable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE);
char *str = DescriptionString()+5; std::string str = DescriptionString().substr(5);
double th = DEFAULT_TEXT_HEIGHT; double th = DEFAULT_TEXT_HEIGHT;
if(dogd.drawing) { if(dogd.drawing) {
ssglWriteText(str, th, mm2, u, v, NULL, NULL); ssglWriteText(str.c_str(), th, mm2, u, v, NULL, NULL);
} else { } else {
Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str, th)/2)).Plus( Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str.c_str(), th)/2)).Plus(
v.ScaledBy(ssglStrHeight(th)/2)); v.ScaledBy(ssglStrHeight(th)/2));
Point2d pp = SS.GW.ProjectPoint(pos); Point2d pp = SS.GW.ProjectPoint(pos);
dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10); dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10);

View File

@ -397,16 +397,6 @@ public:
}; };
class NameStr {
public:
char str[64];
inline void strcpy(const char *in) {
memcpy(str, in, min(strlen(in)+1, sizeof(str)));
str[sizeof(str)-1] = '\0';
}
};
class BandedMatrix { class BandedMatrix {
public: public:
enum { enum {

View File

@ -661,19 +661,19 @@ void GCodeFileWriter::FinishAndCloseFile(void) {
SPoint *pt = sc->l.First(); SPoint *pt = sc->l.First();
fprintf(f, "G00 X%s Y%s\r\n", fprintf(f, "G00 X%s Y%s\r\n",
SS.MmToString(pt->p.x), SS.MmToString(pt->p.y)); SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str());
fprintf(f, "G01 Z%s F%s\r\n", fprintf(f, "G01 Z%s F%s\r\n",
SS.MmToString(depth), SS.MmToString(SS.gCode.plungeFeed)); SS.MmToString(depth).c_str(), SS.MmToString(SS.gCode.plungeFeed).c_str());
pt = sc->l.NextAfter(pt); pt = sc->l.NextAfter(pt);
for(; pt; pt = sc->l.NextAfter(pt)) { for(; pt; pt = sc->l.NextAfter(pt)) {
fprintf(f, "G01 X%s Y%s F%s\r\n", fprintf(f, "G01 X%s Y%s F%s\r\n",
SS.MmToString(pt->p.x), SS.MmToString(pt->p.y), SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str(),
SS.MmToString(SS.gCode.feed)); SS.MmToString(SS.gCode.feed).c_str());
} }
// Move up to a clearance plane 5mm above the work. // Move up to a clearance plane 5mm above the work.
fprintf(f, "G00 Z%s\r\n", fprintf(f, "G00 Z%s\r\n",
SS.MmToString(SS.gCode.depth < 0 ? +5 : -5)); SS.MmToString(SS.gCode.depth < 0 ? +5 : -5).c_str());
} }
} }

View File

@ -547,47 +547,31 @@ hParam Expr::ReferencedParams(ParamList *pl) {
// Routines to pretty-print an expression. Mostly for debugging. // Routines to pretty-print an expression. Mostly for debugging.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static char StringBuffer[4096]; std::string Expr::Print(void) {
void Expr::App(const char *s, ...) {
va_list f;
va_start(f, s);
vsprintf(StringBuffer+strlen(StringBuffer), s, f);
}
const char *Expr::Print(void) {
if(!this) return "0"; if(!this) return "0";
StringBuffer[0] = '\0';
PrintW();
return StringBuffer;
}
void Expr::PrintW(void) {
char c; char c;
switch(op) { switch(op) {
case PARAM: App("param(%08x)", x.parh.v); break; case PARAM: return ssprintf("param(%08x)", x.parh.v);
case PARAM_PTR: App("param(p%08x)", x.parp->h.v); break; case PARAM_PTR: return ssprintf("param(p%08x)", x.parp->h.v);
case CONSTANT: App("%.3f", x.v); break; case CONSTANT: return ssprintf("%.3f", x.v);
case PLUS: c = '+'; goto p; case PLUS: c = '+'; goto p;
case MINUS: c = '-'; goto p; case MINUS: c = '-'; goto p;
case TIMES: c = '*'; goto p; case TIMES: c = '*'; goto p;
case DIV: c = '/'; goto p; case DIV: c = '/'; goto p;
p: p:
App("("); return "(" + a->Print() + " " + c + " " + b->Print() + ")";
a->PrintW();
App(" %c ", c);
b->PrintW();
App(")");
break; break;
case NEGATE: App("(- "); a->PrintW(); App(")"); break; case NEGATE: return "(- " + a->Print() + ")";
case SQRT: App("(sqrt "); a->PrintW(); App(")"); break; case SQRT: return "(sqrt " + a->Print() + ")";
case SQUARE: App("(square "); a->PrintW(); App(")"); break; case SQUARE: return "(square " + a->Print() + ")";
case SIN: App("(sin "); a->PrintW(); App(")"); break; case SIN: return "(sin " + a->Print() + ")";
case COS: App("(cos "); a->PrintW(); App(")"); break; case COS: return "(cos " + a->Print() + ")";
case ASIN: App("(asin "); a->PrintW(); App(")"); break; case ASIN: return "(asin " + a->Print() + ")";
case ACOS: App("(acos "); a->PrintW(); App(")"); break; case ACOS: return "(acos " + a->Print() + ")";
default: oops(); default: oops();
} }

View File

@ -65,7 +65,7 @@ public:
Expr() { } Expr() { }
Expr(double v) : op(CONSTANT) { x.v = v; } Expr(double v) : op(CONSTANT) { x.v = v; }
static inline Expr *AllocExpr(void) static inline Expr *AllocExpr(void)
{ return (Expr *)AllocTemporary(sizeof(Expr)); } { return (Expr *)AllocTemporary(sizeof(Expr)); }
@ -99,9 +99,7 @@ public:
void ParamsToPointers(void); void ParamsToPointers(void);
void App(const char *str, ...); std::string Print(void);
const char *Print(void);
void PrintW(void); // worker
// number of child nodes: 0 (e.g. constant), 1 (sqrt), or 2 (+) // number of child nodes: 0 (e.g. constant), 1 (sqrt), or 2 (+)
int Children(void); int Children(void);

View File

@ -44,7 +44,7 @@ hGroup SolveSpaceUI::CreateDefaultDrawingGroup(void) {
g.predef.q = Quaternion::From(1, 0, 0, 0); g.predef.q = Quaternion::From(1, 0, 0, 0);
hRequest hr = Request::HREQUEST_REFERENCE_XY; hRequest hr = Request::HREQUEST_REFERENCE_XY;
g.predef.origin = hr.entity(1); g.predef.origin = hr.entity(1);
g.name.strcpy("sketch-in-plane"); g.name = "sketch-in-plane";
SK.group.AddAndAssignId(&g); SK.group.AddAndAssignId(&g);
SK.GetGroup(g.h)->activeWorkplane = g.h.entity(0); SK.GetGroup(g.h)->activeWorkplane = g.h.entity(0);
return g.h; return g.h;
@ -56,7 +56,7 @@ void SolveSpaceUI::NewFile(void) {
// Our initial group, that contains the references. // Our initial group, that contains the references.
Group g = {}; Group g = {};
g.visible = true; g.visible = true;
g.name.strcpy("#references"); g.name = "#references";
g.type = Group::DRAWING_3D; g.type = Group::DRAWING_3D;
g.h = Group::HGROUP_REFERENCES; g.h = Group::HGROUP_REFERENCES;
SK.group.Add(&g); SK.group.Add(&g);
@ -84,7 +84,7 @@ const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
{ 'g', "Group.h.v", 'x', &(SS.sv.g.h.v) }, { 'g', "Group.h.v", 'x', &(SS.sv.g.h.v) },
{ 'g', "Group.type", 'd', &(SS.sv.g.type) }, { 'g', "Group.type", 'd', &(SS.sv.g.type) },
{ 'g', "Group.order", 'd', &(SS.sv.g.order) }, { 'g', "Group.order", 'd', &(SS.sv.g.order) },
{ 'g', "Group.name", 'N', &(SS.sv.g.name) }, { 'g', "Group.name", 'S', &(SS.sv.g.name) },
{ 'g', "Group.activeWorkplane.v", 'x', &(SS.sv.g.activeWorkplane.v) }, { 'g', "Group.activeWorkplane.v", 'x', &(SS.sv.g.activeWorkplane.v) },
{ 'g', "Group.opA.v", 'x', &(SS.sv.g.opA.v) }, { 'g', "Group.opA.v", 'x', &(SS.sv.g.opA.v) },
{ 'g', "Group.opB.v", 'x', &(SS.sv.g.opB.v) }, { 'g', "Group.opB.v", 'x', &(SS.sv.g.opB.v) },
@ -112,8 +112,8 @@ const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
{ 'g', "Group.allDimsReference", 'b', &(SS.sv.g.allDimsReference) }, { 'g', "Group.allDimsReference", 'b', &(SS.sv.g.allDimsReference) },
{ 'g', "Group.scale", 'f', &(SS.sv.g.scale) }, { 'g', "Group.scale", 'f', &(SS.sv.g.scale) },
{ 'g', "Group.remap", 'M', &(SS.sv.g.remap) }, { 'g', "Group.remap", 'M', &(SS.sv.g.remap) },
{ 'g', "Group.impFile", 'P', &(SS.sv.g.impFile) }, { 'g', "Group.impFile", 'S', &(SS.sv.g.impFile) },
{ 'g', "Group.impFileRel", 'P', &(SS.sv.g.impFileRel) }, { 'g', "Group.impFileRel", 'S', &(SS.sv.g.impFileRel) },
{ 'p', "Param.h.v.", 'x', &(SS.sv.p.h.v) }, { 'p', "Param.h.v.", 'x', &(SS.sv.p.h.v) },
{ 'p', "Param.val", 'f', &(SS.sv.p.val) }, { 'p', "Param.val", 'f', &(SS.sv.p.val) },
@ -125,15 +125,15 @@ const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
{ 'r', "Request.group.v", 'x', &(SS.sv.r.group.v) }, { 'r', "Request.group.v", 'x', &(SS.sv.r.group.v) },
{ 'r', "Request.construction", 'b', &(SS.sv.r.construction) }, { 'r', "Request.construction", 'b', &(SS.sv.r.construction) },
{ 'r', "Request.style", 'x', &(SS.sv.r.style) }, { 'r', "Request.style", 'x', &(SS.sv.r.style) },
{ 'r', "Request.str", 'N', &(SS.sv.r.str) }, { 'r', "Request.str", 'S', &(SS.sv.r.str) },
{ 'r', "Request.font", 'N', &(SS.sv.r.font) }, { 'r', "Request.font", 'S', &(SS.sv.r.font) },
{ 'e', "Entity.h.v", 'x', &(SS.sv.e.h.v) }, { 'e', "Entity.h.v", 'x', &(SS.sv.e.h.v) },
{ 'e', "Entity.type", 'd', &(SS.sv.e.type) }, { 'e', "Entity.type", 'd', &(SS.sv.e.type) },
{ 'e', "Entity.construction", 'b', &(SS.sv.e.construction) }, { 'e', "Entity.construction", 'b', &(SS.sv.e.construction) },
{ 'e', "Entity.style", 'x', &(SS.sv.e.style) }, { 'e', "Entity.style", 'x', &(SS.sv.e.style) },
{ 'e', "Entity.str", 'N', &(SS.sv.e.str) }, { 'e', "Entity.str", 'S', &(SS.sv.e.str) },
{ 'e', "Entity.font", 'N', &(SS.sv.e.font) }, { 'e', "Entity.font", 'S', &(SS.sv.e.font) },
{ 'e', "Entity.point[0].v", 'x', &(SS.sv.e.point[0].v) }, { 'e', "Entity.point[0].v", 'x', &(SS.sv.e.point[0].v) },
{ 'e', "Entity.point[1].v", 'x', &(SS.sv.e.point[1].v) }, { 'e', "Entity.point[1].v", 'x', &(SS.sv.e.point[1].v) },
{ 'e', "Entity.point[2].v", 'x', &(SS.sv.e.point[2].v) }, { 'e', "Entity.point[2].v", 'x', &(SS.sv.e.point[2].v) },
@ -175,14 +175,14 @@ const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
{ 'c', "Constraint.other", 'b', &(SS.sv.c.other) }, { 'c', "Constraint.other", 'b', &(SS.sv.c.other) },
{ 'c', "Constraint.other2", 'b', &(SS.sv.c.other2) }, { 'c', "Constraint.other2", 'b', &(SS.sv.c.other2) },
{ 'c', "Constraint.reference", 'b', &(SS.sv.c.reference) }, { 'c', "Constraint.reference", 'b', &(SS.sv.c.reference) },
{ 'c', "Constraint.comment", 'N', &(SS.sv.c.comment) }, { 'c', "Constraint.comment", 'S', &(SS.sv.c.comment) },
{ 'c', "Constraint.disp.offset.x", 'f', &(SS.sv.c.disp.offset.x) }, { 'c', "Constraint.disp.offset.x", 'f', &(SS.sv.c.disp.offset.x) },
{ 'c', "Constraint.disp.offset.y", 'f', &(SS.sv.c.disp.offset.y) }, { 'c', "Constraint.disp.offset.y", 'f', &(SS.sv.c.disp.offset.y) },
{ 'c', "Constraint.disp.offset.z", 'f', &(SS.sv.c.disp.offset.z) }, { 'c', "Constraint.disp.offset.z", 'f', &(SS.sv.c.disp.offset.z) },
{ 'c', "Constraint.disp.style", 'x', &(SS.sv.c.disp.style) }, { 'c', "Constraint.disp.style", 'x', &(SS.sv.c.disp.style) },
{ 's', "Style.h.v", 'x', &(SS.sv.s.h.v) }, { 's', "Style.h.v", 'x', &(SS.sv.s.h.v) },
{ 's', "Style.name", 'N', &(SS.sv.s.name) }, { 's', "Style.name", 'S', &(SS.sv.s.name) },
{ 's', "Style.width", 'f', &(SS.sv.s.width) }, { 's', "Style.width", 'f', &(SS.sv.s.width) },
{ 's', "Style.widthAs", 'd', &(SS.sv.s.widthAs) }, { 's', "Style.widthAs", 'd', &(SS.sv.s.widthAs) },
{ 's', "Style.textHeight", 'f', &(SS.sv.s.textHeight) }, { 's', "Style.textHeight", 'f', &(SS.sv.s.textHeight) },
@ -200,8 +200,7 @@ const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
union SAVEDptr { union SAVEDptr {
IdList<EntityMap,EntityId> M; IdList<EntityMap,EntityId> M;
NameStr N; /* std::string S; */
/* std::string P */
bool b; bool b;
RgbaColor c; RgbaColor c;
int d; int d;
@ -217,15 +216,14 @@ void SolveSpaceUI::SaveUsingTable(int type) {
int fmt = SAVED[i].fmt; int fmt = SAVED[i].fmt;
union SAVEDptr *p = (union SAVEDptr *)SAVED[i].ptr; union SAVEDptr *p = (union SAVEDptr *)SAVED[i].ptr;
// Any items that aren't specified are assumed to be zero // Any items that aren't specified are assumed to be zero
if(fmt == 'N' && p->N.str[0] == '\0') continue; if(fmt == 'S' && ((std::string*)p)->empty()) continue;
if(fmt == 'd' && p->d == 0) continue; if(fmt == 'd' && p->d == 0) continue;
if(fmt == 'f' && EXACT(p->f == 0.0)) continue; if(fmt == 'f' && EXACT(p->f == 0.0)) continue;
if(fmt == 'x' && p->x == 0) continue; if(fmt == 'x' && p->x == 0) continue;
fprintf(fh, "%s=", SAVED[i].desc); fprintf(fh, "%s=", SAVED[i].desc);
switch(fmt) { switch(fmt) {
case 'N': fprintf(fh, "%s", p->N.str); break; case 'S': fprintf(fh, "%s", ((std::string*)p)->c_str()); break;
case 'P': fprintf(fh, "%s", ((std::string*)p)->c_str()); break;
case 'b': fprintf(fh, "%d", p->b ? 1 : 0); break; case 'b': fprintf(fh, "%d", p->b ? 1 : 0); break;
case 'c': fprintf(fh, "%08x", p->c.ToPackedInt()); break; case 'c': fprintf(fh, "%08x", p->c.ToPackedInt()); break;
case 'd': fprintf(fh, "%d", p->d); break; case 'd': fprintf(fh, "%d", p->d); break;
@ -373,7 +371,7 @@ void SolveSpaceUI::LoadUsingTable(char *key, char *val) {
union SAVEDptr *p = (union SAVEDptr *)SAVED[i].ptr; union SAVEDptr *p = (union SAVEDptr *)SAVED[i].ptr;
unsigned int u = 0; unsigned int u = 0;
switch(SAVED[i].fmt) { switch(SAVED[i].fmt) {
case 'N': p->N.strcpy(val); break; case 'S': (*(std::string*)p) = val; break;
case 'b': p->b = (atoi(val) != 0); break; case 'b': p->b = (atoi(val) != 0); break;
case 'd': p->d = atoi(val); break; case 'd': p->d = atoi(val); break;
case 'f': p->f = atof(val); break; case 'f': p->f = atof(val); break;

View File

@ -66,12 +66,12 @@ void Group::MenuGroup(int id) {
switch(id) { switch(id) {
case GraphicsWindow::MNU_GROUP_3D: case GraphicsWindow::MNU_GROUP_3D:
g.type = DRAWING_3D; g.type = DRAWING_3D;
g.name.strcpy("sketch-in-3d"); g.name = "sketch-in-3d";
break; break;
case GraphicsWindow::MNU_GROUP_WRKPL: case GraphicsWindow::MNU_GROUP_WRKPL:
g.type = DRAWING_WORKPLANE; g.type = DRAWING_WORKPLANE;
g.name.strcpy("sketch-in-plane"); g.name = "sketch-in-plane";
if(gs.points == 1 && gs.n == 1) { if(gs.points == 1 && gs.n == 1) {
g.subtype = WORKPLANE_BY_POINT_ORTHO; g.subtype = WORKPLANE_BY_POINT_ORTHO;
@ -122,7 +122,7 @@ void Group::MenuGroup(int id) {
g.opA = SS.GW.activeGroup; g.opA = SS.GW.activeGroup;
g.predef.entityB = SS.GW.ActiveWorkplane(); g.predef.entityB = SS.GW.ActiveWorkplane();
g.subtype = ONE_SIDED; g.subtype = ONE_SIDED;
g.name.strcpy("extrude"); g.name = "extrude";
break; break;
case GraphicsWindow::MNU_GROUP_LATHE: case GraphicsWindow::MNU_GROUP_LATHE:
@ -144,7 +144,7 @@ void Group::MenuGroup(int id) {
} }
g.type = LATHE; g.type = LATHE;
g.opA = SS.GW.activeGroup; g.opA = SS.GW.activeGroup;
g.name.strcpy("lathe"); g.name = "lathe";
break; break;
case GraphicsWindow::MNU_GROUP_ROT: { case GraphicsWindow::MNU_GROUP_ROT: {
@ -170,7 +170,7 @@ void Group::MenuGroup(int id) {
g.opA = SS.GW.activeGroup; g.opA = SS.GW.activeGroup;
g.valA = 3; g.valA = 3;
g.subtype = ONE_SIDED; g.subtype = ONE_SIDED;
g.name.strcpy("rotate"); g.name = "rotate";
break; break;
} }
@ -181,7 +181,7 @@ void Group::MenuGroup(int id) {
g.subtype = ONE_SIDED; g.subtype = ONE_SIDED;
g.predef.entityB = SS.GW.ActiveWorkplane(); g.predef.entityB = SS.GW.ActiveWorkplane();
g.activeWorkplane = SS.GW.ActiveWorkplane(); g.activeWorkplane = SS.GW.ActiveWorkplane();
g.name.strcpy("translate"); g.name = "translate";
break; break;
case GraphicsWindow::MNU_GROUP_IMPORT: { case GraphicsWindow::MNU_GROUP_IMPORT: {
@ -212,9 +212,9 @@ void Group::MenuGroup(int id) {
} }
if(groupName.length() > 0) { if(groupName.length() > 0) {
g.name.strcpy(groupName.substr(0, 64).c_str()); g.name = groupName;
} else { } else {
g.name.strcpy("import"); g.name = "import";
} }
g.meshCombine = COMBINE_AS_ASSEMBLE; g.meshCombine = COMBINE_AS_ASSEMBLE;
@ -274,14 +274,12 @@ void Group::TransformImportedBy(Vector t, Quaternion q) {
SK.GetParam(qz)->val = qg.vz; SK.GetParam(qz)->val = qg.vz;
} }
char *Group::DescriptionString(void) { std::string Group::DescriptionString(void) {
static char ret[100]; if(name.empty()) {
if(name.str[0]) { return ssprintf("g%03x-(unnamed)", h.v);
sprintf(ret, "g%03x-%s", h.v, name.str);
} else { } else {
sprintf(ret, "g%03x-(unnamed)", h.v); return ssprintf("g%03x-%s", h.v, name.c_str());
} }
return ret;
} }
void Group::Activate(void) { void Group::Activate(void) {
@ -636,8 +634,8 @@ void Group::CopyEntity(IdList<Entity,hEntity> *el,
en.group = h; en.group = h;
en.construction = ep->construction; en.construction = ep->construction;
en.style = ep->style; en.style = ep->style;
en.str.strcpy(ep->str.str); en.str = ep->str;
en.font.strcpy(ep->font.str); en.font = ep->font;
switch(ep->type) { switch(ep->type) {
case Entity::WORKPLANE: case Entity::WORKPLANE:

View File

@ -387,7 +387,7 @@ public:
connect(sigc::mem_fun(this, &EditorOverlay::on_activate)); connect(sigc::mem_fun(this, &EditorOverlay::on_activate));
} }
void start_editing(int x, int y, const char *val) { void start_editing(int x, int y, const std::string &val) {
move(_entry, x, y - 4); move(_entry, x, y - 4);
_entry.set_text(val); _entry.set_text(val);
if(!_entry.is_visible()) { if(!_entry.is_visible()) {
@ -720,7 +720,7 @@ bool FullScreenIsActive(void) {
return GW->is_fullscreen(); return GW->is_fullscreen();
} }
void ShowGraphicsEditControl(int x, int y, char *val) { void ShowGraphicsEditControl(int x, int y, const std::string &val) {
Gdk::Rectangle rect = GW->get_widget().get_allocation(); Gdk::Rectangle rect = GW->get_widget().get_allocation();
// Convert to ij (vs. xy) style coordinates, // Convert to ij (vs. xy) style coordinates,
@ -1378,7 +1378,7 @@ void SetMousePointerToHand(bool is_hand) {
TW->get_widget().set_cursor_hand(is_hand); TW->get_widget().set_cursor_hand(is_hand);
} }
void ShowTextEditControl(int x, int y, char *val) { void ShowTextEditControl(int x, int y, const std::string &val) {
TW->get_overlay().start_editing(x, y, val); TW->get_overlay().start_editing(x, y, val);
} }

View File

@ -476,7 +476,7 @@ void GraphicsWindow::ContextMenuListStyles(void) {
for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) { for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) {
if(s->h.v < Style::FIRST_CUSTOM) continue; if(s->h.v < Style::FIRST_CUSTOM) continue;
AddContextMenuItem(s->DescriptionString(), CMNU_FIRST_STYLE + s->h.v); AddContextMenuItem(s->DescriptionString().c_str(), CMNU_FIRST_STYLE + s->h.v);
empty = false; empty = false;
} }
@ -933,8 +933,8 @@ void GraphicsWindow::MouseLeftDown(double mx, double my) {
} }
hr = AddRequest(Request::TTF_TEXT); hr = AddRequest(Request::TTF_TEXT);
Request *r = SK.GetRequest(hr); Request *r = SK.GetRequest(hr);
r->str.strcpy("Abc"); r->str = "Abc";
r->font.strcpy("arial.ttf"); r->font = "arial.ttf";
SK.GetEntity(hr.entity(1))->PointForceTo(v); SK.GetEntity(hr.entity(1))->PointForceTo(v);
SK.GetEntity(hr.entity(2))->PointForceTo(v); SK.GetEntity(hr.entity(2))->PointForceTo(v);
@ -952,7 +952,7 @@ void GraphicsWindow::MouseLeftDown(double mx, double my) {
c.workplane = SS.GW.ActiveWorkplane(); c.workplane = SS.GW.ActiveWorkplane();
c.type = Constraint::COMMENT; c.type = Constraint::COMMENT;
c.disp.offset = v; c.disp.offset = v;
c.comment.strcpy("NEW COMMENT -- DOUBLE-CLICK TO EDIT"); c.comment = "NEW COMMENT -- DOUBLE-CLICK TO EDIT";
Constraint::AddConstraint(&c); Constraint::AddConstraint(&c);
break; break;
} }
@ -1145,16 +1145,16 @@ void GraphicsWindow::MouseLeftDoubleClick(double mx, double my) {
Vector p3 = c->GetLabelPos(); Vector p3 = c->GetLabelPos();
Point2d p2 = ProjectPoint(p3); Point2d p2 = ProjectPoint(p3);
char s[1024]; std::string edit_value;
switch(c->type) { switch(c->type) {
case Constraint::COMMENT: case Constraint::COMMENT:
strcpy(s, c->comment.str); edit_value = c->comment;
break; break;
case Constraint::ANGLE: case Constraint::ANGLE:
case Constraint::LENGTH_RATIO: case Constraint::LENGTH_RATIO:
case Constraint::LENGTH_DIFFERENCE: case Constraint::LENGTH_DIFFERENCE:
sprintf(s, "%.3f", c->valA); edit_value = ssprintf("%.3f", c->valA);
break; break;
default: { default: {
@ -1164,26 +1164,26 @@ void GraphicsWindow::MouseLeftDoubleClick(double mx, double my) {
if(c->type == Constraint::DIAMETER && c->other) if(c->type == Constraint::DIAMETER && c->other)
v /= 2; v /= 2;
char *def = SS.MmToString(v); std::string def = SS.MmToString(v);
double eps = 1e-12; double eps = 1e-12;
if(fabs(SS.StringToMm(def) - v) < eps) { if(fabs(SS.StringToMm(def) - v) < eps) {
// Show value with default number of digits after decimal, // Show value with default number of digits after decimal,
// which is at least enough to represent it exactly. // which is at least enough to represent it exactly.
strcpy(s, def); edit_value = def;
} else { } else {
// Show value with as many digits after decimal as // Show value with as many digits after decimal as
// required to represent it exactly, up to 10. // required to represent it exactly, up to 10.
v /= SS.MmPerUnit(); v /= SS.MmPerUnit();
int i; int i;
for(i = 0; i <= 10; i++) { for(i = 0; i <= 10; i++) {
sprintf(s, "%.*f", i, v); edit_value = ssprintf("%.*f", i, v);
if(fabs(atof(s) - v) < eps) break; if(fabs(std::stod(edit_value) - v) < eps) break;
} }
} }
break; break;
} }
} }
ShowGraphicsEditControl((int)p2.x, (int)p2.y-4, s); ShowGraphicsEditControl((int)p2.x, (int)p2.y-4, edit_value);
} }
} }
@ -1193,7 +1193,7 @@ void GraphicsWindow::EditControlDone(const char *s) {
if(c->type == Constraint::COMMENT) { if(c->type == Constraint::COMMENT) {
SS.UndoRemember(); SS.UndoRemember();
c->comment.strcpy(s); c->comment = s;
return; return;
} }

View File

@ -102,8 +102,8 @@ void Request::Generate(IdList<Entity,hEntity> *entity,
e.style = style; e.style = style;
e.workplane = workplane; e.workplane = workplane;
e.construction = construction; e.construction = construction;
e.str.strcpy(str.str); e.str = str;
e.font.strcpy(font.str); e.font = font;
e.h = h.entity(0); e.h = h.entity(0);
// And generate entities for the points // And generate entities for the points
@ -169,7 +169,7 @@ void Request::Generate(IdList<Entity,hEntity> *entity,
if(et) entity->Add(&e); if(et) entity->Add(&e);
} }
char *Request::DescriptionString(void) { std::string Request::DescriptionString(void) {
const char *s; const char *s;
if(h.v == Request::HREQUEST_REFERENCE_XY.v) { if(h.v == Request::HREQUEST_REFERENCE_XY.v) {
s = "#XY"; s = "#XY";
@ -180,9 +180,8 @@ char *Request::DescriptionString(void) {
} else { } else {
s = EntReqTable::DescriptionForRequest(type); s = EntReqTable::DescriptionForRequest(type);
} }
static char ret[100];
sprintf(ret, "r%03x-%s", h.v, s); return ssprintf("r%03x-%s", h.v, s);
return ret;
} }
hParam Request::AddParam(IdList<Param,hParam> *param, hParam hp) { hParam Request::AddParam(IdList<Param,hParam> *param, hParam hp) {

View File

@ -195,11 +195,11 @@ public:
SShell impShell; SShell impShell;
EntityList impEntity; EntityList impEntity;
NameStr name; std::string name;
void Activate(void); void Activate(void);
char *DescriptionString(void); std::string DescriptionString(void);
void Clear(void); void Clear(void);
static void AddParam(ParamList *param, hParam hp, double v); static void AddParam(ParamList *param, hParam hp, double v);
@ -284,13 +284,13 @@ public:
hStyle style; hStyle style;
bool construction; bool construction;
NameStr str; std::string str;
NameStr font; std::string font;
static hParam AddParam(ParamList *param, hParam hp); static hParam AddParam(ParamList *param, hParam hp);
void Generate(EntityList *entity, ParamList *param); void Generate(EntityList *entity, ParamList *param);
char *DescriptionString(void); std::string DescriptionString(void);
void Clear(void) {} void Clear(void) {}
}; };
@ -357,8 +357,8 @@ public:
Quaternion numNormal; Quaternion numNormal;
double numDistance; double numDistance;
NameStr str; std::string str;
NameStr font; std::string font;
// For entities that are derived by a transformation, the number of // For entities that are derived by a transformation, the number of
// times to apply the transformation. // times to apply the transformation.
@ -491,7 +491,7 @@ public:
void CalculateNumerical(bool forExport); void CalculateNumerical(bool forExport);
char *DescriptionString(void); std::string DescriptionString(void);
}; };
class EntReqTable { class EntReqTable {
@ -606,7 +606,7 @@ public:
bool other2; bool other2;
bool reference; // a ref dimension, that generates no eqs bool reference; // a ref dimension, that generates no eqs
NameStr comment; // since comments are represented as constraints std::string comment; // since comments are represented as constraints
bool HasLabel(void); bool HasLabel(void);
@ -654,7 +654,7 @@ public:
void LineDrawOrGetDistance(Vector a, Vector b); void LineDrawOrGetDistance(Vector a, Vector b);
void DrawOrGetDistance(Vector *labelPos); void DrawOrGetDistance(Vector *labelPos);
double EllipticalInterpolation(double rx, double ry, double theta); double EllipticalInterpolation(double rx, double ry, double theta);
char *Label(void); std::string Label(void);
void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db, void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
Vector offset, Vector *ref); Vector offset, Vector *ref);
void DoLineWithArrows(Vector ref, Vector a, Vector b, bool onlyOneExt); void DoLineWithArrows(Vector ref, Vector a, Vector b, bool onlyOneExt);
@ -665,7 +665,7 @@ public:
void DoEqualLenTicks(Vector a, Vector b, Vector gn); void DoEqualLenTicks(Vector a, Vector b, Vector gn);
void DoEqualRadiusTicks(hEntity he); void DoEqualRadiusTicks(hEntity he);
char *DescriptionString(void); std::string DescriptionString(void);
static void AddConstraint(Constraint *c, bool rememberForUndo); static void AddConstraint(Constraint *c, bool rememberForUndo);
static void AddConstraint(Constraint *c); static void AddConstraint(Constraint *c);
@ -726,7 +726,7 @@ public:
FIRST_CUSTOM = 0x100 FIRST_CUSTOM = 0x100
}; };
NameStr name; std::string name;
enum { enum {
UNITS_AS_PIXELS = 0, UNITS_AS_PIXELS = 0,
@ -760,9 +760,9 @@ public:
} Default; } Default;
static const Default Defaults[]; static const Default Defaults[];
static char *CnfColor(const char *prefix); static std::string CnfColor(const std::string &prefix);
static char *CnfWidth(const char *prefix); static std::string CnfWidth(const std::string &prefix);
static char *CnfPrefixToName(const char *prefix); static std::string CnfPrefixToName(const std::string &prefix);
static void CreateAllDefaultStyles(void); static void CreateAllDefaultStyles(void);
static void CreateDefaultStyle(hStyle h); static void CreateDefaultStyle(hStyle h);
@ -785,7 +785,7 @@ public:
static bool Exportable(int hs); static bool Exportable(int hs);
static hStyle ForEntity(hEntity he); static hStyle ForEntity(hEntity he);
char *DescriptionString(void); std::string DescriptionString(void);
void Clear(void) {} void Clear(void) {}
}; };
@ -836,8 +836,8 @@ public:
int type; int type;
int extraPoints; int extraPoints;
hStyle style; hStyle style;
NameStr str; std::string str;
NameStr font; std::string font;
bool construction; bool construction;
Vector point[MAX_POINTS_IN_ENTITY]; Vector point[MAX_POINTS_IN_ENTITY];

View File

@ -242,26 +242,18 @@ const char *SolveSpaceUI::UnitName(void) {
return "mm"; return "mm";
} }
} }
char *SolveSpaceUI::MmToString(double v) { std::string SolveSpaceUI::MmToString(double v) {
static int WhichBuf;
static char Bufs[8][128];
WhichBuf++;
if(WhichBuf >= 8 || WhichBuf < 0) WhichBuf = 0;
char *s = Bufs[WhichBuf];
if(viewUnits == UNIT_INCHES) { if(viewUnits == UNIT_INCHES) {
sprintf(s, "%.*f", afterDecimalInch, v/25.4); return ssprintf("%.*f", afterDecimalInch, v/25.4);
} else { } else {
sprintf(s, "%.*f", afterDecimalMm, v); return ssprintf("%.*f", afterDecimalMm, v);
} }
return s;
} }
double SolveSpaceUI::ExprToMm(Expr *e) { double SolveSpaceUI::ExprToMm(Expr *e) {
return (e->Eval()) * MmPerUnit(); return (e->Eval()) * MmPerUnit();
} }
double SolveSpaceUI::StringToMm(const char *str) { double SolveSpaceUI::StringToMm(const std::string &str) {
return atof(str) * MmPerUnit(); return std::stod(str) * MmPerUnit();
} }
double SolveSpaceUI::ChordTolMm(void) { double SolveSpaceUI::ChordTolMm(void) {
return SS.chordTol / SS.GW.scale; return SS.chordTol / SS.GW.scale;

View File

@ -65,6 +65,11 @@ using std::min;
using std::max; using std::max;
using std::swap; using std::swap;
#if defined(__GNUC__)
__attribute__((__format__ (__printf__, 1, 2)))
#endif
std::string ssprintf(const char *fmt, ...);
inline int WRAP(int v, int n) { inline int WRAP(int v, int n) {
// Clamp it to the range [0, n) // Clamp it to the range [0, n)
while(v >= n) v -= n; while(v >= n) v -= n;
@ -220,10 +225,10 @@ void CheckMenuById(int id, bool checked);
void RadioMenuById(int id, bool selected); void RadioMenuById(int id, bool selected);
void EnableMenuById(int id, bool enabled); void EnableMenuById(int id, bool enabled);
void ShowGraphicsEditControl(int x, int y, char *s); void ShowGraphicsEditControl(int x, int y, const std::string &str);
void HideGraphicsEditControl(void); void HideGraphicsEditControl(void);
bool GraphicsEditControlIsVisible(void); bool GraphicsEditControlIsVisible(void);
void ShowTextEditControl(int x, int y, char *s); void ShowTextEditControl(int x, int y, const std::string &str);
void HideTextEditControl(void); void HideTextEditControl(void);
bool TextEditControlIsVisible(void); bool TextEditControlIsVisible(void);
void MoveTextScrollbarTo(int pos, int maxPos, int page); void MoveTextScrollbarTo(int pos, int maxPos, int page);
@ -462,7 +467,7 @@ public:
} IntPoint; } IntPoint;
std::string fontFile; std::string fontFile;
NameStr name; std::string name;
bool loaded; bool loaded;
// The font itself, plus the mapping from ASCII codes to glyphs // The font itself, plus the mapping from ASCII codes to glyphs
@ -502,7 +507,7 @@ public:
void Flush(void); void Flush(void);
void Handle(int *dx, int x, int y, bool onCurve); void Handle(int *dx, int x, int y, bool onCurve);
void PlotCharacter(int *dx, int c, double spacing); void PlotCharacter(int *dx, int c, double spacing);
void PlotString(char *str, double spacing, void PlotString(const char *str, double spacing,
SBezierList *sbl, Vector origin, Vector u, Vector v); SBezierList *sbl, Vector origin, Vector u, Vector v);
Vector TransformIntPoint(int x, int y); Vector TransformIntPoint(int x, int y);
@ -517,7 +522,7 @@ public:
void LoadAll(void); void LoadAll(void);
void PlotString(const std::string &font, char *str, double spacing, void PlotString(const std::string &font, const char *str, double spacing,
SBezierList *sbl, Vector origin, Vector u, Vector v); SBezierList *sbl, Vector origin, Vector u, Vector v);
}; };
@ -785,9 +790,9 @@ public:
int afterDecimalInch; int afterDecimalInch;
int autosaveInterval; // in minutes int autosaveInterval; // in minutes
char *MmToString(double v); std::string MmToString(double v);
double ExprToMm(Expr *e); double ExprToMm(Expr *e);
double StringToMm(const char *s); double StringToMm(const std::string &s);
const char *UnitName(void); const char *UnitName(void);
double MmPerUnit(void); double MmPerUnit(void);
int UnitDigitsAfterDecimal(void); int UnitDigitsAfterDecimal(void);

View File

@ -25,30 +25,22 @@ const Style::Default Style::Defaults[] = {
{ { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0 } { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0 }
}; };
char *Style::CnfColor(const char *prefix) { std::string Style::CnfColor(const std::string &prefix) {
static char name[100]; return "Style_" + prefix + "_Color";
sprintf(name, "Style_%s_Color", prefix);
return name;
} }
char *Style::CnfWidth(const char *prefix) { std::string Style::CnfWidth(const std::string &prefix) {
static char name[100]; return "Style_" + prefix + "_Width";
sprintf(name, "Style_%s_Width", prefix);
return name;
} }
char *Style::CnfPrefixToName(const char *prefix) { std::string Style::CnfPrefixToName(const std::string &prefix) {
static char name[100]; std::string name = "#def-";
int i = 0, j;
strcpy(name, "#def-"); for(int i = 0; i < prefix.length(); i++) {
j = 5; if(isupper(prefix[i]) && i != 0)
while(prefix[i] && j < 90) { name += '-';
if(isupper(prefix[i]) && i != 0) { name += tolower(prefix[i]);
name[j++] = '-';
}
name[j++] = (char)tolower(prefix[i]);
i++;
} }
name[j++] = '\0';
return name; return name;
} }
@ -86,9 +78,9 @@ void Style::CreateDefaultStyle(hStyle h) {
ns.fillColor = RGBf(0.3, 0.3, 0.3); ns.fillColor = RGBf(0.3, 0.3, 0.3);
ns.h = h; ns.h = h;
if(isDefaultStyle) { if(isDefaultStyle) {
ns.name.strcpy(CnfPrefixToName(d->cnfPrefix)); ns.name = CnfPrefixToName(d->cnfPrefix);
} else { } else {
ns.name.strcpy("new-custom-style"); ns.name = "new-custom-style";
} }
SK.style.Add(&ns); SK.style.Add(&ns);
@ -110,7 +102,7 @@ void Style::LoadFactoryDefaults(void) {
s->exportable = true; s->exportable = true;
s->filled = false; s->filled = false;
s->fillColor = RGBf(0.3, 0.3, 0.3); s->fillColor = RGBf(0.3, 0.3, 0.3);
s->name.strcpy(CnfPrefixToName(d->cnfPrefix)); s->name = CnfPrefixToName(d->cnfPrefix);
} }
SS.backgroundColor = RGBi(0, 0, 0); SS.backgroundColor = RGBi(0, 0, 0);
if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile); if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile);
@ -319,14 +311,12 @@ hStyle Style::ForEntity(hEntity he) {
return hs; return hs;
} }
char *Style::DescriptionString(void) { std::string Style::DescriptionString(void) {
static char ret[100]; if(name.empty()) {
if(name.str[0]) { return ssprintf("s%03x-(unnamed)", h.v);
sprintf(ret, "s%03x-%s", h.v, name.str);
} else { } else {
sprintf(ret, "s%03x-(unnamed)", h.v); return ssprintf("s%03x-%s", h.v, name.c_str());
} }
return ret;
} }
@ -444,7 +434,7 @@ void TextWindow::ShowListOfStyles(void) {
&s->color, &s->color,
darkbg ? 'd' : 'a', darkbg ? 'd' : 'a',
ScreenShowStyleInfo, s->h.v, ScreenShowStyleInfo, s->h.v,
s->DescriptionString()); s->DescriptionString().c_str());
darkbg = !darkbg; darkbg = !darkbg;
} }
@ -488,7 +478,7 @@ void TextWindow::ShowListOfStyles(void) {
void TextWindow::ScreenChangeStyleName(int link, uint32_t v) { void TextWindow::ScreenChangeStyleName(int link, uint32_t v) {
hStyle hs = { v }; hStyle hs = { v };
Style *s = Style::Get(hs); Style *s = Style::Get(hs);
SS.TW.ShowEditControl(10, 12, s->name.str); SS.TW.ShowEditControl(10, 12, s->name.c_str());
SS.TW.edit.style = hs; SS.TW.edit.style = hs;
SS.TW.edit.meaning = EDIT_STYLE_NAME; SS.TW.edit.meaning = EDIT_STYLE_NAME;
} }
@ -512,11 +502,11 @@ void TextWindow::ScreenChangeStyleWidthOrTextHeight(int link, uint32_t v) {
double val = (link == 't') ? s->textHeight : s->width; double val = (link == 't') ? s->textHeight : s->width;
int units = (link == 't') ? s->textHeightAs : s->widthAs; int units = (link == 't') ? s->textHeightAs : s->widthAs;
char str[300]; std::string edit_value;
if(units == Style::UNITS_AS_PIXELS) { if(units == Style::UNITS_AS_PIXELS) {
sprintf(str, "%.2f", val); edit_value = ssprintf("%.2f", val);
} else { } else {
strcpy(str, SS.MmToString(val)); edit_value = SS.MmToString(val);
} }
int row = 0, col = 9; int row = 0, col = 9;
if(link == 'w') { if(link == 'w') {
@ -527,7 +517,7 @@ void TextWindow::ScreenChangeStyleWidthOrTextHeight(int link, uint32_t v) {
row = 33; // text height (for custom styles only) row = 33; // text height (for custom styles only)
col++; col++;
} }
SS.TW.ShowEditControl(row, col, str); SS.TW.ShowEditControl(row, col, edit_value);
SS.TW.edit.style = hs; SS.TW.edit.style = hs;
SS.TW.edit.meaning = (link == 't') ? EDIT_STYLE_TEXT_HEIGHT : SS.TW.edit.meaning = (link == 't') ? EDIT_STYLE_TEXT_HEIGHT :
EDIT_STYLE_WIDTH; EDIT_STYLE_WIDTH;
@ -536,9 +526,7 @@ void TextWindow::ScreenChangeStyleWidthOrTextHeight(int link, uint32_t v) {
void TextWindow::ScreenChangeStyleTextAngle(int link, uint32_t v) { void TextWindow::ScreenChangeStyleTextAngle(int link, uint32_t v) {
hStyle hs = { v }; hStyle hs = { v };
Style *s = Style::Get(hs); Style *s = Style::Get(hs);
char str[300]; SS.TW.ShowEditControl(37, 9, ssprintf("%.2f", s->textAngle));
sprintf(str, "%.2f", s->textAngle);
SS.TW.ShowEditControl(37, 9, str);
SS.TW.edit.style = hs; SS.TW.edit.style = hs;
SS.TW.edit.meaning = EDIT_STYLE_TEXT_ANGLE; SS.TW.edit.meaning = EDIT_STYLE_TEXT_ANGLE;
} }
@ -700,7 +688,7 @@ bool TextWindow::EditControlDoneForStyles(const char *str) {
} else { } else {
SS.UndoRemember(); SS.UndoRemember();
s = Style::Get(edit.style); s = Style::Get(edit.style);
s->name.strcpy(str); s->name = str;
} }
break; break;
@ -727,11 +715,11 @@ void TextWindow::ShowStyleInfo(void) {
Style *s = Style::Get(shown.style); Style *s = Style::Get(shown.style);
if(s->h.v < Style::FIRST_CUSTOM) { if(s->h.v < Style::FIRST_CUSTOM) {
Printf(true, "%FtSTYLE %E%s ", s->DescriptionString()); Printf(true, "%FtSTYLE %E%s ", s->DescriptionString().c_str());
} else { } else {
Printf(true, "%FtSTYLE %E%s " Printf(true, "%FtSTYLE %E%s "
"[%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]", "[%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]",
s->DescriptionString(), s->DescriptionString().c_str(),
s->h.v, &ScreenChangeStyleName, s->h.v, &ScreenChangeStyleName,
s->h.v, &ScreenDeleteStyle); s->h.v, &ScreenDeleteStyle);
} }
@ -750,7 +738,7 @@ void TextWindow::ShowStyleInfo(void) {
(s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W'); (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W');
} else { } else {
Printf(false, " %Ftwidth%E %s %D%f%Lp%Fl[change]%E", Printf(false, " %Ftwidth%E %s %D%f%Lp%Fl[change]%E",
SS.MmToString(s->width), SS.MmToString(s->width).c_str(),
s->h.v, &ScreenChangeStyleWidthOrTextHeight, s->h.v, &ScreenChangeStyleWidthOrTextHeight,
(s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W'); (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W');
} }
@ -797,7 +785,7 @@ void TextWindow::ShowStyleInfo(void) {
chng); chng);
} else { } else {
Printf(false, "%Ba %Ftheight %E%s %D%f%Lt%Fl%s%E", Printf(false, "%Ba %Ftheight %E%s %D%f%Lt%Fl%s%E",
SS.MmToString(s->textHeight), SS.MmToString(s->textHeight).c_str(),
s->h.v, &ScreenChangeStyleWidthOrTextHeight, s->h.v, &ScreenChangeStyleWidthOrTextHeight,
chng); chng);
} }

View File

@ -16,21 +16,22 @@ void TextWindow::ScreenHome(int link, uint32_t v) {
void TextWindow::ShowHeader(bool withNav) { void TextWindow::ShowHeader(bool withNav) {
ClearScreen(); ClearScreen();
char cd[1024], cd2[1024]; const char *header;
std::string desc;
if(SS.GW.LockedInWorkplane()) { if(SS.GW.LockedInWorkplane()) {
sprintf(cd, "in plane: "); header = "in plane: ";
strcpy(cd2, SK.GetEntity(SS.GW.ActiveWorkplane())->DescriptionString()); desc = SK.GetEntity(SS.GW.ActiveWorkplane())->DescriptionString();
} else { } else {
sprintf(cd, "drawing / constraining in 3d"); header = "drawing / constraining in 3d";
strcpy(cd2, ""); desc = "";
} }
// Navigation buttons // Navigation buttons
if(withNav) { if(withNav) {
Printf(false, " %Fl%Lh%fhome%E %Ft%s%E%s", Printf(false, " %Fl%Lh%fhome%E %Ft%s%E%s",
(&TextWindow::ScreenHome), cd, cd2); (&TextWindow::ScreenHome), header, desc.c_str());
} else { } else {
Printf(false, " %Ft%s%E%s", cd, cd2); Printf(false, " %Ft%s%E%s", header, desc.c_str());
} }
// Leave space for the icons that are painted here. // Leave space for the icons that are painted here.
@ -108,7 +109,7 @@ void TextWindow::ShowListOfGroups(void) {
bool afterActive = false; bool afterActive = false;
for(i = 0; i < SK.group.n; i++) { for(i = 0; i < SK.group.n; i++) {
Group *g = &(SK.group.elem[i]); Group *g = &(SK.group.elem[i]);
char *s = g->DescriptionString(); std::string s = g->DescriptionString();
bool active = (g->h.v == SS.GW.activeGroup.v); bool active = (g->h.v == SS.GW.activeGroup.v);
bool shown = g->visible; bool shown = g->visible;
bool ok = (g->solved.how == System::SOLVED_OKAY); bool ok = (g->solved.how == System::SOLVED_OKAY);
@ -133,7 +134,7 @@ void TextWindow::ShowListOfGroups(void) {
ok ? "ok" : "", ok ? "ok" : "",
ok ? "" : "NO", ok ? "" : "NO",
// Link to a screen that gives more details on the group // Link to a screen that gives more details on the group
g->h.v, (&TextWindow::ScreenSelectGroup), s); g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str());
if(active) afterActive = true; if(active) afterActive = true;
} }
@ -246,16 +247,14 @@ void TextWindow::ScreenChangeExprA(int link, uint32_t v) {
} }
void TextWindow::ScreenChangeGroupName(int link, uint32_t v) { void TextWindow::ScreenChangeGroupName(int link, uint32_t v) {
Group *g = SK.GetGroup(SS.TW.shown.group); Group *g = SK.GetGroup(SS.TW.shown.group);
SS.TW.ShowEditControl(7, 12, g->DescriptionString()+5); SS.TW.ShowEditControl(7, 12, g->DescriptionString().substr(5));
SS.TW.edit.meaning = EDIT_GROUP_NAME; SS.TW.edit.meaning = EDIT_GROUP_NAME;
SS.TW.edit.group.v = v; SS.TW.edit.group.v = v;
} }
void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) { void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) {
Group *g = SK.GetGroup(SS.TW.shown.group); Group *g = SK.GetGroup(SS.TW.shown.group);
char str[1024]; SS.TW.ShowEditControl(14, 13, ssprintf("%.3f", g->scale));
sprintf(str, "%.3f", g->scale);
SS.TW.ShowEditControl(14, 13, str);
SS.TW.edit.meaning = EDIT_GROUP_SCALE; SS.TW.edit.meaning = EDIT_GROUP_SCALE;
SS.TW.edit.group.v = v; SS.TW.edit.group.v = v;
} }
@ -279,11 +278,11 @@ void TextWindow::ShowGroupInfo(void) {
const char *s = "???"; const char *s = "???";
if(shown.group.v == Group::HGROUP_REFERENCES.v) { if(shown.group.v == Group::HGROUP_REFERENCES.v) {
Printf(true, "%FtGROUP %E%s", g->DescriptionString()); Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str());
goto list_items; goto list_items;
} else { } else {
Printf(true, "%FtGROUP %E%s [%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]", Printf(true, "%FtGROUP %E%s [%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]",
g->DescriptionString(), g->DescriptionString().c_str(),
g->h.v, &TextWindow::ScreenChangeGroupName, g->h.v, &TextWindow::ScreenChangeGroupName,
g->h.v, &TextWindow::ScreenDeleteGroup); g->h.v, &TextWindow::ScreenDeleteGroup);
} }
@ -426,11 +425,11 @@ list_items:
Request *r = &(SK.request.elem[i]); Request *r = &(SK.request.elem[i]);
if(r->group.v == shown.group.v) { if(r->group.v == shown.group.v) {
char *s = r->DescriptionString(); std::string s = r->DescriptionString();
Printf(false, "%Bp %Fl%Ll%D%f%h%s%E", Printf(false, "%Bp %Fl%Ll%D%f%h%s%E",
(a & 1) ? 'd' : 'a', (a & 1) ? 'd' : 'a',
r->h.v, (&TextWindow::ScreenSelectRequest), r->h.v, (&TextWindow::ScreenSelectRequest),
&(TextWindow::ScreenHoverRequest), s); &(TextWindow::ScreenHoverRequest), s.c_str());
a++; a++;
} }
} }
@ -443,11 +442,11 @@ list_items:
Constraint *c = &(SK.constraint.elem[i]); Constraint *c = &(SK.constraint.elem[i]);
if(c->group.v == shown.group.v) { if(c->group.v == shown.group.v) {
char *s = c->DescriptionString(); std::string s = c->DescriptionString();
Printf(false, "%Bp %Fl%Ll%D%f%h%s%E %s", Printf(false, "%Bp %Fl%Ll%D%f%h%s%E %s",
(a & 1) ? 'd' : 'a', (a & 1) ? 'd' : 'a',
c->h.v, (&TextWindow::ScreenSelectConstraint), c->h.v, (&TextWindow::ScreenSelectConstraint),
(&TextWindow::ScreenHoverConstraint), s, (&TextWindow::ScreenHoverConstraint), s.c_str(),
c->reference ? "(ref)" : ""); c->reference ? "(ref)" : "");
a++; a++;
} }
@ -469,7 +468,7 @@ void TextWindow::ShowGroupSolveInfo(void) {
return; return;
} }
Printf(true, "%FtGROUP %E%s", g->DescriptionString()); Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str());
switch(g->solved.how) { switch(g->solved.how) {
case System::DIDNT_CONVERGE: case System::DIDNT_CONVERGE:
Printf(true, "%FxSOLVE FAILED!%Fd no convergence"); Printf(true, "%FxSOLVE FAILED!%Fd no convergence");
@ -495,7 +494,7 @@ void TextWindow::ShowGroupSolveInfo(void) {
(i & 1) ? 'd' : 'a', (i & 1) ? 'd' : 'a',
c->h.v, (&TextWindow::ScreenSelectConstraint), c->h.v, (&TextWindow::ScreenSelectConstraint),
(&TextWindow::ScreenHoverConstraint), (&TextWindow::ScreenHoverConstraint),
c->DescriptionString()); c->DescriptionString().c_str());
} }
Printf(true, "It may be possible to fix the problem "); Printf(true, "It may be possible to fix the problem ");
@ -509,19 +508,17 @@ void TextWindow::ShowGroupSolveInfo(void) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TextWindow::ScreenStepDimFinish(int link, uint32_t v) { void TextWindow::ScreenStepDimFinish(int link, uint32_t v) {
SS.TW.edit.meaning = EDIT_STEP_DIM_FINISH; SS.TW.edit.meaning = EDIT_STEP_DIM_FINISH;
char s[1024]; std::string edit_value;
if(SS.TW.shown.dimIsDistance) { if(SS.TW.shown.dimIsDistance) {
strcpy(s, SS.MmToString(SS.TW.shown.dimFinish)); edit_value = SS.MmToString(SS.TW.shown.dimFinish);
} else { } else {
sprintf(s, "%.3f", SS.TW.shown.dimFinish); edit_value = ssprintf("%.3f", SS.TW.shown.dimFinish);
} }
SS.TW.ShowEditControl(12, 12, s); SS.TW.ShowEditControl(12, 12, edit_value);
} }
void TextWindow::ScreenStepDimSteps(int link, uint32_t v) { void TextWindow::ScreenStepDimSteps(int link, uint32_t v) {
char str[1024];
sprintf(str, "%d", SS.TW.shown.dimSteps);
SS.TW.edit.meaning = EDIT_STEP_DIM_STEPS; SS.TW.edit.meaning = EDIT_STEP_DIM_STEPS;
SS.TW.ShowEditControl(14, 12, str); SS.TW.ShowEditControl(14, 12, ssprintf("%d", SS.TW.shown.dimSteps));
} }
void TextWindow::ScreenStepDimGo(int link, uint32_t v) { void TextWindow::ScreenStepDimGo(int link, uint32_t v) {
hConstraint hc = SS.TW.shown.constraint; hConstraint hc = SS.TW.shown.constraint;
@ -553,12 +550,12 @@ void TextWindow::ShowStepDimension(void) {
return; return;
} }
Printf(true, "%FtSTEP DIMENSION%E %s", c->DescriptionString()); Printf(true, "%FtSTEP DIMENSION%E %s", c->DescriptionString().c_str());
if(shown.dimIsDistance) { if(shown.dimIsDistance) {
Printf(true, "%Ba %Ftstart%E %s", SS.MmToString(c->valA)); Printf(true, "%Ba %Ftstart%E %s", SS.MmToString(c->valA).c_str());
Printf(false, "%Bd %Ftfinish%E %s %Fl%Ll%f[change]%E", Printf(false, "%Bd %Ftfinish%E %s %Fl%Ll%f[change]%E",
SS.MmToString(shown.dimFinish), &ScreenStepDimFinish); SS.MmToString(shown.dimFinish).c_str(), &ScreenStepDimFinish);
} else { } else {
Printf(true, "%Ba %Ftstart%E %@", c->valA); Printf(true, "%Ba %Ftstart%E %@", c->valA);
Printf(false, "%Bd %Ftfinish%E %@ %Fl%Ll%f[change]%E", Printf(false, "%Bd %Ftfinish%E %@ %Fl%Ll%f[change]%E",
@ -580,10 +577,8 @@ void TextWindow::ShowStepDimension(void) {
void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) { void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) {
switch(link) { switch(link) {
case 'r': { case 'r': {
char str[1024];
strcpy(str, SS.MmToString(SS.tangentArcRadius));
SS.TW.edit.meaning = EDIT_TANGENT_ARC_RADIUS; SS.TW.edit.meaning = EDIT_TANGENT_ARC_RADIUS;
SS.TW.ShowEditControl(12, 3, str); SS.TW.ShowEditControl(12, 3, SS.MmToString(SS.tangentArcRadius));
break; break;
} }
@ -597,7 +592,7 @@ void TextWindow::ShowTangentArc(void) {
Printf(true, "%Ft radius of created arc%E"); Printf(true, "%Ft radius of created arc%E");
if(SS.tangentArcManual) { if(SS.tangentArcManual) {
Printf(false, "%Ba %s %Fl%Lr%f[change]%E", Printf(false, "%Ba %s %Fl%Lr%f[change]%E",
SS.MmToString(SS.tangentArcRadius), SS.MmToString(SS.tangentArcRadius).c_str(),
&(TextWindow::ScreenChangeTangentArc)); &(TextWindow::ScreenChangeTangentArc));
} else { } else {
Printf(false, "%Ba automatic"); Printf(false, "%Ba automatic");
@ -671,7 +666,7 @@ void TextWindow::EditControlDone(const char *s) {
SS.UndoRemember(); SS.UndoRemember();
Group *g = SK.GetGroup(edit.group); Group *g = SK.GetGroup(edit.group);
g->name.strcpy(s); g->name = s;
} }
break; break;
} }
@ -727,7 +722,7 @@ void TextWindow::EditControlDone(const char *s) {
SS.UndoRemember(); SS.UndoRemember();
Request *r = SK.request.FindByIdNoOops(edit.request); Request *r = SK.request.FindByIdNoOops(edit.request);
if(r) { if(r) {
r->str.strcpy(s); r->str = s;
SS.MarkGroupDirty(r->group); SS.MarkGroupDirty(r->group);
SS.ScheduleGenerateAll(); SS.ScheduleGenerateAll();
} }

View File

@ -79,14 +79,14 @@ void TextWindow::HideEditControl(void) {
HideTextEditControl(); HideTextEditControl();
} }
void TextWindow::ShowEditControl(int halfRow, int col, char *s) { void TextWindow::ShowEditControl(int halfRow, int col, const std::string &str) {
editControl.halfRow = halfRow; editControl.halfRow = halfRow;
editControl.col = col; editControl.col = col;
int x = LEFT_MARGIN + CHAR_WIDTH*col; int x = LEFT_MARGIN + CHAR_WIDTH*col;
int y = (halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2); int y = (halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2);
ShowTextEditControl(x - 3, y + 2, s); ShowTextEditControl(x - 3, y + 2, str);
} }
void TextWindow::ShowEditControlWithColorPicker(int halfRow, int col, RgbaColor rgb) void TextWindow::ShowEditControlWithColorPicker(int halfRow, int col, RgbaColor rgb)

View File

@ -26,7 +26,7 @@ void TtfFontList::LoadAll(void) {
loaded = true; loaded = true;
} }
void TtfFontList::PlotString(const std::string &font, char *str, double spacing, void TtfFontList::PlotString(const std::string &font, const char *str, double spacing,
SBezierList *sbl, SBezierList *sbl,
Vector origin, Vector u, Vector v) Vector origin, Vector u, Vector v)
{ {
@ -350,14 +350,11 @@ bool TtfFont::LoadFontFromFile(bool nameOnly) {
if(nameOnly) { if(nameOnly) {
// Find the display name, and store it in the provided buffer. // Find the display name, and store it in the provided buffer.
fseek(fh, nameAddr+nameStringOffset+displayNameOffset, SEEK_SET); fseek(fh, nameAddr+nameStringOffset+displayNameOffset, SEEK_SET);
int c = 0; name.clear();
for(i = 0; i < displayNameLength; i++) { for(i = 0; i < displayNameLength; i++) {
uint8_t b = GetBYTE(); char b = (char)GetBYTE();
if(b && c < ((int)sizeof(name.str) - 2)) { if(b) name += b;
name.str[c++] = b;
}
} }
name.str[c++] = '\0';
fclose(fh); fclose(fh);
return true; return true;
@ -673,7 +670,7 @@ void TtfFont::PlotCharacter(int *dx, int c, double spacing) {
*dx = dx0 + g->advanceWidth + (int)(spacing + 0.5); *dx = dx0 + g->advanceWidth + (int)(spacing + 0.5);
} }
void TtfFont::PlotString(char *str, double spacing, void TtfFont::PlotString(const char *str, double spacing,
SBezierList *sbl, SBezierList *sbl,
Vector porigin, Vector pu, Vector pv) Vector porigin, Vector pu, Vector pv)
{ {

View File

@ -208,7 +208,7 @@ public:
} editControl; } editControl;
void HideEditControl(void); void HideEditControl(void);
void ShowEditControl(int halfRow, int col, char *s); void ShowEditControl(int halfRow, int col, const std::string &str);
void ShowEditControlWithColorPicker(int halfRow, int col, RgbaColor rgb); void ShowEditControlWithColorPicker(int halfRow, int col, RgbaColor rgb);
void ClearSuper(void); void ClearSuper(void);

View File

@ -6,6 +6,25 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "solvespace.h" #include "solvespace.h"
std::string SolveSpace::ssprintf(const char *fmt, ...)
{
va_list va;
va_start(va, fmt);
int size = vsnprintf(NULL, 0, fmt, va);
if(size < 0) oops();
va_end(va);
std::string result;
result.resize(size);
va_start(va, fmt);
vsnprintf(&result[0], size + 1, fmt, va);
va_end(va);
return result;
}
// See https://github.com/GNOME/glibmm/blob/2fbd9f23/glib/glibmm/ustring.cc#L227 // See https://github.com/GNOME/glibmm/blob/2fbd9f23/glib/glibmm/ustring.cc#L227
const char *SolveSpace::ReadUTF8(const char *str, char32_t *result) const char *SolveSpace::ReadUTF8(const char *str, char32_t *result)
{ {

View File

@ -18,9 +18,9 @@ void TextWindow::ShowEditView(void) {
Printf(false, "%Bd %Ftorigin (maps to center of screen)%E"); Printf(false, "%Bd %Ftorigin (maps to center of screen)%E");
Printf(false, "%Ba (%s, %s, %s) %Fl%Ll%f[edit]%E", Printf(false, "%Ba (%s, %s, %s) %Fl%Ll%f[edit]%E",
SS.MmToString(-SS.GW.offset.x), SS.MmToString(-SS.GW.offset.x).c_str(),
SS.MmToString(-SS.GW.offset.y), SS.MmToString(-SS.GW.offset.y).c_str(),
SS.MmToString(-SS.GW.offset.z), SS.MmToString(-SS.GW.offset.z).c_str(),
&ScreenChangeViewOrigin); &ScreenChangeViewOrigin);
Printf(false, ""); Printf(false, "");
@ -38,29 +38,26 @@ void TextWindow::ShowEditView(void) {
} }
void TextWindow::ScreenChangeViewScale(int link, uint32_t v) { void TextWindow::ScreenChangeViewScale(int link, uint32_t v) {
char buf[1024];
sprintf(buf, "%.3f", SS.GW.scale * SS.MmPerUnit());
SS.TW.edit.meaning = EDIT_VIEW_SCALE; SS.TW.edit.meaning = EDIT_VIEW_SCALE;
SS.TW.ShowEditControl(12, 3, buf); SS.TW.ShowEditControl(12, 3, ssprintf("%.3f", SS.GW.scale * SS.MmPerUnit()));
} }
void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) { void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) {
char buf[1024]; std::string edit_value =
sprintf(buf, "%s, %s, %s", ssprintf("%s, %s, %s",
SS.MmToString(-SS.GW.offset.x), SS.MmToString(-SS.GW.offset.x).c_str(),
SS.MmToString(-SS.GW.offset.y), SS.MmToString(-SS.GW.offset.y).c_str(),
SS.MmToString(-SS.GW.offset.z)); SS.MmToString(-SS.GW.offset.z).c_str());
SS.TW.edit.meaning = EDIT_VIEW_ORIGIN; SS.TW.edit.meaning = EDIT_VIEW_ORIGIN;
SS.TW.ShowEditControl(18, 3, buf); SS.TW.ShowEditControl(18, 3, edit_value);
} }
void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) { void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) {
char buf[1024]; std::string edit_value =
sprintf(buf, "%.3f, %.3f, %.3f", CO(SS.GW.projRight)); ssprintf("%.3f, %.3f, %.3f", CO(SS.GW.projRight));
SS.TW.edit.meaning = EDIT_VIEW_PROJ_RIGHT; SS.TW.edit.meaning = EDIT_VIEW_PROJ_RIGHT;
SS.TW.ShowEditControl(24, 10, buf); SS.TW.ShowEditControl(24, 10, edit_value);
} }
bool TextWindow::EditControlDoneForView(const char *s) { bool TextWindow::EditControlDoneForView(const char *s) {

View File

@ -812,11 +812,11 @@ static void ShowEditControl(HWND h, int x, int y, const std::wstring &s) {
SetFocus(h); SetFocus(h);
} }
} }
void SolveSpace::ShowTextEditControl(int x, int y, char *s) void SolveSpace::ShowTextEditControl(int x, int y, const std::string &str)
{ {
if(GraphicsEditControlIsVisible()) return; if(GraphicsEditControlIsVisible()) return;
ShowEditControl(TextEditControl, x, y, Widen(s)); ShowEditControl(TextEditControl, x, y, Widen(str));
} }
void SolveSpace::HideTextEditControl(void) void SolveSpace::HideTextEditControl(void)
{ {
@ -826,7 +826,7 @@ bool SolveSpace::TextEditControlIsVisible(void)
{ {
return IsWindowVisible(TextEditControl) ? true : false; return IsWindowVisible(TextEditControl) ? true : false;
} }
void SolveSpace::ShowGraphicsEditControl(int x, int y, char *s) void SolveSpace::ShowGraphicsEditControl(int x, int y, const std::string &str)
{ {
if(GraphicsEditControlIsVisible()) return; if(GraphicsEditControlIsVisible()) return;
@ -839,7 +839,7 @@ void SolveSpace::ShowGraphicsEditControl(int x, int y, char *s)
// top left corner // top left corner
y -= 20; y -= 20;
ShowEditControl(GraphicsEditControl, x, y, Widen(s)); ShowEditControl(GraphicsEditControl, x, y, Widen(str));
} }
void SolveSpace::HideGraphicsEditControl(void) void SolveSpace::HideGraphicsEditControl(void)
{ {