Add more measurement information about the selection. And remove

menu items for some features that I suppose I won't add, and fix
some bugs.

[git-p4: depot-paths = "//depot/solvespace/": change = 1787]
This commit is contained in:
Jonathan Westhues 2008-06-11 23:31:41 -08:00
parent 8969687904
commit 650e9db150
8 changed files with 65 additions and 34 deletions

View File

@ -308,6 +308,9 @@ bool SolveSpace::LoadFromFile(char *filename) {
return false; return false;
} }
UndoClearStack(&redo);
UndoClearStack(&undo);
constraint.Clear(); constraint.Clear();
request.Clear(); request.Clear();
group.Clear(); group.Clear();

View File

@ -1,5 +1,3 @@
#include <stdarg.h>
#include "solvespace.h" #include "solvespace.h"
#define mView (&GraphicsWindow::MenuView) #define mView (&GraphicsWindow::MenuView)
@ -64,8 +62,6 @@ const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
{ 1, "&Arc of a Circle\tA", MNU_ARC, 'A', mReq }, { 1, "&Arc of a Circle\tA", MNU_ARC, 'A', mReq },
{ 1, "&Cubic Segment\t3", MNU_CUBIC, '3', mReq }, { 1, "&Cubic Segment\t3", MNU_CUBIC, '3', mReq },
{ 1, NULL, 0, NULL }, { 1, NULL, 0, NULL },
{ 1, "Sym&bolic Variable\tB", 0, 'B', mReq },
{ 1, NULL, 0, NULL },
{ 1, "To&ggle Construction\tG", MNU_CONSTRUCTION, 'G', mReq }, { 1, "To&ggle Construction\tG", MNU_CONSTRUCTION, 'G', mReq },
{ 0, "&Constrain", 0, NULL }, { 0, "&Constrain", 0, NULL },
@ -85,8 +81,6 @@ const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
{ 1, "Para&llel\tShift+L", MNU_PARALLEL, 'L'|S, mCon }, { 1, "Para&llel\tShift+L", MNU_PARALLEL, 'L'|S, mCon },
{ 1, "Same Orient&ation\tShift+A", MNU_ORIENTED_SAME, 'A'|S, mCon }, { 1, "Same Orient&ation\tShift+A", MNU_ORIENTED_SAME, 'A'|S, mCon },
{ 1, NULL, 0, NULL }, { 1, NULL, 0, NULL },
{ 1, "Sym&bolic Equation\tShift+B", 0, 'B'|S, NULL },
{ 1, NULL, 0, NULL },
{ 1, "Solve Once Now\tSpace", MNU_SOLVE_NOW, ' ', mCon }, { 1, "Solve Once Now\tSpace", MNU_SOLVE_NOW, ' ', mCon },
{ 0, "&Help", 0, NULL }, { 0, "&Help", 0, NULL },
@ -97,10 +91,10 @@ const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
void GraphicsWindow::Init(void) { void GraphicsWindow::Init(void) {
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
offset.x = offset.y = offset.z = 0;
scale = 5; scale = 5;
projRight.x = 1; projRight.y = projRight.z = 0; offset = Vector::From(0, 0, 0);
projUp.y = 1; projUp.z = projUp.x = 0; projRight = Vector::From(1, 0, 0);
projUp = Vector::From(0, 1, 0);
// And with the latest visible group active, or failing that the first // And with the latest visible group active, or failing that the first
// group after the references // group after the references
@ -238,6 +232,7 @@ void GraphicsWindow::ZoomToFit(void) {
if(dy != 0) scaley = 0.9*height/dy; if(dy != 0) scaley = 0.9*height/dy;
scale = min(100, min(scalex, scaley)); scale = min(100, min(scalex, scaley));
} }
scale = max(0.001, scale);
} }
void GraphicsWindow::MenuView(int id) { void GraphicsWindow::MenuView(int id) {

View File

@ -407,7 +407,6 @@ class Constraint {
public: public:
static const hConstraint NO_CONSTRAINT; static const hConstraint NO_CONSTRAINT;
static const int USER_EQUATION = 10;
static const int POINTS_COINCIDENT = 20; static const int POINTS_COINCIDENT = 20;
static const int PT_PT_DISTANCE = 30; static const int PT_PT_DISTANCE = 30;
static const int PT_PLANE_DISTANCE = 31; static const int PT_PLANE_DISTANCE = 31;

View File

@ -98,6 +98,12 @@ void SolveSpace::AfterNewFile(void) {
unsaved = false; unsaved = false;
GenerateAll(0, INT_MAX); GenerateAll(0, INT_MAX);
later.showTW = true; later.showTW = true;
int w, h;
GetGraphicsWindowSize(&w, &h);
GW.width = w;
GW.height = h;
GW.ZoomToFit();
} }
void SolveSpace::MarkGroupDirtyByEntity(hEntity he) { void SolveSpace::MarkGroupDirtyByEntity(hEntity he) {

View File

@ -71,6 +71,7 @@ void ShowTextWindow(BOOL visible);
void InvalidateText(void); void InvalidateText(void);
void InvalidateGraphics(void); void InvalidateGraphics(void);
void PaintGraphics(void); void PaintGraphics(void);
void GetGraphicsWindowSize(int *w, int *h);
SDWORD GetMilliseconds(void); SDWORD GetMilliseconds(void);
void dbp(char *str, ...); void dbp(char *str, ...);

View File

@ -237,7 +237,8 @@ void TextWindow::DescribeSelection(void) {
if(gs.n == 1 && (gs.points == 1 || gs.entities == 1)) { if(gs.n == 1 && (gs.points == 1 || gs.entities == 1)) {
e = SS.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]); e = SS.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]);
#define COP SS.GW.ToString(p.x), SS.GW.ToString(p.y), SS.GW.ToString(p.z) #define COSTR(p) \
SS.GW.ToString((p).x), SS.GW.ToString((p).y), SS.GW.ToString((p).z)
#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) {
@ -248,7 +249,7 @@ void TextWindow::DescribeSelection(void) {
case Entity::POINT_N_COPY: case Entity::POINT_N_COPY:
case Entity::POINT_N_ROT_AA: case Entity::POINT_N_ROT_AA:
p = e->PointGetNum(); p = e->PointGetNum();
Printf(false, "%FtPOINT%E at " PT_AS_STR, COP); Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(p));
break; break;
case Entity::NORMAL_IN_3D: case Entity::NORMAL_IN_3D:
@ -269,7 +270,7 @@ void TextWindow::DescribeSelection(void) {
case Entity::WORKPLANE: { case Entity::WORKPLANE: {
p = SS.GetEntity(e->point[0])->PointGetNum(); p = SS.GetEntity(e->point[0])->PointGetNum();
Printf(false, "%FtWORKPLANE%E"); Printf(false, "%FtWORKPLANE%E");
Printf(true, " origin = " PT_AS_STR, COP); Printf(true, " origin = " PT_AS_STR, COSTR(p));
Quaternion q = e->Normal()->NormalGetNum(); Quaternion q = e->Normal()->NormalGetNum();
p = q.RotationN(); p = q.RotationN();
Printf(true, " normal = " PT_AS_NUM, CO(p)); Printf(true, " normal = " PT_AS_NUM, CO(p));
@ -279,30 +280,30 @@ void TextWindow::DescribeSelection(void) {
Vector p0 = SS.GetEntity(e->point[0])->PointGetNum(); Vector p0 = SS.GetEntity(e->point[0])->PointGetNum();
p = p0; p = p0;
Printf(false, "%FtLINE SEGMENT%E"); Printf(false, "%FtLINE SEGMENT%E");
Printf(true, " thru " PT_AS_STR, COP); Printf(true, " thru " PT_AS_STR, COSTR(p));
Vector p1 = SS.GetEntity(e->point[1])->PointGetNum(); Vector p1 = SS.GetEntity(e->point[1])->PointGetNum();
p = p1; p = p1;
Printf(false, " " PT_AS_STR, COP); Printf(false, " " PT_AS_STR, COSTR(p));
Printf(true, " len = %Fi%s%E", Printf(true, " len = %Fi%s%E",
SS.GW.ToString((p1.Minus(p0).Magnitude()))); SS.GW.ToString((p1.Minus(p0).Magnitude())));
break; break;
} }
case Entity::CUBIC: case Entity::CUBIC:
p = SS.GetEntity(e->point[0])->PointGetNum();
Printf(false, "%FtCUBIC BEZIER CURVE%E"); Printf(false, "%FtCUBIC BEZIER CURVE%E");
for(i = 0; i <= 3; i++) { for(i = 0; i <= 3; i++) {
p = SS.GetEntity(e->point[i])->PointGetNum(); p = SS.GetEntity(e->point[i])->PointGetNum();
Printf((i==0), " p%c = " PT_AS_STR, '0'+i, COP); Printf((i==0), " p%c = " PT_AS_STR, '0'+i, COSTR(p));
} }
break; break;
case Entity::ARC_OF_CIRCLE: { case Entity::ARC_OF_CIRCLE: {
Printf(false, "%FtARC OF A CIRCLE%E"); Printf(false, "%FtARC OF A CIRCLE%E");
p = SS.GetEntity(e->point[0])->PointGetNum(); p = SS.GetEntity(e->point[0])->PointGetNum();
Printf(true, " center = " PT_AS_STR, COP); Printf(true, " center = " PT_AS_STR, COSTR(p));
p = SS.GetEntity(e->point[1])->PointGetNum(); p = SS.GetEntity(e->point[1])->PointGetNum();
Printf(true," endpoints = " PT_AS_STR, COP); Printf(true, " endpoints = " PT_AS_STR, COSTR(p));
p = SS.GetEntity(e->point[2])->PointGetNum(); p = SS.GetEntity(e->point[2])->PointGetNum();
Printf(false," " PT_AS_STR, COP); Printf(false, " " PT_AS_STR, COSTR(p));
double r = e->CircleGetRadiusNum(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.GW.ToString(r*2)); Printf(true, " diameter = %Fi%s", SS.GW.ToString(r*2));
Printf(false, " radius = %Fi%s", SS.GW.ToString(r)); Printf(false, " radius = %Fi%s", SS.GW.ToString(r));
@ -311,7 +312,7 @@ void TextWindow::DescribeSelection(void) {
case Entity::CIRCLE: { case Entity::CIRCLE: {
Printf(false, "%FtCIRCLE%E"); Printf(false, "%FtCIRCLE%E");
p = SS.GetEntity(e->point[0])->PointGetNum(); p = SS.GetEntity(e->point[0])->PointGetNum();
Printf(true, " center = " PT_AS_STR, COP); Printf(true, " center = " PT_AS_STR, COSTR(p));
double r = e->CircleGetRadiusNum(); double r = e->CircleGetRadiusNum();
Printf(true, " diameter = %Fi%s", SS.GW.ToString(r*2)); Printf(true, " diameter = %Fi%s", SS.GW.ToString(r*2));
Printf(false, " radius = %Fi%s", SS.GW.ToString(r)); Printf(false, " radius = %Fi%s", SS.GW.ToString(r));
@ -321,10 +322,10 @@ void TextWindow::DescribeSelection(void) {
case Entity::FACE_XPROD: case Entity::FACE_XPROD:
case Entity::FACE_N_ROT_TRANS: case Entity::FACE_N_ROT_TRANS:
Printf(false, "%FtPLANE FACE%E"); Printf(false, "%FtPLANE FACE%E");
p = e->FaceGetPointNum();
Printf(true, " through = " PT_AS_STR, COP);
p = e->FaceGetNormalNum(); p = e->FaceGetNormalNum();
Printf(false, " normal = " PT_AS_STR, COP); Printf(true, " normal = " PT_AS_NUM, CO(p));
p = e->FaceGetPointNum();
Printf(false, " thru = " PT_AS_STR, COSTR(p));
break; break;
default: default:
@ -343,12 +344,33 @@ void TextWindow::DescribeSelection(void) {
} }
} else if(gs.n == 2 && gs.points == 2) { } else if(gs.n == 2 && gs.points == 2) {
Printf(false, "%FtTWO POINTS"); Printf(false, "%FtTWO POINTS");
Vector p0 = SS.GetEntity(gs.point[0])->PointGetNum(); p = p0; Vector p0 = SS.GetEntity(gs.point[0])->PointGetNum();
Printf(true, " at " PT_AS_STR, COP); Printf(true, " at " PT_AS_STR, COSTR(p0));
Vector p1 = SS.GetEntity(gs.point[1])->PointGetNum(); p = p1; Vector p1 = SS.GetEntity(gs.point[1])->PointGetNum();
Printf(false, " " PT_AS_STR, COP); 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.GW.ToString(d)); Printf(true, " d = %Fi%s", SS.GW.ToString(d));
} else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) {
Printf(false, "%FtA POINT AND A PLANE FACE");
Vector pt = SS.GetEntity(gs.point[0])->PointGetNum();
Printf(true, " point = " PT_AS_STR, COSTR(pt));
Vector n = SS.GetEntity(gs.face[0])->FaceGetNormalNum();
Printf(true, " plane normal = " PT_AS_NUM, CO(n));
Vector pl = SS.GetEntity(gs.face[0])->FaceGetPointNum();
Printf(false, " plane thru = " PT_AS_STR, COSTR(pl));
double dd = n.Dot(pl) - n.Dot(pt);
Printf(true, " distance = %Fi%s", SS.GW.ToString(dd));
} else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) {
Printf(false, "%FtTWO POINTS AND A VECTOR");
Vector p0 = SS.GetEntity(gs.point[0])->PointGetNum();
Printf(true, " pointA = " PT_AS_STR, COSTR(p0));
Vector p1 = SS.GetEntity(gs.point[1])->PointGetNum();
Printf(false, " pointB = " PT_AS_STR, COSTR(p1));
Vector v = SS.GetEntity(gs.vector[0])->VectorGetNum();
v = v.WithMagnitude(1);
Printf(true, " vector = " PT_AS_NUM, CO(v));
double d = (p1.Minus(p0)).Dot(v);
Printf(true, " proj_d = %Fi%s", SS.GW.ToString(d));
} else { } else {
Printf(true, "%FtSELECTED:%E %d item%s", gs.n, gs.n == 1 ? "" : "s"); Printf(true, "%FtSELECTED:%E %d item%s", gs.n, gs.n == 1 ? "" : "s");
} }

View File

@ -504,12 +504,17 @@ void InvalidateGraphics(void)
{ {
InvalidateRect(GraphicsWnd, NULL, FALSE); InvalidateRect(GraphicsWnd, NULL, FALSE);
} }
void PaintGraphics(void) void GetGraphicsWindowSize(int *w, int *h)
{ {
RECT r; RECT r;
GetClientRect(GraphicsWnd, &r); GetClientRect(GraphicsWnd, &r);
int w = r.right - r.left; *w = r.right - r.left;
int h = r.bottom - r.top; *h = r.bottom - r.top;
}
void PaintGraphics(void)
{
int w, h;
GetGraphicsWindowSize(&w, &h);
SS.GW.Paint(w, h); SS.GW.Paint(w, h);
SwapBuffers(GetDC(GraphicsWnd)); SwapBuffers(GetDC(GraphicsWnd));

View File

@ -5,9 +5,9 @@ DXF export
partitioned subsystems in the solver partitioned subsystems in the solver
TTF font text TTF font text
display with proper formatting/units display with proper formatting/units
more measurements
some kind of rounding / chamfer some kind of rounding / chamfer
remove back button in browser? remove back button in browser?
clean up user-created workplanes clean up user-created workplanes
incremental regen of entities? incremental regen of entities?
graphic export