📄 gridsub3.c
字号:
COUNT nscount, totalcount = {0, 0, 0};
if((flag.reshapeobject == NO) && (flag.rescaleobject == NO)){
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
ReleaseDC(hwnd, hdc) ;
lptodrawing(point, &hookpoint);
blockcount = selected.blockcount();
if((unselected.nonexist(singleblock)) &&
(selected.nonexist(singleblock))) singleblock = NULL;
if((singleblock != NULL) && (singleblock->hook(hookpoint, &hookedcorner) != NULL)){
// hooked to singleblock
flag.reshapeobject = YES;
SetWindowText(hwndMessage, resizeinstructn3);
SetWindowText(hwndMessage2, resizeinstructn4);
}
else if((singleblock = unselected.hook(hookpoint, &hookedcorner))!=NULL){
// hooked to unselectedlist
flag.reshapeobject = YES;
SetWindowText(hwndMessage, resizeinstructn3);
SetWindowText(hwndMessage2, resizeinstructn4);
}
else if((blockcount == 1) && ((singleblock = selected.hook(hookpoint, &hookedcorner))!=NULL)){
// hooked to unselectedlist
flag.reshapeobject = YES;
SetWindowText(hwndMessage, resizeinstructn3);
SetWindowText(hwndMessage2, resizeinstructn4);
}
else if((blockcount > 1) &&
((bp = selected.hook(hookpoint, &hookedcorner))!=NULL)){
// selectedlist is hooked so prepare rescale
// get exact hook location
bp->vertex(&hookedloc, hookedcorner);
selected.center(&pivot);
v1.x = hookedloc.x - pivot.x;
v1.y = hookedloc.y - pivot.y;
if((refscale = sqrt(v1.x * v1.x + v1.y * v1.y)) != 0.0){
flag.rescaleobject = YES;
SetWindowText(hwndMessage, resizeinstructn5);
SetWindowText(hwndMessage2, resizeinstructn6);
}
pfactor = 1.0;
}
else{
// select a singleblock
singleblock = unselected.enclosepoint(hookpoint);
}
flag.previousoutline = NO;
flag.reconnect = NO;
}
else if(flag.reshapeobject == YES){
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
if(flag.previousoutline){
singleblock->outline(hdc, R2_NOTXORPEN, hPenDotBlack, pcorner, hookedcorner);
flag.previousoutline = NO;
}
ReleaseDC(hwnd, hdc) ;
if(flag.reconnect == YES){
hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
singleblock->disconnect();
singleblock->resize(pcorner, hookedcorner);
adjustallowablesnap();
selected.clearconnectmask();
unselected.clearconnectmask();
totalcount = singleblock->connect(selected);
nscount = singleblock->connect(unselected);
totalcount.node += nscount.node;
totalcount.side += nscount.side;
ShowCursor(FALSE);
SetCursor(hcursor);
}
flag.reconnect = NO;
flag.reshapeobject = NO;
InvalidateRect(hwndPaper, NULL, TRUE);
SendMessage(hwndMain, WM_COMMAND, NEEDSAVE, 0L);
singleblock = NULL;
sprintf(connectmessage, "Connection: node:%d side:%d .",
totalcount.node, totalcount.side);
SetWindowText(hwndMessage3, connectmessage);
SetWindowText(hwndMessage, resizeinstructn1);
SetWindowText(hwndMessage2, resizeinstructn2);
}
else if(flag.rescaleobject == YES){
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
if(flag.previousoutline){
selected.outline(hdc, R2_NOTXORPEN, hPenDotBlack, pivot, pfactor);
flag.previousoutline = NO;
}
ReleaseDC(hwnd, hdc) ;
if(flag.reconnect == YES){
hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
selected.disconnect(unselected);
selected.move(pivot, pfactor);
adjustallowablesnap();
selected.clearconnectmask();
unselected.clearconnectmask();
totalcount = selected.connect(unselected);
ShowCursor(FALSE);
SetCursor(hcursor);
}
flag.reconnect = NO;
flag.rescaleobject = NO;
InvalidateRect(hwndPaper, NULL, TRUE);
SendMessage(hwndMain, WM_COMMAND, NEEDSAVE, 0L);
sprintf(connectmessage, "Connection: node:%d side:%d .",
totalcount.node, totalcount.side);
SetWindowText(hwndMessage3, connectmessage);
SetWindowText(hwndMessage, resizeinstructn1);
SetWindowText(hwndMessage2, resizeinstructn2);
}
}
void resizeobjectmode::move(HWND hwnd, LONG lParam){
POINT point;
HDC hdc;
double newscale, factor;
dPOINT newcorner;
if(flag.reshapeobject == YES){
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
if(flag.previousoutline){
singleblock->outline(hdc, R2_NOTXORPEN, hPenDotBlack, pcorner, hookedcorner);
flag.previousoutline = NO;
}
lptodrawing(point, &newcorner);
messagemouseloc(newcorner);
singleblock->outline(hdc, R2_NOTXORPEN, hPenDotBlack, newcorner, hookedcorner);
pcorner = newcorner;
flag.previousoutline = YES;
flag.reconnect = YES;
ReleaseDC(hwnd, hdc) ;
SetWindowText(hwndMessage, resizeinstructn7);
SetWindowText(hwndMessage2, resizeinstructn8);
}
else if(flag.rescaleobject == YES){
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
if(flag.previousoutline){
selected.outline(hdc, R2_NOTXORPEN, hPenDotBlack, pivot, pfactor);
flag.previousoutline = NO;
}
lptodrawing(point, &newcorner);
messagemouseloc(newcorner);
v2.x = newcorner.x - pivot.x;
v2.y = newcorner.y - pivot.y;
newscale = sqrt(v2.x * v2.x + v2.y * v2.y);
factor = newscale / refscale;
selected.outline(hdc, R2_NOTXORPEN, hPenDotBlack, pivot, factor);
pfactor = factor;
flag.previousoutline = YES;
flag.reconnect = YES;
ReleaseDC(hwnd, hdc);
SetWindowText(hwndMessage, resizeinstructn7);
SetWindowText(hwndMessage2, resizeinstructn8);
}
else{
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
lptodrawing(point, &newcorner);
messagemouseloc(newcorner);
ReleaseDC(hwnd, hdc) ;
}
}
void resizeobjectmode::ldownmove(HWND hwnd, LONG lParam){
move(hwnd, lParam);
}
void resizeobjectmode::rbuttondown(void){
HDC hdc;
hdc = GetDC(hwndPaper);
setdrawingcoord(hdc);
if(flag.reshapeobject == YES){
if(flag.previousoutline)
singleblock->outline(hdc, R2_NOTXORPEN, hPenDotBlack, pcorner, hookedcorner);
flag.reshapeobject = NO;
SetWindowText(hwndMessage, resizeinstructn1);
SetWindowText(hwndMessage2, resizeinstructn2);
}
if(flag.rescaleobject == YES){
if(flag.previousoutline)
selected.outline(hdc, R2_NOTXORPEN, hPenDotBlack, pivot, pfactor);
flag.rescaleobject = NO;
SetWindowText(hwndMessage, resizeinstructn1);
SetWindowText(hwndMessage2, resizeinstructn2);
}
ReleaseDC(hwndPaper, hdc);
flag.previousoutline = NO;
flag.reconnect = NO;
}
void resizeobjectmode::ldblclk(HWND hwnd, LONG lParam){
POINT point;
dPOINT hookpoint, p;
HDC hdc;
int blockcount;
block *bp;
HCURSOR hcursor;
SetWindowText(hwndMessage, resizeinstructn1);
SetWindowText(hwndMessage2, resizeinstructn2);
if(flag.reshapeobject == YES){
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
if(flag.previousoutline){
singleblock->outline(hdc, R2_NOTXORPEN, hPenDotBlack, pcorner, hookedcorner);
flag.previousoutline = NO;
}
ReleaseDC(hwnd, hdc) ;
blockselected = singleblock;
blockselected->vertex(&snapedcoord, hookedcorner);
SendMessage(hwndMain, WM_COMMAND, IDM_RESIZEBYLOC, 0L);
flag.reconnect = NO;
flag.reshapeobject = NO;
blockselected = singleblock = NULL;
}
else if(flag.rescaleobject == YES){
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
if(flag.previousoutline){
selected.outline(hdc, R2_NOTXORPEN, hPenDotBlack, pivot, pfactor);
flag.previousoutline = NO;
}
ReleaseDC(hwnd, hdc) ;
blockselected = NULL;
snapedcoord = pivot;
SendMessage(hwndMain, WM_COMMAND, IDM_RESCALEBYFACT, 0L);
flag.reconnect = NO;
flag.rescaleobject = NO;
}
else{
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
ReleaseDC(hwnd, hdc) ;
lptodrawing(point, &p);
if((bp = selected.enclosepoint(p)) != NULL){
blockselected = NULL;
snapedcoord = bp->snaptonode(p);
SendMessage(hwndMain, WM_COMMAND, IDM_RESCALEBYFACT, 0L);
}
else if((bp = unselected.enclosepoint(p)) != NULL){
blockselected = bp;
snapedcoord = bp->snaptonode(p);
SendMessage(hwndMain, WM_COMMAND, IDM_RESCALEBYFACT, 0L);
}
else if(selected.empty() == NO){
blockselected = NULL;
if(option.checkposition == YES){
snapedcoord.x = (double)(option.position * floor(0.5 + p.x/option.position));
snapedcoord.y = (double)(option.position * floor(0.5 + p.y/option.position));
}
else{
snapedcoord.x = p.x;
snapedcoord.y = p.y;
}
SendMessage(hwndMain, WM_COMMAND, IDM_RESCALEBYFACT, 0L);
}
}
}
void resizeobjectmode::presstoolbar(void){
HDC hdc;
hdc = GetDC(hwndMain);
DrawBitmap(hdc, hBmpreszon, RESIZE_X, 0);
ReleaseDC(hwndMain, hdc);
}
void resizeobjectmode::releasetoolbar(void){
HDC hdc;
hdc = GetDC(hwndMain);
DrawBitmap(hdc, hBmpreszoff, RESIZE_X, 0);
ReleaseDC(hwndMain, hdc);
rbuttondown();
}
char enquirybuffer[100];
char enquirybuffer2[100];
void enquirymode::lbuttondown(HWND hwnd, LONG lParam){
POINT point;
dPOINT p;
HDC hdc;
block *bp;
unsigned int i, j;
unsigned int cellsidenode;
unsigned int totalblockcount, blocksearched;
int found = NO;
static ID accendingid;
CELLINFO cellinfo;
SIDEINFO sideinfo;
NODEINFO nodeinfo;
COUNT count;
strcpy(enquirybuffer, "Calculating.....");
strcpy(enquirybuffer2, "Be patient, it takes time.");
SetWindowText(hwndMessage, enquirybuffer);
SetWindowText(hwndMessage2, enquirybuffer2);
rbuttondown();
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
ReleaseDC(hwnd, hdc) ;
lptodrawing(point, &p);
count = numberexteriorelmts();
totalblockcount = selected.blockcount() + unselected.blockcount();
blocksearched = 0;
accendingid = 1;
while(blocksearched < totalblockcount){
while((bp = nextblock(accendingid)) == NULL) accendingid++;
if(bp->enclosepoint(p) != NULL){
cellsidenode = bp->snaptoCSN(p, &i, &j);
if(cellsidenode == CELLSNAPED){
cellinfo = bp->cellenquiry(i, j);
cellinfo.index += count.cell - 1;
sprintf(enquirybuffer, "Cell index = %u", cellinfo.index);
sprintf(enquirybuffer2, "Prpty1 = %lg, Prpty2 = %lg,"
" Prpty3 = %lg, Prpty4 = %lg.",
cellinfo.epsilon, cellinfo.sigma,
cellinfo.mu, cellinfo.sigma_mu);
}
else if(cellsidenode == SIDESNAPED){
sideinfo = bp->sideenquiry(i, j);
if(sideinfo.where == INTERIOR){
sideinfo.index += count.side - 1;
}
sprintf(enquirybuffer, "Side index = %u, property = %u.",
sideinfo.index, sideinfo.property & PROPERTYMASK);
sprintf(enquirybuffer2, "");
}
else { // nodetype
nodeinfo = bp->nodeenquiry(i, j);
if(nodeinfo.where == INTERIOR){
nodeinfo.index += count.node - 1;
}
sprintf(enquirybuffer, "Node index = %u, property = %u.",
nodeinfo.index, nodeinfo.property & PROPERTYMASK);
sprintf(enquirybuffer2, "Exact location: x = %lg, y = %lg",
nodeinfo.x, nodeinfo.y);
}
found = YES;
break; // break the while loop.
}
count.cell += bp->cellcount();
count.side += bp->interiorsidecount();
count.node += bp->interiornodecount();
accendingid++;
blocksearched++;
}
if (found == NO){
strcpy(enquirybuffer, "No element found");
strcpy(enquirybuffer2, "Make sure the point clicked is inside a block.");
}
SetWindowText(hwndMessage, enquirybuffer);
SetWindowText(hwndMessage2, enquirybuffer2);
}
void enquirymode::move(HWND hwnd, LONG lParam){
POINT point;
dPOINT p;
HDC hdc;
point = MAKEPOINT(lParam);
hdc = GetDC(hwnd);
setdrawingcoord(hdc);
DPtoLP(hdc, &point, 1);
lptodrawing(point, &p);
messagemouseloc(p);
ReleaseDC(hwnd, hdc) ;
}
void enquirymode::presstoolbar(void){
HDC hdc;
hdc = GetDC(hwndMain);
DrawBitmap(hdc, hBmpenqon, ENQUIRY_X, 0);
ReleaseDC(hwndMain, hdc);
}
void enquirymode::releasetoolbar(void){
HDC hdc;
hdc = GetDC(hwndMain);
DrawBitmap(hdc, hBmpenqoff, ENQUIRY_X, 0);
ReleaseDC(hwndMain, hdc);
}
int evalsin(dVECTOR v1, dVECTOR v2, double *sintheta){
double l1square, l2square, l1timesl2;
l1square = v1.x*v1.x + v1.y*v1.y;
if(l1square == 0.0) return NO;
l2square = v2.x*v2.x + v2.y*v2.y;
if(l2square == 0.0) return NO;
l1timesl2 = sqrt(l1square * l2square);
*sintheta = (v1.x * v2.y - v1.y * v2.x) / l1timesl2;
return YES;
}
int evalcos(dVECTOR v1, dVECTOR v2, double *costheta){
double l1square, l2square, l1timesl2;
l1square = v1.x*v1.x + v1.y*v1.y;
if(l1square == 0.0) return NO;
l2square = v2.x*v2.x + v2.y*v2.y;
if(l2square == 0.0) return NO;
l1timesl2 = sqrt(l1square * l2square);
*costheta = (v1.x * v2.x + v1.y * v2.y) / l1timesl2;
return YES;
}
void adjustallowablesnap(void){
double tsnap1, tsnap2, tsnap3;
tsnap1 = unselected.allowablesnap();
tsnap2 = selected.allowablesnap();
tsnap3 = addon.allowablesnap();
option.allowablesnap = tsnap1 < tsnap2 ? tsnap1 : tsnap2;
if(tsnap3 < option.allowablesnap) option.allowablesnap = tsnap3;
if(option.snap > option.allowablesnap) option.snap = option.allowablesnap;
}
char mousexloc[32], mouseyloc[32];
void messagemouseloc(dPOINT p){
HDC hdc;
sprintf(mousexloc, "x:%+-12.7lg", p.x);
sprintf(mouseyloc, "y:%+-12.7lg", p.y);
SetWindowText(hwndMouseX, mousexloc);
SetWindowText(hwndMouseY, mouseyloc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -