Visualizzazione post con etichetta QtCreator. Mostra tutti i post
Visualizzazione post con etichetta QtCreator. Mostra tutti i post

giovedì 19 novembre 2020

PCL Library e Visual Studio 2019

 Per installare ed usare PCL su Windows la cosa piu' comoda e' utilizzare il pacchetto PCL-1.11.1-AllInOne-msvc2019-win64 

Una volta installato il file exe per esempio in C:\Program Files\PCL 1.11.1


Per creare un progetto in QT con le PCL si devono aggiungere nella path OpenNI2 (stranamente l'installer non la ha aggiunta nella PATH)

Ho sostituito la versione di CMAKE da quella di default di QT con l'installer di CMake  (modificabile dai Kit di Qt) ed come compilatore ho selezionato MSVC2019



il file CMAKE e' il seguente

===============================================

cmake_minimum_required(VERSION 3.5)


project(t3 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(PCL 1.3 REQUIRED COMPONENTS common io features)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})


add_executable(t3 main.cpp)
target_link_libraries(t3 ${PCL_LIBRARIES})

===============================================

mentre un programma di esempio e' 
===============================================
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

#include <pcl/features/normal_3d.h>

using namespace std;

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

     if (pcl::io::loadPCDFile<pcl::PointXYZ> ("c://gabriele.pcd", *cloud) == -1) //* load the file
     {
       PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
       return (-1);
     }
     //std::cout << "Loaded " << cloud->width * cloud->height << " data points from test_pcd.pcd with the following fields: " << std::endl;
     /*for (size_t i = 0; i < cloud->points.size (); ++i)
       std::cout << "    " << cloud->points[i].x << " "    << cloud->points[i].y << " "    << cloud->points[i].z << std::endl;
    */
     // Create the normal estimation class, and pass the input dataset to it

     pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
     ne.setInputCloud (cloud);
    // Create an empty kdtree representation, and pass it to the normal estimation object.
       // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
       pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
       ne.setSearchMethod (tree);

       // Output datasets
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

       // Use all neighbors in a sphere of radius 3cm
       ne.setRadiusSearch (0.03);

       // Compute the features
       ne.compute (*cloud_normals);

       //std::cout << endl << cloud_normals->size() << endl;


       // cloud_normals->size () should have the same size as the input cloud->size ()*

       int i = 0;
       for (pcl::Normal n : *cloud_normals) {
           //std::cerr << i << " n = " << n.normal_x << ", " << n.normal_y << ", " << n.normal_z << "\n";
           std::cout << n.normal_x << "," << n.normal_y << "," << n.normal_z << "\n";
           i++;
       }



    return 0;
}


martedì 3 novembre 2020

Matplot++ e QtCreator

Vista la necessita' di plottare in uno scatterplot 3D qualche decina di migliaia di punti ho cercato una libreria adeguata e l'ho trovata in Matplot++



