mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
Integration of OCCT 6.5.0 from SVN
This commit is contained in:
253
src/IGESFile/analiges.c
Executable file
253
src/IGESFile/analiges.c
Executable file
@@ -0,0 +1,253 @@
|
||||
#include <stdlib.h>
|
||||
#include "igesread.h"
|
||||
|
||||
void iges_newparam(int typarg,int longval, char *parval);
|
||||
void iges_newpart(int numsec);
|
||||
void iges_curpart(int numsec,int dnum);
|
||||
void iges_addparam(int longval, char* parval);
|
||||
|
||||
#define ArgVide 0
|
||||
#define ArgQuid 1
|
||||
#define ArgChar 2
|
||||
#define ArgInt 3 /* Entier non signe : peut evoluer vers Real ou Char */
|
||||
#define ArgSign 4 /* Entier signe : peut evoluer vers Real */
|
||||
#define ArgReal 5
|
||||
#define ArgExp 6 /* Real + lettre E : attendre confirmation */
|
||||
#define ArgRexp 7 /* Real + Exposant : se ramene a Real */
|
||||
#define ArgMexp 8 /* Real + Exposant INCOMPLET (pas de point decimal) */
|
||||
|
||||
/* les structures de travail de structiges sont connues :
|
||||
a savoir declarations + curp */
|
||||
/* #define VERIFPRINT */
|
||||
|
||||
/* Lecture section D
|
||||
Chaque entite tient sur deux lignes
|
||||
|
||||
Dstat demarre a zero "on lit une nouvelle entite"
|
||||
et bascule avec un "deuxieme ligne de l'entite"
|
||||
*/
|
||||
|
||||
|
||||
static int bases[] =
|
||||
{ 1,10,100,1000,10000,100000,1000000, 10000000,100000000,1000000000 };
|
||||
|
||||
/* DECODAGE : parce que scanf ne fait pas vraiment ce qu'il faut */
|
||||
/* Utilitaire decodant un nombre en format fixe dans une ligne
|
||||
Il part de "depuis" inclus (debut ligne = 0) et prend "tant" caracteres
|
||||
Valeur lue en retour de fonction */
|
||||
static int IGES_decode(ligne,depuis,tant)
|
||||
char* ligne; int depuis, tant;
|
||||
{
|
||||
int val = 0; int i;
|
||||
int depart = depuis+tant-1;
|
||||
for (i = 0; i < tant; i ++) {
|
||||
char uncar = ligne[depart-i];
|
||||
if (uncar == ' ') break;
|
||||
else if (uncar == '+') continue;
|
||||
else if (uncar == '-') val = -val;
|
||||
else if (uncar != '0') val += (uncar - 48)*bases[i];
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Recopie d'une chaine de caracteres de longueur fixe (close par \0) */
|
||||
void IGES_copstr(ligne,depuis,tant,dans)
|
||||
char *ligne; int depuis, tant; char* dans;
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < tant; i ++) { dans[i] = ligne[depuis+i]; }
|
||||
dans[tant] = '\0';
|
||||
}
|
||||
|
||||
/* Analyse section D */
|
||||
void iges_Dsect (Dstat,numsec,ligne)
|
||||
int *Dstat,numsec; char* ligne;
|
||||
{
|
||||
struct dirpart *curp;
|
||||
if (*Dstat == 0) {
|
||||
iges_newpart(numsec);
|
||||
curp = iges_get_curp();
|
||||
curp->typ = IGES_decode(ligne, 0,8);
|
||||
curp->poi = IGES_decode(ligne, 8,8);
|
||||
curp->pdef = IGES_decode(ligne,16,8);
|
||||
curp->tra = IGES_decode(ligne,24,8);
|
||||
curp->niv = IGES_decode(ligne,32,8);
|
||||
curp->vue = IGES_decode(ligne,40,8);
|
||||
curp->trf = IGES_decode(ligne,48,8);
|
||||
curp->aff = IGES_decode(ligne,56,8);
|
||||
curp->blk = IGES_decode(ligne,64,2);
|
||||
curp->sub = IGES_decode(ligne,66,2);
|
||||
curp->use = IGES_decode(ligne,68,2);
|
||||
curp->her = IGES_decode(ligne,70,2);
|
||||
#ifdef VERIFPRINT
|
||||
printf("Entite %d : type %d ->P %d\n",numsec,typ,poi);
|
||||
#endif
|
||||
*Dstat = 1;
|
||||
} else if (*Dstat == 1) {
|
||||
curp = iges_get_curp();
|
||||
curp->typ2 = IGES_decode(ligne, 0,8);
|
||||
curp->epa = IGES_decode(ligne, 8,8);
|
||||
curp->col = IGES_decode(ligne,16,8);
|
||||
curp->nbl = IGES_decode(ligne,24,8);
|
||||
curp->form = IGES_decode(ligne,32,8);
|
||||
IGES_copstr (ligne,40,8,curp->res1);
|
||||
IGES_copstr (ligne,48,8,curp->res2);
|
||||
IGES_copstr (ligne,56,8,curp->nom);
|
||||
IGES_copstr (ligne,64,8,curp->num);
|
||||
#ifdef VERIFPRINT
|
||||
printf("Entite %d : type %d (redite) form %d\n",numsec,typ2,form);
|
||||
#endif
|
||||
*Dstat = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Lecture section P : preanalyse
|
||||
Extraction du numero D et troncature a 64 caracteres */
|
||||
|
||||
void iges_Psect(Pstat,numsec,ligne)
|
||||
int *Pstat; int numsec; char ligne[80];
|
||||
{
|
||||
int dnum;
|
||||
dnum = atoi(&ligne[65]);
|
||||
ligne[64] = '\0';
|
||||
iges_curpart(numsec,dnum);
|
||||
#ifdef VERIFPRINT
|
||||
printf("Entite P:%d ->D:%d,soit %s\n",numsec,dnum,ligne);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Depiautage ligne section P (ou G)
|
||||
Fractionnement en parametres
|
||||
Separes par Separateur courant (c_separ), de fin (c_fin), plus
|
||||
traitement des caracteres sous forme Hollerith ... (nnnH...)
|
||||
|
||||
Pstat entree : 0 debut entite, 1 debut ligne, 2 courant, 3 pas fini(H)
|
||||
Pstat retour : 0 fin entite, 1 fin ligne, 2 courant (en voila un), 3
|
||||
pas fini (un nnnH... pas termine)
|
||||
*/
|
||||
|
||||
static int nbcarH = 0; static int numcar = 0; static int reste = 0;
|
||||
/* reste : 0 cas normal; 1 completer parametre; -1 le sauter */
|
||||
static int typarg;
|
||||
/* + definitions des types de parametres en tete */
|
||||
|
||||
|
||||
void iges_param(Pstat,ligne,c_separ,c_fin,lonlin)
|
||||
int *Pstat; char c_separ,c_fin, *ligne; int lonlin;
|
||||
{
|
||||
int i,i0,j; char param[80]; char unpar;
|
||||
if (*Pstat == 0) reste = 0;
|
||||
if (*Pstat != 2) numcar = 0;
|
||||
if (*Pstat < 3) nbcarH = 0;
|
||||
else {
|
||||
numcar = nbcarH;
|
||||
if (numcar > lonlin) {
|
||||
iges_addparam(lonlin,ligne);
|
||||
nbcarH -= lonlin; /* ??? enregistrer ... ??? */
|
||||
return;
|
||||
} else {
|
||||
iges_addparam(nbcarH,ligne);
|
||||
nbcarH = 0;
|
||||
}
|
||||
}
|
||||
i0 = 0; /* debut param utile (apres blancs eventuels), par defaut a 0 */
|
||||
typarg = ArgVide;
|
||||
for (i = 0; (unpar = ligne[numcar+i]) != '\0'; i ++) {
|
||||
if (unpar == c_separ) {
|
||||
*Pstat = 2; param[i] = '\0';
|
||||
#ifdef VERIFPRINT
|
||||
printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]);
|
||||
#endif
|
||||
if (reste == 0) iges_newparam(typarg,i-i0+1,¶m[i0]);
|
||||
else if (reste > 0) iges_addparam(i-i0+1,¶m[i0]);
|
||||
reste = 0;
|
||||
for (j = i+1; (unpar = ligne[numcar+j]) != '\0'; j++) {
|
||||
if (unpar != ' ') { numcar += i+1; return; }
|
||||
}
|
||||
*Pstat = 1; return;
|
||||
}
|
||||
if (unpar == c_fin) {
|
||||
*Pstat = 1; param[i] = '\0';
|
||||
#ifdef VERIFPRINT
|
||||
printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]);
|
||||
#endif
|
||||
if (reste == 0) iges_newparam(typarg,i-i0+1,¶m[i0]);
|
||||
else if (reste > 0) iges_addparam(i-i0+1,¶m[i0]);
|
||||
reste = 0;
|
||||
return;
|
||||
}
|
||||
param[i] = unpar;
|
||||
|
||||
/* Type du parametre ? */
|
||||
|
||||
if (unpar > 47 && unpar < 58) {
|
||||
if (typarg == ArgInt) continue;
|
||||
if (typarg == ArgVide) typarg = ArgInt;
|
||||
else if (typarg == ArgExp) typarg = ArgRexp;
|
||||
}
|
||||
|
||||
else if (unpar == '+' || unpar == '-') {
|
||||
if (typarg == ArgVide) typarg = ArgSign;
|
||||
else if (typarg != ArgExp && typarg != ArgMexp) typarg = ArgQuid;
|
||||
}
|
||||
|
||||
else if (unpar == '.') {
|
||||
if (typarg == ArgVide) typarg = ArgReal;
|
||||
else if (typarg == ArgInt || typarg == ArgSign) typarg = ArgReal;
|
||||
else typarg = ArgQuid;
|
||||
}
|
||||
|
||||
else if (unpar == 'E' || unpar == 'e' || unpar == 'D' || unpar == 'd') {
|
||||
if (typarg == ArgReal) typarg = ArgExp;
|
||||
else if (typarg == ArgInt || typarg == ArgSign) typarg = ArgMexp;
|
||||
else typarg = ArgQuid;
|
||||
}
|
||||
|
||||
else if (unpar == 'H') { /* format Hollerith ? */
|
||||
if (typarg != ArgInt) { typarg = ArgQuid; continue; }
|
||||
typarg = ArgChar;
|
||||
nbcarH = 0;
|
||||
for (j = i0; j < i; j++) {
|
||||
if (param[j] > 47 && param[j] < 58) nbcarH = nbcarH*10 + (param[j]-48);
|
||||
else { nbcarH = 0; break; }
|
||||
}
|
||||
if (numcar+i+nbcarH >= lonlin) { /* texte a cheval sur +ieurs lignes */
|
||||
for (j = 1; j < lonlin-numcar-i; j++) param[i+j] = ligne[numcar+i+j];
|
||||
param[lonlin-numcar] = '\0';
|
||||
nbcarH = (numcar+i +nbcarH+1 -lonlin);
|
||||
*Pstat =3;
|
||||
#ifdef VERIFPRINT
|
||||
printf("numcar = %d param: %s ",numcar,param);
|
||||
#endif
|
||||
iges_newparam(typarg,lonlin-i0,¶m[i0]);
|
||||
reste = 1;
|
||||
return;
|
||||
} else {
|
||||
for (j = 1; j <= nbcarH; j++) param[i+j] = ligne[numcar+i+j];
|
||||
i += nbcarH;
|
||||
}
|
||||
}
|
||||
|
||||
/* blanc : leading (facile) ou trailing (chercher la suite), sinon mauvais */
|
||||
else if (unpar == ' ') {
|
||||
if (typarg == ArgVide) i0 = i+1;
|
||||
else {
|
||||
for (j = i+1; (unpar = ligne[numcar+j]) != '\0' ; j ++) {
|
||||
if (unpar == c_separ || unpar == c_fin) break;
|
||||
if (unpar != ' ') { typarg = ArgQuid; break; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else typarg = ArgQuid; /* caractere non reconnu */
|
||||
}
|
||||
/* Ici, fin de ligne sans separateur : noter parametre en cours ! */
|
||||
*Pstat = 1; param[i] = '\0'; reste = -1;
|
||||
#ifdef VERIFPRINT
|
||||
printf ("Fin de ligne sans separateur, numcar,i : %d %d\n",numcar,i);
|
||||
if (i > i0) printf("numcar = %d type %d param: %s ",numcar,typarg,¶m[i0]);
|
||||
#endif
|
||||
if (i > i0) iges_newparam(typarg,i-i0+1,¶m[i0]);
|
||||
}
|
Reference in New Issue
Block a user