📄 igrid.c
字号:
/*
IGRID - Interactive Gridding Program.
Copyright (c) 1995 Thng Cheok Hoey
This program is free software; you can redistribute it and /or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 or License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY of FIT-
NESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 675 Mass
Ave, Cambridge, MA 02139, USA.
Author's email address: thng@mimicad.colorado.edu
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <commdlg.h>
#include "emgrid.h"
#include "geometry.h"
#include "mousemod.h"
HWND hwndMouseX, hwndMouseY, hwndMessage, hwndMessage2, hwndMessage3;
class block *blockselected = NULL;
class rectblk *rectblockselected = NULL;
class quadblk *quadblockselected = NULL;
class triblk *triblockselected = NULL;
blocklist unselected, selected, addon, copied, swaped;
double max(double, double);
double min(double, double);
// function declarations
long FAR PASCAL _export WndProc (HWND, UINT, UINT, LONG) ;
extern long FAR PASCAL _export PaperWndProc(HWND, UINT, UINT, LONG);
void DrawBitmap(HDC, HBITMAP, short, short);
void resetnextavailableid(void);
BOOL FAR PASCAL _export RectDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export QuadDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export TriDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export OptnDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export MoveDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export ResizeDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export RescaleDlgProc(HWND, UINT, UINT, LONG);
BOOL FAR PASCAL _export RotDlgProc(HWND, UINT, UINT, LONG);
BOOL GeoFileSaveDlg(HWND, LPSTR, LPSTR);
BOOL BdfFileSaveDlg(HWND, LPSTR, LPSTR);
BOOL BdfFileOpenDlg(HWND, LPSTR, LPSTR);
BOOL BdfImportDlg(HWND, LPSTR, LPSTR);
short AskAboutSave (HWND, char *);
void DoCaption (HWND, char *);
void OkMessage (HWND, char *, char *);
void PopFileInitialize(HWND);
void loadbitmaps(HANDLE);
void deletebitmaps(void);
void updatemodetoolbar(HWND);
void updatepropertytoolbar(HWND);
void adjustpapersize(dRECT);
void expandpapersize(dRECT);
extern void setdrawingcoord(HDC);
extern void adjustallowablesnap(void);
extern void rotatepoint(dPOINT *, const double, const double);
extern BOOL generategeoinfo(LPSTR);
extern BOOL savegdfinfo(LPSTR);
extern BOOL importgdfinfo(LPSTR, blocklist&);
extern COUNT numberexteriorelmts(void);
mousemode *mouse, *internalmode, *usermode;
pointermode pointer;
moveobjectmode mover;
rotateobjectmode rotater;
resizeobjectmode resizer;
modifymode modifier;
enquirymode enquirer;
addmode adder;
flags mousemode::flag = {NO, NO, NO, NO, NO, NO, NO};
PRPTY mousemode::property = 0;
int blockvacancy = YES;
char szAppName [] = "IGrid";
char szDrawPaper[] = "Drawing";
double vposition = 0.0, hposition = 0.0;
int statusheight;
int cxChar, cyChar;
int cxViewport, cyViewport;
int cxmaxViewport, cymaxViewport;
int zoomfactor = INITIALZOOMFACTOR;
int redrawflag = DETAILS;
long deskpixelwidth, deskpixelheight;
double xOffsetView, yOffsetView;
double viewwidth, viewheight;
double aspectratio;
double deskwidth = DEFAULTPAPERRIGHT - DEFAULTPAPERLEFT;
double deskheight = DEFAULTPAPERTOP - DEFAULTPAPERBOTTOM;
double paperwidth = DEFAULTPAPERRIGHT - DEFAULTPAPERLEFT;
double paperheight = DEFAULTPAPERTOP - DEFAULTPAPERBOTTOM;
double paperxcenter = (DEFAULTPAPERRIGHT + DEFAULTPAPERLEFT) / 2.0;
double paperycenter = (DEFAULTPAPERTOP + DEFAULTPAPERBOTTOM) / 2.0;
double unit = DEFAULTUNIT;
tol option = {YES, YES, POSITIONSNAP, ANGLEFACTOR, CONNECTSNAP, ALLOWABLESNAP, NO};
HPEN hPenDotBlack, hPenSolidBlack, hPenSolidYellow;
HPEN hPenArray[16];
HBRUSH hBrushNormal, hBrushHighlight;
LOGPEN lpBlack = { PS_DASH, 1, 1, RGB ( 0, 0, 0) };
char buffer[256] = "Cheok ";
static char ptrinstructn[] = "Draw a box to select block(s).";
static char ptrinstructn2[] = "Double-click on a block to view/modify its attributes.";
static char movinstructn[] = "Click to move a block by mouse.";
static char movinstructn2[] = "Double-click to move a block to an exact location.";
static char resizeinstructn[] = "Click on a corner to resize a block.";
static char resizeinstructn2[] = "Double-click on a corner or node to resize by an exact value.";
static char rotinstructn[] = "Click to rotate a block.";
static char rotinstructn2[] = "Double-click to rotate the block by an exact angle.";
static char modinstructn[] = "Draw a box to select boundary elements.";
static char modinstructn2[] = "Their attributes will be set according to the push-button pattern.";
static char enqinstructn[] = "";
static char enqinstructn2[] = "Click on a cell, side or node to see their attributes.";
static char connectmessage[80];
char sepsilon[32], ssigma[32],
smu[32], ssigma_mu[32],
sxloc[32], syloc[32],
slength1[32], slength2[32],
scornerx1[32], scornery1[32],
scornerx2[32], scornery2[32],
scornerx3[32], scornery3[32],
sdiv1[32], sdiv2[32],
sorientatn[32];
HWND hwndVertScrol, hwndHorzScrol;
HWND hwndMain, hwndPaper;
dRECT papersize = {DEFAULTPAPERLEFT, DEFAULTPAPERTOP,
DEFAULTPAPERRIGHT, DEFAULTPAPERBOTTOM};
HBITMAP hBmpzminoff, hBmpzminon, hBmpzmoutoff, hBmpzmouton;
HBITMAP hBmpptroff, hBmpptron, hBmpreszoff, hBmpreszon;
HBITMAP hBmpmsmovoff, hBmpmsmovon;
HBITMAP hBmprotoff, hBmproton, hBmpmodoff, hBmpmodon, hBmpenqoff, hBmpenqon;
HBITMAP hBmpabsoff, hBmpabson, hBmpmagoff, hBmpmagon;
HBITMAP hBmpelecoff, hBmpelecon, hBmpextoff, hBmpexton;
HBITMAP hBmprectoff, hBmprecton, hBmpquadoff, hBmpquadon;
HBITMAP hBmptrioff, hBmptrion;
dPOINT snapedcoord;
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg ;
WNDCLASS wndclass ;
HBRUSH hBrush;
loadbitmaps(hInstance);
if (!hPrevInstance){
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass) ;
wndclass.lpfnWndProc = PaperWndProc;
wndclass.cbWndExtra = sizeof (WORD);
wndclass.hIcon = NULL;
wndclass.lpszClassName = szDrawPaper;
RegisterClass(&wndclass);
}
hwndMain = CreateWindow (szAppName, "IGrid",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwndMain, nCmdShow) ;
UpdateWindow (hwndMain) ;
while (GetMessage (&msg, NULL, 0, 0)){
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
deletebitmaps();
return msg.wParam ;
}
long FAR PASCAL _export WndProc (HWND hwnd, UINT message, UINT wParam,
LONG lParam)
{
static BOOL bNeedSave = FALSE;
static char szBdfFileName[_MAX_PATH];
static char szBdfTitleName[_MAX_FNAME + _MAX_EXT];
static char szBdfImportFile[_MAX_PATH];
static char szBdfImportTitle[_MAX_FNAME + _MAX_EXT];
static char szGeoFileName[_MAX_PATH];
static char szGeoTitleName[_MAX_FNAME + _MAX_EXT];
static int wColorID [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH,
DKGRAY_BRUSH, BLACK_BRUSH } ;
static int cxClient, cyClient, sbheight, sbwidth;
static int cxFullscreen, cyFullscreen, cyMenu;
static int aspectx, aspecty;
static HWND hwndButton0, hwndButton1, hwndButton2, hwndButton3, hwndButton4,
hwndButton5, hwndButton6, hwndButton7, hwndButton8, hwndButton9,
hwndButton10, hwndButton11, hwndButton12, hwndButton13, hwndButton14;
static HANDLE hInstance;
static FARPROC lpfnRectDlgProc;
static FARPROC lpfnQuadDlgProc;
static FARPROC lpfnTriDlgProc;
static FARPROC lpfnOptnDlgProc;
static FARPROC lpfnMoveDlgProc;
static FARPROC lpfnResizeDlgProc;
static FARPROC lpfnRescaleDlgProc;
static FARPROC lpfnRotDlgProc;
PAINTSTRUCT ps;
RECT rect;
dPOINT gcenter;
COUNT extcount;
dRECT importsize;
HMENU hMenu ;
HDC hdc;
TEXTMETRIC tm;
LPDRAWITEMSTRUCT lpdis;
int i;
switch (message){
case WM_CREATE:
// get dimension
hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
GetDeviceCaps(hdc, ASPECTX);
GetDeviceCaps(hdc, ASPECTY);
GetTextMetrics(hdc, &tm);
aspectx = GetDeviceCaps(hdc, ASPECTX);
aspecty = GetDeviceCaps(hdc, ASPECTY);
ReleaseDC(hwnd, hdc);
aspectratio = (double)aspecty / aspectx;
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
statusheight = 9 * cyChar / 4;
sbheight = GetSystemMetrics(SM_CYHSCROLL);
sbwidth = GetSystemMetrics(SM_CXVSCROLL);
cxFullscreen = GetSystemMetrics(SM_CXFULLSCREEN);
cyFullscreen = GetSystemMetrics(SM_CYFULLSCREEN);
cyMenu = GetSystemMetrics(SM_CYMENU);
cxmaxViewport = cxFullscreen - sbwidth;
cymaxViewport = cyFullscreen - sbheight - TOOLBARHEIGHT -
cyMenu - statusheight;
if(cxmaxViewport >= cymaxViewport){
deskpixelwidth = MAXPAPERPIXEL;
deskpixelheight = MAXPAPERPIXEL * (double) cymaxViewport / cxmaxViewport;
}
else{
deskpixelheight = MAXPAPERPIXEL;
deskpixelwidth = MAXPAPERPIXEL * (double) cxmaxViewport / cymaxViewport;
}
// deskwidth and deskheight are internally maintain variables
// They are always adjust to accommodate paperwidth X paperheight
if(paperwidth / paperheight > (double)deskpixelwidth / deskpixelheight){
deskheight = paperwidth * (double)deskpixelheight / deskpixelwidth;
}
else{
deskwidth = paperheight * (double)deskpixelwidth / deskpixelheight;
}
xOffsetView = - deskwidth * ((double)zoomfactor / 32.0) * 0.5;
yOffsetView = - deskheight * ((double)zoomfactor / 32.0) * 0.5;
// create toolbars
hwndButton0 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
ZOOMIN_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_ZOOMIN, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton1 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
ZOOMOUT_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_ZOOMOUT, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton2 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
POINTER_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_POINTER, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton3 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
MOVEOBJECT_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_MOVEOBJECT, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton4 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
RESIZE_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_RESIZE, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton5 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
ROTATE_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_ROTATE, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton6 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
MODIFY_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_MODIFY, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton7 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
ENQUIRY_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_ENQUIRY, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton8 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
ABSORBING_X, 8, TOOLBARWIDTH, TOOLBARHEIGHT2,
hwnd, IDC_ABSORBING, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton9 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
MAGNETIC_X, 8, TOOLBARWIDTH, TOOLBARHEIGHT2,
hwnd, IDC_MAGNETIC, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton10 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
CONDUCTING_X, 8, TOOLBARWIDTH, TOOLBARHEIGHT2,
hwnd, IDC_CONDUCTING, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton11 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
EXTERIOR_X, 8, TOOLBARWIDTH, TOOLBARHEIGHT2,
hwnd, IDC_EXTERIOR, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton12 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
RECTANGLE_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_RECTANGLE, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton13 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
QUADRILATERAL_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_QUADRILATERAL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndButton14 = CreateWindow("button", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
TRIANGLE_X, 0, TOOLBARWIDTH, TOOLBARHEIGHT,
hwnd, IDC_TRIANGLE,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndMouseX = CreateWindow("static", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
0*cxChar, TOOLBARHEIGHT + cyChar / 4, 13*cxChar, cyChar,
hwnd, IDC_MOUSEX,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndMouseY = CreateWindow("static", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
0*cxChar, TOOLBARHEIGHT + cyChar * 5 / 4, 13*cxChar, cyChar,
hwnd, IDC_MOUSEY,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndMessage = CreateWindow("static", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
13*cxChar, TOOLBARHEIGHT + cyChar / 4, 40*cxChar, cyChar,
hwnd, IDC_MESSAGE,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndMessage2 = CreateWindow("static", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
13*cxChar, TOOLBARHEIGHT + cyChar * 5 / 4, 120*cxChar, cyChar,
hwnd, IDC_MESSAGE,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hwndMessage3 = CreateWindow("static", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
53*cxChar, TOOLBARHEIGHT + cyChar / 4, 80*cxChar, cyChar,
hwnd, IDC_MESSAGE,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
// create drawing desk and pens
hwndPaper = CreateWindow (szDrawPaper, "",
WS_CHILD | WS_VISIBLE /*| WS_THICKFRAME*/ ,
0, 0, 0, 0, hwnd, ID_PAPER, ((LPCREATESTRUCT) lParam)->hInstance,
NULL) ;
hPenDotBlack = CreatePen(PS_DOT, 0, 0L);
hPenSolidBlack = CreatePen(PS_SOLID, 0, 0L);
hPenSolidYellow = CreatePen(PS_SOLID, 0, RGB(255, 255, 128));
hPenArray[0] = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));
hPenArray[1] = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
hPenArray[2] = CreatePen(PS_SOLID, 0, RGB(0, 0, 255));
hPenArray[3] = CreatePen(PS_SOLID, 10, RGB(0, 0, 255));
hPenArray[4] = CreatePen(PS_SOLID, 0, RGB(0, 255, 0));
hPenArray[5] = CreatePen(PS_SOLID, 10, RGB(0, 255, 0));
hPenArray[6] = CreatePen(PS_SOLID, 0, RGB(0, 192, 192));
hPenArray[7] = CreatePen(PS_SOLID, 10, RGB(0, 192, 192));
hPenArray[8] = CreatePen(PS_SOLID, 0, RGB(192, 0, 0));
hPenArray[9] = CreatePen(PS_SOLID, 10, RGB(192, 0, 0));
hPenArray[10] = CreatePen(PS_SOLID, 0, RGB(192, 0, 192));
hPenArray[11] = CreatePen(PS_SOLID, 10, RGB(192, 0, 192));
hPenArray[12] = CreatePen(PS_SOLID, 0, RGB(192, 192, 0));
hPenArray[13] = CreatePen(PS_SOLID, 10, RGB(192, 192, 0));
hPenArray[14] = CreatePen(PS_SOLID, 0, RGB(192, 192, 192));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -