From b64ef905a05037b6bb8c37faea74dd851b90bcd5 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 01:04:51 -0500 Subject: [PATCH 1/7] Clarified OS X build --- README.md | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 97d6c9e7..c1b91a43 100644 --- a/README.md +++ b/README.md @@ -123,29 +123,41 @@ To pull the MCAD library (http://reprap.org/wiki/MCAD), do the following: ### Building for Mac OS X Prerequisites: -* XCode, including XCode command-line tools (install from XCode Preferences). -Prerequisites that can be installed through MacPorts/homebrew: -* [CMake](http://cmake.org/) -* [automake](http://www.gnu.org/software/automake/) -* [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/) -* [libtool](https://www.gnu.org/software/libtool/) +* XCode, including XCode command-line tools. -Then after you've cloned this git repository, run the script that sets up the -environment variables. +Install Dependencies: - source setenv_mac-qt5.sh +Run the script that sets up the environment variables: + ```source setenv_mac-qt5.sh``` -Then run the script to compile all the prerequisite libraries above: +Then run the script to compile all the dependencies: + ```./scripts/macosx-build-dependencies.sh``` - ./scripts/macosx-build-dependencies.sh -You can also install the prerequisites using -[MacPorts](http://www.macports.org). Unfortunately, -[brew](http://mxcl.github.com/homebrew/) doesn't yet support CGAL and -OpenCSG. +After building dependencies, follow the instructions in the *Compilation* section. + +For the adventurous, it might be possible to build OpenSCAD using _MacPorts_ or _Homebrew_. The main challenge is that both these systems have partially broken libraries, but that tends to change from time to time. + +1. **MacPorts** (assumes [MacPorts](http://macports.org) is already installed) + + NB! MacPorts currently doesn't support Qt5 very well, so using Qt4 + is the only working option at the moment. However, MacPorts' Qt4 + has a broken ```moc``` command, causing OpenSCAD compilation to + break. This may be fixed in MacPorts by the time you read this. + + ```sudo port install opencsg qscintilla boost cgal pkgconfig eigen3 harfbuzz fontconfig``` + +1. **Homebrew** (assumes [Homebrew](http://brew.sh)) is already installed) + + NB! Homebrew's ```qscintilla2``` component doesn't support Qt5, so using Qt4 is currently necessary. + However, Homebrew's Qt4 has a broken ```moc``` command, causing OpenSCAD compilation to + break. This may be fixed in Homebrew by the time you read this. + NB! Homebrew's ```harfbuzz``` package requires X11, so you may have to install an X11 server. + NB! Homebrew doesnt have an OpenCSG package + + ```brew install cgal qscintilla2 eigen harfbuzz``` -After that, follow the Compilation instructions below. ### Building for Linux/BSD @@ -220,9 +232,9 @@ For a 64-bit Windows cross-build, replace 32 with 64 in the above instructions. ### Compilation -First, run 'qmake openscad.pro' from Qt4 to generate a Makefile. On some systems -you need to run 'qmake4', 'qmake-qt4' or something alike to run the qt4 version -of the tool. +First, run 'qmake openscad.pro' from Qt4 to generate a Makefile. + +On some systems, depending on which version(s) of Qt you have installed, you may need to specify which version you want to use, e.g. by running 'qmake4', 'qmake-qt4' or something alike. Then run make. Finally you might run 'make install' as root or simply copy the 'openscad' binary (OpenSCAD.app on Mac OS X) to the bin directory of your choice. From 83e3c5a7e1ea1405382db2bf5ea6f2bd986d9b43 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 01:09:09 -0500 Subject: [PATCH 2/7] Updated prerequisites --- README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c1b91a43..11ec3b3e 100644 --- a/README.md +++ b/README.md @@ -88,24 +88,23 @@ libraries from aptitude. If you're using Mac, or an older Linux/BSD, there are build scripts that download and compile the libraries from source. Follow the instructions for the platform you're compiling on below. -* [Qt4 (4.4 - 5.3)](http://www.qt.nokia.com/) -* [QScintilla2 (2.7)](http://www.riverbankcomputing.co.uk/software/qscintilla/) -* [CGAL (3.6 - 4.4)](http://www.cgal.org/) +* [Qt4 (4.4 - 5.4)](http://www.qt.nokia.com/) +* [QScintilla2 (2.7 - 2.8)](http://www.riverbankcomputing.co.uk/software/qscintilla/) +* [CGAL (3.6 - 4.5)](http://www.cgal.org/) * [GMP (5.x)](http://www.gmplib.org/) * [MPFR (3.x)](http://www.mpfr.org/) -* [cmake (2.8, required by CGAL and the test framework)](http://www.cmake.org/) -* [boost (1.35 - 1.55)](http://www.boost.org/) +* [cmake (2.8 - 3.0, required by CGAL and the test framework)](http://www.cmake.org/) +* [boost (1.35 - 1.57)](http://www.boost.org/) * [OpenCSG (1.3.2 ->)](http://www.opencsg.org/) * [GLEW (1.5.4 ->)](http://glew.sourceforge.net/) * [Eigen (3.x)](http://eigen.tuxfamily.org/) * [glib2 (2.x)](https://developer.gnome.org/glib/) -* [fontconfig (2.10)](http://fontconfig.org/) -* [freetype2 (2.4)](http://freetype.org/) -* [harfbuzz (0.9.19)](http://harfbuzz.org/) -* [GCC C++ Compiler (4.2 ->)](http://gcc.gnu.org/) -* [Bison (2.4)](http://www.gnu.org/software/bison/) -* [Flex (2.5.35)](http://flex.sourceforge.net/) -* [pkg-config (0.26)](http://www.freedesktop.org/wiki/Software/pkg-config/) +* [fontconfig (2.10 -> )](http://fontconfig.org/) +* [freetype2 (2.4 -> )](http://freetype.org/) +* [harfbuzz (0.9.19 -> )](http://harfbuzz.org/) +* [Bison (2.4 -> )](http://www.gnu.org/software/bison/) +* [Flex (2.5.35 -> )](http://flex.sourceforge.net/) +* [pkg-config (0.26 -> )](http://www.freedesktop.org/wiki/Software/pkg-config/) ### Getting the source code From 1a4599f213848d410733794b1f063b4859389ed2 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 02:06:35 -0500 Subject: [PATCH 3/7] #1165 updated expected image --- .../monotonepngtest/issue1165-expected.png | Bin 6903 -> 6903 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression/monotonepngtest/issue1165-expected.png b/tests/regression/monotonepngtest/issue1165-expected.png index b8199f788356cbb43f610db22867c5deffff12e4..481e887368d40a1bfca62d0db29ea88c321eed5f 100644 GIT binary patch literal 6903 zcmeHMYdn-)yT9i)!x*P2#;IfqIff38Ly1Wx5=|;byqQu+!V@u-%uG6euWn!>*B_Pf75zx{jPz4wRx;rZmcueH{HU5Ed=*0n|g-F=-B zNt=Wqh?0x*8V>|PK|~QE_UEwn>T(3pzUi`N)fN`+(~A}R&DswVn2P>p$31yEZAEtV z`?Y$4HJ1cEriWXT>i54nTQj%eHf2Ni4ZLkbw6M!mv8owb|xs8VS(97~Q!rk>eC!|5vx zR?CyAJfukmCOez(kW|^QXCTs%K^&~tr_d3XIO}~N8X;o{s8UHroJ+T|tw2=cL~}sp zLQtbU9(KzHktA3_;~?BiD2cj9T;v9$gkc>jjYIRm5zZ`QJy}TOfH}&4oAY;c{^rjA z`;!%uA30cb#AA4JX8b{Zg`|T$J^uQ#yCIFai92>P=KGFE1zJxdxnZS0`wjOVui81$ zHS@K3YJxr0HPgYaFsv}+A)fAmJ;FaUq?=_PlZxw>=l#6-RCmw~H}~2u`x2zajooR& zPTy#nLpdBfU3h(3Y(fZcOa0D6iTTr63RA|O<@B}#!S&6}#b}+iOY9n4D+_1Ec+=%* z7$Nkfk7#6PVv#!mx*!=^fRejRiBDG)hT@(b4`QI;J&HOPl z{nCQsRUVaqG8UbEa4+pu#;qwyX|!l)=FhH-h&ePmmpzriuG9TKuRPqrV%=xrYa#CE z4aENVA1d}-N%bkgwesPasj<|t0PA)iq;{1_oR5-jv<9PqqDGr!Sl8`HMp-JOL8@XS zha+O=yW`1dn$Id+kUA zrOfmCr(czFJS8TTpV$<^#YdxYYvWuT%*y#sOwSY{gR56e+!mDXE>rPzZDoZLs$0sP zcqtSbk3Y>Wxli35VC(er$;?RG%yT39Guv35NFI%JLYh4^{p6FkblCIuy`_YkQ(+qd z?R%=0!{wBm+4p?CuJ5b7&sRKucI@;*vI){6l_=LQkH0gU3izxSgFx9=sr}V_Z7I!Dcg*dy(@m_!2k2wE~gmoI;c3s)pe&cy#}?v_ zgeP_-vJ)S)C!r+XtnN4O@Lz5jT9{57lJh&&=*ZIRD?e1xTI~5F>{$7j*jx@;*EyIr zh7bM0EN0vBMMG;p31*`tW`d^T$oAnH#ldFnQk62vBzO5W9tUMus;yp5W;B6D?t*P~ z6KL!g$k@%U!!+wEZPYhV`>!5lZM+v2NBoxfR57}B@>H3`z(ul^Y_R@AP9gHNy~Wu{ zzUM2KG7~b-bEax%M*f%&En^)MxlIUd_WRPLXePaVTg*8R@m{}2^8t&Cx%uqs%+$tL z`S0cN>J-VHi?5cLVSSAzR2Ny9#+A^9ctVd-y3pVEU(>dEAv2Pp(tsV<{7jQGSCOL6 zhcp4^DZqRP@ZW{OKp%ACbA#=_qve{R)0(u_OB7mb&*=-$3+dq1XmV?6vF>LLjzC`g zn?H0vG&$}$!f@@XNLIx2qX<`w8Y@s^f?)vRDnrU-F8W}-(M1j#pP987S~XrA2NiKd z>R?p75f52V6z~v45j1SesSO0MZvikq{)*O85SJ5;ILh&%s{kt=8nB(gcQ^ck^;Qt5 z$V9UaVjBukZv|>pu+zrB-jLxc@Qd>{O&NJ)#MxaCta+>}j0n=v1O?^;JGVp# z%N=kt^L_$&A#|nTKAtb`2akCS8cuDq?O7NjjW3Gsv5%MWF$R);L0U(&Hp>m<(pO-hU7TZF9F94HsD$srL)k z*$;`;w0Wwqw;E6Uq6%MAMlTZn9cXJqQ0^Z(o5xYP~zOY0*q>FX}D@pJr)8kbo9ew#as{GJ6(BeSM@u{`@SV>?D(I6NKs19R7wRY;poUt; z0HeP_mHZL!b_V9(LrKHJJDXrmhy@R+NfF|K8Q~DD?t( zb58CJhVZZ!@{qju5^WrM5(*A99d&Ues_!mY?5x{EJW~oAu@aI4dDXap!$O||CFGUJ z9M%#Ic}UCJ00D?1Jsu*pX;1+2w7`iAKdWU4q7;0$PyW*pu)@JD^CitnBgw5WPyYJfrVF-a4}ls8HGsr? zz;H_x&~R);CiTzfKBk=d!8|8eup8>el1-XKSnw7Q^}-w!V=j$AP0j|(I?&&A0RJ2e zco@F}Rxy`CMe^nqVHF9Um2{Igc3A8oELI9Vkyu57>b?GQ&N>+H0OSB}mNFo(2ijdZ zHv!}P3mjBvMt?FNXa$dA7WK_ZuCBml14m#5Hf9^S9Rt_i!Ae_;K!_i64(#W4ZXp(w z2nb3}MwPt21{~F>LpU{o`<^T;hVBqJRfap3Z+8GGUe<9OKnwvy-mDlaqlN&oIqNM3 zq6#4R^v%E$ej03_Q#2$yF1+gn1rc86A>@n3SV456;d)ByPXNdqfL3x`MgS*!K-B)N z55}1?fVV2X2)j76Aqa(UwXq-oNv(*F)UY5xeuH~_u^=gd6|(cQP_7F`7=4j<$|hvv zP}%8tgoe(FZdBKdMc%8@Z<7 zE_oXb*Ob^57RNGp{Q(LRT)3;^mWF`g)sS7!RejhYE&+42b9P|nY=weEYQSt*1?F@Q zD`pEqaBQW38j0kcF=za49_GCPur0Mx6Jy(5VB247QGW+TU(Rc_|Ay>;eTIxqeViKN zPHhg?I$s4 zL&*J>*Pv5oaD#B=;mi73IW26{q#liVhJ$J%drd8o-bM0c5tPk_wAdR3+7gqO&3Iy& zF?2=mMpih+abM&i++eW6%`2v$oVNJ9sysOpMg#T?kRGOfn~UN}VDS7cDNjNOhm0EJ za46i~G>i6;A41Zvo0wYwJT@AO%N`)vaemK4xEJ8N=-a)(ep1XAu@(+Z1NV1{Q&OrZ zl3z6{0CITYnM&SnQ!#RP2Z}!d-vv!~tZOMoMf(^07yi7-N{XmJG!Jff7bYN^48LBHXLR_K`1}Gbavdbmx5a+Apazwp zzep7f0&ZcqmbS1hjVtD^4BHb4%qQt*QrsI z^a)W{3K-^x5M)PWZ(i?p2xnbiT`N;^Ug1b?Ih^W4Dua)Qe3m_&`iQiw>1FePXKt@v zJQ~%tsEXCAkr4%Ijl0*Nvo?QN7U0S@Y!lR0$`I#nuPqoLMHVVX=#{cFOPrK@l$n=8 zd4~r`cv9)UlJse-=JJXf8KFt%({>@Lnp6>cqnG{l*xTeTWoE^sbYm5T;ZXR;tZmX# zp;fapE@WQ#n=d^ygXf7E-cqj(yOS1wSMS!gEwd#J&Dyp!V`Nj`duF{N-O=W~GEuz`^(pJEiz@YBq7=FKd; zHb(~@km{O$lnc=Lc3MY!XXKMDUML80&$DelZxMJ78+UE>tN!9=pewD9LJD3rhKg&@ zzWyPH{!w<=h;srgPe_eO#)lA+w=C4H`m#}W=;QBE@RnSD1P$pX`v|f=K2kZE z;>H`8ZznejJ(-G?z3kI_M;o8vE+w;jUhg9`+}|c`+~3gO1s6r2g6;uzx=aTzeLBF= znzeA)ht?GtQy#||Bla%XHnsPSua^l^4lco_LpUF9T2%UU8q@u%8egX5SVaFGP%T+f z%D#|RwVWu#MbaWqd4Q_eBYnEq?xxUBpv-H&vf?J0Pq9I-Np-K-Sa}MRnPpcSbrpo9 z=XDHem}QL3R#2JLo;(7xScj{mY?eXH5--pJ(T~h_ZldtNun%d(EC(>=&3eN@`PTy^ z#?;t$RL-2tm#ITu=&9fzhY-xBA$tQF5YY{dWJDHvsIHpY3$3vs>%WA!R{ zs~04ORQL5KF?5B)>yLEB8u2$Nfu`uAf|r6sy}MVQHLc2(49&VGbx7#TFxLQdJ5+{c zLXI+JzGr8ZTA0uObwp&x9jVU%er5sPZ~JO6D{1cOk;}9*<($hiyHnj6>p+!jcKQ;H z`Kg@K+e~#VHq(cNbj=eU`ux|Pg2#U6a?{jR`7#VM@@-=^#vW7VR}00CJ*8l3S$h1q znt~Z0yw)gw(@G(HL_9a#$#f_B)>8P={P^}Ot|TGOOzYID+}W8oVOIYAd+iS})tn@5 zu3F}GY?k8P_a8u2mYsAqS6vf}V7_}RVK0yqt8H6}r~4s-rWeE8M}SF6!^jQ9=!| zWwLuSoM!W7;?Jd5TFIZ=M<|(K_g9N>Iin_`{!a1eML z7H}Yr1^bULSvsPOTKnK!*>W3enMeNv D3*!+% literal 6903 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 From ce5a367b8f64d6cd1b5a233796672559d193729e Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 02:13:13 -0500 Subject: [PATCH 4/7] Clean up incoming polygon. Fixes #1165 --- src/GeometryUtils.cc | 45 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/GeometryUtils.cc b/src/GeometryUtils.cc index ba312de3..46f02e79 100644 --- a/src/GeometryUtils.cc +++ b/src/GeometryUtils.cc @@ -25,9 +25,11 @@ static void stdFree(void* userData, void* ptr) { This function should be robust wrt. malformed input. - It will only use existing vertices and is guaranteed use all - existing vertices, i.e. it will maintain connectivity if the input - polygon is part of a polygon mesh. + It will only use existing vertices and is guaranteed to maintain + connectivity if the input polygon is part of a polygon mesh. + + One requirement: The input vertices must be distinct + (i.e. duplicated must resolve to the same index). Returns true on error, false on success. */ @@ -38,12 +40,39 @@ bool GeometryUtils::tessellatePolygonWithHoles(const IndexedPolygons &polygons, // No polygon. FIXME: Will this ever happen or can we assert here? if (polygons.faces.empty()) return false; - if (polygons.faces.size() == 1 && polygons.faces[0].size() == 3) { + // Remove consecutive equal vertices, as well as null ears + std::vector faces = polygons.faces; + BOOST_FOREACH(IndexedFace &face, faces) { + int i=0; + while (i < face.size()) { + if (face[i] == face[(i+1)%face.size()]) { // Two consecutively equal indices + face.erase(face.begin()+i); + } + else if (face[i] == face[(i+2)%face.size()]) { // Null ear + face.erase(face.begin() + (i+1)%face.size()); + } + else { + i++; + } + } + } + // First polygon has < 3 points - no output + if (faces[0].size() < 3) return false; + // Remove collapsed holes + for (int i=1;i allindices; - BOOST_FOREACH(const IndexedFace &face, polygons.faces) { - const Vector3f *verts = &polygons.vertices.front(); + BOOST_FOREACH(const IndexedFace &face, faces) { contour.clear(); BOOST_FOREACH(int idx, face) { const Vector3f &v = verts[idx]; @@ -99,7 +127,7 @@ bool GeometryUtils::tessellatePolygonWithHoles(const IndexedPolygons &polygons, FIXME: This currently only works for polygons without holes. */ - if (polygons.faces.size() == 1) { // Only works for polygons without holes + if (faces.size() == 1) { // Only works for polygons without holes /* Algorithm: @@ -107,7 +135,6 @@ bool GeometryUtils::tessellatePolygonWithHoles(const IndexedPolygons &polygons, B) Locate all unused vertices C) For each unused vertex, create a triangle connecting it to the existing mesh */ - const IndexedFace &face = polygons.faces.front(); int inputSize = allindices.size(); // inputSize is number of points added to libtess2 std::vector vflags(inputSize); // Inits with 0's From dc9769e6adcb4614bc387faf0baffbc8fa0eff64 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 02:14:43 -0500 Subject: [PATCH 5/7] Moved fixed bug to issues --- tests/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 744af9a9..5d9bbbbf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1231,8 +1231,7 @@ list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue13.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1105.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1105b.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1105c.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1105d.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1165.scad) + ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1105d.scad) list(APPEND EXPORT3D_TEST_FILES ${BUGS_FILES}) list(REMOVE_ITEM EXPORT3D_TEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue899.scad From 125fb788e1454f7b1ea0b1b1d5f14a40dca7f62f Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 02:15:01 -0500 Subject: [PATCH 6/7] Moved fixed bug to issues --- testdata/scad/3D/issues/issue1165.scad | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 testdata/scad/3D/issues/issue1165.scad diff --git a/testdata/scad/3D/issues/issue1165.scad b/testdata/scad/3D/issues/issue1165.scad new file mode 100644 index 00000000..9338b16a --- /dev/null +++ b/testdata/scad/3D/issues/issue1165.scad @@ -0,0 +1,5 @@ +translate([0,10,0]) difference() { + cube(10, center=true); + translate([6,5.5,0]) cube(11, center=true); + translate([6,-5.500000000088,0]) cube(11, center=true); +} \ No newline at end of file From eef129324f0640f8cc87e39a8495038e72f0284e Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Jan 2015 09:39:37 -0500 Subject: [PATCH 7/7] Added test result --- .../throwntogethertest/issue1165-expected.png | Bin 0 -> 7697 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/regression/throwntogethertest/issue1165-expected.png diff --git a/tests/regression/throwntogethertest/issue1165-expected.png b/tests/regression/throwntogethertest/issue1165-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c5c6154106b5bcbfddde756f8bbfe38300aed2 GIT binary patch literal 7697 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 literal 0 HcmV?d00001