Path: blob/devel/ElmerGUI/netgen/libsrc/csg/csgparser.cpp
3206 views
#include <mystdlib.h>1#include <myadt.hpp>23#include <linalg.hpp>4#include <csg.hpp>567namespace netgen8{9//using namespace netgen;101112static kwstruct defkw[] =13{14{ TOK_RECO, "algebraic3d" },15{ TOK_SOLID, "solid" },16{ TOK_TLO, "tlo" },17{ TOK_CURVE2D, "curve2d" },18{ TOK_CURVE3D, "curve3d" },19{ TOK_BOUNDINGBOX, "boundingbox" },20{ TOK_OR, "or" },21{ TOK_AND, "and" },22{ TOK_NOT, "not" },23{ TOK_SINGULAR, "singular" },24{ TOK_EDGE, "edge" },25{ TOK_FACE, "face" },26{ TOK_POINT, "point" },27{ TOK_IDENTIFY, "identify" },28{ TOK_CLOSESURFACES, "closesurfaces" },29{ TOK_CLOSEEDGES, "closeedges" },30{ TOK_PERIODIC, "periodic" },31{ TOK_BOUNDARYCONDITION, "boundarycondition" },32{ TOK_BOUNDARYCONDITIONNAME, "boundaryconditionname" },33{ TOK_DEFINE, "define" },34{ TOK_CONSTANT, "constant" },35{ TOKEN_TYPE(0) }36};3738static primstruct defprim[] =39{40{ TOK_PLANE, "plane" },41{ TOK_SPHERE, "sphere" },42{ TOK_CYLINDER, "cylinder" },43{ TOK_CONE, "cone" },44{ TOK_ELLIPTICCYLINDER, "ellipticcylinder" },45{ TOK_ELLIPSOID, "ellipsoid" },46{ TOK_ORTHOBRICK, "orthobrick" },47{ TOK_POLYHEDRON, "polyhedron" },48{ TOK_TORUS, "torus" },4950{ TOK_TUBE, "tube" },51{ TOK_GENCYL, "gencyl" },52{ TOK_EXTRUSION, "extrusion" },53{ TOK_REVOLUTION, "revolution" },5455{ TOK_TRANSLATE, "translate" },56{ TOK_MULTITRANSLATE, "multitranslate" },57{ TOK_ROTATE, "rotate" },58{ TOK_MULTIROTATE, "multirotate" },59{ PRIMITIVE_TYPE(0) }60};6162static CSGeometry * geom;636465CSGScanner :: CSGScanner (istream & ascanin)66{67scanin = &ascanin;68token = TOK_END;69num_value = 0;70linenum = 1;71}727374void CSGScanner :: ReadNext ()75{76char ch;777879// scan whitespaces80do81{82scanin->get(ch);8384//if (ch == '\n')85// linenum++;8687// end of file reached88if (scanin->eof())89{90token = TOK_END;91return;92}93if (ch == '\n')94linenum++;959697// skip comment line98if (ch == '#')99{100while (ch != '\n')101{102scanin->get(ch);103if (scanin->eof())104{105token = TOK_END;106return;107}108}109linenum++;110}111}112while (isspace(ch));113114switch (ch)115{116case '(': case ')':117case '[': case ']':118case '-':119case '=': case ',': case ';':120{121token = TOKEN_TYPE (ch);122break;123}124125default:126{127if (isdigit (ch) || ch == '.')128{129scanin->putback (ch);130(*scanin) >> num_value;131token = TOK_NUM;132return;133}134135if (isalpha (ch))136{137string_value = string (1, ch);138scanin->get(ch);139while (isalnum(ch) || ch == '_')140{141string_value += ch;142scanin->get(ch);143}144scanin->putback (ch);145}146147int nr = 0;148while (defkw[nr].kw)149{150if (string_value == defkw[nr].name)151{152token = defkw[nr].kw;153return;154}155nr++;156}157158nr = 0;159while (defprim[nr].kw)160{161if (string_value == defprim[nr].name)162{163token = TOK_PRIMITIVE;164prim_token = defprim[nr].kw;165return;166}167nr++;168}169170token = TOK_STRING;171}172}173}174175void CSGScanner :: Error (const string & err)176{177stringstream errstr;178errstr << "Parsing error in line " << linenum << ": " << endl << err << endl;179throw string(errstr.str());180}181182183/*184Solid = Term { OR Term }185Term = Primary { AND Primary }186Primary = PRIM | IDENT | ( Solid ) | NOT Primary187*/188189void ParseChar (CSGScanner & scan, char ch)190{191if (scan.GetToken() != TOKEN_TYPE(ch))192scan.Error (string ("token '") + string(1, ch) + string("' expected"));193scan.ReadNext();194}195196double ParseNumber(CSGScanner & scan)197{198if (scan.GetToken() == '-')199{200scan.ReadNext();201return -ParseNumber (scan);202}203if (scan.GetToken() != TOK_NUM) scan.Error ("number expected");204double val = scan.GetNumValue();205scan.ReadNext();206return val;207}208209Vec<3> ParseVector (CSGScanner & scan)210{211Vec<3> v;212v(0) = ParseNumber (scan);213ParseChar (scan, ',');214v(1) = ParseNumber (scan);215ParseChar (scan, ',');216v(2) = ParseNumber (scan);217return v;218}219220221CSGScanner & operator>> (CSGScanner & scan, char ch)222{223if (scan.GetToken() != TOKEN_TYPE(ch))224scan.Error (string ("token '") + string(1, ch) + string("' expected"));225scan.ReadNext();226return scan;227}228229CSGScanner & operator>> (CSGScanner & scan, double & d)230{231d = ParseNumber (scan);232return scan;233}234235CSGScanner & operator>> (CSGScanner & scan, int & i)236{237i = int (ParseNumber (scan));238return scan;239}240241CSGScanner & operator>> (CSGScanner & scan, Point<3> & p)242{243scan >> p(0) >> ',' >> p(1) >> ',' >> p(2);244return scan;245}246247CSGScanner & operator>> (CSGScanner & scan, Vec<3> & v)248{249scan >> v(0) >> ',' >> v(1) >> ',' >> v(2);250return scan;251}252253254Solid * ParseSolid (CSGScanner & scan);255Solid * ParseTerm (CSGScanner & scan);256Solid * ParsePrimary (CSGScanner & scan);257258259Solid * ParsePrimary (CSGScanner & scan)260{261if (scan.GetToken() == TOK_PRIMITIVE)262{263switch (scan.GetPrimitiveToken())264{265case TOK_PLANE:266{267Point<3> p;268Vec<3> v;269270scan.ReadNext();271scan >> '(' >> p >> ';' >> v >> ')';272273OneSurfacePrimitive * surf = new Plane ( p, v );274geom->AddSurfaces (surf);275return new Solid (surf);276}277278case TOK_CYLINDER:279{280Point<3> pa, pb;281double r;282283scan.ReadNext();284scan >> '(' >> pa >> ';' >> pb >> ';' >> r >> ')';285286OneSurfacePrimitive * surf = new Cylinder ( pa, pb, r );287geom->AddSurfaces (surf);288return new Solid (surf);289}290291case TOK_ELLIPTICCYLINDER:292{293Point<3> pa;294Vec<3> vl, vs;295296scan.ReadNext();297scan >> '(' >> pa >> ';' >> vl >> ';' >> vs >> ')';298299OneSurfacePrimitive * surf = new EllipticCylinder ( pa, vl, vs);300geom->AddSurfaces (surf);301return new Solid (surf);302}303304305case TOK_ELLIPSOID:306{307Point<3> pa;308Vec<3> v1, v2, v3;309310scan.ReadNext();311scan >> '(' >> pa >> ';' >> v1 >> ';' >> v2 >> ';' >> v3 >> ')';312313OneSurfacePrimitive * surf = new Ellipsoid ( pa, v1, v2, v3);314geom->AddSurfaces (surf);315return new Solid (surf);316}317318319case TOK_CONE:320{321Point<3> pa, pb;322double ra, rb;323324scan.ReadNext();325scan >> '(' >> pa >> ';' >> ra >> ';' >> pb >> ';' >> rb >> ')';326327OneSurfacePrimitive * surf = new Cone ( pa, pb, ra, rb );328geom->AddSurfaces (surf);329return new Solid (surf);330}331332333334case TOK_SPHERE:335{336Point<3> p;337double r;338339scan.ReadNext();340scan >> '(' >> p >> ';' >> r >> ')';341342OneSurfacePrimitive * surf = new Sphere ( p, r );343geom->AddSurfaces (surf);344return new Solid (surf);345}346347case TOK_ORTHOBRICK:348{349Point<3> pa, pb;350351scan.ReadNext();352scan >> '(' >> pa >> ';' >> pb >> ')';353354355Primitive * nprim = new OrthoBrick (pa, pb);356geom->AddSurfaces (nprim);357return new Solid (nprim);358}359360case TOK_POLYHEDRON:361{362// Added by Dalibor Lukas, October 15, 2003363364Point<3> p;365//int pi1, pi2, pi3, pi4;366367scan.ReadNext();368ParseChar (scan, '(');369370Polyhedra * polyhedron = new Polyhedra;371372// scanning the points373while (1)374{375p = Point<3> (ParseVector (scan));376ParseChar (scan, ';');377378polyhedron->AddPoint(p);379380if (scan.GetToken() == ';')381{382scan.ReadNext();383break;384}385}386387// scanning the faces388int inputface = 0;389while (1)390{391ARRAY<int> pnums,cleaned_pnums;392for(int i=0; i<3; i++)393{394pnums.Append((int) (ParseNumber (scan)));395if(i<2)396ParseChar (scan, ',');397}398399if (scan.GetToken() == TOK_COMMA)400{401ParseChar (scan, ',');402pnums.Append((int) (ParseNumber (scan)));403}404405for(int i=0; i<pnums.Size(); i++)406if(!cleaned_pnums.Contains(pnums[i]))407cleaned_pnums.Append(pnums[i]);408409if(cleaned_pnums.Size() == 3)410{411polyhedron->AddFace(cleaned_pnums[0]-1,412cleaned_pnums[1]-1,413cleaned_pnums[2]-1,414inputface);415}416else if(cleaned_pnums.Size() == 4)417{418polyhedron->AddFace(cleaned_pnums[0]-1,419cleaned_pnums[1]-1,420cleaned_pnums[2]-1,421inputface);422polyhedron->AddFace(cleaned_pnums[0]-1,423cleaned_pnums[2]-1,424cleaned_pnums[3]-1,425inputface);426}427else428{429ostringstream msg;430msg << "Something wrong with polyhedron face:";431for(int i=0; i<pnums.Size(); i++)432msg << " " << pnums[i];433throw NgException(msg.str());434}435436437438if (scan.GetToken() == ')')439{440scan.ReadNext();441break;442}443scan.ReadNext();444inputface++;445}446447geom->AddSurfaces (polyhedron);448return new Solid (polyhedron);449}450451452case TOK_REVOLUTION:453{454Point<3> p0,p1;455456scan.ReadNext();457scan >> '(' >> p0 >> ';' >> p1 >> ';';458459string spline = scan.GetStringValue();460461scan.ReadNext();462scan >> ')';463464if(!geom->GetSplineCurve2d(spline))465{466scan.Error ( string("2D Spline curve not found: ") + spline );467break;468}469470Primitive * nprim = new Revolution(p0,p1,471*(geom->GetSplineCurve2d(spline)));472473geom->AddSurfaces (nprim);474return new Solid(nprim);475}476477478case TOK_EXTRUSION:479{480scan.ReadNext();481scan >> '(';482string epath = scan.GetStringValue();483scan.ReadNext();484scan >> ';';485string profile = scan.GetStringValue();486487488scan.ReadNext();489Vec<3> z_dir;490scan >> ';' >> z_dir(0) >> ',' >> z_dir(1) >> ',' >> z_dir(2) >> ')';491492if(!geom->GetSplineCurve2d(profile))493{494scan.Error ( string("2D Spline curve not found: ") + profile );495break;496}497if(!geom->GetSplineCurve3d(epath))498{499scan.Error ( string("2D Spline curve not found: ") + epath );500break;501}502503Primitive * nprim = new Extrusion(*(geom->GetSplineCurve3d(epath)),504*(geom->GetSplineCurve2d(profile)),505z_dir);506geom->AddSurfaces (nprim);507return new Solid(nprim);508}509510511/// Torus512/// Lorenzo Codecasa ([email protected])513/// April 27th, 2005514///515/// begin...516case TOK_TORUS:517{518Point<3> pc;519Vec<3> vn;520double R, r;521522scan.ReadNext();523scan >> '(' >> pc >> ';' >> vn >> ';' >> R >> ';' >> r >> ')';524525OneSurfacePrimitive * surf = new Torus ( pc, vn, R, r );526geom->AddSurfaces (surf);527return new Solid (surf);528}529/// ..end530531532533534case TOK_TRANSLATE:535{536Vec<3> v;537scan.ReadNext();538539ParseChar (scan, '(');540v = ParseVector (scan);541ParseChar (scan, ';');542543Solid * sol1 = ParseSolid (scan);544545ParseChar (scan, ')');546547Solid * nsol = sol1 -> Copy(*geom);548Transformation<3> trans(v);549nsol -> Transform (trans);550return nsol;551}552553554case TOK_ROTATE:555{556Point<3> c;557Vec<3> v;558scan.ReadNext();559560scan >> '(' >> c >> ';' >> v >> ';';561562Solid * sol1 = ParseSolid (scan);563564ParseChar (scan, ')');565566Solid * nsol = sol1 -> Copy(*geom);567Transformation<3> trans(c,v(0),v(1),v(2));568nsol -> Transform (trans);569return nsol;570}571572573case TOK_MULTITRANSLATE:574{575Vec<3> v;576int n;577578scan.ReadNext();579580scan >> '(' >> v >> ';' >> n >> ';';581582Solid * sol1 = ParseSolid (scan);583584scan >> ')';585586Solid * hsol = sol1;587for (int i = 1; i <= n; i++)588{589Solid * nsol = sol1 -> Copy(*geom);590Transformation<3> trans(double(i) * v);591592nsol -> Transform (trans);593hsol = new Solid (Solid::UNION, hsol, nsol);594}595return hsol;596}597598599case TOK_MULTIROTATE:600{601Point<3> c;602Vec<3> v;603int n;604605scan.ReadNext();606607scan >> '(' >> c >> ';' >> v >> ';' >> n >> ';';608Solid * sol1 = ParseSolid (scan);609scan >> ')';610611Transformation<3> trans(c, v(0), v(1), v(2));612Transformation<3> multi(Vec<3>(0,0,0));613Transformation<3> ht;614615Solid * hsol = sol1;616for (int i = 1; i <= n; i++)617{618Solid * nsol = sol1 -> Copy(*geom);619620nsol -> Transform (multi);621hsol = new Solid (Solid::UNION, hsol, nsol);622623ht=multi;624multi.Combine (trans, ht);625}626return hsol;627}628629630default:631{632scan.Error (string ("unknown primary ") + scan.GetStringValue());633}634635}636}637638else if (scan.GetToken() == TOK_STRING &&639geom->GetSolid(scan.GetStringValue()))640641{642Solid * sol = const_cast<Solid*> (geom->GetSolid(scan.GetStringValue()));643scan.ReadNext();644return sol;645}646647else if (scan.GetToken() == TOK_NOT)648649{650scan.ReadNext();651Solid * sol1 = ParsePrimary (scan);652return new Solid (Solid::SUB, sol1);653}654655else if (scan.GetToken() == '(')656657{658scan.ReadNext();659Solid * sol1 = ParseSolid (scan);660scan.ReadNext();661return sol1;662}663664scan.Error (string ("not a primary, name = ")+665scan.GetStringValue());666return 0;667}668669670671Solid * ParseTerm (CSGScanner & scan)672{673Solid * sol = ParsePrimary(scan);674while (scan.GetToken() == TOK_AND)675{676scan.ReadNext();677Solid * sol2 = ParsePrimary(scan);678sol = new Solid (Solid::SECTION, sol, sol2);679}680return sol;681}682683684Solid * ParseSolid (CSGScanner & scan)685{686Solid * sol = ParseTerm(scan);687while (scan.GetToken() == TOK_OR)688{689scan.ReadNext();690Solid * sol2 = ParseTerm(scan);691sol = new Solid (Solid::UNION, sol, sol2);692}693return sol;694}695696697698void ParseFlags (CSGScanner & scan, Flags & flags)699{700while (scan.GetToken() == '-')701{702scan.ReadNext();703string name = scan.GetStringValue();704scan.ReadNext();705if (scan.GetToken() == '=')706{707scan.ReadNext();708if (scan.GetToken() == TOK_STRING)709{710flags.SetFlag (name.c_str(), scan.GetStringValue().c_str());711scan.ReadNext();712}713else if (scan.GetToken() == '[')714{715scan.ReadNext();716717if(scan.GetToken() == '-' || scan.GetToken() == TOK_NUM)718{719ARRAY<double> vals;720vals.Append (ParseNumber(scan));721while (scan.GetToken() == ',')722{723scan.ReadNext();724vals.Append (ParseNumber(scan));725}726ParseChar (scan, ']');727flags.SetFlag (name.c_str(), vals);728}729else730{ // string list731ARRAY<char*> vals;732string val = scan.GetStringValue();733vals.Append(new char[val.size()+1]);734strcpy(vals.Last(),val.c_str());735scan.ReadNext();736737while (scan.GetToken() == ',')738{739scan.ReadNext();740val = scan.GetStringValue();741vals.Append(new char[val.size()+1]);742strcpy(vals.Last(),val.c_str());743scan.ReadNext();744}745ParseChar (scan, ']');746flags.SetFlag (name.c_str(), vals);747for(int i=0; i<vals.Size(); i++)748delete [] vals[i];749}750}751else if (scan.GetToken() == TOK_NUM)752{753flags.SetFlag (name.c_str(), scan.GetNumValue());754scan.ReadNext();755}756}757else758{759flags.SetFlag (name.c_str());760}761}762}763764765/*766Main parsing function for CSG geometry767*/768CSGeometry * ParseCSG (istream & istr)769{770CSGScanner scan(istr);771772geom = new CSGeometry;773774scan.ReadNext();775if (scan.GetToken() != TOK_RECO) // keyword 'algebraic3d'776return 0;777778scan.ReadNext();779780try781{782while (1)783{784if (scan.GetToken() == TOK_END) break;785786if (scan.GetToken() == TOK_SOLID)787{788scan.ReadNext();789if (scan.GetToken() != TOK_STRING)790scan.Error ("name identifier expected");791string solidname = scan.GetStringValue();792793scan.ReadNext();794795ParseChar (scan, '=');796Solid * solid = ParseSolid (scan);797798Flags flags;799ParseFlags (scan, flags);800801geom->SetSolid (solidname.c_str(), new Solid (Solid::ROOT, solid));802geom->SetFlags (solidname.c_str(), flags);803804ParseChar (scan, ';');805806PrintMessage (4, "define solid ", solidname);807}808809else if (scan.GetToken() == TOK_TLO)810811{ // a TopLevelObject definition812813scan.ReadNext();814815string name = scan.GetStringValue();816scan.ReadNext();817818if (scan.GetToken() != TOK_STRING)819820{ // a solid TLO821822Flags flags;823ParseFlags (scan, flags);824825ParseChar (scan, ';');826if (!geom->GetSolid (name))827scan.Error ("Top-Level-Object "+name+" not defined");828829int tlonr =830geom->SetTopLevelObject ((Solid*)geom->GetSolid(name));831TopLevelObject * tlo = geom->GetTopLevelObject (tlonr);832833if (flags.NumListFlagDefined ("col"))834{835const ARRAY<double> & col =836flags.GetNumListFlag ("col");837tlo->SetRGB (col[0], col[1], col[2]);838}839840if (flags.GetDefineFlag ("transparent"))841tlo->SetTransparent (1);842843tlo->SetMaterial (flags.GetStringFlag ("material", ""));844tlo->SetLayer (int(flags.GetNumFlag ("layer", 1)));845if (flags.NumFlagDefined ("maxh"))846tlo->SetMaxH (flags.GetNumFlag("maxh", 1e10));847}848849else850851{ // a surface TLO852853string surfname = scan.GetStringValue();854scan.ReadNext();855856Flags flags;857ParseFlags (scan, flags);858859ParseChar (scan, ';');860861ARRAY<int> si;862geom->GetSolid(surfname)->GetSurfaceIndices(si);863int tlonr =864geom->SetTopLevelObject ((Solid*)geom->GetSolid(name),865(Surface*)geom->GetSurface(si.Get(1)));866TopLevelObject * tlo = geom->GetTopLevelObject (tlonr);867if (flags.NumListFlagDefined ("col"))868{869const ARRAY<double> & col = flags.GetNumListFlag ("col");870tlo->SetRGB (col.Get(1), col.Get(2), col.Get(3));871}872if (flags.GetDefineFlag ("transparent"))873tlo->SetTransparent (1);874875if (flags.NumFlagDefined ("maxh"))876tlo->SetMaxH (flags.GetNumFlag("maxh", 1e10));877tlo->SetLayer (int(flags.GetNumFlag ("layer", 1)));878tlo->SetBCProp (int(flags.GetNumFlag ("bc", -1)));879if ( flags.StringFlagDefined("bcname") )880tlo->SetBCName ( flags.GetStringFlag ("bcname", "default") );881}882}883884else if (scan.GetToken() == TOK_IDENTIFY)885886{887888scan.ReadNext();889switch (scan.GetToken())890{891case TOK_CLOSESURFACES:892{893scan.ReadNext();894895string name1 = scan.GetStringValue();896scan.ReadNext();897898string name2 = scan.GetStringValue();899scan.ReadNext();900901Flags flags;902ParseFlags (scan, flags);903904ParseChar (scan, ';');905906907ARRAY<int> si1, si2;908geom->GetSolid(name1)->GetSurfaceIndices(si1);909geom->GetSolid(name2)->GetSurfaceIndices(si2);910911const TopLevelObject * domain = 0;912if (flags.StringFlagDefined ("tlo"))913{914domain =915geom->GetTopLevelObject (geom->GetSolid(flags.GetStringFlag ("tlo","")));916if (!domain)917scan.Error ("identification needs undefined tlo");918}919920geom->AddIdentification921(new CloseSurfaceIdentification922(geom->GetNIdentifications()+1, *geom,923geom->GetSurface (si1[0]), geom->GetSurface (si2[0]),924domain,925flags));926927break;928}929930case TOK_PERIODIC:931{932scan.ReadNext();933934string name1 = scan.GetStringValue();935scan.ReadNext();936937string name2 = scan.GetStringValue();938scan.ReadNext();939940ParseChar (scan, ';');941942943ARRAY<int> si1, si2;944geom->GetSolid(name1)->GetSurfaceIndices(si1);945geom->GetSolid(name2)->GetSurfaceIndices(si2);946947geom->AddIdentification948(new PeriodicIdentification949(geom->GetNIdentifications()+1,950*geom,951geom->GetSurface (si1.Get(1)),952geom->GetSurface (si2.Get(1))));953break;954}955956default:957scan.Error ("keyword 'closesurfaces' or 'periodic' expected");958}959960}961962else if (scan.GetToken() == TOK_SINGULAR)963964{965966scan.ReadNext();967switch (scan.GetToken())968{969case TOK_FACE:970{971scan.ReadNext();972973string name1 = scan.GetStringValue(); // tlo974scan.ReadNext();975976string name2 = scan.GetStringValue();977scan.ReadNext();978979Flags flags;980ParseFlags (scan, flags);981int factor = int(flags.GetNumFlag("factor",1));982// cout << "Singular Face with factor " << factor << endl;983PrintMessageCR (3, "Singular Face with factor ", factor);984985ParseChar (scan, ';');986987const Solid * sol = geom->GetSolid(name2);988989if(!sol)990scan.Error ("unknown solid in singular face definition");991else992for (int i = 0; i < geom->GetNTopLevelObjects(); i++)993if (name1 == geom->GetTopLevelObject (i)->GetSolid()->Name())994geom->singfaces.Append (new SingularFace (i+1, sol,factor));995996break;997}998999case TOK_EDGE:1000{1001scan.ReadNext();10021003string name1 = scan.GetStringValue();1004scan.ReadNext();10051006string name2 = scan.GetStringValue();1007scan.ReadNext();10081009Flags flags;1010ParseFlags (scan, flags);1011int factor = int(flags.GetNumFlag("factor",1));1012double maxhinit = flags.GetNumFlag("maxh",-1);1013ParseChar (scan, ';');10141015const Solid * s1 = geom->GetSolid(name1);1016const Solid * s2 = geom->GetSolid(name2);1017PrintMessageCR (3, "Singular Edge with factor ", factor);10181019int domnr = -1;1020if (flags.StringFlagDefined ("tlo"))1021{1022const Solid * sol =1023geom->GetSolid(flags.GetStringFlag ("tlo",""));10241025for (int i = 0; i < geom->GetNTopLevelObjects(); i++)1026if (geom->GetTopLevelObject(i)->GetSolid() == sol)1027domnr = i;10281029// cout << "domnr = " << domnr;1030}10311032if(!s1 || !s2)1033scan.Error ("unknown solid ins singular edge definition");1034else1035geom->singedges.Append (new SingularEdge (1, domnr,1036*geom, s1, s2, factor,1037maxhinit));1038break;1039}10401041case TOK_POINT:1042{1043scan.ReadNext();10441045string name1 = scan.GetStringValue();1046scan.ReadNext();1047string name2 = scan.GetStringValue();1048scan.ReadNext();1049string name3 = scan.GetStringValue();1050scan.ReadNext();10511052Flags flags;1053ParseFlags (scan, flags);1054int factor = int(flags.GetNumFlag("factor",1));1055ParseChar (scan, ';');10561057const Solid * s1 = geom->GetSolid(name1);1058const Solid * s2 = geom->GetSolid(name2);1059const Solid * s3 = geom->GetSolid(name3);1060// cout << "Singular Point with factor " << factor << endl;1061PrintMessageCR (3, "Singular Point with factor ", factor);1062geom->singpoints.Append (new SingularPoint (1, s1, s2, s3, factor));1063break;1064}1065default:1066scan.Error ("keyword 'face' or 'edge' or 'point' expected");1067}1068}106910701071else if (scan.GetToken() == TOK_POINT)1072{1073Point<3> p;10741075scan.ReadNext();1076ParseChar (scan, '(');1077p = Point<3> (ParseVector (scan));1078ParseChar (scan, ')');107910801081Flags flags;1082ParseFlags (scan, flags);1083int factor = int(flags.GetNumFlag("factor",0));10841085ParseChar (scan, ';');10861087geom->AddUserPoint (p, factor);1088}10891090else if (scan.GetToken() == TOK_BOUNDINGBOX)1091{1092Point<3> p1, p2;10931094scan.ReadNext();1095ParseChar (scan, '(');1096p1 = Point<3> (ParseVector (scan));1097ParseChar (scan, ';');1098p2 = Point<3> (ParseVector (scan));1099ParseChar (scan, ')');1100ParseChar (scan, ';');11011102geom->SetBoundingBox (Box<3> (p1, p2));1103}11041105else if (scan.GetToken() == TOK_CURVE2D)1106{1107scan.ReadNext();110811091110if (scan.GetToken() != TOK_STRING)1111scan.Error ("name identifier expected");1112string curvename = scan.GetStringValue();11131114scan.ReadNext();11151116ParseChar (scan, '=');1117ParseChar (scan, '(');11181119SplineGeometry<2> * newspline = new SplineGeometry<2>;1120newspline->CSGLoad(scan);11211122ParseChar (scan, ')');1123ParseChar (scan, ';');11241125geom->SetSplineCurve(curvename.c_str(),newspline);11261127PrintMessage (4, "define 2d curve ", curvename);1128}11291130else if (scan.GetToken() == TOK_CURVE3D)1131{1132scan.ReadNext();113311341135if (scan.GetToken() != TOK_STRING)1136scan.Error ("name identifier expected");1137string curvename = scan.GetStringValue();11381139scan.ReadNext();11401141ParseChar (scan, '=');1142ParseChar (scan, '(');11431144SplineGeometry<3> * newspline = new SplineGeometry<3>;1145newspline->CSGLoad(scan);11461147ParseChar (scan, ')');1148ParseChar (scan, ';');11491150geom->SetSplineCurve(curvename.c_str(),newspline);11511152PrintMessage (4, "define 3d curve ", curvename);1153}11541155else if (scan.GetToken() == TOK_BOUNDARYCONDITION)1156{1157scan.ReadNext();11581159string name1 = scan.GetStringValue();1160scan.ReadNext();11611162string name2 = scan.GetStringValue();1163scan.ReadNext();11641165int num = int (ParseNumber (scan));1166ParseChar (scan, ';');116711681169CSGeometry::BCModification bcm;1170bcm.bcname = NULL;1171ARRAY<int> si;11721173geom->GetSolid(name1)->GetSurfaceIndices(si);1174if(si.Size() == 0)1175{1176string errstring = "solid \""; errstring += name1; errstring += "\" has no surfaces";1177scan.Error (errstring);1178}11791180bcm.tlonr = -1;1181int i;1182for (i = 0; i < geom->GetNTopLevelObjects(); i++)1183if (string (geom->GetTopLevelObject(i)->GetSolid()->Name())1184== name2)1185{1186bcm.tlonr = i;1187break;1188}1189if(bcm.tlonr == -1)1190{1191string errstring = "tlo \""; errstring += name2; errstring += "\" not found";1192scan.Error(errstring);1193}119411951196bcm.bcnr = num;1197for (i = 0; i < si.Size(); i++)1198{1199bcm.si = si[i];1200geom->bcmodifications.Append (bcm);1201}1202}12031204else if (scan.GetToken() == TOK_BOUNDARYCONDITIONNAME)1205{1206scan.ReadNext();12071208string name1 = scan.GetStringValue();1209scan.ReadNext();12101211string name2 = scan.GetStringValue();1212scan.ReadNext();12131214string bcname = scan.GetStringValue();1215scan.ReadNext();1216ParseChar(scan, ';');121712181219CSGeometry::BCModification bcm;1220bcm.bcname = NULL;122112221223ARRAY<int> si;12241225geom->GetSolid(name1)->GetSurfaceIndices(si);1226if(si.Size() == 0)1227{1228string errstring = "solid \""; errstring += name1; errstring += "\" has no surfaces";1229scan.Error (errstring);1230}12311232bcm.tlonr = -1;1233int i;1234for (i = 0; i < geom->GetNTopLevelObjects(); i++)1235if (string (geom->GetTopLevelObject(i)->GetSolid()->Name())1236== name2)1237{1238bcm.tlonr = i;1239break;1240}1241if(bcm.tlonr == -1)1242{1243string errstring = "tlo \""; errstring += name2; errstring += "\" not found";1244scan.Error(errstring);1245}124612471248bcm.bcnr = -1;1249for (i = 0; i < si.Size(); i++)1250{1251bcm.si = si[i];1252geom->bcmodifications.Append (bcm);1253geom->bcmodifications.Last().bcname = new string(bcname);1254}1255}12561257else if (scan.GetToken() == TOK_DEFINE)1258{1259scan.ReadNext();1260string name;1261double val;12621263switch (scan.GetToken())1264{1265case TOK_CONSTANT:1266scan.ReadNext();12671268name = scan.GetStringValue();1269scan.ReadNext();12701271ParseChar(scan, '=');1272val = ParseNumber(scan);12731274if(name == "identprec")1275geom->SetIdEps(val);1276127712781279break;1280default:1281scan.Error ("keyword 'constant' expected");1282}1283}128412851286else1287{1288cout << "read unidentified token " << scan.GetToken()1289<< " (as char: \"" << char(scan.GetToken()) << "\")"1290<< " string = " << scan.GetStringValue() << endl;1291scan.ReadNext();1292}1293}1294}1295catch (string errstr)1296{1297cout << "caught error " << errstr << endl;1298throw NgException (errstr);1299}1300130113021303(*testout) << geom->GetNTopLevelObjects() << " TLOs:" << endl;1304for (int i = 0; i < geom->GetNTopLevelObjects(); i++)1305{1306const TopLevelObject * tlo = geom->GetTopLevelObject(i);1307if (tlo->GetSolid())1308(*testout) << i << ": " << *tlo->GetSolid() << endl;1309}13101311(*testout) << geom->GetNSurf() << " Surfaces" << endl;1312for (int i = 0; i < geom->GetNSurf(); i++)1313(*testout) << i << ": " << *geom->GetSurface(i) << endl;13141315return geom;1316/*1317do1318{1319scan.ReadNext();1320if (scan.GetToken() == TOK_STRING)1321cout << "found string " << scan.GetStringValue() << endl;1322else1323cout << "token = " << int(scan.GetToken()) << endl;1324}1325while (scan.GetToken() != TOK_END);1326*/1327}132813291330};1331133213331334