Code Monkey home page Code Monkey logo

fstl's People

Contributors

ahorn42 avatar akranen avatar bionik avatar developerpaul123 avatar engnadeau avatar franciscod avatar gsohler avatar jackie-scholl avatar marekpikula avatar mboerwinkle avatar mkeeter avatar mtkaalund avatar mx1up avatar nmaggioni avatar nnadeau avatar phreaker0 avatar sur5r avatar tpikonen avatar wdaniau avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fstl's Issues

Add version number

Just add the version number to the about screen or somewhere else. Couldn't find it in the programm.

Typo in `src/window.cpp`

In file src/window.cpp, method Window::on_open() (lines 181-189), there is a typo in line 184:

void Window::on_open()
{
    QString filename = QFileDialog::getOpenFileName(
                this, "Load .stl file", QString(), "STL files (*.stl, *.STL)"); // *** here!!
    if (!filename.isNull())
    {
        load_stl(filename);
    }
}

Just need to remove last comma in line 184, the proper string to be as: "STL files (*.stl *.STL)"

Otherwise, in Fedora 36 (for example), open cannot access files with extension *.stl (lowercase) only uppercase ones. Actually, the current version is filtering *.stl, extensions which makes no sense.

Add .desktop file for linux and a .png version of the icon.

The desktop can be something like:

Type=Application
Version= 0.9.3
Name=fstl
Comment=Fast viewer for .stl files.
Exec=fstl %F
Categories=Graphics;
Icon=fstl.png

The png is something someone must export from the ico file or convert the original file.

Feature request: hide menu option (on Linux)

If it is not too difficult, I would kindly ask the developers to add an option to hide the menu below the window title. This would save a little bit of screen space when one needs to open multiple STLs side-to-side.

Accidental CMakeLists change

I was working on a fix for a cmake warning with this commit: mboerwinkle@7a1e638

