1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-26 10:19:45 +03:00
occt/src/Viewer2dTest/Viewer2dTest_ViewerCommands.cxx
2012-03-05 19:23:40 +04:00

1576 lines
45 KiB
C++
Executable File

// File: Viewer2dTest_ViewerCommands.cxx
#define OCC198 // jfa 06/03/2002 // to prevent exception on bad font index
#define OCC199 // jfa 06/03/2002 // to prevent exception on bad color index
#ifdef WNT
#include <windows.h>
#endif
#include <Viewer2dTest.hxx>
#include <Viewer2dTest_EventManager.hxx>
#include <Viewer2dTest_DataMapOfText.hxx>
#include <AIS2D_InteractiveContext.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw.hxx>
#ifndef WNT
#include <tk.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <Graphic3d_GraphicDevice.hxx>
#include <Xw_Window.hxx>
#include <Xw_Driver.hxx>
#else
#include <Graphic3d_WNTGraphicDevice.hxx>
#include <WNT_WClass.hxx>
#include <WNT_Window.hxx>
#include <WNT_WDriver.hxx>
#include <stdio.h>
#endif
#include <V2d_Viewer.hxx>
#include <V2d_View.hxx>
#include <Graphic2d_Text.hxx>
#include <PS_Driver.hxx>
//==============================================================================
// VIEWER GLOBALs
//==============================================================================
Standard_IMPORT Standard_Boolean Draw_VirtualWindows;
Standard_EXPORT int ViewerMainLoop2d (Standard_Integer , const char** argv);
#ifdef WNT
static Handle(Graphic3d_WNTGraphicDevice)& GetG2dDevice()
{
static Handle(Graphic3d_WNTGraphicDevice) GD;
return GD;
}
static Handle(WNT_Window)& VT_GetWindow2d()
{
static Handle(WNT_Window) WNTWin;
return WNTWin;
}
#else
static Handle(Graphic3d_GraphicDevice)& GetG2dDevice()
{
static Handle(Graphic3d_GraphicDevice) GD;
return GD;
}
static Handle(Xw_Window)& VT_GetWindow2d()
{
static Handle(Xw_Window) XWWin;
return XWWin;
}
static Display* display2d;
static void VProcessEvents2d (ClientData, int);
#endif
#define ZCLIPWIDTH 1.
static Viewer2dTest_DataMapOfText myMapOfText;
static void OSWindowSetup2d();
//==============================================================================
// EVENT GLOBAL VARIABLES
//==============================================================================
static int Start_Rot = 0;
static int ZClipIsOn = 0;
static int X_Motion = 0, Y_Motion = 0; // Current cursor position
static int X_ButtonPress = 0, Y_ButtonPress = 0; // Last ButtonPress position
//==============================================================================
#ifdef WNT
static LRESULT WINAPI Viewer2dWindowProc (HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
#endif
//==============================================================================
//function : WClass
//purpose :
//==============================================================================
static Handle(MMgt_TShared)& WClass()
{
static Handle(MMgt_TShared) theWClass;
#ifdef WNT
if (theWClass.IsNull()) {
theWClass = new WNT_WClass ("GW2D_Class", Viewer2dWindowProc,
CS_VREDRAW | CS_HREDRAW, 0, 0,
::LoadCursor (NULL, IDC_ARROW));
}
#endif
return theWClass;
}
//==============================================================================
//function : ViewerInit
//purpose : Create the window viewer and initialize all the global variable
//==============================================================================
void Viewer2dTest::ViewerInit (const Standard_Integer thePxLeft, const Standard_Integer thePxTop,
const Standard_Integer thePxWidth, const Standard_Integer thePxHeight)
{
static Standard_Boolean isFirst = Standard_True;
Standard_Integer aPxLeft = 0;
Standard_Integer aPxTop = 50;
Standard_Integer aPxWidth = 409;
Standard_Integer aPxHeight = 409;
if (thePxWidth != 0 && thePxHeight != 0)
{
aPxLeft = thePxLeft;
aPxTop = thePxTop;
aPxWidth = thePxWidth;
aPxHeight = thePxHeight;
}
if (isFirst)
{
Handle(Aspect_WindowDriver) aWindowDriver;
#ifdef WNT
// Create the Graphic device
if (GetG2dDevice().IsNull())
GetG2dDevice() = new Graphic3d_WNTGraphicDevice();
// Create window
if (VT_GetWindow2d().IsNull())
{
Handle(WNT_GraphicDevice) g_Device = new WNT_GraphicDevice();
VT_GetWindow2d() = new WNT_Window (g_Device, "Test2d",
Handle(WNT_WClass)::DownCast (WClass()),
WS_OVERLAPPEDWINDOW,
aPxLeft, aPxTop,
aPxWidth, aPxHeight,
Quantity_NOC_BLACK);
VT_GetWindow2d()->SetVirtual (Draw_VirtualWindows);
// force drawing into offscreen bitmap
VT_GetWindow2d()->SetDoubleBuffer (Standard_True);
}
// Create window driver
aWindowDriver = new WNT_WDriver(VT_GetWindow2d());
#else
// Create the Graphic device
if (GetG2dDevice().IsNull())
GetG2dDevice() = new Graphic3d_GraphicDevice (getenv("DISPLAY"), Xw_TOM_READONLY);
// Create window
if (VT_GetWindow2d().IsNull())
{
VT_GetWindow2d() = new Xw_Window (GetG2dDevice(), "Test2d",
aPxLeft, aPxTop,
aPxWidth, aPxHeight,
Xw_WQ_3DQUALITY,
Quantity_NOC_BLACK);
VT_GetWindow2d()->SetVirtual (Draw_VirtualWindows);
// force drawing into offscreen bitmap
VT_GetWindow2d()->SetDoubleBuffer (Standard_True);
}
// Create window driver
aWindowDriver = new Xw_Driver(VT_GetWindow2d());
#endif
TCollection_ExtendedString NameOfWindow("Visu3D");
Handle(V2d_Viewer) a3DViewer,a3DCollector;
// Create Viewer and View
a3DViewer = new V2d_Viewer(GetG2dDevice(), NameOfWindow.ToExtString());
NameOfWindow = TCollection_ExtendedString("Collector");
a3DCollector = new V2d_Viewer(GetG2dDevice(), NameOfWindow.ToExtString());
// a3DViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
// a3DCollector->SetDefaultBackgroundColor(Quantity_NOC_STEELBLUE);
if (Viewer2dTest::CurrentView().IsNull())
{
// VT_GetWindow2d()->SetBackground(Quantity_NOC_MATRAGRAY);
Handle(V2d_View) V = new V2d_View(aWindowDriver, a3DViewer);
Viewer2dTest::CurrentView(V);
}
Handle(V2d_View) a3DViewCol = new V2d_View(aWindowDriver, a3DCollector);
// AIS2D setup
if (Viewer2dTest::GetAIS2DContext().IsNull())
{
Handle(AIS2D_InteractiveContext) C = new AIS2D_InteractiveContext(a3DViewer,a3DCollector);
Viewer2dTest::SetAIS2DContext(C);
}
// Setup for X11 or NT
OSWindowSetup2d();
// Viewer and View creation
// a3DViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
Handle(V2d_View) V = Viewer2dTest::CurrentView();
// V->SetDegenerateModeOn();
// V->SetWindow(VT_GetWindow2d());
// V->SetZClippingDepth(0.5);
// V->SetZClippingWidth(ZCLIPWIDTH/2.);
// a3DViewer->SetDefaultLights();
// a3DViewer->SetLightOn();
#ifndef WNT
#if TCL_MAJOR_VERSION < 8
Tk_CreateFileHandler((void*)ConnectionNumber(display2d),
TK_READABLE, VProcessEvents2d, (ClientData) VT_GetWindow2d()->XWindow());
#else
Tk_CreateFileHandler(ConnectionNumber(display2d),
TK_READABLE, VProcessEvents2d, (ClientData) VT_GetWindow2d()->XWindow());
#endif
#endif
isFirst = Standard_False;
}
VT_GetWindow2d()->Map();
}
//==============================================================================
//function : V2dinit
//purpose : Create the window viewer and initialize all the global variable
// Use Tk_CreateFileHandler on UNIX to cath the X11 Viewer event
//==============================================================================
static int V2dInit (Draw_Interpretor& , Standard_Integer argc, const char** argv)
{
Standard_Integer aPxLeft = (argc > 1) ? atoi (argv[1]) : 0;
Standard_Integer aPxTop = (argc > 2) ? atoi (argv[2]) : 0;
Standard_Integer aPxWidth = (argc > 3) ? atoi (argv[3]) : 0;
Standard_Integer aPxHeight = (argc > 4) ? atoi (argv[4]) : 0;
Viewer2dTest::ViewerInit (aPxLeft, aPxTop, aPxWidth, aPxHeight);
return 0;
}
//==============================================================================
//function : ProcessKeyPress2d
//purpose : Handle KeyPress event from a CString
//==============================================================================
static void ProcessKeyPress2d (char *buf_ret)
{
// Letters
if (!strcasecmp(buf_ret, "R"))
{
// Reset
Viewer2dTest::CurrentView()->Reset();
}
else if (!strcasecmp(buf_ret, "F"))
{
// FitAll
Viewer2dTest::CurrentView()->Fitall();
}
else if (!strcasecmp(buf_ret, "H"))
{
// HLR
cout << "HLR" << endl;
// Viewer2dTest::CurrentView()->SetDegenerateModeOff();
}
else if (!strcasecmp(buf_ret, "S"))
{
// SHADING
cout << "passage en mode 1 (shading pour les shapes)" << endl;
// Viewer2dTest::CurrentView()->SetDegenerateModeOn();
Handle(AIS2D_InteractiveContext) Ctx = Viewer2dTest::GetAIS2DContext();
// if (Ctx->NbCurrents() == 0 || Ctx->NbSelected() == 0)
// Ctx->SetDisplayMode(AIS2D_Shaded);
// else
{
if (Ctx->HasOpenedContext())
{
// for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
// Ctx->SetDisplayMode(Ctx->Interactive(), 1, Standard_False);
}
else
{
// for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
// Ctx->SetDisplayMode(Ctx->Current(), 1, Standard_False);
}
Ctx->UpdateCurrentViewer();
}
}
else if (!strcasecmp(buf_ret, "U"))
{
// Unset display mode
cout << "passage au mode par defaut" << endl;
// Viewer2dTest::CurrentView()->SetDegenerateModeOn();
Handle(AIS2D_InteractiveContext) Ctx = Viewer2dTest::GetAIS2DContext();
// if (Ctx->NbCurrents() == 0 || Ctx->NbSelected() == 0)
// Ctx->SetDisplayMode(AIS2D_WireFrame);
// else
{
if(Ctx->HasOpenedContext())
{
// for (Ctx->InitSelected(); Ctx->MoreSelected(); Ctx->NextSelected())
// Ctx->UnsetDisplayMode(Ctx->Interactive(), Standard_False);
}
else
{
// for (Ctx->InitCurrent(); Ctx->MoreCurrent(); Ctx->NextCurrent())
// Ctx->UnsetDisplayMode(Ctx->Current(), Standard_False);
}
Ctx->UpdateCurrentViewer();
}
}
else if (!strcasecmp(buf_ret, "W"))
{
// WIREFRAME
cout << "passage en mode 0 (filaire pour les shapes)" << endl;
// Viewer2dTest::CurrentView()->SetDegenerateModeOn();
Handle(AIS2D_InteractiveContext) Ctx = Viewer2dTest::GetAIS2DContext();
// if (Ctx->NbCurrents() == 0 || Ctx->NbSelected() == 0)
// Ctx->SetDisplayMode(AIS2D_WireFrame);
// else
{
if (Ctx->HasOpenedContext())
{
// for (Ctx->InitSelected(); Ctx->MoreSelected(); Ctx->NextSelected())
// Ctx->SetDisplayMode(Ctx->Interactive(), 0, Standard_False);
}
else
{
// for (Ctx->InitCurrent(); Ctx->MoreCurrent(); Ctx->NextCurrent())
// Ctx->SetDisplayMode(Ctx->Current(), 0, Standard_False);
}
Ctx->UpdateCurrentViewer();
}
}
else if (!strcasecmp(buf_ret, "D"))
{
// Delete selected
cout << "Delete selected object - not yet implemented" << endl;
Viewer2dTest::CurrentView()->Reset();
}
else if (!strcasecmp(buf_ret, "Z"))
{
// ZCLIP
if (ZClipIsOn)
{
cout << "ZClipping OFF" << endl;
ZClipIsOn = 0;
// Viewer2dTest::CurrentView()->SetZClippingType(V2d_OFF);
// Viewer2dTest::CurrentView()->Redraw();
}
else
{
cout << "ZClipping ON" << endl;
ZClipIsOn = 1;
// Viewer2dTest::CurrentView()->SetZClippingType(V2d_FRONT);
// Viewer2dTest::CurrentView()->Redraw();
}
}
else if (!strcasecmp(buf_ret, ","))
{
// Viewer2dTest::GetAIS2DContext()->HilightNextDetected(Viewer2dTest::CurrentView());
}
else if (!strcasecmp(buf_ret, "."))
{
// Viewer2dTest::GetAIS2DContext()->HilightPreviousDetected(Viewer2dTest::CurrentView());
}
else // Number
{
Standard_Integer Num = atoi(buf_ret);
if (Num >= 0 && Num <= 7)
Viewer2dTest::StandardModeActivation(Num);
}
}
//==============================================================================
//function : ProcessExpose2d
//purpose : Redraw the View on an Expose Event
//==============================================================================
static void ProcessExpose2d()
{
Viewer2dTest::CurrentView()->Viewer()->Update();
// Viewer2dTest::CurrentView()->Redraw();
}
//==============================================================================
//function : ProcessConfigure2d
//purpose : Resize the View on an Configure Event
//==============================================================================
static void ProcessConfigure2d()
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
V->MustBeResized(V2d_TOWRE_ENLARGE_OBJECTS);
V->Update();
// V->Redraw();
V->Viewer()->Update();
}
//==============================================================================
//function : V2dPickGrid
//purpose : v2dpickgrid : get coordinates of a grid point near to MB1 click
//==============================================================================
static int V2dHitGrid (int argc, Standard_Integer anX, Standard_Integer anY,
const char* xxname = 0, const char* yyname = 0)
{
if (argc != 1 && argc != 3 && argc != 5)
{
cout << "Usage : V2dHitGrid [mouse_X mouse_Y [grid_X grid_Y]]" << endl;
return 1;
}
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (V.IsNull()) return 1;
if (V->Viewer()->IsActive()) // about the grid
{
// if (argc == 1)
// {
// cout << "Mouse cursor position: X = " << anX << " Y = " << anY << endl;
// }
Quantity_Length xx, yy;
V->Hit(anX, anY, xx, yy);
Standard_Integer xw, yw;
V->Convert(xx, yy, xw, yw);
printf("Window coords of Grid Point: X = %d Y = %d\n", xw, yw);
if (argc < 5)
{
printf("Grid Point: X = %.6g Y = %.6g\n", xx, yy);
}
else
{
char szbuf[32];
sprintf(szbuf, "%.6g", xx);
Draw::Set(xxname, szbuf);
sprintf(szbuf, "%.6g", yy);
Draw::Set(yyname, szbuf);
}
}
return 0;
}
Standard_EXPORT int V2dPickGrid (Draw_Interpretor& , Standard_Integer argc, const char** argv)
{
if (argc != 1 && argc != 3 && argc != 5)
{
cout << "Usage : v2dpickgrid (MB1 in the viewer)" << endl;
cout << "Usage : v2dgetgrid mouse_X mouse_Y [grid_X grid_Y]" << endl;
return 1;
}
if (argc > 1)
{
if (argc > 3)
{
const char *xxname, *yyname;
xxname = argv[3];
yyname = argv[4];
V2dHitGrid(argc, atoi(argv[1]), atoi(argv[2]), xxname, yyname);
}
else
{
V2dHitGrid(argc, atoi(argv[1]), atoi(argv[2]));
}
}
else
{
while (ViewerMainLoop2d (argc, argv)) {}
}
return 0;
}
//==============================================================================
//function : ProcessButton1Press2d
//purpose : Picking
//==============================================================================
static Standard_Boolean ProcessButton1Press2d
(Standard_Integer , const char** argv, Standard_Boolean pick, Standard_Boolean shift)
{
if (pick)
{
cout << "Window X = " << X_ButtonPress << " Window Y = " << Y_ButtonPress << endl;
if (strlen(argv[0]) > 7) // v2dpickgrid
{
V2dHitGrid(1, X_ButtonPress, Y_ButtonPress);
}
else
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (V.IsNull()) return 1;
Quantity_Length xx, yy;
V->Convert(X_ButtonPress, Y_ButtonPress, xx, yy);
printf("Coord system X = %.6g Y = %.6g\n", xx, yy);
}
}
Handle(Viewer2dTest_EventManager) EM = Viewer2dTest::CurrentEventManager();
if (shift) EM->ShiftSelect();
else EM->Select();
pick = 0;
return pick;
}
//==============================================================================
//function : ProcessButton3Press2d
//purpose : Start Rotation
//==============================================================================
static void ProcessButton3Press2d()
{
// Start rotation
Start_Rot = 1;
// Viewer2dTest::CurrentView()->SetDegenerateModeOn();
// Viewer2dTest::CurrentView()->StartRotation(X_ButtonPress, Y_ButtonPress);
}
//==============================================================================
//function : ProcessButtonRelease2d
//purpose : End Rotation
//==============================================================================
static void ProcessButtonRelease2d()
{
// End rotation
Start_Rot = 0;
// Viewer2dTest::CurrentView()->SetDegenerateModeOff();
}
//==============================================================================
//function : ProcessZClipMotion2d
//purpose : Zoom
//==============================================================================
void ProcessZClipMotion2d()
{
Handle(V2d_View) a3DView = Viewer2dTest::CurrentView();
if (Abs(X_Motion - X_ButtonPress) > 2)
{
static Standard_Real CurZPos = 0.;
// Quantity_Length VDX, VDY;
// a3DView->Size(VDX,VDY);
#ifdef DEB
// Standard_Real VDZ =
#endif
// a3DView->ZSize();
Quantity_Length dx = a3DView->Convert(X_Motion - X_ButtonPress);
// Front = Depth + width/2.
Standard_Real D = 0.5;
// Standard_Real W = 0.1;
CurZPos += (dx);
D += CurZPos;
// a3DView->SetZClippingType(V2d_OFF);
// a3DView->SetZClippingDepth(D);
// a3DView->SetZClippingWidth(W);
// a3DView->SetZClippingType(V2d_FRONT);
// a3DView->Redraw();
X_ButtonPress = X_Motion;
Y_ButtonPress = Y_Motion;
}
}
//==============================================================================
//function : ProcessControlButton1Motion2d
//purpose : Zoom on Ctrl+MB1
//==============================================================================
static void ProcessControlButton1Motion2d()
{
Viewer2dTest::CurrentView()->Zoom(X_ButtonPress, Y_ButtonPress, X_Motion, Y_Motion);
X_ButtonPress = X_Motion;
Y_ButtonPress = Y_Motion;
}
//==============================================================================
//function : ProcessControlButton2Motion2d
//purpose : Pan on Ctrl+MB2
//==============================================================================
static void ProcessControlButton2Motion2d()
{
Viewer2dTest::CurrentView()->Pan(X_Motion - X_ButtonPress, Y_ButtonPress - Y_Motion);
X_ButtonPress = X_Motion;
Y_ButtonPress = Y_Motion;
}
//==============================================================================
//function : ProcessControlButton3Motion2d
//purpose : Rotation on Ctrl+MB3
//==============================================================================
static void ProcessControlButton3Motion2d()
{
// if (Start_Rot) Viewer2dTest::CurrentView()->Rotation(X_Motion, Y_Motion);
}
//==============================================================================
//function : ProcessMotion2d
//purpose : pre-hilights detected objects at mouse position
//==============================================================================
static void ProcessMotion2d()
{
Handle(Viewer2dTest_EventManager) EM = Viewer2dTest::CurrentEventManager();
Handle(V2d_View) V = Viewer2dTest::CurrentView();
EM->MoveTo(X_Motion, Y_Motion, V);
}
//==============================================================================
//function : ProcessGridMotion2d
//purpose : pre-hilights grid point near mouse position
//==============================================================================
static void ProcessGridMotion2d()
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
static Standard_Boolean LastIsGridActiveStatus = Standard_True;
if (V->Viewer()->IsActive()) // about the grid
{
V->ShowHit(X_Motion, Y_Motion);
LastIsGridActiveStatus = Standard_True;
}
if (!V->Viewer()->IsActive() && LastIsGridActiveStatus) // about the grid
{
V->EraseHit();
LastIsGridActiveStatus = Standard_False;
}
}
//==============================================================================
//function : GetMousePosition
//purpose :
//==============================================================================
void Viewer2dTest::GetMousePosition (Standard_Integer& Xpix, Standard_Integer& Ypix)
{
Xpix = X_Motion;
Ypix = Y_Motion;
}
//==============================================================================
//function : V2dHelp
//purpose : Dsiplay help on viewer Keyboead and mouse commands
//Draw arg : No args
//==============================================================================
/*static int V2dHelp (Draw_Interpretor& , Standard_Integer , const char** )
{
cout << "Q : Quit the application" << endl;
cout << "=========================" << endl;
cout << "F : FitAll" << endl;
cout << "R : ResetView" << endl;
cout << "=========================" << endl;
cout << "Selection mode " << endl;
cout << "0 : OBJECT" << endl;
cout << "1 : PRIMITIVE" << endl;
cout << "2 : ELEMENT" << endl;
cout << "3 : VERTEX" << endl;
cout << "4 : NONE" << endl;
cout << "==========================" << endl;
cout << "D : Remove Selected Object" << endl;
cout << "==========================" << endl;
return 0;
}*/
#ifdef WNT
static LRESULT WINAPI Viewer2dWindowProc (HWND hwnd, UINT Msg,
WPARAM wParam, LPARAM lParam )
{
static Standard_Boolean Ppick = 0;
static Standard_Integer Pargc = 0;
static const char** Pargv = NULL;
static int Up = 1;
if (!Viewer2dTest::CurrentView().IsNull())
{
PAINTSTRUCT ps;
switch (Msg)
{
case WM_CLOSE:
// do not destroy the window - just hide it!
VT_GetWindow2d()->Unmap();
return 0;
case WM_PAINT:
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
ProcessExpose2d();
break;
case WM_SIZE:
ProcessConfigure2d();
break;
case WM_KEYDOWN:
char c[2];
c[0] = (char) wParam;
c[1] = '\0';
ProcessKeyPress2d(c);
break;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
Up = 1;
ProcessButtonRelease2d();
break;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
{
WPARAM fwKeys = wParam;
Up = 0;
X_ButtonPress = LOWORD(lParam);
Y_ButtonPress = HIWORD(lParam);
if (Msg == WM_LBUTTONDOWN && !(fwKeys & MK_CONTROL))
{
Ppick = ProcessButton1Press2d(Pargc, Pargv, Ppick, (fwKeys & MK_SHIFT));
}
else if (Msg == WM_RBUTTONDOWN)
{
// Start rotation
ProcessButton3Press2d();
}
}
break;
case WM_MOUSEMOVE:
{
WPARAM fwKeys = wParam;
X_Motion = LOWORD(lParam);
Y_Motion = HIWORD(lParam);
if (Up && fwKeys & (MK_LBUTTON|MK_MBUTTON|MK_RBUTTON))
{
Up = 0;
X_ButtonPress = LOWORD(lParam);
Y_ButtonPress = HIWORD(lParam);
if (fwKeys & MK_RBUTTON)
{
// Start rotation
ProcessButton3Press2d();
}
}
if (fwKeys & MK_CONTROL)
{
if (fwKeys & MK_LBUTTON)
{
ProcessControlButton1Motion2d();
}
else if (fwKeys & MK_MBUTTON || ((fwKeys&MK_LBUTTON) && (fwKeys&MK_RBUTTON)))
{
ProcessControlButton2Motion2d();
}
else if (fwKeys & MK_RBUTTON)
{
ProcessControlButton3Motion2d();
}
}
else if (fwKeys & MK_SHIFT)
{
if (fwKeys & MK_MBUTTON || ((fwKeys&MK_LBUTTON) && (fwKeys&MK_RBUTTON)))
{
ProcessZClipMotion2d();
}
}
else
{
ProcessMotion2d();
}
}
break;
default:
return(DefWindowProc(hwnd, Msg, wParam, lParam));
}
return 0L;
}
return DefWindowProc(hwnd, Msg, wParam, lParam);
}
//==============================================================================
//function : ViewerMainLoop2d
//purpose : Get a Event on the view and dispatch it
//==============================================================================
static int ViewerMainLoop2d (Standard_Integer argc, const char** argv)
{
cout << "No yet implemented on WNT" << endl;
static Standard_Boolean Ppick = 0;
static Standard_Integer Pargc = 0;
static const char** Pargv = NULL;
Ppick = (argc > 0)? -1 : 0;
Pargc = argc;
Pargv = argv;
if (Ppick)
{
MSG msg;
msg.wParam = 1;
cout << "Start picking" << endl;
while (Ppick == -1)
{
// Wait for a ProcessButton1Press2d() to toggle pick to 1 or 0
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
cout << "Picking done" << endl;
}
return Ppick;
}
#else
//==============================================================================
//function : ViewerMainLoop2d
//purpose : Get a Event on the view and dispatch it
//==============================================================================
int ViewerMainLoop2d (Standard_Integer argc, const char** argv)
{
Standard_Boolean pick = argc > 0;
// X11 Event loop
static XEvent report;
XNextEvent(display2d, &report);
switch (report.type)
{
case Expose:
ProcessExpose2d();
break;
case ConfigureNotify:
ProcessConfigure2d();
break;
case KeyPress:
{
KeySym ks_ret;
char buf_ret[11];
int ret_len;
XComposeStatus status_in_out;
ret_len = XLookupString((XKeyEvent *)&report, (char *) buf_ret,
10, &ks_ret, &status_in_out);
buf_ret[ret_len] = '\0';
if (ret_len) ProcessKeyPress2d(buf_ret);
}
break;
case ButtonPress:
{
X_ButtonPress = report.xbutton.x;
Y_ButtonPress = report.xbutton.y;
if (report.xbutton.button == Button1 &&
!(report.xbutton.state & ControlMask))
{
pick = ProcessButton1Press2d(argc, argv, pick,
(report.xbutton.state & ShiftMask));
}
else if (report.xbutton.button == Button3)
{
// Start rotation
ProcessButton3Press2d();
}
}
break;
case ButtonRelease:
ProcessButtonRelease2d();
break;
case MotionNotify:
{
X_Motion = report.xmotion.x;
Y_Motion = report.xmotion.y;
// remove all the ButtonMotionMask
while (XCheckMaskEvent(display2d, ButtonMotionMask, &report)) {}
if (ZClipIsOn && report.xmotion.state & ShiftMask)
{
if (Abs(X_Motion - X_ButtonPress) > 2)
{
Quantity_Length VDX = 0.0, VDY = 0.0;
// Viewer2dTest::CurrentView()->Size(VDX,VDY);
Standard_Real VDZ =0 ;
// VDZ = Viewer2dTest::CurrentView()->ZSize();
printf("%f,%f,%f\n", VDX, VDY, VDZ);
Quantity_Length dx = 0 ;
dx = Viewer2dTest::CurrentView()->Convert(X_Motion - X_ButtonPress);
cout << dx << endl;
dx = dx / VDX * VDZ;
cout << dx << endl;
// Front = Depth + width/2.
//Viewer2dTest::CurrentView()->SetZClippingDepth(dx);
//Viewer2dTest::CurrentView()->SetZClippingWidth(0.);
// Viewer2dTest::CurrentView()->Redraw();
}
}
if (report.xmotion.state & ControlMask)
{
if (report.xmotion.state & Button1Mask)
{
ProcessControlButton1Motion2d();
}
else if (report.xmotion.state & Button2Mask)
{
ProcessControlButton2Motion2d();
}
else if (report.xmotion.state & Button3Mask)
{
ProcessControlButton3Motion2d();
}
}
else
{
if (pick && strlen(argv[0]) > 7) // v2dpickgrid
ProcessGridMotion2d();
else
ProcessMotion2d();
}
}
break;
}
return pick;
}
//==============================================================================
//function : VProcessEvents2d
//purpose : call by Tk_CreateFileHandler() to be able to manage the
// event in the Viewer window
//==============================================================================
static void VProcessEvents2d (ClientData, int)
{
// test for X Event
while (XPending(display2d))
{
ViewerMainLoop2d(0, NULL);
}
}
#endif
//==============================================================================
//function : OSWindowSetup2d
//purpose : Setup for the X11 window to be able to cath the event
//==============================================================================
static void OSWindowSetup2d()
{
#ifndef WNT
// X11
Window window = VT_GetWindow2d()->XWindow();
Standard_Address theDisplay = GetG2dDevice()->XDisplay();
display2d = (Display * ) theDisplay;
XSynchronize(display2d, 1);
VT_GetWindow2d()->Map();
// X11 : For keyboard on SUN
XWMHints wmhints;
wmhints.flags = InputHint;
wmhints.input = 1;
XSetWMHints( display2d, window, &wmhints);
XSelectInput(display2d, window,
ExposureMask | StructureNotifyMask | KeyPressMask | ButtonPressMask |
PointerMotionMask |
Button1MotionMask | Button2MotionMask | Button3MotionMask);
XSynchronize(display2d, 0);
#else
// WNT
#endif
}
//==============================================================================
//function : InitViewer2dTest
//purpose : initialisation de toutes les variables static de Viewer2dTest (dp)
//==============================================================================
void Viewer2dTest_InitViewer2dTest (const Handle(AIS2D_InteractiveContext)& context)
{
Handle(V2d_Viewer) viewer = context->CurrentViewer();
Viewer2dTest::SetAIS2DContext(context);
viewer->InitActiveViews();
Handle(V2d_View) view = viewer->ActiveView();
if (viewer->MoreActiveViews()) Viewer2dTest::CurrentView(view);
Viewer2dTest::ResetEventManager();
Handle(Aspect_GraphicDevice) device = viewer->Device();
Handle(Aspect_WindowDriver) aWDr = view->Driver();
Handle(Aspect_Window) window = aWDr->Window();
#ifndef WNT
// X11
VT_GetWindow2d() = Handle(Xw_Window)::DownCast(window);
GetG2dDevice() = Handle(Graphic3d_GraphicDevice)::DownCast(device);
OSWindowSetup2d();
static int first = 1;
if (first)
{
#if TCL_MAJOR_VERSION < 8
Tk_CreateFileHandler((void*)ConnectionNumber(display2d),
TK_READABLE, VProcessEvents2d, (ClientData) 0);
#else
Tk_CreateFileHandler(ConnectionNumber(display2d),
TK_READABLE, VProcessEvents2d, (ClientData) 0);
#endif
first = 0;
}
#endif
}
//==============================================================================
//function : V2dFit
//purpose : Fitall, no DRAW arguments
//Draw arg : No args
//==============================================================================
static int V2dFit (Draw_Interpretor& , Standard_Integer , const char** )
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (!V.IsNull()) V->Fitall();
return 0;
}
//==============================================================================
//function : V2dRepaint
//purpose : refresh viewer
//Draw arg : No args
//==============================================================================
static int V2dRepaint (Draw_Interpretor& , Standard_Integer , const char** )
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (!V.IsNull())
// V->Redraw();
V->Viewer()->Update();
return 0;
}
//==============================================================================
//function : V2dClear
//purpose : Remove all the object from the viewer
//Draw arg : No args
//==============================================================================
static int V2dClear (Draw_Interpretor& , Standard_Integer , const char** )
{
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (V.IsNull()) return 1;
Viewer2dTest::Clear();
V->Viewer()->Update();
return 0;
}
//==============================================================================
//function : V2dPick
//purpose : v2dpick - print mouse coords and color
//==============================================================================
static int V2dPick (Draw_Interpretor& , Standard_Integer argc, const char** argv)
{
if (argc != 1)
{
cout << "Usage: v2dpick (MB1 in the viewer)" << endl;
return 1;
}
if (Viewer2dTest::CurrentView().IsNull()) return 1;
while (ViewerMainLoop2d (argc, argv)) {}
return 0;
}
//==============================================================================
//function : V2dSetBG
//purpose : v2dsetbg imagefile [filltype] : load image as background
//==============================================================================
static int V2dSetBG (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 2 || argc > 3)
{
di << "Usage : v2dsetbg imagefile [filltype]" << "\n";
return 1;
}
if (Viewer2dTest::CurrentView().IsNull()) return 1;
Aspect_FillMethod aFillType = Aspect_FM_CENTERED;
if (argc == 3)
{
const char* szType = argv[2];
if (strcmp(szType, "NONE" ) == 0) aFillType = Aspect_FM_NONE;
else if (strcmp(szType, "CENTERED") == 0) aFillType = Aspect_FM_CENTERED;
else if (strcmp(szType, "TILED" ) == 0) aFillType = Aspect_FM_TILED;
else if (strcmp(szType, "STRETCH" ) == 0) aFillType = Aspect_FM_STRETCH;
else
{
di << "Wrong fill type : " << szType << "\n";
di << "Must be one of CENTERED, TILED, STRETCH, NONE" << "\n";
return -1;
}
}
Viewer2dTest::CurrentView()->SetBackground(argv[1], aFillType);
Viewer2dTest::CurrentView()->Viewer()->Update();
return 0;
}
//==============================================================================
//function : V2dGrid
//purpose : v2dgrid [type [Origin(X Y) XStep/RadiusStep YStep/DivisionNb RotationAngle] [drawmode]] : load grid
// : v2drmgrid : unload grid
//==============================================================================
static int V2dGrid (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (Viewer2dTest::CurrentView().IsNull()) return 1;
Handle(V2d_Viewer) aViewer = Viewer2dTest::CurrentView()->Viewer();
const char* szName = argv[0];
if (strcmp(szName, "v2drmgrid") == 0)
{
if (argc > 1)
{
di << "Usage : v2drmgrid" << "\n";
return 1;
}
aViewer->DeactivateGrid();
return 0;
}
// v2dgrid. Args nb may be 1,2,3,7,8
if (argc < 1 || argc > 8 || (argc < 7 && argc > 3))
{
di << "Usage : v2dgrid [type [Origin(X Y) XStep/RadiusStep YStep/DivisionNb RotationAngle] [drawmode]]" << "\n";
return 1;
}
Aspect_GridType aGridT = Aspect_GT_Rectangular;
Aspect_GridDrawMode aDrawM = Aspect_GDM_Lines;
if (argc > 1)
{
const char* szType = argv[1];
if (strcmp(szType, "Rect") == 0) aGridT = Aspect_GT_Rectangular;
else if (strcmp(szType, "Circ") == 0) aGridT = Aspect_GT_Circular;
else
{
di << "Wrong grid type : " << szType << "\n";
di << "Must be Rect or Circ" << "\n";
return -1;
}
if (argc == 3 || argc == 8)
{
const char* szMode = (argc == 3) ? argv[2] : argv[7];
if (strcmp(szMode, "Lines" ) == 0) aDrawM = Aspect_GDM_Lines;
else if (strcmp(szMode, "Points") == 0) aDrawM = Aspect_GDM_Points;
else if (strcmp(szMode, "None" ) == 0) aDrawM = Aspect_GDM_None;
else
{
di << "Wrong grid draw mode : " << szMode << "\n";
di << "Must be Lines or Points, or None" << "\n";
return -1;
}
}
}
aViewer->ActivateGrid(aGridT, aDrawM);
if (argc > 3)
{
Quantity_Length aXOrigin = atof(argv[2]);
Quantity_Length aYOrigin = atof(argv[3]);
Quantity_PlaneAngle aRotationAngle = atof(argv[6]);
if (aGridT == Aspect_GT_Rectangular)
{
Quantity_Length aXStep = atof(argv[4]);
Quantity_Length aYStep = atof(argv[5]);
aViewer->SetRectangularGridValues
(aXOrigin, aYOrigin, aXStep, aYStep, aRotationAngle);
}
else
{
Quantity_Length aRadiusStep = atof(argv[4]);
Standard_Integer aDivisionNumber = atoi(argv[5]);
aViewer->SetCircularGridValues
(aXOrigin, aYOrigin, aRadiusStep, aDivisionNumber, aRotationAngle);
}
}
return 0;
}
//==============================================================================
//function : V2dPSOut
//purpose : v2dpsout imagefile [Scale TypeOfColorSpace] [Width Height XCenter YCenter] : PostScript Output
//==============================================================================
static int V2dPSOut (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 2 || argc > 8)
{
di << "Usage : v2dpsout imagefile [Scale TypeOfColorSpace] [Width Height XCenter YCenter]" << "\n";
return 1;
}
Handle(V2d_View) V = Viewer2dTest::CurrentView();
if (V.IsNull()) return 1;
Quantity_Factor aScale = 1.0;
Aspect_TypeOfColorSpace aColorType = Aspect_TOCS_RGB;
Quantity_Length aWidth = 100.0, aHeight = 100.0;
Quantity_Length aXCenter, aYCenter;
V->Center(aXCenter, aYCenter);
if (argc > 2)
{
aScale = atof(argv[2]);
if (argc > 3)
{
const char* szType = argv[3];
if (strcmp(szType, "RGB") == 0) aColorType = Aspect_TOCS_RGB;
else if (strcmp(szType, "BlackAndWhite") == 0) aColorType = Aspect_TOCS_BlackAndWhite;
else if (strcmp(szType, "GreyScale") == 0) aColorType = Aspect_TOCS_GreyScale;
else
{
di << "Wrong color space type : " << szType << "\n";
di << "Must be one of RGB, BlackAndWhite, GreyScale" << "\n";
return -1;
}
if (argc == 8)
{
aWidth = atof(argv[4]);
aHeight = atof(argv[5]);
aXCenter = atof(argv[6]);
aYCenter = atof(argv[7]);
}
else // take current window size
{
#ifndef WNT
Handle(Aspect_Window) anAspWindow = V->Driver()->Window();
Handle(Xw_Window) anXWindow = Handle(Xw_Window)::DownCast(anAspWindow);
anXWindow->Size(aWidth, aHeight);
#endif
}
}
}
Viewer2dTest::CurrentView()->PostScriptOutput
(argv[1], aWidth, aHeight, aXCenter, aYCenter, aScale, aColorType);
return 0;
}
//==============================================================================
//function : V2dPlot
//purpose : v2dplot format imagefile [Scale TypeOfColorSpace] [Width Height XCenter YCenter]
//==============================================================================
/*static int V2dPlot (Draw_Interpretor& , Standard_Integer argc, const char** argv)
{
if (argc < 3 || argc > 9)
{
cout << "Args: format imagefile [Scale TypeOfColorSpace] [Width Height XCenter YCenter]" << endl;
return 1;
}
if (Viewer2dTest::CurrentView().IsNull()) return 1;
Quantity_Factor aScale = 1.0;
Aspect_TypeOfColorSpace aColorType = Aspect_TOCS_RGB;
Quantity_Length aWidth = 100.0, aHeight = 100.0;
Quantity_Length aXCenter, aYCenter;
Viewer2dTest::CurrentView()->Center(aXCenter, aYCenter);
if (argc > 3)
{
aScale = atof(argv[3]);
if (argc > 4)
{
char* szType = argv[4];
if (strcmp(szType, "RGB") == 0) aColorType = Aspect_TOCS_RGB;
else if (strcmp(szType, "BlackAndWhite") == 0) aColorType = Aspect_TOCS_BlackAndWhite;
else if (strcmp(szType, "GreyScale") == 0) aColorType = Aspect_TOCS_GreyScale;
else
{
cout << "Wrong color space type : " << szType << endl;
cout << "Must be one of RGB, BlackAndWhite, GreyScale" << endl;
return -1;
}
if (argc == 9)
{
aWidth = atof(argv[5]);
aHeight = atof(argv[6]);
aXCenter = atof(argv[7]);
aYCenter = atof(argv[8]);
}
}
}
char* szFormat = argv[1];
if (strcmp(szFormat, "PS") == 0)
{
Handle(PS_Driver) aPSDriver = new PS_Driver(argv[2], aWidth, aHeight, aColorType);
Viewer2dTest::CurrentView()->Plot(aPSDriver, aXCenter, aYCenter, aScale);
}
else if (strcmp(szFormat, "") == 0)
{
Handle(PS_Driver) aPSDriver = new PS_Driver(argv[2], aWidth, aHeight, aColorType);
Viewer2dTest::CurrentView()->Plot(aPSDriver, aXCenter, aYCenter, aScale);
}
else if (strcmp(szFormat, "") == 0)
{
}
else
{
}
return 0;
}*/
//=======================================================================
//function : V2dTextColor
//purpose : v2dsettextcolor text_name color_index
//=======================================================================
static int V2dTextColor (Draw_Interpretor& di, int argc, const char** argv)
{
if (argc != 3)
{
di << "Usage : v2dsettextcolor text_name color_index" << "\n";
return -1;
}
TCollection_AsciiString aName (argv[1]);
if (!myMapOfText.IsBound(aName))
{
di << "No such text object: " << aName.ToCString() << "\n";
return -1;
}
int aColInd = atoi(argv[2]);
#ifdef OCC199
// check color index
Standard_Integer aColMin, aColMax;
Viewer2dTest::CurrentView()->Driver()->ColorBoundIndexs(aColMin, aColMax);
if (aColInd < aColMin || aColMax < aColInd)
{
di << "Color index must be between " << aColMin << " and " << aColMax << "\n";
return -1;
}
#endif
myMapOfText(aName)->SetColorIndex(aColInd);
Viewer2dTest::CurrentView()->Viewer()->Update();
return 0;
}
//=======================================================================
//function : V2dText
//purpose : v2dtext text_str position(x y) [angle scale font]
//=======================================================================
static int V2dText (Draw_Interpretor& di, int argc, const char** argv)
{
if (argc != 4 && argc != 7)
{
di << "Usage : v2dtext text_str position(x y) [angle scale font]" << "\n";
return -1;
}
Handle(AIS2D_InteractiveContext) myAIScontext = Viewer2dTest::GetAIS2DContext();
if (myAIScontext.IsNull())
{
di << "use 'v2dinit' command before " << argv[0] << "\n";
return -1;
}
myAIScontext->SetPickMode(Graphic2d_PM_INTERSECT);
Handle(V2d_View) V = Viewer2dTest::CurrentView();
Handle(Graphic2d_GraphicObject) obj =
new Graphic2d_GraphicObject(V->View());
Quantity_PlaneAngle anAngle = 0.0;
Quantity_Factor aScale = 1.0;
Standard_Integer aFontIn = 0;
if (argc > 4)
{
anAngle = atof(argv[4]);
aScale = atof(argv[5]);
aFontIn = atoi(argv[6]);
#ifdef OCC198
// check font index
Standard_Integer aFontMin, aFontMax;
Viewer2dTest::CurrentView()->Driver()->FontBoundIndexs(aFontMin, aFontMax);
if (aFontIn < aFontMin || aFontMax < aFontIn)
{
di << "Font index must be between " << aFontMin << " and " << aFontMax << "\n";
return -1;
}
#endif
}
Handle(Graphic2d_Text) text =
new Graphic2d_Text(obj, TCollection_ExtendedString(argv[1]),
atof(argv[2]), atof(argv[3]), anAngle,
Aspect_TOT_SOLID, aScale);
text->SetFontIndex(aFontIn);
obj->Display();
V->Fitall();
int i = myMapOfText.Extent();
TCollection_AsciiString aTxtName ("text_");
aTxtName += TCollection_AsciiString(i);
myMapOfText.Bind(aTxtName, text);
di << "Text " << aTxtName.ToCString() << " created" << "\n";
return 0;
}
//==============================================================================
//function : V2Dump
//purpose : To dump the active view snapshot to the image file
//Draw arg : Picture file name with extension corresponding to desired format
//==============================================================================
static Standard_Integer V2dDump (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 2)
{
di << "Use: " << argv[0] << " <filename>.{png|bmp|jpg|gif}\n";
return 1;
}
Handle(AIS2D_InteractiveContext) IC = Viewer2dTest::GetAIS2DContext();
Handle(V2d_View) view = Viewer2dTest::CurrentView();
if (view.IsNull())
{
di << "Cannot find an active viewer/view\n";
return 1;
}
#ifdef WNT
Handle(WNT_Window) aWindow = Handle(WNT_Window)::DownCast (view->Driver()->Window());
#else
Handle(Xw_Window) aWindow = Handle(Xw_Window)::DownCast (view->Driver()->Window());
#endif
aWindow->Dump (argv[1]);
return 0;
}
//=======================================================================
//function : ViewerCommands
//purpose :
//=======================================================================
void Viewer2dTest::ViewerCommands(Draw_Interpretor& theCommands)
{
const char *group = "2D AIS Viewer - Viewer Commands";
theCommands.Add("v2dinit",
"v2dinit : v2dinit [leftPx topPx widthPx heightPx] : Create the Viewer window",
__FILE__, V2dInit, group);
theCommands.Add("v2dsetbg",
"v2dsetbg imagefile [filltype] : Load image as background",
__FILE__, V2dSetBG, group);
theCommands.Add("v2dgrid",
"v2dgrid [type [Origin(X Y) XStep/RadiusStep YStep/DivisionNb RotationAngle(in radians)] [drawmode]] : Load grid",
__FILE__, V2dGrid, group);
theCommands.Add("v2drmgrid",
"v2drmgrid : Unload grid",
__FILE__, V2dGrid, group);
// theCommands.Add("v2dplot",
// "v2dplot format filename : Dump in file in certain format",
// __FILE__, V2dPlot, group);
theCommands.Add("v2ddump",
"<filename>.{png|bmp|jpg|gif}\n\t\t: Dump contents of viewer window to PNG, BMP, JPEG or GIF file",
__FILE__, V2dDump, group);
theCommands.Add("v2dpsout",
"v2dpsout imagefile [Scale TypeOfColorSpace] [Width Height XCenter YCenter] : PostScript Output",
__FILE__, V2dPSOut, group);
theCommands.Add("v2dpick",
"v2dpick (MB1 in the viewer) : Print pixel coords and color",
__FILE__, V2dPick, group);
theCommands.Add("v2dpickgrid",
"v2dpickgrid (MB1 in the viewer) : Print coordinates of a grid point near to MB1 click",
__FILE__, V2dPickGrid, group);
theCommands.Add("v2dfit",
"v2dfit or <F> : Fit all shapes",
__FILE__, V2dFit, group);
theCommands.Add("v2drepaint",
"v2drepaint : Force redraw",
__FILE__, V2dRepaint, group);
theCommands.Add("v2dclear",
"v2dclear : Clear the viewer",
__FILE__, V2dClear, group);
theCommands.Add("v2dtext", "v2dtext text_str position(x y) [angle scale font]", V2dText, group);
theCommands.Add("v2dsettextcolor", "v2dsettextcolor text_name color_index", V2dTextColor, group);
// theCommands.Add("v2dhelp",
// "v2dhelp : Display help on the viewer commands",
// __FILE__, V2dHelp, group);
}