Add menu items to snap view to nearest orthogonal or iso view.

[git-p4: depot-paths = "//depot/solvespace/": change = 1882]
This commit is contained in:
Jonathan Westhues 2009-01-01 20:06:47 -08:00
parent 92f4c71d78
commit 3ae0ca8c19
3 changed files with 80 additions and 1 deletions

View File

@ -10,6 +10,7 @@
#define mHelp (&SolveSpace::MenuHelp) #define mHelp (&SolveSpace::MenuHelp)
#define S 0x100 #define S 0x100
#define C 0x200 #define C 0x200
#define F(k) (0xf0+(k))
const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = { const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
{ 0, "&File", 0, NULL }, { 0, "&File", 0, NULL },
{ 1, "&New\tCtrl+N", MNU_NEW, 'N'|C, mFile }, { 1, "&New\tCtrl+N", MNU_NEW, 'N'|C, mFile },
@ -38,6 +39,9 @@ const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
{ 1, "Zoom &Out\t-", MNU_ZOOM_OUT, '-', mView }, { 1, "Zoom &Out\t-", MNU_ZOOM_OUT, '-', mView },
{ 1, "Zoom To &Fit\tF", MNU_ZOOM_TO_FIT, 'F', mView }, { 1, "Zoom To &Fit\tF", MNU_ZOOM_TO_FIT, 'F', mView },
{ 1, NULL, 0, NULL }, { 1, NULL, 0, NULL },
{ 1, "Nearest &Ortho View\tF1", MNU_NEAREST_ORTHO, F(1), mView },
{ 1, "Nearest &Iso View\tF2", MNU_NEAREST_ISO, F(2), mView },
{ 1, NULL, 0, NULL },
{ 1, "Show Text &Window\tTab", MNU_SHOW_TEXT_WND, '\t', mView }, { 1, "Show Text &Window\tTab", MNU_SHOW_TEXT_WND, '\t', mView },
{ 1, NULL, 0, NULL }, { 1, NULL, 0, NULL },
{ 1, "Dimensions in &Inches", MNU_UNITS_INCHES, 0, mView }, { 1, "Dimensions in &Inches", MNU_UNITS_INCHES, 0, mView },
@ -192,6 +196,10 @@ void GraphicsWindow::AnimateOntoWorkplane(void) {
Quaternion quatf = w->Normal()->NormalGetNum(); Quaternion quatf = w->Normal()->NormalGetNum();
Vector offsetf = (SS.GetEntity(w->point[0])->PointGetNum()).ScaledBy(-1); Vector offsetf = (SS.GetEntity(w->point[0])->PointGetNum()).ScaledBy(-1);
AnimateOnto(quatf, offsetf);
}
void GraphicsWindow::AnimateOnto(Quaternion quatf, Vector offsetf) {
// Get our initial orientation and translation. // Get our initial orientation and translation.
Quaternion quat0 = Quaternion::From(projRight, projUp); Quaternion quat0 = Quaternion::From(projRight, projUp);
Vector offset0 = offset; Vector offset0 = offset;
@ -327,6 +335,61 @@ void GraphicsWindow::MenuView(int id) {
SS.GW.ZoomToFit(); SS.GW.ZoomToFit();
break; break;
case MNU_NEAREST_ORTHO:
case MNU_NEAREST_ISO: {
static const Vector ortho[3] = {
Vector::From(1, 0, 0),
Vector::From(0, 1, 0),
Vector::From(0, 0, 1)
};
double sqrt2 = sqrt(2.0), sqrt6 = sqrt(6.0);
Quaternion quat0 = Quaternion::From(SS.GW.projRight, SS.GW.projUp);
Quaternion quatf = quat0;
double dmin = 1e10;
// There are 24 possible views; 3*2*2*2
int i, j, negi, negj;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
if(i == j) continue;
for(negi = 0; negi < 2; negi++) {
for(negj = 0; negj < 2; negj++) {
Vector ou = ortho[i], ov = ortho[j];
if(negi) ou = ou.ScaledBy(-1);
if(negj) ov = ov.ScaledBy(-1);
Vector on = ou.Cross(ov);
Vector u, v;
if(id == MNU_NEAREST_ORTHO) {
u = ou;
v = ov;
} else {
u =
ou.ScaledBy(1/sqrt2).Plus(
on.ScaledBy(-1/sqrt2));
v =
ou.ScaledBy(-1/sqrt6).Plus(
ov.ScaledBy(2/sqrt6).Plus(
on.ScaledBy(-1/sqrt6)));
}
Quaternion quatt = Quaternion::From(u, v);
double d = min(
(quatt.Minus(quat0)).Magnitude(),
(quatt.Plus(quat0)).Magnitude());
if(d < dmin) {
dmin = d;
quatf = quatt;
}
}
}
}
}
SS.GW.AnimateOnto(quatf, SS.GW.offset);
break;
}
case MNU_SHOW_TEXT_WND: case MNU_SHOW_TEXT_WND:
SS.GW.showTextWindow = !SS.GW.showTextWindow; SS.GW.showTextWindow = !SS.GW.showTextWindow;
SS.GW.EnsureValidActives(); SS.GW.EnsureValidActives();

3
ui.h
View File

@ -184,6 +184,8 @@ public:
MNU_ZOOM_IN, MNU_ZOOM_IN,
MNU_ZOOM_OUT, MNU_ZOOM_OUT,
MNU_ZOOM_TO_FIT, MNU_ZOOM_TO_FIT,
MNU_NEAREST_ORTHO,
MNU_NEAREST_ISO,
MNU_SHOW_TEXT_WND, MNU_SHOW_TEXT_WND,
MNU_UNITS_INCHES, MNU_UNITS_INCHES,
MNU_UNITS_MM, MNU_UNITS_MM,
@ -280,6 +282,7 @@ public:
Point2d ProjectPoint(Vector p); Point2d ProjectPoint(Vector p);
Vector ProjectPoint3(Vector p); Vector ProjectPoint3(Vector p);
Vector ProjectPoint4(Vector p, double *w); Vector ProjectPoint4(Vector p, double *w);
void AnimateOnto(Quaternion quatf, Vector offsetf);
void AnimateOntoWorkplane(void); void AnimateOntoWorkplane(void);
Vector VectorFromProjs(Vector rightUpForward); Vector VectorFromProjs(Vector rightUpForward);
void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin, void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin,

View File

@ -527,6 +527,19 @@ static BOOL ProcessKeyDown(WPARAM wParam)
case VK_DELETE: c = 127; break; case VK_DELETE: c = 127; break;
case VK_TAB: c = '\t'; break; case VK_TAB: c = '\t'; break;
case VK_F1:
case VK_F2:
case VK_F3:
case VK_F4:
case VK_F5:
case VK_F6:
case VK_F7:
case VK_F8:
case VK_F9:
case VK_F10:
case VK_F11:
case VK_F12: c = (wParam - VK_F1) + 0xf1; break;
// These overlap with some character codes that I'm using, so // These overlap with some character codes that I'm using, so
// don't let them trigger by accident. // don't let them trigger by accident.
case VK_F16: case VK_F16: