Command line options to export final measurements.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2017-09-28 16:05:04 +03:00
parent d01edb53c3
commit b673ec0fc7
15 changed files with 986 additions and 61 deletions

View File

@ -1,6 +1,6 @@
.\" Manpage for valentina. .\" Manpage for valentina.
.\" Contact dismine@gmail.com to correct errors. .\" Contact dismine@gmail.com to correct errors.
.TH valentina 1 "10 March, 2017" "valentina man page" .TH valentina 1 "28 September, 2017" "valentina man page"
.SH NAME .SH NAME
Valentina \- Pattern making program. Valentina \- Pattern making program.
.SH SYNOPSIS .SH SYNOPSIS
@ -106,6 +106,8 @@ The path to output destination folder. By default the directory at which the app
.RB "Export text as paths." .RB "Export text as paths."
.IP "--exportOnlyDetails" .IP "--exportOnlyDetails"
.RB "Export only details. Export details as they positioned in the details mode. Any layout related options will be ignored." .RB "Export only details. Export details as they positioned in the details mode. Any layout related options will be ignored."
.IP "--exportSuchDetails <The name regex>"
.RB "Export only details that match a piece name regex."
.IP "-x, --gsize <The size value>" .IP "-x, --gsize <The size value>"
.RB "Set size value a pattern file, that was opened with multisize measurements " "(export mode)" ". Valid values: 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56cm." .RB "Set size value a pattern file, that was opened with multisize measurements " "(export mode)" ". Valid values: 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56cm."
.IP "-e, --gheight <The height value>" .IP "-e, --gheight <The height value>"
@ -193,14 +195,366 @@ The path to output destination folder. By default the directory at which the app
Run the program in a test mode. The program in this mode loads a single pattern file and silently quit without showing the main window. The key have priority before key \*(lqbasename\*(rq. Run the program in a test mode. The program in this mode loads a single pattern file and silently quit without showing the main window. The key have priority before key \*(lqbasename\*(rq.
.IP "--no-scaling" .IP "--no-scaling"
.RB "Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable." .RB "Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable."
.IP "--csvWithHeader"
.RB "Export to csv with header. By default disabled."
.IP "--csvCodec <Codec name>"
.RB "Specify codec that will be used to save data. List of supported codecs provided by Qt. Default value depend from system. On Windows, the codec will be based on a system locale. On Unix systems, the codec will might fall back to using the iconv library if no builtin codec for the locale can be found. Valid values usually these:"
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " ISO-8859-1,"
.RE
.RS
.BR "*" " ISO-8859-2,"
.RE
.RS
.BR "*" " ISO-8859-3,"
.RE
.RS
.BR "*" " ISO-8859-4,"
.RE
.RS
.BR "*" " ISO-8859-5,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-7,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-8859-9,"
.RE
.RS
.BR "*" " ISO-8859-10,"
.RE
.RS
.BR "*" " ISO-2022-JP-1,"
.RE
.RS
.BR "*" " Shift_JIS,"
.RE
.RS
.BR "*" " EUC-JP,"
.RE
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " windows-949,"
.RE
.RS
.BR "*" " ISO-2022-KR,"
.RE
.RS
.BR "*" " windows-949,"
.RE
.RS
.BR "*" " ISO-2022-JP,"
.RE
.RS
.BR "*" " ISO-2022-JP-2,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-2022-CN,"
.RE
.RS
.BR "*" " ISO-2022-CN-EXT,"
.RE
.RS
.BR "*" " UTF-8,"
.RE
.RS
.BR "*" " ISO-8859-13,"
.RE
.RS
.BR "*" " ISO-8859-14,"
.RE
.RS
.BR "*" " ISO-8859-15,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " GB18030,"
.RE
.RS
.BR "*" " UTF-16,"
.RE
.RS
.BR "*" " UTF-32,"
.RE
.RS
.BR "*" " SCSU,"
.RE
.RS
.BR "*" " UTF-7,"
.RE
.RS
.BR "*" " UTF-16BE,"
.RE
.RS
.BR "*" " UTF-16LE,"
.RE
.RS
.BR "*" " UTF-16,"
.RE
.RS
.BR "*" " CESU-8,"
.RE
.RS
.BR "*" " UTF-32,"
.RE
.RS
.BR "*" " UTF-32BE,"
.RE
.RS
.BR "*" " UTF-32LE,"
.RE
.RS
.BR "*" " BOCU-1,"
.RE
.RS
.BR "*" " hp-roman8,"
.RE
.RS
.BR "*" " Adobe-Standard-Encoding,"
.RE
.RS
.BR "*" " IBM850,"
.RE
.RS
.BR "*" " IBM862,"
.RE
.RS
.BR "*" " IBM-Thai,"
.RE
.RS
.BR "*" " Shift_JIS,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " Big5,"
.RE
.RS
.BR "*" " macintosh,"
.RE
.RS
.BR "*" " IBM037,"
.RE
.RS
.BR "*" " IBM273,"
.RE
.RS
.BR "*" " IBM277,"
.RE
.RS
.BR "*" " IBM278,"
.RE
.RS
.BR "*" " IBM280,"
.RE
.RS
.BR "*" " IBM284,"
.RE
.RS
.BR "*" " IBM285,"
.RE
.RS
.BR "*" " IBM290,"
.RE
.RS
.BR "*" " IBM297,"
.RE
.RS
.BR "*" " IBM420,"
.RE
.RS
.BR "*" " IBM424,"
.RE
.RS
.BR "*" " IBM437,"
.RE
.RS
.BR "*" " IBM500,"
.RE
.RS
.BR "*" " cp851,"
.RE
.RS
.BR "*" " IBM852,"
.RE
.RS
.BR "*" " IBM855,"
.RE
.RS
.BR "*" " IBM857,"
.RE
.RS
.BR "*" " IBM860,"
.RE
.RS
.BR "*" " IBM861,"
.RE
.RS
.BR "*" " IBM863,"
.RE
.RS
.BR "*" " IBM864,"
.RE
.RS
.BR "*" " IBM865,"
.RE
.RS
.BR "*" " IBM868,"
.RE
.RS
.BR "*" " IBM869,"
.RE
.RS
.BR "*" " IBM870,"
.RE
.RS
.BR "*" " IBM871,"
.RE
.RS
.BR "*" " IBM918,"
.RE
.RS
.BR "*" " IBM1026,"
.RE
.RS
.BR "*" " KOI8-R,"
.RE
.RS
.BR "*" " HZ-GB-2312,"
.RE
.RS
.BR "*" " IBM866,"
.RE
.RS
.BR "*" " IBM775,"
.RE
.RS
.BR "*" " KOI8-U,"
.RE
.RS
.BR "*" " IBM00858,"
.RE
.RS
.BR "*" " IBM01140,"
.RE
.RS
.BR "*" " IBM01141,"
.RE
.RS
.BR "*" " IBM01142,"
.RE
.RS
.BR "*" " IBM01143,"
.RE
.RS
.BR "*" " IBM01144,"
.RE
.RS
.BR "*" " IBM01145,"
.RE
.RS
.BR "*" " IBM01146,"
.RE
.RS
.BR "*" " IBM01147,"
.RE
.RS
.BR "*" " IBM01148,"
.RE
.RS
.BR "*" " IBM01149,"
.RE
.RS
.BR "*" " Big5-HKSCS,"
.RE
.RS
.BR "*" " IBM1047,"
.RE
.RS
.BR "*" " windows-1250,"
.RE
.RS
.BR "*" " windows-1251,"
.RE
.RS
.BR "*" " windows-1252,"
.RE
.RS
.BR "*" " windows-1253,"
.RE
.RS
.BR "*" " windows-1254,"
.RE
.RS
.BR "*" " windows-1255,"
.RE
.RS
.BR "*" " windows-1256,"
.RE
.RS
.BR "*" " windows-1257,"
.RE
.RS
.BR "*" " windows-1258,"
.RE
.RS
.BR "*" " TIS-620,"
.RE
.RS
.BR "*" " TSCII."
.RE
.IP "--csvSeparator <Separator character>"
.RB "Specify csv separator character. Default value is ','. Valid characters:"
.RS
.BR "*" " 'Tab',"
.RE
.RS
.BR "*" " ';',"
.RE
.RS
.BR "*" " 'Space',"
.RE
.RS
.BR "*" " ','."
.RE
.IP "--csvExportFM <Path to csv file>"
.RB "Calling this command enable exporting final measurements. Specify path to csv file with final measurements. The path must contain path to directory and name of file. It can be absolute or relatetive. In case of relative path will be used current working directory to calc a destination path."
.IP Arguments: .IP Arguments:
.I filename .I filename
\- a pattern file. \- a pattern file.
.SH AUTHOR .SH AUTHOR
.RI "This manual page was written by Roman Telezhynskyi <" dismine@gmail.com ">" .RI "This manual page was written by Roman Telezhynskyi <" dismine@gmail.com ">"
.SH "SEE ALSO" .SH "SEE ALSO"
.RB "Full " "User Manual" " is availiable in"
.UR https://bitbucket.org/dismine/valentina/wiki/manual/Content
.UE
.BR tape (1) .BR tape (1)

View File

@ -1,6 +1,6 @@
.\" Manpage for valentina. .\" Manpage for valentina.
.\" Contact dismine@gmail.com to correct errors. .\" Contact dismine@gmail.com to correct errors.
.TH valentina 1 "22 September, 2017" "valentina man page" .TH valentina 1 "28 September, 2017" "valentina man page"
.SH NAME .SH NAME
Valentina \- Pattern making program. Valentina \- Pattern making program.
.SH SYNOPSIS .SH SYNOPSIS
@ -195,6 +195,362 @@ The path to output destination folder. By default the directory at which the app
Run the program in a test mode. The program in this mode loads a single pattern file and silently quit without showing the main window. The key have priority before key \*(lqbasename\*(rq. Run the program in a test mode. The program in this mode loads a single pattern file and silently quit without showing the main window. The key have priority before key \*(lqbasename\*(rq.
.IP "--no-scaling" .IP "--no-scaling"
.RB "Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable." .RB "Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable."
.IP "--csvWithHeader"
.RB "Export to csv with header. By default disabled."
.IP "--csvCodec <Codec name>"
.RB "Specify codec that will be used to save data. List of supported codecs provided by Qt. Default value depend from system. On Windows, the codec will be based on a system locale. On Unix systems, the codec will might fall back to using the iconv library if no builtin codec for the locale can be found. Valid values usually these:"
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " ISO-8859-1,"
.RE
.RS
.BR "*" " ISO-8859-2,"
.RE
.RS
.BR "*" " ISO-8859-3,"
.RE
.RS
.BR "*" " ISO-8859-4,"
.RE
.RS
.BR "*" " ISO-8859-5,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-7,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-8859-9,"
.RE
.RS
.BR "*" " ISO-8859-10,"
.RE
.RS
.BR "*" " ISO-2022-JP-1,"
.RE
.RS
.BR "*" " Shift_JIS,"
.RE
.RS
.BR "*" " EUC-JP,"
.RE
.RS
.BR "*" " US-ASCII,"
.RE
.RS
.BR "*" " windows-949,"
.RE
.RS
.BR "*" " ISO-2022-KR,"
.RE
.RS
.BR "*" " windows-949,"
.RE
.RS
.BR "*" " ISO-2022-JP,"
.RE
.RS
.BR "*" " ISO-2022-JP-2,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-6,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-8859-8,"
.RE
.RS
.BR "*" " ISO-2022-CN,"
.RE
.RS
.BR "*" " ISO-2022-CN-EXT,"
.RE
.RS
.BR "*" " UTF-8,"
.RE
.RS
.BR "*" " ISO-8859-13,"
.RE
.RS
.BR "*" " ISO-8859-14,"
.RE
.RS
.BR "*" " ISO-8859-15,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " GB18030,"
.RE
.RS
.BR "*" " UTF-16,"
.RE
.RS
.BR "*" " UTF-32,"
.RE
.RS
.BR "*" " SCSU,"
.RE
.RS
.BR "*" " UTF-7,"
.RE
.RS
.BR "*" " UTF-16BE,"
.RE
.RS
.BR "*" " UTF-16LE,"
.RE
.RS
.BR "*" " UTF-16,"
.RE
.RS
.BR "*" " CESU-8,"
.RE
.RS
.BR "*" " UTF-32,"
.RE
.RS
.BR "*" " UTF-32BE,"
.RE
.RS
.BR "*" " UTF-32LE,"
.RE
.RS
.BR "*" " BOCU-1,"
.RE
.RS
.BR "*" " hp-roman8,"
.RE
.RS
.BR "*" " Adobe-Standard-Encoding,"
.RE
.RS
.BR "*" " IBM850,"
.RE
.RS
.BR "*" " IBM862,"
.RE
.RS
.BR "*" " IBM-Thai,"
.RE
.RS
.BR "*" " Shift_JIS,"
.RE
.RS
.BR "*" " GBK,"
.RE
.RS
.BR "*" " Big5,"
.RE
.RS
.BR "*" " macintosh,"
.RE
.RS
.BR "*" " IBM037,"
.RE
.RS
.BR "*" " IBM273,"
.RE
.RS
.BR "*" " IBM277,"
.RE
.RS
.BR "*" " IBM278,"
.RE
.RS
.BR "*" " IBM280,"
.RE
.RS
.BR "*" " IBM284,"
.RE
.RS
.BR "*" " IBM285,"
.RE
.RS
.BR "*" " IBM290,"
.RE
.RS
.BR "*" " IBM297,"
.RE
.RS
.BR "*" " IBM420,"
.RE
.RS
.BR "*" " IBM424,"
.RE
.RS
.BR "*" " IBM437,"
.RE
.RS
.BR "*" " IBM500,"
.RE
.RS
.BR "*" " cp851,"
.RE
.RS
.BR "*" " IBM852,"
.RE
.RS
.BR "*" " IBM855,"
.RE
.RS
.BR "*" " IBM857,"
.RE
.RS
.BR "*" " IBM860,"
.RE
.RS
.BR "*" " IBM861,"
.RE
.RS
.BR "*" " IBM863,"
.RE
.RS
.BR "*" " IBM864,"
.RE
.RS
.BR "*" " IBM865,"
.RE
.RS
.BR "*" " IBM868,"
.RE
.RS
.BR "*" " IBM869,"
.RE
.RS
.BR "*" " IBM870,"
.RE
.RS
.BR "*" " IBM871,"
.RE
.RS
.BR "*" " IBM918,"
.RE
.RS
.BR "*" " IBM1026,"
.RE
.RS
.BR "*" " KOI8-R,"
.RE
.RS
.BR "*" " HZ-GB-2312,"
.RE
.RS
.BR "*" " IBM866,"
.RE
.RS
.BR "*" " IBM775,"
.RE
.RS
.BR "*" " KOI8-U,"
.RE
.RS
.BR "*" " IBM00858,"
.RE
.RS
.BR "*" " IBM01140,"
.RE
.RS
.BR "*" " IBM01141,"
.RE
.RS
.BR "*" " IBM01142,"
.RE
.RS
.BR "*" " IBM01143,"
.RE
.RS
.BR "*" " IBM01144,"
.RE
.RS
.BR "*" " IBM01145,"
.RE
.RS
.BR "*" " IBM01146,"
.RE
.RS
.BR "*" " IBM01147,"
.RE
.RS
.BR "*" " IBM01148,"
.RE
.RS
.BR "*" " IBM01149,"
.RE
.RS
.BR "*" " Big5-HKSCS,"
.RE
.RS
.BR "*" " IBM1047,"
.RE
.RS
.BR "*" " windows-1250,"
.RE
.RS
.BR "*" " windows-1251,"
.RE
.RS
.BR "*" " windows-1252,"
.RE
.RS
.BR "*" " windows-1253,"
.RE
.RS
.BR "*" " windows-1254,"
.RE
.RS
.BR "*" " windows-1255,"
.RE
.RS
.BR "*" " windows-1256,"
.RE
.RS
.BR "*" " windows-1257,"
.RE
.RS
.BR "*" " windows-1258,"
.RE
.RS
.BR "*" " TIS-620,"
.RE
.RS
.BR "*" " TSCII."
.RE
.IP "--csvSeparator <Separator character>"
.RB "Specify csv separator character. Default value is ','. Valid characters:"
.RS
.BR "*" " 'Tab',"
.RE
.RS
.BR "*" " ';',"
.RE
.RS
.BR "*" " 'Space',"
.RE
.RS
.BR "*" " ','."
.RE
.IP "--csvExportFM <Path to csv file>"
.RB "Calling this command enable exporting final measurements. Specify path to csv file with final measurements. The path must contain path to directory and name of file. It can be absolute or relatetive. In case of relative path will be used current working directory to calc a destination path."
.IP Arguments: .IP Arguments:
.I filename .I filename
\- a pattern file. \- a pattern file.

View File

@ -707,7 +707,8 @@ void TMainWindow::ExportToCSVData(const QString &fileName, bool withHeader, int
} }
} }
csv.toCSV(fileName, withHeader, separator, QTextCodec::codecForMib(mib)); QString error;
csv.toCSV(fileName, error, withHeader, separator, QTextCodec::codecForMib(mib));
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -33,8 +33,10 @@
#include "../vformat/vmeasurements.h" #include "../vformat/vmeasurements.h"
#include "../vmisc/commandoptions.h" #include "../vmisc/commandoptions.h"
#include "../vmisc/vsettings.h" #include "../vmisc/vsettings.h"
#include "../vmisc/dialogs/dialogexporttocsv.h"
#include "../vlayout/vlayoutgenerator.h" #include "../vlayout/vlayoutgenerator.h"
#include <QDebug> #include <QDebug>
#include <QTextCodec>
VCommandLinePtr VCommandLine::instance = nullptr; VCommandLinePtr VCommandLine::instance = nullptr;
@ -278,6 +280,46 @@ void VCommandLine::InitOptions(VCommandLineOptions &options, QMap<QString, int>
"enabled). Alternatively you can use the " "enabled). Alternatively you can use the "
"%1 environment variable.") "%1 environment variable.")
.arg("QT_AUTO_SCREEN_SCALE_FACTOR=0"))); .arg("QT_AUTO_SCREEN_SCALE_FACTOR=0")));
//=================================================================================================================
optionsIndex.insert(LONG_OPTION_CSVWITHHEADER, index++);
options.append(new QCommandLineOption(QStringList() << LONG_OPTION_CSVWITHHEADER,
translate("VCommandLine", "Export to csv with header. By default "
"disabled.")));
optionsIndex.insert(LONG_OPTION_CSVCODEC, index++);
options.append(new QCommandLineOption(QStringList() << LONG_OPTION_CSVCODEC,
translate("VCommandLine", "Specify codec that will be used to save data. List"
" of supported codecs provided by Qt. Default "
"value depend from system. On Windows, the codec "
"will be based on a system locale. On Unix "
"systems, the codec will might fall back to using "
"the iconv library if no builtin codec for the "
"locale can be found. Valid values for this "
"installation:")
+ DialogExportToCSV::MakeHelpCodecsList(),
translate("VCommandLine", "Codec name"), QString("%1")
.arg(QString(QTextCodec::codecForLocale()->name()))));
optionsIndex.insert(LONG_OPTION_CSVSEPARATOR, index++);
options.append(new QCommandLineOption(QStringList() << LONG_OPTION_CSVSEPARATOR,
translate("VCommandLine", "Specify csv separator character. Default value "
"is '%1'. Valid characters:")
.arg(VCommonSettings::GetDefCSVSeparator()) +
DialogExportToCSV::MakeHelpSeparatorList(),
translate("VCommandLine", "Separator character"), QString("%1")
.arg(VCommonSettings::GetDefCSVSeparator())));
optionsIndex.insert(LONG_OPTION_CSVEXPORTFM, index++);
options.append(new QCommandLineOption(QStringList() << LONG_OPTION_CSVEXPORTFM,
translate("VCommandLine", "Calling this command enable exporting final "
"measurements. Specify path to csv file with "
"final measurements. The path must contain path "
"to directory and name of file. It can be "
"absolute or relatetive. In case of "
"relative path will be used current working "
"directory to calc a destination path."),
translate("VCommandLine", "Path to csv file")));
} }
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
@ -499,7 +541,9 @@ VCommandLinePtr VCommandLine::Get(const QCoreApplication& app)
instance->parser.process(app); instance->parser.process(app);
//fixme: in case of additional options/modes which will need to disable GUI - add it here too //fixme: in case of additional options/modes which will need to disable GUI - add it here too
instance->isGuiEnabled = not (instance->IsExportEnabled() || instance->IsTestModeEnabled()); instance->isGuiEnabled = not (instance->IsExportEnabled()
|| instance->IsTestModeEnabled()
|| instance->IsExportFMEnabled());
return instance; return instance;
} }
@ -547,6 +591,18 @@ bool VCommandLine::IsExportEnabled() const
return r; return r;
} }
//---------------------------------------------------------------------------------------------------------------------
bool VCommandLine::IsExportFMEnabled() const
{
const bool r = parser.isSet(*optionsUsed.value(optionsIndex.value(LONG_OPTION_CSVEXPORTFM)));
if (r && parser.positionalArguments().size() != 1)
{
qCritical() << translate("VCommandLine", "Export options can be used with single input file only.") << "/n";
const_cast<VCommandLine*>(this)->parser.showHelp(V_EX_USAGE);
}
return r;
}
//------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------
DialogLayoutSettings::PaperSizeTemplate VCommandLine::OptPaperSize() const DialogLayoutSettings::PaperSizeTemplate VCommandLine::OptPaperSize() const
{ {
@ -655,6 +711,12 @@ int VCommandLine::IsExportOnlyDetails() const
return parser.isSet(*optionsUsed.value(optionsIndex.value(LONG_OPTION_EXPORTONLYDETAILS))); return parser.isSet(*optionsUsed.value(optionsIndex.value(LONG_OPTION_EXPORTONLYDETAILS)));
} }
//---------------------------------------------------------------------------------------------------------------------
int VCommandLine::IsCSVWithHeader() const
{
return parser.isSet(*optionsUsed.value(optionsIndex.value(LONG_OPTION_CSVWITHHEADER)));
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QString VCommandLine::OptExportSuchDetails() const QString VCommandLine::OptExportSuchDetails() const
{ {
@ -667,6 +729,32 @@ QString VCommandLine::OptExportSuchDetails() const
return path; return path;
} }
//---------------------------------------------------------------------------------------------------------------------
QString VCommandLine::OptCSVCodecName() const
{
return parser.value(*optionsUsed.value(optionsIndex.value(LONG_OPTION_CSVCODEC)));
}
//---------------------------------------------------------------------------------------------------------------------
QChar VCommandLine::OptCSVSeparator() const
{
const QString value = parser.value(*optionsUsed.value(optionsIndex.value(LONG_OPTION_CSVSEPARATOR)));
if (not value.isEmpty())
{
return value.at(0);
}
else
{
return QChar();
}
}
//---------------------------------------------------------------------------------------------------------------------
QString VCommandLine::OptExportFMTo() const
{
return parser.value(*optionsUsed.value(optionsIndex.value(LONG_OPTION_CSVEXPORTFM)));
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QStringList VCommandLine::OptInputFileNames() const QStringList VCommandLine::OptInputFileNames() const
{ {

View File

@ -62,6 +62,10 @@ public:
//export enabled //export enabled
bool IsExportEnabled() const; bool IsExportEnabled() const;
//@brief tests if user enabled export final measurements from cmd, throws exception if not exactly 1 input VAL
//file supplied in case export enabled
bool IsExportFMEnabled() const;
//@brief returns path to custom measure file or empty string //@brief returns path to custom measure file or empty string
QString OptMeasurePath() const; QString OptMeasurePath() const;
@ -78,10 +82,20 @@ public:
int IsBinaryDXF() const; int IsBinaryDXF() const;
int IsTextAsPaths() const; int IsTextAsPaths() const;
int IsExportOnlyDetails() const; int IsExportOnlyDetails() const;
int IsCSVWithHeader() const;
//@brief returns the piece name regex or empty string if not set //@brief returns the piece name regex or empty string if not set
QString OptExportSuchDetails() const; QString OptExportSuchDetails() const;
//@brief returns user selected csv codec or empty string if not set
QString OptCSVCodecName() const;
//@brief returns user selected csv separator or empty string if not set
QChar OptCSVSeparator() const;
//@brief returns the destination path for export final measurements or empty string if not set
QString OptExportFMTo() const;
//generator creation is moved here ... because most options are for it only, so no need to create extra getters... //generator creation is moved here ... because most options are for it only, so no need to create extra getters...
//@brief creates VLayoutGenerator //@brief creates VLayoutGenerator
VLayoutGeneratorPtr DefaultGenerator() const; VLayoutGeneratorPtr DefaultGenerator() const;

View File

@ -1535,7 +1535,8 @@ void MainWindow::ExportToCSVData(const QString &fileName, bool withHeader, int m
SavePreviewCalculation(false); SavePreviewCalculation(false);
SavePreviewCalculation(true); SavePreviewCalculation(true);
csv.toCSV(fileName, withHeader, separator, QTextCodec::codecForMib(mib)); QString error;
csv.toCSV(fileName, error, withHeader, separator, QTextCodec::codecForMib(mib));
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -4841,7 +4842,7 @@ void MainWindow::ZoomFirstShow()
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void MainWindow::DoExport(const VCommandLinePtr &expParams) bool MainWindow::DoExport(const VCommandLinePtr &expParams)
{ {
QHash<quint32, VPiece> details; QHash<quint32, VPiece> details;
if(not qApp->getOpeningPattern()) if(not qApp->getOpeningPattern())
@ -4851,7 +4852,7 @@ void MainWindow::DoExport(const VCommandLinePtr &expParams)
{ {
qCCritical(vMainWindow, "%s", qUtf8Printable(tr("You can't export empty scene."))); qCCritical(vMainWindow, "%s", qUtf8Printable(tr("You can't export empty scene.")));
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
return; return false;
} }
else else
{ {
@ -4887,7 +4888,7 @@ void MainWindow::DoExport(const VCommandLinePtr &expParams)
qCCritical(vMainWindow, "%s", qUtf8Printable(tr("You can't export empty scene. Please, " qCCritical(vMainWindow, "%s", qUtf8Printable(tr("You can't export empty scene. Please, "
"include at least one detail in layout."))); "include at least one detail in layout.")));
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
return; return false;
} }
} }
} }
@ -4910,7 +4911,7 @@ void MainWindow::DoExport(const VCommandLinePtr &expParams)
{ {
qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export error.")), qUtf8Printable(e.ErrorMessage())); qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export error.")), qUtf8Printable(e.ErrorMessage()));
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
return; return false;
} }
} }
else else
@ -4934,16 +4935,61 @@ void MainWindow::DoExport(const VCommandLinePtr &expParams)
qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export error.")), qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export error.")),
qUtf8Printable(e.ErrorMessage())); qUtf8Printable(e.ErrorMessage()));
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
return; return false;
} }
} }
else else
{ {
return; qApp->exit(V_EX_DATAERR);
return false;
} }
} }
qApp->exit(V_EX_OK); return true;
}
//---------------------------------------------------------------------------------------------------------------------
/**
* @brief DoFMExport process export final measurements
* @param expParams command line options
* @return true if succesfull
*/
bool MainWindow::DoFMExport(const VCommandLinePtr &expParams)
{
QString filePath = expParams->OptExportFMTo();
if (filePath.isEmpty())
{
qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export final measurements error.")),
qUtf8Printable(tr("Destination path is empty.")));
qApp->exit(V_EX_DATAERR);
return false;
}
QFileInfo info(filePath);
if (info.isRelative())
{
filePath = QDir::currentPath() + QLatin1Char('/') + filePath;
}
const QString codecName = expParams->OptCSVCodecName();
int mib = QTextCodec::codecForLocale()->mibEnum();
if (not codecName.isEmpty())
{
if (QTextCodec *codec = QTextCodec::codecForName(codecName.toLatin1()))
{
mib = codec->mibEnum();
}
}
QChar separator = expParams->OptCSVSeparator();
if (separator.isNull())
{
separator = VCommonSettings::GetDefCSVSeparator();
}
return ExportFMeasurementsToCSVData(filePath, expParams->IsCSVWithHeader(), mib, separator);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -5043,6 +5089,11 @@ void MainWindow::ProcessCMD()
if (VApplication::IsGUIMode()) if (VApplication::IsGUIMode())
{ {
ReopenFilesAfterCrash(args); ReopenFilesAfterCrash(args);
for (int i=0, sz = args.size(); i < sz; ++i)
{
LoadPattern(args.at(i));
}
} }
else else
{ {
@ -5052,53 +5103,45 @@ void MainWindow::ProcessCMD()
qApp->exit(V_EX_NOINPUT); qApp->exit(V_EX_NOINPUT);
return; return;
} }
}
for (int i=0, sz = args.size(); i < sz; ++i) const bool loaded = LoadPattern(args.first(), cmd->OptMeasurePath());
{
const bool loaded = LoadPattern(args.at(static_cast<int>(i)), cmd->OptMeasurePath());
if (not loaded && not VApplication::IsGUIMode()) if (not loaded)
{ {
return; // process only one input file return; // process only one input file
} }
bool hSetted = true; bool hSetted = true;
bool sSetted = true; bool sSetted = true;
if (loaded && (cmd->IsTestModeEnabled() || cmd->IsExportEnabled())) if (cmd->IsSetGradationSize())
{ {
if (cmd->IsSetGradationSize()) sSetted = SetSize(cmd->OptGradationSize());
{ }
sSetted = SetSize(cmd->OptGradationSize());
}
if (cmd->IsSetGradationHeight()) if (cmd->IsSetGradationHeight())
{ {
hSetted = SetHeight(cmd->OptGradationHeight()); hSetted = SetHeight(cmd->OptGradationHeight());
} }
if (not (hSetted && sSetted))
{
qApp->exit(V_EX_DATAERR);
return;
} }
if (not cmd->IsTestModeEnabled()) if (not cmd->IsTestModeEnabled())
{ {
if (cmd->IsExportEnabled()) if (cmd->IsExportEnabled() && not DoExport(cmd))
{ {
if (loaded && hSetted && sSetted) return;
{ }
DoExport(cmd);
return; // process only one input file if (cmd->IsExportFMEnabled() && not DoFMExport(cmd))
} {
else return;
{
qApp->exit(V_EX_DATAERR);
return;
}
break;
} }
} }
}
if (not VApplication::IsGUIMode())
{
qApp->exit(V_EX_OK);// close program after processing in console mode qApp->exit(V_EX_OK);// close program after processing in console mode
} }
} }