This commit modified my existing pull request on mkeeter/fstl. A few minutes later, @mkeeter merged the pull request, inadvertently including my untested (it works for me, but I hadn't submitted it for review yet) modification to CMakeLists.txt.

I wanted to make sure this did not go unnoticed and cause problems for someone.

Martin

FSTL is not able to load stl files in a big endian environment (PowerPC)

I would like to use FSTL on my Debian installation working on a PowerPC CPU and a 64bit linux environment.
If I try to load any STL file, FSTL does exactly nothing, it does not show any object, nor provided an alert of any kind that something went wrong. I tried recompiling from source code the current version from this repository, but again FSTL seems to ignore any STL file I select.
I might be probably wrong, but it seems to me that STL files I am trying to load with FSTL are encoded as little endian and the FSTL loader is not able to detect that it is running on a big endian system.

compiling with qt5 and debian

libqt5opengl5-dev installed,

zippo:/files/programming/src/fstl/fstl/build# make -j8
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o app.o ../src/app.cpp
.
.
.
compilation terminated.

digging turns out that even with qt4 removed, system was trying to use it.

so

zippo:/files/programming/src/fstl/fstl/build# /usr/lib/i386-linux-gnu/qt5/bin/qmake ../qt/fstl.pro
Info: creating stash file /files/programming/src/fstl/fstl/build/.qmake.stash
zippo:/files/programming/src/fstl/fstl/build# ls
Makefile
zippo:/files/programming/src/fstl/fstl/build# make -j8
.
.
.
(happyness)

I dont know if this was caused by something in my build env. or by the fstl.pro

thanks for watching!

moving to QOpenGLWidget

Just to share my finding that moving to QOpenGLWidget, from QGLWidget. The changes is quite straight forward (by replacing QGLWidget --> QOpenGLWidget, ..).
To make it work, the tricky part is to replace paintEvent with paintGL to avoid issue with display. The complete change is in fork out code in my github.

Support for ASCII STL

Hi

Would be great to add support for ASCII STL, mainly because it's what OpenSCAD generates.

thanks
D

Corrupted stl with libfivepy

If you open an libfivepy generated stl file with fstl and set it to auto-reload; every time you regenerate the stl (with libfivepy) fstl say it is corrupted. Which is strange because it display the stl fine and it doesn't occur when you load the file manually.

This is probably a libfivepy issue but here is a post anyway.

Link to the thread on libfivepy: https://gitlab.com/rcmz0/libfivepy/issues/4

Feature request: next/previous STL

With an image viewer, I can press Space to go to the next photo and Backspace to go to the previous.

It would be great to have a similar functionality in a directory full of STLs.

License clarification

I'm currently trying to package fstl for Debian. Is the custom license intentional or is it supposed to be MIT?

Models are upside down

All my models are upside down. I wish I had an option to change the default orientation as upside down.

Qt 5.12.x leads to blank window

The newest Qt libs seem to require fmt.setSamples(4) to get rid of the blank screen and error messages. With Qt 5.11.x fstl worked perfectly for me, but now it doesn't any more ๐Ÿ˜ข.

Could you please implement it and release a new version?

compile on Windows

Hello,
I've installed Qt 5.11.2 on Windows 10.
Then I got linking error for glPolygonMode.
If I comment out the three instances of glPolygonMode in canvas.cpp it compiles and run.

Error:
canvas.obj : error LNK2019: unresolved external symbol __imp_glPolygonMode referenced in function "private: void __cdecl Canvas::draw_mesh(void)" (?draw_mesh@Canvas@@AEAAXXZ)
release\fstl.exe : fatal error LNK1120: 1 unresolved externals

No way to disable obnoxious file warning after opening every file

Every time I open a STL file generated by solidworks, fstl pops up a pointless warning dialog:


Warning:
This .stl file begins with solid but appears to be a binary file.
fstl loaded it, but other programs may be confused by this file.


I've used solidworks to generate hundreds of STLs for use with probably dozens of other pieces of software, and never had issues (aside from the usual mm/inch confusion). Furthermore, this dialog is modal and cannot be prevented from popping up.

From the original STL specification, the first 80 bytes are specified as "Header. No special significance". If there's software out there that's making assumptions about the contents of the file based on the first 80 bytes, and not using further heuristics to validate that assumption, that other piece of software is broken. It shouldn't be something fstl bothers me about.

Segfault and lesser issues with autoreload

I am using fstl to display designs for 3D printing that are frequently modified and regenerated. The default-enabled autoreload feature has some drawbacks in that use case.

First, fstl frequently crashes while the .stl is being regenerated. This is because in Loader::read_stl_ascii(), the size of the vector returned by split() is not checked before using the elements. When a vertex row has not yet been completely written, fstl crashes.

Additionally it would be really neat if fstl either waited before autoreloading until the file size does not change any more, or if it reloaded again without an error pop-up in that case. Otherwise I have had to click away several message dialogs from the same reload.

Finally the focus stealing on autoreload is a pain when one does not want to switch to fstl despite regenerating the .stl.

Cannot build on Ubuntu 20.04 LTS

#67 Broke the ability to build on Ubuntu 20.04 LTS since it ships with Qt 5.12. It's your decision how soon you want to leave behind users, but personally I think it's reasonable to support the current LTS of one of the most popular distros.

In my fork I've reverted that commit, and fstl builds and runs fine (no deprecation warnings are issued under 5.12). I can open a PR if you want.

How to improve for multiple objects?

It may not a simple task, but how can I improve the program to accept multiple objects and display them? I understand that the code utilizes QGLBuffer for faster rendering, but don't know how. Can I know rough algorithm for this? Thanks for a nice code.

Fix Debian packaging

Debian packaging is currently not fully functional. We need to specify the dependent packages and ensure we follow Debian packaging guidelines. Comments from this thread are relevant to this issue as well.

version number missing

i've downloaded version 0.9.4 but when selecting it in the Finder no version number is visible:
Screenshot 2021-03-28 at 22 41 09

both the CFBundleVersion and the CFBundleShortVersionString entries are missing from your Info.plist file. both should be set to 0.9.4. all macOS apps are supposed to have version information.

furthermore, the Info.plist contains the 'CFBundleGetInfoString' entry which has been deprecated for more than 10 years and would prevent the display of version infomation in the 'Get Info' window even if it was present. this needs to be removed.

Maximize window on startup

The very first thing I always do after running fstl is to maximize the window.

In window.cpp, immediately after the opening curly brace on line 17 (before the call to setWindowTitle("fstl");), I added this:

    setWindowState(Qt::WindowMaximized);

and now it behaves like I want. Since this is such a simple change, I didn't write a PR.
Feel free to close if you don't think this is useful, but I really like it.

Thank you for fstl!!!

Disable error message option

So when saving the stl, fstl will autoreload it before the file finished being written which will result in an error, so an option to disable error messages would be great as always closing those windows is annoying and pressing F5 each time isn't as conveniant as if it would always auto reload ^

compile problem under linux

I'v never yet had a qt project compile without issues....
Maybe this is something simple.

zippo:/files/programming/src/fstl/fstl/build# qmake ../qt/fstl.pro
zippo:/files/programming/src/fstl/fstl/build# make -j8
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o app.o ../src/app.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o main.o ../src/main.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o canvas.o ../src/canvas.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o mesh.o ../src/mesh.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o glmesh.o ../src/glmesh.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o loader.o ../src/loader.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o window.o ../src/window.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o backdrop.o ../src/backdrop.cpp
In file included from /usr/include/c++/4.7/future:35:0,
from ../src/loader.cpp:1:
/usr/include/c++/4.7/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
/usr/lib/i386-linux-gnu/qt4/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. ../src/app.h -o moc_app.cpp
/usr/lib/i386-linux-gnu/qt4/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. ../src/canvas.h -o moc_canvas.cpp
../src/canvas.h:64: Warning: Property declaration perspective has no READ accessor function. The property will be invalid.
/usr/lib/i386-linux-gnu/qt4/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. ../src/loader.h -o moc_loader.cpp
/usr/lib/i386-linux-gnu/qt4/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. ../src/window.h -o moc_window.cpp
/usr/lib/i386-linux-gnu/qt4/bin/rcc -name qt ../qt/qt.qrc -o qrc_qt.cpp
/usr/lib/i386-linux-gnu/qt4/bin/rcc -name gl ../gl/gl.qrc -o qrc_gl.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o moc_app.o moc_app.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o moc_canvas.o moc_canvas.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o moc_loader.o moc_loader.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o moc_window.o moc_window.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o qrc_qt.o qrc_qt.cpp
g++ -c -pipe -O3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/X11R6/include -I. -I../qt -I. -o qrc_gl.o qrc_gl.cpp
In file included from ../src/loader.h:6:0,
from ../src/window.cpp:7:
../src/mesh.h:12:30: error: expected ',' or '...' before '&&' token
In file included from /usr/include/qt4/QtCore/QFileSystemWatcher:1:0,
from ../src/window.h:6,
from ../src/window.cpp:5:
/usr/include/qt4/QtCore/qfilesystemwatcher.h: In constructor 'Window::Window(QWidget*)':
/usr/include/qt4/QtCore/qfilesystemwatcher.h:76:10: error: 'void QFileSystemWatcher::fileChanged(const QString&)' is protected
../src/window.cpp:36:52: error: within this context
../src/window.cpp:37:54: error: no matching function for call to 'Window::connect(QFileSystemWatcher*&, void (QFileSystemWatcher::)(const QString&), Window const, void (Window::)(const QString&))'
../src/window.cpp:37:54: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QFileSystemWatcher::)(const QString&)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QFileSystemWatcher::)(const QString&)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QFileSystemWatcher::)(const QString&)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:40:45: error: within this context
../src/window.cpp:41:44: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, void (Window::)())'
../src/window.cpp:41:44: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:44:45: error: within this context
../src/window.cpp:45:42: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, bool (QWidget::)())'
../src/window.cpp:45:42: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:50:51: error: within this context
../src/window.cpp:51:51: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, void (Window::)(bool))'
../src/window.cpp:51:51: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:55:47: error: within this context
../src/window.cpp:56:46: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, void (Window::)())'
../src/window.cpp:56:46: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:58:46: error: within this context
../src/window.cpp:59:45: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, void (Window::)())'
../src/window.cpp:59:45: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qmenu.h:48:0,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qaction.h:228:10: error: 'void QAction::triggered(bool)' is protected
../src/window.cpp:61:59: error: within this context
../src/window.cpp:62:52: error: no matching function for call to 'Window::connect(QAction* const&, void (QAction::)(bool), Window const, void (Window::)())'
../src/window.cpp:62:52: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject
, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject
, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QAction::)(bool)' to 'const char'
In file included from /usr/include/qt4/QtGui/qaction.h:255:0,
from /usr/include/qt4/QtGui/qmenu.h:48,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qactiongroup.h:95:10: error: 'void QActionGroup::triggered(QAction*)' is protected
../src/window.cpp:63:57: error: within this context
../src/window.cpp:64:51: error: no matching function for call to 'Window::connect(QActionGroup* const&, void (QActionGroup::)(QAction), Window* const, void (Window::)(QAction))'
../src/window.cpp:64:51: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from 'void (QActionGroup::)(QAction)' to 'const char*'
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from 'void (QActionGroup::)(QAction)' to 'const QMetaMethod&'
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
/usr/include/qt4/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from 'void (QActionGroup::)(QAction)' to 'const char*'
../src/window.cpp:68:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:68:10: error: 'file_menu' does not name a type
../src/window.cpp:69:5: error: 'file_menu' was not declared in this scope
../src/window.cpp:76:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:76:10: error: 'view_menu' does not name a type
../src/window.cpp:77:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:77:10: error: 'projection_menu' does not name a type
../src/window.cpp:78:5: error: 'projection_menu' was not declared in this scope
../src/window.cpp:80:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:80:10: error: 'projections' does not name a type
../src/window.cpp:81:10: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:81:15: error: 'p' does not name a type
../src/window.cpp:81:58: error: expected ';' before ')' token
../src/window.cpp:81:58: error: expected primary-expression before ')' token
../src/window.cpp:81:58: error: expected ';' before ')' token
../src/window.cpp:83:9: error: 'projections' was not declared in this scope
../src/window.cpp:83:32: error: 'p' was not declared in this scope
../src/window.cpp:87:5: error: 'projections' was not declared in this scope
In file included from /usr/include/qt4/QtGui/qaction.h:255:0,
from /usr/include/qt4/QtGui/qmenu.h:48,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
/usr/include/qt4/QtGui/qactiongroup.h:95:10: error: 'void QActionGroup::triggered(QAction*)' is protected
../src/window.cpp:88:50: error: within this context
../src/window.cpp:91:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:91:10: error: 'help_menu' does not name a type
../src/window.cpp:92:5: error: 'help_menu' was not declared in this scope
../src/window.cpp: In member function 'void Window::set_watched(const QString&)':
../src/window.cpp:161:11: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:161:16: error: 'files' does not name a type
../src/window.cpp:162:9: error: 'files' was not declared in this scope
../src/window.cpp:169:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:169:10: error: 'recent' does not name a type
../src/window.cpp:170:11: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:170:16: error: 'f' does not name a type
../src/window.cpp:171:5: error: 'recent' was not declared in this scope
../src/window.cpp:171:22: error: 'f' was not declared in this scope
../src/window.cpp: In member function 'void Window::rebuild_recent_files()':
../src/window.cpp:226:11: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:226:16: error: 'actions' does not name a type
../src/window.cpp:227:10: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:227:15: error: 'a' does not name a type
../src/window.cpp:231:5: error: expected ';' before 'recent_files'
../src/window.cpp:231:25: error: could not convert '((QMenu*)((Window*)this)->Window::recent_files)->QMenu::clear()' from 'void' to 'bool'
../src/window.cpp:233:5: error: expected primary-expression before 'for'
../src/window.cpp:233:5: error: expected ')' before 'for'
../src/window.cpp:233:10: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:233:15: error: 'f' does not name a type
../src/window.cpp:240:5: error: expected ';' before 'if'
../src/window.cpp:240:5: error: expected primary-expression before 'if'
../src/window.cpp:240:5: error: expected ';' before 'if'
../src/window.cpp:240:5: error: expected primary-expression before 'if'
../src/window.cpp:240:5: error: expected ')' before 'if'
../src/window.cpp:242:9: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:242:14: error: 'a' does not name a type
../src/window.cpp:243:33: error: 'a' was not declared in this scope
../src/window.cpp: In member function 'void Window::on_reload()':
../src/window.cpp:252:5: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
../src/window.cpp:252:10: error: 'fs' does not name a type
../src/window.cpp:253:9: error: 'fs' was not declared in this scope
In file included from /usr/include/qt4/QtCore/QThread:1:0,
from ../src/loader.h:4,
from ../src/window.cpp:7:
/usr/include/qt4/QtCore/qthread.h: In member function 'bool Window::load_stl(const QString&, bool)':
/usr/include/qt4/QtCore/qthread.h:105:10: error: 'void QThread::started()' is protected
../src/window.cpp:266:30: error: within this context
../src/window.cpp:267:42: error: no matching function for call to 'Window::connect(Loader*&, void (QThread::)(), Window const, void (Window::*)())'
../src/window.cpp:267:42: note: candidates are:
In file included from /usr/include/qt4/QtGui/qwidget.h:47:0,
from /usr/include/qt4/QtGui/qmenu.h:45,
from /usr/include/qt4/QtGui/qmenubar.h:45,
from /usr/include/qt4/QtGui/QMenuBar:1,
from ../src/window.cpp:1:
.
.
.
ok just tell me if you want more cause theres a lot of it.

