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

📄 gridsub3.c

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