Per integrarla con QtCreator (ma funziona cosi' anche con Visual Studio su Windows) dopo aver creato un progetto CMake nella root del progetto si digita

git clone https://github.com/alandefreitas/matplotplusplus/

successivamente si modifica il file CMakeLists.txt aggiungendo le righe evidenziate

add_subdirectory(matplotplusplus)

add_executable(grafico
  main.cpp
)
target_link_libraries(grafico PUBLIC matplot Qt${QT_VERSION_MAJOR}::Core)
#target_link_libraries(grafico PUBLIC matplot)

per la visualizzazione e' necessario che sia installato gnuplot



mercoledì 26 agosto 2020

Compilare Fritzing da sorgenti su Debian

Ho appena scoperto che non e' piu' possibile scaricare in modo gratuito Fritzing....ma e' comunque possibile compilarlo da sorgenti

Ovviamente ho deciso di provare a compilarlo da sorgenti


Per prima cosa si deve creare un directory in cui eseguire


git clone https://github.com/fritzing/fritzing-app

git clone https://github.com/fritzing/fritzing-parts


a questo punto si scaricano i sorgenti di Boost

apt-get install  libboost-dev

si crea quindi una directory libgit2 e si decomprimono i sorgenti da https://github.com/libgit2/libgit2/releases/tag/v0.28.5 e si compilano

mkdir build 
cd build 
cmake -DBUILD_SHARED_LIBS=OFF .. 
cmake --build .

a questo punto si apre QtCreator e si apre il progetto phoenix.pro e si lancia la compilazione

Arrivati fino a qui l'eseguibile e' compilato ma non riesce a trovare le librerie delle parti elettroniche

Per attivarle da linea di comando si lancia

/Fritzing -f "/home/luca/fritzing/build-phoenix-Desktop_Qt_5_13_2_GCC_64bit-Debug/" -parts "/home/luca/fritzing/fritzing-parts/"




domenica 19 aprile 2020

QTCustomPlot da dati CSV

Un progettino semplice per graficare dati derivanti da un file CSV (si tratta di un progetto satellite di un progetto Android con cui, tramite applicazione, vengono salvati i dati di accelerazione)



Come libreria per plottare i dati ho usato QTCustomPlot per la semplicita' di zoom/pan mentre per la lettura di CSV e' stata impiegata QtCSV

Il codice e' disponibile su GitHub. E' possibile zoom/pan ed avere le coordinate del puntatore

Per impostare QTCustomPlot su QtCreator si devono imporate i file qtcustomplot.cpp/ qtcustomplot.h, si aggiunge al file .pro  QT += printsupport, si trascina sul form un QWidget, tasto destro Promote To e si fa il promote a QtCustomPlot (il metodo e' cambiato rispetto al precedente post https://debiaonoldcomputers.blogspot.com/2013/11/software-per-progetto-force-gauge.html)

======================================================
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"

#include "variantdata.h"
#include "reader.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QString filePath = "/home/luca/ss/7.csv";

    QList<QStringList> readData = QtCSV::Reader::readToList(filePath,";");

    QVector<double> x(readData.size()), y(readData.size());

    //l.resize(readData.size());

  for ( int i = 0; i < readData.size(); ++i )
  {
      x[i] = readData.at(i).value(1).toDouble()-1587149254484;
      y[i] = readData.at(i).value(2).toDouble();

  }
   //Abilita Drag e Zoom
    ui->customPlot->setInteraction(QCP::iRangeDrag,true);
    ui->customPlot->setInteraction(QCP::iRangeZoom,true);


    ui->customPlot->addGraph();
    ui->customPlot->graph(0)->setData(x,y);
    ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20)));
    ui->customPlot->graph(0)->setPen(QPen(Qt::blue));
    connect(ui->customPlot,SIGNAL(mousePress(QMouseEvent *)),SLOT (clickedGraph(QMouseEvent*)));
    connect(ui->customPlot,SIGNAL(mouseMove(QMouseEvent *)),SLOT (MouseGraph(QMouseEvent*)));

    ui->customPlot->addGraph();

    ui->customPlot->xAxis->setLabel("Time");
    ui->customPlot->yAxis->setLabel("Acc");

    //double x_min = *std::min_element(x.constBegin(), x.constEnd());
    //double x_max = *std::max_element(x.constBegin(), x.constEnd());
    //double y_min = *std::min_element(y.constBegin(), y.constEnd());
    //double y_max = *std::max_element(y.constBegin(), y.constEnd());
    //ui->customPlot->xAxis->setRange(x_min, x_max);
    //ui->customPlot->yAxis->setRange(y_min, y_max);

    ui->customPlot->rescaleAxes();
    ui->customPlot->replot();
    //qDebug() << ui->customPlot->xAxis->pixelToCoord(mouseEvent->pos().x()) << ui->customPlot->yAxis->pixelToCoord(mouseEvent->pos().y());
}