View File

@ -351,7 +351,8 @@ private:
void CheckRequiredMeasurements(const VMeasurements *m); void CheckRequiredMeasurements(const VMeasurements *m);
void ReopenFilesAfterCrash(QStringList &args); void ReopenFilesAfterCrash(QStringList &args);
void DoExport(const VCommandLinePtr& expParams); bool DoExport(const VCommandLinePtr& expParams);
bool DoFMExport(const VCommandLinePtr& expParams);
bool SetSize(const QString &text); bool SetSize(const QString &text);
bool SetHeight(const QString & text); bool SetHeight(const QString & text);

View File

@ -1572,7 +1572,7 @@ void MainWindowsNoGUI::SetSizeHeightForIndividualM() const
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void MainWindowsNoGUI::ExportFMeasurementsToCSVData(const QString &fileName, bool withHeader, int mib, bool MainWindowsNoGUI::ExportFMeasurementsToCSVData(const QString &fileName, bool withHeader, int mib,
const QChar &separator) const const QChar &separator) const
{ {
QxtCsvModel csv; QxtCsvModel csv;
@ -1617,7 +1617,7 @@ void MainWindowsNoGUI::ExportFMeasurementsToCSVData(const QString &fileName, boo
{ {
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
} }
return; return false;
} }
} }
catch (qmu::QmuParserError &e) catch (qmu::QmuParserError &e)
@ -1628,12 +1628,25 @@ void MainWindowsNoGUI::ExportFMeasurementsToCSVData(const QString &fileName, boo
{ {
qApp->exit(V_EX_DATAERR); qApp->exit(V_EX_DATAERR);
} }
return; return false;
} }
} }
} }
csv.toCSV(fileName, withHeader, separator, QTextCodec::codecForMib(mib)); QString error;
const bool success = csv.toCSV(fileName, error, withHeader, separator, QTextCodec::codecForMib(mib));
if (not success)
{
qCritical("%s\n\n%s", qUtf8Printable(tr("Export final measurements error.")),
qUtf8Printable(tr("File error %1.").arg(error)));
if (not VApplication::IsGUIMode())
{
qApp->exit(V_EX_CANTCREAT);
}
}
return success;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -103,7 +103,7 @@ protected:
QString FileName() const; QString FileName() const;
void SetSizeHeightForIndividualM() const; void SetSizeHeightForIndividualM() const;
void ExportFMeasurementsToCSVData(const QString &fileName, bool ExportFMeasurementsToCSVData(const QString &fileName,
bool withHeader, int mib, const QChar &separator) const; bool withHeader, int mib, const QChar &separator) const;
private slots: private slots:
void PrintPages (QPrinter *printer); void PrintPages (QPrinter *printer);

