[TD] make LineGroup selectable
At the moment one has to specify the LineGroup as string. But one doesn't know what groups exist. So one has to check the Wiki, learn there where the groups are defined and then open the definition file with a text editor. This PR simplifies this by reading the existing groups out of the definition file and fill the combobox accordingly. It also give the user info what the selected LineGroup defines via the tooltip. A nice side effect is that no typos can occur since you don't have to enter the LineGroup name as text.
This commit is contained in:
@@ -107,8 +107,8 @@ std::string LineFormat::toString(void) const
|
||||
//static preference getters.
|
||||
double LineFormat::getDefEdgeWidth()
|
||||
{
|
||||
std::string lgName = Preferences::lineGroup();
|
||||
auto lg = TechDraw::LineGroup::lineGroupFactory(lgName);
|
||||
int lgNumber = Preferences::lineGroup();
|
||||
auto lg = TechDraw::LineGroup::lineGroupFactory(lgNumber);
|
||||
|
||||
double width = lg->getWeight("Graphic");
|
||||
delete lg;
|
||||
|
||||
@@ -561,9 +561,8 @@ double DrawUtil::sensibleScale(double working_scale)
|
||||
|
||||
double DrawUtil::getDefaultLineWeight(std::string lineType)
|
||||
{
|
||||
std::string lgName = Preferences::lineGroup();
|
||||
|
||||
auto lg = LineGroup::lineGroupFactory(lgName);
|
||||
int lgNumber = Preferences::lineGroup();
|
||||
auto lg = LineGroup::lineGroupFactory(lgNumber);
|
||||
|
||||
double weight = lg->getWeight(lineType);
|
||||
delete lg; //Coverity CID 174671
|
||||
|
||||
@@ -125,62 +125,49 @@ std::vector<double> LineGroup::split(std::string line)
|
||||
return result;
|
||||
}
|
||||
|
||||
//static support function: find group defn in file
|
||||
std::string LineGroup::getRecordFromFile(std::string parmFile, std::string groupName)
|
||||
//static support function: find group definition in file
|
||||
std::string LineGroup::getRecordFromFile(std::string parmFile, int groupNumber)
|
||||
{
|
||||
std::string record;
|
||||
std::string lineSpec;
|
||||
std::ifstream inFile;
|
||||
inFile.open (parmFile, std::ifstream::in);
|
||||
if(!inFile.is_open()) {
|
||||
Base::Console().Message( "Cannot open LineGroup file: %s\n",parmFile.c_str());
|
||||
return record;
|
||||
}
|
||||
|
||||
bool groupFound = false;
|
||||
// parse file to get the groupNumber'th line
|
||||
int counter = 0; // the combobox enums begin with 0
|
||||
while ( inFile.good() ){
|
||||
std::string line;
|
||||
std::getline(inFile,line);
|
||||
std::string nameTag = line.substr(0,1);
|
||||
std::string foundName;
|
||||
unsigned long int commaPos;
|
||||
if ((nameTag == ";") ||
|
||||
(nameTag == " ") ||
|
||||
(line.empty()) ) { //is cr/lf empty?
|
||||
continue;
|
||||
} else if (nameTag == "*") {
|
||||
commaPos = line.find(',',1);
|
||||
if (commaPos != std::string::npos) {
|
||||
foundName = line.substr(1,commaPos-1);
|
||||
} else {
|
||||
foundName = line.substr(1);
|
||||
}
|
||||
if (foundName == groupName) {
|
||||
//this is our group
|
||||
std::getline(inFile, line);
|
||||
std::string nameTag = line.substr(0, 1);
|
||||
if (nameTag == "*") { // we found a definition line
|
||||
if (counter == groupNumber) {
|
||||
record = line;
|
||||
groupFound = true;
|
||||
break;
|
||||
return record;
|
||||
}
|
||||
++counter;
|
||||
}
|
||||
} //endwhile
|
||||
if (!groupFound) {
|
||||
Base::Console().Message("LineGroup - group: %s is not found\n", groupName.c_str());
|
||||
}
|
||||
return record;
|
||||
// nothing was found
|
||||
Base::Console().Error("LineGroup: the LineGroup file has only %s entries but entry number %s is set\n"
|
||||
, std::to_string(counter).c_str()
|
||||
, std::to_string(groupNumber).c_str());
|
||||
return std::string(); // return an empty string
|
||||
}
|
||||
|
||||
//static LineGroup maker
|
||||
LineGroup* LineGroup::lineGroupFactory(std::string groupName)
|
||||
LineGroup* LineGroup::lineGroupFactory(int groupNumber)
|
||||
{
|
||||
LineGroup* lg = new LineGroup(groupName);
|
||||
LineGroup* lg = new LineGroup();
|
||||
|
||||
std::string lgFileName = Preferences::lineGroupFile();
|
||||
|
||||
std::string lgRecord = LineGroup::getRecordFromFile(lgFileName, groupName);
|
||||
std::string lgRecord = LineGroup::getRecordFromFile(lgFileName, groupNumber);
|
||||
|
||||
std::vector<double> values = LineGroup::split(lgRecord);
|
||||
if (values.size() < 4) {
|
||||
Base::Console().Message( "LineGroup::invalid entry in %s\n",groupName.c_str() );
|
||||
Base::Console().Error( "LineGroup::invalid entry in %s\n", lgFileName.c_str() );
|
||||
} else {
|
||||
lg->setWeight("Thin",values[0]);
|
||||
lg->setWeight("Graphic",values[1]);
|
||||
@@ -191,16 +178,47 @@ LineGroup* LineGroup::lineGroupFactory(std::string groupName)
|
||||
}
|
||||
|
||||
//valid weight names: Thick, Thin, Graphic, Extra
|
||||
double LineGroup::getDefaultWidth(std::string weightName, std::string groupName)
|
||||
double LineGroup::getDefaultWidth(std::string weightName, int groupNumber)
|
||||
{
|
||||
//default line weights
|
||||
std::string lgName = groupName;
|
||||
if (groupName.empty()) {
|
||||
lgName = Preferences::lineGroup();
|
||||
int lgNumber = groupNumber;
|
||||
if (lgNumber == -1) {
|
||||
lgNumber = Preferences::lineGroup();
|
||||
}
|
||||
auto lg = TechDraw::LineGroup::lineGroupFactory(lgName);
|
||||
auto lg = TechDraw::LineGroup::lineGroupFactory(lgNumber);
|
||||
|
||||
double weight = lg->getWeight(weightName);
|
||||
delete lg;
|
||||
return weight;
|
||||
}
|
||||
|
||||
//static support function: find group definition in file
|
||||
std::string LineGroup::getGroupNamesFromFile(std::string FileName)
|
||||
{
|
||||
std::string record;
|
||||
std::ifstream inFile;
|
||||
inFile.open(FileName, std::ifstream::in);
|
||||
if (!inFile.is_open()) {
|
||||
Base::Console().Message("Cannot open LineGroup file: %s\n", FileName.c_str());
|
||||
return record;
|
||||
}
|
||||
// parse the file
|
||||
while (inFile.good()) {
|
||||
std::string line;
|
||||
std::getline(inFile, line);
|
||||
std::string nameTag = line.substr(0, 1);
|
||||
std::string found;
|
||||
unsigned long int commaPos;
|
||||
if (nameTag == "*") {
|
||||
commaPos = line.find(',', 1);
|
||||
if (commaPos != std::string::npos) {
|
||||
found = line.substr(1, commaPos - 1);
|
||||
record = record + found + ',';
|
||||
}
|
||||
}
|
||||
} //endwhile
|
||||
if (record.empty()) {
|
||||
Base::Console().Message("LineGroup error: no group found in file %s\n", FileName.c_str());
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
@@ -47,13 +47,14 @@ public:
|
||||
static std::vector<double> split(std::string line);
|
||||
|
||||
//static support function: find group defn in file
|
||||
static std::string getRecordFromFile(std::string parmFile, std::string groupName);
|
||||
static std::string getRecordFromFile(std::string parmFile, int groupNumber);
|
||||
|
||||
//static LineGroup maker
|
||||
static LineGroup* lineGroupFactory(std::string groupName);
|
||||
static LineGroup* lineGroupFactory(int groupNumber);
|
||||
|
||||
static double getDefaultWidth(std::string weightName,
|
||||
std::string groupName = std::string());
|
||||
static double getDefaultWidth(std::string weightName, int groupNumber = -1);
|
||||
|
||||
static std::string getGroupNamesFromFile(std::string FileName);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
@@ -167,13 +167,13 @@ int Preferences::projectionAngle()
|
||||
return projType;
|
||||
}
|
||||
|
||||
std::string Preferences::lineGroup()
|
||||
int Preferences::lineGroup()
|
||||
{
|
||||
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter().
|
||||
GetGroup("BaseApp")->GetGroup("Preferences")->
|
||||
GetGroup("Mod/TechDraw/Decorations");
|
||||
std::string lgName = hGrp->GetASCII("LineGroup","FC 0.70mm");
|
||||
return lgName;
|
||||
int lgInt = hGrp->GetInt("LineGroup", 3); // FC 0.70mm
|
||||
return lgInt;
|
||||
}
|
||||
|
||||
int Preferences::balloonArrow()
|
||||
|
||||
@@ -59,7 +59,7 @@ static bool useGlobalDecimals();
|
||||
static bool keepPagesUpToDate();
|
||||
|
||||
static int projectionAngle();
|
||||
static std::string lineGroup();
|
||||
static int lineGroup();
|
||||
|
||||
static int balloonArrow();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user