/** @file * @author Edouard DUPIN * @copyright 2016, Edouard DUPIN, all right reserved * @license PROPRIETARY (see license file) */ #include #include #include #include #include #include appl::widget::TextAreaRecognition::TextAreaRecognition() { addObjectType("appl::widget::TextAreaRecognition"); } void appl::widget::TextAreaRecognition::init() { ewol::Widget::init(); m_updateDone = false; //m_dollarEngine.loadPath("DATA:///text"); m_dollarEngine = dollar::createEngine("$P+"); m_dollarEngine->loadPath("DATA:///reference"); // TODO: m_dollarEngine->setScaleKeepRatio(true); markToRedraw(); // connect a periodic update ... m_periodicConnection = getObjectManager().periodicCall.connect(this, &appl::widget::TextAreaRecognition::callbackPeriodicUpdate); } appl::widget::TextAreaRecognition::~TextAreaRecognition() { } void appl::widget::TextAreaRecognition::clear() { m_dataList.clear(); m_current.clear(); m_time = echrono::Clock::now(); markToRedraw(); } void appl::widget::TextAreaRecognition::undo() { if (m_dataList.size() <= 0) { return; } m_dataList.erase(m_dataList.begin()+(m_dataList.size()-1)); m_time = echrono::Clock::now(); markToRedraw(); } void appl::widget::TextAreaRecognition::setCompare(const etk::String& _compare) { m_compare = _compare; } void appl::widget::TextAreaRecognition::store(const etk::String& _userName, const etk::String& _value, const etk::String& _type) { if (m_dataList.size() == 0) { return; } // create the buffer ejson::Document doc; doc.add("user", ejson::String(_userName)); doc.add("value", ejson::String(_value)); doc.add("type", ejson::String(_type)); doc.add("time", ejson::Number(m_time.get())); ejson::Array list; doc.add("data", list); for (auto &it : m_dataList) { ejson::Object obj; obj.add("type", ejson::String(etk::toString(it.m_type))); ejson::Array listPoint; obj.add("list", listPoint); for (size_t iii=0; iii fileIO = etk::uri::get(fileName); if (fileIO->open(etk::io::OpenMode::Write) == false) { return; } fileIO->writeAll(streamOut); fileIO->close(); } APPL_WARNING("store: " << fileName); } void appl::widget::TextAreaRecognition::onDraw() { m_draw.draw(); m_text.draw(); } etk::Vector> scalePoints(etk::Vector> _list, float _objectSize) { // get min/max point vec2 minPos(FLT_MAX, FLT_MAX); vec2 maxPos(FLT_MIN, FLT_MIN); for (auto &itLines : _list) { for (auto& itPoints : itLines) { minPos.setMin(itPoints); maxPos.setMax(itPoints); } } // center and reduce to a size of XXX float scale = 1.0f; vec2 size = maxPos-minPos; vec2 center(0, 0); if (size.x() > size.y()) { scale = _objectSize/size.x(); center.setY((_objectSize-size.y()*scale)*0.5); } else { scale = _objectSize/size.y(); center.setX((_objectSize-size.x()*scale)*0.5); } for (auto &itLines : _list) { for (auto& itPoints : itLines) { itPoints -= minPos; itPoints *= scale; itPoints += center; } } return _list; } etk::Vector> renderWithSVG(const etk::Vector>& _list, int32_t _objectSize, const etk::Uri& _filename) { // generate SVG to render: esvg::Document docSvg; etk::String data("\n"); data += "\n"; for (auto &itLines : _list) { data += " getName()+ ".svg"); { ememory::SharedPtr fileIO = etk::uri::get(_filename); if (fileIO->open(etk::io::OpenMode::Write) == true) { fileIO->writeAll(data); fileIO->close(); } } // generate SVG output ... ivec2 renderSize = ivec2(_objectSize,_objectSize); return docSvg.renderImageFloatRGBA(renderSize); } void appl::widget::TextAreaRecognition::onRegenerateDisplay() { if (needRedraw() == false) { return; } // remove previous data m_draw.clear(); m_text.clear(); // set background m_draw.setColor(etk::color::black); m_draw.setPos(vec2(0,0)); m_draw.rectangleWidth(m_size); m_draw.setColor(etk::color::orange); m_draw.setThickness(1); m_draw.setPos(vec2(0,m_size.y()*0.0)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.0)); m_draw.setColor(etk::color::blue); m_draw.setThickness(1); m_draw.setPos(vec2(0,m_size.y()*0.1)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.1)); m_draw.setPos(vec2(0,m_size.y()*0.2)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.2)); m_draw.setPos(vec2(0,m_size.y()*0.3)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.3)); m_draw.setColor(etk::color::orange); m_draw.setThickness(2); m_draw.setPos(vec2(0,m_size.y()*0.4)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.4)); m_draw.setColor(etk::color::blue); m_draw.setThickness(1); m_draw.setPos(vec2(0,m_size.y()*0.5)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.5)); m_draw.setPos(vec2(0,m_size.y()*0.6)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.6)); m_draw.setPos(vec2(0,m_size.y()*0.7)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.7)); m_draw.setColor(etk::color::orange); m_draw.setPos(vec2(0,m_size.y()*0.8)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.8)); m_draw.setColor(etk::color::blue); m_draw.setPos(vec2(0,m_size.y()*0.9)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*0.9)); m_draw.setPos(vec2(0,m_size.y()*1.0)); m_draw.lineTo(vec2(m_size.x(),m_size.y()*1.0)); m_draw.setColor(etk::color::orange); m_draw.setThickness(1); float base = m_size.y()*0.4; float pos = m_size.x()*0.5f - base*0.5; while (pos > 0.0f) { m_draw.setPos(vec2(pos,0)); m_draw.lineTo(vec2(pos,m_size.y())); pos -= base; } pos = m_size.x()*0.5f + base*0.5; while (pos < m_size.x()) { m_draw.setPos(vec2(pos,0)); m_draw.lineTo(vec2(pos,m_size.y())); pos += base; } vec2 minPos(99999999,99999999); vec2 maxPos(0,0); // set all the line: m_draw.setColor(etk::color::white); m_draw.setThickness(2); // Draw olds for (auto &it : m_dataList) { for (size_t iii=0; iii> convertInLines(const etk::Vector& _list) { etk::Vector> out; for (auto &it : _list) { if (it.m_data.size() > 1) { out.pushBack(it.m_data); } else { // TODO } } return out; } void appl::widget::TextAreaRecognition::callbackPeriodicUpdate(const ewol::event::Time& _event) { if ( (echrono::Clock::now() - m_lastEvent) > echrono::milliseconds(1200) && m_updateDone == false) { if (m_current.m_data.size() != 0) { // ==> writing in progress return; } if (m_dataList.size() == 0) { // ==> no writing markToRedraw(); m_updateDone = true; return; } // extract lines from json file: etk::Vector> fullListlines = convertInLines(m_dataList); if (fullListlines.size() == 0) { APPL_ERROR(" can not manage an objest with no line ..."); return; } echrono::Clock tic = echrono::Clock::now(); // First Test with dollar engine m_dollarResults = m_dollarEngine->recognize(fullListlines); m_findValue = m_dollarResults.getName(); m_dollarTime = echrono::Clock::now() - tic; markToRedraw(); m_updateDone = true; } }