38 #include <QApplication>
39 #include <QMessageBox>
40 #include <QDockWidget>
51 #define OBJECTXOFFSET 200
56 for(
int i=
str.length()-1; i>=0; --i)
67 return qdt.toString(
"dd.MM.yyyy hh.mm.ss");
76 OriginFile opj((
const char *)filename.toLocal8Bit());
83 if(filename.endsWith(
".opj", Qt::CaseInsensitive))
86 }
catch(
const std::logic_error& er){
87 QApplication::restoreOverrideCursor();
88 QMessageBox::critical(
mw,
"Origin Project Import Error", QString(er.what()));
92 inline uint
qHash(
const tree<Origin::ProjectNode>::iterator &key)
94 return qHash(key->name.c_str());
99 const tree<Origin::ProjectNode>* projectTree = opj.project();
100 tree<Origin::ProjectNode>::iterator root = projectTree->begin(projectTree->begin());
104 item->setText(0, root->name.c_str());
107 QHash<tree<Origin::ProjectNode>::iterator,
Folder*> parent;
108 parent[root] = projectFolder;
109 for(tree<Origin::ProjectNode>::iterator sib = projectTree->begin(root); sib != projectTree->end(root); ++sib)
111 if(sib->type == Origin::ProjectNode::Folder){
113 Folder& f = parent.value(projectTree->parent(sib))->addChild<Folder>(sib->name.c_str());
120 QString
name = sib->name.c_str();
121 if(sib->type == Origin::ProjectNode::Note)
123 QRegExp rx(
"^@\\((\\S+)\\)$");
124 if(rx.indexIn(
name) == 0)
127 const char* nodetype;
130 case Origin::ProjectNode::SpreadSheet:
133 case Origin::ProjectNode::Matrix:
136 case Origin::ProjectNode::Graph:
137 nodetype =
"MultiLayer";
139 case Origin::ProjectNode::Graph3D:
141 nodetype =
"MultiLayer";
143 case Origin::ProjectNode::Note:
146 case Origin::ProjectNode::Excel:
151 nodetype =
"Unknown";
156 Folder *f = parent.value(projectTree->parent(sib));
158 if (f==parent[root])
break;
176 case Origin::GraphCurve::Solid:
179 case Origin::GraphCurve::Dash:
180 case Origin::GraphCurve::ShortDash:
183 case Origin::GraphCurve::Dot:
184 case Origin::GraphCurve::ShortDot:
187 case Origin::GraphCurve::DashDot:
188 case Origin::GraphCurve::ShortDashDot:
191 case Origin::GraphCurve::DashDotDot:
195 return scidavisstyle;
201 static int visible_count=0;
202 QLocale locale =
mw->locale();
203 int SciDAVis_scaling_factor=10;
204 int columnCount = spread.columns.size();
205 int maxrows = spread.maxRows;
209 Table *table =
mw->
newTable(spread.name.c_str(), maxrows, columnCount);
212 if (spread.hidden || spread.loose)
216 for(
int j = 0; j < columnCount; ++j){
217 Origin::SpreadColumn column = spread.columns[j];
220 QString
name(column.name.c_str());
221 scidavis_column->
setName(
name.replace(QRegExp(
".*_"),
""));
222 if (column.command.size() > 0)
224 scidavis_column->
setComment(QString(column.comment.c_str()));
225 table->
setColumnWidth(j, (
int)column.width*SciDAVis_scaling_factor);
228 case Origin::SpreadColumn::X:
231 case Origin::SpreadColumn::Y:
234 case Origin::SpreadColumn::Z:
237 case Origin::SpreadColumn::XErr:
240 case Origin::SpreadColumn::YErr:
243 case Origin::SpreadColumn::Label:
249 switch(column.valueType) {
250 case Origin::Numeric:
251 case Origin::TextNumeric:
260 bool setAsText =
false;
262 for (
int i=0; i < std::min((
int)column.data.size(), maxrows); ++i) {
263 Origin::variant value(column.data[i]);
264 if (value.type() == Origin::variant::V_DOUBLE) {
265 datavalue = value.as_double();
266 if (datavalue==_ONAN)
continue;
270 scidavis_column->
setTextAt(i, locale.toString(datavalue,
'g', 16));
273 if (!setAsText && i==0) {
277 scidavis_column->
setTextAt(i, column.data[i].as_string());
281 if(column.numericDisplayType == 0)
287 switch(column.valueTypeSpecification)
308 for (
int i=0; i < min((
int)column.data.size(), maxrows); ++i) {
309 scidavis_column->
setTextAt(i, column.data[i].as_string());
314 switch(column.valueTypeSpecification) {
319 format=
"dd/MM/yyyy HH:mm";
322 format=
"dd/MM/yyyy HH:mm:ss";
365 for (
int i=0; i < min((
int)column.data.size(), maxrows); ++i)
366 scidavis_column->
setValueAt(i, column.data[i].as_double());
374 switch(column.valueTypeSpecification + 128) {
385 format=
"hh:mm:ss.zzz";
406 format=
"hh:mm:ss.zzz";
409 for (
int i=0; i < min((
int)column.data.size(), maxrows); ++i)
410 scidavis_column->
setValueAt(i, column.data[i].as_double());
418 switch(column.valueTypeSpecification) {
429 for (
int i=0; i < min((
int)column.data.size(), maxrows); ++i)
430 scidavis_column->
setValueAt(i, column.data[i].as_double());
438 switch(column.valueTypeSpecification)
450 for (
int i=0; i < min((
int)column.data.size(), maxrows); ++i)
451 scidavis_column->
setValueAt(i, column.data[i].as_double());
464 if(!(spread.hidden || spread.loose) || opj.version() != 7.5){
468 if (opj.version() >= 6.0)
470 Origin::Rect windowRect;
471 windowRect = spread.frameRect;
472 table->move(QPoint(windowRect.left, windowRect.top));
476 int dy=table->frameGeometry().height() - table->height();
486 static int visible_count=0;
487 int SciDAVis_scaling_factor=10;
488 for(
unsigned int s = 0; s < opj.spreadCount(); ++s)
491 Origin::SpreadSheet spread = opj.spread(s);
492 int columnCount = spread.columns.size();
498 for (
unsigned int s = 0; s < opj.excelCount(); ++s)
500 Origin::Excel excelwb = opj.excel(s);
501 for (
unsigned int j = 0; j < excelwb.sheets.size(); ++j) {
502 mw->
setStatusBarText(QString(
"Excel %1 / %2, sheet %3 / %4").arg(s+1).arg(opj.excelCount()).arg(j+1).arg(excelwb.sheets.size()));
503 Origin::SpreadSheet spread = excelwb.sheets[j];
504 int columnCount = spread.columns.size();
507 spread.name = excelwb.name;
510 spread.name.append(
"@").append(std::to_string(j+1));
512 spread.maxRows = excelwb.maxRows;
519 for(
unsigned int s = 0; s < opj.matrixCount(); ++s)
521 Origin::Matrix matrix = opj.matrix(s);
522 unsigned int layers = matrix.sheets.size();
523 for(
unsigned int l = 0; l < layers; ++l){
524 Origin::MatrixSheet& layer = matrix.sheets[l];
525 int columnCount = layer.columnCount;
526 int rowCount = layer.rowCount;
527 mw->
setStatusBarText(QString(
"Matrix %1 / %2, sheet %3 / %4").arg(s+1).arg(opj.matrixCount()).arg(l+1).arg(layers));
536 Matrix->table()->blockSignals(
true);
538 QVector<qreal> values;
539 values.resize(rowCount*columnCount);
540 for (
int i=0; i<min((
int)values.size(),(
int)layer.data.size()); i++) {
541 values[i]=layer.data[i];
549 switch(layer.valueTypeSpecification){
552 prec = layer.decimalPlaces;
556 prec = layer.decimalPlaces;
561 prec = layer.significantDigits;
568 Matrix->table()->blockSignals(
false);
574 int dx=
Matrix->verticalHeaderWidth();
575 int dy=
Matrix->frameGeometry().height() - matrix->height();
594 for(
unsigned int n = 0; n < opj.noteCount(); ++n)
596 Origin::Note _note = opj.note(n);
597 QString
name = _note.name.c_str();
598 QRegExp rx(
"^@(\\S+)$");
599 if(rx.indexIn(
name)==0)
607 note->
setText(QString(_note.text.c_str()));
611 int dy=note->frameGeometry().height() - note->height();
622 double pi=3.141592653589793;
624 int tickTypeMap[]={0,3,1,2};
625 for(
unsigned int g = 0; g < opj.graphCount(); ++g)
627 Origin::Graph _graph = opj.graph(g);
634 unsigned int layers = _graph.layers.size();
635 for(
unsigned int l = 0; l < layers; ++l)
637 mw->
setStatusBarText(QString(
"Graph %1 / %2, layer %3 / %4").arg(g+1).arg(opj.graphCount()).arg(l+1).arg(layers));
638 Origin::GraphLayer& layer = _graph.layers[l];
642 if(!layer.legend.text.empty()) {
646 for(
unsigned int i = 0; i < layer.texts.size(); ++i) {
651 for(
unsigned int c = 0; c < layer.curves.size(); ++c)
653 Origin::GraphCurve& _curve = layer.curves[c];
654 QString
data(_curve.dataName.c_str());
658 case Origin::GraphCurve::Line:
661 case Origin::GraphCurve::Scatter:
664 case Origin::GraphCurve::LineSymbol:
667 case Origin::GraphCurve::ErrorBar:
668 case Origin::GraphCurve::XErrorBar:
671 case Origin::GraphCurve::Column:
674 case Origin::GraphCurve::Bar:
677 case Origin::GraphCurve::Histogram:
684 switch(
data[0].toLatin1())
689 tableName =
data.right(
data.length()-2);
695 int flags=_curve.symbolShape;
696 graph->
addErrorBars(QString(
"%1_%2").arg(tableName, _curve.xColumnName.c_str()), table, QString(
"%1_%2").arg(tableName, _curve.yColumnName.c_str()),
697 ((
flags&0x10)==0x10?0:1), ceil(_curve.lineWidth), ceil(_curve.symbolSize), QColor(Qt::black),
703 graph->
insertCurve(table, QString(
"%1_%2").arg(tableName, _curve.yColumnName.c_str()), style);
707 graph->
insertCurve(table, QString(
"%1_%2").arg(tableName, _curve.xColumnName.c_str()), QString(
"%1_%2").arg(tableName, _curve.yColumnName.c_str()), style);
713 Origin::Function
function;
714 QStringList formulas;
715 QList<double> ranges;
716 int s=opj.functionIndex(
data.right(
data.length()-2).toStdString().c_str());
717 function = opj.function(s);
720 if(
function.type == Origin::Function::Polar)
723 formulas <<
function.formula.c_str() <<
"x";
724 ranges << pi/180*
function.begin << pi/180*
function.end;
729 formulas <<
function.formula.c_str();
730 ranges <<
function.begin <<
function.end;
742 cl.
sSize = ceil(_curve.symbolSize*0.5);
744 color=_curve.symbolColor.regular;
748 switch(_curve.symbolShape)
801 switch(_curve.symbolInterior)
812 color =_curve.symbolFillColor.regular;
821 cl.
lWidth = _curve.lineWidth;
823 cl.
lCol = (_curve.lineColor.type==Origin::Color::Automatic?0:color);
824 int linestyle=_curve.lineStyle;
828 switch(_curve.fillAreaPattern)
865 color = (cl.
aStyle == 0 ? _curve.fillAreaColor : _curve.fillAreaPatternColor);
866 cl.
aCol = (color.type == Origin::Color::Automatic ? 0 : color.regular);
869 color = _curve.fillAreaPatternBorderColor;
870 cl.
lCol = (color.type == Origin::Color::Automatic ? 0 : color.regular);
871 color = (cl.
aStyle == 0 ? _curve.fillAreaColor : _curve.fillAreaPatternColor);
872 cl.
aCol = (color.type == Origin::Color::Automatic ? cl.
lCol : color.regular);
873 cl.
lWidth = _curve.fillAreaPatternBorderWidth;
874 linestyle = _curve.fillAreaPatternBorderStyle;
879 case Origin::GraphCurve::Solid:
882 case Origin::GraphCurve::Dash:
883 case Origin::GraphCurve::ShortDash:
886 case Origin::GraphCurve::Dot:
887 case Origin::GraphCurve::ShortDot:
890 case Origin::GraphCurve::DashDot:
891 case Origin::GraphCurve::ShortDashDot:
894 case Origin::GraphCurve::DashDotDot:
904 b->
setGap(qRound(100 -_curve.symbolSize*10));
911 h->
setBinning(
false, layer.histogramBin, layer.histogramBegin, layer.histogramEnd);
915 switch(_curve.lineConnect)
917 case Origin::GraphCurve::NoLine:
920 case Origin::GraphCurve::Straight:
923 case Origin::GraphCurve::BSpline:
924 case Origin::GraphCurve::Bezier:
925 case Origin::GraphCurve::Spline:
928 case Origin::GraphCurve::StepHorizontal:
929 case Origin::GraphCurve::StepHCenter:
932 case Origin::GraphCurve::StepVertical:
933 case Origin::GraphCurve::StepVCenter:
941 graph->
setScale(0,layer.xAxis.min,layer.xAxis.max,layer.xAxis.step,layer.xAxis.majorTicks,layer.xAxis.minorTicks,layer.xAxis.scale);
942 graph->
setScale(2,layer.yAxis.min,layer.yAxis.max,layer.yAxis.step,layer.yAxis.majorTicks,layer.yAxis.minorTicks,layer.yAxis.scale);
946 graph->
setScale(2,layer.xAxis.min,layer.xAxis.max,layer.xAxis.step,layer.xAxis.majorTicks,layer.xAxis.minorTicks,layer.xAxis.scale);
947 graph->
setScale(0,layer.yAxis.min,layer.yAxis.max,layer.yAxis.step,layer.yAxis.majorTicks,layer.yAxis.minorTicks,layer.yAxis.scale);
953 grid->enableX(!layer.xAxis.majorGrid.hidden);
954 grid->enableXMin(!layer.xAxis.minorGrid.hidden);
955 grid->enableY(!layer.yAxis.majorGrid.hidden);
956 grid->enableYMin(!layer.yAxis.minorGrid.hidden);
971 vector<Origin::GraphAxisFormat> formats;
972 formats.push_back(layer.yAxis.formatAxis[0]);
973 formats.push_back(layer.yAxis.formatAxis[1]);
974 formats.push_back(layer.xAxis.formatAxis[0]);
975 formats.push_back(layer.xAxis.formatAxis[1]);
979 vector<Origin::GraphAxisTick> ticks;
980 ticks.push_back(layer.yAxis.tickAxis[0]);
981 ticks.push_back(layer.yAxis.tickAxis[1]);
982 ticks.push_back(layer.xAxis.tickAxis[0]);
983 ticks.push_back(layer.xAxis.tickAxis[1]);
984 for(
int i=0; i<4; ++i)
986 QString
data(ticks[i].dataName.c_str());
987 QString tableName=
data.right(
data.length()-2) +
"_" + ticks[i].columnName.c_str();
992 int prec = ticks[i].decimalPlaces;
993 switch(ticks[i].valueType)
995 case Origin::Numeric:
997 switch(ticks[i].valueTypeSpecification)
1024 format=ticks[i].valueTypeSpecification;
1028 format=ticks[i].valueTypeSpecification;
1030 case Origin::ColumnHeading:
1032 switch(ticks[i].valueTypeSpecification)
1053 graph->
showAxis(i, type, tableName,
mw->
table(tableName), !(formats[i].hidden),
1054 tickTypeMap[formats[i].majorTicksType], tickTypeMap[formats[i].minorTicksType],
1067 int dy=ml->frameGeometry().height() - ml->height();
1087 QStringList lines=
str.split(
"\n");
1089 for(
int i=0; i<lines.size(); ++i)
1102 QRegExp rxline(
"\\\\\\s*l\\s*\\(\\s*\\d+\\s*\\)");
1103 QRegExp rxcol(
"\\%\\(\\d+\\)");
1104 int pos = rxline.indexIn(line);
1106 QString value = rxline.cap(0);
1107 int len=value.length();
1108 value.replace(QRegExp(
" "),
"");
1109 value=
"\\c{"+value.mid(3,value.length()-4)+
"}";
1110 line.replace(pos, len, value);
1111 pos = rxline.indexIn(line);
1114 QRegExp rx(
"\\)[^\\)\\(]*\\((?!\\s*[buig\\+\\-]\\s*\\\\)");
1115 QRegExp rxfont(
"\\)[^\\)\\(]*\\((?![^\\:]*\\:f\\s*\\\\)");
1119 QString ltagBracket=
strreverse(
"<agbracket;");
1120 QString rtagBracket=
strreverse(
"&rtagbracket;");
1121 int pos1=rx.indexIn(linerev);
1122 int pos2=rxfont.indexIn(linerev);
1124 while (pos1>-1 || pos2>-1) {
1127 QString value = rx.cap(0);
1128 int len=value.length();
1129 value=rBracket+value.mid(1,len-2)+lBracket;
1130 linerev.replace(pos1, len, value);
1132 else if ((pos1>pos2&&pos2!=-1)||pos1==-1)
1134 QString value = rxfont.cap(0);
1135 int len=value.length();
1136 value=rtagBracket+value.mid(1,len-2)+ltagBracket;
1137 linerev.replace(pos2, len, value);
1139 else if ((pos2>pos1&&pos1!=-1)||pos2==-1)
1141 QString value = rx.cap(0);
1142 int len=value.length();
1143 value=rtagBracket+value.mid(1,len-2)+ltagBracket;
1144 linerev.replace(pos1, len, value);
1147 pos1=rx.indexIn(linerev);
1148 pos2=rxfont.indexIn(linerev);
1150 linerev.replace(ltagBracket,
"(");
1151 linerev.replace(rtagBracket,
")");
1161 "\\\\\\s*\\+\\s*\\(",
1162 "\\\\\\s*\\-\\s*\\(",
1163 "\\\\\\s*f\\:[^\\(]*\\("};
1164 int postag[]={0,0,0,0,0,0,0};
1165 QString ltag[]={
"<b>",
"<i>",
"<u>",
"<font face=Symbol>",
"<sup>",
"<sub>",
"<font face=%1>"};
1166 QString rtag[]={
"</b>",
"</i>",
"</u>",
"</font>",
"</sup>",
"</sub>",
"</font>"};
1168 for(
int i=0; i<7; ++i)
1169 rxtags[i].setPattern(rxstr[i]+
"[^\\(\\)]*\\)");
1173 for(
int i=0; i<7; ++i)
1175 postag[i] = rxtags[i].indexIn(line);
1176 while (postag[i] > -1) {
1177 QString value = rxtags[i].cap(0);
1178 int len=value.length();
1179 int pos2=value.indexOf(
"(");
1181 value=ltag[i]+value.mid(pos2+1,len-pos2-2)+rtag[i];
1184 int posfont=value.indexOf(
"f:");
1185 value=ltag[i].arg(value.mid(posfont+2,pos2-posfont-2))+value.mid(pos2+1,len-pos2-2)+rtag[i];
1187 line.replace(postag[i], len, value);
1188 postag[i] = rxtags[i].indexIn(line);
1192 for(
int i=0; i<7; ++i)
1194 if(rxtags[i].indexIn(line)>-1)
1203 for(
int i=0; i<6; ++i)
1204 line.replace(QRegExp(rxstr[i]), ltag[i]);
1205 rxfont.setPattern(rxstr[6]);
1206 pos = rxfont.indexIn(line);
1208 QString value = rxfont.cap(0);
1209 int len=value.length();
1210 int posfont=value.indexOf(
"f:");
1211 value=ltag[6].arg(value.mid(posfont+2,len-posfont-3));
1212 line.replace(pos, len, value);
1213 pos = rxfont.indexIn(line);
1216 line.replace(
"&lbracket;",
"(");
1217 line.replace(
"&rbracket;",
")");