Make dispositions general and use it in loadCategory.
parent
f56c3a104b
commit
8c032924c7
|
@ -1,5 +1,6 @@
|
|||
|
||||
#include <celutil/util.h>
|
||||
#include "parseobject.h"
|
||||
#include "catentry.h"
|
||||
#include "category.h"
|
||||
|
||||
|
@ -64,6 +65,18 @@ bool CatEntry::removeFromCategory(const std::string &s)
|
|||
return removeFromCategory(c);
|
||||
}
|
||||
|
||||
bool CatEntry::clearCategories()
|
||||
{
|
||||
bool ret = true;
|
||||
while(m_cats != nullptr)
|
||||
{
|
||||
UserCategory *c = *(m_cats->begin());
|
||||
if (!removeFromCategory(c))
|
||||
ret = false;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CatEntry::isInCategory(UserCategory *c) const
|
||||
{
|
||||
if (m_cats == nullptr)
|
||||
|
@ -79,15 +92,16 @@ bool CatEntry::isInCategory(const std::string &s) const
|
|||
return isInCategory(c);
|
||||
}
|
||||
|
||||
bool CatEntry::loadCategories(Hash *hash, const std::string &domain)
|
||||
bool CatEntry::loadCategories(Hash *hash, DataDisposition disposition, const std::string &domain)
|
||||
{
|
||||
if (disposition == DataDisposition::Replace)
|
||||
clearCategories();
|
||||
std::string cn;
|
||||
if (hash->getString("Category", cn))
|
||||
{
|
||||
if (cn.empty())
|
||||
return false;
|
||||
addToCategory(cn, true, domain);
|
||||
return true;
|
||||
return addToCategory(cn, true, domain);
|
||||
}
|
||||
Value *a = hash->getValue("Category");
|
||||
if (a == nullptr)
|
||||
|
@ -95,13 +109,12 @@ bool CatEntry::loadCategories(Hash *hash, const std::string &domain)
|
|||
ValueArray *v = a->getArray();
|
||||
if (v == nullptr)
|
||||
return false;
|
||||
bool ret = false;
|
||||
bool ret = true;
|
||||
for (auto it : *v)
|
||||
{
|
||||
cn = it->getString();
|
||||
if (cn.empty())
|
||||
ret = true;
|
||||
addToCategory(cn, true, domain);
|
||||
if (!addToCategory(cn, true, domain));
|
||||
ret = false;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include <string>
|
||||
#include <unordered_set>
|
||||
#include <celengine/selection.h>
|
||||
#include <celengine/parser.h>
|
||||
#include <celengine/parseobject.h>
|
||||
|
||||
class UserCategory;
|
||||
|
||||
|
@ -23,10 +23,11 @@ public:
|
|||
bool addToCategory(const std::string&, bool = false, const std::string &domain = "");
|
||||
bool removeFromCategory(UserCategory*);
|
||||
bool removeFromCategory(const std::string&);
|
||||
bool clearCategories();
|
||||
bool isInCategory(UserCategory*) const;
|
||||
bool isInCategory(const std::string&) const;
|
||||
int categoriesCount() const { return m_cats == nullptr ? 0 : m_cats->size(); }
|
||||
CategorySet *getCategories() const { return m_cats; };
|
||||
bool loadCategories(Hash*, const std::string &domain = "");
|
||||
bool loadCategories(Hash*, DataDisposition = DataDisposition::Add, const std::string &domain = "");
|
||||
friend UserCategory;
|
||||
};
|
||||
|
|
|
@ -277,7 +277,7 @@ bool DSODatabase::load(istream& in, const string& resourcePath)
|
|||
|
||||
if (obj != nullptr && obj->load(objParams, resourcePath))
|
||||
{
|
||||
obj->loadCategories(objParams, resourcePath);
|
||||
obj->loadCategories(objParams, DataDisposition::Add, resourcePath);
|
||||
delete objParamsValue;
|
||||
|
||||
// Ensure that the DSO array is large enough
|
||||
|
|
|
@ -14,15 +14,25 @@
|
|||
#define _CELENGINE_PARSEOBJECT_H_
|
||||
|
||||
#include <string>
|
||||
#include "astro.h"
|
||||
#include "body.h"
|
||||
#include <celephem/orbit.h>
|
||||
#include <celephem/rotation.h>
|
||||
#include "parser.h"
|
||||
|
||||
class Body;
|
||||
class Star;
|
||||
class ReferenceFrame;
|
||||
class TwoVectorFrame;
|
||||
class Universe;
|
||||
class Selection;
|
||||
|
||||
enum class DataDisposition
|
||||
{
|
||||
Add,
|
||||
Modify,
|
||||
Replace
|
||||
};
|
||||
|
||||
|
||||
bool ParseDate(Hash* hash, const string& name, double& jd);
|
||||
|
||||
Orbit* CreateOrbit(const Selection& centralObject,
|
||||
|
|
|
@ -39,15 +39,6 @@
|
|||
using namespace Eigen;
|
||||
using namespace std;
|
||||
|
||||
|
||||
enum Disposition
|
||||
{
|
||||
AddObject,
|
||||
ReplaceObject,
|
||||
ModifyObject,
|
||||
};
|
||||
|
||||
|
||||
enum BodyType
|
||||
{
|
||||
ReferencePoint,
|
||||
|
@ -448,7 +439,7 @@ static bool CreateTimeline(Body* body,
|
|||
Universe& universe,
|
||||
Hash* planetData,
|
||||
const string& path,
|
||||
Disposition disposition,
|
||||
DataDisposition disposition,
|
||||
BodyType bodyType)
|
||||
{
|
||||
FrameTree* parentFrameTree = nullptr;
|
||||
|
@ -526,7 +517,7 @@ static bool CreateTimeline(Body* body,
|
|||
// replace the previous timeline if it contained more than one phase. Otherwise, the
|
||||
// properties of the single phase will be modified individually, for compatibility with
|
||||
// Celestia versions 1.5.0 and earlier.
|
||||
if (disposition == ModifyObject)
|
||||
if (disposition == DataDisposition::Modify)
|
||||
{
|
||||
const Timeline* timeline = body->getTimeline();
|
||||
if (timeline->phaseCount() == 1)
|
||||
|
@ -582,7 +573,7 @@ static bool CreateTimeline(Body* body,
|
|||
Orbit* newOrbit = CreateOrbit(orbitFrame->getCenter(), planetData, path, !orbitsPlanet);
|
||||
if (newOrbit == nullptr && orbit == nullptr)
|
||||
{
|
||||
if (body->getTimeline() && disposition == ModifyObject)
|
||||
if (body->getTimeline() && disposition == DataDisposition::Modify)
|
||||
{
|
||||
// The object definition is modifying an existing object with a multiple phase
|
||||
// timeline, but no orbit definition was given. This can happen for completely
|
||||
|
@ -634,7 +625,7 @@ static bool CreateTimeline(Body* body,
|
|||
|
||||
// Something went wrong if the disposition isn't modify and no timeline
|
||||
// is to be created.
|
||||
assert(disposition == ModifyObject || overrideOldTimeline);
|
||||
assert(disposition == DataDisposition::Modify || overrideOldTimeline);
|
||||
|
||||
if (overrideOldTimeline)
|
||||
{
|
||||
|
@ -698,12 +689,12 @@ static Body* CreateBody(const string& name,
|
|||
Body* existingBody,
|
||||
Hash* planetData,
|
||||
const string& path,
|
||||
Disposition disposition,
|
||||
DataDisposition disposition,
|
||||
BodyType bodyType)
|
||||
{
|
||||
Body* body = nullptr;
|
||||
|
||||
if (disposition == ModifyObject || disposition == ReplaceObject)
|
||||
if (disposition == DataDisposition::Modify || disposition == DataDisposition::Replace)
|
||||
{
|
||||
body = existingBody;
|
||||
}
|
||||
|
@ -712,7 +703,7 @@ static Body* CreateBody(const string& name,
|
|||
{
|
||||
body = new Body(system, name);
|
||||
// If the body doesn't exist, always treat the disposition as 'Add'
|
||||
disposition = AddObject;
|
||||
disposition = DataDisposition::Add;
|
||||
|
||||
// Set the default classification for new objects based on the body type.
|
||||
// This may be overridden by the Class property.
|
||||
|
@ -867,7 +858,7 @@ static Body* CreateBody(const string& name,
|
|||
}
|
||||
|
||||
Surface surface;
|
||||
if (disposition == ModifyObject)
|
||||
if (disposition == DataDisposition::Modify)
|
||||
{
|
||||
surface = body->getSurface();
|
||||
}
|
||||
|
@ -916,7 +907,7 @@ static Body* CreateBody(const string& name,
|
|||
assert(atmosData != nullptr);
|
||||
|
||||
Atmosphere* atmosphere = nullptr;
|
||||
if (disposition == ModifyObject)
|
||||
if (disposition == DataDisposition::Modify)
|
||||
{
|
||||
atmosphere = body->getAtmosphere();
|
||||
if (atmosphere == nullptr)
|
||||
|
@ -972,7 +963,7 @@ static Body* CreateBody(const string& name,
|
|||
}
|
||||
|
||||
body->setAtmosphere(*atmosphere);
|
||||
if (disposition != ModifyObject)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
delete atmosphere;
|
||||
}
|
||||
}
|
||||
|
@ -1045,11 +1036,11 @@ static Body* CreateReferencePoint(const string& name,
|
|||
Body* existingBody,
|
||||
Hash* refPointData,
|
||||
const string& path,
|
||||
Disposition disposition)
|
||||
DataDisposition disposition)
|
||||
{
|
||||
Body* body = nullptr;
|
||||
|
||||
if (disposition == ModifyObject || disposition == ReplaceObject)
|
||||
if (disposition == DataDisposition::Modify || disposition == DataDisposition::Replace)
|
||||
{
|
||||
body = existingBody;
|
||||
}
|
||||
|
@ -1058,7 +1049,7 @@ static Body* CreateReferencePoint(const string& name,
|
|||
{
|
||||
body = new Body(system, name);
|
||||
// If the point doesn't exist, always treat the disposition as 'Add'
|
||||
disposition = AddObject;
|
||||
disposition = DataDisposition::Add;
|
||||
}
|
||||
|
||||
body->setSemiAxes(Vector3f::Ones());
|
||||
|
@ -1105,22 +1096,22 @@ bool LoadSolarSystemObjects(istream& in,
|
|||
while (tokenizer.nextToken() != Tokenizer::TokenEnd)
|
||||
{
|
||||
// Read the disposition; if none is specified, the default is Add.
|
||||
Disposition disposition = AddObject;
|
||||
DataDisposition disposition = DataDisposition::Add;
|
||||
if (tokenizer.getTokenType() == Tokenizer::TokenName)
|
||||
{
|
||||
if (tokenizer.getNameValue() == "Add")
|
||||
{
|
||||
disposition = AddObject;
|
||||
disposition = DataDisposition::Add;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
else if (tokenizer.getNameValue() == "Replace")
|
||||
{
|
||||
disposition = ReplaceObject;
|
||||
disposition = DataDisposition::Replace;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
else if (tokenizer.getNameValue() == "Modify")
|
||||
{
|
||||
disposition = ModifyObject;
|
||||
disposition = DataDisposition::Modify;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
}
|
||||
|
@ -1239,12 +1230,12 @@ bool LoadSolarSystemObjects(istream& in,
|
|||
Body* existingBody = parentSystem->find(primaryName);
|
||||
if (existingBody)
|
||||
{
|
||||
if (disposition == AddObject)
|
||||
if (disposition == DataDisposition::Add)
|
||||
{
|
||||
errorMessagePrelude(tokenizer);
|
||||
fmt::fprintf(cerr, _("warning duplicate definition of %s %s\n"), parentName, primaryName);
|
||||
}
|
||||
else if (disposition == ReplaceObject)
|
||||
else if (disposition == DataDisposition::Replace)
|
||||
{
|
||||
existingBody->setDefaultProperties();
|
||||
}
|
||||
|
@ -1257,8 +1248,8 @@ bool LoadSolarSystemObjects(istream& in,
|
|||
body = CreateBody(primaryName, parentSystem, universe, existingBody, objectData, directory, disposition, bodyType);
|
||||
|
||||
if (body != nullptr)
|
||||
body->loadCategories(objectData, directory);
|
||||
if (body != nullptr && disposition == AddObject)
|
||||
body->loadCategories(objectData, disposition, directory);
|
||||
if (body != nullptr && disposition == DataDisposition::Add)
|
||||
{
|
||||
vector<string>::const_iterator iter = names.begin();
|
||||
iter++;
|
||||
|
@ -1285,7 +1276,7 @@ bool LoadSolarSystemObjects(istream& in,
|
|||
if (parent.body() != nullptr)
|
||||
{
|
||||
Location* location = CreateLocation(objectData, parent.body());
|
||||
location->loadCategories(objectData, directory);
|
||||
location->loadCategories(objectData, disposition, directory);
|
||||
if (location != nullptr)
|
||||
{
|
||||
location->setName(primaryName);
|
||||
|
|
|
@ -753,7 +753,7 @@ static void stcError(const Tokenizer& tok,
|
|||
/*! Load star data from a property list into a star instance.
|
||||
*/
|
||||
bool StarDatabase::createStar(Star* star,
|
||||
StcDisposition disposition,
|
||||
DataDisposition disposition,
|
||||
uint32_t catalogNumber,
|
||||
Hash* starData,
|
||||
const string& path,
|
||||
|
@ -783,7 +783,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
else
|
||||
{
|
||||
// Spectral type is required for new stars
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
{
|
||||
cerr << _("Invalid star: missing spectral type.\n");
|
||||
return false;
|
||||
|
@ -792,7 +792,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
}
|
||||
|
||||
bool modifyExistingDetails = false;
|
||||
if (disposition == ModifyStar)
|
||||
if (disposition == DataDisposition::Modify)
|
||||
{
|
||||
StarDetails* existingDetails = star->getDetails();
|
||||
|
||||
|
@ -987,7 +987,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
|
||||
if (!modifyExistingDetails)
|
||||
star->setDetails(details);
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
star->setCatalogNumber(catalogNumber);
|
||||
|
||||
// Compute the position in rectangular coordinates. If a star has an
|
||||
|
@ -1002,7 +1002,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
double dec = 0.0;
|
||||
double distance = 0.0;
|
||||
|
||||
if (disposition == ModifyStar)
|
||||
if (disposition == DataDisposition::Modify)
|
||||
{
|
||||
Vector3f pos = star->getPosition();
|
||||
|
||||
|
@ -1026,7 +1026,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
}
|
||||
else
|
||||
{
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
{
|
||||
cerr << _("Invalid star: missing right ascension\n");
|
||||
return false;
|
||||
|
@ -1039,7 +1039,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
}
|
||||
else
|
||||
{
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
{
|
||||
cerr << _("Invalid star: missing declination.\n");
|
||||
return false;
|
||||
|
@ -1052,7 +1052,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
}
|
||||
else
|
||||
{
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
{
|
||||
cerr << _("Invalid star: missing distance.\n");
|
||||
return false;
|
||||
|
@ -1084,7 +1084,7 @@ bool StarDatabase::createStar(Star* star,
|
|||
{
|
||||
if (!starData->getNumber("AppMag", magnitude))
|
||||
{
|
||||
if (disposition != ModifyStar)
|
||||
if (disposition != DataDisposition::Modify)
|
||||
{
|
||||
clog << _("Invalid star: missing magnitude.\n");
|
||||
return false;
|
||||
|
@ -1164,22 +1164,22 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
|
|||
|
||||
// Parse the disposition--either Add, Replace, or Modify. The disposition
|
||||
// may be omitted. The default value is Add.
|
||||
StcDisposition disposition = AddStar;
|
||||
DataDisposition disposition = DataDisposition::Add;
|
||||
if (tokenizer.getTokenType() == Tokenizer::TokenName)
|
||||
{
|
||||
if (tokenizer.getNameValue() == "Modify")
|
||||
{
|
||||
disposition = ModifyStar;
|
||||
disposition = DataDisposition::Modify;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
else if (tokenizer.getNameValue() == "Replace")
|
||||
{
|
||||
disposition = ReplaceStar;
|
||||
disposition = DataDisposition::Replace;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
else if (tokenizer.getNameValue() == "Add")
|
||||
{
|
||||
disposition = AddStar;
|
||||
disposition = DataDisposition::Add;
|
||||
tokenizer.nextToken();
|
||||
}
|
||||
}
|
||||
|
@ -1230,7 +1230,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
|
|||
|
||||
switch (disposition)
|
||||
{
|
||||
case AddStar:
|
||||
case DataDisposition::Add:
|
||||
// Automatically generate a catalog number for the star if one isn't
|
||||
// supplied.
|
||||
if (catalogNumber == Star::InvalidCatalogNumber)
|
||||
|
@ -1243,7 +1243,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
|
|||
}
|
||||
break;
|
||||
|
||||
case ReplaceStar:
|
||||
case DataDisposition::Replace:
|
||||
if (catalogNumber == Star::InvalidCatalogNumber)
|
||||
{
|
||||
if (!firstName.empty())
|
||||
|
@ -1262,7 +1262,7 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
|
|||
}
|
||||
break;
|
||||
|
||||
case ModifyStar:
|
||||
case DataDisposition::Modify:
|
||||
// If no catalog number was specified, try looking up the star by name
|
||||
if (catalogNumber == Star::InvalidCatalogNumber && !firstName.empty())
|
||||
{
|
||||
|
@ -1300,14 +1300,14 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
|
|||
star = new Star();
|
||||
|
||||
bool ok = false;
|
||||
if (isNewStar && disposition == ModifyStar)
|
||||
if (isNewStar && disposition == DataDisposition::Modify)
|
||||
{
|
||||
clog << "Modify requested for nonexistent star.\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
ok = createStar(star, disposition, catalogNumber, starData, resourcePath, !isStar);
|
||||
star->loadCategories(starData, resourcePath);
|
||||
star->loadCategories(starData, disposition, resourcePath);
|
||||
}
|
||||
delete starDataValue;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <celengine/starname.h>
|
||||
#include <celengine/star.h>
|
||||
#include <celengine/staroctree.h>
|
||||
#include <celengine/parser.h>
|
||||
#include <celengine/parseobject.h>
|
||||
|
||||
|
||||
static const unsigned int MAX_STAR_NAMES = 10;
|
||||
|
@ -145,13 +145,6 @@ class StarDatabase
|
|||
MaxCatalog = 3,
|
||||
};
|
||||
|
||||
enum StcDisposition
|
||||
{
|
||||
AddStar,
|
||||
ReplaceStar,
|
||||
ModifyStar,
|
||||
};
|
||||
|
||||
// Not exact, but any star with a catalog number greater than this is assumed to not be
|
||||
// a HIPPARCOS stars.
|
||||
static const uint32_t MAX_HIPPARCOS_NUMBER = 999999;
|
||||
|
@ -177,7 +170,7 @@ class StarDatabase
|
|||
|
||||
private:
|
||||
bool createStar(Star* star,
|
||||
StcDisposition disposition,
|
||||
DataDisposition disposition,
|
||||
uint32_t catalogNumber,
|
||||
Hash* starData,
|
||||
const std::string& path,
|
||||
|
|
Loading…
Reference in New Issue