View File

@ -111,6 +111,11 @@ const QString SINGLE_OPTION_TOP_MARGIN = QStringLiteral("T");
const QString LONG_OPTION_BOTTOM_MARGIN = QStringLiteral("bmargin"); const QString LONG_OPTION_BOTTOM_MARGIN = QStringLiteral("bmargin");
const QString SINGLE_OPTION_BOTTOM_MARGIN = QStringLiteral("B"); const QString SINGLE_OPTION_BOTTOM_MARGIN = QStringLiteral("B");
const QString LONG_OPTION_CSVWITHHEADER = QStringLiteral("csvWithHeader");
const QString LONG_OPTION_CSVCODEC = QStringLiteral("csvCodec");
const QString LONG_OPTION_CSVSEPARATOR = QStringLiteral("csvSeparator");
const QString LONG_OPTION_CSVEXPORTFM = QStringLiteral("csvExportFM");
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QStringList AllKeys() QStringList AllKeys()
{ {
@ -143,7 +148,11 @@ QStringList AllKeys()
<< LONG_OPTION_RIGHT_MARGIN << SINGLE_OPTION_RIGHT_MARGIN << LONG_OPTION_RIGHT_MARGIN << SINGLE_OPTION_RIGHT_MARGIN
<< LONG_OPTION_TOP_MARGIN << SINGLE_OPTION_TOP_MARGIN << LONG_OPTION_TOP_MARGIN << SINGLE_OPTION_TOP_MARGIN
<< LONG_OPTION_BOTTOM_MARGIN << SINGLE_OPTION_BOTTOM_MARGIN << LONG_OPTION_BOTTOM_MARGIN << SINGLE_OPTION_BOTTOM_MARGIN
<< LONG_OPTION_NO_HDPI_SCALING; << LONG_OPTION_NO_HDPI_SCALING
<< LONG_OPTION_CSVWITHHEADER
<< LONG_OPTION_CSVCODEC
<< LONG_OPTION_CSVSEPARATOR
<< LONG_OPTION_CSVEXPORTFM;
return list; return list;
} }