I built static fstl.exe, it does not work on Windows 7/8.

I want to build the static standalone 32-bit exe of fstl.
I used Windows 8 64 bit for doing that work.

For build the static Qt I use the https://wiki.qt.io/Building_a_static_Qt_for_Windows_using_MinGW article.
There is few free space on C disk. So I had installed the dynamic Qt environment and 32 bit mingw compiler to D:\Qt directory.
The Qt Version is 5.7.

I run powershell and executed windows-build-qt-static.ps1 script as
.\windows-build-qt-static.ps1 -QtStaticDir D:\Qt\Static -MingwDir D:\Qt\Tools\mingw530_32 -NoPause
The static Qt had been built normally.

I placed the fstl code to F:\fstl-master directory. For the static fstl.exe build I created on the desktop build.cmd file with code:
@echo off
set Path=%Path%;D:\Qt\Static\5.7.0\bin;D:\Qt\Tools\mingw530_32\bin
pushd F:\fstl-master\release
qmake ..\qt\fstl.pro
mingw32-make -f Makefile.Release
echo Done.
pause

I executed the build.cmd and static fstl.exe had been built normally. But that fstl.exe does not work. I had checked on Windows 7/8.
It's strange: that fstl.exe works normally on old Windows XP 32 bit.

The dynamic fstl.exe works normally on Windows XP/7/8 but for build without errors the following line is needed in fstl.pro:
LIBS += -lopengl32
The dynamic fstl.exe need many dll files and it's not conveniently.

