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 <stdlib.h>
00043 #include <math.h>
00044 #include "memvirtu.h"
00045 #include "lowparam.h"
00046 #include "lowmacro.h"
00047 #include "lowsolid.h"
00048 #include "eulerops.h"
00049 #include "sethmain.h"
00050 #include "splsplit.h"
00051
00052 int MSD_lowCheckSOFBorderFace(FPTYPE f, int flag)
00053 {
00054 int i;
00055
00056 for (i = 0; i < (flag == 0 ? nfaca : nfacb); i++)
00057 {
00058 if (flag == 0)
00059 {
00060 if (f == SetSonfa(i))
00061 {
00062 return(TRUE);
00063 }
00064 }
00065 else
00066 if (f == SetSonfb(i))
00067 {
00068 return(TRUE);
00069 }
00070 }
00071 return(FALSE);
00072 }
00073
00074 int MSD_lowCheckSOFShell(FPTYPE f, FPTYPE ff, int flag)
00075 {
00076 FPTYPE f2;
00077 LPTYPE l;
00078 HPTYPE he;
00079
00080 if (f == ff)
00081 {
00082 return(0);
00083 }
00084 if (MSD_lowCheckSOFBorderFace(f, flag))
00085 {
00086 return(1);
00087 }
00088 if (!FaceBitNOK1(f))
00089 {
00090 return(0);
00091 }
00092 SetFaceBitOK1(f);
00093
00094 for (AllLoopsFace(f, l))
00095 {
00096 he = LooLEdg(l);
00097 do
00098 {
00099 f2 = LooLFace(HalWLoop(mate(he)));
00100 if (FaceBitNOK1(f2))
00101 {
00102 if (MSD_lowCheckSOFShell(f2, ff, flag) == 1)
00103 {
00104 return(1);
00105 }
00106 }
00107 } while ((he = HalNxt(he)) != LooLEdg(l));
00108 }
00109 return(0);
00110 }
00111
00112 int MSD_lowCheckSetOpFinish(LPTYPE l, int flag)
00113 {
00114 SPTYPE s;
00115 DPTYPE d;
00116 FPTYPE f;
00117 FPTYPE ff;
00118 HPTYPE he;
00119
00120 ff = LooLFace(l);
00121 d = FacFShell(ff);
00122 s = SheSSolids(d);
00123 for (AllShellsSolid(s, d))
00124 {
00125 for (AllFacesShell(d, f))
00126 {
00127 SetFaceBitNOK1(f);
00128 }
00129 }
00130
00131 d = FacFShell(ff);
00132 he = LooLEdg(l);
00133 do
00134 {
00135 f = LooLFace(HalWLoop(mate(he)));
00136 if (FaceBitNOK1(f))
00137 {
00138 if (MSD_lowCheckSOFShell(f, ff, flag) == 1)
00139 {
00140 return(1);
00141 }
00142 }
00143 } while ((he = HalNxt(he)) != LooLEdg(l));
00144 return(0);
00145 }
00146
00147
00148 SPTYPE MSD_lowSetOpFinish(SPTYPE a, SPTYPE b, Id sn, int op)
00149 {
00150 SPTYPE res;
00151 DPTYPE d;
00152 LPTYPE l;
00153 int i, j, inda, indb, flag, index;
00154
00155
00156 #ifdef TRACE_BOOLEAN
00157 fprintf(trace, "\n\n\n");
00158 fprintf(trace, "*************************************************\n");
00159 fprintf(trace, "* *\n");
00160 fprintf(trace, "* SETOPFINISH *\n");
00161 fprintf(trace, "* *\n");
00162 fprintf(trace, "*************************************************\n");
00163 fprintf(trace, "\n");
00164 if (op == USP_UNION)
00165 {
00166 fprintf(trace, "*** Operacao UNIAO\n");
00167 }
00168 if (op == USP_INTERSECT)
00169 {
00170 fprintf(trace, "*** Operacao INTERSECCAO\n");
00171 }
00172 if (op == USP_DIFFERENCE)
00173 {
00174 fprintf(trace, "*** Operacao DIFERENCA\n");
00175 }
00176 #endif
00177
00178 if (op == USP_UNION)
00179 {
00180 inda = 0;
00181 indb = 0;
00182 }
00183 if (op == USP_INTERSECT)
00184 {
00185 inda = nfaca;
00186 indb = nfacb;
00187 }
00188 if (op == USP_DIFFERENCE)
00189 {
00190 inda = 0;
00191 indb = nfacb;
00192 }
00193 res = SNIL;
00194
00195 if (op == USP_DIFFERENCE)
00196 {
00197 for (AllShellsSolid(b, d))
00198 {
00199 MSD_lowRevert(d);
00200 }
00201 }
00202
00203 for (i = 0; i < nfaca; ++i)
00204 {
00205 l = InnerLoop(SetSonfa(i));
00206 if ((MSD_lowCheckSetOpFinish(l, 0) == 1) &&
00207 (MSD_lowCheckSetOpFinish(FacFLOut(SetSonfa(i)), 0) == 1))
00208 {
00209 SetSonfa(nfaca + i) = MSD_lowMFKRH(SetSonfa(i), l, maxf++);
00210 }
00211 else
00212 {
00213 SetSonfa(nfaca + i) = MSD_lowMSFKR(l, maxf++, maxd++);
00214 }
00215
00216 l = InnerLoop(SetSonfb(i));
00217 if ((MSD_lowCheckSetOpFinish(l, 1) == 1) &&
00218 (MSD_lowCheckSetOpFinish(FacFLOut(SetSonfb(i)), 1) == 1))
00219 {
00220 SetSonfb(nfacb + i) = MSD_lowMFKRH(SetSonfb(i), l, maxf++);
00221 }
00222 else
00223 {
00224 SetSonfb(nfacb + i) = MSD_lowMSFKR(l, maxf++, maxd++);
00225 }
00226
00227 SetASheShell(contshella + i) = FacFShell(SetSonfa(nfaca + i));
00228 SetBSheShell(contshellb + i) = FacFShell(SetSonfb(nfacb + i));
00229 }
00230
00231 for (i = 0; i < nfaca; ++i)
00232 {
00233 for (j = 0; j < contshella + nfaca; j++)
00234 {
00235 if (SetASheShell(j) == FacFShell(SetSonfa(i + inda)))
00236 {
00237 SetASheSign(j) = -2;
00238 }
00239 }
00240 for (j = 0; j < contshellb + nfaca; j++)
00241 {
00242 if (SetBSheShell(j) == FacFShell(SetSonfb(i + indb)))
00243 {
00244 SetBSheSign(j) = -2;
00245 }
00246 }
00247
00248 for (j = 0; j < contshella + nfaca; j++)
00249 {
00250 index = i + (inda == 0 ? nfaca : 0);
00251 if (SetASheShell(j) == FacFShell(SetSonfa(index)))
00252 {
00253 SetASheSign(j) = 0;
00254 }
00255 }
00256 for (j = 0; j < contshellb + nfaca; j++)
00257 {
00258 index = i + (indb == 0 ? nfacb : 0);
00259 if (SetBSheShell(j) == FacFShell(SetSonfb(index)))
00260 {
00261 SetBSheSign(j) = 0;
00262 }
00263 }
00264 }
00265
00266 #ifdef TRACE_BOOLEAN
00267 fprintf(trace, "\n");
00268 fprintf(trace, "*** setopfinish *** - inda = %2i\n", inda);
00269 fprintf(trace, "*** setopfinish *** - indb = %2i\n", indb);
00270 fprintf(trace, "*** setopfinish *** - nfaca = %2i\n", 2 * nfaca);
00271 fprintf(trace, "*** setopfinish *** - nfacb = %2i\n", 2 * nfacb);
00272 fprintf(trace, "*** estrutura sonfa ***\n");
00273 for (i = 0; i < 2 * nfaca; i++)
00274 {
00275 MSD_lowFaceEq(FacFLOut(SetSonfa(i)), FacFeq(SetSonfa(i)));
00276 trace_f(SetSonfa(i));
00277 fprintf(trace, "*** shell - %2d\n", SheShellNo(FacFShell(SetSonfa(i))));
00278 }
00279 fprintf(trace, "*** estrutura sonfb ***\n");
00280 for (i = 0; i < 2 * nfacb; i++)
00281 {
00282 MSD_lowFaceEq(FacFLOut(SetSonfb(i)), FacFeq(SetSonfb(i)));
00283 trace_f(SetSonfb(i));
00284 fprintf(trace, "*** shell - %2d\n", SheShellNo(FacFShell(SetSonfb(i))));
00285 }
00286
00287 fprintf(trace, "*** SOLID A - shells\n");
00288 for (i = 0; i < contshella + nfaca; i++)
00289 {
00290 fprintf(trace, "*** shell - %2d\n", SheShellNo(SetASheShell(i)));
00291 fprintf(trace, " code - %2d\n", SetASheSign(i));
00292 }
00293 fprintf(trace, "*** SOLID B - shells\n");
00294 for (i = 0; i < contshellb + nfacb; i++)
00295 {
00296 fprintf(trace, "*** shell - %2d\n", SheShellNo(SetBSheShell(i)));
00297 fprintf(trace, " code - %2d\n", SetBSheSign(i));
00298 }
00299 #endif
00300
00301 for (i = 0; i < nfaca; ++i)
00302 {
00303 for (j = flag = 0; j < i; j++)
00304 {
00305 if (FacFShell(SetSonfa(i + inda)) == FacFShell(SetSonfa(j + inda)))
00306 {
00307 flag = 1;
00308 }
00309 }
00310 if (flag == 0)
00311 {
00312 res = MSD_lowDetach(a, sn, FacFShell(SetSonfa(i + inda)), -1, 0, 0);
00313 }
00314 }
00315
00316 for (i = 0; i < nfacb; ++i)
00317 {
00318 for (j = flag = 0; j < i; j++)
00319 {
00320 if (FacFShell(SetSonfb(i + indb)) == FacFShell(SetSonfb(j + indb)))
00321 {
00322 flag = 1;
00323 }
00324 }
00325 if (flag == 0)
00326 {
00327 res = MSD_lowDetach(b, sn, FacFShell(SetSonfb(i + indb)), -1, 0, 0);
00328 }
00329 }
00330
00331 for (i = 0; i < nfaca; ++i)
00332 {
00333 if (FacFShell(SetSonfa(i + inda)) == FacFShell(SetSonfb(i + indb)))
00334 {
00335 MSD_lowKFMRH(SetSonfa(i + inda), SetSonfb(i + indb));
00336 }
00337 else
00338 {
00339 MSD_lowKSFMR(SetSonfa(i + inda), SetSonfb(i + indb));
00340 }
00341 MSD_lowLoopGlue(SetSonfa(i + inda));
00342 }
00343
00344
00345 for (i = 0; i < contshella; i++)
00346 {
00347 if (SetASheSign(i) != -2)
00348 {
00349 if ((op == USP_UNION) || (op == USP_DIFFERENCE))
00350 {
00351 if (SetASheSign(i) == -1)
00352 {
00353 SetASheSign(i) = -2;
00354 res = MSD_lowDetach(a, sn, SetASheShell(i), -1, 0, 0);
00355 }
00356 }
00357 else
00358 {
00359 if (op == USP_INTERSECT)
00360 {
00361 if (SetASheSign(i) == 1)
00362 {
00363 SetASheSign(i) = -2;
00364 res = MSD_lowDetach(a, sn, SetASheShell(i), -1, 0, 0);
00365 }
00366 }
00367 }
00368 }
00369 }
00370
00371 for (i = 0; i < contshellb; i++)
00372 {
00373 if (SetBSheSign(i) != -2)
00374 {
00375 if (op == USP_UNION)
00376 {
00377 if (SetBSheSign(i) == -1)
00378 {
00379 SetBSheSign(i) = -2;
00380 res = MSD_lowDetach(b, sn, SetBSheShell(i), -1, 0, 0);
00381 }
00382 }
00383 else
00384 {
00385 if ((op == USP_INTERSECT) || (op == USP_DIFFERENCE))
00386 {
00387 if (SetASheSign(i) == 1)
00388 {
00389 SetBSheSign(i) = -2;
00390 res = MSD_lowDetach(b, sn, SetBSheShell(i), -1, 0, 0);
00391 }
00392 }
00393 }
00394 }
00395 }
00396
00397 return(res);
00398 }