View File

@ -108,6 +108,11 @@ extern const QString SINGLE_OPTION_TOP_MARGIN;
extern const QString LONG_OPTION_BOTTOM_MARGIN; extern const QString LONG_OPTION_BOTTOM_MARGIN;
extern const QString SINGLE_OPTION_BOTTOM_MARGIN; extern const QString SINGLE_OPTION_BOTTOM_MARGIN;
extern const QString LONG_OPTION_CSVWITHHEADER;
extern const QString LONG_OPTION_CSVCODEC;
extern const QString LONG_OPTION_CSVSEPARATOR;
extern const QString LONG_OPTION_CSVEXPORTFM;
QStringList AllKeys(); QStringList AllKeys();
#endif // COMMANDOPTIONS_H #endif // COMMANDOPTIONS_H

View File

@ -51,7 +51,7 @@ DialogExportToCSV::DialogExportToCSV(QWidget *parent)
ui->comboBoxCodec->setCurrentIndex(ui->comboBoxCodec->findData(VCommonSettings::GetDefCSVCodec())); ui->comboBoxCodec->setCurrentIndex(ui->comboBoxCodec->findData(VCommonSettings::GetDefCSVCodec()));
SetSeparator(qApp->Settings()->GetDefCSVSeparator()); SetSeparator(VCommonSettings::GetDefCSVSeparator());
QPushButton *bDefaults = ui->buttonBox->button(QDialogButtonBox::RestoreDefaults); QPushButton *bDefaults = ui->buttonBox->button(QDialogButtonBox::RestoreDefaults);
SCASSERT(bDefaults != nullptr) SCASSERT(bDefaults != nullptr)
@ -60,7 +60,7 @@ DialogExportToCSV::DialogExportToCSV(QWidget *parent)
ui->checkBoxWithHeader->setChecked(qApp->Settings()->GetDefCSVWithHeader()); ui->checkBoxWithHeader->setChecked(qApp->Settings()->GetDefCSVWithHeader());
ui->comboBoxCodec->setCurrentIndex(ui->comboBoxCodec->findData(VCommonSettings::GetDefCSVCodec())); ui->comboBoxCodec->setCurrentIndex(ui->comboBoxCodec->findData(VCommonSettings::GetDefCSVCodec()));
SetSeparator(qApp->Settings()->GetDefCSVSeparator()); SetSeparator(VCommonSettings::GetDefCSVSeparator());
}); });
} }
@ -126,7 +126,7 @@ QChar DialogExportToCSV::GetSeparator() const
} }
else else
{ {
return QChar(','); return VCommonSettings::GetDefCSVSeparator();
} }
} }
@ -184,3 +184,34 @@ void DialogExportToCSV::SetSeparator(const QChar &separator)
break; break;
} }
} }
//---------------------------------------------------------------------------------------------------------------------
QString DialogExportToCSV::MakeHelpCodecsList()
{
QString out("\n");
const QList<int> list = QTextCodec::availableMibs();
for (int i = 0; i < list.size(); ++i)
{
out += QLatin1String("\t* ") + QTextCodec::codecForMib(list.at(i))->name();
if (i < list.size()-1)
{
out += QLatin1String(",\n");
}
else
{
out += QLatin1String(".\n");
}
}
return out;
}
//---------------------------------------------------------------------------------------------------------------------
QString DialogExportToCSV::MakeHelpSeparatorList()
{
QString out("\n");
out += QLatin1String("\t* 'Tab',\n");
out += QLatin1String("\t* ';',\n");
out += QLatin1String("\t* 'Space',\n");
out += QLatin1String("\t* ','.\n");
return out;
}