I attached the static fstl.exe and screenshot of error.

What I did wrong?
Are there other methods to build static exe for Qt program?
virtualbox_windows 8_11_09_2016_01_44_55
fstl.zip

Canvas stays small, rest of window is black

Somehow, the rendered canvas doesn't scale to cover the entire window, instead it stays small at the corner:

1432913739
1432913743
1432913749

I've compiled fstl as following:

mkdir build
cd build
qmake ../qt/fstl.pro
make
./fstl
QMake version 3.0
Using Qt version 5.4.1 in /usr/lib

(Loading the project with QtCreator and building it from there yields the same issue)

I've tried tinkering with the transform and view matrices with no results :(

Is this a snapshot or model viewer?

Hey, just a quick question. Working on using this for a project, but I'm looking to take snapshots of models, not have them rotating in a program. Does this produce snapshots of models? The renderings look great.

Edit: seems like a model viewer. Any thoughts of building in a snapshot tool? I may be working on one.

New release?

Hey there! This is a pretty cool piece of software, and it also looks extremely good. I'd really like to package it for Void Linux, but unfortunately the latest release is quite a bit buggy (I had to compile master to actually get it to work).

Do you think it would be possible to make a release? If you need any help, I can try to aid you.

Request to remember settings

My main issue is that the program does not remember all of the settings: window size and position, shading type, autoreload, and projection type. Somehow, it remembers the inverted zoom being checked, but that's literally the only thing.

