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 <stdlib.h>
00044 #endif
00045 #include "mensagem.h"
00046 #include "memvirtu.h"
00047 #include "lowparam.h"
00048 #include "lowmacro.h"
00049 #include "lowsolid.h"
00050 #include "eulerops.h"
00051 #include "mancommd.h"
00052
00053 #ifdef __Extended_Version
00054 void MSD_execMSFKR(void)
00055 {
00056 int sn, ff, fn, dn, op;
00057
00058 while (5 != sscanf(restbuf, "%d %d %d %d %d", &sn, &op, &ff, &fn, &dn))
00059 {
00060 printf("msfkr: Sid ff fn dn\n");
00061 if (!lineins("? "))
00062 {
00063 return;
00064 }
00065 }
00066 MSD_highMSFKR(sn, ff, fn, dn);
00067 }
00068
00069 #endif
00070
00071 int MSD_highMSFKR(Id sn, Id ff, Id fn, Id dn)
00072 {
00073 SPTYPE s;
00074 FPTYPE f;
00075 LPTYPE ring;
00076
00077 if ((s = MSD_getSolid(sn)) == SNIL)
00078 {
00079 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_MSFKR, sn);
00080 return(ERROR);
00081 }
00082 if ((f = MSD_getFace(s, ff)) == FNIL)
00083 {
00084 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MSFKR, ff, sn);
00085 return(ERROR);
00086 }
00087 for (ring = FacFLoops(f); ring == FacFLOut(f); ring = LooNextL(ring))
00088 {
00089 ;
00090 }
00091 MSD_lowMSFKR(ring, fn, dn);
00092 return(SUCCESS);
00093 }
00094
00095 #ifdef __Extended_Version
00096 void MSD_execMSFKR2(void)
00097 {
00098 int sn, ff, fn, dn, v1, v2, op;
00099
00100 while (7 != sscanf(restbuf, "%d %d %d %d %d %d %d", &sn, &op, &ff, &fn,
00101 &dn, &v1, &v2))
00102 {
00103 printf("msfkr2: Sid ff fn dn v1 v2\n");
00104 if (!lineins("? "))
00105 {
00106 return;
00107 }
00108 }
00109 MSD_highMSFKR2(sn, ff, fn, dn, v1, v2);
00110 }
00111
00112 #endif
00113
00114 int MSD_highMSFKR2(Id sn, Id ff, Id fn, Id dn, Id v1, Id v2)
00115 {
00116 SPTYPE s;
00117 FPTYPE f;
00118 LPTYPE ring;
00119 HPTYPE he1;
00120
00121 if ((s = MSD_getSolid(sn)) == SNIL)
00122 {
00123 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_MSFKR2, sn);
00124 return(ERROR);
00125 }
00126 if ((f = MSD_getFace(s, ff)) == FNIL)
00127 {
00128 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MSFKR2, ff, sn);
00129 return(ERROR);
00130 }
00131 if ((ring = MSD_getEdge(f, v1, v2, &he1)) == LNIL)
00132 {
00133 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_MSFKR2, v1, v2, sn);
00134 return(ERROR);
00135 }
00136 MSD_lowMSFKR(ring, fn, dn);
00137 return(SUCCESS);
00138 }
00139
00140 FPTYPE MSD_lowMSFKR(LPTYPE l, Id fn, Id dn)
00141 {
00142 SPTYPE s;
00143 DPTYPE newshell;
00144 DPTYPE d;
00145 FPTYPE ff;
00146 FPTYPE fa;
00147 FPTYPE newface;
00148 Id f1, v1, v2;
00149
00150 assert1(LooNextL(FacFLoops(LooLFace(l))) != LNIL);
00151
00152 ff = LooLFace(l);
00153 d = FacFShell(ff);
00154 s = SheSSolids(d);
00155 if (Gdoinversion)
00156 {
00157 MSD_lowAddEulerOp(s, KSFMR, FacFaceNo(ff), fn, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00158 }
00159
00160
00161
00162
00163 if (Gdodirect)
00164 {
00165 f1 = FacFaceNo(ff);
00166 v1 = VerVertexNo(HalVtx(LooLEdg(l)));
00167 v2 = VerVertexNo(HalVtx(HalNxt(LooLEdg(l))));
00168 MSD_lowAddEulerOpRedo(s, MSFKR, f1, fn, dn, v1, v2, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00169 }
00170
00171 newshell = (DPTYPE)MSD_lowNewElement(SHELL, (NPTYPE)s);
00172 newface = (FPTYPE)MSD_lowNewElement(FACE, (NPTYPE)d);
00173 SheShellNo(newshell) = dn;
00174 FacFaceNo(newface) = fn;
00175 MSD_lowDelList(LOOP, (NPTYPE)l, (NPTYPE)ff);
00176 MSD_lowAddList(LOOP, (NPTYPE)l, (NPTYPE)newface);
00177 FacFLOut(newface) = l;
00178 if (FacFLOut(ff) == l)
00179 {
00180 FacFLOut(ff) = FacFLoops(ff);
00181 }
00182
00183 markface(newface, newshell);
00184 ff = SheSFaces(d);
00185 while (ff != FNIL)
00186 {
00187 if (FacFShell(ff) == newshell)
00188 {
00189 fa = FacNextF(ff);
00190 MSD_lowDelList(FACE, (NPTYPE)ff, (NPTYPE)d);
00191 MSD_lowAddList(FACE, (NPTYPE)ff, (NPTYPE)newshell);
00192 ff = fa;
00193 }
00194 else
00195 {
00196 ff = FacNextF(ff);
00197 }
00198 }
00199 redo(newshell, d);
00200
00201 MSD_addEulCoef(s, 1, 1, -1, 0, 0, 0);
00202
00203 if (SetTrace)
00204 {
00205 if (TraceSolid(s))
00206 {
00207 #ifdef TRACE_BOOLEAN4
00208 fprintf(trace, "*** SOLID B\n");
00209 MSD_lowListSolid(trace, s, 1);
00210 #endif
00211 fprintf(stderr, MEN_MSDAbortou, NAM_MSFKR);
00212 exit(1);
00213 }
00214 }
00215 return(newface);
00216 }
00217
00218 int MSD_execStructMSFKR(EulerOp *op)
00219 {
00220 Id sid, id1, id2, id3, id4, id5;
00221
00222 sid = op->solidno;
00223 id1 = op->ip1;
00224 id2 = op->ip2;
00225 id3 = op->ip3;
00226 id4 = op->ip4;
00227 id5 = op->ip5;
00228 MSD_highMSFKR2(sid, id1, id2, id3, id4, id5);
00229 return(SUCCESS);
00230 }
00231
00232 void MSD_printStructMSFKR(FILE *f, EulerOp *op)
00233 {
00234 Id sid, id1, id2, id3, id4, id5;
00235 int command;
00236
00237 sid = op->solidno;
00238 id1 = op->ip1;
00239 id2 = op->ip2;
00240 id3 = op->ip3;
00241 id4 = op->ip4;
00242 id5 = op->ip5;
00243 command = op->CommandCount;
00244 fprintf(f, "msfkr %d %d %d %d %d %d %d\n", sid, command, id1, id2, id3, id4, id5);
00245 }
00246
00247 int MSD_readStructMSFKR(FILE *f, EulerOp *op)
00248 {
00249 int solidno, ip1, ip2, ip3, ip4, ip5, com;
00250
00251 if (fscanf(f, "%d %d %d %d %d %d %d\n", &solidno, &com, &ip1, &ip2, &ip3,
00252 &ip4, &ip5) != 7)
00253 {
00254 return(ERROR);
00255 }
00256 op->solidno = solidno;
00257 op->CommandCount = com;
00258 op->ip1 = ip1;
00259 op->ip2 = ip2;
00260 op->ip3 = ip3;
00261 op->ip4 = ip4;
00262 op->ip5 = ip5;
00263 op->ip6 = 0;
00264 op->fp1 = 0.0;
00265 op->fp2 = 0.0;
00266 op->fp3 = 0.0;
00267 op->fp4 = 0.0;
00268 return(SUCCESS);
00269 }
00270
00271 int MSD_modifyStructMSFKR(EulerOp *op)
00272 {
00273 int solidno;
00274
00275 solidno = MSD_lowCheckTranslatorTable(op->solidno, SOLID);
00276 op->solidno = solidno;
00277 return(SUCCESS);
00278 }
00279
00280 void markface(FPTYPE f, DPTYPE d)
00281 {
00282 FPTYPE f2;
00283 LPTYPE l;
00284 HPTYPE he;
00285
00286
00287 FacFShell(f) = d;
00288 for (AllLoopsFace(f, l))
00289 {
00290 he = LooLEdg(l);
00291 do
00292 {
00293 f2 = LooLFace(HalWLoop(mate(he)));
00294 if (FacFShell(f2) != d)
00295 {
00296 markface(f2, d);
00297 }
00298 } while ((he = HalNxt(he)) != LooLEdg(l));
00299 }
00300 }
00301
00302 void redo(DPTYPE shell, DPTYPE oldshell)
00303 {
00304 FPTYPE f;
00305 LPTYPE l;
00306 HPTYPE h;
00307
00308 for (AllFacesShell(shell, f))
00309 {
00310 for (AllLoopsFace(f, l))
00311 {
00312 h = LooLEdg(l);
00313 do
00314 {
00315 if (HalEdg(h) != ENIL)
00316 {
00317 if (h == EdgHe1(HalEdg(h)))
00318 {
00319 MSD_lowDelList(EDGE, (NPTYPE)HalEdg(h), (NPTYPE)oldshell);
00320 MSD_lowAddList(EDGE, (NPTYPE)HalEdg(h), (NPTYPE)shell);
00321 }
00322 if (h == VerVEdge(HalVtx(h)))
00323 {
00324 MSD_lowDelList(VERTEX, (NPTYPE)HalVtx(h), (NPTYPE)oldshell);
00325 MSD_lowAddList(VERTEX, (NPTYPE)HalVtx(h), (NPTYPE)shell);
00326 }
00327 }
00328 else
00329 if (h == VerVEdge(HalVtx(h)))
00330 {
00331 MSD_lowDelList(VERTEX, (NPTYPE)HalVtx(h), (NPTYPE)oldshell);
00332 MSD_lowAddList(VERTEX, (NPTYPE)HalVtx(h), (NPTYPE)shell);
00333 }
00334 } while ((h = HalNxt(h)) != LooLEdg(l));
00335 }
00336 }
00337 }
00338
00339 int sfindv(DPTYPE d, VPTYPE v)
00340 {
00341 VPTYPE vtx;
00342
00343 for (AllVerticesShell(d, vtx))
00344 {
00345 if (vtx == v)
00346 {
00347 return(TRUE);
00348 }
00349 }
00350 return(FALSE);
00351 }
00352
00353 int sfinde(DPTYPE d, EPTYPE e)
00354 {
00355 EPTYPE edg;
00356
00357 for (AllEdgesShell(d, edg))
00358 {
00359 if (edg == e)
00360 {
00361 return(TRUE);
00362 }
00363 }
00364 return(FALSE);
00365 }