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_execDetach(void)
00055 {
00056 int sn, sn1, dn, newd, addf, addv, op;
00057
00058 while (sscanf(restbuf, "%d %d %d %d %d %d %d", &sn, &op, &sn1, &dn, &newd,
00059 &addf, &addv) != 7)
00060 {
00061 printf("detach: Sid sn1 dn newd addf addv\n");
00062 if (!lineins("? "))
00063 {
00064 return;
00065 }
00066 }
00067 MSD_highDetach(sn, sn1, dn, newd, addf, addv);
00068 }
00069
00070 #endif
00071
00072 int MSD_highDetach(Id sn, Id sn1, Id dn, Id newd, int addf, int addv)
00073 {
00074 SPTYPE s;
00075 DPTYPE d;
00076
00077 if ((s = MSD_getSolid(sn)) == SNIL)
00078 {
00079 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_Detach, sn);
00080 return(ERROR);
00081 }
00082 if ((d = MSD_getShell(s, dn)) == DNIL)
00083 {
00084 fprintf(stderr, MEN_NaoEncontrouShell, NAM_Detach, dn, sn);
00085 return(ERROR);
00086 }
00087 return(MSD_lowDetach(s, sn1, d, newd, addf, addv) != SNIL);
00088 }
00089
00090 SPTYPE MSD_lowDetach(SPTYPE s, Id sn1, DPTYPE d, Id newd, int addf, int addv)
00091 {
00092 SPTYPE s1;
00093
00094 if ((s1 = MSD_getSolid(sn1)) == SNIL)
00095 {
00096 s1 = (SPTYPE)MSD_lowNewElement(SOLID, NNIL);
00097 SolSolidNo(s1) = sn1;
00098 }
00099 if (SheSSolids(d) == s1)
00100 {
00101 return(s1);
00102 }
00103 MSD_lowShellDetach(s, s1, d, newd, addf, addv);
00104 return(s1);
00105 }
00106
00107 void MSD_lowShellDetach(SPTYPE s, SPTYPE s1, DPTYPE d, Id newd, int addf, int addv)
00108 {
00109 FPTYPE f;
00110 LPTYPE l;
00111 EPTYPE e;
00112 VPTYPE v;
00113 Id sn, dn, dd;
00114 int facn, rngn, edgn, vtxn, holn;
00115
00116 if (Gdoinversion)
00117 {
00118 sn = SolSolidNo(s);
00119 dn = SheShellNo(d);
00120 dd = newd == -1 ? SheShellNo(d) : newd;
00121 MSD_lowAddEulerOp(s1, DETACH, sn, dd, dn, -addf, -addv, 0, 0, 0,
00122 0.0, 0.0, 0.0, 0.0);
00123 }
00124
00125 if (Gdodirect)
00126 {
00127 sn = SolSolidNo(s1);
00128 dn = SheShellNo(d);
00129 MSD_lowAddEulerOpRedo(s, DETACH, sn, dn, newd, addf, addv, 0, 0, 0,
00130 0.0, 0.0, 0.0, 0.0);
00131 }
00132
00133 MSD_lowDelList(SHELL, (NPTYPE)d, (NPTYPE)s);
00134 MSD_lowAddList(SHELL, (NPTYPE)d, (NPTYPE)s1);
00135 if (newd != -1)
00136 {
00137 SheShellNo(d) = newd;
00138 }
00139 for (AllFacesShell(d, f))
00140 {
00141 FacFaceNo(f) += addf;
00142 }
00143 for (AllVerticesShell(d, v))
00144 {
00145 VerVertexNo(v) += addv;
00146 }
00147
00148 if (SolSShells(s) == DNIL)
00149 {
00150 MSD_addEulCoef(s1, 1, SolEuCoef(s).facen, SolEuCoef(s).ringn,
00151 SolEuCoef(s).edgen, SolEuCoef(s).vertexn,
00152 SolEuCoef(s).holen);
00153 MSD_lowDelElement(SOLID, (NPTYPE)s, NNIL);
00154
00155 if (SetTrace)
00156 {
00157 if (TraceSolid(s1))
00158 {
00159 fprintf(stderr, MEN_MSDAbortou, NAM_Detach);
00160 exit(1);
00161 }
00162 }
00163 }
00164 else
00165 {
00166 facn = rngn = edgn = vtxn = 0;
00167 for (AllFacesShell(d, f))
00168 {
00169 for (AllLoopsFace(f, l))
00170 {
00171 rngn++;
00172 }
00173 facn++;
00174 }
00175 rngn -= facn;
00176 for (AllEdgesShell(d, e))
00177 {
00178 edgn++;
00179 }
00180 for (AllVerticesShell(d, v))
00181 {
00182 vtxn++;
00183 }
00184 holn = facn + vtxn + 2 * (rngn - 1 - edgn);
00185 MSD_addEulCoef(s1, 1, facn, rngn, edgn, vtxn, holn);
00186 MSD_addEulCoef(s, -1, -facn, -rngn, -edgn, -vtxn, -holn);
00187
00188 if (SetTrace)
00189 {
00190 if (TraceSolid(s1))
00191 {
00192 fprintf(stderr, MEN_MSDAbortou, NAM_Detach);
00193 exit(1);
00194 }
00195 if (TraceSolid(s))
00196 {
00197 fprintf(stderr, MEN_MSDAbortou, NAM_Detach);
00198 exit(1);
00199 }
00200 }
00201 }
00202 }
00203
00204 int MSD_execStructDetach(EulerOp *op)
00205 {
00206 Id sid, ip1, ip2, ip3, ip4, ip5;
00207
00208 sid = op->solidno;
00209 ip1 = op->ip1;
00210 ip2 = op->ip2;
00211 ip3 = op->ip3;
00212 ip4 = op->ip4;
00213 ip5 = op->ip5;
00214 return(MSD_highDetach(sid, ip1, ip2, ip3, ip4, ip5));
00215 }
00216
00217 void MSD_printStructDetach(FILE *f, EulerOp *op)
00218 {
00219 Id sid, ip1, ip2, ip3, ip4, ip5;
00220 int com;
00221
00222 sid = op->solidno;
00223 ip1 = op->ip1;
00224 ip2 = op->ip2;
00225 ip3 = op->ip3;
00226 ip4 = op->ip4;
00227 ip5 = op->ip5;
00228 com = op->CommandCount;
00229 fprintf(f, "detach %d %d %d %d %d %d %d\n", sid, com, ip1, ip2, ip3, ip4, ip5);
00230 }
00231
00232 int MSD_readStructDetach(FILE *f, EulerOp *op)
00233 {
00234 int solidno, ip1, ip2, ip3, ip4, ip5, com;
00235
00236 if (fscanf(f, "%d %d %d %d %d %d %d\n", &solidno, &com, &ip1, &ip2, &ip3,
00237 &ip4, &ip5) != 7)
00238 {
00239 return(ERROR);
00240 }
00241 op->solidno = solidno;
00242 op->CommandCount = com;
00243 op->ip1 = ip1;
00244 op->ip2 = ip2;
00245 op->ip3 = ip3;
00246 op->ip4 = ip4;
00247 op->ip5 = ip5;
00248 op->ip6 = 0;
00249 op->ip7 = 0;
00250 op->ip8 = 0;
00251 op->fp1 = 0.0;
00252 op->fp2 = 0.0;
00253 op->fp3 = 0.0;
00254 op->fp4 = 0.0;
00255 return(SUCCESS);
00256 }
00257
00258 int MSD_modifyStructDetach(EulerOp *op)
00259 {
00260 int solidno1, solidno2;
00261
00262 solidno1 = MSD_lowCheckTranslatorTable(op->solidno, SOLID);
00263 solidno2 = MSD_lowCheckTranslatorTable(op->ip1, SOLID);
00264 op->solidno = solidno1;
00265 op->ip1 = solidno2;
00266 return(SUCCESS);
00267 }