Fedora 24: fstl does not run with qt5 and does not compile with qt4

My operating system is Fedora 24 64 bit. Videocard is Nvidia NVS 5200M. I use the proprietary nvidia driver.
Qt version is 5.6.1.

Qt5:
I compiled the fstl normally by qmake-qt5 and make commands. But fstl does not run.
vovk@dell:/mnt/datadisk1/Work/fstl-master/release$ ./fstl
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

Aborted (core dumped)

With qt4 the fstl does not compile. I attached the log.

qt4_compile_log.txt

current 0.9.5-snapshot of fstl only show *.STL and not *.stl files in the load GUI

I am on a Debian SID PPC64 big endian and installed fstl from Debian repo (http://ftp.ports.debian.org/debian-ports/pool-ppc64/main/f/fstl/) as well as a freshly compiled version with sources downloaded from git.

While trying to load a file, the GUI in the version installed from Debian (version 0.9.4-1) only show stl files with a lower case extension, whereas the freshly compiled version (version 0.9.5-snapshot) only shows those with an upper case extension.

See image below, on the left the version installed from Debian, on the right the freshly compiled version.
On the bottom of the image a list of the two files contained in the currently selected folder by both fstl versions, one with a lower case extension, and one with an upper case extension.

If I click on the "*.stl" on the left, or on "STL files" on the right in the lower-right corner of the file dialog no other options shows up.

image

[Feature request] Add an option to reverse mouse wheel zoom direction

Hi

I'm using fstl almost every day, and each time I'm surprised by the way the zoom has been decided: mouse wheel to up zoom out.
In (almost ?) every 2D and 3D softwares (Inkscape, Gimp, Blender, Onshape, etc) I'm using, the mouse wheel is used the other way (and I'm used to it):

  • wheel up => zoom in
  • wheel down => zoom out

