Files
create/src/Mod/TechDraw/App/LineGroup.cpp
donovaly a1915d313a [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.
2020-12-03 17:24:49 +01:00

225 lines
6.9 KiB
C++

/***************************************************************************
* Copyright (c) 2017 WandererFan <wandererfan@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
#include <sstream>
#include <iomanip>
#include <stdexcept>
#endif
#include <App/Application.h>
#include <Base/Console.h>
#include <Base/Parameter.h>
#include "Preferences.h"
#include "LineGroup.h"
using namespace TechDraw;
LineGroup::LineGroup()
{
init();
}
LineGroup::LineGroup(std::string groupName)
{
init();
m_name = groupName;
}
LineGroup::~LineGroup()
{
}
void LineGroup::init(void)
{
m_name = "Default";
m_thin = 0.35;
m_graphic = 0.50;
m_thick = 0.70;
m_extra = 1.40;
}
double LineGroup::getWeight(std::string s)
{
double result = 0.55;
if (s == "Thin") {
result = m_thin;
} else if (s == "Graphic") {
result = m_graphic;
} else if (s == "Thick") {
result = m_thick;
} else if (s == "Extra") {
result = m_extra;
}
return result;
}
void LineGroup::setWeight(std::string s, double weight)
{
if (s == "Thin") {
m_thin = weight;
} else if (s == "Graphic") {
m_graphic = weight;
} else if (s == "Thick") {
m_thick = weight;
} else if (s == "Extra") {
m_extra = weight;
}
}
void LineGroup::dump(const char* title)
{
Base::Console().Message( "DUMP: %s\n",title);
Base::Console().Message( "Name: %s\n", m_name.c_str());
Base::Console().Message( "Thin: %.3f\n", m_thin);
Base::Console().Message( "Graphic: %.3f\n",m_graphic);
Base::Console().Message( "Thick: %.3f\n",m_thick);
Base::Console().Message( "Extra: %.3f\n",m_extra);
}
//static support function: split comma separated string of values into vector of numbers
std::vector<double> LineGroup::split(std::string line)
{
std::vector<double> result;
std::stringstream lineStream(line);
std::string cell;
bool nameCell = true;
while(std::getline(lineStream,cell, ','))
{
if (nameCell) {
nameCell = false;
continue;
}
try {
result.push_back(std::stod(cell));
}
catch (const std::invalid_argument& ia) {
Base::Console().Warning("Invalid number in cell: %s (%s) \n",cell.c_str(),ia.what());
result.push_back(0.0);
}
}
return result;
}
//static support function: find group definition in file
std::string LineGroup::getRecordFromFile(std::string parmFile, int groupNumber)
{
std::string record;
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;
}
// 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);
if (nameTag == "*") { // we found a definition line
if (counter == groupNumber) {
record = line;
return record;
}
++counter;
}
} //endwhile
// 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(int groupNumber)
{
LineGroup* lg = new LineGroup();
std::string lgFileName = Preferences::lineGroupFile();
std::string lgRecord = LineGroup::getRecordFromFile(lgFileName, groupNumber);
std::vector<double> values = LineGroup::split(lgRecord);
if (values.size() < 4) {
Base::Console().Error( "LineGroup::invalid entry in %s\n", lgFileName.c_str() );
} else {
lg->setWeight("Thin",values[0]);
lg->setWeight("Graphic",values[1]);
lg->setWeight("Thick",values[2]);
lg->setWeight("Extra",values[3]);
}
return lg;
}
//valid weight names: Thick, Thin, Graphic, Extra
double LineGroup::getDefaultWidth(std::string weightName, int groupNumber)
{
//default line weights
int lgNumber = groupNumber;
if (lgNumber == -1) {
lgNumber = Preferences::lineGroup();
}
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;
}