View File

@ -53,6 +53,9 @@ public:
QChar GetSeparator() const; QChar GetSeparator() const;
void SetSeparator(const QChar &separator); void SetSeparator(const QChar &separator);
static QString MakeHelpCodecsList();
static QString MakeHelpSeparatorList();
protected: protected:
virtual void changeEvent(QEvent* event) Q_DECL_OVERRIDE; virtual void changeEvent(QEvent* event) Q_DECL_OVERRIDE;
virtual void showEvent(QShowEvent *event) Q_DECL_OVERRIDE; virtual void showEvent(QShowEvent *event) Q_DECL_OVERRIDE;

View File

@ -591,7 +591,7 @@ static QString qxt_addCsvQuotes(QxtCsvModel::QuoteMode mode, QString field)
to output a row of headers at the top of the file. to output a row of headers at the top of the file.
*/ */
// cppcheck-suppress funcArgNamesDifferent // cppcheck-suppress funcArgNamesDifferent
void QxtCsvModel::toCSV(QIODevice* dest, bool withHeader, QChar separator, QTextCodec* codec) const bool QxtCsvModel::toCSV(QIODevice* dest, QString &error, bool withHeader, QChar separator, QTextCodec* codec) const
{ {
const QxtCsvModelPrivate& d_ptr = qxt_d(); const QxtCsvModelPrivate& d_ptr = qxt_d();
int row, col, rows, cols; int row, col, rows, cols;
@ -600,7 +600,11 @@ void QxtCsvModel::toCSV(QIODevice* dest, bool withHeader, QChar separator, QText
QString data; QString data;
if (not dest->isOpen()) if (not dest->isOpen())
{ {
dest->open(QIODevice::WriteOnly | QIODevice::Truncate); if ( not dest->open(QIODevice::WriteOnly | QIODevice::Truncate))
{
error = dest->errorString();
return false;
}
} }
QTextStream stream(dest); QTextStream stream(dest);
if (codec) if (codec)
@ -643,6 +647,7 @@ void QxtCsvModel::toCSV(QIODevice* dest, bool withHeader, QChar separator, QText
} }
stream << flush; stream << flush;
dest->close(); dest->close();
return true;
} }
/*! /*!
@ -653,10 +658,11 @@ void QxtCsvModel::toCSV(QIODevice* dest, bool withHeader, QChar separator, QText
Fields in the output file will be separated by \a separator. Set \a withHeader to true Fields in the output file will be separated by \a separator. Set \a withHeader to true
to output a row of headers at the top of the file. to output a row of headers at the top of the file.
*/ */
void QxtCsvModel::toCSV(const QString &filename, bool withHeader, QChar separator, QTextCodec* codec) const bool QxtCsvModel::toCSV(const QString &filename, QString &error, bool withHeader, QChar separator,
QTextCodec* codec) const
{ {
QFile dest(filename); QFile dest(filename);
toCSV(&dest, withHeader, separator, codec); return toCSV(&dest, error, withHeader, separator, codec);
} }
/*! /*!

View File

@ -93,8 +93,9 @@ public:
void setSource(const QString &filename, bool withHeader = false, QChar separator = ',', void setSource(const QString &filename, bool withHeader = false, QChar separator = ',',
QTextCodec* codec = nullptr); QTextCodec* codec = nullptr);
void toCSV(QIODevice *file, bool withHeader = false, QChar separator = ',', QTextCodec* codec = nullptr) const; bool toCSV(QIODevice *file, QString &error, bool withHeader = false, QChar separator = ',',
void toCSV(const QString &filename, bool withHeader = false, QChar separator = ',', QTextCodec* codec = nullptr) const;
bool toCSV(const QString &filename, QString &error, bool withHeader = false, QChar separator = ',',
QTextCodec* codec = nullptr) const; QTextCodec* codec = nullptr) const;
enum QuoteOption { NoQuotes = 0, enum QuoteOption { NoQuotes = 0,