bsfile.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2009, 2013                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 /* changes:                                                                  */
00011 /* 22.07.2013, R. Putanowicz - static pointers to application reading        */
00012 /*   procedures replaced by pointers in a bsf_UserReaders structure passed   */
00013 /*   by a parameter to the reading procedure.                                */
00014 /* 24.07.2013, P. Kiciak - changes related with integration of the above     */
00015 /*   with the package.                                                       */
00016 
00017 /* Header file for the libbsfile library - reading and writing text files */
00018 /* with geometric data */
00019 
00020 #ifndef BSFILE_H
00021 #define BSFILE_H
00022 
00023 #ifndef PKVARIA_H
00024 #include "pkvaria.h"
00025 #endif
00026 #ifndef PKNUM_H
00027 #include "pknum.h"
00028 #endif
00029 #ifndef PKGEOM_H
00030 #include "pkgeom.h"
00031 #endif
00032 #ifndef MULTIBS_H
00033 #include "multibs.h"
00034 #endif
00035 #ifndef BSMESH_H
00036 #include "bsmesh.h"
00037 #endif
00038 
00039 #ifdef __cplusplus
00040 extern "C" {
00041 #endif
00042 
00043 #define BSF_MAX_NAME_LENGTH 64
00044 
00045 #define BSF_SYMB_EOF       0
00046 #define BSF_SYMB_ERROR     1
00047 #define BSF_SYMB_INTEGER   2
00048 #define BSF_SYMB_FLOAT     3
00049 #define BSF_SYMB_LBRACE    4
00050 #define BSF_SYMB_RBRACE    5
00051 #define BSF_SYMB_PLUS      6
00052 #define BSF_SYMB_MINUS     7
00053 #define BSF_SYMB_STRING    8
00054 #define BSF_SYMB_COMMA     9
00055 
00056 #define BSF_FIRST_KEYWORD  10  /* number of the first keyword */
00057 #define BSF_SYMB_BCURVE    10  /* consecutive numbers of keywords */
00058 #define BSF_SYMB_BPATCH    11  /* sorted alphabetically */
00059 #define BSF_SYMB_BSCURVE   12
00060 #define BSF_SYMB_BSHOLE    13
00061 #define BSF_SYMB_BSMESH    14
00062 #define BSF_SYMB_BSPATCH   15
00063 #define BSF_SYMB_CLOSED    16
00064 #define BSF_SYMB_CPOINTS   17
00065 #define BSF_SYMB_CPOINTSMK 18
00066 #define BSF_SYMB_DEGREE    19
00067 #define BSF_SYMB_DIM       20
00068 #define BSF_SYMB_DOMAIN    21
00069 #define BSF_SYMB_FACETS    22
00070 #define BSF_SYMB_HALFEDGES 23
00071 #define BSF_SYMB_KNOTS     24
00072 #define BSF_SYMB_KNOTS_U   25
00073 #define BSF_SYMB_KNOTS_V   26
00074 #define BSF_SYMB_NAME      27
00075 #define BSF_SYMB_RATIONAL  28
00076 #define BSF_SYMB_SIDES     29
00077 #define BSF_SYMB_UNIFORM   30
00078 #define BSF_SYMB_VERTICES  31
00079 
00080 #define BSF_NKEYWORDS 22
00081 extern const char *bsf_keyword[BSF_NKEYWORDS];
00082 
00083 extern FILE   *bsf_input, *bsf_output;
00084 
00085 extern int    bsf_nextsymbol;
00086 extern int    bsf_nextint;
00087 extern double bsf_nextfloat;
00088 extern char   *bsf_namebuffer;
00089 
00090 /* ////////////////////////////////////////////////////////////////////////// */
00091 boolean bsf_OpenInputFile ( const char *filename );
00092 void bsf_CloseInputFile ( void );
00093 void bsf_GetNextSymbol ( void );
00094 
00095 void bsf_PrintErrorLocation ( void );
00096 
00097 boolean bsf_ReadIntNumber ( int *number );
00098 boolean bsf_ReadDoubleNumber ( double *number );
00099 boolean bsf_ReadPointd ( int maxcpdimen, double *point, int *cpdimen );
00100 int bsf_ReadPointsd ( int maxcpdimen, int maxnpoints,
00101                       double *points, int *cpdimen );
00102 int bsf_ReadPointsMK ( int maxnpoints, byte *mk );
00103 
00104 boolean bsf_ReadSpaceDim ( int maxdim, int *spdimen );
00105 boolean bsf_ReadCurveDegree ( int maxdeg, int *degree );
00106 boolean bsf_ReadPatchDegree ( int maxdeg, int *udeg, int *vdeg );
00107 
00108 boolean bsf_ReadKnotSequenced ( int maxlastknot, int *lastknot, double *knots,
00109                                 boolean *closed );
00110 
00111 boolean bsf_ReadBezierCurve4d ( int maxdeg, int *deg, point4d *cpoints,
00112                                 int *spdimen, boolean *rational,
00113                                 byte *mk, char *name );
00114 
00115 boolean bsf_ReadBSplineCurve4d ( int maxdeg, int maxlastknot, int maxncpoints,
00116                                  int *deg, int *lastknot, double *knots,
00117                                  boolean *closed, point4d *cpoints,
00118                                  int *spdimen, boolean *rational,
00119                                  byte *mk, char *name );
00120 
00121 boolean bsf_ReadBezierPatch4d ( int maxdeg, int *udeg, int *vdeg,
00122                                 int *pitch, point4d *cpoints,
00123                                 int *spdimen, boolean *rational,
00124                                 byte *mk, char *name );
00125 
00126 boolean bsf_ReadBSplinePatch4d ( int maxdeg, int maxlastknot, int maxncpoints,
00127                                  int *udeg, int *lastknotu, double *knotsu,
00128                                  int *vdeg, int *lastknotv, double *knotsv,
00129                                  boolean *closed_u, boolean *closed_v,
00130                                  int *pitch, point4d *cpoints,
00131                                  int *spdimen, boolean *rational,
00132                                  byte *mk, char *name );
00133 
00134 boolean bsf_ReadBSMesh4d ( int maxnv, int maxnhe, int maxnfac,
00135                            int *degree,
00136                            int *nv, BSMvertex *mv, int *mvhei, point4d *vc,
00137                            int *nhe, BSMhalfedge *mhe,
00138                            int *nfac, BSMfacet *mfac, int *mfhei,
00139                            int *spdimen, boolean *rational,
00140                            byte *mkv, char *name );
00141 
00142 boolean bsf_ReadBSplineHoled ( int maxk, int *hole_k, double *knots,
00143                                point2d *domain_cp, point4d *hole_cp,
00144                                int *spdimen, boolean *rational,
00145                                byte *mk, char *name );
00146 
00147 /* Below are defined 6 typedefs for function pointer. These typedef's
00148    make easier to hande user defined callbacks for reading data from
00149    BSTools files to user specified data structures.
00150    The typedefs are:
00151       bsf_BC_fptr  -- for Bezier Curves callback
00152       bsf_BSC_fptr -- for BSpline Curves callback
00153       bsf_BP_fptr  -- for Bezier Patch callback
00154       bsf_BSP_fptr -- for BSpline Patch callback
00155       bsf_BSM_fptr -- for BS Mesh callback
00156       bsf_BSH_fptr -- for BSpline Hole callback
00157 */
00158 typedef void (*bsf_BC_fptr) ( void *userData, const char *name,
00159                               int degree, const point4d *cpoints,
00160                               int spdimen, boolean rational, byte *mk );
00161 
00162 typedef void (*bsf_BSC_fptr) ( void *userData, const char *name,
00163                                int degree, int lastknot, const double *knots,
00164                                boolean closed,
00165                                const point4d *cpoints,
00166                                int spdimen, boolean rational, byte *mk );
00167 typedef void (*bsf_BP_fptr) ( void *userData, const char *name, int udeg, int vdeg,
00168                               int pitch, const point4d *cpoints,
00169                               int spdimen, boolean rational, byte *mk );
00170 typedef void (*bsf_BSP_fptr) ( void *userData, const char *name,
00171                                int udeg, int lastknotu, const double *knotsu,
00172                                int vdeg, int lastknotv, const double *knotsv,
00173                                boolean closed_u, boolean closed_v,
00174                                int pitch, const point4d *cpoints,
00175                                int spdimen, boolean rational, byte *mk );
00176 typedef void (*bsf_BSM_fptr) ( void *userData, const char *name, int degree,
00177                                int nv, const BSMvertex *mv, const int *mvhei,
00178                                const point4d *vc,
00179                                int nhe, const BSMhalfedge *mhe,
00180                                int nfac, const BSMfacet *mfac, const int *mfhei,
00181                                int spdimen, boolean rational, byte *mkv );
00182 
00183 typedef void (*bsf_BSH_fptr) ( void *userData, const char *name, int hole_k,
00184                                const double *knots,
00185                                const point2d *domain_cp,
00186                                const point4d *hole_cp,
00187                                int spdimen, boolean rational, byte *mk );
00188 
00189 typedef struct {
00190   bsf_BC_fptr  BezierCurveReader;
00191   bsf_BSC_fptr BSplineCurveReader;
00192   bsf_BP_fptr  BezierPatchReader;
00193   bsf_BSP_fptr BSplinePatchReader;
00194   bsf_BSM_fptr BSMeshReader;
00195   bsf_BSH_fptr BSplineHoleReader;
00196   void *userData;   /* pointer to user data, bsfile library does not
00197                        use it, it is just passed to reader callbacks */
00198   int bc_maxdeg;       /* maximal degree of Bezier curves */
00199   int bsc_maxdeg;      /* maximal degree of B-spline curves */
00200   int bsc_maxlkn;      /* maximum number of the last knot for B-spline curves */
00201   int bp_maxdeg;       /* maximal degree of Bezier patches */
00202   int bsp_maxdeg;      /* maximal degree of B-spline patches */
00203   int bsp_maxlkn;      /* maximal number of the last knot for B-spline patches */
00204   int bsm_maxdeg;      /* maximal degree of mesh-represented surfaces */
00205   int bsm_maxnv;       /* maximum number of mesh vertices */
00206   int bsm_maxnhe;      /* maximum number of mesh halfedges */
00207   int bsm_maxnfac;     /* maximum number of mesh facets */ 
00208 } bsf_UserReaders;
00209 
00210 /* Set up readers data structure to an empty state */
00211 void bsf_ClearReaders ( bsf_UserReaders *readers );
00212 
00213 void bsf_BC4ReadFuncd ( bsf_UserReaders *readers, bsf_BC_fptr BCReader,
00214                         int maxdeg );
00215 void bsf_BSC4ReadFuncd ( bsf_UserReaders *readers, bsf_BSC_fptr BSCReader,
00216                          int maxdeg, int maxlastknot );
00217 void bsf_BP4ReadFuncd ( bsf_UserReaders *readers, bsf_BP_fptr BPReader,
00218                         int maxdeg );
00219 void bsf_BSP4ReadFuncd ( bsf_UserReaders *readers, bsf_BSP_fptr BSPReader,
00220                          int maxdeg, int maxlastknot );
00221 void bsf_BSM4ReadFuncd ( bsf_UserReaders *readers, bsf_BSM_fptr BSMReader,
00222                          int maxdeg, int maxnv, int maxnhe, int maxnfac );
00223 void bsf_BSH4ReadFuncd ( bsf_UserReaders *readers, bsf_BSH_fptr BSHReader );
00224 
00225 boolean bsf_ReadBSFiled ( const char *filename, bsf_UserReaders *readers );
00226 
00227 /* ////////////////////////////////////////////////////////////////////////// */
00228 boolean bsf_OpenOutputFile ( char *filename, boolean append );
00229 void bsf_CloseOutputFile ( void );
00230 
00231 void bsf_WriteComment ( char *comment );
00232 void bsf_WriteDoubleNumber ( double x );
00233 void bsf_WritePointd ( int cpdimen, const double *point );
00234 void bsf_WritePointsd ( int cpdimen, int cols, int rows, int pitch,
00235                         const double *points );
00236 void bsf_WritePointsMK ( int npoints, const byte *mk );
00237 
00238 void bsf_WriteSpaceDim ( int spdimen, boolean rational );
00239 void bsf_WriteCurveDegree ( int degree );
00240 void bsf_WritePatchDegree ( int udeg, int vdeg );
00241 
00242 void bsf_WriteKnotSequenced ( int lastknot, const double *knots, boolean closed );
00243 
00244 boolean bsf_WriteBezierCurved ( int spdimen, int cpdimen, boolean rational,
00245                                 int deg, const double *cpoints,
00246                                 const byte *mk, const char *name );
00247 
00248 boolean bsf_WriteBSplineCurved ( int spdimen, int cpdimen, boolean rational,
00249                                  int deg, int lastknot, const double *knots,
00250                                  boolean closed,
00251                                  const double *cpoints, const byte *mk,
00252                                  const char *name );
00253 
00254 boolean bsf_WriteBezierPatchd ( int spdimen, int cpdimen, boolean rational,
00255                                 int udeg, int vdeg,
00256                                 int pitch, const double *cpoints, const byte *mk,
00257                                 const char *name );
00258 
00259 boolean bsf_WriteBSplinePatchd ( int spdimen, int cpdimen, boolean rational,
00260                                  int udeg, int lastknotu, const double *knotsu,
00261                                  int vdeg, int lastknotv, const double *knotsv,
00262                                  boolean closed_u, boolean closed_v,
00263                                  int pitch, const double *cpoints, const byte *mk,
00264                                  const char *name );
00265 
00266 boolean bsf_WriteBSMeshd ( int spdimen, int cpdimen, boolean rational, int degree,
00267                            int nv, const BSMvertex *mv, const int *mvhei,
00268                            const double *vc,
00269                            int nhe, const BSMhalfedge *mhe,
00270                            int nfac, const BSMfacet *mfac, const int *mfhei,
00271                            const byte *mkv, const char *name );
00272 
00273 boolean bsf_WriteBSplineHoled ( int hole_k, const double *knots,
00274                                 const point2d *domain_cp,
00275                                 const point3d *hole_cp, const byte *mk,
00276                                 const char *name );
00277 
00278 #ifdef __cplusplus
00279 }
00280 #endif
00281 
00282 #endif /*BSFILE_H*/
00283