Could you add an option to invert this default behavior ? (command line option is fine)
Thanks a lot !

Debian/Linux

New release

Given several features have been implemented since the 0.9.4 release, maybe it's time to add a milestone for 0.9.5 and decide which issues should be completed for it.

feature request: rmb save as png

A nice feature to have: to be able to safe the viewed image as a graphics png file.

right mouse button, save as, stl_filename.png or something like that.

thanks

CLI Interface

This seems like a nice little utilty to batch produce STL thumbnails, how hard could it be to make it receive

  • Input file name --input
  • Output filename --output
  • Dimensions (w/h, or only one and assume square viewport --dimensions wxh or --dimensions n // where n is both w/h

And run as a console app, writing the resulting png in the output file, with the specified dimensions?

Warning When Configuring on Windows 10 with CMake 3.10.2

When configuring on windows 10 using the latest version of CMake (3.10.2) a warning is thrown because of the having CMAKE_AUTOMOC and CMAKE_AUTOUIC to on without explicitly setting the CMake policy CMP0071:

image

We can fix this multiple ways:

  1. Explicitly set CMP0071
  2. Turn CMAKE_AUTOMOC and CMAKE_AUTOUIC off and instead use qt5_wrap_cpp and qt5_wrap_ui.

@mkeeter What are your thoughts?

fstl cannot open .STL files

By that, I mean, if the extension is uppercase, fstl refuses to open the file. Same thing for the "File open" menu; it won't show files with uppercase extensions.

I hate uppercase extensions as much as the next guy, but this is inconvenient when you download a git repo with .STL files.

how to support gcode files

Hi, this is the fastest application we have ever to open the big STL file,
and can you support gcode file such as .g .gco .gcode
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.