00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <stdio.h>
00042 #ifndef __UNIX_
00043 #include <string.h>
00044 #include <malloc.h>
00045 #endif
00046 #include "memvirtu.h"
00047 #include "lowparam.h"
00048 #include "lowmacro.h"
00049 #include "lowsolid.h"
00050 #include "hiegroup.h"
00051 #include "curvgeom.h"
00052
00053 unsigned nodesize[] =
00054 {
00055 sizeof(STYPE), sizeof(DTYPE), sizeof(FTYPE), sizeof(LTYPE),
00056 sizeof(ETYPE), sizeof(HTYPE), sizeof(VTYPE), sizeof(ATYPE),
00057 sizeof(GTYPE), 0,
00058 };
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 NPTYPE MSD_lowNewElement(int what, NPTYPE where)
00090 {
00091 NPTYPE node;
00092
00093 #ifndef __VIRTUAL_MEM
00094 if ((node = (NPTYPE)malloc(nodesize[what])) == NNIL)
00095 {
00096 #else
00097 if ((node = (NPTYPE)MSD_getMemVirtual(what)) == NNIL)
00098 {
00099 #endif
00100 fprintf(stderr, "new: no memory left!\n");
00101 return(NNIL);
00102 }
00103
00104 switch (what)
00105 {
00106 case SOLID:
00107 MSD_lowAddList(SOLID, node, NNIL);
00108 #ifndef __VIRTUAL_MEM
00109 #ifdef __curved_env__
00110 node->s.scurvs = CNIL;
00111 #endif
00112 node->s.sshells = DNIL;
00113 node->s.dsp = TRUE;
00114 node->s.sbits = 0;
00115 node->s.color = -1;
00116 node->s.corte = -1;
00117 node->s.group = def_grpptr;
00118 node->s.oaxs = ANIL;
00119 strcpy(node->s.name, "");
00120 #else
00121 #ifdef __curved_env__
00122 SolCurv(node) = (CURVE *)NIL;
00123 #endif
00124 SolSShells(node) = DNIL;
00125 SolDsp(node) = TRUE;
00126 SolSBits(node) = 0;
00127 SolColor(node) = -1;
00128 SolPerfil(node) = -1;
00129 SolGroup(node) = def_grpptr;
00130 SolOAxs(node) = ANIL;
00131 strcpy(SolName(node), "");
00132 #endif
00133 break;
00134
00135 case SHELL:
00136 MSD_lowAddList(SHELL, node, where);
00137 #ifndef __VIRTUAL_MEM
00138 node->d.sfaces = FNIL;
00139 node->d.sedges = ENIL;
00140 node->d.sverts = VNIL;
00141 node->d.dbits = 0;
00142 node->d.color = -1;
00143 #else
00144 SheSFaces(node) = FNIL;
00145 SheSEdges(node) = ENIL;
00146 SheSVerts(node) = VNIL;
00147 SheDBits(node) = 0;
00148 SheColor(node) = -1;
00149 #endif
00150 break;
00151
00152 case FACE:
00153 MSD_lowAddList(FACE, node, where);
00154 #ifndef __VIRTUAL_MEM
00155 node->f.floops = LNIL;
00156 node->f.flout = LNIL;
00157 node->f.fbits = 0;
00158 node->f.color = -1;
00159 #else
00160 FacFLoops(node) = LNIL;
00161 FacFLOut(node) = LNIL;
00162 FacFBits(node) = 0;
00163 FacColor(node) = -1;
00164 FacFlag(node) = 0;
00165 #endif
00166 break;
00167
00168 case LOOP:
00169 MSD_lowAddList(LOOP, node, where);
00170 break;
00171
00172 case HALFEDGE:
00173 #ifndef __VIRTUAL_MEM
00174 #ifdef __curved_env__
00175 node->h.curv = CNIL;
00176 node->h.r = 0;
00177 #endif
00178 #else
00179 #ifdef __curved_env__
00180 HalCurv(node) = (CURVE *)NIL;
00181 HalR(node) = 0;
00182 #endif
00183 #endif
00184 break;
00185
00186 case EDGE:
00187 MSD_lowAddList(EDGE, node, where);
00188 #ifndef __VIRTUAL_MEM
00189 node->e.color = -1;
00190 #ifdef __curved_env__
00191 node->e.fg_round = 1;
00192 node->e.fg_make = 0;
00193 node->e.t1 = 0;
00194 node->e.t2 = 0;
00195 node->e.t3 = 0;
00196 node->e.t4 = 0;
00197 node->e.d = 0;
00198 #endif
00199 #else
00200 EdgColor(node) = -1;
00201 #ifdef __curved_env__
00202 EdgFgRound(node) = 1;
00203 EdgFgMake(node) = 0;
00204 EdgT1(node) = 0;
00205 EdgT2(node) = 0;
00206 EdgT3(node) = 0;
00207 EdgT4(node) = 0;
00208 EdgD(node) = 0;
00209 #endif
00210 #endif
00211 break;
00212
00213 case VERTEX:
00214 MSD_lowAddList(VERTEX, node, where);
00215 #ifndef __VIRTUAL_MEM
00216 node->v.vedge = HNIL;
00217 #ifdef __curved_env__
00218 node->v.fg_round = 0;
00219 node->v.fg_make = 0;
00220 #endif
00221 #else
00222 VerVEdge(node) = HNIL;
00223 #ifdef __curved_env__
00224 VerFgRound(node) = 0;
00225 VerFgMake(node) = 0;
00226 #endif
00227 #endif
00228 break;
00229
00230 case AXIS:
00231 MSD_lowAddList(AXIS, node, where);
00232 #ifndef __VIRTUAL_MEM
00233 node->a.type = NONE;
00234 node->a.hierarq.agroup = GNIL;
00235 #else
00236 AxsType(node) = NONE;
00237 AxsAGroup(node) = GNIL;
00238 #endif
00239 break;
00240
00241 case GROUP:
00242 MSD_lowAddList(GROUP, node, where);
00243 #ifndef __VIRTUAL_MEM
00244 node->g.gcolor = -1;
00245 node->g.gaxs = ANIL;
00246 node->g.parent = def_grpptr;
00247 #else
00248 GrpGColor(node) = -1;
00249 GrpGAxs(node) = ANIL;
00250 GrpParent(node) = def_grpptr;
00251 #endif
00252 break;
00253
00254 default:
00255 fprintf(stderr, "new: codigo incorreto!\n");
00256 break;
00257 }
00258 return(node);
00259 }
00260
00261 void MSD_lowDelElement(int what, NPTYPE node, NPTYPE where)
00262 {
00263 switch (what)
00264 {
00265 case SOLID:
00266 MSD_lowDelList(SOLID, node, where);
00267 break;
00268
00269 case SHELL:
00270 MSD_lowDelList(SHELL, node, where);
00271 break;
00272
00273 case FACE:
00274 MSD_lowDelList(FACE, node, where);
00275 break;
00276
00277 case LOOP:
00278 MSD_lowDelList(LOOP, node, where);
00279 break;
00280
00281 case HALFEDGE:
00282 break;
00283
00284 case EDGE:
00285 MSD_lowDelList(EDGE, node, where);
00286 break;
00287
00288 case VERTEX:
00289 MSD_lowDelList(VERTEX, node, where);
00290 break;
00291
00292 case GROUP:
00293 MSD_lowDelList(GROUP, node, where);
00294 break;
00295
00296 case AXIS:
00297 MSD_lowDelList(AXIS, node, where);
00298 break;
00299
00300 default:
00301 fprintf(stderr, "del: codigo incorreto!\n");
00302 break;
00303 }
00304
00305 #ifdef __VIRTUAL_MEM
00306 MSD_putMemVirtual(node, what);
00307 #else
00308 free((char *)node);
00309 #endif
00310 }
00311
00312 #ifndef __VIRTUAL_MEM
00313
00314 int bytesused(STYPE *s)
00315 {
00316 int used;
00317 DTYPE *d;
00318 FTYPE *f;
00319 LTYPE *l;
00320 ETYPE *e;
00321 VTYPE *v;
00322
00323 used = nodesize[SOLID];
00324 for (AllShellsSolid(s, d))
00325 {
00326 for (AllFacesShell(d, f))
00327 {
00328 for (AllLoopsFace(f, l))
00329 {
00330 used += l->length ? l->length * nodesize[HALFEDGE] :
00331 nodesize[HALFEDGE];
00332 used += nodesize[LOOP];
00333 }
00334 used += nodesize[FACE];
00335 }
00336 used += nodesize[SHELL];
00337 }
00338 for (AllShellsSolid(s, d))
00339 {
00340 for (AllEdgesShell(d, e))
00341 {
00342 used += nodesize[EDGE];
00343 }
00344 }
00345 for (AllShellsSolid(s, d))
00346 {
00347 for (AllVerticesShell(d, v))
00348 {
00349 used += nodesize[VERTEX];
00350 }
00351 }
00352 return(used);
00353 }
00354
00355 #endif