From cc8c70c51640c520d406773497800da4d56c496a Mon Sep 17 00:00:00 2001 From: Franck Bourdonnec Date: Sat, 6 Feb 2021 00:08:06 +0100 Subject: [PATCH] Add two options to tweak pin names 1/ Length of tested string The default size uConfig uses to test a string extracted from a pdf is 10. Sometimes it is too short. You see some vanishing pins. 2/ Delete a part of the pin name Sometimes pin names have a prefix like (GPIO)P2[4] Now you get P2[4] instead. --- src/pdf_extract/datasheet.cpp | 19 ++++---- src/pdf_extract/datasheet.h | 6 +-- src/uconfig/uconfig.cpp | 48 +++++++++++++++----- src/uconfig_gui/importer/datasheetthread.cpp | 22 ++++++++- src/uconfig_gui/importer/datasheetthread.h | 6 +++ src/uconfig_gui/importer/pdffilepage.cpp | 28 +++++++++++- src/uconfig_gui/importer/pdffilepage.h | 5 +- 7 files changed, 109 insertions(+), 25 deletions(-) diff --git a/src/pdf_extract/datasheet.cpp b/src/pdf_extract/datasheet.cpp index 4c947af..9c10e3f 100644 --- a/src/pdf_extract/datasheet.cpp +++ b/src/pdf_extract/datasheet.cpp @@ -77,7 +77,7 @@ void Datasheet::close() _doc = nullptr; } -void Datasheet::pinSearch(int numPage) +void Datasheet::pinSearch(int numPage, char *deleteString, int maxPinNameLength) { QList pins; QList packages; @@ -101,7 +101,7 @@ void Datasheet::pinSearch(int numPage) delete box;*/ _pack_labels.clear(); - pins = extractPins(numPage); + pins = extractPins(numPage, deleteString, maxPinNameLength); // pins.append(extractPins(numPage + 1)); QCoreApplication::processEvents(); @@ -288,7 +288,7 @@ QRectF Datasheet::toGlobalPos(const QRectF &rect, Poppler::Page *page, int pageN return rect; } -QList Datasheet::extractPins(int numPage) +QList Datasheet::extractPins(int numPage, char *deleteString, int maxPinNameLength) { QList pins; @@ -387,6 +387,9 @@ QList Datasheet::extractPins(int numPage) // remove notes box->text.replace(QRegExp("\\([0-9]+\\)"), ""); + // remove specified text + box->text.replace(deleteString, ""); + // classify boxes if (!okNumber || prev) { @@ -411,7 +414,7 @@ QList Datasheet::extractPins(int numPage) box = new DatasheetBox(); box->page = numPage; } - else if (box->text.size() > 10 && (!box->text.contains("/") && !box->text.contains("_") && !box->text.contains(","))) + else if (box->text.size() > maxPinNameLength && (!box->text.contains("/") && !box->text.contains("_") && !box->text.contains(","))) { // qDebug()<<"filter long label"<text; delete box; @@ -662,7 +665,7 @@ int Datasheet::pagePinDiagram(int pageStart, int pageEnd, bool *bgaStyle) * @param pageBegin * @param pageEnd */ -void Datasheet::analyse(int pageBegin, int pageEnd) +void Datasheet::analyse(int pageBegin, int pageEnd, char *deleteString, int maxPinNameLength) { int page = pageBegin; bool bgaStyle; @@ -671,7 +674,7 @@ void Datasheet::analyse(int pageBegin, int pageEnd) // only one page if (pageBegin != -1 && pageEnd == -1) // search in one page { - pinSearch(pageBegin); + pinSearch(pageBegin, deleteString, maxPinNameLength); } else if (!_force) { @@ -689,7 +692,7 @@ void Datasheet::analyse(int pageBegin, int pageEnd) { return; } - pinSearch(page); + pinSearch(page, deleteString, maxPinNameLength); page++; } } @@ -701,7 +704,7 @@ void Datasheet::analyse(int pageBegin, int pageEnd) } for (; page <= mpageEnd; page++) { - pinSearch(page); + pinSearch(page, deleteString, maxPinNameLength ); } } } diff --git a/src/pdf_extract/datasheet.h b/src/pdf_extract/datasheet.h index 793f663..287f80c 100644 --- a/src/pdf_extract/datasheet.h +++ b/src/pdf_extract/datasheet.h @@ -44,7 +44,7 @@ class DATASHEET_EXTRACTOR_EXPORT Datasheet : public QObject bool open(QString fileName); void close(); - void analyse(int pageBegin = -1, int pageEnd = -1); + void analyse(int pageBegin = -1, int pageEnd = -1, char *deleteString = "", int _maxPinNameLength = 10); const QList &packages() const; QList components(); @@ -69,10 +69,10 @@ class DATASHEET_EXTRACTOR_EXPORT Datasheet : public QObject private: int pagePinDiagram(int pageStart, int pageEnd, bool *bgaStyle); - void pinSearch(int numPage); + void pinSearch(int numPage, char *deleteString, int maxPinNameLength); QRectF toGlobalPos(const QRectF &rect, Poppler::Page *page, int pageNumber); - QList extractPins(int numPage); + QList extractPins(int numPage, char *deleteString, int maxPinNameLength); QList _numbers; QList _labels; QList _proc_labels; diff --git a/src/uconfig/uconfig.cpp b/src/uconfig/uconfig.cpp index 7ef79ef..8dd5c9b 100644 --- a/src/uconfig/uconfig.cpp +++ b/src/uconfig/uconfig.cpp @@ -34,7 +34,7 @@ QTextStream out(stdout); -void processFilePdf(QString file, Lib *lib, bool debug) +void processFilePdf(QString file, Lib *lib, bool debug, int pageBegin, int pageEnd, char *deleteString, int pinNameLength) { Datasheet datasheet; datasheet.setDebugEnabled(debug); @@ -44,7 +44,7 @@ void processFilePdf(QString file, Lib *lib, bool debug) out << "error (2): input file cannot be opened" << endl; exit(2); } - datasheet.analyse(); + datasheet.analyse(pageBegin, pageEnd, deleteString, pinNameLength); for (DatasheetPackage *package : datasheet.packages()) { Component *component = package->toComponent(); @@ -71,10 +71,10 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); QApplication::setApplicationName("uConfig"); - QApplication::setApplicationVersion("1.0"); + QApplication::setApplicationVersion("1.1"); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "uConfig command line interface.") + QString("\nuconfig datasheet.pdf -o lib1.lib [-r rule.kss] [-d]")); + parser.setApplicationDescription(QCoreApplication::translate("main", "uConfig command line interface.") + QString("\nuconfig datasheet.pdf [-o output.lib] [-r rule.kss] [-d] [-B pageBegin [-E pageEnd]] [-S deleteString]")); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("file", QCoreApplication::translate("main", "Source file to extract pins (pdf)."), "file"); @@ -96,12 +96,29 @@ int main(int argc, char *argv[]) "rule"); parser.addOption(kssOption); - /* TODO implement range page option - QCommandLineOption rangeOption(QStringList() << "p" << "page", - "Range of page to search into, defaut is the full document", - "range"); - parser.addOption(rangeOption); - */ + QCommandLineOption pageOption(QStringList() << "B" + << "pageBegin", + QCoreApplication::translate("main", "Work on pdf pageBegin."), + "N"); + parser.addOption(pageOption); + + QCommandLineOption pageEnd(QStringList() << "E" + << "pageEnd", + QCoreApplication::translate("main", "Work on pageBegin to pageEnd."), + "N"); + parser.addOption(pageEnd); + + QCommandLineOption dsOption(QStringList() << "S" + << "deleteString", + QCoreApplication::translate("main", "Delete string from pin names."), + "string"); + parser.addOption(dsOption); + + QCommandLineOption pnlOption(QStringList() << "l" + << "pinNameLength", + QCoreApplication::translate("main", "Max pin name length (default=10)."), + "length"); + parser.addOption(pnlOption); parser.process(app); @@ -159,7 +176,16 @@ int main(int argc, char *argv[]) out << "> " << file << endl; if (file.endsWith(".pdf", Qt::CaseInsensitive)) { - processFilePdf(file, &lib, parser.isSet(debugOption)); + QString deleteStringOpt = parser.value("deleteString"); + QByteArray x = deleteStringOpt.toLatin1(); + char deleteString[16]; + strncpy(deleteString, x.data(), 15); + + int pageBegin = parser.isSet("pageBegin") ? parser.value(QStringLiteral("pageBegin")).toInt() : -1; + int pageEnd = parser.isSet("pageEnd") ? parser.value(QStringLiteral("pageEnd")).toInt() : -1; + int pinNameLength = parser.isSet("pinNameLength") ? parser.value(QStringLiteral("pinNameLength")).toInt() : 10; +out<setForceEnabled(force); } +void DataSheetThread::setDeleteString(const char* str) +{ + strcpy (_deleteString, str); +} + +char *DataSheetThread::deleteString() +{ + return &_deleteString[0]; +} + +void DataSheetThread::setMaxPinNameLength(int val) +{ + _maxPinNameLength = val; +} + +int DataSheetThread::maxPinNameLength() const +{ + return _maxPinNameLength; +} + Datasheet *DataSheetThread::datasheet() const { return _datasheet; @@ -77,5 +97,5 @@ int DataSheetThread::pageEnd() const void DataSheetThread::run() { setTerminationEnabled(); - _datasheet->analyse(_pageBegin, _pageEnd); + _datasheet->analyse(_pageBegin, _pageEnd, _deleteString, _maxPinNameLength); } diff --git a/src/uconfig_gui/importer/datasheetthread.h b/src/uconfig_gui/importer/datasheetthread.h index 151fadc..731a332 100644 --- a/src/uconfig_gui/importer/datasheetthread.h +++ b/src/uconfig_gui/importer/datasheetthread.h @@ -37,6 +37,10 @@ class DataSheetThread : public QThread int pageBegin() const; int pageEnd() const; void setForceEnabled(bool force); + void setDeleteString(const char*); + char *deleteString(); + void setMaxPinNameLength(int); + int maxPinNameLength() const; Datasheet *datasheet() const; signals: @@ -47,6 +51,8 @@ class DataSheetThread : public QThread int _pageBegin; int _pageEnd; void run() override; + char _deleteString[16]; + int _maxPinNameLength; }; #endif // DATASHEETTHREAD_H diff --git a/src/uconfig_gui/importer/pdffilepage.cpp b/src/uconfig_gui/importer/pdffilepage.cpp index 3c55875..c791492 100644 --- a/src/uconfig_gui/importer/pdffilepage.cpp +++ b/src/uconfig_gui/importer/pdffilepage.cpp @@ -60,12 +60,25 @@ PDFFilePage::PDFFilePage(DataSheetThread *datasheetThread) registerField("pdfpagerange", _rangeEdit); rangeGroupLayout->addWidget(_rangeEdit); - _forceCheckBox = new QCheckBox(tr("Force détection\n(try to build component in each page,\nvery expensive)")); + _forceCheckBox = new QCheckBox(tr("Force detection\n(try to build component in each page,\nvery expensive)")); _allRadio->setChecked(true); connect(_forceCheckBox, SIGNAL(toggled(bool)), this, SLOT(check())); rangeGroupLayout->addWidget(_forceCheckBox); rangeGroupLayout->addSpacerItem(new QSpacerItem(10, 30, QSizePolicy::Expanding, QSizePolicy::Expanding)); + rangeGroupLayout->addWidget(new QLabel (tr("Remove this text from pin names:"))); + _deleteString = new QLineEdit(); + _deleteString->setValidator(new QRegularExpressionValidator(QRegularExpression(".{0,15}"))); + connect(_deleteString, SIGNAL(textChanged(QString)), this, SLOT(check())); + rangeGroupLayout->addWidget(_deleteString); + + rangeGroupLayout->addWidget(new QLabel (tr("Maximum length for a pin name:"))); + _maxPinNameLength = new QSpinBox(); + //registerField("pdfmaxpinnamelength", _maxPinNameLength); + connect(_maxPinNameLength, SIGNAL(valueChanged(int)), this, SLOT(check())); + rangeGroupLayout->addWidget(_maxPinNameLength); + rangeGroupLayout->addSpacerItem(new QSpacerItem(10, 30, QSizePolicy::Expanding, QSizePolicy::Expanding)); + _pageCountLabel = new QLabel(); rangeGroupLayout->addWidget(_pageCountLabel); @@ -93,10 +106,18 @@ void PDFFilePage::initializePage() _pagePreviewLabel->setPixmap(QPixmap::fromImage(_datasheetThread->datasheet()->pageThumbnail(0))); _rangeEdit->setText(QString("1-%1").arg(_datasheetThread->datasheet()->pageCount())); _pageCountLabel->setText(QString("%1 pages").arg(_datasheetThread->datasheet()->pageCount())); + _deleteString->setText(""); + _maxPinNameLength->setRange(3,30); + _maxPinNameLength->setValue(15); + _s++; } void PDFFilePage::check() { + //for some reason, check() is called before initializePage() !!! ??? + if (!_s) + return; // not initialized + _forceCheckBox->setEnabled(!_allRadio->isChecked()); _rangeEdit->setEnabled(!_allRadio->isChecked()); _complete = _rangeEdit->hasAcceptableInput() || _allRadio->isChecked(); @@ -132,6 +153,11 @@ void PDFFilePage::check() } _datasheetThread->setRange(start, stop); } + _datasheetThread->setMaxPinNameLength(_maxPinNameLength->value()); + + //QByteArray x = _deleteString->text().toLatin1(); + //_datasheetThread->setDeleteString(x.data()); + _datasheetThread->setDeleteString( qPrintable(_deleteString->text()) ); } emit completeChanged(); } diff --git a/src/uconfig_gui/importer/pdffilepage.h b/src/uconfig_gui/importer/pdffilepage.h index a06c559..c1a62e9 100644 --- a/src/uconfig_gui/importer/pdffilepage.h +++ b/src/uconfig_gui/importer/pdffilepage.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "datasheetthread.h" @@ -48,11 +49,13 @@ private slots: QLabel *_pagePreviewLabel; QRadioButton *_allRadio; QRadioButton *_partialRadio; - QLineEdit *_rangeEdit; + QLineEdit *_rangeEdit, *_deleteString; + QSpinBox *_maxPinNameLength; QCheckBox *_forceCheckBox; QLabel *_pageCountLabel; QStringList _suffixes; + int _s=0; }; #endif // PDFFILEPAGE_H