void MainWindow::clickedGraph(QMouseEvent *event)
{
    QPoint point = event->pos();
    qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
    qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());

}

void MainWindow::MouseGraph(QMouseEvent *event)
{
    QPoint point = event->pos();
    qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
    qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());

    QVariant xi = ui->customPlot->xAxis->pixelToCoord(point.x());
    QVariant yi = ui->customPlot->yAxis->pixelToCoord(point.y());

    ui->xmouse->setText(xi.toString());
    ui->ymouse->setText(yi.toString());


}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_horizontalSlider_valueChanged(int value)
{
}

martedì 16 luglio 2013

Esempio GUI con QtQuick 2.0



Riprendendo la serie di esempi di GUI stavolta e' la volta di QtQuick (Qt 5.1)
Da notare che la release 5.1 i problemi all'editor visuale di QtQuick all'interno di QtCreator sembrano essere risolti per cui per progettare la pagina e' sufficiente fare doppio clic sul file .qml della colonna Progetti

Editor Visuale di QtQuick in QtCreator


------------------------------------------
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0

ApplicationWindow {
    title: qsTr("Esempio")
    width: 250
    height: 160
    
    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    TextField {
        id: text_field1
        x: 21
        y: 17
        width: 200
        height: 20
        text: ""
        placeholderText: ""

    }

    ProgressBar {
        id: progress_bar1
        x: 21
        y: 54
    }

    Slider {
        id: slider__horizontal_1
        x: 21
        y: 101
        value: 0.5
        onValueChanged: aggiorna();
        function aggiorna()
            {
            text_field1.text = slider__horizontal_1.value.toFixed(2).toString();
            progress_bar1.setValue(slider__horizontal_1.value);

        }

    }
}


martedì 2 luglio 2013

Errore cannot read creator env file /tmp/ in QtCreator

Programmando in Qt4 e' comparso un curioso messaggio di errore nel momento di lanciare l'esecuzione del programma dall'interno di QtCreator

cannot read creator env file /tmp/.....



ed il programma non entra in esecuzione
Aprendo una shell, entrando nella directory del programma a cui stavo lavorando ed eseguendo la compilazione a mano con qmake, make il programma si e' compilato ed eseguito correttamente

il  problema sembra legato all'interfaccia tra QtCreator ed (in questo caso) LXDETerminal..comunque
sono in buona compagnia

venerdì 29 marzo 2013

Importare Progetti Qt in QtCreator da Windows a Linux

Per poter spostare un progetto in Qt/QtCreator sviluppato su Windows in una Linux Box non e' sufficiente copiare la directory dei sorgenti in quanto una volta aperto il file .pro in QtCreator si avranno errori in particolare sul file Make

e' quindi necessario, prima di aprire il file .pro
1) Cancellare la directory di debug/release
2) Cancellare Makefile, Makefile.debug, Makefile.Release
3) cancella object_script*.*
4) cancellare il file *.pro.user (attenzione non file .pro)

a questo punto si puo' aprire il file .pro e compilare.
I file mancanti verranno ricostruiti sulla base delle impostazione Linux

(informazione ripresa da qui)

giovedì 31 gennaio 2013

Debug in QtCreator

Effettuare una sessione di debug in QtCreator e' molto simile ad una qualsiasi altra IDE.
Cliccando sulla colonna grigia a sinistra dei numeri di riga si inseriscono i break point

Per iniziare il debug ci clicca F5 ed il programma si blocca sul primo breakpoint
Poi ci sono F10 (Step Over) ed F11 (Step Into)


Non e' necessario aggiungere manualmente le watch dato che il tutte le variabili ed il loro valore istantaneo sono elencate nella colonna a destra

Creare una nuova finestra in Qt

Questo post e' per indicare come creare un progetto in Qt basato su piu' form e come farle apparire

Si parte creando un progetto standard (Qt Gui Application) specificando una QMainWindow
Una volta terminata la fase di creazione si clicca sul ramo Form del progetto e si aggiunge una nuova Q Designer Form class

