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 "mensagem.h"
00044 #include "memvirtu.h"
00045 #include "lowparam.h"
00046 #include "lowmacro.h"
00047 #include "lowsolid.h"
00048 #include "eulerops.h"
00049 #include "shpshape.h"
00050 #include "genfunc_.h"
00051 #include "mancommd.h"
00052
00053 typedef struct eulercod EuCode;
00054
00055 struct eulercod
00056 {
00057 OpCode ecode;
00058 char *eop;
00059 int (*xeop)(EulerOp *op);
00060 void (*peop)(FILE *f, EulerOp *op);
00061 int (*reop)(FILE *f, EulerOp *op);
00062 int (*meop)(EulerOp *op);
00063 int num;
00064 };
00065
00066 extern EuCode ematrix[];
00067
00068 void MSD_execNameLoadSolid(void)
00069 {
00070 char oname[30], fname[30];
00071
00072 while (2 != sscanf(restbuf, "%s %s", oname, fname))
00073 {
00074 printf("LoadSolid: solido arquivo\n");
00075 if (!lineins("? "))
00076 {
00077 return;
00078 }
00079 }
00080 MSD_highNameLoadSolid(oname, fname);
00081 }
00082
00083 int MSD_highNameLoadSolid(char *oname, char *fname)
00084 {
00085 SPTYPE sptr;
00086 Id sn;
00087
00088 if (MSD_getSolidIdFromName(oname) != -1)
00089 {
00090 fprintf(stderr, "LoadSolid: solid %s already exists!\n", oname);
00091 return(ERROR);
00092 }
00093 if ((sn = MSD_highLoadSolid(fname)) != -1)
00094 {
00095 sptr = MSD_getSolid(sn);
00096 strcpy(SolName(sptr), oname);
00097 return(SUCCESS);
00098 }
00099 return(ERROR);
00100 }
00101
00102 #ifdef __Extended_Version
00103 void MSD_execLoadSolid(void)
00104 {
00105 char fname[30];
00106
00107 while (1 != sscanf(restbuf, "%s", fname))
00108 {
00109 printf("LoadSolid: sn arquivo\n");
00110 if (!lineins("? "))
00111 {
00112 return;
00113 }
00114 }
00115 printf("Id = %d\n", MSD_highLoadSolid(fname));
00116 }
00117
00118 #endif
00119
00120 int MSD_highLoadSolid(char *fname)
00121 {
00122 Id sn;
00123
00124 sn = MSD_getMaxSolidId();
00125 return(MSD_lowLoadSolid(sn, fname) ? sn : -1);
00126 }
00127
00128 int MSD_lowLoadSolid(Id sn, char *fname)
00129 {
00130 SPTYPE s;
00131 SPTYPE sret;
00132 EulerOp eop;
00133 PEulerOp StartOp;
00134 EuCode *p;
00135 int cont;
00136 FILE *arq;
00137
00138 if ((arq = fopen(fname, "r")) == (FILE *)NIL)
00139 {
00140 fprintf(stderr, MEN_NaoAbriuArquivo, NAM_LoadSolido, fname);
00141 return(FALSE);
00142 }
00143
00144 while (MSD_lowScanEulerOperator(arq, &eop) == SUCCESS)
00145 {
00146 eop.solidno = sn;
00147
00148 for (p = ematrix; *p->eop; ++p)
00149 {
00150 if (p->ecode == eop.opcode)
00151 {
00152 break;
00153 }
00154 }
00155 if (p->num != 1)
00156 {
00157 cont = p->num;
00158 StartOp = OpHead;
00159 MSD_lowAddEulerOp(SNIL, eop.opcode, eop.ip1, eop.ip2, eop.ip3,
00160 eop.ip4, eop.ip5, eop.ip6,
00161 eop.ip7, eop.ip8, eop.fp1,
00162 eop.fp2, eop.fp3, eop.fp4);
00163 do
00164 {
00165 MSD_lowScanEulerOperator(arq, &eop);
00166 MSD_lowAddEulerOp(SNIL, eop.opcode, eop.ip1, eop.ip2, eop.ip3,
00167 eop.ip4, eop.ip5, eop.ip6,
00168 eop.ip7, eop.ip8, eop.fp1,
00169 eop.fp2, eop.fp3, eop.fp4);
00170 } while (--cont != 1);
00171 if ((sret = MSD_lowApplyEulerOp(&eop, &cont)) != SNIL)
00172 {
00173 s = sret;
00174 }
00175 MSD_lowFreeUndoLog(StartOp);
00176 }
00177 else
00178 if ((sret = MSD_lowApplyEulerOp(&eop, &cont)) != SNIL)
00179 {
00180 s = sret;
00181 }
00182 }
00183 if (s != SNIL)
00184 {
00185 MSD_lowSetNormal(s, TRUE);
00186 MSD_lowSetEdgeAngle(s);
00187 MSD_lowSetInfo(s);
00188 }
00189
00190 fclose(arq);
00191 return(TRUE);
00192 }