Merge branch 'master' into translation2
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name" : "For Dark Background",
|
||||||
|
"index" : 1100,
|
||||||
|
"paper" : "#272822",
|
||||||
|
"text" : "#ffffff",
|
||||||
|
"caret" : {
|
||||||
|
"width" : 2,
|
||||||
|
"foreground" : "#ffff00",
|
||||||
|
"line-background" : "#68e1687f"
|
||||||
|
},
|
||||||
|
"colors" : {
|
||||||
|
"keyword1" : "#f12971",
|
||||||
|
"keyword2" : "#56dbf0",
|
||||||
|
"keyword3" : "#56d8f0",
|
||||||
|
"comment" : "#ccdf32",
|
||||||
|
"number" : "#af7dff",
|
||||||
|
"string" : "#e6db74",
|
||||||
|
"operator" : "#d8d8d8",
|
||||||
|
"commentline" : "#e6db74",
|
||||||
|
"selection-foreground" : "#ffff00",
|
||||||
|
"selection-background" : "#a0a0ff",
|
||||||
|
"margin-background" : "#14141496",
|
||||||
|
"margin-foreground" : "#fff",
|
||||||
|
"matched-brace-background" : "#333",
|
||||||
|
"matched-brace-foreground" : "#fff",
|
||||||
|
"unmatched-brace-background" : "#333",
|
||||||
|
"unmatched-brace-foreground" : "#fff",
|
||||||
|
"error-marker" : "#ff0000",
|
||||||
|
"edge" : "#ffffff"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name" : "For Light Background",
|
||||||
|
"index" : 1000,
|
||||||
|
"paper" : "#fff",
|
||||||
|
"text" : "#272822",
|
||||||
|
"caret" : {
|
||||||
|
"width" : 2,
|
||||||
|
"foreground" : "#000000",
|
||||||
|
"line-background" : "#ffe4e4"
|
||||||
|
},
|
||||||
|
"colors" : {
|
||||||
|
"keyword1" : "Green",
|
||||||
|
"keyword2" : "Green",
|
||||||
|
"keyword3" : "DarkBlue",
|
||||||
|
"comment" : "DarkCyan",
|
||||||
|
"number" : "DarkRed",
|
||||||
|
"string" : "DarkMagenta",
|
||||||
|
"operator" : "Blue",
|
||||||
|
"commentline" : "DarkCyan",
|
||||||
|
"selection-foreground" : "#ffff00",
|
||||||
|
"selection-background" : "#a0a0ff",
|
||||||
|
"margin-background" : "#ccc",
|
||||||
|
"margin-foreground" : "#111",
|
||||||
|
"matched-brace-background" : "#333",
|
||||||
|
"matched-brace-foreground" : "#fff",
|
||||||
|
"unmatched-brace-background" : "#333",
|
||||||
|
"unmatched-brace-foreground" : "#fff",
|
||||||
|
"error-marker" : "#ff0000",
|
||||||
|
"edge" : "#ffffff"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name" : "Monokai",
|
||||||
|
"index" : 1200,
|
||||||
|
"paper" : "#272822",
|
||||||
|
"text" : "#f8f8f2",
|
||||||
|
"caret" : {
|
||||||
|
"width" : 2,
|
||||||
|
"foreground" : "#ffff00",
|
||||||
|
"line-background" : "#3e3d32"
|
||||||
|
},
|
||||||
|
"colors" : {
|
||||||
|
"keyword1" : "#66c3b3",
|
||||||
|
"keyword2" : "#79abff",
|
||||||
|
"keyword3" : "#ffffff",
|
||||||
|
"comment" : "#ccdf32",
|
||||||
|
"number" : "#7fb347",
|
||||||
|
"string" : "#e6db74",
|
||||||
|
"operator" : "#d8d8d8",
|
||||||
|
"commentline" : "#75715e",
|
||||||
|
"selection-foreground" : "#ffff00",
|
||||||
|
"selection-background" : "#a0a0ff",
|
||||||
|
"margin-background" : "#757575",
|
||||||
|
"margin-foreground" : "#f8f8f2",
|
||||||
|
"matched-brace-background" : "#333",
|
||||||
|
"matched-brace-foreground" : "#fff",
|
||||||
|
"unmatched-brace-background" : "#333",
|
||||||
|
"unmatched-brace-foreground" : "#fff",
|
||||||
|
"error-marker" : "#ff0000",
|
||||||
|
"edge" : "#ffffff"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name" : "Solarized",
|
||||||
|
"index" : 1300,
|
||||||
|
"paper" : "#fdf6e3",
|
||||||
|
"text" : "#657b83",
|
||||||
|
"caret" : {
|
||||||
|
"width" : 2,
|
||||||
|
"foreground" : "#0000ff",
|
||||||
|
"line-background" : "#eeead5"
|
||||||
|
},
|
||||||
|
"colors" : {
|
||||||
|
"keyword1" : "#268ad1",
|
||||||
|
"keyword2" : "#6c71c4",
|
||||||
|
"keyword3" : "#b58800",
|
||||||
|
"comment" : "#b58900",
|
||||||
|
"number" : "#cb4b16",
|
||||||
|
"string" : "#2aa198",
|
||||||
|
"operator" : "#859900",
|
||||||
|
"commentline" : "#b58800",
|
||||||
|
"selection-foreground" : "#fdf6e3",
|
||||||
|
"selection-background" : "#657b83",
|
||||||
|
"margin-background" : "#eee8d5",
|
||||||
|
"margin-foreground" : "#93a1a1",
|
||||||
|
"matched-brace-background" : "#333",
|
||||||
|
"matched-brace-foreground" : "#fff",
|
||||||
|
"unmatched-brace-background" : "#333",
|
||||||
|
"unmatched-brace-foreground" : "#fff",
|
||||||
|
"error-marker" : "#ff0000",
|
||||||
|
"edge" : "#ffffff"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "BeforeDawn",
|
||||||
|
"index" : 1400,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#333333",
|
||||||
|
"opencsg-face-front" : "#cccccc",
|
||||||
|
"opencsg-face-back" : "#5563dd",
|
||||||
|
"cgal-face-front" : "#cccccc",
|
||||||
|
"cgal-face-back" : "#5563dd",
|
||||||
|
"cgal-face-2d" : "#00bf99",
|
||||||
|
"cgal-edge-front" : "#ff0000",
|
||||||
|
"cgal-edge-back" : "#ff0000",
|
||||||
|
"cgal-edge-2d" : "#ff0000",
|
||||||
|
"crosshair" : "#f0f0f0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "DeepOcean",
|
||||||
|
"index" : 1600,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#333333",
|
||||||
|
"opencsg-face-front" : "#eeeeee",
|
||||||
|
"opencsg-face-back" : "#0babc8",
|
||||||
|
"cgal-face-front" : "#eeeeee",
|
||||||
|
"cgal-face-back" : "#0babc8",
|
||||||
|
"cgal-face-2d" : "#9370db",
|
||||||
|
"cgal-edge-front" : "#0000ff",
|
||||||
|
"cgal-edge-back" : "#0000ff",
|
||||||
|
"cgal-edge-2d" : "#ff00ff",
|
||||||
|
"crosshair" : "#f0f0f0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "Metallic",
|
||||||
|
"index" : 1100,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#aaaaff",
|
||||||
|
"opencsg-face-front" : "#ddddff",
|
||||||
|
"opencsg-face-back" : "#dd22dd",
|
||||||
|
"cgal-face-front" : "#ddddff",
|
||||||
|
"cgal-face-back" : "#dd22dd",
|
||||||
|
"cgal-face-2d" : "#00bf99",
|
||||||
|
"cgal-edge-front" : "#ff0000",
|
||||||
|
"cgal-edge-back" : "#ff0000",
|
||||||
|
"cgal-edge-2d" : "#ff0000",
|
||||||
|
"crosshair" : "#800000"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name" : "Monotone",
|
||||||
|
"index" : 9999,
|
||||||
|
"show-in-gui" : false,
|
||||||
|
"description" : "Color scheme with no difference between 'back face' and 'front face'",
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#ffffe5",
|
||||||
|
"opencsg-face-front" : "#f9d72c",
|
||||||
|
"opencsg-face-back" : "#f9d72c",
|
||||||
|
"cgal-face-front" : "#f9d72c",
|
||||||
|
"cgal-face-back" : "#f9d72c",
|
||||||
|
"cgal-face-2d" : "#00bf99",
|
||||||
|
"cgal-edge-front" : "#ff0000",
|
||||||
|
"cgal-edge-back" : "#ff0000",
|
||||||
|
"cgal-edge-2d" : "#ff0000",
|
||||||
|
"crosshair" : "#800000"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "Nature",
|
||||||
|
"index" : 1500,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#fafafa",
|
||||||
|
"opencsg-face-front" : "#16a085",
|
||||||
|
"opencsg-face-back" : "#dbf4da",
|
||||||
|
"cgal-face-front" : "#16a085",
|
||||||
|
"cgal-face-back" : "#dbf4da",
|
||||||
|
"cgal-face-2d" : "#00bf99",
|
||||||
|
"cgal-edge-front" : "#ff0000",
|
||||||
|
"cgal-edge-back" : "#ff0000",
|
||||||
|
"cgal-edge-2d" : "#ff0000",
|
||||||
|
"crosshair" : "#111111"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "Solarized",
|
||||||
|
"index" : 1700,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#fdf6e3",
|
||||||
|
"opencsg-face-front" : "#b58800",
|
||||||
|
"opencsg-face-back" : "#882233",
|
||||||
|
"cgal-face-front" : "#b58800",
|
||||||
|
"cgal-face-back" : "#882233",
|
||||||
|
"cgal-face-2d" : "#6c71c4",
|
||||||
|
"cgal-edge-front" : "#b58800",
|
||||||
|
"cgal-edge-back" : "#b58800",
|
||||||
|
"cgal-edge-2d" : "#b58800",
|
||||||
|
"crosshair" : "#800000"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "Starnight",
|
||||||
|
"index" : 1300,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#000000",
|
||||||
|
"opencsg-face-front" : "#ffffe0",
|
||||||
|
"opencsg-face-back" : "#00ffff",
|
||||||
|
"cgal-face-front" : "#ffffe0",
|
||||||
|
"cgal-face-back" : "#00ffff",
|
||||||
|
"cgal-face-2d" : "#9370db",
|
||||||
|
"cgal-edge-front" : "#0000ff",
|
||||||
|
"cgal-edge-back" : "#0000ff",
|
||||||
|
"cgal-edge-2d" : "#ff00ff",
|
||||||
|
"crosshair" : "#f0f0f0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name" : "Sunset",
|
||||||
|
"index" : 1200,
|
||||||
|
"show-in-gui" : true,
|
||||||
|
|
||||||
|
"colors" : {
|
||||||
|
"background" : "#aa4444",
|
||||||
|
"opencsg-face-front" : "#ffaaaa",
|
||||||
|
"opencsg-face-back" : "#882233",
|
||||||
|
"cgal-face-front" : "#ffaaaa",
|
||||||
|
"cgal-face-back" : "#882233",
|
||||||
|
"cgal-face-2d" : "#00bf99",
|
||||||
|
"cgal-edge-front" : "#ff0000",
|
||||||
|
"cgal-edge-back" : "#ff0000",
|
||||||
|
"cgal-edge-2d" : "#ff0000",
|
||||||
|
"crosshair" : "#800000"
|
||||||
|
}
|
||||||
|
}
|
|
@ -329,6 +329,7 @@ src/FontCache.h \
|
||||||
src/system-gl.h \
|
src/system-gl.h \
|
||||||
src/CsgInfo.h \
|
src/CsgInfo.h \
|
||||||
\
|
\
|
||||||
|
src/Dock.h \
|
||||||
src/AutoUpdater.h \
|
src/AutoUpdater.h \
|
||||||
src/launchingscreen.h \
|
src/launchingscreen.h \
|
||||||
src/legacyeditor.h \
|
src/legacyeditor.h \
|
||||||
|
@ -419,6 +420,7 @@ SOURCES += src/version_check.cc \
|
||||||
src/openscad.cc \
|
src/openscad.cc \
|
||||||
src/mainwin.cc \
|
src/mainwin.cc \
|
||||||
src/UIUtils.cc \
|
src/UIUtils.cc \
|
||||||
|
src/Dock.cc \
|
||||||
src/FontListDialog.cc \
|
src/FontListDialog.cc \
|
||||||
src/launchingscreen.cc \
|
src/launchingscreen.cc \
|
||||||
src/legacyeditor.cc \
|
src/legacyeditor.cc \
|
||||||
|
@ -521,6 +523,10 @@ fonts.path = $$PREFIX/share/openscad/fonts/
|
||||||
fonts.files = fonts/*
|
fonts.files = fonts/*
|
||||||
INSTALLS += fonts
|
INSTALLS += fonts
|
||||||
|
|
||||||
|
colorschemes.path = $$PREFIX/share/openscad/color-schemes/
|
||||||
|
colorschemes.files = color-schemes/*
|
||||||
|
INSTALLS += colorschemes
|
||||||
|
|
||||||
applications.path = $$PREFIX/share/applications
|
applications.path = $$PREFIX/share/applications
|
||||||
applications.files = icons/openscad.desktop
|
applications.files = icons/openscad.desktop
|
||||||
INSTALLS += applications
|
INSTALLS += applications
|
||||||
|
|
|
@ -14,6 +14,7 @@ File /r /x mingw-cross-env examples
|
||||||
File /r /x mingw-cross-env libraries
|
File /r /x mingw-cross-env libraries
|
||||||
File /r /x mingw-cross-env fonts
|
File /r /x mingw-cross-env fonts
|
||||||
File /r /x mingw-cross-env locale
|
File /r /x mingw-cross-env locale
|
||||||
|
File /r /x mingw-cross-env color-schemes
|
||||||
${registerExtension} "$INSTDIR\openscad.exe" ".scad" "OpenSCAD_File"
|
${registerExtension} "$INSTDIR\openscad.exe" ".scad" "OpenSCAD_File"
|
||||||
CreateShortCut $SMPROGRAMS\OpenSCAD.lnk $INSTDIR\openscad.exe
|
CreateShortCut $SMPROGRAMS\OpenSCAD.lnk $INSTDIR\openscad.exe
|
||||||
WriteUninstaller $INSTDIR\Uninstall.exe
|
WriteUninstaller $INSTDIR\Uninstall.exe
|
||||||
|
@ -28,6 +29,7 @@ Delete $INSTDIR\MyProg.exe
|
||||||
Delete $SMPROGRAMS\OpenSCAD.lnk
|
Delete $SMPROGRAMS\OpenSCAD.lnk
|
||||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD"
|
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD"
|
||||||
RMDir /r $INSTDIR\fonts
|
RMDir /r $INSTDIR\fonts
|
||||||
|
RMDir /r $INSTDIR\color-schemes
|
||||||
RMDir /r $INSTDIR\examples
|
RMDir /r $INSTDIR\examples
|
||||||
RMDir /r $INSTDIR\libraries\mcad
|
RMDir /r $INSTDIR\libraries\mcad
|
||||||
RMDir /r $INSTDIR\locale
|
RMDir /r $INSTDIR\locale
|
||||||
|
|
|
@ -356,8 +356,9 @@ build_cgal()
|
||||||
cd $BASEDIR/src
|
cd $BASEDIR/src
|
||||||
rm -rf CGAL-$version
|
rm -rf CGAL-$version
|
||||||
if [ ! -f CGAL-$version.tar.gz ]; then
|
if [ ! -f CGAL-$version.tar.gz ]; then
|
||||||
# 4.4
|
# 4.5
|
||||||
curl -O https://gforge.inria.fr/frs/download.php/file/33525/CGAL-$version.tar.gz
|
curl -O https://gforge.inria.fr/frs/download.php/file/34149/CGAL-$version.tar.gz
|
||||||
|
# 4.4 curl -O https://gforge.inria.fr/frs/download.php/file/33525/CGAL-$version.tar.gz
|
||||||
# 4.3 curl -O https://gforge.inria.fr/frs/download.php/32994/CGAL-$version.tar.gz
|
# 4.3 curl -O https://gforge.inria.fr/frs/download.php/32994/CGAL-$version.tar.gz
|
||||||
# 4.2 curl -O https://gforge.inria.fr/frs/download.php/32359/CGAL-$version.tar.gz
|
# 4.2 curl -O https://gforge.inria.fr/frs/download.php/32359/CGAL-$version.tar.gz
|
||||||
# 4.1 curl -O https://gforge.inria.fr/frs/download.php/31641/CGAL-$version.tar.gz
|
# 4.1 curl -O https://gforge.inria.fr/frs/download.php/31641/CGAL-$version.tar.gz
|
||||||
|
@ -426,7 +427,7 @@ build_opencsg()
|
||||||
if $OPTION_32BIT; then
|
if $OPTION_32BIT; then
|
||||||
OPENCSG_EXTRA_FLAGS="x86"
|
OPENCSG_EXTRA_FLAGS="x86"
|
||||||
fi
|
fi
|
||||||
qmake -r QMAKE_CXXFLAGS+="-I$DEPLOYDIR/include" QMAKE_LFLAGS+="-L$DEPLOYDIR/lib" CONFIG+="x86_64 $OPENCSG_EXTRA_FLAGS"
|
qmake -r QMAKE_CXXFLAGS+="-I$DEPLOYDIR/include" QMAKE_LFLAGS+="-L$DEPLOYDIR/lib" CONFIG+="x86_64 $OPENCSG_EXTRA_FLAGS" DESTDIR=$DEPLOYDIR
|
||||||
make install
|
make install
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -654,7 +655,7 @@ build_ragel()
|
||||||
cd "$BASEDIR"/src
|
cd "$BASEDIR"/src
|
||||||
rm -rf "ragel-$version"
|
rm -rf "ragel-$version"
|
||||||
if [ ! -f "ragel-$version.tar.gz" ]; then
|
if [ ! -f "ragel-$version.tar.gz" ]; then
|
||||||
curl --insecure -LO "http://www.complang.org/ragel/ragel-$version.tar.gz"
|
curl --insecure -LO "http://www.colm.net/wp-content/uploads/2014/10/ragel-$version.tar.gz"
|
||||||
fi
|
fi
|
||||||
tar xzf "ragel-$version.tar.gz"
|
tar xzf "ragel-$version.tar.gz"
|
||||||
cd "ragel-$version"
|
cd "ragel-$version"
|
||||||
|
@ -770,22 +771,22 @@ fi
|
||||||
echo "Using basedir:" $BASEDIR
|
echo "Using basedir:" $BASEDIR
|
||||||
mkdir -p $SRCDIR $DEPLOYDIR
|
mkdir -p $SRCDIR $DEPLOYDIR
|
||||||
build_qt5 5.3.1
|
build_qt5 5.3.1
|
||||||
build_qscintilla 2.8.3
|
build_qscintilla 2.8.4
|
||||||
# NB! For eigen, also update the path in the function
|
# NB! For eigen, also update the path in the function
|
||||||
build_eigen 3.2.1
|
build_eigen 3.2.1
|
||||||
build_gmp 5.1.3
|
build_gmp 5.1.3
|
||||||
build_mpfr 3.1.2
|
build_mpfr 3.1.2
|
||||||
build_boost 1.54.0
|
build_boost 1.54.0
|
||||||
# NB! For CGAL, also update the actual download URL in the function
|
# NB! For CGAL, also update the actual download URL in the function
|
||||||
build_cgal 4.4
|
build_cgal 4.5
|
||||||
build_glew 1.10.0
|
build_glew 1.10.0
|
||||||
build_gettext 0.18.3.2
|
build_gettext 0.18.3.2
|
||||||
build_libffi 3.1
|
build_libffi 3.1
|
||||||
build_glib2 2.40.0
|
build_glib2 2.40.0
|
||||||
build_opencsg 1.4.0
|
build_opencsg 1.4.0
|
||||||
build_freetype 2.5.3 --without-png
|
build_freetype 2.5.3 --without-png
|
||||||
build_ragel 6.8
|
build_ragel 6.9
|
||||||
build_harfbuzz 0.9.28 "--with-coretext=auto --with-glib=no"
|
build_harfbuzz 0.9.35 "--with-coretext=auto --with-glib=no"
|
||||||
export FREETYPE_CFLAGS="-I$DEPLOYDIR/include -I$DEPLOYDIR/include/freetype2"
|
export FREETYPE_CFLAGS="-I$DEPLOYDIR/include -I$DEPLOYDIR/include/freetype2"
|
||||||
export FREETYPE_LIBS="-L$DEPLOYDIR/lib -lfreetype"
|
export FREETYPE_LIBS="-L$DEPLOYDIR/lib -lfreetype"
|
||||||
build_libxml2 2.9.1
|
build_libxml2 2.9.1
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
# NB! To build a release build, the VERSION and VERSIONDATE environment variables needs to be set.
|
# NB! To build a release build, the VERSION and VERSIONDATE environment variables needs to be set.
|
||||||
# See doc/release-checklist.txt
|
# See doc/release-checklist.txt
|
||||||
|
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./scripts/publish-macosx.sh [buildonly]
|
||||||
|
#
|
||||||
|
|
||||||
export NUMCPU=$(sysctl -n hw.ncpu)
|
export NUMCPU=$(sysctl -n hw.ncpu)
|
||||||
|
|
||||||
human_filesize()
|
human_filesize()
|
||||||
|
@ -40,6 +45,13 @@ update_www_download_links()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Cmd-line parameters
|
||||||
|
DOUPLOAD=1
|
||||||
|
if [ "`echo $* | grep buildonly`" ]; then
|
||||||
|
echo "Build only, no upload"
|
||||||
|
DOUPLOAD=
|
||||||
|
fi
|
||||||
|
|
||||||
if test -z "$VERSIONDATE"; then
|
if test -z "$VERSIONDATE"; then
|
||||||
VERSIONDATE=`date "+%Y.%m.%d"`
|
VERSIONDATE=`date "+%Y.%m.%d"`
|
||||||
fi
|
fi
|
||||||
|
@ -76,6 +88,10 @@ if [[ $? != 0 ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! $DOUPLOAD ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
SIGNATURE=$(openssl dgst -sha1 -binary < OpenSCAD-$VERSION.dmg | openssl dgst -dss1 -sign $HOME/.ssh/openscad-appcast.pem | openssl enc -base64)
|
SIGNATURE=$(openssl dgst -sha1 -binary < OpenSCAD-$VERSION.dmg | openssl dgst -dss1 -sign $HOME/.ssh/openscad-appcast.pem | openssl enc -base64)
|
||||||
|
|
||||||
if [[ $VERSION == $VERSIONDATE ]]; then
|
if [[ $VERSION == $VERSIONDATE ]]; then
|
||||||
|
|
|
@ -327,6 +327,7 @@ case $OS in
|
||||||
LIBRARYDIR=OpenSCAD.app/Contents/Resources/libraries
|
LIBRARYDIR=OpenSCAD.app/Contents/Resources/libraries
|
||||||
FONTDIR=OpenSCAD.app/Contents/Resources/fonts
|
FONTDIR=OpenSCAD.app/Contents/Resources/fonts
|
||||||
TRANSLATIONDIR=OpenSCAD.app/Contents/Resources/locale
|
TRANSLATIONDIR=OpenSCAD.app/Contents/Resources/locale
|
||||||
|
COLORSCHEMESDIR=OpenSCAD.app/Contents/Resources/color-schemes
|
||||||
;;
|
;;
|
||||||
UNIX_CROSS_WIN)
|
UNIX_CROSS_WIN)
|
||||||
cd $OPENSCADDIR
|
cd $OPENSCADDIR
|
||||||
|
@ -334,6 +335,7 @@ case $OS in
|
||||||
LIBRARYDIR=$DEPLOYDIR/openscad-$VERSION/libraries/
|
LIBRARYDIR=$DEPLOYDIR/openscad-$VERSION/libraries/
|
||||||
FONTDIR=$DEPLOYDIR/openscad-$VERSION/fonts/
|
FONTDIR=$DEPLOYDIR/openscad-$VERSION/fonts/
|
||||||
TRANSLATIONDIR=$DEPLOYDIR/openscad-$VERSION/locale/
|
TRANSLATIONDIR=$DEPLOYDIR/openscad-$VERSION/locale/
|
||||||
|
COLORSCHEMESDIR=$DEPLOYDIR/openscad-$VERSION/color-schemes/
|
||||||
rm -rf $DEPLOYDIR/openscad-$VERSION
|
rm -rf $DEPLOYDIR/openscad-$VERSION
|
||||||
mkdir $DEPLOYDIR/openscad-$VERSION
|
mkdir $DEPLOYDIR/openscad-$VERSION
|
||||||
;;
|
;;
|
||||||
|
@ -342,6 +344,7 @@ case $OS in
|
||||||
LIBRARYDIR=openscad-$VERSION/libraries/
|
LIBRARYDIR=openscad-$VERSION/libraries/
|
||||||
FONTDIR=openscad-$VERSION/fonts/
|
FONTDIR=openscad-$VERSION/fonts/
|
||||||
TRANSLATIONDIR=openscad-$VERSION/locale/
|
TRANSLATIONDIR=openscad-$VERSION/locale/
|
||||||
|
COLORSCHEMESDIR=openscad-$VERSION/color-schemes/
|
||||||
rm -rf openscad-$VERSION
|
rm -rf openscad-$VERSION
|
||||||
mkdir openscad-$VERSION
|
mkdir openscad-$VERSION
|
||||||
;;
|
;;
|
||||||
|
@ -369,6 +372,11 @@ if [ -n $FONTDIR ]; then
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
if [ -n $COLORSCHEMESDIR ]; then
|
||||||
|
echo $COLORSCHEMESDIR
|
||||||
|
mkdir -p $COLORSCHEMESDIR
|
||||||
|
cp -a color-schemes/* $COLORSCHEMESDIR
|
||||||
|
fi
|
||||||
if [ -n $LIBRARYDIR ]; then
|
if [ -n $LIBRARYDIR ]; then
|
||||||
echo $LIBRARYDIR
|
echo $LIBRARYDIR
|
||||||
mkdir -p $LIBRARYDIR
|
mkdir -p $LIBRARYDIR
|
||||||
|
|
|
@ -113,8 +113,10 @@ Response CSGTermEvaluator::visit(State &state, const AbstractPolyNode &node)
|
||||||
shared_ptr<CSGTerm> t1;
|
shared_ptr<CSGTerm> t1;
|
||||||
if (this->geomevaluator) {
|
if (this->geomevaluator) {
|
||||||
shared_ptr<const Geometry> geom = this->geomevaluator->evaluateGeometry(node, false);
|
shared_ptr<const Geometry> geom = this->geomevaluator->evaluateGeometry(node, false);
|
||||||
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
if (geom) {
|
||||||
geom, node.modinst, node);
|
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
||||||
|
geom, node.modinst, node);
|
||||||
|
}
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
}
|
}
|
||||||
this->stored_term[node.index()] = t1;
|
this->stored_term[node.index()] = t1;
|
||||||
|
@ -178,8 +180,10 @@ Response CSGTermEvaluator::visit(State &state, const RenderNode &node)
|
||||||
shared_ptr<const Geometry> geom;
|
shared_ptr<const Geometry> geom;
|
||||||
if (this->geomevaluator) {
|
if (this->geomevaluator) {
|
||||||
geom = this->geomevaluator->evaluateGeometry(node, false);
|
geom = this->geomevaluator->evaluateGeometry(node, false);
|
||||||
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
if (geom) {
|
||||||
geom, node.modinst, node);
|
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
||||||
|
geom, node.modinst, node);
|
||||||
|
}
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
}
|
}
|
||||||
this->stored_term[node.index()] = t1;
|
this->stored_term[node.index()] = t1;
|
||||||
|
@ -196,8 +200,10 @@ Response CSGTermEvaluator::visit(State &state, const CgaladvNode &node)
|
||||||
shared_ptr<const Geometry> geom;
|
shared_ptr<const Geometry> geom;
|
||||||
if (this->geomevaluator) {
|
if (this->geomevaluator) {
|
||||||
geom = this->geomevaluator->evaluateGeometry(node, false);
|
geom = this->geomevaluator->evaluateGeometry(node, false);
|
||||||
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
if (geom) {
|
||||||
geom, node.modinst, node);
|
t1 = evaluate_csg_term_from_geometry(state, this->highlights, this->background,
|
||||||
|
geom, node.modinst, node);
|
||||||
|
}
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
}
|
}
|
||||||
this->stored_term[node.index()] = t1;
|
this->stored_term[node.index()] = t1;
|
||||||
|
|
|
@ -43,8 +43,8 @@ public:
|
||||||
CSGTermEvaluator evaluator(tree, &geomevaluator);
|
CSGTermEvaluator evaluator(tree, &geomevaluator);
|
||||||
boost::shared_ptr<CSGTerm> root_raw_term = evaluator.evaluateCSGTerm( *root_node, this->highlight_terms, this->background_terms );
|
boost::shared_ptr<CSGTerm> root_raw_term = evaluator.evaluateCSGTerm( *root_node, this->highlight_terms, this->background_terms );
|
||||||
|
|
||||||
if (!root_raw_term) {
|
if (!root_raw_term && this->background_terms.empty()) {
|
||||||
PRINT("Error: CSG generation failed! (no top level object found)");
|
PRINT("Error: CSG generation failed! (no objects found)");
|
||||||
call_progress_function();
|
call_progress_function();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -52,16 +52,18 @@ public:
|
||||||
PRINT("Compiling design (CSG Products normalization)...");
|
PRINT("Compiling design (CSG Products normalization)...");
|
||||||
call_progress_function();
|
call_progress_function();
|
||||||
CSGTermNormalizer normalizer( normalizelimit );
|
CSGTermNormalizer normalizer( normalizelimit );
|
||||||
this->root_norm_term = normalizer.normalize(root_raw_term);
|
if (root_raw_term) {
|
||||||
if (this->root_norm_term) {
|
this->root_norm_term = normalizer.normalize(root_raw_term);
|
||||||
this->root_chain = new CSGChain();
|
if (this->root_norm_term) {
|
||||||
this->root_chain->import(this->root_norm_term);
|
this->root_chain = new CSGChain();
|
||||||
PRINTB("Normalized CSG tree has %d elements", int(this->root_chain->objects.size()));
|
this->root_chain->import(this->root_norm_term);
|
||||||
}
|
PRINTB("Normalized CSG tree has %d elements", int(this->root_chain->objects.size()));
|
||||||
else {
|
}
|
||||||
this->root_chain = NULL;
|
else {
|
||||||
PRINT("WARNING: CSG normalization resulted in an empty tree");
|
this->root_chain = NULL;
|
||||||
call_progress_function();
|
PRINT("WARNING: CSG normalization resulted in an empty tree");
|
||||||
|
call_progress_function();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->highlight_terms.size() > 0) {
|
if (this->highlight_terms.size() > 0) {
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
#include "Dock.h"
|
||||||
|
|
||||||
|
Dock::Dock(QWidget *parent) : QDockWidget(parent), action(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Dock::~Dock()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dock::setVisible(bool visible)
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue(configKey, !visible);
|
||||||
|
if (action != NULL) {
|
||||||
|
action->setChecked(!visible);
|
||||||
|
}
|
||||||
|
QDockWidget::setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dock::setConfigKey(const QString configKey)
|
||||||
|
{
|
||||||
|
this->configKey = configKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dock::setAction(QAction *action)
|
||||||
|
{
|
||||||
|
this->action = action;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QAction>
|
||||||
|
#include <QDockWidget>
|
||||||
|
|
||||||
|
class Dock : public QDockWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Dock(QWidget *parent = NULL);
|
||||||
|
virtual ~Dock();
|
||||||
|
void setConfigKey(const QString configKey);
|
||||||
|
void setAction(QAction *action);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setVisible(bool visible);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString configKey;
|
||||||
|
QAction *action;
|
||||||
|
};
|
|
@ -80,7 +80,7 @@ GeometryEvaluator::ResultObject GeometryEvaluator::applyToChildren(const Abstrac
|
||||||
{
|
{
|
||||||
unsigned int dim = 0;
|
unsigned int dim = 0;
|
||||||
BOOST_FOREACH(const Geometry::ChildItem &item, this->visitedchildren[node.index()]) {
|
BOOST_FOREACH(const Geometry::ChildItem &item, this->visitedchildren[node.index()]) {
|
||||||
if (item.second) {
|
if (!item.first->modinst->isBackground() && item.second) {
|
||||||
if (!dim) dim = item.second->getDimension();
|
if (!dim) dim = item.second->getDimension();
|
||||||
else if (dim != item.second->getDimension()) {
|
else if (dim != item.second->getDimension()) {
|
||||||
PRINT("WARNING: Mixing 2D and 3D objects is not supported.");
|
PRINT("WARNING: Mixing 2D and 3D objects is not supported.");
|
||||||
|
|
|
@ -68,6 +68,9 @@ public:
|
||||||
QAction *actionRecentFile[UIUtils::maxRecentFiles];
|
QAction *actionRecentFile[UIUtils::maxRecentFiles];
|
||||||
QMap<QString, QString> knownFileExtensions;
|
QMap<QString, QString> knownFileExtensions;
|
||||||
|
|
||||||
|
QWidget *editorDockTitleWidget;
|
||||||
|
QWidget *consoleDockTitleWidget;
|
||||||
|
|
||||||
QString editortype;
|
QString editortype;
|
||||||
bool useScintilla;
|
bool useScintilla;
|
||||||
|
|
||||||
|
@ -82,6 +85,7 @@ private slots:
|
||||||
void updateTVal();
|
void updateTVal();
|
||||||
void updateMdiMode(bool mdi);
|
void updateMdiMode(bool mdi);
|
||||||
void updateUndockMode(bool undockMode);
|
void updateUndockMode(bool undockMode);
|
||||||
|
void updateReorderMode(bool reorderMode);
|
||||||
void setFileName(const QString &filename);
|
void setFileName(const QString &filename);
|
||||||
void setFont(const QString &family, uint size);
|
void setFont(const QString &family, uint size);
|
||||||
void setColorScheme(const QString &cs);
|
void setColorScheme(const QString &cs);
|
||||||
|
@ -231,20 +235,22 @@ public slots:
|
||||||
void checkAutoReload();
|
void checkAutoReload();
|
||||||
void waitAfterReload();
|
void waitAfterReload();
|
||||||
void autoReloadSet(bool);
|
void autoReloadSet(bool);
|
||||||
|
void setContentsChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void report_func(const class AbstractNode*, void *vp, int mark);
|
static void report_func(const class AbstractNode*, void *vp, int mark);
|
||||||
static bool mdiMode;
|
static bool mdiMode;
|
||||||
static bool undockMode;
|
static bool undockMode;
|
||||||
|
static bool reorderMode;
|
||||||
static QSet<MainWindow*> *windows;
|
static QSet<MainWindow*> *windows;
|
||||||
|
|
||||||
char const * afterCompileSlot;
|
char const * afterCompileSlot;
|
||||||
bool procevents;
|
bool procevents;
|
||||||
bool isClosing;
|
|
||||||
class QTemporaryFile *tempFile;
|
class QTemporaryFile *tempFile;
|
||||||
class ProgressWidget *progresswidget;
|
class ProgressWidget *progresswidget;
|
||||||
class CGALWorker *cgalworker;
|
class CGALWorker *cgalworker;
|
||||||
QMutex consolemutex;
|
QMutex consolemutex;
|
||||||
|
bool contentschanged; // Set if the source code has changes since the last render (F6)
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void highlightError(int);
|
void highlightError(int);
|
||||||
|
|
|
@ -289,7 +289,7 @@
|
||||||
<addaction name="menuHelp"/>
|
<addaction name="menuHelp"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusbar"/>
|
<widget class="QStatusBar" name="statusbar"/>
|
||||||
<widget class="QDockWidget" name="editorDock">
|
<widget class="Dock" name="editorDock">
|
||||||
<attribute name="dockWidgetArea">
|
<attribute name="dockWidgetArea">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -412,7 +412,7 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QDockWidget" name="consoleDock">
|
<widget class="Dock" name="consoleDock">
|
||||||
<attribute name="dockWidgetArea">
|
<attribute name="dockWidgetArea">
|
||||||
<number>8</number>
|
<number>8</number>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -423,6 +423,12 @@
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextEdit" name="console">
|
<widget class="QTextEdit" name="console">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>10</width>
|
||||||
|
<height>10</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="focusPolicy">
|
<property name="focusPolicy">
|
||||||
<enum>Qt::ClickFocus</enum>
|
<enum>Qt::ClickFocus</enum>
|
||||||
</property>
|
</property>
|
||||||
|
@ -1094,6 +1100,12 @@
|
||||||
<header>QGLView.h</header>
|
<header>QGLView.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>Dock</class>
|
||||||
|
<extends>QDockWidget</extends>
|
||||||
|
<header>Dock.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../openscad.qrc"/>
|
<include location="../openscad.qrc"/>
|
||||||
|
|
|
@ -58,16 +58,16 @@ OpenCSGRenderer::OpenCSGRenderer(CSGChain *root_chain, CSGChain *highlights_chai
|
||||||
|
|
||||||
void OpenCSGRenderer::draw(bool /*showfaces*/, bool showedges) const
|
void OpenCSGRenderer::draw(bool /*showfaces*/, bool showedges) const
|
||||||
{
|
{
|
||||||
|
GLint *shaderinfo = this->shaderinfo;
|
||||||
|
if (!shaderinfo[0]) shaderinfo = NULL;
|
||||||
if (this->root_chain) {
|
if (this->root_chain) {
|
||||||
GLint *shaderinfo = this->shaderinfo;
|
|
||||||
if (!shaderinfo[0]) shaderinfo = NULL;
|
|
||||||
renderCSGChain(this->root_chain, showedges ? shaderinfo : NULL, false, false);
|
renderCSGChain(this->root_chain, showedges ? shaderinfo : NULL, false, false);
|
||||||
if (this->background_chain) {
|
}
|
||||||
renderCSGChain(this->background_chain, showedges ? shaderinfo : NULL, false, true);
|
if (this->background_chain) {
|
||||||
}
|
renderCSGChain(this->background_chain, showedges ? shaderinfo : NULL, false, true);
|
||||||
if (this->highlights_chain) {
|
}
|
||||||
renderCSGChain(this->highlights_chain, showedges ? shaderinfo : NULL, true, false);
|
if (this->highlights_chain) {
|
||||||
}
|
renderCSGChain(this->highlights_chain, showedges ? shaderinfo : NULL, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,5 +152,7 @@ BoundingBox OpenCSGRenderer::getBoundingBox() const
|
||||||
{
|
{
|
||||||
BoundingBox bbox;
|
BoundingBox bbox;
|
||||||
if (this->root_chain) bbox = this->root_chain->getBoundingBox();
|
if (this->root_chain) bbox = this->root_chain->getBoundingBox();
|
||||||
|
if (this->background_chain) bbox.extend(this->background_chain->getBoundingBox());
|
||||||
|
|
||||||
return bbox;
|
return bbox;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,5 +11,12 @@ std::string PlatformUtils::documentsPath()
|
||||||
return std::string([[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] UTF8String]);
|
return std::string([[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] UTF8String]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PlatformUtils::userConfigPath()
|
||||||
|
{
|
||||||
|
NSError *error;
|
||||||
|
NSURL *appSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
|
||||||
|
return std::string([[appSupportDir path] UTF8String]) + std::string("/") + PlatformUtils::OPENSCAD_FOLDER_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
void PlatformUtils::ensureStdIO(void) {}
|
void PlatformUtils::ensureStdIO(void) {}
|
||||||
|
|
||||||
|
|
|
@ -19,5 +19,27 @@ std::string PlatformUtils::documentsPath()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
std::string PlatformUtils::userConfigPath()
|
||||||
|
{
|
||||||
|
fs::path config_path;
|
||||||
|
|
||||||
|
const char *xdg_env = getenv("XDG_CONFIG_HOME");
|
||||||
|
if (xdg_env && fs::exists(fs::path(xdg_env))) {
|
||||||
|
config_path = fs::path(xdg_env) / OPENSCAD_FOLDER_NAME;
|
||||||
|
} else {
|
||||||
|
const char *home = getenv("HOME");
|
||||||
|
if (home) {
|
||||||
|
config_path = fs::path(home) / ".config" / OPENSCAD_FOLDER_NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs::is_directory(config_path)) {
|
||||||
|
return boosty::stringy(boosty::absolute(config_path));
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
void PlatformUtils::ensureStdIO(void) {}
|
void PlatformUtils::ensureStdIO(void) {}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,27 @@ std::string winapi_wstr_to_utf8( std::wstring wstr )
|
||||||
return utf8_str;
|
return utf8_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx
|
||||||
|
static const std::string getFolderPath(int nFolder)
|
||||||
|
{
|
||||||
|
std::wstring path(MAX_PATH,0);
|
||||||
|
|
||||||
|
HWND hwndOwner = 0;
|
||||||
|
HANDLE hToken = NULL;
|
||||||
|
DWORD dwFlags = SHGFP_TYPE_CURRENT;
|
||||||
|
LPTSTR pszPath = &path[0];
|
||||||
|
|
||||||
|
int result = SHGetFolderPathW( hwndOwner, nFolder, hToken, dwFlags, pszPath );
|
||||||
|
|
||||||
|
if (result == S_OK) {
|
||||||
|
path = std::wstring( path.c_str() ); // strip extra NULLs
|
||||||
|
//std::wcerr << "wchar path:" << "\n";
|
||||||
|
const std::string retval = winapi_wstr_to_utf8( path );
|
||||||
|
//PRINTB("Path found: %s",retval);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// retrieve the path to 'My Documents' for the current user under windows
|
// retrieve the path to 'My Documents' for the current user under windows
|
||||||
// In XP this is 'c:\documents and settings\username\my documents'
|
// In XP this is 'c:\documents and settings\username\my documents'
|
||||||
|
@ -55,29 +76,22 @@ std::string winapi_wstr_to_utf8( std::wstring wstr )
|
||||||
// Mingw does not provide access to the updated SHGetKnownFolderPath
|
// Mingw does not provide access to the updated SHGetKnownFolderPath
|
||||||
std::string PlatformUtils::documentsPath()
|
std::string PlatformUtils::documentsPath()
|
||||||
{
|
{
|
||||||
std::string retval;
|
const std::string retval = getFolderPath(CSIDL_PERSONAL);
|
||||||
std::wstring path(MAX_PATH,0);
|
if (retval.empty()) {
|
||||||
|
PRINT("ERROR: Could not find My Documents location");
|
||||||
HWND hwndOwner = 0;
|
|
||||||
int nFolder = CSIDL_PERSONAL;
|
|
||||||
HANDLE hToken = NULL;
|
|
||||||
DWORD dwFlags = SHGFP_TYPE_CURRENT;
|
|
||||||
LPTSTR pszPath = &path[0];
|
|
||||||
|
|
||||||
int result = SHGetFolderPathW( hwndOwner, nFolder, hToken, dwFlags, pszPath );
|
|
||||||
|
|
||||||
if (result == S_OK) {
|
|
||||||
path = std::wstring( path.c_str() ); // stip extra NULLs
|
|
||||||
//std::wcerr << "wchar path:" << "\n";
|
|
||||||
retval = winapi_wstr_to_utf8( path );
|
|
||||||
//PRINTB("Path found: %s",retval);
|
|
||||||
} else {
|
|
||||||
PRINT("ERROR: Could not find My Documents location");
|
|
||||||
retval = "";
|
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PlatformUtils::userConfigPath()
|
||||||
|
{
|
||||||
|
const std::string retval = getFolderPath(CSIDL_LOCAL_APPDATA);
|
||||||
|
if (retval.empty()) {
|
||||||
|
PRINT("ERROR: Could not find Local AppData location");
|
||||||
|
}
|
||||||
|
return retval + std::string("/") + PlatformUtils::OPENSCAD_FOLDER_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
|
@ -13,6 +13,8 @@ namespace {
|
||||||
std::string applicationpath;
|
std::string applicationpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *PlatformUtils::OPENSCAD_FOLDER_NAME = "OpenSCAD";
|
||||||
|
|
||||||
void PlatformUtils::registerApplicationPath(const std::string &apppath)
|
void PlatformUtils::registerApplicationPath(const std::string &apppath)
|
||||||
{
|
{
|
||||||
applicationpath = apppath;
|
applicationpath = apppath;
|
||||||
|
@ -51,7 +53,7 @@ std::string PlatformUtils::userLibraryPath()
|
||||||
//PRINTB("path size %i",boosty::stringy(path).size());
|
//PRINTB("path size %i",boosty::stringy(path).size());
|
||||||
//PRINTB("lib path found: [%s]", path );
|
//PRINTB("lib path found: [%s]", path );
|
||||||
if (path.empty()) return "";
|
if (path.empty()) return "";
|
||||||
path /= "OpenSCAD";
|
path /= OPENSCAD_FOLDER_NAME;
|
||||||
path /= "libraries";
|
path /= "libraries";
|
||||||
//PRINTB("Appended path %s", path );
|
//PRINTB("Appended path %s", path );
|
||||||
//PRINTB("Exists: %i", fs::exists(path) );
|
//PRINTB("Exists: %i", fs::exists(path) );
|
||||||
|
@ -70,7 +72,7 @@ std::string PlatformUtils::backupPath()
|
||||||
if (pathstr=="") return "";
|
if (pathstr=="") return "";
|
||||||
path = boosty::canonical(fs::path( pathstr ));
|
path = boosty::canonical(fs::path( pathstr ));
|
||||||
if (path.empty()) return "";
|
if (path.empty()) return "";
|
||||||
path /= "OpenSCAD";
|
path /= OPENSCAD_FOLDER_NAME;
|
||||||
path /= "backups";
|
path /= "backups";
|
||||||
} catch (const fs::filesystem_error& ex) {
|
} catch (const fs::filesystem_error& ex) {
|
||||||
PRINTB("ERROR: %s",ex.what());
|
PRINTB("ERROR: %s",ex.what());
|
||||||
|
@ -100,31 +102,32 @@ std::string PlatformUtils::resourceBasePath()
|
||||||
{
|
{
|
||||||
fs::path resourcedir(applicationPath());
|
fs::path resourcedir(applicationPath());
|
||||||
fs::path tmpdir;
|
fs::path tmpdir;
|
||||||
|
#ifndef WIN32
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// Resources can be bundled on Mac. If not, fall back to development layout
|
const char *searchpath[] = {
|
||||||
bool isbundle = is_directory(resourcedir / ".." / "Resources");
|
"../Resources", // Resources can be bundled on Mac.
|
||||||
if (isbundle) {
|
"../../..", // Dev location
|
||||||
resourcedir /= "../Resources";
|
"..", // Test location
|
||||||
// Fall back to dev layout
|
NULL
|
||||||
if (!is_directory(resourcedir / "libraries")) resourcedir /= "../../..";
|
};
|
||||||
}
|
#else
|
||||||
#elif !defined(WIN32)
|
const char *searchpath[] = {
|
||||||
tmpdir = resourcedir / "../share/openscad";
|
"../share/openscad",
|
||||||
if (is_directory(tmpdir / "libraries")) {
|
"../../share/openscad",
|
||||||
|
".",
|
||||||
|
"..",
|
||||||
|
"../..",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
for (int a = 0;searchpath[a] != NULL;a++) {
|
||||||
|
tmpdir = resourcedir / searchpath[a];
|
||||||
|
if (is_directory(tmpdir / "libraries")) {
|
||||||
resourcedir = tmpdir;
|
resourcedir = tmpdir;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
#endif // !WIN32
|
||||||
tmpdir = resourcedir / "../../share/openscad";
|
|
||||||
if (is_directory(tmpdir / "libraries")) {
|
|
||||||
resourcedir = tmpdir;
|
|
||||||
} else {
|
|
||||||
tmpdir = resourcedir / "../..";
|
|
||||||
if (is_directory(tmpdir / "libraries")) {
|
|
||||||
resourcedir = tmpdir;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// resourcedir defaults to applicationPath
|
// resourcedir defaults to applicationPath
|
||||||
return boosty::stringy(boosty::canonical(resourcedir));
|
return boosty::stringy(boosty::canonical(resourcedir));
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "boosty.h"
|
#include "boosty.h"
|
||||||
|
|
||||||
namespace PlatformUtils {
|
namespace PlatformUtils {
|
||||||
|
extern const char *OPENSCAD_FOLDER_NAME;
|
||||||
|
|
||||||
void registerApplicationPath(const std::string &applicationpath);
|
void registerApplicationPath(const std::string &applicationpath);
|
||||||
std::string applicationPath();
|
std::string applicationPath();
|
||||||
|
@ -13,6 +14,19 @@ namespace PlatformUtils {
|
||||||
std::string resourceBasePath();
|
std::string resourceBasePath();
|
||||||
fs::path resourcePath(const std::string& resource);
|
fs::path resourcePath(const std::string& resource);
|
||||||
std::string userLibraryPath();
|
std::string userLibraryPath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base path where user configuration can be read and written to. On
|
||||||
|
* Linux this is the $XDG_CONFIG_HOME, on Windows the local AppData
|
||||||
|
* folder CSIDL_LOCAL_APPDATA.
|
||||||
|
* On success the returned path can be used directly as base folder
|
||||||
|
* as it already includes an OpenSCAD specific part.
|
||||||
|
*
|
||||||
|
* @return absolute path to the writable configuration folder or
|
||||||
|
* an empty string if the config path does not exist.
|
||||||
|
*/
|
||||||
|
std::string userConfigPath();
|
||||||
|
|
||||||
bool createUserLibraryPath();
|
bool createUserLibraryPath();
|
||||||
std::string backupPath();
|
std::string backupPath();
|
||||||
bool createBackupPath();
|
bool createBackupPath();
|
||||||
|
|
|
@ -48,7 +48,10 @@ Q_DECLARE_METATYPE(Feature *);
|
||||||
Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
|
Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Preferences::init() {
|
||||||
|
|
||||||
// Editor pane
|
// Editor pane
|
||||||
// Setup default font (Try to use a nice monospace font)
|
// Setup default font (Try to use a nice monospace font)
|
||||||
QString fontfamily;
|
QString fontfamily;
|
||||||
|
@ -103,6 +106,7 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
|
||||||
this->defaultmap["advanced/forceGoldfeather"] = false;
|
this->defaultmap["advanced/forceGoldfeather"] = false;
|
||||||
this->defaultmap["advanced/mdi"] = true;
|
this->defaultmap["advanced/mdi"] = true;
|
||||||
this->defaultmap["advanced/undockableWindows"] = false;
|
this->defaultmap["advanced/undockableWindows"] = false;
|
||||||
|
this->defaultmap["advanced/reorderWindows"] = true;
|
||||||
this->defaultmap["launcher/showOnStartup"] = true;
|
this->defaultmap["launcher/showOnStartup"] = true;
|
||||||
this->defaultmap["advanced/localization"] = true;
|
this->defaultmap["advanced/localization"] = true;
|
||||||
|
|
||||||
|
@ -136,9 +140,6 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
|
||||||
#endif
|
#endif
|
||||||
this->polysetCacheSizeEdit->setValidator(validator);
|
this->polysetCacheSizeEdit->setValidator(validator);
|
||||||
this->opencsgLimitEdit->setValidator(validator);
|
this->opencsgLimitEdit->setValidator(validator);
|
||||||
|
|
||||||
setupFeaturesPage();
|
|
||||||
updateGUI();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Preferences::~Preferences()
|
Preferences::~Preferences()
|
||||||
|
@ -273,7 +274,7 @@ void Preferences::on_editorType_editTextChanged(const QString &type)
|
||||||
settings.setValue("editor/editortype", type);
|
settings.setValue("editor/editortype", type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Preferences::on_syntaxHighlight_currentIndexChanged(const QString &s)
|
void Preferences::on_syntaxHighlight_activated(const QString &s)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
settings.setValue("editor/syntaxhighlight", s);
|
settings.setValue("editor/syntaxhighlight", s);
|
||||||
|
@ -322,6 +323,18 @@ Preferences::on_mdiCheckBox_toggled(bool state)
|
||||||
emit updateMdiMode(state);
|
emit updateMdiMode(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Preferences::on_reorderCheckBox_toggled(bool state)
|
||||||
|
{
|
||||||
|
if (!state) {
|
||||||
|
undockCheckBox->setChecked(false);
|
||||||
|
}
|
||||||
|
undockCheckBox->setEnabled(state);
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue("advanced/reorderWindows", state);
|
||||||
|
emit updateReorderMode(state);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Preferences::on_undockCheckBox_toggled(bool state)
|
Preferences::on_undockCheckBox_toggled(bool state)
|
||||||
{
|
{
|
||||||
|
@ -453,7 +466,14 @@ void Preferences::updateGUI()
|
||||||
|
|
||||||
QString shighlight = getValue("editor/syntaxhighlight").toString();
|
QString shighlight = getValue("editor/syntaxhighlight").toString();
|
||||||
int shidx = this->syntaxHighlight->findText(shighlight);
|
int shidx = this->syntaxHighlight->findText(shighlight);
|
||||||
if (shidx >= 0) this->syntaxHighlight->setCurrentIndex(shidx);
|
if (shidx >= 0) {
|
||||||
|
this->syntaxHighlight->setCurrentIndex(shidx);
|
||||||
|
} else {
|
||||||
|
int offidx = this->syntaxHighlight->findText("Off");
|
||||||
|
if (offidx >= 0) {
|
||||||
|
this->syntaxHighlight->setCurrentIndex(offidx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QString editortypevar = getValue("editor/editortype").toString();
|
QString editortypevar = getValue("editor/editortype").toString();
|
||||||
int edidx = this->editorType->findText(editortypevar);
|
int edidx = this->editorType->findText(editortypevar);
|
||||||
|
@ -475,7 +495,9 @@ void Preferences::updateGUI()
|
||||||
this->localizationCheckBox->setChecked(getValue("advanced/localization").toBool());
|
this->localizationCheckBox->setChecked(getValue("advanced/localization").toBool());
|
||||||
this->forceGoldfeatherBox->setChecked(getValue("advanced/forceGoldfeather").toBool());
|
this->forceGoldfeatherBox->setChecked(getValue("advanced/forceGoldfeather").toBool());
|
||||||
this->mdiCheckBox->setChecked(getValue("advanced/mdi").toBool());
|
this->mdiCheckBox->setChecked(getValue("advanced/mdi").toBool());
|
||||||
|
this->reorderCheckBox->setChecked(getValue("advanced/reorderWindows").toBool());
|
||||||
this->undockCheckBox->setChecked(getValue("advanced/undockableWindows").toBool());
|
this->undockCheckBox->setChecked(getValue("advanced/undockableWindows").toBool());
|
||||||
|
this->undockCheckBox->setEnabled(this->reorderCheckBox->isChecked());
|
||||||
this->launcherBox->setChecked(getValue("launcher/showOnStartup").toBool());
|
this->launcherBox->setChecked(getValue("launcher/showOnStartup").toBool());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,4 +506,29 @@ void Preferences::apply() const
|
||||||
emit fontChanged(getValue("editor/fontfamily").toString(), getValue("editor/fontsize").toUInt());
|
emit fontChanged(getValue("editor/fontfamily").toString(), getValue("editor/fontsize").toUInt());
|
||||||
emit requestRedraw();
|
emit requestRedraw();
|
||||||
emit openCSGSettingsChanged();
|
emit openCSGSettingsChanged();
|
||||||
|
emit syntaxHighlightChanged(getValue("editor/syntaxhighlight").toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Preferences::create(QWidget *parent, QStringList colorSchemes)
|
||||||
|
{
|
||||||
|
std::list<std::string> names = ColorMap::inst()->colorSchemeNames(true);
|
||||||
|
QStringList renderColorSchemes;
|
||||||
|
foreach (std::string name, names) {
|
||||||
|
renderColorSchemes << name.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
instance = new Preferences(parent);
|
||||||
|
instance->syntaxHighlight->clear();
|
||||||
|
instance->syntaxHighlight->addItems(colorSchemes);
|
||||||
|
instance->colorSchemeChooser->clear();
|
||||||
|
instance->colorSchemeChooser->addItems(renderColorSchemes);
|
||||||
|
instance->init();
|
||||||
|
instance->setupFeaturesPage();
|
||||||
|
instance->updateGUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
Preferences *Preferences::inst() {
|
||||||
|
assert(instance != NULL);
|
||||||
|
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include "ui_Preferences.h"
|
#include "ui_Preferences.h"
|
||||||
#include "colormap.h"
|
|
||||||
|
|
||||||
class Preferences : public QMainWindow, public Ui::Preferences
|
class Preferences : public QMainWindow, public Ui::Preferences
|
||||||
{
|
{
|
||||||
|
@ -12,9 +11,12 @@ class Preferences : public QMainWindow, public Ui::Preferences
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~Preferences();
|
~Preferences();
|
||||||
static Preferences *inst() { if (!instance) instance = new Preferences(); return instance; }
|
|
||||||
|
static void create(QWidget *parent, QStringList colorSchemes);
|
||||||
|
static Preferences *inst();
|
||||||
|
|
||||||
QVariant getValue(const QString &key) const;
|
QVariant getValue(const QString &key) const;
|
||||||
|
void init();
|
||||||
void apply() const;
|
void apply() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -23,7 +25,7 @@ public slots:
|
||||||
void on_colorSchemeChooser_itemSelectionChanged();
|
void on_colorSchemeChooser_itemSelectionChanged();
|
||||||
void on_fontChooser_activated(const QString &);
|
void on_fontChooser_activated(const QString &);
|
||||||
void on_fontSize_editTextChanged(const QString &);
|
void on_fontSize_editTextChanged(const QString &);
|
||||||
void on_syntaxHighlight_currentIndexChanged(const QString &);
|
void on_syntaxHighlight_activated(const QString &);
|
||||||
void on_openCSGWarningBox_toggled(bool);
|
void on_openCSGWarningBox_toggled(bool);
|
||||||
void on_enableOpenCSGBox_toggled(bool);
|
void on_enableOpenCSGBox_toggled(bool);
|
||||||
void on_cgalCacheSizeEdit_textChanged(const QString &);
|
void on_cgalCacheSizeEdit_textChanged(const QString &);
|
||||||
|
@ -35,6 +37,7 @@ public slots:
|
||||||
void on_updateCheckBox_toggled(bool);
|
void on_updateCheckBox_toggled(bool);
|
||||||
void on_snapshotCheckBox_toggled(bool);
|
void on_snapshotCheckBox_toggled(bool);
|
||||||
void on_mdiCheckBox_toggled(bool);
|
void on_mdiCheckBox_toggled(bool);
|
||||||
|
void on_reorderCheckBox_toggled(bool);
|
||||||
void on_undockCheckBox_toggled(bool);
|
void on_undockCheckBox_toggled(bool);
|
||||||
void on_checkNowButton_clicked();
|
void on_checkNowButton_clicked();
|
||||||
void on_launcherBox_toggled(bool);
|
void on_launcherBox_toggled(bool);
|
||||||
|
@ -43,11 +46,12 @@ public slots:
|
||||||
signals:
|
signals:
|
||||||
void requestRedraw() const;
|
void requestRedraw() const;
|
||||||
void updateMdiMode(bool mdi) const;
|
void updateMdiMode(bool mdi) const;
|
||||||
void updateUndockMode(bool mdi) const;
|
void updateUndockMode(bool undockMode) const;
|
||||||
|
void updateReorderMode(bool undockMode) const;
|
||||||
void fontChanged(const QString &family, uint size) const;
|
void fontChanged(const QString &family, uint size) const;
|
||||||
void colorSchemeChanged(const QString &scheme) const;
|
void colorSchemeChanged(const QString &scheme) const;
|
||||||
void openCSGSettingsChanged() const;
|
void openCSGSettingsChanged() const;
|
||||||
void syntaxHighlightChanged(const QString &s);
|
void syntaxHighlightChanged(const QString &s) const;
|
||||||
void editorTypeChanged(const QString &type);
|
void editorTypeChanged(const QString &type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>852</width>
|
<width>852</width>
|
||||||
<height>550</height>
|
<height>554</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="stackedWidget">
|
<widget class="QStackedWidget" name="stackedWidget">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>3</number>
|
<number>4</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page3DView">
|
<widget class="QWidget" name="page3DView">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
@ -54,43 +54,8 @@
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentRow">
|
<property name="currentRow">
|
||||||
<number>0</number>
|
<number>-1</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cornfield</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Metallic</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Sunset</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Starnight</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>BeforeDawn</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Nature</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>DeepOcean</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -264,31 +229,6 @@
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>For Light Background</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>For Dark Background</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Monokai</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Solarized</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>Off</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -547,8 +487,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>832</width>
|
<width>100</width>
|
||||||
<height>420</height>
|
<height>30</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||||
|
@ -685,10 +625,17 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="reorderCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable docking of Editor and Console in different places</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="undockCheckBox">
|
<widget class="QCheckBox" name="undockCheckBox">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable undocking of Editor and Console</string>
|
<string>Enable undocking of Editor and Console to separate windows</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -365,8 +365,10 @@ namespace CGALUtils {
|
||||||
const shared_ptr<const Geometry> &chgeom = item.second;
|
const shared_ptr<const Geometry> &chgeom = item.second;
|
||||||
const CGAL_Nef_polyhedron *N = dynamic_cast<const CGAL_Nef_polyhedron *>(chgeom.get());
|
const CGAL_Nef_polyhedron *N = dynamic_cast<const CGAL_Nef_polyhedron *>(chgeom.get());
|
||||||
if (N) {
|
if (N) {
|
||||||
for (CGAL_Nef_polyhedron3::Vertex_const_iterator i = N->p3->vertices_begin(); i != N->p3->vertices_end(); ++i) {
|
if (!N->isEmpty()) {
|
||||||
points.insert(K::Point_3(to_double(i->point()[0]),to_double(i->point()[1]),to_double(i->point()[2])));
|
for (CGAL_Nef_polyhedron3::Vertex_const_iterator i = N->p3->vertices_begin(); i != N->p3->vertices_end(); ++i) {
|
||||||
|
points.insert(K::Point_3(to_double(i->point()[0]),to_double(i->point()[1]),to_double(i->point()[2])));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const PolySet *ps = dynamic_cast<const PolySet *>(chgeom.get());
|
const PolySet *ps = dynamic_cast<const PolySet *>(chgeom.get());
|
||||||
|
|
164
src/color.cc
|
@ -31,22 +31,180 @@
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <boost/unordered/unordered_map.hpp>
|
||||||
#include <boost/algorithm/string/case_conv.hpp>
|
#include <boost/algorithm/string/case_conv.hpp>
|
||||||
#include <boost/assign/std/vector.hpp>
|
#include <boost/assign/std/vector.hpp>
|
||||||
#include <boost/assign/list_of.hpp>
|
#include <boost/assign/list_of.hpp>
|
||||||
using namespace boost::assign; // bring 'operator+=()' into scope
|
using namespace boost::assign; // bring 'operator+=()' into scope
|
||||||
#include "colormap.h"
|
|
||||||
|
|
||||||
class ColorModule : public AbstractModule
|
class ColorModule : public AbstractModule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ColorModule() : webcolors(ColorMap::inst()->webColors()) { }
|
ColorModule();
|
||||||
|
virtual ~ColorModule();
|
||||||
virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const;
|
virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const boost::unordered_map<std::string, Color4f> &webcolors;
|
boost::unordered_map<std::string, Color4f> webcolors;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ColorModule::ColorModule()
|
||||||
|
{
|
||||||
|
webcolors = map_list_of
|
||||||
|
("aliceblue", Color4f(240, 248, 255))
|
||||||
|
("antiquewhite", Color4f(250, 235, 215))
|
||||||
|
("aqua", Color4f(0, 255, 255))
|
||||||
|
("aquamarine", Color4f(127, 255, 212))
|
||||||
|
("azure", Color4f(240, 255, 255))
|
||||||
|
("beige", Color4f(245, 245, 220))
|
||||||
|
("bisque", Color4f(255, 228, 196))
|
||||||
|
("black", Color4f(0, 0, 0))
|
||||||
|
("blanchedalmond", Color4f(255, 235, 205))
|
||||||
|
("blue", Color4f(0, 0, 255))
|
||||||
|
("blueviolet", Color4f(138, 43, 226))
|
||||||
|
("brown", Color4f(165, 42, 42))
|
||||||
|
("burlywood", Color4f(222, 184, 135))
|
||||||
|
("cadetblue", Color4f(95, 158, 160))
|
||||||
|
("chartreuse", Color4f(127, 255, 0))
|
||||||
|
("chocolate", Color4f(210, 105, 30))
|
||||||
|
("coral", Color4f(255, 127, 80))
|
||||||
|
("cornflowerblue", Color4f(100, 149, 237))
|
||||||
|
("cornsilk", Color4f(255, 248, 220))
|
||||||
|
("crimson", Color4f(220, 20, 60))
|
||||||
|
("cyan", Color4f(0, 255, 255))
|
||||||
|
("darkblue", Color4f(0, 0, 139))
|
||||||
|
("darkcyan", Color4f(0, 139, 139))
|
||||||
|
("darkgoldenrod", Color4f(184, 134, 11))
|
||||||
|
("darkgray", Color4f(169, 169, 169))
|
||||||
|
("darkgreen", Color4f(0, 100, 0))
|
||||||
|
("darkgrey", Color4f(169, 169, 169))
|
||||||
|
("darkkhaki", Color4f(189, 183, 107))
|
||||||
|
("darkmagenta", Color4f(139, 0, 139))
|
||||||
|
("darkolivegreen", Color4f(85, 107, 47))
|
||||||
|
("darkorange", Color4f(255, 140, 0))
|
||||||
|
("darkorchid", Color4f(153, 50, 204))
|
||||||
|
("darkred", Color4f(139, 0, 0))
|
||||||
|
("darksalmon", Color4f(233, 150, 122))
|
||||||
|
("darkseagreen", Color4f(143, 188, 143))
|
||||||
|
("darkslateblue", Color4f(72, 61, 139))
|
||||||
|
("darkslategray", Color4f(47, 79, 79))
|
||||||
|
("darkslategrey", Color4f(47, 79, 79))
|
||||||
|
("darkturquoise", Color4f(0, 206, 209))
|
||||||
|
("darkviolet", Color4f(148, 0, 211))
|
||||||
|
("deeppink", Color4f(255, 20, 147))
|
||||||
|
("deepskyblue", Color4f(0, 191, 255))
|
||||||
|
("dimgray", Color4f(105, 105, 105))
|
||||||
|
("dimgrey", Color4f(105, 105, 105))
|
||||||
|
("dodgerblue", Color4f(30, 144, 255))
|
||||||
|
("firebrick", Color4f(178, 34, 34))
|
||||||
|
("floralwhite", Color4f(255, 250, 240))
|
||||||
|
("forestgreen", Color4f(34, 139, 34))
|
||||||
|
("fuchsia", Color4f(255, 0, 255))
|
||||||
|
("gainsboro", Color4f(220, 220, 220))
|
||||||
|
("ghostwhite", Color4f(248, 248, 255))
|
||||||
|
("gold", Color4f(255, 215, 0))
|
||||||
|
("goldenrod", Color4f(218, 165, 32))
|
||||||
|
("gray", Color4f(128, 128, 128))
|
||||||
|
("green", Color4f(0, 128, 0))
|
||||||
|
("greenyellow", Color4f(173, 255, 47))
|
||||||
|
("grey", Color4f(128, 128, 128))
|
||||||
|
("honeydew", Color4f(240, 255, 240))
|
||||||
|
("hotpink", Color4f(255, 105, 180))
|
||||||
|
("indianred", Color4f(205, 92, 92))
|
||||||
|
("indigo", Color4f(75, 0, 130))
|
||||||
|
("ivory", Color4f(255, 255, 240))
|
||||||
|
("khaki", Color4f(240, 230, 140))
|
||||||
|
("lavender", Color4f(230, 230, 250))
|
||||||
|
("lavenderblush", Color4f(255, 240, 245))
|
||||||
|
("lawngreen", Color4f(124, 252, 0))
|
||||||
|
("lemonchiffon", Color4f(255, 250, 205))
|
||||||
|
("lightblue", Color4f(173, 216, 230))
|
||||||
|
("lightcoral", Color4f(240, 128, 128))
|
||||||
|
("lightcyan", Color4f(224, 255, 255))
|
||||||
|
("lightgoldenrodyellow", Color4f(250, 250, 210))
|
||||||
|
("lightgray", Color4f(211, 211, 211))
|
||||||
|
("lightgreen", Color4f(144, 238, 144))
|
||||||
|
("lightgrey", Color4f(211, 211, 211))
|
||||||
|
("lightpink", Color4f(255, 182, 193))
|
||||||
|
("lightsalmon", Color4f(255, 160, 122))
|
||||||
|
("lightseagreen", Color4f(32, 178, 170))
|
||||||
|
("lightskyblue", Color4f(135, 206, 250))
|
||||||
|
("lightslategray", Color4f(119, 136, 153))
|
||||||
|
("lightslategrey", Color4f(119, 136, 153))
|
||||||
|
("lightsteelblue", Color4f(176, 196, 222))
|
||||||
|
("lightyellow", Color4f(255, 255, 224))
|
||||||
|
("lime", Color4f(0, 255, 0))
|
||||||
|
("limegreen", Color4f(50, 205, 50))
|
||||||
|
("linen", Color4f(250, 240, 230))
|
||||||
|
("magenta", Color4f(255, 0, 255))
|
||||||
|
("maroon", Color4f(128, 0, 0))
|
||||||
|
("mediumaquamarine", Color4f(102, 205, 170))
|
||||||
|
("mediumblue", Color4f(0, 0, 205))
|
||||||
|
("mediumorchid", Color4f(186, 85, 211))
|
||||||
|
("mediumpurple", Color4f(147, 112, 219))
|
||||||
|
("mediumseagreen", Color4f(60, 179, 113))
|
||||||
|
("mediumslateblue", Color4f(123, 104, 238))
|
||||||
|
("mediumspringgreen", Color4f(0, 250, 154))
|
||||||
|
("mediumturquoise", Color4f(72, 209, 204))
|
||||||
|
("mediumvioletred", Color4f(199, 21, 133))
|
||||||
|
("midnightblue", Color4f(25, 25, 112))
|
||||||
|
("mintcream", Color4f(245, 255, 250))
|
||||||
|
("mistyrose", Color4f(255, 228, 225))
|
||||||
|
("moccasin", Color4f(255, 228, 181))
|
||||||
|
("navajowhite", Color4f(255, 222, 173))
|
||||||
|
("navy", Color4f(0, 0, 128))
|
||||||
|
("oldlace", Color4f(253, 245, 230))
|
||||||
|
("olive", Color4f(128, 128, 0))
|
||||||
|
("olivedrab", Color4f(107, 142, 35))
|
||||||
|
("orange", Color4f(255, 165, 0))
|
||||||
|
("orangered", Color4f(255, 69, 0))
|
||||||
|
("orchid", Color4f(218, 112, 214))
|
||||||
|
("palegoldenrod", Color4f(238, 232, 170))
|
||||||
|
("palegreen", Color4f(152, 251, 152))
|
||||||
|
("paleturquoise", Color4f(175, 238, 238))
|
||||||
|
("palevioletred", Color4f(219, 112, 147))
|
||||||
|
("papayawhip", Color4f(255, 239, 213))
|
||||||
|
("peachpuff", Color4f(255, 218, 185))
|
||||||
|
("peru", Color4f(205, 133, 63))
|
||||||
|
("pink", Color4f(255, 192, 203))
|
||||||
|
("plum", Color4f(221, 160, 221))
|
||||||
|
("powderblue", Color4f(176, 224, 230))
|
||||||
|
("purple", Color4f(128, 0, 128))
|
||||||
|
("red", Color4f(255, 0, 0))
|
||||||
|
("rosybrown", Color4f(188, 143, 143))
|
||||||
|
("royalblue", Color4f(65, 105, 225))
|
||||||
|
("saddlebrown", Color4f(139, 69, 19))
|
||||||
|
("salmon", Color4f(250, 128, 114))
|
||||||
|
("sandybrown", Color4f(244, 164, 96))
|
||||||
|
("seagreen", Color4f(46, 139, 87))
|
||||||
|
("seashell", Color4f(255, 245, 238))
|
||||||
|
("sienna", Color4f(160, 82, 45))
|
||||||
|
("silver", Color4f(192, 192, 192))
|
||||||
|
("skyblue", Color4f(135, 206, 235))
|
||||||
|
("slateblue", Color4f(106, 90, 205))
|
||||||
|
("slategray", Color4f(112, 128, 144))
|
||||||
|
("slategrey", Color4f(112, 128, 144))
|
||||||
|
("snow", Color4f(255, 250, 250))
|
||||||
|
("springgreen", Color4f(0, 255, 127))
|
||||||
|
("steelblue", Color4f(70, 130, 180))
|
||||||
|
("tan", Color4f(210, 180, 140))
|
||||||
|
("teal", Color4f(0, 128, 128))
|
||||||
|
("thistle", Color4f(216, 191, 216))
|
||||||
|
("tomato", Color4f(255, 99, 71))
|
||||||
|
("transparent", Color4f(0, 0, 0, 0))
|
||||||
|
("turquoise", Color4f(64, 224, 208))
|
||||||
|
("violet", Color4f(238, 130, 238))
|
||||||
|
("wheat", Color4f(245, 222, 179))
|
||||||
|
("white", Color4f(255, 255, 255))
|
||||||
|
("whitesmoke", Color4f(245, 245, 245))
|
||||||
|
("yellow", Color4f(255, 255, 0))
|
||||||
|
("yellowgreen", Color4f(154, 205, 50));
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorModule::~ColorModule()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
AbstractNode *ColorModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
|
AbstractNode *ColorModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
|
||||||
{
|
{
|
||||||
ColorNode *node = new ColorNode(inst);
|
ColorNode *node = new ColorNode(inst);
|
||||||
|
|
443
src/colormap.cc
|
@ -1,8 +1,108 @@
|
||||||
#include "colormap.h"
|
#include "colormap.h"
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/assign/list_of.hpp>
|
#include <boost/assign/list_of.hpp>
|
||||||
|
#include "boosty.h"
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
|
#include "PlatformUtils.h"
|
||||||
|
|
||||||
using namespace boost::assign; // bring map_list_of() into scope
|
using namespace boost::assign; // bring map_list_of() into scope
|
||||||
|
|
||||||
|
static const char *DEFAULT_COLOR_SCHEME_NAME = "Cornfield";
|
||||||
|
|
||||||
|
RenderColorScheme::RenderColorScheme() : path("")
|
||||||
|
{
|
||||||
|
_name = DEFAULT_COLOR_SCHEME_NAME;
|
||||||
|
_index = 1000;
|
||||||
|
_show_in_gui = true;
|
||||||
|
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(BACKGROUND_COLOR, Color4f(0xff, 0xff, 0xe5)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(OPENCSG_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(OPENCSG_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0xec, 0x5e)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_EDGE_BACK_COLOR, Color4f(0xab, 0xd8, 0x56)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00)));
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00)));
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderColorScheme::RenderColorScheme(fs::path path) : path(path)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
boost::property_tree::read_json(boosty::stringy(path).c_str(), pt);
|
||||||
|
_name = pt.get<std::string>("name");
|
||||||
|
_index = pt.get<int>("index");
|
||||||
|
_show_in_gui = pt.get<bool>("show-in-gui");
|
||||||
|
|
||||||
|
addColor(BACKGROUND_COLOR, "background");
|
||||||
|
addColor(OPENCSG_FACE_FRONT_COLOR, "opencsg-face-front");
|
||||||
|
addColor(OPENCSG_FACE_BACK_COLOR, "opencsg-face-back");
|
||||||
|
addColor(CGAL_FACE_FRONT_COLOR, "cgal-face-front");
|
||||||
|
addColor(CGAL_FACE_2D_COLOR, "cgal-face-2d");
|
||||||
|
addColor(CGAL_FACE_BACK_COLOR, "cgal-face-back");
|
||||||
|
addColor(CGAL_EDGE_FRONT_COLOR, "cgal-edge-front");
|
||||||
|
addColor(CGAL_EDGE_BACK_COLOR, "cgal-edge-back");
|
||||||
|
addColor(CGAL_EDGE_2D_COLOR, "cgal-edge-2d");
|
||||||
|
addColor(CROSSHAIR_COLOR, "crosshair");
|
||||||
|
} catch (const std::exception & e) {
|
||||||
|
PRINTB("Error reading color scheme file '%s': %s", path.c_str() % e.what());
|
||||||
|
_name = "";
|
||||||
|
_index = 0;
|
||||||
|
_show_in_gui = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderColorScheme::~RenderColorScheme()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderColorScheme::valid() const
|
||||||
|
{
|
||||||
|
return !_name.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string & RenderColorScheme::name() const
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RenderColorScheme::index() const
|
||||||
|
{
|
||||||
|
return _index;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderColorScheme::showInGui() const
|
||||||
|
{
|
||||||
|
return _show_in_gui;
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorScheme & RenderColorScheme::colorScheme()
|
||||||
|
{
|
||||||
|
return _color_scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
const boost::property_tree::ptree & RenderColorScheme::propertyTree() const
|
||||||
|
{
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderColorScheme::addColor(RenderColor colorKey, std::string key)
|
||||||
|
{
|
||||||
|
const boost::property_tree::ptree& colors = pt.get_child("colors");
|
||||||
|
std::string color = colors.get<std::string>(key);
|
||||||
|
if ((color.length() == 7) && (color.at(0) == '#')) {
|
||||||
|
char *endptr;
|
||||||
|
unsigned int val = strtol(color.substr(1).c_str(), &endptr, 16);
|
||||||
|
int r = (val >> 16) & 0xff;
|
||||||
|
int g = (val >> 8) & 0xff;
|
||||||
|
int b = val & 0xff;
|
||||||
|
_color_scheme.insert(ColorScheme::value_type(colorKey, Color4f(r, g, b)));
|
||||||
|
} else {
|
||||||
|
throw std::invalid_argument(std::string("invalid color value for key '") + key + "': '" + color + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ColorMap *ColorMap::inst(bool erase)
|
ColorMap *ColorMap::inst(bool erase)
|
||||||
{
|
{
|
||||||
static ColorMap *instance = new ColorMap;
|
static ColorMap *instance = new ColorMap;
|
||||||
|
@ -13,286 +113,44 @@ ColorMap *ColorMap::inst(bool erase)
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
ColorMap::ColorMap() {
|
ColorMap::ColorMap()
|
||||||
boost::unordered_map<std::string, Color4f> tmpwebcolors = map_list_of
|
{
|
||||||
("aliceblue", Color4f(240, 248, 255))
|
colorSchemeSet = enumerateColorSchemes();
|
||||||
("antiquewhite", Color4f(250, 235, 215))
|
}
|
||||||
("aqua", Color4f(0, 255, 255))
|
|
||||||
("aquamarine", Color4f(127, 255, 212))
|
|
||||||
("azure", Color4f(240, 255, 255))
|
|
||||||
("beige", Color4f(245, 245, 220))
|
|
||||||
("bisque", Color4f(255, 228, 196))
|
|
||||||
("black", Color4f(0, 0, 0))
|
|
||||||
("blanchedalmond", Color4f(255, 235, 205))
|
|
||||||
("blue", Color4f(0, 0, 255))
|
|
||||||
("blueviolet", Color4f(138, 43, 226))
|
|
||||||
("brown", Color4f(165, 42, 42))
|
|
||||||
("burlywood", Color4f(222, 184, 135))
|
|
||||||
("cadetblue", Color4f(95, 158, 160))
|
|
||||||
("chartreuse", Color4f(127, 255, 0))
|
|
||||||
("chocolate", Color4f(210, 105, 30))
|
|
||||||
("coral", Color4f(255, 127, 80))
|
|
||||||
("cornflowerblue", Color4f(100, 149, 237))
|
|
||||||
("cornsilk", Color4f(255, 248, 220))
|
|
||||||
("crimson", Color4f(220, 20, 60))
|
|
||||||
("cyan", Color4f(0, 255, 255))
|
|
||||||
("darkblue", Color4f(0, 0, 139))
|
|
||||||
("darkcyan", Color4f(0, 139, 139))
|
|
||||||
("darkgoldenrod", Color4f(184, 134, 11))
|
|
||||||
("darkgray", Color4f(169, 169, 169))
|
|
||||||
("darkgreen", Color4f(0, 100, 0))
|
|
||||||
("darkgrey", Color4f(169, 169, 169))
|
|
||||||
("darkkhaki", Color4f(189, 183, 107))
|
|
||||||
("darkmagenta", Color4f(139, 0, 139))
|
|
||||||
("darkolivegreen", Color4f(85, 107, 47))
|
|
||||||
("darkorange", Color4f(255, 140, 0))
|
|
||||||
("darkorchid", Color4f(153, 50, 204))
|
|
||||||
("darkred", Color4f(139, 0, 0))
|
|
||||||
("darksalmon", Color4f(233, 150, 122))
|
|
||||||
("darkseagreen", Color4f(143, 188, 143))
|
|
||||||
("darkslateblue", Color4f(72, 61, 139))
|
|
||||||
("darkslategray", Color4f(47, 79, 79))
|
|
||||||
("darkslategrey", Color4f(47, 79, 79))
|
|
||||||
("darkturquoise", Color4f(0, 206, 209))
|
|
||||||
("darkviolet", Color4f(148, 0, 211))
|
|
||||||
("deeppink", Color4f(255, 20, 147))
|
|
||||||
("deepskyblue", Color4f(0, 191, 255))
|
|
||||||
("dimgray", Color4f(105, 105, 105))
|
|
||||||
("dimgrey", Color4f(105, 105, 105))
|
|
||||||
("dodgerblue", Color4f(30, 144, 255))
|
|
||||||
("firebrick", Color4f(178, 34, 34))
|
|
||||||
("floralwhite", Color4f(255, 250, 240))
|
|
||||||
("forestgreen", Color4f(34, 139, 34))
|
|
||||||
("fuchsia", Color4f(255, 0, 255))
|
|
||||||
("gainsboro", Color4f(220, 220, 220))
|
|
||||||
("ghostwhite", Color4f(248, 248, 255))
|
|
||||||
("gold", Color4f(255, 215, 0))
|
|
||||||
("goldenrod", Color4f(218, 165, 32))
|
|
||||||
("gray", Color4f(128, 128, 128))
|
|
||||||
("green", Color4f(0, 128, 0))
|
|
||||||
("greenyellow", Color4f(173, 255, 47))
|
|
||||||
("grey", Color4f(128, 128, 128))
|
|
||||||
("honeydew", Color4f(240, 255, 240))
|
|
||||||
("hotpink", Color4f(255, 105, 180))
|
|
||||||
("indianred", Color4f(205, 92, 92))
|
|
||||||
("indigo", Color4f(75, 0, 130))
|
|
||||||
("ivory", Color4f(255, 255, 240))
|
|
||||||
("khaki", Color4f(240, 230, 140))
|
|
||||||
("lavender", Color4f(230, 230, 250))
|
|
||||||
("lavenderblush", Color4f(255, 240, 245))
|
|
||||||
("lawngreen", Color4f(124, 252, 0))
|
|
||||||
("lemonchiffon", Color4f(255, 250, 205))
|
|
||||||
("lightblue", Color4f(173, 216, 230))
|
|
||||||
("lightcoral", Color4f(240, 128, 128))
|
|
||||||
("lightcyan", Color4f(224, 255, 255))
|
|
||||||
("lightgoldenrodyellow", Color4f(250, 250, 210))
|
|
||||||
("lightgray", Color4f(211, 211, 211))
|
|
||||||
("lightgreen", Color4f(144, 238, 144))
|
|
||||||
("lightgrey", Color4f(211, 211, 211))
|
|
||||||
("lightpink", Color4f(255, 182, 193))
|
|
||||||
("lightsalmon", Color4f(255, 160, 122))
|
|
||||||
("lightseagreen", Color4f(32, 178, 170))
|
|
||||||
("lightskyblue", Color4f(135, 206, 250))
|
|
||||||
("lightslategray", Color4f(119, 136, 153))
|
|
||||||
("lightslategrey", Color4f(119, 136, 153))
|
|
||||||
("lightsteelblue", Color4f(176, 196, 222))
|
|
||||||
("lightyellow", Color4f(255, 255, 224))
|
|
||||||
("lime", Color4f(0, 255, 0))
|
|
||||||
("limegreen", Color4f(50, 205, 50))
|
|
||||||
("linen", Color4f(250, 240, 230))
|
|
||||||
("magenta", Color4f(255, 0, 255))
|
|
||||||
("maroon", Color4f(128, 0, 0))
|
|
||||||
("mediumaquamarine", Color4f(102, 205, 170))
|
|
||||||
("mediumblue", Color4f(0, 0, 205))
|
|
||||||
("mediumorchid", Color4f(186, 85, 211))
|
|
||||||
("mediumpurple", Color4f(147, 112, 219))
|
|
||||||
("mediumseagreen", Color4f(60, 179, 113))
|
|
||||||
("mediumslateblue", Color4f(123, 104, 238))
|
|
||||||
("mediumspringgreen", Color4f(0, 250, 154))
|
|
||||||
("mediumturquoise", Color4f(72, 209, 204))
|
|
||||||
("mediumvioletred", Color4f(199, 21, 133))
|
|
||||||
("midnightblue", Color4f(25, 25, 112))
|
|
||||||
("mintcream", Color4f(245, 255, 250))
|
|
||||||
("mistyrose", Color4f(255, 228, 225))
|
|
||||||
("moccasin", Color4f(255, 228, 181))
|
|
||||||
("navajowhite", Color4f(255, 222, 173))
|
|
||||||
("navy", Color4f(0, 0, 128))
|
|
||||||
("oldlace", Color4f(253, 245, 230))
|
|
||||||
("olive", Color4f(128, 128, 0))
|
|
||||||
("olivedrab", Color4f(107, 142, 35))
|
|
||||||
("orange", Color4f(255, 165, 0))
|
|
||||||
("orangered", Color4f(255, 69, 0))
|
|
||||||
("orchid", Color4f(218, 112, 214))
|
|
||||||
("palegoldenrod", Color4f(238, 232, 170))
|
|
||||||
("palegreen", Color4f(152, 251, 152))
|
|
||||||
("paleturquoise", Color4f(175, 238, 238))
|
|
||||||
("palevioletred", Color4f(219, 112, 147))
|
|
||||||
("papayawhip", Color4f(255, 239, 213))
|
|
||||||
("peachpuff", Color4f(255, 218, 185))
|
|
||||||
("peru", Color4f(205, 133, 63))
|
|
||||||
("pink", Color4f(255, 192, 203))
|
|
||||||
("plum", Color4f(221, 160, 221))
|
|
||||||
("powderblue", Color4f(176, 224, 230))
|
|
||||||
("purple", Color4f(128, 0, 128))
|
|
||||||
("red", Color4f(255, 0, 0))
|
|
||||||
("rosybrown", Color4f(188, 143, 143))
|
|
||||||
("royalblue", Color4f(65, 105, 225))
|
|
||||||
("saddlebrown", Color4f(139, 69, 19))
|
|
||||||
("salmon", Color4f(250, 128, 114))
|
|
||||||
("sandybrown", Color4f(244, 164, 96))
|
|
||||||
("seagreen", Color4f(46, 139, 87))
|
|
||||||
("seashell", Color4f(255, 245, 238))
|
|
||||||
("sienna", Color4f(160, 82, 45))
|
|
||||||
("silver", Color4f(192, 192, 192))
|
|
||||||
("skyblue", Color4f(135, 206, 235))
|
|
||||||
("slateblue", Color4f(106, 90, 205))
|
|
||||||
("slategray", Color4f(112, 128, 144))
|
|
||||||
("slategrey", Color4f(112, 128, 144))
|
|
||||||
("snow", Color4f(255, 250, 250))
|
|
||||||
("springgreen", Color4f(0, 255, 127))
|
|
||||||
("steelblue", Color4f(70, 130, 180))
|
|
||||||
("tan", Color4f(210, 180, 140))
|
|
||||||
("teal", Color4f(0, 128, 128))
|
|
||||||
("thistle", Color4f(216, 191, 216))
|
|
||||||
("tomato", Color4f(255, 99, 71))
|
|
||||||
("transparent", Color4f(0, 0, 0, 0))
|
|
||||||
("turquoise", Color4f(64, 224, 208))
|
|
||||||
("violet", Color4f(238, 130, 238))
|
|
||||||
("wheat", Color4f(245, 222, 179))
|
|
||||||
("white", Color4f(255, 255, 255))
|
|
||||||
("whitesmoke", Color4f(245, 245, 245))
|
|
||||||
("yellow", Color4f(255, 255, 0))
|
|
||||||
("yellowgreen", Color4f(154, 205, 50));
|
|
||||||
webcolors = tmpwebcolors;
|
|
||||||
|
|
||||||
ColorScheme cornfield = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0xff, 0xff, 0xe5))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0xec, 0x5e))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xab, 0xd8, 0x56))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00));
|
|
||||||
|
|
||||||
ColorScheme metallic = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0xaa, 0xaa, 0xff))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xdd, 0xdd, 0xff))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0xdd, 0x22, 0xdd))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xdd, 0xdd, 0xff))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0xdd, 0x22, 0xdd))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00));
|
|
||||||
|
|
||||||
ColorScheme sunset = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0xaa, 0x44, 0x44))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xff, 0xaa, 0xaa))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0x88, 0x22, 0x33))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xff, 0xaa, 0xaa))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0x88, 0x22, 0x33))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00));
|
|
||||||
|
|
||||||
ColorScheme starnight = map_list_of
|
|
||||||
(BACKGROUND_COLOR, webcolors["black"])
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, webcolors["lightyellow"])
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, webcolors["cyan"])
|
|
||||||
(CGAL_FACE_FRONT_COLOR, webcolors["lightyellow"])
|
|
||||||
(CGAL_FACE_BACK_COLOR, webcolors["cyan"])
|
|
||||||
(CGAL_FACE_2D_COLOR, webcolors["mediumpurple"])
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0x00, 0x00, 0xff))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0x00, 0x00, 0xff))
|
|
||||||
(CGAL_EDGE_2D_COLOR, webcolors["magenta"])
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0xf0, 0xf0, 0xf0));
|
|
||||||
|
|
||||||
ColorScheme beforedawn = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0x33, 0x33, 0x33))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xcc, 0xcc, 0xcc))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0x55, 0x63, 0xdd))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xcc, 0xcc, 0xcc))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0x55, 0x63, 0xdd))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0xf0, 0xf0, 0xf0));
|
|
||||||
|
|
||||||
ColorScheme nature = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0xfa, 0xfa, 0xfa))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0x16, 0xa0, 0x85))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0xdb, 0xf4, 0xda))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0x16, 0xa0, 0x85))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0xdb, 0xf4, 0xda))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0x11, 0x11, 0x11));
|
|
||||||
|
|
||||||
ColorScheme deepocean = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0x33, 0x33, 0x33))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xee, 0xee, 0xee))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0x0b, 0xab, 0xc8))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xee, 0xee, 0xee))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0x0b, 0xab, 0xc8))
|
|
||||||
(CGAL_FACE_2D_COLOR, webcolors["mediumpurple"])
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0x00, 0x00, 0xff))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0x00, 0x00, 0xff))
|
|
||||||
(CGAL_EDGE_2D_COLOR, webcolors["magenta"])
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0xf0, 0xf0, 0xf0));
|
|
||||||
|
|
||||||
// Monotone - no difference between 'back face' and 'front face'
|
|
||||||
ColorScheme monotone = map_list_of
|
|
||||||
(BACKGROUND_COLOR, Color4f(0xff, 0xff, 0xe5))
|
|
||||||
(OPENCSG_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(OPENCSG_FACE_BACK_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(CGAL_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(CGAL_FACE_BACK_COLOR, Color4f(0xf9, 0xd7, 0x2c))
|
|
||||||
(CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))
|
|
||||||
(CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_BACK_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))
|
|
||||||
(CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00));
|
|
||||||
|
|
||||||
boost::unordered_map<std::string, ColorScheme> tmpcolorschemes = map_list_of
|
|
||||||
("Cornfield", cornfield)
|
|
||||||
("Metallic", metallic)
|
|
||||||
("Sunset", sunset)
|
|
||||||
("Starnight", starnight)
|
|
||||||
("BeforeDawn", beforedawn)
|
|
||||||
("Nature", nature)
|
|
||||||
("DeepOcean", deepocean)
|
|
||||||
("Monotone", monotone); // Hidden, not in GUI
|
|
||||||
colorschemes = tmpcolorschemes;
|
|
||||||
|
|
||||||
|
ColorMap::~ColorMap()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const ColorScheme &ColorMap::defaultColorScheme() const
|
const ColorScheme &ColorMap::defaultColorScheme() const
|
||||||
{
|
{
|
||||||
return colorschemes.at("Cornfield");
|
return *findColorScheme(DEFAULT_COLOR_SCHEME_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ColorScheme *ColorMap::findColorScheme(const std::string &name) const
|
const ColorScheme *ColorMap::findColorScheme(const std::string &name) const
|
||||||
{
|
{
|
||||||
if (colorschemes.find(name) != colorschemes.end()) return &colorschemes.at(name);
|
for (colorscheme_set_t::const_iterator it = colorSchemeSet.begin();it != colorSchemeSet.end();it++) {
|
||||||
return NULL;
|
RenderColorScheme *scheme = (*it).second.get();
|
||||||
|
if (name == scheme->name()) {
|
||||||
|
return &scheme->colorScheme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<std::string> ColorMap::colorSchemeNames() const
|
std::list<std::string> ColorMap::colorSchemeNames(bool guiOnly) const
|
||||||
{
|
{
|
||||||
std::list<std::string> names;
|
std::list<std::string> colorSchemeNames;
|
||||||
for (boost::unordered_map<std::string, ColorScheme>::const_iterator iter=colorschemes.begin(); iter!=colorschemes.end(); iter++) {
|
for (colorscheme_set_t::const_iterator it = colorSchemeSet.begin();it != colorSchemeSet.end();it++) {
|
||||||
names.push_back(iter->first);
|
RenderColorScheme *scheme = (*it).second.get();
|
||||||
|
if (guiOnly && !scheme->showInGui()) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
return names;
|
colorSchemeNames.push_back(scheme->name());
|
||||||
|
}
|
||||||
|
|
||||||
|
return colorSchemeNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color4f ColorMap::getColor(const ColorScheme &cs, const RenderColor rc)
|
Color4f ColorMap::getColor(const ColorScheme &cs, const RenderColor rc)
|
||||||
|
@ -302,19 +160,42 @@ Color4f ColorMap::getColor(const ColorScheme &cs, const RenderColor rc)
|
||||||
return Color4f(0, 0, 0, 127);
|
return Color4f(0, 0, 0, 127);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void ColorMap::enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path path)
|
||||||
void printcolorscheme(const ColorScheme &cs)
|
{
|
||||||
{
|
const fs::path color_schemes = path / "color-schemes" / "render";
|
||||||
for (ColorScheme::const_iterator j=cs.begin();j!=cs.end();j++)
|
|
||||||
PRINTB("%i %s",j->first % j->second.transpose());
|
fs::directory_iterator end_iter;
|
||||||
|
|
||||||
|
if (fs::exists(color_schemes) && fs::is_directory(color_schemes)) {
|
||||||
|
for (fs::directory_iterator dir_iter(color_schemes); dir_iter != end_iter; ++dir_iter) {
|
||||||
|
if (!fs::is_regular_file(dir_iter->status())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fs::path path = (*dir_iter).path();
|
||||||
|
if (!(path.extension().string() == ".json")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderColorScheme *colorScheme = new RenderColorScheme(path);
|
||||||
|
if (colorScheme->valid() && (findColorScheme(colorScheme->name()) == 0)) {
|
||||||
|
result_set.insert(colorscheme_set_t::value_type(colorScheme->index(), boost::shared_ptr<RenderColorScheme>(colorScheme)));
|
||||||
|
} else {
|
||||||
|
delete colorScheme;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void printcolorschemes()
|
ColorMap::colorscheme_set_t ColorMap::enumerateColorSchemes()
|
||||||
{
|
{
|
||||||
for (boost::unordered_map<std::string, ColorScheme>::const_iterator i=colorschemes.begin();i!=colorschemes.end();i++) {
|
colorscheme_set_t result_set;
|
||||||
PRINTB("-- %s --", i->first);
|
|
||||||
for (ColorScheme::const_iterator j=i->second.begin();j!=i->second.end();j++)
|
RenderColorScheme *defaultColorScheme = new RenderColorScheme();
|
||||||
PRINTB("%i %s",j->first % j->second.transpose());
|
result_set.insert(colorscheme_set_t::value_type(defaultColorScheme->index(),
|
||||||
}
|
boost::shared_ptr<RenderColorScheme>(defaultColorScheme)));
|
||||||
}
|
enumerateColorSchemesInPath(result_set, PlatformUtils::resourcesPath());
|
||||||
*/
|
enumerateColorSchemesInPath(result_set, PlatformUtils::userConfigPath());
|
||||||
|
|
||||||
|
return result_set;
|
||||||
|
}
|
|
@ -4,7 +4,13 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include "linalg.h"
|
#include "linalg.h"
|
||||||
#include <boost/unordered/unordered_map.hpp>
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/property_tree/ptree.hpp>
|
||||||
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
|
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
enum RenderColor {
|
enum RenderColor {
|
||||||
BACKGROUND_COLOR,
|
BACKGROUND_COLOR,
|
||||||
|
@ -21,23 +27,59 @@ enum RenderColor {
|
||||||
|
|
||||||
typedef std::map<RenderColor, Color4f> ColorScheme;
|
typedef std::map<RenderColor, Color4f> ColorScheme;
|
||||||
|
|
||||||
|
class RenderColorScheme
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const fs::path path;
|
||||||
|
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
std::string _name;
|
||||||
|
int _index;
|
||||||
|
bool _show_in_gui;
|
||||||
|
|
||||||
|
ColorScheme _color_scheme;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor for the default color scheme Cornfield.
|
||||||
|
*/
|
||||||
|
RenderColorScheme();
|
||||||
|
/**
|
||||||
|
* Constructor for reading external JSON files.
|
||||||
|
*/
|
||||||
|
RenderColorScheme(const fs::path path);
|
||||||
|
virtual ~RenderColorScheme();
|
||||||
|
|
||||||
|
const std::string & name() const;
|
||||||
|
int index() const;
|
||||||
|
bool valid() const;
|
||||||
|
bool showInGui() const;
|
||||||
|
ColorScheme & colorScheme();
|
||||||
|
const boost::property_tree::ptree & propertyTree() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void addColor(RenderColor colorKey, std::string key);
|
||||||
|
|
||||||
|
friend class ColorMap;
|
||||||
|
};
|
||||||
|
|
||||||
class ColorMap
|
class ColorMap
|
||||||
{
|
{
|
||||||
|
typedef std::multimap<int, boost::shared_ptr<RenderColorScheme>, std::less<int> > colorscheme_set_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ColorMap *inst(bool erase = false);
|
static ColorMap *inst(bool erase = false);
|
||||||
|
|
||||||
const ColorScheme &defaultColorScheme() const;
|
const ColorScheme & defaultColorScheme() const;
|
||||||
|
|
||||||
const boost::unordered_map<std::string, Color4f> &webColors() const { return webcolors; }
|
|
||||||
const ColorScheme *findColorScheme(const std::string &name) const;
|
const ColorScheme *findColorScheme(const std::string &name) const;
|
||||||
std::list<std::string> colorSchemeNames() const;
|
std::list<std::string> colorSchemeNames(bool guiOnly = false) const;
|
||||||
|
|
||||||
static Color4f getColor(const ColorScheme &cs, const RenderColor rc);
|
static Color4f getColor(const ColorScheme &cs, const RenderColor rc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ColorMap();
|
ColorMap();
|
||||||
~ColorMap() {}
|
virtual ~ColorMap();
|
||||||
|
colorscheme_set_t enumerateColorSchemes();
|
||||||
boost::unordered_map<std::string, Color4f> webcolors;
|
void enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path path);
|
||||||
boost::unordered_map<std::string, ColorScheme> colorschemes;
|
colorscheme_set_t colorSchemeSet;
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
virtual QString selectedText() = 0;
|
virtual QString selectedText() = 0;
|
||||||
virtual bool find(const QString &, bool findNext = false, bool findBackwards = false) = 0;
|
virtual bool find(const QString &, bool findNext = false, bool findBackwards = false) = 0;
|
||||||
virtual void replaceSelectedText(const QString &) = 0;
|
virtual void replaceSelectedText(const QString &) = 0;
|
||||||
|
virtual QStringList colorSchemes() = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void contentsChanged();
|
void contentsChanged();
|
||||||
|
|
|
@ -235,9 +235,6 @@ Highlighter::Highlighter(QTextDocument *parent)
|
||||||
tokentypes["_$quote"] << "_$quote";
|
tokentypes["_$quote"] << "_$quote";
|
||||||
tokentypes["_$number"] << "_$number";
|
tokentypes["_$number"] << "_$number";
|
||||||
|
|
||||||
QString syntaxhighlight = Preferences::inst()->getValue("editor/syntaxhighlight").toString();
|
|
||||||
this->assignFormatsToTokens(syntaxhighlight);
|
|
||||||
|
|
||||||
errorFormat.setBackground(Qt::red);
|
errorFormat.setBackground(Qt::red);
|
||||||
errorState = false;
|
errorState = false;
|
||||||
errorPos = -1;
|
errorPos = -1;
|
||||||
|
|
|
@ -271,3 +271,15 @@ bool LegacyEditor::isContentModified()
|
||||||
{
|
{
|
||||||
return textedit->document()->isModified();
|
return textedit->document()->isModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList LegacyEditor::colorSchemes()
|
||||||
|
{
|
||||||
|
QStringList colorSchemes;
|
||||||
|
|
||||||
|
colorSchemes
|
||||||
|
<< "For Light Background"
|
||||||
|
<< "For Dark Background"
|
||||||
|
<< "Off";
|
||||||
|
|
||||||
|
return colorSchemes;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ public:
|
||||||
bool find(const QString &, bool findNext = false, bool findBackwards = false);
|
bool find(const QString &, bool findNext = false, bool findBackwards = false);
|
||||||
void replaceSelectedText(const QString &newText);
|
void replaceSelectedText(const QString &newText);
|
||||||
bool findString(const QString & exp, bool findBackwards) const;
|
bool findString(const QString & exp, bool findBackwards) const;
|
||||||
|
QStringList colorSchemes();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void zoomIn();
|
void zoomIn();
|
||||||
|
|
205
src/mainwin.cc
|
@ -86,6 +86,7 @@
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
#include <QDockWidget>
|
#include <QDockWidget>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
@ -171,14 +172,24 @@ settings_valueList(const QString &key, const QList<int> &defaultList = QList<int
|
||||||
|
|
||||||
bool MainWindow::mdiMode = false;
|
bool MainWindow::mdiMode = false;
|
||||||
bool MainWindow::undockMode = false;
|
bool MainWindow::undockMode = false;
|
||||||
|
bool MainWindow::reorderMode = false;
|
||||||
|
|
||||||
MainWindow::MainWindow(const QString &filename)
|
MainWindow::MainWindow(const QString &filename)
|
||||||
: root_inst("group"), library_info_dialog(NULL), font_list_dialog(NULL), tempFile(NULL), progresswidget(NULL)
|
: root_inst("group"), library_info_dialog(NULL), font_list_dialog(NULL), tempFile(NULL), progresswidget(NULL), contentschanged(false)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
|
|
||||||
editortype = Preferences::inst()->getValue("editor/editortype").toString();
|
editorDockTitleWidget = new QWidget();
|
||||||
useScintilla = (editortype == "QScintilla Editor");
|
consoleDockTitleWidget = new QWidget();
|
||||||
|
|
||||||
|
this->editorDock->setConfigKey("view/hideEditor");
|
||||||
|
this->editorDock->setAction(this->viewActionHideEditor);
|
||||||
|
this->consoleDock->setConfigKey("view/hideConsole");
|
||||||
|
this->consoleDock->setAction(this->viewActionHideConsole);
|
||||||
|
|
||||||
|
QSettings settings;
|
||||||
|
editortype = settings.value("editor/editortype").toString();
|
||||||
|
useScintilla = (editortype != "Simple Editor");
|
||||||
|
|
||||||
#ifdef USE_SCINTILLA_EDITOR
|
#ifdef USE_SCINTILLA_EDITOR
|
||||||
if (useScintilla) {
|
if (useScintilla) {
|
||||||
|
@ -188,6 +199,8 @@ MainWindow::MainWindow(const QString &filename)
|
||||||
#endif
|
#endif
|
||||||
editor = new LegacyEditor(editorDockContents);
|
editor = new LegacyEditor(editorDockContents);
|
||||||
|
|
||||||
|
Preferences::create(this, editor->colorSchemes());
|
||||||
|
|
||||||
editorDockContents->layout()->addWidget(editor);
|
editorDockContents->layout()->addWidget(editor);
|
||||||
|
|
||||||
setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
|
setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
|
||||||
|
@ -225,7 +238,6 @@ MainWindow::MainWindow(const QString &filename)
|
||||||
tval = 0;
|
tval = 0;
|
||||||
fps = 0;
|
fps = 0;
|
||||||
fsteps = 1;
|
fsteps = 1;
|
||||||
isClosing = false;
|
|
||||||
|
|
||||||
const QString importStatement = "import(\"%1\");\n";
|
const QString importStatement = "import(\"%1\");\n";
|
||||||
const QString surfaceStatement = "surface(\"%1\");\n";
|
const QString surfaceStatement = "surface(\"%1\");\n";
|
||||||
|
@ -412,11 +424,13 @@ MainWindow::MainWindow(const QString &filename)
|
||||||
updateRecentFileActions();
|
updateRecentFileActions();
|
||||||
|
|
||||||
connect(editor, SIGNAL(contentsChanged()), this, SLOT(animateUpdateDocChanged()));
|
connect(editor, SIGNAL(contentsChanged()), this, SLOT(animateUpdateDocChanged()));
|
||||||
|
connect(editor, SIGNAL(contentsChanged()), this, SLOT(setContentsChanged()));
|
||||||
connect(editor, SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool)));
|
connect(editor, SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool)));
|
||||||
connect(this->qglview, SIGNAL(doAnimateUpdate()), this, SLOT(animateUpdate()));
|
connect(this->qglview, SIGNAL(doAnimateUpdate()), this, SLOT(animateUpdate()));
|
||||||
|
|
||||||
connect(Preferences::inst(), SIGNAL(requestRedraw()), this->qglview, SLOT(updateGL()));
|
connect(Preferences::inst(), SIGNAL(requestRedraw()), this->qglview, SLOT(updateGL()));
|
||||||
connect(Preferences::inst(), SIGNAL(updateMdiMode(bool)), this, SLOT(updateMdiMode(bool)));
|
connect(Preferences::inst(), SIGNAL(updateMdiMode(bool)), this, SLOT(updateMdiMode(bool)));
|
||||||
|
connect(Preferences::inst(), SIGNAL(updateReorderMode(bool)), this, SLOT(updateReorderMode(bool)));
|
||||||
connect(Preferences::inst(), SIGNAL(updateUndockMode(bool)), this, SLOT(updateUndockMode(bool)));
|
connect(Preferences::inst(), SIGNAL(updateUndockMode(bool)), this, SLOT(updateUndockMode(bool)));
|
||||||
connect(Preferences::inst(), SIGNAL(fontChanged(const QString&,uint)),
|
connect(Preferences::inst(), SIGNAL(fontChanged(const QString&,uint)),
|
||||||
editor, SLOT(initFont(const QString&,uint)));
|
editor, SLOT(initFont(const QString&,uint)));
|
||||||
|
@ -510,7 +524,6 @@ MainWindow::MainWindow(const QString &filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure it looks nice..
|
// make sure it looks nice..
|
||||||
QSettings settings;
|
|
||||||
QByteArray windowState = settings.value("window/state", QByteArray()).toByteArray();
|
QByteArray windowState = settings.value("window/state", QByteArray()).toByteArray();
|
||||||
restoreState(windowState);
|
restoreState(windowState);
|
||||||
resize(settings.value("window/size", QSize(800, 600)).toSize());
|
resize(settings.value("window/size", QSize(800, 600)).toSize());
|
||||||
|
@ -530,6 +543,24 @@ MainWindow::MainWindow(const QString &filename)
|
||||||
* fill the available space.
|
* fill the available space.
|
||||||
*/
|
*/
|
||||||
editor->setInitialSizeHint(QSize((5 * this->width() / 11), 100));
|
editor->setInitialSizeHint(QSize((5 * this->width() / 11), 100));
|
||||||
|
} else {
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
// Try moving the main window into the display range, this
|
||||||
|
// can occur when closing OpenSCAD on a second monitor which
|
||||||
|
// is not available at the time the application is started
|
||||||
|
// again.
|
||||||
|
// On Windows that causes the main window to open in a not
|
||||||
|
// easily reachable place.
|
||||||
|
QDesktopWidget *desktop = QApplication::desktop();
|
||||||
|
QRect desktopRect = desktop->frameGeometry().adjusted(250, 150, -250, -150).normalized();
|
||||||
|
QRect windowRect = frameGeometry();
|
||||||
|
if (!desktopRect.intersects(windowRect)) {
|
||||||
|
windowRect.moveCenter(desktopRect.center());
|
||||||
|
windowRect = windowRect.intersected(desktopRect);
|
||||||
|
move(windowRect.topLeft());
|
||||||
|
resize(windowRect.size());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(this->editorDock, SIGNAL(topLevelChanged(bool)), this, SLOT(editorTopLevelChanged(bool)));
|
connect(this->editorDock, SIGNAL(topLevelChanged(bool)), this, SLOT(editorTopLevelChanged(bool)));
|
||||||
|
@ -596,6 +627,7 @@ void MainWindow::loadViewSettings(){
|
||||||
hideToolbars();
|
hideToolbars();
|
||||||
updateMdiMode(settings.value("advanced/mdi").toBool());
|
updateMdiMode(settings.value("advanced/mdi").toBool());
|
||||||
updateUndockMode(settings.value("advanced/undockableWindows").toBool());
|
updateUndockMode(settings.value("advanced/undockableWindows").toBool());
|
||||||
|
updateReorderMode(settings.value("advanced/reorderWindows").toBool());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::loadDesignSettings()
|
void MainWindow::loadDesignSettings()
|
||||||
|
@ -624,11 +656,24 @@ void MainWindow::updateUndockMode(bool undockMode)
|
||||||
editorDock->setFeatures(editorDock->features() | QDockWidget::DockWidgetFloatable);
|
editorDock->setFeatures(editorDock->features() | QDockWidget::DockWidgetFloatable);
|
||||||
consoleDock->setFeatures(consoleDock->features() | QDockWidget::DockWidgetFloatable);
|
consoleDock->setFeatures(consoleDock->features() | QDockWidget::DockWidgetFloatable);
|
||||||
} else {
|
} else {
|
||||||
|
if (editorDock->isFloating()) {
|
||||||
|
editorDock->setFloating(false);
|
||||||
|
}
|
||||||
editorDock->setFeatures(editorDock->features() & ~QDockWidget::DockWidgetFloatable);
|
editorDock->setFeatures(editorDock->features() & ~QDockWidget::DockWidgetFloatable);
|
||||||
|
if (consoleDock->isFloating()) {
|
||||||
|
consoleDock->setFloating(false);
|
||||||
|
}
|
||||||
consoleDock->setFeatures(consoleDock->features() & ~QDockWidget::DockWidgetFloatable);
|
consoleDock->setFeatures(consoleDock->features() & ~QDockWidget::DockWidgetFloatable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::updateReorderMode(bool reorderMode)
|
||||||
|
{
|
||||||
|
MainWindow::reorderMode = reorderMode;
|
||||||
|
editorDock->setTitleBarWidget(reorderMode ? 0 : editorDockTitleWidget);
|
||||||
|
consoleDock->setTitleBarWidget(reorderMode ? 0 : consoleDockTitleWidget);
|
||||||
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
if (root_module) delete root_module;
|
if (root_module) delete root_module;
|
||||||
|
@ -805,8 +850,10 @@ void MainWindow::refreshDocument()
|
||||||
reader.setCodec("UTF-8");
|
reader.setCodec("UTF-8");
|
||||||
QString text = reader.readAll();
|
QString text = reader.readAll();
|
||||||
PRINTB("Loaded design '%s'.", this->fileName.toLocal8Bit().constData());
|
PRINTB("Loaded design '%s'.", this->fileName.toLocal8Bit().constData());
|
||||||
if (editor->toPlainText() != text)
|
if (editor->toPlainText() != text) {
|
||||||
editor->setPlainText(text);
|
editor->setPlainText(text);
|
||||||
|
this->contentschanged = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setCurrentOutput();
|
setCurrentOutput();
|
||||||
|
@ -1008,8 +1055,8 @@ void MainWindow::compileCSG(bool procevents)
|
||||||
CSGTermEvaluator csgrenderer(this->tree, &geomevaluator);
|
CSGTermEvaluator csgrenderer(this->tree, &geomevaluator);
|
||||||
if (procevents) QApplication::processEvents();
|
if (procevents) QApplication::processEvents();
|
||||||
this->root_raw_term = csgrenderer.evaluateCSGTerm(*root_node, highlight_terms, background_terms);
|
this->root_raw_term = csgrenderer.evaluateCSGTerm(*root_node, highlight_terms, background_terms);
|
||||||
if (!root_raw_term) {
|
if (!root_raw_term && background_terms.empty()) {
|
||||||
PRINT("ERROR: CSG generation failed! (no top level object found)");
|
PRINT("ERROR: CSG generation failed! (no objects found)");
|
||||||
}
|
}
|
||||||
GeometryCache::instance()->print();
|
GeometryCache::instance()->print();
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
|
@ -1025,12 +1072,13 @@ void MainWindow::compileCSG(bool procevents)
|
||||||
delete this->progresswidget;
|
delete this->progresswidget;
|
||||||
this->progresswidget = NULL;
|
this->progresswidget = NULL;
|
||||||
|
|
||||||
if (root_raw_term) {
|
PRINT("Compiling design (CSG Products normalization)...");
|
||||||
PRINT("Compiling design (CSG Products normalization)...");
|
if (procevents) QApplication::processEvents();
|
||||||
if (procevents) QApplication::processEvents();
|
|
||||||
|
|
||||||
size_t normalizelimit = 2 * Preferences::inst()->getValue("advanced/openCSGLimit").toUInt();
|
size_t normalizelimit = 2 * Preferences::inst()->getValue("advanced/openCSGLimit").toUInt();
|
||||||
CSGTermNormalizer normalizer(normalizelimit);
|
CSGTermNormalizer normalizer(normalizelimit);
|
||||||
|
|
||||||
|
if (root_raw_term) {
|
||||||
this->root_norm_term = normalizer.normalize(this->root_raw_term);
|
this->root_norm_term = normalizer.normalize(this->root_raw_term);
|
||||||
if (this->root_norm_term) {
|
if (this->root_norm_term) {
|
||||||
this->root_chain = new CSGChain();
|
this->root_chain = new CSGChain();
|
||||||
|
@ -1041,53 +1089,51 @@ void MainWindow::compileCSG(bool procevents)
|
||||||
PRINT("WARNING: CSG normalization resulted in an empty tree");
|
PRINT("WARNING: CSG normalization resulted in an empty tree");
|
||||||
if (procevents) QApplication::processEvents();
|
if (procevents) QApplication::processEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (highlight_terms.size() > 0)
|
|
||||||
{
|
|
||||||
PRINTB("Compiling highlights (%d CSG Trees)...", highlight_terms.size());
|
|
||||||
if (procevents) QApplication::processEvents();
|
|
||||||
|
|
||||||
highlights_chain = new CSGChain();
|
|
||||||
for (unsigned int i = 0; i < highlight_terms.size(); i++) {
|
|
||||||
highlight_terms[i] = normalizer.normalize(highlight_terms[i]);
|
|
||||||
highlights_chain->import(highlight_terms[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (background_terms.size() > 0)
|
|
||||||
{
|
|
||||||
PRINTB("Compiling background (%d CSG Trees)...", background_terms.size());
|
|
||||||
if (procevents) QApplication::processEvents();
|
|
||||||
|
|
||||||
background_chain = new CSGChain();
|
|
||||||
for (unsigned int i = 0; i < background_terms.size(); i++) {
|
|
||||||
background_terms[i] = normalizer.normalize(background_terms[i]);
|
|
||||||
background_chain->import(background_terms[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->root_chain &&
|
|
||||||
(this->root_chain->objects.size() >
|
|
||||||
Preferences::inst()->getValue("advanced/openCSGLimit").toUInt())) {
|
|
||||||
PRINTB("WARNING: Normalized tree has %d elements!", this->root_chain->objects.size());
|
|
||||||
PRINT("WARNING: OpenCSG rendering has been disabled.");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
PRINTB("Normalized CSG tree has %d elements",
|
|
||||||
(this->root_chain ? this->root_chain->objects.size() : 0));
|
|
||||||
this->opencsgRenderer = new OpenCSGRenderer(this->root_chain,
|
|
||||||
this->highlights_chain,
|
|
||||||
this->background_chain,
|
|
||||||
this->qglview->shaderinfo);
|
|
||||||
}
|
|
||||||
this->thrownTogetherRenderer = new ThrownTogetherRenderer(this->root_chain,
|
|
||||||
this->highlights_chain,
|
|
||||||
this->background_chain);
|
|
||||||
PRINT("CSG generation finished.");
|
|
||||||
int s = t.elapsed() / 1000;
|
|
||||||
PRINTB("Total rendering time: %d hours, %d minutes, %d seconds", (s / (60*60)) % ((s / 60) % 60) % (s % 60));
|
|
||||||
if (procevents) QApplication::processEvents();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (highlight_terms.size() > 0) {
|
||||||
|
PRINTB("Compiling highlights (%d CSG Trees)...", highlight_terms.size());
|
||||||
|
if (procevents) QApplication::processEvents();
|
||||||
|
|
||||||
|
highlights_chain = new CSGChain();
|
||||||
|
for (unsigned int i = 0; i < highlight_terms.size(); i++) {
|
||||||
|
highlight_terms[i] = normalizer.normalize(highlight_terms[i]);
|
||||||
|
highlights_chain->import(highlight_terms[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (background_terms.size() > 0) {
|
||||||
|
PRINTB("Compiling background (%d CSG Trees)...", background_terms.size());
|
||||||
|
if (procevents) QApplication::processEvents();
|
||||||
|
|
||||||
|
background_chain = new CSGChain();
|
||||||
|
for (unsigned int i = 0; i < background_terms.size(); i++) {
|
||||||
|
background_terms[i] = normalizer.normalize(background_terms[i]);
|
||||||
|
background_chain->import(background_terms[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->root_chain &&
|
||||||
|
(this->root_chain->objects.size() >
|
||||||
|
Preferences::inst()->getValue("advanced/openCSGLimit").toUInt())) {
|
||||||
|
PRINTB("WARNING: Normalized tree has %d elements!", this->root_chain->objects.size());
|
||||||
|
PRINT("WARNING: OpenCSG rendering has been disabled.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PRINTB("Normalized CSG tree has %d elements",
|
||||||
|
(this->root_chain ? this->root_chain->objects.size() : 0));
|
||||||
|
this->opencsgRenderer = new OpenCSGRenderer(this->root_chain,
|
||||||
|
this->highlights_chain,
|
||||||
|
this->background_chain,
|
||||||
|
this->qglview->shaderinfo);
|
||||||
|
}
|
||||||
|
this->thrownTogetherRenderer = new ThrownTogetherRenderer(this->root_chain,
|
||||||
|
this->highlights_chain,
|
||||||
|
this->background_chain);
|
||||||
|
PRINT("CSG generation finished.");
|
||||||
|
int s = t.elapsed() / 1000;
|
||||||
|
PRINTB("Total rendering time: %d hours, %d minutes, %d seconds", (s / (60*60)) % ((s / 60) % 60) % (s % 60));
|
||||||
|
if (procevents) QApplication::processEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::actionUpdateCheck()
|
void MainWindow::actionUpdateCheck()
|
||||||
|
@ -1781,6 +1827,7 @@ void MainWindow::actionRenderDone(shared_ptr<const Geometry> root_geom)
|
||||||
this->statusBar()->removeWidget(this->progresswidget);
|
this->statusBar()->removeWidget(this->progresswidget);
|
||||||
delete this->progresswidget;
|
delete this->progresswidget;
|
||||||
this->progresswidget = NULL;
|
this->progresswidget = NULL;
|
||||||
|
this->contentschanged = false;
|
||||||
compileEnded();
|
compileEnded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1887,6 +1934,18 @@ void MainWindow::actionExport(export_type_e, QString, QString)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// editor has changed since last F6
|
||||||
|
if (this->contentschanged) {
|
||||||
|
QMessageBox::StandardButton ret;
|
||||||
|
ret = QMessageBox::warning(this, "Application",
|
||||||
|
"The document has been modified since the last render (F6).\n"
|
||||||
|
"Do you really want to export the previous content?",
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if (ret != QMessageBox::Yes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this->root_geom->getDimension() != 3) {
|
if (this->root_geom->getDimension() != 3) {
|
||||||
PRINT("Current top level object is not a 3D object.");
|
PRINT("Current top level object is not a 3D object.");
|
||||||
clearCurrentOutput();
|
clearCurrentOutput();
|
||||||
|
@ -2265,25 +2324,13 @@ void MainWindow::viewAll()
|
||||||
this->qglview->updateGL();
|
this->qglview->updateGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_editorDock_visibilityChanged(bool visible)
|
void MainWindow::on_editorDock_visibilityChanged(bool)
|
||||||
{
|
{
|
||||||
if (isClosing) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QSettings settings;
|
|
||||||
settings.setValue("view/hideEditor", !visible);
|
|
||||||
viewActionHideEditor->setChecked(!visible);
|
|
||||||
editorTopLevelChanged(editorDock->isFloating());
|
editorTopLevelChanged(editorDock->isFloating());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_consoleDock_visibilityChanged(bool visible)
|
void MainWindow::on_consoleDock_visibilityChanged(bool)
|
||||||
{
|
{
|
||||||
if (isClosing) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QSettings settings;
|
|
||||||
settings.setValue("view/hideConsole", !visible);
|
|
||||||
viewActionHideConsole->setChecked(!visible);
|
|
||||||
consoleTopLevelChanged(consoleDock->isFloating());
|
consoleTopLevelChanged(consoleDock->isFloating());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2309,7 +2356,11 @@ void MainWindow::setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, boo
|
||||||
|
|
||||||
void MainWindow::hideToolbars()
|
void MainWindow::hideToolbars()
|
||||||
{
|
{
|
||||||
if (viewActionHideToolBars->isChecked()) {
|
QSettings settings;
|
||||||
|
bool shouldHide = viewActionHideToolBars->isChecked();
|
||||||
|
settings.setValue("view/hideToolbar", shouldHide);
|
||||||
|
|
||||||
|
if (shouldHide) {
|
||||||
viewerToolBar->hide();
|
viewerToolBar->hide();
|
||||||
editortoolbar->hide();
|
editortoolbar->hide();
|
||||||
} else {
|
} else {
|
||||||
|
@ -2453,7 +2504,6 @@ void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
delete this->tempFile;
|
delete this->tempFile;
|
||||||
this->tempFile = NULL;
|
this->tempFile = NULL;
|
||||||
}
|
}
|
||||||
isClosing = true;
|
|
||||||
event->accept();
|
event->accept();
|
||||||
} else {
|
} else {
|
||||||
event->ignore();
|
event->ignore();
|
||||||
|
@ -2522,3 +2572,8 @@ void MainWindow::openCSGSettingsChanged()
|
||||||
OpenCSG::Goldfeather : OpenCSG::Automatic);
|
OpenCSG::Goldfeather : OpenCSG::Automatic);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::setContentsChanged()
|
||||||
|
{
|
||||||
|
this->contentschanged = true;
|
||||||
|
}
|
||||||
|
|
|
@ -56,13 +56,6 @@
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#include "AppleEvents.h"
|
|
||||||
#ifdef OPENSCAD_DEPLOY
|
|
||||||
#include "SparkleAutoUpdater.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
|
@ -70,6 +63,13 @@
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include "boosty.h"
|
#include "boosty.h"
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include "AppleEvents.h"
|
||||||
|
#ifdef OPENSCAD_DEPLOY
|
||||||
|
#include "SparkleAutoUpdater.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#endif
|
#endif
|
||||||
|
@ -590,9 +590,9 @@ int gui(vector<string> &inputFiles, const fs::path &original_path, int argc, cha
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OPENSCAD_DEPLOY) && defined(Q_OS_MAC)
|
#if defined(OPENSCAD_DEPLOY) && defined(Q_OS_MAC)
|
||||||
AutoUpdater *updater = new SparkleAutoUpdater;
|
// AutoUpdater *updater = new SparkleAutoUpdater;
|
||||||
AutoUpdater::setUpdater(updater);
|
// AutoUpdater::setUpdater(updater);
|
||||||
if (updater->automaticallyChecksForUpdates()) updater->checkForUpdates();
|
// if (updater->automaticallyChecksForUpdates()) updater->checkForUpdates();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0 /*** disabled by clifford wolf: adds rendering artefacts with OpenCSG ***/
|
#if 0 /*** disabled by clifford wolf: adds rendering artefacts with OpenCSG ***/
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "rendersettings.h"
|
#include "rendersettings.h"
|
||||||
#include "colormap.h"
|
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
|
|
||||||
RenderSettings *RenderSettings::inst(bool erase)
|
RenderSettings *RenderSettings::inst(bool erase)
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "linalg.h"
|
#include "linalg.h"
|
||||||
#include "colormap.h"
|
|
||||||
|
|
||||||
class RenderSettings
|
class RenderSettings
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,45 @@
|
||||||
#include "scintillaeditor.h"
|
#include "scintillaeditor.h"
|
||||||
#include <Qsci/qscicommandset.h>
|
#include <Qsci/qscicommandset.h>
|
||||||
#include "Preferences.h"
|
#include "Preferences.h"
|
||||||
|
#include "PlatformUtils.h"
|
||||||
|
|
||||||
|
EditorColorScheme::EditorColorScheme(fs::path path) : path(path)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
boost::property_tree::read_json(boosty::stringy(path).c_str(), pt);
|
||||||
|
_name = QString(pt.get<std::string>("name").c_str());
|
||||||
|
_index = pt.get<int>("index");
|
||||||
|
} catch (const std::exception & e) {
|
||||||
|
PRINTB("Error reading color scheme file '%s': %s", path.c_str() % e.what());
|
||||||
|
_name = "";
|
||||||
|
_index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorColorScheme::~EditorColorScheme()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EditorColorScheme::valid() const
|
||||||
|
{
|
||||||
|
return !_name.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString & EditorColorScheme::name() const
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
int EditorColorScheme::index() const
|
||||||
|
{
|
||||||
|
return _index;
|
||||||
|
}
|
||||||
|
|
||||||
|
const boost::property_tree::ptree & EditorColorScheme::propertyTree() const
|
||||||
|
{
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
ScintillaEditor::ScintillaEditor(QWidget *parent) : EditorInterface(parent)
|
ScintillaEditor::ScintillaEditor(QWidget *parent) : EditorInterface(parent)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +90,6 @@ ScintillaEditor::ScintillaEditor(QWidget *parent) : EditorInterface(parent)
|
||||||
initMargin();
|
initMargin();
|
||||||
qsci->setFolding(QsciScintilla::BoxedTreeFoldStyle, 4);
|
qsci->setFolding(QsciScintilla::BoxedTreeFoldStyle, 4);
|
||||||
qsci->setCaretLineVisible(true);
|
qsci->setCaretLineVisible(true);
|
||||||
this->setHighlightScheme(Preferences::inst()->getValue("editor/syntaxhighlight").toString());
|
|
||||||
|
|
||||||
connect(qsci, SIGNAL(textChanged()), this, SIGNAL(contentsChanged()));
|
connect(qsci, SIGNAL(textChanged()), this, SIGNAL(contentsChanged()));
|
||||||
connect(qsci, SIGNAL(modificationChanged(bool)), this, SIGNAL(modificationChanged(bool)));
|
connect(qsci, SIGNAL(modificationChanged(bool)), this, SIGNAL(modificationChanged(bool)));
|
||||||
|
@ -87,7 +125,6 @@ void ScintillaEditor::highlightError(int error_pos)
|
||||||
int line, index;
|
int line, index;
|
||||||
qsci->lineIndexFromPosition(error_pos, &line, &index);
|
qsci->lineIndexFromPosition(error_pos, &line, &index);
|
||||||
qsci->fillIndicatorRange(line, index, line, index+1, indicatorNumber);
|
qsci->fillIndicatorRange(line, index, line, index+1, indicatorNumber);
|
||||||
qsci->setIndicatorForegroundColor(QColor(255,0,0,100));
|
|
||||||
qsci->markerAdd(line, markerNumber);
|
qsci->markerAdd(line, markerNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,115 +137,155 @@ void ScintillaEditor::unhighlightLastError()
|
||||||
qsci->markerDeleteAll(markerNumber);
|
qsci->markerDeleteAll(markerNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Editor themes
|
QColor ScintillaEditor::readColor(const boost::property_tree::ptree &pt, const std::string name, const QColor defaultColor)
|
||||||
void ScintillaEditor::forLightBackground()
|
|
||||||
{
|
{
|
||||||
lexer->setPaper("#fff");
|
try {
|
||||||
lexer->setColor(QColor("#272822")); // -> Style: Default text
|
const std::string val = pt.get<std::string>(name);
|
||||||
lexer->setColor(QColor("Green"), QsciLexerCPP::Keyword); // -> Style: Keyword
|
return QColor(val.c_str());
|
||||||
lexer->setColor(QColor("Green"), QsciLexerCPP::KeywordSet2); // -> Style: KeywordSet2
|
} catch (std::exception e) {
|
||||||
lexer->setColor(Qt::blue, QsciLexerCPP::CommentDocKeyword); // -> used in comments only like /*! \cube */
|
return defaultColor;
|
||||||
lexer->setColor(QColor("DarkBlue"), QsciLexerCPP::GlobalClass); // -> Style: GlobalClass
|
}
|
||||||
lexer->setColor(Qt::blue, QsciLexerCPP::Operator);
|
|
||||||
lexer->setColor(Qt::darkMagenta, QsciLexerCPP::DoubleQuotedString);
|
|
||||||
lexer->setColor(Qt::darkCyan, QsciLexerCPP::Comment);
|
|
||||||
lexer->setColor(Qt::darkCyan, QsciLexerCPP::CommentLine);
|
|
||||||
lexer->setColor(QColor("DarkRed"), QsciLexerCPP::Number);
|
|
||||||
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
|
|
||||||
qsci->setCaretLineBackgroundColor(QColor("#ffe4e4"));
|
|
||||||
qsci->setMarginsBackgroundColor(QColor("#ccc"));
|
|
||||||
qsci->setMarginsForegroundColor(QColor("#111"));
|
|
||||||
qsci->setMatchedBraceBackgroundColor(QColor("#333"));
|
|
||||||
qsci->setMatchedBraceForegroundColor(QColor("#fff"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::forDarkBackground()
|
int ScintillaEditor::readInt(const boost::property_tree::ptree &pt, const std::string name, const int defaultValue)
|
||||||
{
|
{
|
||||||
lexer->setPaper(QColor("#272822"));
|
try {
|
||||||
lexer->setColor(QColor(Qt::white));
|
const int val = pt.get<int>(name);
|
||||||
lexer->setColor(QColor("#f12971"), QsciLexerCPP::Keyword);
|
return val;
|
||||||
lexer->setColor(QColor("#56dbf0"),QsciLexerCPP::KeywordSet2);
|
} catch (std::exception e) {
|
||||||
lexer->setColor(QColor("#ccdf32"), QsciLexerCPP::CommentDocKeyword);
|
return defaultValue;
|
||||||
lexer->setColor(QColor("#56d8f0"), QsciLexerCPP::GlobalClass);
|
}
|
||||||
lexer->setColor(QColor("#d8d8d8"), QsciLexerCPP::Operator);
|
|
||||||
lexer->setColor(QColor("#e6db74"), QsciLexerCPP::DoubleQuotedString);
|
|
||||||
lexer->setColor(QColor("#e6db74"), QsciLexerCPP::CommentLine);
|
|
||||||
lexer->setColor(QColor("#af7dff"), QsciLexerCPP::Number);
|
|
||||||
qsci->setCaretLineBackgroundColor(QColor(104,225,104, 127));
|
|
||||||
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
|
|
||||||
qsci->setMarginsBackgroundColor(QColor("20,20,20,150"));
|
|
||||||
qsci->setMarginsForegroundColor(QColor("#fff"));
|
|
||||||
qsci->setCaretWidth(2);
|
|
||||||
qsci->setCaretForegroundColor(QColor("#ffff00"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::Monokai()
|
void ScintillaEditor::setColormap(const EditorColorScheme *colorScheme)
|
||||||
{
|
{
|
||||||
lexer->setPaper("#272822");
|
const boost::property_tree::ptree & pt = colorScheme->propertyTree();
|
||||||
lexer->setColor(QColor("#f8f8f2")); // -> Style: Default text
|
|
||||||
lexer->setColor(QColor("#66c3b3"), QsciLexerCPP::Keyword); // -> Style: Keyword
|
|
||||||
lexer->setColor(QColor("#79abff"), QsciLexerCPP::KeywordSet2); // -> Style: KeywordSet2
|
|
||||||
lexer->setColor(QColor("#ccdf32"), QsciLexerCPP::CommentDocKeyword); // -> used in comments only like /*! \cube */
|
|
||||||
lexer->setColor(QColor("#ffffff"), QsciLexerCPP::GlobalClass); // -> Style: GlobalClass
|
|
||||||
lexer->setColor(QColor("#d8d8d8"), QsciLexerCPP::Operator);
|
|
||||||
lexer->setColor(QColor("#e6db74"), QsciLexerCPP::DoubleQuotedString);
|
|
||||||
lexer->setColor(QColor("#75715e"), QsciLexerCPP::CommentLine);
|
|
||||||
lexer->setColor(QColor("#7fb347"), QsciLexerCPP::Number);
|
|
||||||
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
|
|
||||||
qsci->setCaretLineBackgroundColor(QColor("#3e3d32"));
|
|
||||||
qsci->setMarginsBackgroundColor(QColor("#757575"));
|
|
||||||
qsci->setMarginsForegroundColor(QColor("#f8f8f2"));
|
|
||||||
qsci->setCaretWidth(2);
|
|
||||||
qsci->setCaretForegroundColor(QColor("#ffff00"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScintillaEditor::Solarized_light()
|
try {
|
||||||
{
|
const QColor textColor(pt.get<std::string>("text").c_str());
|
||||||
lexer->setPaper("#fdf6e3");
|
const QColor paperColor(pt.get<std::string>("paper").c_str());
|
||||||
lexer->setColor(QColor("#657b83")); // -> Style: Default text
|
|
||||||
lexer->setColor(QColor("#268ad1"), QsciLexerCPP::Keyword); // -> Style: Keyword
|
lexer->setColor(textColor);
|
||||||
lexer->setColor(QColor("#6c71c4"), QsciLexerCPP::KeywordSet2); // -> Style: KeywordSet2
|
lexer->setPaper(paperColor);
|
||||||
lexer->setColor(QColor("#b58900"), QsciLexerCPP::CommentDocKeyword); // -> used in comments only like /*! \cube */
|
|
||||||
lexer->setColor(QColor("#b58800"), QsciLexerCPP::GlobalClass); // -> Style: GlobalClass
|
const boost::property_tree::ptree& colors = pt.get_child("colors");
|
||||||
lexer->setColor(QColor("#859900"), QsciLexerCPP::Operator);
|
lexer->setColor(readColor(colors, "keyword1", textColor), QsciLexerCPP::Keyword);
|
||||||
lexer->setColor(QColor("#2aa198"), QsciLexerCPP::DoubleQuotedString);
|
lexer->setColor(readColor(colors, "keyword2", textColor), QsciLexerCPP::KeywordSet2);
|
||||||
lexer->setColor(QColor("#b58800"), QsciLexerCPP::CommentLine);
|
lexer->setColor(readColor(colors, "keyword3", textColor), QsciLexerCPP::GlobalClass);
|
||||||
lexer->setColor(QColor("#cb4b16"), QsciLexerCPP::Number);
|
lexer->setColor(readColor(colors, "comment", textColor), QsciLexerCPP::CommentDocKeyword);
|
||||||
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
|
lexer->setColor(readColor(colors, "number", textColor), QsciLexerCPP::Number);
|
||||||
qsci->setCaretLineBackgroundColor(QColor("#eeead5"));
|
lexer->setColor(readColor(colors, "string", textColor), QsciLexerCPP::DoubleQuotedString);
|
||||||
qsci->setMarginsBackgroundColor(QColor("#eee8d5"));
|
lexer->setColor(readColor(colors, "operator", textColor), QsciLexerCPP::Operator);
|
||||||
qsci->setMarginsForegroundColor(QColor("#93a1a1"));
|
lexer->setColor(readColor(colors, "commentline", textColor), QsciLexerCPP::CommentLine);
|
||||||
qsci->setMatchedBraceBackgroundColor(QColor("#0000ff"));
|
|
||||||
qsci->setMatchedBraceBackgroundColor(QColor("#333"));
|
const boost::property_tree::ptree& caret = pt.get_child("caret");
|
||||||
qsci->setMatchedBraceForegroundColor(QColor("#fff"));
|
|
||||||
|
qsci->setCaretWidth(readInt(caret, "width", 1));
|
||||||
|
qsci->setCaretForegroundColor(readColor(caret, "foreground", textColor));
|
||||||
|
qsci->setCaretLineBackgroundColor(readColor(caret, "line-background", paperColor));
|
||||||
|
|
||||||
|
qsci->setMarkerBackgroundColor(readColor(colors, "error-marker", QColor(255, 0, 0, 100)), markerNumber);
|
||||||
|
qsci->setMarginsBackgroundColor(readColor(colors, "margin-background", paperColor));
|
||||||
|
qsci->setMarginsForegroundColor(readColor(colors, "margin-foreground", textColor));
|
||||||
|
qsci->setMatchedBraceBackgroundColor(readColor(colors, "matched-brace-background", paperColor));
|
||||||
|
qsci->setMatchedBraceForegroundColor(readColor(colors, "matched-brace-foreground", textColor));
|
||||||
|
qsci->setUnmatchedBraceBackgroundColor(readColor(colors, "unmatched-brace-background", paperColor));
|
||||||
|
qsci->setUnmatchedBraceForegroundColor(readColor(colors, "unmatched-brace-foreground", textColor));
|
||||||
|
qsci->setSelectionForegroundColor(readColor(colors, "selection-foreground", paperColor));
|
||||||
|
qsci->setSelectionBackgroundColor(readColor(colors, "selection-background", textColor));
|
||||||
|
qsci->setFoldMarginColors(readColor(colors, "margin-foreground", textColor),
|
||||||
|
readColor(colors, "margin-background", paperColor));
|
||||||
|
qsci->setEdgeColor(readColor(colors, "edge", textColor));
|
||||||
|
} catch (std::exception e) {
|
||||||
|
noColor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::noColor()
|
void ScintillaEditor::noColor()
|
||||||
{
|
{
|
||||||
lexer->setPaper(Qt::white);
|
lexer->setPaper(Qt::white);
|
||||||
lexer->setColor(Qt::black);
|
lexer->setColor(Qt::black);
|
||||||
qsci->setMarginsBackgroundColor(QColor("#ccc"));
|
qsci->setCaretWidth(2);
|
||||||
qsci->setMarginsForegroundColor(QColor("#111"));
|
qsci->setCaretForegroundColor(Qt::black);
|
||||||
|
qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber);
|
||||||
|
qsci->setCaretLineBackgroundColor(Qt::white);
|
||||||
|
qsci->setMarginsBackgroundColor(Qt::white);
|
||||||
|
qsci->setMarginsForegroundColor(Qt::black);
|
||||||
|
qsci->setSelectionForegroundColor(Qt::white);
|
||||||
|
qsci->setSelectionBackgroundColor(Qt::black);
|
||||||
|
qsci->setMatchedBraceBackgroundColor(Qt::white);
|
||||||
|
qsci->setMatchedBraceForegroundColor(Qt::black);
|
||||||
|
qsci->setUnmatchedBraceBackgroundColor(Qt::white);
|
||||||
|
qsci->setUnmatchedBraceForegroundColor(Qt::black);
|
||||||
|
qsci->setMarginsBackgroundColor(Qt::lightGray);
|
||||||
|
qsci->setMarginsForegroundColor(Qt::black);
|
||||||
|
qsci->setFoldMarginColors(Qt::black, Qt::lightGray);
|
||||||
|
qsci->setEdgeColor(Qt::black);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScintillaEditor::enumerateColorSchemesInPath(ScintillaEditor::colorscheme_set_t &result_set, const fs::path path)
|
||||||
|
{
|
||||||
|
const fs::path color_schemes = path / "color-schemes" / "editor";
|
||||||
|
|
||||||
|
fs::directory_iterator end_iter;
|
||||||
|
|
||||||
|
if (fs::exists(color_schemes) && fs::is_directory(color_schemes)) {
|
||||||
|
for (fs::directory_iterator dir_iter(color_schemes); dir_iter != end_iter; ++dir_iter) {
|
||||||
|
if (!fs::is_regular_file(dir_iter->status())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fs::path path = (*dir_iter).path();
|
||||||
|
if (!(path.extension().string() == ".json")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorColorScheme *colorScheme = new EditorColorScheme(path);
|
||||||
|
if (colorScheme->valid()) {
|
||||||
|
result_set.insert(colorscheme_set_t::value_type(colorScheme->index(), boost::shared_ptr<EditorColorScheme>(colorScheme)));
|
||||||
|
} else {
|
||||||
|
delete colorScheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScintillaEditor::colorscheme_set_t ScintillaEditor::enumerateColorSchemes()
|
||||||
|
{
|
||||||
|
colorscheme_set_t result_set;
|
||||||
|
|
||||||
|
enumerateColorSchemesInPath(result_set, PlatformUtils::resourcesPath());
|
||||||
|
enumerateColorSchemesInPath(result_set, PlatformUtils::userConfigPath());
|
||||||
|
|
||||||
|
return result_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ScintillaEditor::colorSchemes()
|
||||||
|
{
|
||||||
|
const colorscheme_set_t colorscheme_set = enumerateColorSchemes();
|
||||||
|
|
||||||
|
QStringList colorSchemes;
|
||||||
|
for (colorscheme_set_t::const_iterator it = colorscheme_set.begin();it != colorscheme_set.end();it++) {
|
||||||
|
colorSchemes << (*it).second.get()->name();
|
||||||
|
}
|
||||||
|
colorSchemes << "Off";
|
||||||
|
|
||||||
|
return colorSchemes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::setHighlightScheme(const QString &name)
|
void ScintillaEditor::setHighlightScheme(const QString &name)
|
||||||
{
|
{
|
||||||
if(name == "For Light Background") {
|
const colorscheme_set_t colorscheme_set = enumerateColorSchemes();
|
||||||
forLightBackground();
|
|
||||||
}
|
for (colorscheme_set_t::const_iterator it = colorscheme_set.begin();it != colorscheme_set.end();it++) {
|
||||||
else if(name == "For Dark Background") {
|
const EditorColorScheme *colorScheme = (*it).second.get();
|
||||||
forDarkBackground();
|
if (colorScheme->name() == name) {
|
||||||
}
|
setColormap(colorScheme);
|
||||||
else if(name == "Monokai") {
|
return;
|
||||||
Monokai();
|
}
|
||||||
}
|
}
|
||||||
else if(name == "Solarized") {
|
|
||||||
Solarized_light();
|
|
||||||
}
|
|
||||||
else if(name == "Off") {
|
|
||||||
noColor();
|
noColor();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::insert(const QString &text)
|
void ScintillaEditor::insert(const QString &text)
|
||||||
|
@ -307,7 +384,7 @@ void ScintillaEditor::replaceSelectedText(const QString &newText)
|
||||||
if (qsci->selectedText() != newText) qsci->replaceSelectedText(newText);
|
if (qsci->selectedText() != newText) qsci->replaceSelectedText(newText);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScintillaEditor::get_range(int *lineFrom, int *lineTo)
|
void ScintillaEditor::getRange(int *lineFrom, int *lineTo)
|
||||||
{
|
{
|
||||||
int indexFrom, indexTo;
|
int indexFrom, indexTo;
|
||||||
if (qsci->hasSelectedText()) {
|
if (qsci->hasSelectedText()) {
|
||||||
|
@ -324,7 +401,7 @@ void ScintillaEditor::get_range(int *lineFrom, int *lineTo)
|
||||||
void ScintillaEditor::indentSelection()
|
void ScintillaEditor::indentSelection()
|
||||||
{
|
{
|
||||||
int lineFrom, lineTo;
|
int lineFrom, lineTo;
|
||||||
get_range(&lineFrom, &lineTo);
|
getRange(&lineFrom, &lineTo);
|
||||||
for (int line = lineFrom;line <= lineTo;line++) {
|
for (int line = lineFrom;line <= lineTo;line++) {
|
||||||
qsci->indent(line);
|
qsci->indent(line);
|
||||||
}
|
}
|
||||||
|
@ -333,7 +410,7 @@ void ScintillaEditor::indentSelection()
|
||||||
void ScintillaEditor::unindentSelection()
|
void ScintillaEditor::unindentSelection()
|
||||||
{
|
{
|
||||||
int lineFrom, lineTo;
|
int lineFrom, lineTo;
|
||||||
get_range(&lineFrom, &lineTo);
|
getRange(&lineFrom, &lineTo);
|
||||||
for (int line = lineFrom;line <= lineTo;line++) {
|
for (int line = lineFrom;line <= lineTo;line++) {
|
||||||
qsci->unindent(line);
|
qsci->unindent(line);
|
||||||
}
|
}
|
||||||
|
@ -344,7 +421,7 @@ void ScintillaEditor::commentSelection()
|
||||||
bool hasSelection = qsci->hasSelectedText();
|
bool hasSelection = qsci->hasSelectedText();
|
||||||
|
|
||||||
int lineFrom, lineTo;
|
int lineFrom, lineTo;
|
||||||
get_range(&lineFrom, &lineTo);
|
getRange(&lineFrom, &lineTo);
|
||||||
for (int line = lineFrom;line <= lineTo;line++) {
|
for (int line = lineFrom;line <= lineTo;line++) {
|
||||||
qsci->insertAt("//", line, 0);
|
qsci->insertAt("//", line, 0);
|
||||||
}
|
}
|
||||||
|
@ -359,7 +436,7 @@ void ScintillaEditor::uncommentSelection()
|
||||||
bool hasSelection = qsci->hasSelectedText();
|
bool hasSelection = qsci->hasSelectedText();
|
||||||
|
|
||||||
int lineFrom, lineTo;
|
int lineFrom, lineTo;
|
||||||
get_range(&lineFrom, &lineTo);
|
getRange(&lineFrom, &lineTo);
|
||||||
for (int line = lineFrom;line <= lineTo;line++) {
|
for (int line = lineFrom;line <= lineTo;line++) {
|
||||||
QString lineText = qsci->text(line);
|
QString lineText = qsci->text(line);
|
||||||
if (lineText.startsWith("//")) {
|
if (lineText.startsWith("//")) {
|
||||||
|
|
|
@ -1,16 +1,46 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <Qsci/qsciscintilla.h>
|
#include <Qsci/qsciscintilla.h>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
#include "scadlexer.h"
|
#include "scadlexer.h"
|
||||||
|
#include "parsersettings.h"
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <boost/property_tree/ptree.hpp>
|
||||||
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
|
|
||||||
|
class EditorColorScheme
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const fs::path path;
|
||||||
|
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
QString _name;
|
||||||
|
int _index;
|
||||||
|
|
||||||
|
public:
|
||||||
|
EditorColorScheme(const fs::path path);
|
||||||
|
virtual ~EditorColorScheme();
|
||||||
|
|
||||||
|
const QString & name() const;
|
||||||
|
int index() const;
|
||||||
|
bool valid() const;
|
||||||
|
const boost::property_tree::ptree & propertyTree() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
class ScintillaEditor : public EditorInterface
|
class ScintillaEditor : public EditorInterface
|
||||||
{
|
{
|
||||||
Q_OBJECT;
|
Q_OBJECT;
|
||||||
|
|
||||||
|
typedef std::multimap<int, boost::shared_ptr<EditorColorScheme>, std::less<int> > colorscheme_set_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ScintillaEditor(QWidget *parent);
|
ScintillaEditor(QWidget *parent);
|
||||||
virtual ~ScintillaEditor() {}
|
virtual ~ScintillaEditor() {}
|
||||||
|
@ -18,17 +48,19 @@ public:
|
||||||
QString toPlainText();
|
QString toPlainText();
|
||||||
void initMargin();
|
void initMargin();
|
||||||
void initLexer();
|
void initLexer();
|
||||||
void forLightBackground();
|
|
||||||
void forDarkBackground();
|
|
||||||
void Monokai();
|
|
||||||
void Solarized_light();
|
|
||||||
void noColor();
|
void noColor();
|
||||||
QString selectedText();
|
QString selectedText();
|
||||||
bool find(const QString &, bool findNext = false, bool findBackwards = false);
|
bool find(const QString &, bool findNext = false, bool findBackwards = false);
|
||||||
void replaceSelectedText(const QString&);
|
void replaceSelectedText(const QString&);
|
||||||
|
QStringList colorSchemes();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void get_range(int *lineFrom, int *lineTo);
|
void getRange(int *lineFrom, int *lineTo);
|
||||||
|
void setColormap(const EditorColorScheme *colorScheme);
|
||||||
|
int readInt(const boost::property_tree::ptree &pt, const std::string name, const int defaultValue);
|
||||||
|
QColor readColor(const boost::property_tree::ptree &pt, const std::string name, const QColor defaultColor);
|
||||||
|
void enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path path);
|
||||||
|
colorscheme_set_t enumerateColorSchemes();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void zoomIn();
|
void zoomIn();
|
||||||
|
|
|
@ -46,6 +46,20 @@ translate([0,-12,0]) intersection() {
|
||||||
cube(0);
|
cube(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Intersecting something with nothing (issue 996)
|
||||||
|
translate([0,-12,0]) intersection() {
|
||||||
|
cube(4, center=true);
|
||||||
|
linear_extrude();
|
||||||
|
}
|
||||||
|
translate([0,-16,0]) intersection() {
|
||||||
|
cube(4, center=true);
|
||||||
|
render();
|
||||||
|
}
|
||||||
|
translate([0,-20,0]) intersection() {
|
||||||
|
cube(4, center=true);
|
||||||
|
minkowski();
|
||||||
|
}
|
||||||
|
|
||||||
// Intersecting 2D with 3D
|
// Intersecting 2D with 3D
|
||||||
translate([12,-12,0]) intersection() {
|
translate([12,-12,0]) intersection() {
|
||||||
cube([5,5,5], center=true);
|
cube([5,5,5], center=true);
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
//
|
||||||
|
// CSG rendering issue:
|
||||||
|
// This results in a blue sphere rather than a sphere consisting of red/blue half spheres
|
||||||
|
// The reason is likely that OpenCSG doesn't track
|
||||||
|
// which positive object is the source of what depth fragment and thus lets the last rendered object win.
|
||||||
|
//
|
||||||
|
|
||||||
|
color([1,0,0]) translate([0,0,0]) intersection() {
|
||||||
|
sphere(10);
|
||||||
|
translate([0,0,10]) cube([20,20,20],center=true);
|
||||||
|
}
|
||||||
|
|
||||||
|
color([0,0,1]) difference() {
|
||||||
|
sphere(10);
|
||||||
|
translate([0,0,10]) cube([20,20,20],center=true);
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
%square(20);
|
||||||
|
cube(10);
|
|
@ -0,0 +1 @@
|
||||||
|
%sphere(10);
|
|
@ -0,0 +1,10 @@
|
||||||
|
difference() {
|
||||||
|
linear_extrude(height = 2, twist = 0, convexity=2) {
|
||||||
|
polygon(points = [[0, 0],
|
||||||
|
[1, -1],
|
||||||
|
[2, 0.2],
|
||||||
|
[2, -0.2],
|
||||||
|
[1, 1]]);
|
||||||
|
}
|
||||||
|
cube(center=true);
|
||||||
|
}
|
|
@ -1,6 +1,3 @@
|
||||||
union() {
|
|
||||||
cube(5);
|
|
||||||
translate([ 88.7-5, 87-10, -34-1]) cube(5);
|
|
||||||
polyhedron( points = [
|
polyhedron( points = [
|
||||||
[153.898,59.513,-32.4658] ,
|
[153.898,59.513,-32.4658] ,
|
||||||
[163.267,30.683,-34.429] ,
|
[163.267,30.683,-34.429] ,
|
||||||
|
@ -109,86 +106,70 @@ union() {
|
||||||
[8,9,14] ,
|
[8,9,14] ,
|
||||||
[8,19,23] ,
|
[8,19,23] ,
|
||||||
]);
|
]);
|
||||||
translate([0,0,0]) polyhedron( points = [
|
polyhedron( points = [
|
||||||
[153.898,59.513,-32.4658] ,
|
[0,0,0],
|
||||||
[163.267,30.683,-34.429] ,
|
|
||||||
[175.611,59.513,-24.8805] ,
|
|
||||||
[184.981,30.683,-26.8437] ,
|
|
||||||
[166.57,-1.77636e-15,-35.1211] ,
|
|
||||||
[188.284,-1.77636e-15,-27.5359] ,
|
|
||||||
[163.267,-30.683,-34.429] ,
|
|
||||||
[184.981,-30.683,-26.8437] ,
|
|
||||||
[153.898,-59.513,-32.4658] ,
|
|
||||||
[175.611,-59.513,-24.8805] ,
|
|
||||||
[181.898,59.513,-27.7158] ,
|
|
||||||
[191.267,30.683,-29.679] ,
|
|
||||||
[194.57,-1.77636e-15,-30.3711] ,
|
|
||||||
[191.267,-30.683,-29.679] ,
|
|
||||||
[181.898,-59.513,-27.7158] ,
|
|
||||||
[163.961,59.513,-33.9819] ,
|
|
||||||
[173.33,30.683,-35.9451] ,
|
|
||||||
[176.633,-1.77636e-15,-36.6372] ,
|
|
||||||
[173.33,-30.683,-35.9451] ,
|
|
||||||
[163.961,-59.513,-33.9819] ,
|
|
||||||
[148.845,69.513,-31.6884] ,
|
|
||||||
[148.845,-69.513,-31.6884] ,
|
[148.845,-69.513,-31.6884] ,
|
||||||
[148.845,74.513,-31.6884] ,
|
[0,0,0],
|
||||||
[148.845,-74.513,-31.6884] ,
|
[148.845,-74.513,-31.6884] ,
|
||||||
[162.25,59.513,-45.946] ,
|
[0,0,0],
|
||||||
[162.25,-59.513,-45.946] ,
|
[0,0,0],
|
||||||
[147.116,-74.513,-43.7824] ,
|
[147.116,-74.513,-43.7824] ,
|
||||||
[147.116,74.513,-43.7824] ,
|
[0,0,0],
|
||||||
[80.3015,-54.0118,-33.5692] ,
|
[80.3015,-54.0118,-33.5692] ,
|
||||||
[147.116,-69.513,-43.7824] ,
|
[147.116,-69.513,-43.7824] ,
|
||||||
[80.3015,-59.0118,-33.5692] ,
|
[80.3015,-59.0118,-33.5692] ,
|
||||||
[81.2307,-54.0118,-27.0692] ,
|
[81.2307,-54.0118,-27.0692] ,
|
||||||
[81.2307,-59.0118,-27.0692] ,
|
[81.2307,-59.0118,-27.0692] ,
|
||||||
[2.52448,-36,-22.6917] ,
|
[0,0,0],
|
||||||
[80.054,-54.0118,-33.5338] ,
|
[0,0,0],
|
||||||
[80.054,-59.0118,-33.5338] ,
|
[0,0,0],
|
||||||
[2.52448,-41,-22.6917] ,
|
[0,0,0],
|
||||||
[80.9832,-59.0118,-27.0338] ,
|
[0,0,0],
|
||||||
[80.9832,-54.0118,-27.0338] ,
|
[0,0,0],
|
||||||
[2.666,-36,-21.7018] ,
|
[0,0,0],
|
||||||
[2.666,-41,-21.7018] ,
|
[0,0,0],
|
||||||
|
|
||||||
[147.116,69.513,-43.7824] ,
|
[147.116,69.513,-43.7824] ,
|
||||||
[80.3015,59.0998,-33.5692] ,
|
[80.3015,59.0998,-33.5692] ,
|
||||||
[80.3015,64.0998,-33.5692] ,
|
[80.3015,64.0998,-33.5692] ,
|
||||||
[81.2307,59.0998,-27.0692] ,
|
[81.2307,59.0998,-27.0692] ,
|
||||||
[81.2307,64.0998,-27.0692] ,
|
[81.2307,64.0998,-27.0692] ,
|
||||||
[80.054,64.0998,-33.5338] ,
|
[0,0,0],
|
||||||
[80.054,59.0998,-33.5338] ,
|
[0,0,0],
|
||||||
[2.52448,47,-22.6917] ,
|
[0,0,0],
|
||||||
[2.52448,52,-22.6917] ,
|
[0,0,0],
|
||||||
[2.666,47,-21.7018] ,
|
[0,0,0],
|
||||||
[80.9832,59.0998,-27.0338] ,
|
[0,0,0],
|
||||||
[80.9832,64.0998,-27.0338] ,
|
[0,0,0],
|
||||||
[2.666,52,-21.7018] ,
|
[0,0,0],
|
||||||
|
[148.845,69.513,-31.6884] ,
|
||||||
|
[148.845,74.513,-31.6884] ,
|
||||||
|
[147.116,74.513,-43.7824] ,
|
||||||
],
|
],
|
||||||
faces = [
|
faces = [
|
||||||
[26,29,28] ,
|
[6,9,8] ,
|
||||||
[26,28,30] ,
|
[6,8,10] ,
|
||||||
[31,21,23] ,
|
[11,1,3] ,
|
||||||
[32,31,23] ,
|
[12,11,3] ,
|
||||||
[23,26,30] ,
|
[3,6,10] ,
|
||||||
[23,30,32] ,
|
[3,10,12] ,
|
||||||
[28,32,30] ,
|
[8,12,10] ,
|
||||||
[28,29,21] ,
|
[8,9,1] ,
|
||||||
[31,28,21] ,
|
[11,8,1] ,
|
||||||
[28,31,32] ,
|
[8,11,12] ,
|
||||||
[22,20,44] ,
|
[6,3,9] ,
|
||||||
[22,44,45] ,
|
[9,3,1] ,
|
||||||
[20,42,44] ,
|
|
||||||
[45,44,42] ,
|
[35,34,24] ,
|
||||||
[43,45,42] ,
|
[35,24,25] ,
|
||||||
[42,41,27] ,
|
[34,22,24] ,
|
||||||
[43,42,27] ,
|
[25,24,22] ,
|
||||||
[20,41,42] ,
|
[23,25,22] ,
|
||||||
[43,27,22] ,
|
[22,21,36] ,
|
||||||
[45,43,22] ,
|
[23,22,36] ,
|
||||||
[41,22,27] ,
|
[34,21,22] ,
|
||||||
[20,22,41] ,
|
[23,36,25] ,
|
||||||
[26,23,29] ,
|
[25,36,35] ,
|
||||||
[29,23,21] ,
|
[21,35,36] ,
|
||||||
|
[34,35,21] ,
|
||||||
]);
|
]);
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
rotate([0, 45, 0]) cube(50, true);
|
||||||
|
rotate([0, 0, 45]) cube(50, true);
|
|
@ -0,0 +1,8 @@
|
||||||
|
hull() {
|
||||||
|
for (i = [0:1]) {
|
||||||
|
cylinder(h=0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([-5, 0, 0]) cube();
|
||||||
|
translate([5, 0, 0]) cube();
|
|
@ -0,0 +1,10 @@
|
||||||
|
module letter(c) {
|
||||||
|
text(c, size = 50, font = "Liberation Sans", halign = "center", valign = "center");
|
||||||
|
}
|
||||||
|
|
||||||
|
linear_extrude(height = 10) {
|
||||||
|
letter("C", $fn=8);
|
||||||
|
translate([50,0]) letter("C", $fn=16);
|
||||||
|
translate([0,50]) letter("C", $fn=24);
|
||||||
|
translate([50,50]) letter("C", $fn=32);
|
||||||
|
}
|
|
@ -1086,7 +1086,8 @@ list(APPEND CGALPNGTEST_3D_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/inclu
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-pcbvicebar.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-pcbvicebar.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-tardis.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-tardis.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-wing.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/bad-stl-wing.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/rotate_extrude-hole.scad)
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/rotate_extrude-hole.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/experimental/tessellation-text-test.scad)
|
||||||
|
|
||||||
list(APPEND CGALPNGTEST_FILES ${CGALPNGTEST_2D_FILES} ${CGALPNGTEST_3D_FILES})
|
list(APPEND CGALPNGTEST_FILES ${CGALPNGTEST_2D_FILES} ${CGALPNGTEST_3D_FILES})
|
||||||
list(APPEND OPENCSGTEST_FILES ${CGALPNGTEST_FILES})
|
list(APPEND OPENCSGTEST_FILES ${CGALPNGTEST_FILES})
|
||||||
|
@ -1197,6 +1198,7 @@ set_test_config(Heavy cgalpngtest_rotate_extrude-tests
|
||||||
list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue584.scad
|
list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue584.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue591.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue591.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue666.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue666.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue791.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue802.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue802.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue835.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue835.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue899.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue899.scad
|
||||||
|
@ -1204,8 +1206,12 @@ list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue584.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue911.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue911.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue913.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue913.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue936.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue936.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue945.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue964.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue964.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue964b.scad)
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue964b.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue990.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1004.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1005.scad)
|
||||||
list(APPEND EXPORT3D_TEST_FILES ${BUGS_FILES})
|
list(APPEND EXPORT3D_TEST_FILES ${BUGS_FILES})
|
||||||
|
|
||||||
list(APPEND OPENCSGTEST_FILES ${BUGS_FILES})
|
list(APPEND OPENCSGTEST_FILES ${BUGS_FILES})
|
||||||
|
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 10 KiB |
|
@ -60,6 +60,24 @@ group() {
|
||||||
cube(size = [0, 0, 0], center = false);
|
cube(size = [0, 0, 0], center = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
intersection() {
|
||||||
|
cube(size = [4, 4, 4], center = true);
|
||||||
|
linear_extrude(height = 100, center = false, convexity = 1, scale = [1, 1], $fn = 0, $fa = 12, $fs = 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, -16], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
intersection() {
|
||||||
|
cube(size = [4, 4, 4], center = true);
|
||||||
|
render(convexity = 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
multmatrix([[1, 0, 0, 0], [0, 1, 0, -20], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
|
intersection() {
|
||||||
|
cube(size = [4, 4, 4], center = true);
|
||||||
|
minkowski(convexity = 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
multmatrix([[1, 0, 0, 12], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
multmatrix([[1, 0, 0, 12], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
|
||||||
intersection() {
|
intersection() {
|
||||||
cube(size = [5, 5, 5], center = true);
|
cube(size = [5, 5, 5], center = true);
|
||||||
|
|
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
|
@ -9,6 +9,11 @@
|
||||||
# Any generated output is written to the file `basename <argument`-actual.<suffix>
|
# Any generated output is written to the file `basename <argument`-actual.<suffix>
|
||||||
# Any warning or errors are written to stderr.
|
# Any warning or errors are written to stderr.
|
||||||
#
|
#
|
||||||
|
# The test is run with OPENSCAD_FONT_PATH set to the testdata/ttf directory. This
|
||||||
|
# should ensure we fetch the fonts from there even if they are also installed
|
||||||
|
# on the system. (E.g. the C glyph is actually different from Debian/Jessie
|
||||||
|
# installation and what we ship as Liberation-2.00.1).
|
||||||
|
#
|
||||||
# Returns 0 on passed test
|
# Returns 0 on passed test
|
||||||
# 1 on error
|
# 1 on error
|
||||||
# 2 on invalid cmd-line options
|
# 2 on invalid cmd-line options
|
||||||
|
@ -195,8 +200,12 @@ def run_test(testname, cmd, args):
|
||||||
try:
|
try:
|
||||||
cmdline = [cmd] + args + [outputname]
|
cmdline = [cmd] + args + [outputname]
|
||||||
print 'run_test() cmdline:',cmdline
|
print 'run_test() cmdline:',cmdline
|
||||||
|
fontdir = os.path.join(os.path.dirname(cmd), "..", "testdata")
|
||||||
|
fontenv = os.environ.copy()
|
||||||
|
fontenv["OPENSCAD_FONT_PATH"] = fontdir
|
||||||
|
print 'using font directory:', fontdir
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
proc = subprocess.Popen(cmdline, env = fontenv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
comresult = proc.communicate()
|
comresult = proc.communicate()
|
||||||
stdouttext, errtext = comresult[0],comresult[1]
|
stdouttext, errtext = comresult[0],comresult[1]
|
||||||
if errtext != None and len(errtext) > 0:
|
if errtext != None and len(errtext) > 0:
|
||||||
|
@ -206,7 +215,6 @@ def run_test(testname, cmd, args):
|
||||||
outfile.close()
|
outfile.close()
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
print >> sys.stderr, "Error: %s failed with return code %d" % (cmdname, proc.returncode)
|
print >> sys.stderr, "Error: %s failed with return code %d" % (cmdname, proc.returncode)
|
||||||
return None
|
|
||||||
|
|
||||||
return outputname
|
return outputname
|
||||||
except OSError, err:
|
except OSError, err:
|
||||||
|
|
|
@ -638,7 +638,7 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "rm -rf \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\ncp -Rf \"$PROJECT_DIR/../$FULL_PRODUCT_NAME\" \"$PROJECT_DIR/../libraries\" \"$PROJECT_DIR/../examples\" \"$PROJECT_DIR/../fonts\" \"$BUILT_PRODUCTS_DIR\"";
|
shellScript = "rm -rf \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\ncp -Rf \"$PROJECT_DIR/../$FULL_PRODUCT_NAME\" \"$PROJECT_DIR/../libraries\" \"$PROJECT_DIR/../examples\" \"$PROJECT_DIR/../fonts\" \"$PROJECT_DIR/../color-schemes\" \"$BUILT_PRODUCTS_DIR\"";
|
||||||
};
|
};
|
||||||
E0395E7C19AA884F00E43D12 /* ShellScript */ = {
|
E0395E7C19AA884F00E43D12 /* ShellScript */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
@ -651,7 +651,7 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "rm -rf \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\ncp -Rf \"$PROJECT_DIR/../tests/$FULL_PRODUCT_NAME\" \"$PROJECT_DIR/../libraries\" \"$PROJECT_DIR/../examples\" \"$PROJECT_DIR/../fonts\" \"$BUILT_PRODUCTS_DIR\"";
|
shellScript = "rm -rf \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\ncp -Rf \"$PROJECT_DIR/../tests/$FULL_PRODUCT_NAME\" \"$PROJECT_DIR/../libraries\" \"$PROJECT_DIR/../examples\" \"$PROJECT_DIR/../fonts\" \"$PROJECT_DIR/../color-schemes\" \"$BUILT_PRODUCTS_DIR\"";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
|