bool SolveSpaceUI::Autosave() { SetAutosaveTimerFor(autosaveInterval); if(!saveFile.empty() && unsaved) return SaveToFile(saveFile + AUTOSAVE_SUFFIX); return false; }
void SolveSpaceUI::Init() { SS.tangentArcRadius = 10.0; // Then, load the registry settings. int i; // Default list of colors for the model material modelColor[0] = CnfThawColor(RGBi(150, 150, 150), "ModelColor_0"); modelColor[1] = CnfThawColor(RGBi(100, 100, 100), "ModelColor_1"); modelColor[2] = CnfThawColor(RGBi( 30, 30, 30), "ModelColor_2"); modelColor[3] = CnfThawColor(RGBi(150, 0, 0), "ModelColor_3"); modelColor[4] = CnfThawColor(RGBi( 0, 100, 0), "ModelColor_4"); modelColor[5] = CnfThawColor(RGBi( 0, 80, 80), "ModelColor_5"); modelColor[6] = CnfThawColor(RGBi( 0, 0, 130), "ModelColor_6"); modelColor[7] = CnfThawColor(RGBi( 80, 0, 80), "ModelColor_7"); // Light intensities lightIntensity[0] = CnfThawFloat(1.0f, "LightIntensity_0"); lightIntensity[1] = CnfThawFloat(0.5f, "LightIntensity_1"); ambientIntensity = 0.3; // no setting for that yet // Light positions lightDir[0].x = CnfThawFloat(-1.0f, "LightDir_0_Right" ); lightDir[0].y = CnfThawFloat( 1.0f, "LightDir_0_Up" ); lightDir[0].z = CnfThawFloat( 0.0f, "LightDir_0_Forward" ); lightDir[1].x = CnfThawFloat( 1.0f, "LightDir_1_Right" ); lightDir[1].y = CnfThawFloat( 0.0f, "LightDir_1_Up" ); lightDir[1].z = CnfThawFloat( 0.0f, "LightDir_1_Forward" ); exportMode = false; // Chord tolerance chordTol = CnfThawFloat(0.5f, "ChordTolerancePct"); // Max pwl segments to generate maxSegments = CnfThawInt(10, "MaxSegments"); // Chord tolerance exportChordTol = CnfThawFloat(0.1f, "ExportChordTolerance"); // Max pwl segments to generate exportMaxSegments = CnfThawInt(64, "ExportMaxSegments"); // View units viewUnits = (Unit)CnfThawInt((uint32_t)UNIT_MM, "ViewUnits"); // Number of digits after the decimal point afterDecimalMm = CnfThawInt(2, "AfterDecimalMm"); afterDecimalInch = CnfThawInt(3, "AfterDecimalInch"); // Camera tangent (determines perspective) cameraTangent = CnfThawFloat(0.3f/1e3f, "CameraTangent"); // Grid spacing gridSpacing = CnfThawFloat(5.0f, "GridSpacing"); // Export scale factor exportScale = CnfThawFloat(1.0f, "ExportScale"); // Export offset (cutter radius comp) exportOffset = CnfThawFloat(0.0f, "ExportOffset"); // Rewrite exported colors close to white into black (assuming white bg) fixExportColors = CnfThawBool(true, "FixExportColors"); // Draw back faces of triangles (when mesh is leaky/self-intersecting) drawBackFaces = CnfThawBool(true, "DrawBackFaces"); // Check that contours are closed and not self-intersecting checkClosedContour = CnfThawBool(true, "CheckClosedContour"); // Export shaded triangles in a 2d view exportShadedTriangles = CnfThawBool(true, "ExportShadedTriangles"); // Export pwl curves (instead of exact) always exportPwlCurves = CnfThawBool(false, "ExportPwlCurves"); // Background color on-screen backgroundColor = CnfThawColor(RGBi(0, 0, 0), "BackgroundColor"); // Whether export canvas size is fixed or derived from bbox exportCanvasSizeAuto = CnfThawBool(true, "ExportCanvasSizeAuto"); // Margins for automatic canvas size exportMargin.left = CnfThawFloat(5.0f, "ExportMargin_Left"); exportMargin.right = CnfThawFloat(5.0f, "ExportMargin_Right"); exportMargin.bottom = CnfThawFloat(5.0f, "ExportMargin_Bottom"); exportMargin.top = CnfThawFloat(5.0f, "ExportMargin_Top"); // Dimensions for fixed canvas size exportCanvas.width = CnfThawFloat(100.0f, "ExportCanvas_Width"); exportCanvas.height = CnfThawFloat(100.0f, "ExportCanvas_Height"); exportCanvas.dx = CnfThawFloat( 5.0f, "ExportCanvas_Dx"); exportCanvas.dy = CnfThawFloat( 5.0f, "ExportCanvas_Dy"); // Extra parameters when exporting G code gCode.depth = CnfThawFloat(10.0f, "GCode_Depth"); gCode.passes = CnfThawInt(1, "GCode_Passes"); gCode.feed = CnfThawFloat(10.0f, "GCode_Feed"); gCode.plungeFeed = CnfThawFloat(10.0f, "GCode_PlungeFeed"); // Show toolbar in the graphics window showToolbar = CnfThawBool(true, "ShowToolbar"); // Recent files menus for(i = 0; i < MAX_RECENT; i++) { RecentFile[i] = CnfThawString("", "RecentFile_" + std::to_string(i)); } RefreshRecentMenus(); // Autosave timer autosaveInterval = CnfThawInt(5, "AutosaveInterval"); // The default styles (colors, line widths, etc.) are also stored in the // configuration file, but we will automatically load those as we need // them. SetAutosaveTimerFor(autosaveInterval); NewFile(); AfterNewFile(); }
bool TextWindow::EditControlDoneForConfiguration(const char *s) { switch(edit.meaning) { case EDIT_LIGHT_INTENSITY: SS.lightIntensity[edit.i] = min(1, max(0, atof(s))); InvalidateGraphics(); break; case EDIT_LIGHT_DIRECTION: { double x, y, z; if(sscanf(s, "%lf, %lf, %lf", &x, &y, &z)==3) { SS.lightDir[edit.i] = Vector::From(x, y, z); } else { Error("Bad format: specify coordinates as x, y, z"); } InvalidateGraphics(); break; } case EDIT_COLOR: { Vector rgb; if(sscanf(s, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { rgb = rgb.ClampWithin(0, 1); SS.modelColor[edit.i] = RGBf(rgb.x, rgb.y, rgb.z); } else { Error("Bad format: specify color as r, g, b"); } break; } case EDIT_CHORD_TOLERANCE: { SS.chordTol = min(10, max(0.1, atof(s))); SS.GenerateAll(0, INT_MAX); break; } case EDIT_MAX_SEGMENTS: { SS.maxSegments = min(1000, max(7, atoi(s))); SS.GenerateAll(0, INT_MAX); break; } case EDIT_CAMERA_TANGENT: { SS.cameraTangent = (min(2, max(0, atof(s))))/1000.0; if(!SS.usePerspectiveProj) { Message("The perspective factor will have no effect until you " "enable View -> Use Perspective Projection."); } InvalidateGraphics(); break; } case EDIT_GRID_SPACING: { SS.gridSpacing = (float)min(1e4, max(1e-3, SS.StringToMm(s))); InvalidateGraphics(); break; } case EDIT_DIGITS_AFTER_DECIMAL: { int v = atoi(s); if(v < 0 || v > 8) { Error("Specify between 0 and 8 digits after the decimal."); } else { SS.SetUnitDigitsAfterDecimal(v); } InvalidateGraphics(); break; } case EDIT_EXPORT_SCALE: { Expr *e = Expr::From(s, true); if(e) { double ev = e->Eval(); if(fabs(ev) < 0.001 || isnan(ev)) { Error("Export scale must not be zero!"); } else { SS.exportScale = (float)ev; } } break; } case EDIT_EXPORT_OFFSET: { Expr *e = Expr::From(s, true); if(e) { double ev = SS.ExprToMm(e); if(isnan(ev) || ev < 0) { Error("Cutter radius offset must not be negative!"); } else { SS.exportOffset = (float)ev; } } break; } case EDIT_CANVAS_SIZE: { Expr *e = Expr::From(s, true); if(!e) { break; } float d = (float)SS.ExprToMm(e); switch(edit.i) { case 0: SS.exportMargin.left = d; break; case 1: SS.exportMargin.right = d; break; case 2: SS.exportMargin.bottom = d; break; case 3: SS.exportMargin.top = d; break; case 10: SS.exportCanvas.width = d; break; case 11: SS.exportCanvas.height = d; break; case 12: SS.exportCanvas.dx = d; break; case 13: SS.exportCanvas.dy = d; break; } break; } case EDIT_G_CODE_DEPTH: { Expr *e = Expr::From(s, true); if(e) SS.gCode.depth = (float)SS.ExprToMm(e); break; } case EDIT_G_CODE_PASSES: { Expr *e = Expr::From(s, true); if(e) SS.gCode.passes = (int)(e->Eval()); SS.gCode.passes = max(1, min(1000, SS.gCode.passes)); break; } case EDIT_G_CODE_FEED: { Expr *e = Expr::From(s, true); if(e) SS.gCode.feed = (float)SS.ExprToMm(e); break; } case EDIT_G_CODE_PLUNGE_FEED: { Expr *e = Expr::From(s, true); if(e) SS.gCode.plungeFeed = (float)SS.ExprToMm(e); break; } case EDIT_AUTOSAVE_INTERVAL: { int interval; if(sscanf(s, "%d", &interval)==1) { if(interval >= 1) { SS.autosaveInterval = interval; SetAutosaveTimerFor(interval); } else { Error("Bad value: autosave interval should be positive"); } } else { Error("Bad format: specify interval in integral minutes"); } } default: return false; } return true; }