⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 igrid.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
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 + -