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 <string.h>
00043 #include <math.h>
00044 #include "mensagem.h"
00045 #include "memvirtu.h"
00046 #include "lowparam.h"
00047 #include "lowmacro.h"
00048 #include "lowsolid.h"
00049 #include "mancommd.h"
00050 #include "shpshape.h"
00051 #include "vectorop.h"
00052 #include "genfunc_.h"
00053 #include "disdispl.h"
00054 #include "splsplit.h"
00055 #include "eulerops.h"
00056
00057 extern int NumRecordsVM[10];
00058 extern char *ArqVirtualMemory[];
00059
00060 void MSD_execNameSplit(void)
00061 {
00062 char name1[15], name2[15], name3[15];
00063 float vx, vy, vz, vd;
00064
00065 while (7 != sscanf(restbuf, "%s %s %s %f %f %f %f", name3, name1, name2, &vx, &vy, &vz, &vd))
00066 {
00067 printf("split: Name New1 New2 pa pb pc pd\n");
00068 if (!lineins("? "))
00069 {
00070 return;
00071 }
00072 }
00073 MSD_highNameSplit(name3, name1, name2, vx, vy, vz, vd);
00074 }
00075
00076 void MSD_highNameSplit(char *nameo, char *name1, char *name2, real a, real b, real c, real d)
00077 {
00078 Id sn, s1;
00079
00080 if ((sn = MSD_getSolidIdFromName(nameo)) == -1)
00081 {
00082 fprintf(stderr, MEN_NaoEncontrouSolidNome, NAM_SplitSolid, nameo);
00083 return;
00084 }
00085 if (MSD_getSolidIdFromName(name1) != -1)
00086 {
00087 fprintf(stderr, MEN_SolidoJaExiste, NAM_SplitSolid, name1);
00088 return;
00089 }
00090 if (MSD_getSolidIdFromName(name2) != -1)
00091 {
00092 fprintf(stderr, MEN_SolidoJaExiste, NAM_SplitSolid, name2);
00093 return;
00094 }
00095 if ((s1 = MSD_highSplit(sn, a, b, c, d)) != -1)
00096 {
00097 if (MSD_getSolid(s1) != SNIL)
00098 {
00099 MSD_highName(s1, name1, SOLID);
00100 }
00101 if (MSD_getSolid(s1 + 1) != SNIL)
00102 {
00103 MSD_highName(s1 + 1, name1, SOLID);
00104 }
00105 }
00106 }
00107
00108 #ifdef __Extended_Version
00109 void MSD_execSplit(void)
00110 {
00111 int sn;
00112 float vx, vy, vz, vd;
00113
00114 while (5 != sscanf(restbuf, "%d %f %f %f %f", &sn, &vx, &vy, &vz, &vd))
00115 {
00116 printf("split: Sid pa pb pc pd\n");
00117 if (!lineins("? "))
00118 {
00119 return;
00120 }
00121 }
00122 sn = MSD_highSplit(sn, vx, vy, vz, vd);
00123 printf("Id = %d & Id = %d\n", sn, sn + 1);
00124 }
00125
00126 #endif
00127
00128 Id MSD_highSplit(Id sn, real a, real b, real c, real d)
00129 {
00130 SPTYPE optr;
00131 SPTYPE Above;
00132 SPTYPE Below;
00133 vector vec;
00134 Id snm;
00135
00136
00137 if ((optr = MSD_getSolid(sn)) == SNIL)
00138 {
00139 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_SplitSolid, sn);
00140 return(-1);
00141 }
00142 snm = MSD_getMaxSolidId();
00143 makevec(vec, a, b, c, d);
00144 if (MSD_lowSplit(optr, vec, snm, snm + 1, &Above, &Below) == SUCCESS)
00145 {
00146 if (Above != SNIL)
00147 {
00148 MSD_lowDisplayMonitor('o', Above, GNIL);
00149 }
00150 if (Below != SNIL)
00151 {
00152 MSD_lowDisplayMonitor('o', Below, GNIL);
00153 }
00154 return(snm);
00155 }
00156 return(-1);
00157 }
00158
00159
00160 int MSD_lowSplit(SPTYPE s, vector SP, Id sn1, Id sn2, SPTYPE *Above, SPTYPE *Below)
00161 {
00162 DPTYPE d;
00163 FPTYPE f;
00164
00165 #ifdef TRACE_SPLIT
00166 if ((trace = fopen("SPLIT.TXT", "w")) == (FILE *)NIL)
00167 {
00168 fprintf(stderr, MEN_NaoAbriuArquivo, NAM_SplitSolid, "SPLIT.TXT");
00169 return(0);
00170 }
00171 #endif
00172
00173 #ifdef __VIRTUAL_MEM
00174 MSD_lowSplitInitiate();
00175 #endif
00176
00177 CommandCount++;
00178 SP[3] = SP[3] / sqrt(dot(SP, SP));
00179 normalize(SP);
00180 *Above = *Below = SNIL;
00181 maxv = MSD_getMaxVertexId(s);
00182 maxf = MSD_getMaxFaceId(s);
00183 spl_contshell = 0;
00184 for (AllShellsSolid(s, d))
00185 {
00186 for (AllFacesShell(d, f))
00187 {
00188 MSD_lowFaceEq(FacFLOut(f), FacFeq(f));
00189 }
00190 SplShellShell(spl_contshell) = d;
00191 SplShellSign(spl_contshell) =
00192 comp(MSD_lowDistancePlanePoint(SP, SheSVerts(d)), 0.0, EPS);
00193 spl_contshell++;
00194 }
00195
00196 MSD_lowSplitGenerate(s, SP);
00197 #ifdef TRACE_SPLIT1
00198 fprintf(trace, "*** SOLID A\n");
00199 MSD_lowListSolid(trace, s, 101);
00200 #endif
00201
00202 MSD_lowSplitClassify(SP);
00203 #ifdef TRACE_SPLIT2
00204 fprintf(trace, "*** SOLID A\n");
00205 MSD_lowListSolid(trace, s, 101);
00206 #endif
00207
00208 if (spl_nedge != 0)
00209 {
00210 MSD_lowSplitConnect();
00211 #ifdef TRACE_SPLIT3
00212 fprintf(trace, "*** SOLID A\n");
00213 MSD_lowListSolid(trace, s, 101);
00214 #endif
00215 }
00216
00217 MSD_lowSplitFinish(s, sn1, sn2, Above, Below);
00218 #ifdef TRACE_SPLIT
00219 fprintf(trace, "*** SOLID A\n");
00220 MSD_lowListSolid(trace, *Above, 101);
00221 MSD_lowListSolid(trace, *Below, 101);
00222 fclose(trace);
00223 #endif
00224
00225 if (*Above != SNIL)
00226 {
00227 MSD_lowSetNormal(*Above, TRUE);
00228 MSD_lowSetEdgeAngle(*Above);
00229 MSD_lowSetInfo(*Above);
00230 }
00231 if (*Below != SNIL)
00232 {
00233 MSD_lowSetNormal(*Below, TRUE);
00234 MSD_lowSetEdgeAngle(*Below);
00235 MSD_lowSetInfo(*Below);
00236 }
00237
00238 #ifdef __VIRTUAL_MEM
00239 MSD_lowSplitTerminate();
00240 #endif
00241 return(SUCCESS);
00242 }
00243
00244 #ifdef __VIRTUAL_MEM
00245 void MSD_lowSplitInitiate(void)
00246 {
00247
00248
00249
00250 close_v_array(VirtualMemoryBlock[GROUP]);
00251 close_v_array(VirtualMemoryBlock[AXIS]);
00252
00253 init_v_array("SPLIT01.TMP", sizeof(SF), ' ');
00254 init_v_array("SPLIT02.TMP", sizeof(VPTYPE), ' ');
00255 init_v_array("SPLIT03.TMP", sizeof(spl_NBR), ' ');
00256 if ((SPL01VirtualArray = (VACB *)open_v_array("SPLIT01.TMP", 10)) == (VACB *)NIL)
00257 {
00258 fprintf(stderr, "split: nao conseguiu abrir arquivos de memoria virtual!\n");
00259 return;
00260 }
00261 if ((SPL02VirtualArray = (VACB *)open_v_array("SPLIT02.TMP", 10)) == (VACB *)NIL)
00262 {
00263 fprintf(stderr, "split: nao conseguiu abrir arquivos de memoria virtual!\n");
00264 return;
00265 }
00266 if ((SPL03VirtualArray = (VACB *)open_v_array("SPLIT03.TMP", 10)) == (VACB *)NIL)
00267 {
00268 fprintf(stderr, "split: nao conseguiu abrir arquivos de memoria virtual!\n");
00269 return;
00270 }
00271 }
00272
00273 void MSD_lowSplitTerminate(void)
00274 {
00275 close_v_array(SPL01VirtualArray);
00276 close_v_array(SPL02VirtualArray);
00277 close_v_array(SPL03VirtualArray);
00278 remove("SPLIT01.TMP");
00279 remove("SPLIT02.TMP");
00280 remove("SPLIT03.TMP");
00281
00282 VirtualMemoryBlock[GROUP] = (VACB *)open_v_array(ArqVirtualMemory[GROUP],
00283 NumRecordsVM[GROUP]);
00284 VirtualMemoryBlock[AXIS] = (VACB *)open_v_array(ArqVirtualMemory[AXIS],
00285 NumRecordsVM[AXIS]);
00286 }
00287
00288 #endif