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 #define _BOOLEAN_
00042 #include <stdio.h>
00043 #include <math.h>
00044 #include "memvirtu.h"
00045 #include "lowparam.h"
00046 #include "lowmacro.h"
00047 #include "lowsolid.h"
00048 #include "lowgeome.h"
00049 #include "eulerops.h"
00050 #include "shpshape.h"
00051 #include "sethmain.h"
00052
00053 extern int NumRecordsVM[10];
00054 extern char *ArqVirtualMemory[];
00055 SPTYPE sola;
00056 SPTYPE solb;
00057
00058
00059 int MSD_lowSetOp(SPTYPE a, SPTYPE b, Id sn, SPTYPE *res, int op)
00060 {
00061 VPTYPE v;
00062 DPTYPE d;
00063 int i, flag, code;
00064
00065 #ifdef TRACE_BOOLEAN
00066 if ((trace = fopen("BOOLEAN.TXT", "w")) == (FILE *)NIL)
00067 {
00068 fprintf(stderr, "ERROR: nao conseguiu abrir arquivo de trace/n");
00069 return(ERROR);
00070 }
00071 #endif
00072
00073 CommandCount++;
00074 sola = a;
00075 solb = b;
00076
00077 #ifdef __VIRTUAL_MEM
00078
00079
00080
00081 close_v_array(VirtualMemoryBlock[GROUP]);
00082 close_v_array(VirtualMemoryBlock[AXIS]);
00083
00084
00085
00086
00087 if (MSD_lowSetOpInitiate0() == ERROR)
00088 {
00089 fprintf(stderr, "setop: nao conseguiu abrir arquivos de memoria virtual!\n");
00090 return(ERROR);
00091 }
00092 #endif
00093
00094 MSD_lowSetNormal(a, FALSE);
00095 MSD_lowSetNormal(b, FALSE);
00096 contshella = contshellb = 0;
00097 for (AllShellsSolid(a, d))
00098 {
00099 SetASheShell(contshella) = d;
00100 v = SheSVerts(d);
00101 flag = 0;
00102 while (flag == 0)
00103 {
00104 if ((code = MSD_lowSolVtxContainment(b, v)) == 0)
00105 {
00106 if ((v = VerNextV(v)) == VNIL)
00107 {
00108 flag = 1;
00109 }
00110 }
00111 else
00112 {
00113 flag = 1;
00114 }
00115 }
00116 SetASheSign(contshella) = code;
00117 contshella++;
00118 }
00119 for (AllShellsSolid(b, d))
00120 {
00121 SetBSheShell(contshellb) = d;
00122 v = SheSVerts(d);
00123 flag = 0;
00124 while (flag == 0)
00125 {
00126 if ((code = MSD_lowSolVtxContainment(a, v)) == 0)
00127 {
00128 if ((v = VerNextV(v)) == VNIL)
00129 {
00130 flag = 1;
00131 }
00132 }
00133 else
00134 {
00135 flag = 1;
00136 }
00137 }
00138 SetBSheSign(contshellb) = code;
00139 contshellb++;
00140 }
00141
00142 #ifdef TRACE_BOOLEAN
00143 fprintf(trace, "*** SOLID A - shells\n");
00144 for (i = 0; i < contshella; i++)
00145 {
00146 fprintf(trace, "*** shell - %2d\n", SheShellNo(SetASheShell(i)));
00147 fprintf(trace, " code - %2d\n", SetASheSign(i));
00148 }
00149 fprintf(trace, "*** SOLID B - shells\n");
00150 for (i = 0; i < contshellb; i++)
00151 {
00152 fprintf(trace, "*** shell - %2d\n", SheShellNo(SetBSheShell(i)));
00153 fprintf(trace, " code - %2d\n", SetBSheSign(i));
00154 }
00155 #endif
00156
00157 #ifdef __VIRTUAL_MEM
00158
00159
00160
00161
00162 close_v_array(SET01VirtualArray);
00163 #endif
00164
00165 maxf = MSD_getMaxFaceId(a);
00166 maxv = MSD_getMaxVertexId(a);
00167 maxd = MSD_getMaxShellId(a);
00168
00169 maxf = MSD_getMaxFaceId(b);
00170 maxv = MSD_getMaxVertexId(b);
00171 maxd = MSD_getMaxShellId(b);
00172
00173 fprintf(stderr, "1");
00174
00175 #ifdef __VIRTUAL_MEM
00176
00177
00178
00179 if (MSD_lowSetOpInitiate1() == ERROR)
00180 {
00181 fprintf(stderr, "setop: 1 - nao conseguiu abrir arquivos de memoria virtual!\n");
00182 return(ERROR);
00183 }
00184
00185
00186
00187
00188 if (MSD_lowSetOpInitiate2() == ERROR)
00189 {
00190 fprintf(stderr, "setop: 2 - nao conseguiu abrir arquivos de memoria virtual!\n");
00191 return(ERROR);
00192 }
00193 #endif
00194
00195 MSD_lowSetOpGenerate(a, b);
00196 fprintf(stderr, "!");
00197 #ifdef TRACE_BOOLEAN1
00198 fprintf(trace, "*** SOLID A\n");
00199 MSD_lowListSolid(trace, a, 101);
00200 fprintf(trace, "*** SOLID B\n");
00201 MSD_lowListSolid(trace, b, 101);
00202 #endif
00203
00204 fprintf(stderr, "2");
00205
00206 MSD_lowSetOpClassify(op);
00207 fprintf(stderr, "!");
00208
00209 #ifdef TRACE_BOOLEAN2
00210 fprintf(trace, "*** SOLID A\n");
00211 MSD_lowListSolid(trace, a, 101);
00212 fprintf(trace, "*** SOLID B\n");
00213 MSD_lowListSolid(trace, b, 101);
00214 #endif
00215
00216 nfaca = nfacb = 0;
00217 if (nedga != 0)
00218 {
00219 fprintf(stderr, "3");
00220 MSD_lowSetOpConnect();
00221 fprintf(stderr, "!");
00222 #ifdef TRACE_BOOLEAN3
00223 fprintf(trace, "*** SOLID A\n");
00224 MSD_lowListSolid(trace, a, 101);
00225 fprintf(trace, "*** SOLID B\n");
00226 MSD_lowListSolid(trace, b, 101);
00227 #endif
00228 }
00229
00230 fprintf(stderr, "4");
00231
00232 #ifdef __VIRTUAL_MEM
00233 if ((SET01VirtualArray = (VACB *)open_v_array("SETOP01.TMP", 10))
00234 == (VACB *)NIL)
00235 {
00236 fprintf(stderr, "setop: nao conseguiu abrir arquivos de memoria virtual!\n");
00237 return(ERROR);
00238 }
00239 #endif
00240
00241 *res = MSD_lowSetOpFinish(a, b, sn, op);
00242
00243 #ifdef __VIRTUAL_MEM
00244 MSD_lowSetOpTerminate5();
00245 #endif
00246
00247 for (flag = i = 0; i < contshella + nfaca; i++)
00248 {
00249 if (SetASheSign(i) != -2)
00250 {
00251 flag = 1;
00252 }
00253 }
00254
00255 if (flag == 1)
00256 {
00257 MSD_lowSoftRemove(a);
00258 }
00259 for (flag = i = 0; i < contshellb + nfacb; i++)
00260 {
00261 if (SetBSheSign(i) != -2)
00262 {
00263 flag = 1;
00264 }
00265 }
00266
00267 if (flag == 1)
00268 {
00269 MSD_lowSoftRemove(b);
00270 }
00271
00272 if (*res != SNIL)
00273 {
00274 MSD_lowSetNormal(*res, TRUE);
00275 MSD_lowSetEdgeAngle(*res);
00276 MSD_lowSetInfo(*res);
00277 }
00278
00279 fprintf(stderr, "!\n");
00280 #ifdef TRACE_BOOLEAN
00281 fprintf(trace, "*** SOLID C\n");
00282 MSD_lowListSolid(trace, *res, 101);
00283 #endif
00284
00285 #ifdef TRACE_BOOLEAN
00286 fclose(trace);
00287 #endif
00288
00289 #ifdef __VIRTUAL_MEM
00290 MSD_lowSetOpTerminate0();
00291 VirtualMemoryBlock[GROUP] = (VACB *)open_v_array(ArqVirtualMemory[GROUP],
00292 NumRecordsVM[GROUP]);
00293 VirtualMemoryBlock[AXIS] = (VACB *)open_v_array(ArqVirtualMemory[AXIS],
00294 NumRecordsVM[AXIS]);
00295 #endif
00296
00297 return(SUCCESS);
00298 }
00299
00300 #ifdef __VIRTUAL_MEM
00301 int MSD_lowSetOpInitiate0(void)
00302 {
00303 init_v_array("SETOP01.TMP", sizeof(SFF), ' ');
00304 if ((SET01VirtualArray = (VACB *)open_v_array("SETOP01.TMP", 20))
00305 == (VACB *)NIL)
00306 {
00307 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00308 return(ERROR);
00309 }
00310 return(SUCCESS);
00311 }
00312
00313 void MSD_lowSetOpTerminate0(void)
00314 {
00315 close_v_array(SET01VirtualArray);
00316 remove("SETOP01.TMP");
00317 }
00318
00319 int MSD_lowSetOpInitiate1(void)
00320 {
00321 init_v_array("SETOP03.TMP", sizeof(SONVV), ' ');
00322 if ((SET03VirtualArray = (VACB *)open_v_array("SETOP03.TMP", 20))
00323 == (VACB *)NIL)
00324 {
00325 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00326 return(ERROR);
00327 }
00328 return(SUCCESS);
00329 }
00330
00331 void MSD_lowSetOpTerminate1(void)
00332 {
00333 close_v_array(SET03VirtualArray);
00334 remove("SETOP03.TMP");
00335 }
00336
00337 int MSD_lowSetOpInitiate2(void)
00338 {
00339 init_v_array("SETOP04.TMP", sizeof(SONVF), ' ');
00340 if ((SET04VirtualArray = (VACB *)open_v_array("SETOP04.TMP", 20))
00341 == (VACB *)NIL)
00342 {
00343 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00344 return(ERROR);
00345 }
00346 return(SUCCESS);
00347 }
00348
00349 void MSD_lowSetOpTerminate2(void)
00350 {
00351 close_v_array(SET04VirtualArray);
00352 remove("SETOP04.TMP");
00353 }
00354
00355 int MSD_lowSetOpInitiate3(void)
00356 {
00357 init_v_array("SETOP06.TMP", sizeof(NBR), ' ');
00358 if ((SET06VirtualArray = (VACB *)open_v_array("SETOP06.TMP", 10))
00359 == (VACB *)NIL)
00360 {
00361 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00362 return(ERROR);
00363 }
00364 return(SUCCESS);
00365 }
00366
00367 void MSD_lowSetOpTerminate3(void)
00368 {
00369 close_v_array(SET06VirtualArray);
00370 remove("SETOP06.TMP");
00371 }
00372
00373 int MSD_lowSetOpInitiate4(void)
00374 {
00375 init_v_array("SETOP07.TMP", sizeof(SECTORS), ' ');
00376 init_v_array("SETOP08.TMP", sizeof(NB), ' ');
00377 if ((SET07VirtualArray = (VACB *)open_v_array("SETOP07.TMP", 10))
00378 == (VACB *)NIL)
00379 {
00380 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00381 return(ERROR);
00382 }
00383 if ((SET08VirtualArray = (VACB *)open_v_array("SETOP08.TMP", 10))
00384 == (VACB *)NIL)
00385 {
00386 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00387 return(ERROR);
00388 }
00389 return(SUCCESS);
00390 }
00391
00392 void MSD_lowSetOpTerminate4(void)
00393 {
00394 close_v_array(SET07VirtualArray);
00395 close_v_array(SET08VirtualArray);
00396 remove("SETOP07.TMP");
00397 remove("SETOP08.TMP");
00398 }
00399
00400 int MSD_lowSetOpInitiate5(void)
00401 {
00402 init_v_array("SETOP10.TMP", sizeof(EPTYPE), ' ');
00403 if ((SET10VirtualArray = (VACB *)open_v_array("SETOP10.TMP", 10))
00404 == (VACB *)NIL)
00405 {
00406 fprintf(stderr, "*** Boolean --> sem memoria!\n");
00407 return(ERROR);
00408 }
00409 return(SUCCESS);
00410 }
00411
00412 void MSD_lowSetOpTerminate5(void)
00413 {
00414 close_v_array(SET10VirtualArray);
00415 remove("SETOP10.TMP");
00416 }
00417
00418 #endif