/***************************************************************************** FILE : $Source: /projects/higgs1/SNNS/CVS/SNNS/xgui/sources/ui_utilP.c,v $ SHORTNAME : ui_utilP.ph SNNS VERSION : 4.2 PURPOSE : NOTES : AUTHOR : Tilman Sommer DATE : 18.5.1990 CHANGED BY : Sven Doering RCS VERSION : $Revision: 2.7 $ LAST CHANGE : $Date: 1998/03/03 14:10:47 $ Copyright (c) 1990-1995 SNNS Group, IPVR, Univ. Stuttgart, FRG Copyright (c) 1996-1998 SNNS Group, WSI, Univ. Tuebingen, FRG ******************************************************************************/ #include #include #include "ui.h" #include #include #include #include "ui_display.h" #include "ui_mainP.h" #include "ui_fileP.h" #include "ui_netGraph.h" #include "ui_textP.h" #include "ui_action.h" #include "kr_ui.h" #include "ui_utilP.ph" /***************************************************************************** FUNCTION : ui_isUnitVisibleInAnyDisplay PURPOSE : checks, whether the specified unit ist visible in any display NOTES : UPDATE : 1.2.1990 ******************************************************************************/ Bool ui_isUnitVisibleInAnyDisplay(int unitNo) { struct Ui_DisplayType *dPtr; dPtr = ui_displ_listPtr; while (dPtr != NULL) { if ((krui_getUnitSubnetNo(unitNo) == dPtr->subNetNo) AND (krui_getUnitLayerNo(unitNo) BIT_AND dPtr->layers)) return(TRUE); dPtr = dPtr->nextPtr; } return(FALSE); } /***************************************************************************** FUNCTION : ui_checkError PURPOSE : checks the error value, coming from a kernel function call. If an error has occured, ui gets the message from the kernel and writes it to the text window. NOTES : UPDATE : 24.8.1990 ******************************************************************************/ void ui_checkError(krui_err error) { if ((ui_kernelError = error) != 0) ui_tw_errorMessage(krui_error(error)); } /***************************************************************************** FUNCTION : ui_krui_sitesExistInNetwork PURPOSE : returns TRUE, if there is at least one site in the network NOTES : Only the site table is checked. If there is no unit with sites, but there is at least one site table entry, this function still returns TRUE! UPDATE : 26.8.1990 ******************************************************************************/ Bool ui_krui_sitesExistInNetwork(void) { char *name, *funcName; return(krui_getFirstSiteTableEntry(&name, &funcName)); } /***************************************************************************** FUNCTION : ui_krui_setCurrentSite PURPOSE : sets the current site NOTES : The unit must exist (no error checking) !! If the unit has no sites, only the current unit is set and TRUE will be returned. UPDATE : 26.8.1990 ******************************************************************************/ Bool ui_krui_setCurrentSite(int targetNo, char *siteName) { (void) krui_setCurrentUnit(targetNo); /* target */ if (krui_getUnitInputType(targetNo) != SITES) return(TRUE); if ((siteName != NULL) AND strlen(siteName)) return((krui_setSite(siteName) == UI_SET_OK)); else return(FALSE); /* invalid site name */ } /***************************************************************************** FUNCTION : ui_krui_setCurrentLink PURPOSE : sets the current link (kernel) NOTES : This routine was written, because the handling of the current link is hard sometimes, specially while doing the loops getFirstSuccUnit..getNextSuccUnit and getFirstPredUnit..getNextPredUnit The link and all units must exist (no error checking) !! UPDATE : 26.8.1990 ******************************************************************************/ void ui_krui_setCurrentLink(int sourceNo, int targetNo, char *siteName) { (void) krui_setCurrentUnit(targetNo); /* target */ (void) ui_krui_setCurrentSite(targetNo, siteName); (void) krui_isConnected(sourceNo); /* sets current link */ } /***************************************************************************** FUNCTION : ui_correctName PURPOSE : replace all ' ', '\t' und '\n' with underscores ('_') NOTES : UPDATE : 27.9.1990 ******************************************************************************/ void ui_correctName(char *string) { int j; if (string == NULL) return; /* replace white space with underscores */ for (j=0; string[j] != '\0'; j++) { if ((string[j] == ' ') OR (string[j] == '\t') OR (string[j] == '\n')) string[j] = '_'; } } /***************************************************************************** FUNCTION : ui_cutTrailingZeros PURPOSE : replace all trailing '0' (except after '.') with null character ('\0') NOTES : UPDATE : 27.9.1990 ******************************************************************************/ void ui_cutTrailingZeros(char *string) { int j; if ((string == NULL) OR (strlen(string) < 2)) return; for (j = strlen(string)-1 ; ((j > 0) AND (string[j] != '.')) ; j--) { if ((string[j] == '0') AND (string[j-1] != '.')) string[j] = '\0'; } } /***************************************************************************** FUNCTION : ui_utilGridToPix PURPOSE : calculates the center pixel coordinates of a unit grid position. RETURNS : pixel coordinate NOTES : see above *****************************************************************************/ struct PosType ui_utilGridToPix(struct Ui_DisplayType *displayPtr, struct PosType gridPos) { struct PosType pixPos; pixPos.x = displayPtr->gridSize * (gridPos.x - displayPtr->origin.x) + displayPtr->gridSize/2; pixPos.y = displayPtr->gridSize * (gridPos.y - displayPtr->origin.y) + displayPtr->gridSize/2; return (pixPos); } /***************************************************************************** FUNCTION : ui_utilPixToGrid PURPOSE : transforms a pixel coordinate to a grid position RETURNS : the corresponding grid position NOTES : to be consistent use always this routine to do the translation *****************************************************************************/ struct PosType ui_utilPixToGrid(struct Ui_DisplayType *displayPtr, struct PosType pixPos) { struct PosType gridPos; gridPos.x = displayPtr->origin.x + (pixPos.x / displayPtr->gridSize); gridPos.y = displayPtr->origin.y + (pixPos.y / displayPtr->gridSize); gridPos.z = ui_actualZvalue; /* gridPos.z = 0; */ return (gridPos); } /***************************************************************************** FUNCTION : ui_utilChangeFlag PURPOSE : XOR operation of certain bits in a flag word RETURNS : alteration of certain bits in a flag word *****************************************************************************/ void ui_utilChangeFlag(FlagType *flag_word, FlagType flag) { FlagType aux = *flag_word; if (ui_utilIsSet(aux, flag)) ui_utilResetFlag(aux,flag); else ui_utilSetFlag(aux,flag); *flag_word = aux; } /***************************************************************************** FUNCTION : ui_utilSgnInt PURPOSE : calculates the signum function for integer arguments RETURNS : sgn(x) *****************************************************************************/ int ui_utilSgnInt(int x) { if (x > 0) return(1); else if (x < 0) return(-1); else return(0); } /***************************************************************************** FUNCTION : ui_utilMax PURPOSE : The varaibles x1 and x2 will be swapped, if x1 is not the maximum RETURNS : --- (side-effect) NOTES : Both arguments must be pointers to integers! *****************************************************************************/ void ui_utilMax(short int *x1Ptr, short int *x2Ptr) { short h; if (*x1Ptr < *x2Ptr) { /* x1 is not the maximum, so swap */ h = *x1Ptr; *x1Ptr = *x2Ptr; *x2Ptr = h; } } /***************************************************************************** FUNCTION : ui_utilNormalizeRect PURPOSE : Two pairs of coordinates are given describing a rectangle. They will be reassigned, that (x1,y1) is the upper left and (x2,y2) the lower right corner. RETURNS : call by reference --> (x1Ptr,y1Ptr,x2Ptr,y2Ptr) NOTES : see ui_utilnormalize_coord() *****************************************************************************/ void ui_utilNormalizeRect(struct PosType *pixPos1Ptr, struct PosType *pixPos2Ptr) { ui_utilMax(&(pixPos2Ptr->x), &(pixPos1Ptr->x)); ui_utilMax(&(pixPos2Ptr->y), &(pixPos1Ptr->y)); } /***************************************************************************** FUNCTION : ui_utilPixUpperLeft PURPOSE : calculates the pixel coordinates of the upper left corner of a unit rectangle. RETURNS : coordinate in pixel NOTES : unit position are stored as raster (grid) positions *****************************************************************************/ struct PosType ui_utilPixUpperLeft(struct Ui_DisplayType *displayPtr, struct PosType gridPos) { struct PosType pixPos; pixPos = ui_utilGridToPix(displayPtr, gridPos); pixPos.x -= ui_unitWidth/2; pixPos.y -= ui_unitHeight/2; return(pixPos); } /***************************************************************************** FUNCTION : ui_utilPixLowerRight PURPOSE : calculates the pixel coordinates of the lower right corner of a unit rectangle. RETURNS : pixel coordinate NOTES : see above *****************************************************************************/ struct PosType ui_utilPixLowerRight(struct Ui_DisplayType *displayPtr, struct PosType gridPos, short int extent) { struct PosType pixPos; pixPos = ui_utilGridToPix(displayPtr, gridPos); pixPos.x += ui_unitWidth / 2 - 1 + extent; pixPos.y += ui_unitHeight / 2 - 1 + extent; return (pixPos); } /* end of file */ /* lines: 407 */