avremo quindi alla fine due form denominati mainwindow e mainwindow2.

A questo punto si aggiunge un pulsante a mainwindow e si aggiunge uno slot su OnClicke e si inizia a modificare il codice come segue (modifiche evidenziate in giallo)

mainwindow.h
---------------------------------

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mainwindow2.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


---------------------------------

mainwindow.cpp
---------------------------------

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow2.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    MainWindow2 *j = new MainWindow2();
    j->show();
}

---------------------------------
Il risultato finale e' quello mostrato in immagine


Alla pressione del pulsante sulla finestra1 si apre la finestra2

martedì 29 gennaio 2013

Esempio di QTableView

Un breve esempio su come predisporre una visione tabellare dei dati in Qt

Per prima cosa si deve trascinare una QTableView sul form di interesse


Successivamente, da codice, si possono cambiare le impostazioni.
E' importante comprendere che la vestizione dell'oggetto avviene tramite il sistema model/view per cui e' necessario creare un model, associarlo alla tableview e poi impostare le proprieta' dell'oggetto mediante il model

Di seguito un esempio del codice che produce la finestra sotto riportata


---------------------------------------------

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QStandardItemModel *model = new QStandardItemModel(2,3,this); //2 Rows and 3 Columns
    model->setHorizontalHeaderItem(0, new QStandardItem(QString("Titolo Col.1")));
    model->setHorizontalHeaderItem(1, new QStandardItem(QString("Titolo Col.2")));
    model->setHorizontalHeaderItem(2, new QStandardItem(QString("Titolo Col.3")));

    ui->tableView->setModel(model);

    QStandardItem *uno = new QStandardItem(QString("uno"));
    model->setItem(0,0,uno);

    QStandardItem *due = new QStandardItem(QString("due"));
    model->setItem(0,1,due);


    QStandardItem *tre = new QStandardItem(QString("tre"));
    model->setItem(1,0,tre);
}

Widget::~Widget()
{
    delete ui;
}



lunedì 28 gennaio 2013

Compilare librerie esterne in Qt/QtCreator

In questo post verra' mostrato come linkare una libreria esterna al pacchetto Qt mediante l'uso di QtCreator.
La libreria di esempio e' costuita dalle Shapefile C Library, una libreria che serve per leggere i file ESRI .shp

Una volta scaricato il file tgz si spacchetta e si digita
make
make test (per controllare che la compilazione sia andata a buon fine)
make install (per installare la libreria ed i file di sviluppo)

al termine la libreria si chiamera' libshp.a e sara' posta in /usr/local/lib mentre i file di include saranno in /usr/local/include

shape.pro
---------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2013-01-28T12:49:51
#
#-------------------------------------------------
QT       += core
QT       -= gui
TARGET = shape
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L/usr/local/lib -lshp
INCLUDEPATH += -I/usr/local/include
---------------------------------

per vedere se il programma funziona si puo' rubare parte del codice al programma shpinfo.c che si trova nella sottodirectory contrib del pacchetto shapelib.tgz

main.cpp
--------------------------------

#include "shapefil.h"
#include <QDebug>
#include <iostream>


............................


SHPHandle   hSHP;
int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart;
double *padVertices, adfBndsMin[4], adfBndsMax[4];
hSHP = SHPOpen("/home/luca/shp/test.shp","rb");
if( hSHP == NULL )
            {

            }
SHPGetInfo( hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax );
qDebug() << nShapeType;

---------------------------------

Qt Console Application

Oltre alle applicazioni GUI con Qt e' possibile anche creare delle applicazioni da console (anche usando i template di QtCreator)


Lo scheletro dell'applicazione e' il seguente
-------------------------------

