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 #include <math.h>
00043 #include "memvirtu.h"
00044 #include "lowparam.h"
00045 #include "lowmacro.h"
00046 #include "lowsolid.h"
00047 #include "sethmain.h"
00048
00049 #define antigo
00050
00051 void MSD_lowSetOpVVReclassifyEdges(int op)
00052 {
00053 int i, j, k1, k2, k3, newsa, newsb;
00054 int secta, prevsecta;
00055 int sectb, prevsectb;
00056 int s1a, s1b;
00057
00058 #ifdef TRACE_BOOLEAN22
00059 static char *ff[] = { "OUT", "ON ", "IN " };
00060 #endif
00061
00062 for (i = 0; i < nsectors; i++)
00063 {
00064
00065 if (SetSecInter(i) && (SetSecs1a(i) == USP_ON) && (SetSecs1b(i) == USP_ON))
00066 {
00067 secta = SetSecA(i);
00068 sectb = SetSecB(i);
00069 prevsecta = (secta == 0) ? nnba - 1 : secta - 1;
00070 prevsectb = (sectb == 0) ? nnbb - 1 : sectb - 1;
00071
00072
00073
00074 newsa = (op == USP_UNION) ? USP_OUT : (op == USP_INTERSECT ? USP_IN : USP_IN);
00075 newsb = (op == USP_UNION) ? USP_IN : (op == USP_INTERSECT ? USP_OUT : USP_OUT);
00076
00077 if (op == USP_DIFFERENCE)
00078 {
00079 for (k1 = 0; k1 < nsectors; k1++)
00080 {
00081 if ((SetSecA(k1) == secta) && (SetSecB(k1) == prevsectb))
00082 {
00083 break;
00084 }
00085 }
00086 for (k2 = 0; k2 < nsectors; k2++)
00087 {
00088 if ((SetSecA(k2) == prevsecta) && (SetSecB(k2) == sectb))
00089 {
00090 break;
00091 }
00092 }
00093 for (k3 = 0; k3 < nsectors; k3++)
00094 {
00095 if ((SetSecA(k3) == prevsecta) && (SetSecB(k3) == prevsectb))
00096 {
00097 break;
00098 }
00099 }
00100
00101 if ((SetSecs2b(i) == SetSecs1b(k1)) && (SetSecs2b(i) == SetSecs2b(k2)) &&
00102 (SetSecs2b(i) == SetSecs1b(k3)))
00103 {
00104
00105 newsb = SetSecs2b(i);
00106 }
00107 if ((SetSecs2a(i) == SetSecs2a(k1)) && (SetSecs2a(i) == SetSecs1a(k2)) &&
00108 (SetSecs2a(i) == SetSecs1a(k3)))
00109 {
00110
00111 newsa = -SetSecs2a(i);
00112 }
00113 }
00114
00115
00116
00117
00118 #ifdef TRACE_BOOLEAN22
00119 fprintf(trace, "\nPASSO 1 ***\n");
00120 fprintf(trace, "par numero %2d - sec.s1a == ON && sec.s1b == ON\n", i);
00121 fprintf(trace, " - secta = %2d --> %4s\n", secta, ff[SetSecs1a(i) + 1]);
00122 fprintf(trace, " - sectb = %2d --> %4s\n", sectb, ff[SetSecs1b(i) + 1]);
00123 fprintf(trace, " - prevsecta = %2d --> %4s\n", prevsecta, ff[SetSecs2a(i) + 1]);
00124 fprintf(trace, " - prevsectb = %2d --> %4s\n", prevsectb, ff[SetSecs2b(i) + 1]);
00125 #endif
00126
00127 for (j = 0; j < nsectors; j++)
00128 {
00129
00130 if (SetSecInter(j))
00131 {
00132 #ifdef TRACE_BOOLEAN22
00133 fprintf(trace, "*** j = %2d\n", j);
00134 fprintf(trace, " - secta = %2d --> %4s\n", SetSecA(j), ff[SetSecs1a(j) + 1]);
00135 fprintf(trace, " - sectb = %2d --> %4s\n", SetSecB(j), ff[SetSecs1b(j) + 1]);
00136 fprintf(trace, " - prevsecta = %2d --> %4s\n", (SetSecA(j) == 0) ? nnba - 1 : SetSecA(j) - 1, ff[SetSecs2a(j) + 1]);
00137 fprintf(trace, " - prevsectb = %2d --> %4s\n", (SetSecB(j) == 0) ? nnbb - 1 : SetSecB(j) - 1, ff[SetSecs2b(j) + 1]);
00138 #endif
00139
00140
00141
00142
00143 if ((SetSecA(j) == secta) && (SetSecB(j) == sectb))
00144 {
00145 #ifdef TRACE_BOOLEAN22
00146 fprintf(trace, "*** sec.secta == secta && sec.sectb == sectb\n");
00147 fprintf(trace, "--> sec[%2d].s1a = %4s\n", j, ff[newsa + 1]);
00148 fprintf(trace, "--> sec[%2d].s1b = %4s\n", j, ff[newsb + 1]);
00149 #endif
00150 SetSecs1a(j) = newsa;
00151 SetSecs1b(j) = newsb;
00152 }
00153
00154
00155
00156 if ((SetSecA(j) == prevsecta) && (SetSecB(j) == sectb))
00157 {
00158 #ifdef TRACE_BOOLEAN22
00159 fprintf(trace, "**** sec.secta == prevsecta && sec.sectb == sectb\n");
00160 fprintf(trace, "--> sec[%2d].s2a = %4s\n", j, ff[newsa + 1]);
00161 fprintf(trace, "--> sec[%2d].s1b = %4s\n", j, ff[newsb + 1]);
00162 #endif
00163 SetSecs2a(j) = newsa;
00164 SetSecs1b(j) = newsb;
00165 }
00166
00167 if ((SetSecA(j) == secta) && (SetSecB(j) == prevsectb))
00168 {
00169 #ifdef TRACE_BOOLEAN22
00170 fprintf(trace, "*** sec.secta == secta && sec.sectb == prevsectb\n");
00171 fprintf(trace, "--> sec[%2d].s1a = %4s\n", j, ff[newsa + 1]);
00172 fprintf(trace, "--> sec[%2d].s2b = %4s\n", j, ff[newsb + 1]);
00173 #endif
00174 SetSecs1a(j) = newsa;
00175 SetSecs2b(j) = newsb;
00176 }
00177
00178 if ((SetSecA(j) == prevsecta) && (SetSecB(j) == prevsectb))
00179 {
00180 #ifdef TRACE_BOOLEAN22
00181 fprintf(trace, "*** sec.secta == prevsecta && sec.sectb == prevsectb\n");
00182 fprintf(trace, "--> sec[%2d].s2a = %4s\n", j, ff[newsa + 1]);
00183 fprintf(trace, "--> sec[%2d].s2b = %4s\n", j, ff[newsb + 1]);
00184 #endif
00185 SetSecs2a(j) = newsa;
00186 SetSecs2b(j) = newsb;
00187 }
00188
00189 if ((SetSecs1a(j) == SetSecs2a(j)) &&
00190 ((SetSecs1a(j) == USP_IN) || (SetSecs1a(j) == USP_OUT)))
00191 {
00192 #ifdef TRACE_BOOLEAN22
00193 fprintf(trace, "*** sec.s1a == sec.s2a != ON\n");
00194 fprintf(trace, "--> sec[%2d].intersect = 0\n", j);
00195 #endif
00196 SetSecInter(j) = 0;
00197 }
00198 if ((SetSecs1b(j) == SetSecs2b(j)) &&
00199 ((SetSecs1b(j) == USP_IN) || (SetSecs1b(j) == USP_OUT)))
00200 {
00201 #ifdef TRACE_BOOLEAN22
00202 fprintf(trace, "*** sec.s1b == sec.s2b != ON\n");
00203 fprintf(trace, "--> sec[%2d].intersect = 0\n", j);
00204 #endif
00205 SetSecInter(j) = 0;
00206 }
00207 }
00208 }
00209 }
00210 }
00211
00212 for (i = 0; i < nsectors; i++)
00213 {
00214 s1a = SetSecs1a(i);
00215 s1b = SetSecs1b(i);
00216
00217
00218 if (SetSecInter(i) && (s1a == USP_ON))
00219 {
00220 secta = SetSecA(i);
00221 sectb = SetSecB(i);
00222
00223
00224 prevsecta = (secta == 0) ? nnba - 1 : secta - 1;
00225 prevsectb = (sectb == 0) ? nnbb - 1 : sectb - 1;
00226
00227 #ifndef antigo
00228 nextsecta = (secta == nnba - 1) ? 0 : secta + 1;
00229 if (SetANBHe(nextsecta) == SetANBHe(secta))
00230 {
00231 nextsecta = (nextsecta == nnba - 1) ? 0 : nextsecta + 1;
00232 }
00233 nextsectb = (sectb == nnbb - 1) ? 0 : sectb + 1;
00234 if (SetBNBHe(nextsectb) == SetBNBHe(sectb))
00235 {
00236 nextsectb = (nextsectb == nnbb - 1) ? 0 : nextsectb + 1;
00237 }
00238 #endif
00239
00240 newsa = op == USP_UNION ? USP_OUT : op == USP_DIFFERENCE ? USP_OUT : USP_IN;
00241
00242 #ifdef TRACE_BOOLEAN22
00243 fprintf(trace, "\nPASSO 2 ***\n");
00244 fprintf(trace, "par numero %2d - sec.s1a == ON\n", i);
00245 fprintf(trace, " - secta = %2d --> %4s\n", secta, ff[SetSecs1a(i) + 1]);
00246 fprintf(trace, " - sectb = %2d --> %4s\n", sectb, ff[SetSecs1b(i) + 1]);
00247 fprintf(trace, " - prevsecta = %2d --> %4s\n", prevsecta, ff[SetSecs2a(i) + 1]);
00248 fprintf(trace, " - prevsectb = %2d --> %4s\n", prevsectb, ff[SetSecs2b(i) + 1]);
00249 #endif
00250
00251 for (j = 0; j < nsectors; j++)
00252 {
00253
00254 if (SetSecInter(j))
00255 {
00256 #ifdef TRACE_BOOLEAN22
00257 fprintf(trace, "*** j = %2d\n", j);
00258 fprintf(trace, " - secta = %2d --> %4s\n", SetSecA(j), ff[SetSecs1a(j) + 1]);
00259 fprintf(trace, " - sectb = %2d --> %4s\n", SetSecB(j), ff[SetSecs1b(j) + 1]);
00260 fprintf(trace, " - prevsecta = %2d --> %4s\n", (SetSecA(j) == 0) ? nnba - 1 : SetSecA(j) - 1, ff[SetSecs2a(j) + 1]);
00261 fprintf(trace, " - prevsectb = %2d --> %4s\n", (SetSecB(j) == 0) ? nnbb - 1 : SetSecB(j) - 1, ff[SetSecs2b(j) + 1]);
00262 #endif
00263
00264 #ifdef antigo
00265
00266
00267
00268 if ((SetSecA(j) == secta) && (SetSecB(j) == sectb))
00269 {
00270 #ifdef TRACE_BOOLEAN22
00271 fprintf(trace, "*** sec.secta == secta && sec.sectb == sectb\n");
00272 fprintf(trace, "--> sec[%2d].s1a = %4s\n", j, ff[newsa + 1]);
00273 #endif
00274 SetSecs1a(j) = newsa;
00275 }
00276
00277
00278
00279 if ((SetSecA(j) == prevsecta) && (SetSecB(j) == sectb))
00280 {
00281 #ifdef TRACE_BOOLEAN22
00282 fprintf(trace, "*** sec.secta == prevsecta && sec.sectb == sectb && sec.s1a == ON\n");
00283 fprintf(trace, "--> sec[%2d].s1a = %4s\n", i, ff[SetSecs1a(i) + 1]);
00284 fprintf(trace, "--> sec[%2d].s2a = %4s\n", j, ff[SetSecs2a(j) + 1]);
00285 #endif
00286 SetSecs2a(j) = newsa;
00287 }
00288 #else
00289
00290
00291
00292 if ((SetSecA(j) == secta) && (SetSecB(j) == prevsectb))
00293 {
00294 if (s2a == SetSecs1a(j))
00295 {
00296 SetSecs1a(i) = (op == USP_UNION) ? newsa : -newsa;
00297 SetSecs2a(j) = (op == USP_UNION) ? newsa : -newsa;
00298 }
00299 else
00300 {
00301 SetSecs1a(i) = (op == USP_UNION) ? USP_OUT : USP_IN;
00302 SetSecs2a(j) = (op == USP_UNION) ? USP_OUT : USP_IN;
00303 }
00304 #ifdef TRACE_BOOLEAN22
00305 fprintf(trace, "*** sec.secta == prevsecta && sec.sectb == sectb && sec.s1a == ON\n");
00306 fprintf(trace, "--> sec[%2d].s1a = %4s\n", i, ff[SetSecs1a(i) + 1]);
00307 fprintf(trace, "--> sec[%2d].s2a = %4s\n", j, ff[SetSecs2a(j) + 1]);
00308 #endif
00309 }
00310 if ((SetSecA(j) == nextsecta) && (SetSecB(j) == sectb) && (s2a == USP_ON))
00311 {
00312 if (s1a == SetSecs2a(j))
00313 {
00314 SetSecs2a(i) = (op == USP_UNION) ? newsa : -newsa;
00315 SetSecs1a(j) = (op == USP_UNION) ? newsa : -newsa;
00316 }
00317 else
00318 {
00319 SetSecs2a(i) = (op == USP_UNION) ? USP_OUT : USP_IN;
00320 SetSecs1a(j) = (op == USP_UNION) ? USP_OUT : USP_IN;
00321 }
00322 #ifdef TRACE_BOOLEAN22
00323 fprintf(trace, "*** sec.secta == nextsecta && sec.sectb == sectb && sec.s2a == ON\n");
00324 fprintf(trace, "--> sec[%2d].s2a = %4s\n", i, ff[SetSecs2a(i) + 1]);
00325 fprintf(trace, "--> sec[%2d].s1a = %4s\n", j, ff[SetSecs1a(j) + 1]);
00326 #endif
00327 }
00328 #endif
00329 if ((SetSecs1a(j) == SetSecs2a(j)) &&
00330 ((SetSecs1a(j) == USP_IN) || (SetSecs1a(j) == USP_OUT)))
00331 {
00332 #ifdef TRACE_BOOLEAN22
00333 fprintf(trace, "*** sec.s1a == sec.s2a != ON\n");
00334 fprintf(trace, "--> sec[%2d].intersect == 0\n", j);
00335 #endif
00336 SetSecInter(j) = 0;
00337 }
00338 }
00339 }
00340 }
00341 else
00342 if (SetSecInter(i) && s1b == USP_ON)
00343 {
00344 secta = SetSecA(i);
00345 sectb = SetSecB(i);
00346 prevsecta = (secta == 0) ? nnba - 1 : secta - 1;
00347 prevsectb = (sectb == 0) ? nnbb - 1 : sectb - 1;
00348 newsb = (op == USP_UNION) ? USP_IN : (op == USP_DIFFERENCE) ? USP_IN : USP_OUT;
00349
00350 #ifdef TRACE_BOOLEAN22
00351 fprintf(trace, "\nPASSO 3 ***\n");
00352 fprintf(trace, "par numero %2d - sec.s1b == ON\n", i);
00353 fprintf(trace, " - secta = %2d\n", secta);
00354 fprintf(trace, " - sectb = %2d\n", sectb);
00355 fprintf(trace, " - prevsecta = %2d\n", prevsecta);
00356 fprintf(trace, " - prevsectb = %2d\n", prevsectb);
00357 #endif
00358
00359 for (j = 0; j < nsectors; j++)
00360 {
00361 if (SetSecInter(j))
00362 {
00363 #ifdef TRACE_BOOLEAN22
00364 fprintf(trace, "*** j = %2d\n", j);
00365 fprintf(trace, " - secta = %2d\n", SetSecA(j));
00366 fprintf(trace, " - sectb = %2d\n", SetSecB(j));
00367 fprintf(trace, " - prevsecta = %2d\n", (SetSecA(j) == 0) ? nnba - 1 : SetSecA(j) - 1);
00368 fprintf(trace, " - prevsectb = %2d\n", (SetSecB(j) == 0) ? nnbb - 1 : SetSecB(j) - 1);
00369 #endif
00370 if ((SetSecA(j) == secta) && (SetSecB(j) == sectb))
00371 {
00372 #ifdef TRACE_BOOLEAN22
00373 fprintf(trace, "*** sec.secta == secta && sec.sectb == sectb\n");
00374 fprintf(trace, "--> sec[%2d].s1b = %4s\n", j, ff[newsb + 1]);
00375 #endif
00376 SetSecs1b(j) = newsb;
00377 }
00378
00379 if ((SetSecA(j) == secta) && (SetSecB(j) == prevsectb))
00380 {
00381 #ifdef TRACE_BOOLEAN22
00382 fprintf(trace, "*** sec.secta == secta && sec.sectb == prevsectb && sec.s1b == ON\n");
00383 fprintf(trace, "--> sec[%2d].s1a = %4s\n", i, ff[SetSecs1b(i) + 1]);
00384 fprintf(trace, "--> sec[%2d].s2a = %4s\n", j, ff[SetSecs2b(j) + 1]);
00385 #endif
00386 SetSecs2b(j) = newsb;
00387 }
00388
00389 if ((SetSecs1b(j) == SetSecs2b(j)) &&
00390 ((SetSecs1b(j) == USP_IN) || (SetSecs1b(j) == USP_OUT)))
00391 {
00392 #ifdef TRACE_BOOLEAN22
00393 fprintf(trace, "*** sec.s1b == sec.s2b != ON\n");
00394 fprintf(trace, "--> sec[%2d].intersect = 0\n", j);
00395 #endif
00396 SetSecInter(j) = 0;
00397 }
00398 }
00399 }
00400 }
00401 }
00402 }