diff options
25 files changed, 194 insertions, 444 deletions
| diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 97af740..f8a10f0 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -9,11 +9,15 @@ o New import() statement reads the correct file format based on the filename ext  o The color() statement now supports an alpha parameter, e.g. color(c=[1,0,0], alpha=0.4)  o The color() statement now supports specifying colors as strings, e.g. color("Red")  o if() and else() can now take any value type as parameter. false, 0, empty string and empty vector or illegal value type will evaluate as false, everything else as true. +o Strings can now be lexographically compared using the <, <=, >, >= operators +o The version() function will return the OpenSCAD version as a string, e.g. "2011.10"  Bugfixes:  o square() crashed if any of the dimensions were zero  o Flush Caches didn't flush cached USE'd modules  o STL export should be a bit more robust +o Dropping a file into the editor under Windows didn't work (double C:/C:/ problem) +  Deprecations:  o dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. diff --git a/openscad.pro b/openscad.pro index 6e79b29..765ff6b 100644 --- a/openscad.pro +++ b/openscad.pro @@ -139,8 +139,8 @@ HEADERS += src/renderer.h \             src/module.h \             src/node.h \             src/csgnode.h \ -           src/dxflinextrudenode.h \ -           src/dxfrotextrudenode.h \ +           src/linearextrudenode.h \ +           src/rotateextrudenode.h \             src/projectionnode.h \             src/cgaladvnode.h \             src/importnode.h \ @@ -197,8 +197,8 @@ SOURCES += src/openscad.cc \             src/dxftess-glu.cc \             src/dxftess-cgal.cc \             src/dxfdim.cc \ -           src/dxflinextrude.cc \ -           src/dxfrotextrude.cc \ +           src/linearextrude.cc \ +           src/rotateextrude.cc \             src/highlighter.cc \             src/printutils.cc \             src/Preferences.cc \ diff --git a/patches/CGAL-OGL_helper-colors.patch b/patches/CGAL-OGL_helper-colors.patch new file mode 100644 index 0000000..4c2f8c0 --- /dev/null +++ b/patches/CGAL-OGL_helper-colors.patch @@ -0,0 +1,80 @@ +--- OGL_helper.h	2011-09-29 23:02:04.000000000 +0200 ++++ ../src/OGL_helper.h	2011-09-29 23:01:27.000000000 +0200 +@@ -263,7 +263,7 @@ +  enum { SNC_BOUNDARY, SNC_SKELETON }; +  +  class Polyhedron : public OGL_base_object { +- ++ protected: +     std::list<DPoint>    vertices_; +     std::list<DSegment>  edges_; +     std::list<DFacet>    halffacets_; +@@ -356,11 +356,17 @@ +     Bbox_3  bbox() const { return bbox_; } +     Bbox_3& bbox()       { return bbox_; } +  ++    virtual CGAL::Color getVertexColor(Vertex_iterator v) const ++    { ++	CGAL::Color cf(CGAL_NEF3_MARKED_VERTEX_COLOR), ++	  ct(CGAL_NEF3_UNMARKED_VERTEX_COLOR); // more blue-ish ++	CGAL::Color c = v->mark() ? ct : cf; ++	return c; ++    } ++ +     void draw(Vertex_iterator v) const {  +       //      CGAL_NEF_TRACEN("drawing vertex "<<*v); +-      CGAL::Color cf(CGAL_NEF3_MARKED_VERTEX_COLOR),  +-	ct(CGAL_NEF3_UNMARKED_VERTEX_COLOR); // more blue-ish +-      CGAL::Color c = v->mark() ? ct : cf; ++      CGAL::Color c = getVertexColor(v); +       glPointSize(10); +       glColor3ub(c.red(), c.green(), c.blue()); +       glBegin(GL_POINTS); +@@ -372,12 +378,18 @@ +       glEnd(); +     } +  ++    virtual CGAL::Color getEdgeColor(Edge_iterator e) const ++    { ++	CGAL::Color cf(CGAL_NEF3_MARKED_EDGE_COLOR), ++	  ct(CGAL_NEF3_UNMARKED_EDGE_COLOR); // more blue-ish ++	CGAL::Color c = e->mark() ? ct : cf; ++	return c; ++    } ++ +     void draw(Edge_iterator e) const {  +       //      CGAL_NEF_TRACEN("drawing edge "<<*e); +       Double_point p = e->source(), q = e->target(); +-      CGAL::Color cf(CGAL_NEF3_MARKED_EDGE_COLOR),  +-	ct(CGAL_NEF3_UNMARKED_EDGE_COLOR); // more blue-ish +-      CGAL::Color c = e->mark() ? ct : cf; ++      CGAL::Color c = getEdgeColor(e); +       glLineWidth(5); +       glColor3ub(c.red(),c.green(),c.blue()); +       glBegin(GL_LINE_STRIP); +@@ -386,6 +398,14 @@ +       glEnd(); +     } +  ++    virtual CGAL::Color getFacetColor(Halffacet_iterator f) const ++    { ++	CGAL::Color cf(CGAL_NEF3_MARKED_FACET_COLOR), ++	  ct(CGAL_NEF3_UNMARKED_FACET_COLOR); // more blue-ish ++	CGAL::Color c = (f->mark() ? ct : cf); ++	return c; ++    } ++ +     void draw(Halffacet_iterator f) const {  +       //      CGAL_NEF_TRACEN("drawing facet "<<(f->debug(),"")); +       GLUtesselator* tess_ = gluNewTess(); +@@ -403,9 +423,7 @@ + 		      GLU_TESS_WINDING_POSITIVE); +  +       DFacet::Coord_const_iterator cit; +-      CGAL::Color cf(CGAL_NEF3_MARKED_FACET_COLOR), +-	ct(CGAL_NEF3_UNMARKED_FACET_COLOR); // more blue-ish +-      CGAL::Color c = (f->mark() ? ct : cf); ++      CGAL::Color c = getFacetColor(f); +       glColor3ub(c.red(),c.green(),c.blue()); +       gluTessBeginPolygon(tess_,f->normal()); +       //      CGAL_NEF_TRACEN(" "); diff --git a/patches/CGAL-OGL-Tess-Combine-Fix.patch b/patches/CGAL-OGL_helper-tesscombine.patch index 2a4ad1a..792e1da 100644 --- a/patches/CGAL-OGL-Tess-Combine-Fix.patch +++ b/patches/CGAL-OGL_helper-tesscombine.patch @@ -1,12 +1,11 @@ ---- CGAL-3.4/include/CGAL/Nef_3/OGL_helper.h -+++ CGAL-3.4/include/CGAL/Nef_3/OGL_helper.h -@@ -243,6 +243,23 @@ +--- ../../libraries/install/include/CGAL/Nef_3/OGL_helper.h	2010-06-09 21:00:52.000000000 +0200 ++++ OGL_helper.h	2011-09-29 23:09:47.000000000 +0200 +@@ -243,6 +243,22 @@       glVertex3dv(pc);      } -+  inline void CGAL_GLU_TESS_CALLBACK combineCallback(GLdouble coords[3], GLvoid *d[4], GLfloat w[4], GLvoid **dataOut) -+  { -+    static std::list<GLdouble*> pcache; ++  inline void CGAL_GLU_TESS_CALLBACK combineCallback(GLdouble coords[3], GLvoid *[4], GLfloat [4], GLvoid **dataOut) ++  { static std::list<GLdouble*> pcache;  +    if (dataOut) {  +      GLdouble *n = new GLdouble[3];  +      n[0] = coords[0]; @@ -24,7 +23,7 @@    enum { SNC_AXES};    enum { SNC_BOUNDARY, SNC_SKELETON }; -@@ -376,6 +393,8 @@ +@@ -376,6 +392,8 @@         GLUtesselator* tess_ = gluNewTess();         gluTessCallback(tess_, GLenum(GLU_TESS_VERTEX_DATA),   		      (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &vertexCallback); @@ -33,11 +32,3 @@         gluTessCallback(tess_, GLenum(GLU_TESS_BEGIN),   		      (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &beginCallback);         gluTessCallback(tess_, GLenum(GLU_TESS_END), -@@ -410,6 +429,7 @@ -       gluTessEndPolygon(tess_); -       //      CGAL_NEF_TRACEN("End Polygon"); -       gluDeleteTess(tess_); -+      combineCallback(NULL, NULL, NULL, NULL); -     } -  -     void construct_axes() const diff --git a/scripts/macosx-build-dependencies.sh b/scripts/macosx-build-dependencies.sh index 0ed375f..f524d43 100755 --- a/scripts/macosx-build-dependencies.sh +++ b/scripts/macosx-build-dependencies.sh @@ -120,12 +120,13 @@ build_cgal()    echo "Building CGAL" $version "..."    cd $BASEDIR/src    rm -rf CGAL* -  curl -O https://gforge.inria.fr/frs/download.php/28500/CGAL-$version.tar.gz +  curl -O https://gforge.inria.fr/frs/download.php/29125/CGAL-$version.tar.gz +#  curl -O https://gforge.inria.fr/frs/download.php/28500/CGAL-$version.tar.gz  #  curl -O https://gforge.inria.fr/frs/download.php/27641/CGAL-$version.tar.gz    tar xzf CGAL-$version.tar.gz    cd CGAL-$version    # We build a static lib. Not really necessary, but it's well tested. -  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DBUILD_SHARED_LIBS=FALSE -DCMAKE_OSX_DEPLOYMENT_TARGET="10.5" -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" -DBOOST_ROOT=$DEPLOYDIR +  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.dylib -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.dylib -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBUILD_SHARED_LIBS=FALSE -DCMAKE_OSX_DEPLOYMENT_TARGET="10.5" -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" -DBOOST_ROOT=$DEPLOYDIR    make -j4    make install  } @@ -165,6 +166,6 @@ build_gmp 5.0.1  build_mpfr 3.0.1  build_boost 1.47.0  # NB! For CGAL, also update the actual download URL in the function -build_cgal 3.8 +build_cgal 3.9  build_glew 1.6.0  build_opencsg 1.3.0 diff --git a/src/OGL_helper.h b/src/OGL_helper.h index 2764561..40a3e35 100644 --- a/src/OGL_helper.h +++ b/src/OGL_helper.h @@ -11,7 +11,7 @@  // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE  // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  // -// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.7-branch/Nef_3/include/CGAL/Nef_3/OGL_helper.h $ +// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/trunk/Nef_3/include/CGAL/Nef_3/OGL_helper.h $  // $Id: OGL_helper.h 56667 2010-06-09 07:37:13Z sloriot $  //   // @@ -246,19 +246,20 @@ namespace OGL {    inline void CGAL_GLU_TESS_CALLBACK combineCallback(GLdouble coords[3], GLvoid *[4], GLfloat [4], GLvoid **dataOut)    { static std::list<GLdouble*> pcache;      if (dataOut) { -        GLdouble *n = new GLdouble[3]; -        n[0] = coords[0]; -        n[1] = coords[1]; -        n[2] = coords[2]; -        pcache.push_back(n); -        *dataOut = n; +      GLdouble *n = new GLdouble[3]; +      n[0] = coords[0]; +      n[1] = coords[1]; +      n[2] = coords[2]; +      pcache.push_back(n); +      *dataOut = n;      } else { -        for (std::list<GLdouble*>::const_iterator i = pcache.begin(); i != pcache.end(); i++) -            delete[] *i; -        pcache.clear(); +      for (std::list<GLdouble*>::const_iterator i = pcache.begin(); i != pcache.end(); i++) +        delete[] *i; +      pcache.clear();      }    } +   enum { SNC_AXES};   enum { SNC_BOUNDARY, SNC_SKELETON }; diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc index b019ad5..7f62d0a 100644 --- a/src/PolySetCGALEvaluator.cc +++ b/src/PolySetCGALEvaluator.cc @@ -4,8 +4,8 @@  #include "polyset.h"  #include "CGALEvaluator.h"  #include "projectionnode.h" -#include "dxflinextrudenode.h" -#include "dxfrotextrudenode.h" +#include "linearextrudenode.h" +#include "rotateextrudenode.h"  #include "cgaladvnode.h"  #include "rendernode.h"  #include "dxfdata.h" @@ -251,7 +251,7 @@ static void add_slice(PolySet *ps, const DxfData &dxf, DxfData::Path &path, doub  	}  } -PolySet *PolySetCGALEvaluator::evaluatePolySet(const DxfLinearExtrudeNode &node) +PolySet *PolySetCGALEvaluator::evaluatePolySet(const LinearExtrudeNode &node)  {  	DxfData *dxf; @@ -283,7 +283,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const DxfLinearExtrudeNode &node)  	return ps;  } -PolySet *PolySetCGALEvaluator::extrudeDxfData(const DxfLinearExtrudeNode &node, DxfData &dxf) +PolySet *PolySetCGALEvaluator::extrudeDxfData(const LinearExtrudeNode &node, DxfData &dxf)  {  	PolySet *ps = new PolySet();  	ps->convexity = node.convexity; @@ -349,7 +349,7 @@ PolySet *PolySetCGALEvaluator::extrudeDxfData(const DxfLinearExtrudeNode &node,  	return ps;  } -PolySet *PolySetCGALEvaluator::evaluatePolySet(const DxfRotateExtrudeNode &node) +PolySet *PolySetCGALEvaluator::evaluatePolySet(const RotateExtrudeNode &node)  {  	DxfData *dxf; @@ -398,7 +398,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const RenderNode &node)  	return ps;  } -PolySet *PolySetCGALEvaluator::rotateDxfData(const DxfRotateExtrudeNode &node, DxfData &dxf) +PolySet *PolySetCGALEvaluator::rotateDxfData(const RotateExtrudeNode &node, DxfData &dxf)  {  	PolySet *ps = new PolySet();  	ps->convexity = node.convexity; diff --git a/src/PolySetCGALEvaluator.h b/src/PolySetCGALEvaluator.h index 2aa5b13..dddcfc5 100644 --- a/src/PolySetCGALEvaluator.h +++ b/src/PolySetCGALEvaluator.h @@ -13,14 +13,14 @@ public:  	PolySetCGALEvaluator(class CGALEvaluator &cgalevaluator);  	virtual ~PolySetCGALEvaluator() { }  	virtual PolySet *evaluatePolySet(const ProjectionNode &node); -	virtual PolySet *evaluatePolySet(const DxfLinearExtrudeNode &node); -	virtual PolySet *evaluatePolySet(const DxfRotateExtrudeNode &node); +	virtual PolySet *evaluatePolySet(const LinearExtrudeNode &node); +	virtual PolySet *evaluatePolySet(const RotateExtrudeNode &node);  	virtual PolySet *evaluatePolySet(const CgaladvNode &node);  	virtual PolySet *evaluatePolySet(const RenderNode &node);  protected: -	PolySet *extrudeDxfData(const DxfLinearExtrudeNode &node, class DxfData &dxf); -	PolySet *rotateDxfData(const DxfRotateExtrudeNode &node, class DxfData &dxf); +	PolySet *extrudeDxfData(const LinearExtrudeNode &node, class DxfData &dxf); +	PolySet *rotateDxfData(const RotateExtrudeNode &node, class DxfData &dxf);  	CGALEvaluator &cgalevaluator;  }; diff --git a/src/PolySetEvaluator.h b/src/PolySetEvaluator.h index 833b079..8d7d1a8 100644 --- a/src/PolySetEvaluator.h +++ b/src/PolySetEvaluator.h @@ -16,8 +16,8 @@ public:  	virtual shared_ptr<PolySet> getPolySet(const class AbstractNode &, bool cache);  	virtual PolySet *evaluatePolySet(const class ProjectionNode &) { return NULL; } -	virtual PolySet *evaluatePolySet(const class DxfLinearExtrudeNode &) { return NULL; } -	virtual PolySet *evaluatePolySet(const class DxfRotateExtrudeNode &) { return NULL; } +	virtual PolySet *evaluatePolySet(const class LinearExtrudeNode &) { return NULL; } +	virtual PolySet *evaluatePolySet(const class RotateExtrudeNode &) { return NULL; }  	virtual PolySet *evaluatePolySet(const class CgaladvNode &) { return NULL; }  	virtual PolySet *evaluatePolySet(const class RenderNode &) { return NULL; } diff --git a/src/func.cc b/src/func.cc index 52f04dd..b58a1b7 100644 --- a/src/func.cc +++ b/src/func.cc @@ -349,6 +349,14 @@ Value builtin_lookup(const Context *, const std::vector<std::string>&, const std  	return Value(high_v * f + low_v * (1-f));  } +#define QUOTE(x__) # x__ +#define QUOTED(x__) QUOTE(x__) + +Value builtin_version(const Context *, const std::vector<std::string>&, const std::vector<Value> &) +{ +	return Value(std::string(QUOTED(OPENSCAD_VERSION))); +} +  void initialize_builtin_functions()  {  	builtin_functions["abs"] = new BuiltinFunction(&builtin_abs); @@ -373,6 +381,7 @@ void initialize_builtin_functions()  	builtin_functions["ln"] = new BuiltinFunction(&builtin_ln);  	builtin_functions["str"] = new BuiltinFunction(&builtin_str);  	builtin_functions["lookup"] = new BuiltinFunction(&builtin_lookup); +	builtin_functions["version"] = new BuiltinFunction(&builtin_version);  	initialize_builtin_dxf_dim();  } diff --git a/src/dxflinextrude.cc b/src/linearextrude.cc index 8bb246f..4ce87db 100644 --- a/src/dxflinextrude.cc +++ b/src/linearextrude.cc @@ -24,7 +24,7 @@   *   */ -#include "dxflinextrudenode.h" +#include "linearextrudenode.h"  #include "module.h"  #include "context.h" @@ -44,16 +44,16 @@ using namespace boost::assign; // bring 'operator+=()' into scope  #include <QFileInfo> -class DxfLinearExtrudeModule : public AbstractModule +class LinearExtrudeModule : public AbstractModule  {  public: -	DxfLinearExtrudeModule() { } +	LinearExtrudeModule() { }  	virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const;  }; -AbstractNode *DxfLinearExtrudeModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const +AbstractNode *LinearExtrudeModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const  { -	DxfLinearExtrudeNode *node = new DxfLinearExtrudeNode(inst); +	LinearExtrudeNode *node = new LinearExtrudeNode(inst);  	std::vector<std::string> argnames;  	argnames += "file", "layer", "height", "origin", "scale", "center", "twist", "slices"; @@ -120,11 +120,11 @@ AbstractNode *DxfLinearExtrudeModule::evaluate(const Context *ctx, const ModuleI  void register_builtin_dxf_linear_extrude()  { -	builtin_modules["dxf_linear_extrude"] = new DxfLinearExtrudeModule(); -	builtin_modules["linear_extrude"] = new DxfLinearExtrudeModule(); +	builtin_modules["dxf_linear_extrude"] = new LinearExtrudeModule(); +	builtin_modules["linear_extrude"] = new LinearExtrudeModule();  } -PolySet *DxfLinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const +PolySet *LinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const  {  	if (!evaluator) {  		PRINTF("WARNING: No suitable PolySetEvaluator found for %s module!", this->name().c_str()); @@ -140,7 +140,7 @@ PolySet *DxfLinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) con  	return ps;  } -std::string DxfLinearExtrudeNode::toString() const +std::string LinearExtrudeNode::toString() const  {  	std::stringstream stream; diff --git a/src/dxflinextrudenode.h b/src/linearextrudenode.h index 360fd28..503f1bd 100644 --- a/src/dxflinextrudenode.h +++ b/src/linearextrudenode.h @@ -1,13 +1,13 @@ -#ifndef DXFLINEXTRUDENODE_H_ -#define DXFLINEXTRUDENODE_H_ +#ifndef LINEAREXTRUDENODE_H_ +#define LINEAREXTRUDENODE_H_  #include "node.h"  #include "visitor.h" -class DxfLinearExtrudeNode : public AbstractPolyNode +class LinearExtrudeNode : public AbstractPolyNode  {  public: -	DxfLinearExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) { +	LinearExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) {  		convexity = slices = 0;  		fn = fs = fa = height = twist = 0;  		origin_x = origin_y = scale = 0; diff --git a/src/qtcolorbutton/README.txt b/src/qtcolorbutton/README.txt deleted file mode 100644 index 4b55f67..0000000 --- a/src/qtcolorbutton/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -The QtColorButton class is copied from the gradient editor in Qt's shared tool classes: -http://qt.gitorious.org/qt/qt/trees/master/tools/shared/qtgradienteditor diff --git a/src/qtcolorbutton/qtcolorbutton.cpp b/src/qtcolorbutton/qtcolorbutton.cpp deleted file mode 100644 index 21b9848..0000000 --- a/src/qtcolorbutton/qtcolorbutton.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file.  Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file.  Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtcolorbutton.h" -#include <QtGui/QColorDialog> -#include <QtGui/QPainter> -#include <QtCore/QMimeData> -#include <QtGui/QDragEnterEvent> -#include <QtGui/QApplication> - -QT_BEGIN_NAMESPACE - -class QtColorButtonPrivate -{ -    QtColorButton *q_ptr; -    Q_DECLARE_PUBLIC(QtColorButton) -public: -    QColor m_color; -#ifndef QT_NO_DRAGANDDROP -    QColor m_dragColor; -    QPoint m_dragStart; -    bool m_dragging; -#endif -    bool m_backgroundCheckered; - -    void slotEditColor(); -    QColor shownColor() const; -    QPixmap generatePixmap() const; -}; - -void QtColorButtonPrivate::slotEditColor() -{ -    bool ok; -    const QRgb rgba = QColorDialog::getRgba(m_color.rgba(), &ok, q_ptr); -    if (!ok) -        return; -    const QColor c = QColor::fromRgba(rgba); -    if (c == q_ptr->color()) -        return; -    q_ptr->setColor(c); -    emit q_ptr->colorChanged(m_color); -} - -QColor QtColorButtonPrivate::shownColor() const -{ -#ifndef QT_NO_DRAGANDDROP -    if (m_dragging) -        return m_dragColor; -#endif -    return m_color; -} - -QPixmap QtColorButtonPrivate::generatePixmap() const -{ -    QPixmap pix(24, 24); - -    int pixSize = 20; -    QBrush br(shownColor()); - -    QPixmap pm(2 * pixSize, 2 * pixSize); -    QPainter pmp(&pm); -    pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray); -    pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray); -    pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray); -    pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray); -    pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor()); -    br = QBrush(pm); - -    QPainter p(&pix); -    int corr = 1; -    QRect r = pix.rect().adjusted(corr, corr, -corr, -corr); -    p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr); -    p.fillRect(r, br); - -    p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr, -               r.width() / 2, r.height() / 2, -               QColor(shownColor().rgb())); -    p.drawRect(pix.rect().adjusted(0, 0, -1, -1)); - -    return pix; -} - -/////////////// - -QtColorButton::QtColorButton(QWidget *parent) -    : QToolButton(parent) -{ -    d_ptr = new QtColorButtonPrivate; -    d_ptr->q_ptr = this; -    d_ptr->m_dragging = false; -    d_ptr->m_backgroundCheckered = true; - -    setAcceptDrops(true); - -    connect(this, SIGNAL(clicked()), this, SLOT(slotEditColor())); -    setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); -} - -QtColorButton::~QtColorButton() -{ -    delete d_ptr; -} - -void QtColorButton::setColor(const QColor &color) -{ -    if (d_ptr->m_color == color) -        return; -    d_ptr->m_color = color; -    update(); -} - -QColor QtColorButton::color() const -{ -    return d_ptr->m_color; -} - -void QtColorButton::setBackgroundCheckered(bool checkered) -{ -    if (d_ptr->m_backgroundCheckered == checkered) -        return; -    d_ptr->m_backgroundCheckered = checkered; -    update(); -} - -bool QtColorButton::isBackgroundCheckered() const -{ -    return d_ptr->m_backgroundCheckered; -} - -void QtColorButton::paintEvent(QPaintEvent *event) -{ -    QToolButton::paintEvent(event); -    if (!isEnabled()) -        return; - -    const int pixSize = 10; -    QBrush br(d_ptr->shownColor()); -    if (d_ptr->m_backgroundCheckered) { -        QPixmap pm(2 * pixSize, 2 * pixSize); -        QPainter pmp(&pm); -        pmp.fillRect(0, 0, pixSize, pixSize, Qt::white); -        pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white); -        pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black); -        pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black); -        pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, d_ptr->shownColor()); -        br = QBrush(pm); -    } - -    QPainter p(this); -    const int corr = 4; -    QRect r = rect().adjusted(corr, corr, -corr, -corr); -    p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr); -    p.fillRect(r, br); - -    //const int adjX = qRound(r.width() / 4.0); -    //const int adjY = qRound(r.height() / 4.0); -    //p.fillRect(r.adjusted(adjX, adjY, -adjX, -adjY), -    //           QColor(d_ptr->shownColor().rgb())); -    /* -    p.fillRect(r.adjusted(0, r.height() * 3 / 4, 0, 0), -               QColor(d_ptr->shownColor().rgb())); -    p.fillRect(r.adjusted(0, 0, 0, -r.height() * 3 / 4), -               QColor(d_ptr->shownColor().rgb())); -               */ -    /* -    const QColor frameColor0(0, 0, 0, qRound(0.2 * (0xFF - d_ptr->shownColor().alpha()))); -    p.setPen(frameColor0); -    p.drawRect(r.adjusted(adjX, adjY, -adjX - 1, -adjY - 1)); -    */ - -    const QColor frameColor1(0, 0, 0, 26); -    p.setPen(frameColor1); -    p.drawRect(r.adjusted(1, 1, -2, -2)); -    const QColor frameColor2(0, 0, 0, 51); -    p.setPen(frameColor2); -    p.drawRect(r.adjusted(0, 0, -1, -1)); -} - -void QtColorButton::mousePressEvent(QMouseEvent *event) -{ -#ifndef QT_NO_DRAGANDDROP -    if (event->button() == Qt::LeftButton) -        d_ptr->m_dragStart = event->pos(); -#endif -    QToolButton::mousePressEvent(event); -} - -void QtColorButton::mouseMoveEvent(QMouseEvent *event) -{ -#ifndef QT_NO_DRAGANDDROP -    if (event->buttons() & Qt::LeftButton && -            (d_ptr->m_dragStart - event->pos()).manhattanLength() > QApplication::startDragDistance()) { -        QMimeData *mime = new QMimeData; -        mime->setColorData(color()); -        QDrag *drg = new QDrag(this); -        drg->setMimeData(mime); -        drg->setPixmap(d_ptr->generatePixmap()); -        setDown(false); -        event->accept(); -        drg->start(); -        return; -    } -#endif -    QToolButton::mouseMoveEvent(event); -} - -#ifndef QT_NO_DRAGANDDROP -void QtColorButton::dragEnterEvent(QDragEnterEvent *event) -{ -    const QMimeData *mime = event->mimeData(); -    if (!mime->hasColor()) -        return; - -    event->accept(); -    d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData()); -    d_ptr->m_dragging = true; -    update(); -} - -void QtColorButton::dragLeaveEvent(QDragLeaveEvent *event) -{ -    event->accept(); -    d_ptr->m_dragging = false; -    update(); -} - -void QtColorButton::dropEvent(QDropEvent *event) -{ -    event->accept(); -    d_ptr->m_dragging = false; -    if (d_ptr->m_dragColor == color()) -        return; -    setColor(d_ptr->m_dragColor); -    emit colorChanged(color()); -} -#endif - -QT_END_NAMESPACE - -#include "moc_qtcolorbutton.cpp" diff --git a/src/qtcolorbutton/qtcolorbutton.h b/src/qtcolorbutton/qtcolorbutton.h deleted file mode 100644 index 26bdde0..0000000 --- a/src/qtcolorbutton/qtcolorbutton.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file.  Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file.  Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTCOLORBUTTON_H -#define QTCOLORBUTTON_H - -#include <QtGui/QToolButton> - -QT_BEGIN_NAMESPACE - -class QtColorButton : public QToolButton -{ -    Q_OBJECT -    Q_PROPERTY(bool backgroundCheckered READ isBackgroundCheckered WRITE setBackgroundCheckered) -public: -    QtColorButton(QWidget *parent = 0); -    ~QtColorButton(); - -    bool isBackgroundCheckered() const; -    void setBackgroundCheckered(bool checkered); - -    QColor color() const; - -public slots: - -    void setColor(const QColor &color); - -signals: -    void colorChanged(const QColor &color); -protected: -    void paintEvent(QPaintEvent *event); -    void mousePressEvent(QMouseEvent *event); -    void mouseMoveEvent(QMouseEvent *event); -#ifndef QT_NO_DRAGANDDROP -    void dragEnterEvent(QDragEnterEvent *event); -    void dragLeaveEvent(QDragLeaveEvent *event); -    void dropEvent(QDropEvent *event); -#endif -private: -    class QtColorButtonPrivate *d_ptr; -    Q_DECLARE_PRIVATE(QtColorButton) -    Q_DISABLE_COPY(QtColorButton) -    Q_PRIVATE_SLOT(d_func(), void slotEditColor()) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/qtcolorbutton/qtcolorbutton.pri b/src/qtcolorbutton/qtcolorbutton.pri deleted file mode 100644 index 0e41068..0000000 --- a/src/qtcolorbutton/qtcolorbutton.pri +++ /dev/null @@ -1,4 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD -SOURCES +=   $$PWD/qtcolorbutton.cpp -HEADERS +=   $$PWD/qtcolorbutton.h diff --git a/src/dxfrotextrude.cc b/src/rotateextrude.cc index 646b643..3a6eb55 100644 --- a/src/dxfrotextrude.cc +++ b/src/rotateextrude.cc @@ -24,7 +24,7 @@   *   */ -#include "dxfrotextrudenode.h" +#include "rotateextrudenode.h"  #include "module.h"  #include "context.h"  #include "printutils.h" @@ -42,16 +42,16 @@ using namespace boost::assign; // bring 'operator+=()' into scope  #include <QFileInfo> -class DxfRotateExtrudeModule : public AbstractModule +class RotateExtrudeModule : public AbstractModule  {  public: -	DxfRotateExtrudeModule() { } +	RotateExtrudeModule() { }  	virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const;  }; -AbstractNode *DxfRotateExtrudeModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const +AbstractNode *RotateExtrudeModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const  { -	DxfRotateExtrudeNode *node = new DxfRotateExtrudeNode(inst); +	RotateExtrudeNode *node = new RotateExtrudeNode(inst);  	std::vector<std::string> argnames;  	argnames += "file", "layer", "origin", "scale"; @@ -96,11 +96,11 @@ AbstractNode *DxfRotateExtrudeModule::evaluate(const Context *ctx, const ModuleI  void register_builtin_dxf_rotate_extrude()  { -	builtin_modules["dxf_rotate_extrude"] = new DxfRotateExtrudeModule(); -	builtin_modules["rotate_extrude"] = new DxfRotateExtrudeModule(); +	builtin_modules["dxf_rotate_extrude"] = new RotateExtrudeModule(); +	builtin_modules["rotate_extrude"] = new RotateExtrudeModule();  } -PolySet *DxfRotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const +PolySet *RotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const  {  	if (!evaluator) {  		PRINTF("WARNING: No suitable PolySetEvaluator found for %s module!", this->name().c_str()); @@ -116,7 +116,7 @@ PolySet *DxfRotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) con  	return ps;  } -std::string DxfRotateExtrudeNode::toString() const +std::string RotateExtrudeNode::toString() const  {  	std::stringstream stream; diff --git a/src/dxfrotextrudenode.h b/src/rotateextrudenode.h index e0ade82..613d44b 100644 --- a/src/dxfrotextrudenode.h +++ b/src/rotateextrudenode.h @@ -1,13 +1,13 @@ -#ifndef DXFROTEXTRUDENODE_H_ -#define DXFROTEXTRUDENODE_H_ +#ifndef ROTATEEXTRUDENODE_H_ +#define ROTATEEXTRUDENODE_H_  #include "node.h"  #include "visitor.h" -class DxfRotateExtrudeNode : public AbstractPolyNode +class RotateExtrudeNode : public AbstractPolyNode  {  public: -	DxfRotateExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) { +	RotateExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) {  		convexity = 0;  		fn = fs = fa = 0;  		origin_x = origin_y = scale = 0; diff --git a/src/value.cc b/src/value.cc index 53fd6dc..685bf81 100644 --- a/src/value.cc +++ b/src/value.cc @@ -193,6 +193,9 @@ Value Value::operator < (const Value &v) const  	if (this->type == NUMBER && v.type == NUMBER) {  		return Value(this->num < v.num);  	} +	else if (this->type == STRING && v.type == STRING) { +		return Value(this->text < v.text); +	}  	return Value();  } @@ -201,6 +204,9 @@ Value Value::operator <= (const Value &v) const  	if (this->type == NUMBER && v.type == NUMBER) {  		return Value(this->num <= v.num);  	} +	else if (this->type == STRING && v.type == STRING) { +		return Value(this->text <= v.text); +	}  	return Value();  } @@ -240,6 +246,9 @@ Value Value::operator >= (const Value &v) const  	if (this->type == NUMBER && v.type == NUMBER) {  		return Value(this->num >= v.num);  	} +	else if (this->type == STRING && v.type == STRING) { +		return Value(this->text >= v.text); +	}  	return Value();  } @@ -248,6 +257,9 @@ Value Value::operator > (const Value &v) const  	if (this->type == NUMBER && v.type == NUMBER) {  		return Value(this->num > v.num);  	} +	else if (this->type == STRING && v.type == STRING) { +		return Value(this->text > v.text); +	}  	return Value();  } diff --git a/src/visitor.h b/src/visitor.h index f4846b8..fe350f8 100644 --- a/src/visitor.h +++ b/src/visitor.h @@ -22,10 +22,10 @@ public:    virtual Response visit(class State &state, const class CsgNode &node) {  		return visit(state, (const class AbstractNode &)node);  	} -  virtual Response visit(class State &state, const class DxfLinearExtrudeNode &node) { +  virtual Response visit(class State &state, const class LinearExtrudeNode &node) {  		return visit(state, (const class AbstractPolyNode &)node);  	} -  virtual Response visit(class State &state, const class DxfRotateExtrudeNode &node) { +  virtual Response visit(class State &state, const class RotateExtrudeNode &node) {  		return visit(state, (const class AbstractPolyNode &)node);  	}    virtual Response visit(class State &state, const class ImportNode &node) { diff --git a/testdata/scad/features/polyhedron-tests.scad b/testdata/scad/features/polyhedron-tests.scad new file mode 100644 index 0000000..690d962 --- /dev/null +++ b/testdata/scad/features/polyhedron-tests.scad @@ -0,0 +1,20 @@ +module polyhedrons() { + polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], +            triangles = [[0,4,2],[0,2,5],[0,3,4],[0,5,3],[1,2,4],[1,5,2],[1,4,3], [1,3,5]]); + + // One face flipped + translate([2,0,0]) +  polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], +            triangles = [[0,4,2],[0,2,5],[0,3,4],[0,5,3],[1,2,4],[1,5,2],[1,3,4], [1,3,5]]); + + // All faces flipped + translate([4,0,0]) +  polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], +            triangles = [[0,2,4],[0,5,2],[0,4,3],[0,3,5],[1,4,2],[1,2,5],[1,3,4], [1,5,3]]); +} + +polyhedrons(); +translate([0,2,0]) difference() { +  polyhedrons(); +  translate([2,0,2]) cube([8,3,3], center=true); +} diff --git a/testdata/scad/minimal/allfunctions.scad b/testdata/scad/minimal/allfunctions.scad index e58bd07..c33b43c 100644 --- a/testdata/scad/minimal/allfunctions.scad +++ b/testdata/scad/minimal/allfunctions.scad @@ -22,3 +22,4 @@ a = str();  a = lookup();  a = dxf_dim();  a = dxf_cross(); +a = version(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index feff2c2..9e6ae0a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -120,8 +120,8 @@ set(COMMON_SOURCES    ../src/dxfdata.cc     ../src/dxftess.cc     ../src/dxfdim.cc  -  ../src/dxflinextrude.cc  -  ../src/dxfrotextrude.cc  +  ../src/linearextrude.cc  +  ../src/rotateextrude.cc     ../src/printutils.cc     ../src/progress.cc     ../src/nodedumper.cc  @@ -261,6 +261,7 @@ LIST(APPEND CGALPNGTEST_FILES              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/cube-tests.scad              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/sphere-tests.scad              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/cylinder-tests.scad +            ${CMAKE_SOURCE_DIR}/../testdata/scad/features/polyhedron-tests.scad              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/union-tests.scad              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/difference-tests.scad              ${CMAKE_SOURCE_DIR}/../testdata/scad/features/intersection-tests.scad diff --git a/tests/regression/cgalpngtest/polyhedron-tests-expected.png b/tests/regression/cgalpngtest/polyhedron-tests-expected.pngBinary files differ new file mode 100644 index 0000000..c80990f --- /dev/null +++ b/tests/regression/cgalpngtest/polyhedron-tests-expected.png diff --git a/tests/regression/opencsgtest/polyhedron-tests-expected.png b/tests/regression/opencsgtest/polyhedron-tests-expected.pngBinary files differ new file mode 100644 index 0000000..0740f1a --- /dev/null +++ b/tests/regression/opencsgtest/polyhedron-tests-expected.png | 