#include <QtCore/QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    return a.exec();
}
-------------------------------
Se si esegue il codice si ha la sorpresa di aver una finestra di consolle perennemente aperta
Cio e' dovuto al fatto che l'applicazione per chiudersi deve ricevere un esplicito messaggio di chiusura che puo' essere effettuato mediante una chiamata
QCoreApplication::exit(0)

oppure mediante una via piu' complicata
------------------------
#include <QtCore/QCoreApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer::singleShot(5000, &a, SLOT(quit())); 
    return a.exec();
}


giovedì 24 gennaio 2013

Documentazione di Qt

La documentazione di Qt in Linux si ottiene includendo i pacchetti

apt-get install qt4-doc
apt-get install qtcreator-doc

dall'interno di QtCreator si accede alla documentazione con l'apposito pulsante sulla barra di sinistra



puo' accadere, come indicato nell'immagine, che il file della documentazione non sia indicizzato.
E' sufficiente attendere e riprovare per ottenere la ricerca per argomento su tutta la documentazione

martedì 22 gennaio 2013

Mandelbrot in QT

Un classico di questo blog ovvero disegnare l'insieme di Mandelbrot con varie librerie grafiche

Per questo esempio e' stata usata come base il post "Disegnare in QT" con la differenza che in questo caso non vengono disegnate linee  bensi' punti


il trucco per disegnare punti risiede nella linea che e' stata evindeziata in colore giallo ovvero utilizzando una primitiva di una ellisse di raggio molto piccolo

dialog.cpp
---------------------------------------------------
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)




{
    float re_min = -2.0;
    float im_min = -1.2;

    float re_max = 1.0;
    float im_max = 1.2;
    int iterazioni = 255;
    int SCREEN_WIDTH = 640;
    int SCREEN_HEIGHT = 480;


    float a,b;
    float x,y,x_new,y_new;

    int k,j,i,test;

    float re_factor = (re_max-re_min);
    float im_factor = (im_max-im_min);

    ui->setupUi(this);

    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    QBrush brush(Qt::black);

    QPen penna(Qt::black);
    penna.setWidth(1);

    for (i=0;i<SCREEN_HEIGHT;i++)
        {
        for (j=0;j<SCREEN_WIDTH;j++)
            {
            a = re_min+(j*re_factor/SCREEN_WIDTH);
            b = im_min+(i*im_factor/SCREEN_HEIGHT);

            x = 0;
            y = 0;
            test = 0;

            for (k=0;k<iterazioni;k++)
                {
                x_new = (x*x)-(y*y)+a;
                y_new = (2*x*y)+b;
                if (((x_new*x_new)+(y_new*y_new))>4)
                    {
                    test = k;
                    if (k%2 == 0)
                         scene->addEllipse(j,i,0.1,0.1,penna,brush);
                    break;
                    }
                x = x_new;
                y = y_new;
                }

            }

        }
    //linea = scene->addLine(100,100,100,100,penna);
}

Dialog::~Dialog()
{
    delete ui;
}

Disegnare in QT

In questo post verra' mostrato un esempio di come disegnare in una QGraphicsScene

Per prima cosa si crea un nuovo progetto definendo un QDialog



A questo punto dall'editor visuale si aggiunge al form una



Si modificano i file dialog.h e dialog.cpp come evidenziato nel listato sotto riportato


ed ecco il risultato (non e' un granche')



dialog.h
----------------------------------

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtCore>
#include <QtGui>



namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private:
    Ui::Dialog *ui;
    QGraphicsScene *scene;
    QGraphicsLineItem *linea;
};
#endif // DIALOG_H
----------------------------------

dialog.cpp
----------------------------------
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
    QBrush brush(Qt::black);
    QPen penna(Qt::black);
    penna.setWidth(6);
    linea = scene->addLine(100,100,100,100,penna);
}

Dialog::~Dialog()
{
    delete ui;
}
----------------------------------

da tenere presente che non esiste una primitiva per il disegno di un punto
si puo' vedere l'esempio di Mandelbrot in Qt per vedere come disegnare i singoli pixel

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...