typedef struct tagLISTOBJECT { WORD objSize; int objID; LPVOID lpvObj; } LISTOBJECT; typedef struct tagPOINT3D { double x; double y; double z; } POINT3D; typedef struct tagCURVEOBJECT { POINT3D ptm; /* POINT3D ptp, ptn; */ BOOL bClosed; int wCurveID; BYTE ToPrev; BOOL bMoveable; } CURVEOBJECT; /* voor CURVENODE.ToPrev */ #define LINE_TOPREV 0x01 #define CURVE_TOPREV 0x02 #define LABELS_ARRAY {{CAP_CURVE, "Prn None"}, \ {LATROLET_CURVE, "Prn Points"}, \ {STUBON_CURVE, "Prn Lines (unclosed)"}, \ {VALVE_CURVE, "Prn Pts&Lines (unclsd)"}, \ {LINE_CURVE, "Prn Lines"}, \ {USER_CURVE, "Prn Points and Lines"}} #define USER_CURVE 0x0001 #define TEE_CURVE 0x0002 #define CAP_CURVE 0x0003 #define WELDOLET_CURVE 0x0004 #define REDUCER_CURVE 0x0005 #define ELBOW_CURVE 0x0006 #define OPEN_CURVE 0x0007 /* niet gebruikt */ #define WELD_CURVE 0x0008 #define THREAD_CURVE 0x0009 #define LINE_CURVE 0x000a #define PIPE_CURVE 0x000b #define VALVE_CURVE 0x000c #define FLANGE_CURVE 0x000d #define STUBON_CURVE 0x000e #define LATROLET_CURVE 0x000f #define PRESSURE_CURVE 0x0010 #define WELDMAT_CURVE 0x0011 #define REINF_CURVE 0x0012 #define EXTPRING_CURVE 0x0013 typedef struct tagPROJECT_HEADER { int clcID; char clcVersion[10]; TIME clcTime; DATE clcDate; BYTE filler[94]; } PROJECT_HEADER; #define PROJECT_FILEID 0x4c43 #define PROJECT_EOFID 0x4f46 #define PROJECT_VERSION "IA" typedef struct tagRW_BLOCK { int blockID; BYTE filler[42]; } RW_BLOCK; typedef struct tagELBOWPRESFUNC { WORD wPressureFunc; } ELBOWPRESFUNC; typedef struct tagPIPEPRESFUNC { WORD wPressureFunc; } PIPEPRESFUNC; typedef struct tagPRESFUNC { PIPEPRESFUNC pp; ELBOWPRESFUNC ep; } PRESFUNC; typedef struct tagGLOBSET { double dblCorr; /* in measurement */ BOOL bChgCorr; double dblMill; /* in percentages or measurements */ WORD wMillKar; } GLOBSET; typedef struct tagINOUT_UNITS { WORD wIP; /* input pressure */ WORD wIT; /* input temp */ WORD wIM; /* input measurements */ WORD wIS; /* input surface, afhankelijk van wIM */ WORD wIN; /* input aantal bijv /mm, afh van wIM */ WORD wOP; /* output pressure */ WORD wOT; /* output temp */ WORD wOM; /* output measurements */ WORD wOS; /* output surface, afhankelijk van wOM */ WORD wON; /* output aantal bijv /in, afhank van wOM */ } INOUT_UNITS; #define USERSETTINGS_FILEID 0x4903 typedef struct tagPTCCOMBI { double dblPres; double dblTemp; double dblCorr; } PTCCOMBI; typedef struct tagPTCCOMBI_HEADER { int ptcID; LONG ptcNr; WORD wPresUnitID; WORD wTempUnitID; WORD wCorrUnitID; BYTE filler[106]; } PTCCOMBI_HEADER; #define PTCCOMBI_FILEID 0x5443 typedef struct time TIME; typedef struct date DATE; typedef struct tagPROJECTINFO { char szID[80]; char szEngineer[80]; char szClient[80]; DATE prjDate; } PROJECTINFO; #define PROJECTINFO_FILEID 0x494e #define LIST_FILEID 0x0304 void TFrame::LoadFile() { FILE *fPtr; PROJECT_HEADER prjHd; RW_BLOCK rwb; BOOL bSucces = FALSE, bError = FALSE; FLATLAND_WELD flwin; PIPE pipe; REDUCER red; STUBON stub; ELBOW elbow; TEE tee; CAP cap; WELDOLET weldo; FLANGE flange; PLATE plate; BOLT bolt; THREAD thread; LIST *list; char szTit[300]; PTCCOMBI ptc; PTCCOMBI_HEADER ptcHd; LISTOBJECT obj; DWORD i; MSG Mesg; SetCursor(LoadCursor(NULL, IDC_WAIT)); if ((fPtr = fopen(FileName, "rb")) != NULL) { if (fread(&prjHd, (WORD)sizeof(PROJECT_HEADER), 1, fPtr) == 1) { if (prjHd.clcID == PROJECT_FILEID) { if (strcmp(prjHd.clcVersion, PROJECT_VERSION) == 0) { do { if (PeekMessage((LPMSG)&Mesg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) { } if (fread(&rwb, (WORD)sizeof(RW_BLOCK), 1, fPtr) == 1) { switch (rwb.blockID) { case USERSETTINGS_FILEID: bError = (fread(&us.iou, (WORD)sizeof(INOUT_UNITS), 1, fPtr) != 1); if (!bError) bError = (fread(&us.CalcCode, (WORD)sizeof(WORD), 1, fPtr) != 1); if (!bError) bError = (fread(&us.gs, sizeof(GLOBSET), 1, fPtr) != 1); if (!bError) bError = (fread(&us.pf, sizeof(PRESFUNC), 1, fPtr) != 1); break; case PTCCOMBI_FILEID: bError = (fread(&ptcHd, sizeof(PTCCOMBI_HEADER), 1, fPtr) != 1); if (!bError) { obj.objSize = sizeof(PTCCOMBI); obj.lpvObj = (LPVOID)&ptc; for (i=0;iAdd(&obj); } else break; } bError = TRUE; if (i == ptcHd.ptcNr) bError = FALSE; } break; case PROJECTINFO_FILEID: bError = (fread(&us.Prj, (WORD)sizeof(PROJECTINFO), 1, fPtr) != 1); break; case WELD_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&flwin, (WORD)sizeof(FLATLAND_WELD), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinWeld(this, (LPSTR)szTit, &flwin)); } break; case PIPE_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&pipe, (WORD)sizeof(PIPE), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinPipe(this, (LPSTR)szTit, &pipe)); } break; case REDUCER_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&red, (WORD)sizeof(REDUCER), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinReducer(this, (LPSTR)szTit, &red)); } break; case STUBON_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&stub, (WORD)sizeof(STUBON), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinStubon(this, (LPSTR)szTit, &stub)); } break; case ELBOW_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&elbow, (WORD)sizeof(ELBOW), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinElbow(this, szTit, &elbow)); } break; case TEE_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&tee, (WORD)sizeof(TEE), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinTee(this, (LPSTR)szTit, &tee)); } break; case CAP_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&cap, (WORD)sizeof(CAP), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinCap(this, (LPSTR)szTit, &cap)); } break; case WELDOLET_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&weldo, (WORD)sizeof(WELDOLET), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinWeldolet(this, (LPSTR)szTit, &weldo)); } break; case FLANGE_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&flange, (WORD)sizeof(FLANGE), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinFlange(this, (LPSTR)szTit, &flange)); } break; case PLATE_FILEID: break; case BOLT_FILEID: break; case THREAD_FILEID: if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { bError = (fread(&thread, (WORD)sizeof(THREAD), 1, fPtr) != 1); if (!bError) GetApplication()->MakeWindow(new TWinThread(this, (LPSTR)szTit, &thread)); } break; case LIST_FILEID: bError = TRUE; if ((list = new LIST) != NULL) { if ((bError = LoadTitle(fPtr, (char *)szTit)) == TRUE) { if (list->Read(fPtr)) { GetApplication()->MakeWindow(new TWinDraw(this, (LPSTR)szTit, list)); bError = FALSE; } } } break; } if (bError) break; } else break; } while (rwb.blockID != PROJECT_EOFID && !feof(fPtr)); if (rwb.blockID == PROJECT_EOFID) bSucces = TRUE; } else { /* andere version */ MessageBox(HWindow, "Opened a not supported project version !", "Open", MB_ICONEXCLAMATION | MB_OK); } } } fclose(fPtr); } SetCursor(LoadCursor(NULL, IDC_ARROW)); if (!bSucces) MessageBox(HWindow, "Unable to open the project !", "Open", MB_ICONEXCLAMATION | MB_OK); else { MinimizeAll(); ForEach(ChangeTitle, NULL); fnsplit(FileName, us.szWorkDir.szDrive, us.szWorkDir.szDir, us.szWorkDir.szName, us.szWorkDir.szExt); MessageBox(HWindow, "The project has been opened !", "Open", MB_ICONINFORMATION | MB_OK); } } BOOL LoadTitle(FILE *fPTR, char *szText) { int nLen; BOOL bSucces = FALSE; if (fread((void *)&nLen, (WORD)sizeof(int), 1, fPTR) == 1) { if (fread((void *)szText, (WORD)sizeof(char), nLen, fPTR) == nLen) bSucces = TRUE; } return(bSucces); } BOOL LIST::Read(FILE *fPTR) { LISTOBJECT obj; DWORD i, Nr; BOOL bSucces = FALSE; if (fread((void *)&Nr, sizeof(DWORD), 1, fPTR) == 1) { for (i=0;iAdd(&obj)) { delete obj.lpvObj; break; } } else { delete obj.lpvObj; break; } delete obj.lpvObj; } else break; } else break; } else break; } if (i == Nr) bSucces = TRUE; } return(bSucces); } /// List filling... #define DRAW_POLY 0x0001 #define DRAW_VERTEX 0x0002 #define DRAW_POLYEND 0x0003 if (obj.objID == DRAW_POLY) begin polyline... if (obj.objID == DRAW_VERTEX) mid polyline... if (obj.objID == DRAW_POLYEND) end polyline... LISTOBJECT obj; CURVEOBJECT co; obj.objSize = (WORD)sizeof(CURVEOBJECT); obj.lpvObj = (LPVOID)&co; list->GoTo(dwPolyEditPoint); list->Get2Buf(&obj); if (co.wCurveID != LINE_CURVE)