From 805f32e4e435a6f11578b26a072175da04c7e5f9 Mon Sep 17 00:00:00 2001 From: Michael Hoffer Date: Sun, 25 Jun 2017 11:36:44 +0200 Subject: [PATCH] version 0.4.0: includes new optimize methods that perform optimization at specified size (results in more reliable optimization) --- build.gradle | 8 +- gradle/project-info.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54706 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 6 +- gradlew.bat | 168 +++++++++--------- .../eu/mihosoft/jcsg/ext/mesh/MeshTools.java | 114 +++++++++++- 7 files changed, 200 insertions(+), 102 deletions(-) mode change 100644 => 100755 gradlew diff --git a/build.gradle b/build.gradle index 0de77cc..5056e87 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ tasks.withType(Javadoc) { } task wrapper(type: Wrapper, description: 'Creates and deploys the Gradle wrapper to the current directory.') { - gradleVersion = '3.3' + gradleVersion = '4.0' } repositories { @@ -37,7 +37,7 @@ dependencies { compile group: 'eu.mihosoft.ugshell.ugdist', name: 'ugshell-dist', version: '2016.1.5' // jcsg library - compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.2' - compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.2', classifier: 'sources' - compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.2', classifier: 'javadoc' + compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.5' + compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.5', classifier: 'sources' + compile group: 'eu.mihosoft.vrl.jcsg', name: 'jcsg', version: '0.5.5', classifier: 'javadoc' } diff --git a/gradle/project-info.gradle b/gradle/project-info.gradle index 4de91ae..f9fb5d4 100644 --- a/gradle/project-info.gradle +++ b/gradle/project-info.gradle @@ -3,7 +3,7 @@ // ----------------------------------------------------------------------------- ext.publishing.artifactId = project.name.toLowerCase() ext.publishing.groupId = 'eu.mihosoft.jcsg.ext.mesh' -ext.publishing.versionId = '0.4-SNAPSHOT' +ext.publishing.versionId = '0.4.0' ext.publishing.developerName = 'Michael Hoffer' ext.publishing.developerAlias = 'miho' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c5dc98a0fba20f53ac5e0056b7b2070ac3f1f567..5f48520b4e62ac7bff040f2afa9b94130b14dd8c 100644 GIT binary patch delta 19257 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 z zy_vbb-*0}uJLmqtbIy0p`JTV~o$w}nIByFWz!sF6Qz3&K*cmoSgLfH5K<9=LXLMWP z`(oCOq%B1yO`a>{jP)`Y3^%GdH+>{z0k8<9(-*s48dFkfbUPhK%rlw3) zW?5ZG!j{?!KFhmiRkN9=*VX9$y}BHiZzZ;2O_tj}jMepM)CwcJg5#V`ST1k#<66Q$ zt@Nu-JKg0#sg+|E=xvSIG3ujDnVk`qYt0YsR`S!f6JE7%VX(b!CEo5n_A7KieA>e_@XH(c><*lV1`m4|1*u z-f%0+6aU)jUbOe*{iJs>d>@lnrXOrt6|3PGY%uA~o4d<(e#|TPxNSuT#|x%<$Cz)H zmRy^x$@0tQXV%_1{k6 zzBXCqyRNY_tSpk2_@3m@;sfFyOT8X6zU1N_iQGy%F!KE3{S;`1N@8X8s(T-U3#Qe|D0FJX26>;^4;l;oU~X59WdY*bZ?% z&wd}RV(1vZDL+~6O2p|%`QQ*0FG{n{Q@u3R>P>-R*&{(`c}!vIBQk{_nH(zEkUA(> zIib+D`irSq_kXRUiFOU1z4@bz9)spPR|0Hqn)XTgny0;#+8w++A(7&k=zKPhr`fCs zx3R3uKZ7$|l!PI3J)DN@@d%d1vwd7Ycg+hQx~HP;@YRHU>}3^fU_V^^2;X-dC?w%; z=R^qb_?FA%V^4rw=QeAhZx7g6XKT=DiNGr?vT{#zKT+YA5(u0Q;D0HS8X`_I0&dq? zinEM>$+~45MH??sf!zcxPyvaO1D`_={!w4v< zR|f)~0!FKNKqXP7&94rIOny`2SzR&|vE~o~7EKw9U!LETy zBD+El(!p{qO_1JzG57x*yl@0AFsP!GA`+|-MAHp|t!N?_1|Dl0$bdRBVZfOYKu+GM zq+fJ&fCsKF@l-()ZLk#u!!rhu%2EX*Ex2_DU~nP6_&YsR;>&n}pDwHmlbj&>@Fy-x zK_INzoHjGomBk47#0~=7X3X@2g9-vDHwc`)X9;54FiVJ!ED*$=0A%ceKrNu%ZblP{ z9nn{M?+oWGR~Xdh1Yj#0R0eAU2cbUZ(DXJcY1e*~Mn0@OElIpJnQ3!wCNX{)~bq1UsEObi3w-R7U&D2nx`UB;IrM*z=*Ghg8h^og~d=!V_DJ7H_4)P z3>Qo;ZgA$_QXy71O2T_VaD-{cjQ0|2N5dpaI1PUw-H3Yt`xR)s%RMOj1 zDBYuD0cM~td@6~Oiqc}s<^gsG=8CHO72!Eh?NS(+Oaf!oGZ1VHly9j6U3|zOERzXf znG6*Cn-Cj_2x|=jQ0*K9+D&tG?%X||0mbLR?IY1@lx&ovQHv%`6ba%*$xJ;zo=1V< zoph|B9Rez;BM;K_fl{XqM)PQ=k_-z_+L?9}jCL2&0xm)t9sJvljdI(M?9a)B{%eG@ z0I`RXZvajq9SrjEuD>2ybEpQ=OhpldYMAn)H9H!{ssi+<9ih$R_keDMgD563$m@a;}2+SR~3I52Qb&lPwSn M#1FQCSuc9`KW@qHPyhe` delta 18895 zcmY(pQ

)(=}SQZQHhO+qTVqs;awe+qT(dcGsi9)Aw&& z2@%-8c8u~r`^fmOZA8$6hW-~NQqv#(=c16Of<*Wy*mUJ8!x;hy2njCn8jBx*Yl;0s zKznZO{E^sUPlLNAQHY$fB>_V!UcRhwSU5bZt={CUg-u`9@FH6Cw@I^%2@x8MHFt`t z>^f4~ZioTX#0+)?nOBGtIIG^k4Q$&5Jm-XyuvfSK>Mixv0_#`I^{)5!^Xt~)_Sf@> zATU>i;i(s1F@hfo<^ogoZX^$2&r4w-DuztP=Dt&>YbFMB@q^s`E&+$3V%MBq3&&zz zSz|mR#y~2&guyz^cBC@~U&as84nMU%&jAl#z3uWQsY{2qdjp!#9UmBnr)I|n&L>%65_C_7v5cPyUXFRu^%YZ7Ulgr)Muk$8L$ndtoeQ1m)g*O$D4db_-jf;FT z=Ig*;w_&vAf}@g0T30z|3x?_rtc-M0;~k^w1bS*%kLR9-*R0RW#SkZj36pLe=(Sa; zR9|ZK`_8VAhxRjp{aosBnpStJ>2Td7CBx6DIbawTMgST~P0p)J*Z_UFTuPTzM!0)=-d4l3sL7xOSw7 zxW%Hi#kS-QvX$l+3F&%D>hy|0yf=(Wtz$cSEzS^O_@&;h`;Sck{-ia16KxHrSX?Ye z(xstp!qA$FHiAR6Pm>xBw}O8*c|vn9g{4$7weM7OP>AAZ_^gV9X+bQYN=00O1uy-Q z8$0RGAoRL3n&H|UwuX)FqE1$__ekZqC2k8GUPNbkRm^7Z@@+(K;d$;(c*vz% zk>d{TOG%*SEj^0$3N<6vOA8OyFg$4Ot~=&lhIz%@n_gi=1JQpe8W@Vs_0_naM=LPsj*)BY& zV1Fz;8gu?GCB%=2TxhqHf-Pg8R5|qVOuu6a;iO~pp-!7s;C=Y6T0U}Cp9PDZU?Z23 zkXE=4JV#rvk>1~JHM=E&hC5Lqx)49Y&#M+FhS0Fyv@UIM#qmK^8h(udpCNa{ZOj}p-s;A)moohMQ|y(Nm4(ZoZyXCUV|U9ral zEf&k54!oCd6)|(7y{3)s)7D@vb1+A*WE`LpzC7gj$HTX_dW(bRn1S z*P_+UI2RQONk^kNM~upzMOC-rMT)d;zvqLi8(J*^<5wcIcK%au1=W5i9s+oH12@H_ z)g5|2U2N(J{?Jq&>C}{#O+z&2M>2)gO&SFl-jBRiJBY$qn-MYn(TC%CQ=8uDP;7>u za^8X`9lwS0WKFVG-G1p?NBa3&K*-MN8PdvEP)z`*Vu%~TX(JW^Plyv?4>~6;9w%q8 zw15yAkdKR8lT?VcoI7kuCC*t7gK`2gs45#ajb}qr|Lb7F-b$~9b9T1W)vDm0BdSrf zb8<-amZHO9uPo#Dws>iVuY-vZbQdfAX1Bdsf!lV&73s4W1F?&ANQ3_kV%TO~j5Wz} z{Mifb@Pc;F(-A$MZhuUAe)re97h9?nd4?AqAXSb$Qz|&<`8!@_t8Ypz2vojlv+bw; z_2zdY3v<)jqr;mTL&nN{YwEeEtr1>#q(2BZ{}3oEo0M98QSrCHa(lbnaaUHo z%uL(J$2Tlt1i?|Aq@5}&4G9Iy?pIt!y0v=kvKDO|%)2zG_^(p!)Ko3xNby>wg5k48 zfOey%b~dM0ZmSbq>y7pY4)+HH=?lHYY|#?R@X0Niz##PpF8D|2<$Dj;&v&W_tSM;t zL@{TXhe9Hc-KLfCqaOjD*jxC0W`E)_N7Hbw<_1(}PMW0!xpU$n$2)gzei4Ybz2U_q za=u&N-}Bju>O7!~mc8jm0#K%*8_I%u0Hm>&FTRgti_z$l&NewVv+t-cB7e3)zF%jp zl|RF85UhHB241ches02yB<{WjBQ+wAHr($_Oz2Bvk-UXJ_-MmGN^wv?;lxe z#FK>pf%*qM`&9KN%0P;MTskDiKoSFNVNkUiH;D&`4z=a{AU;iT<^6yN$GjlRP-M!k zV%t5hxSzLNEiC|FZ%?2?*s=Cx@r}Dgmd5mfnH)>?@x2xx%#omcn-P>&&mU}(u zm!~aI&D%RVG!Vz?STO3aUahoYsui+}cRCTApu3Og*KWV=4F3GUlG@tf)6MIz+d%ON zoqJbdr(`k=fx~?j`Q-oZ?NYLG?UPe58O*dir zFM!a|xYt4(7_DqxW>KFsted*SON0&`JQlLaE-Gm`exsGKWlAcYSK~?*E?g5YmY*-N z<)^1u;WG_OM->%ll*sjd#y!Jv*|R1+7B!ycQ)ya-J;Q;o1z~BrMUssGG2U3ZE+RTR zLejh7EU3Ar;n2R=HmOQhlHMWo24=H3d`eAfo4N~6vF-MHRJu0jWgg)@S_ZsfcT+-fS3~V2{96_#_$^x)Uv>k|Dj5DCDzNr-&%$P5eSInpU;gP43`l9 z6+BeH9N_;3Sp}I{6aoPOE&g4k{{$tBKqW>)H2)VCE)@&%Z(X$cwoQ!%4+OM@omdY| z1<-=_LtFO$%4zz|iUUE6fkd}bw=xWcPrJW@w^tV*XH?J7BxTmO5~V?EeQRUM&kFm; zVXmWQ9?yQ0!W#Ft{Tzoi{;`$)vOzr3h{Ji@dv`5|{N9n3>w~}?#p~AkBEek9k*3jh z=RTn88ZZHPnTg&0GyviqN($u4vFX?T00iUZqzte^ga*ZcgQngvz+ZFZ?KcEI?`VTw z54pN{8O(hY<9&?@QGV$Rz~XFK8nM@4S@pfc|2-N>BZLV9q3(Wzy^^=g+OoAEY#?Wc40pV6lLp1tLCnn7d{T*6`kl|S+IUt)V#-G%!Do--M3y<-BD z=dT(|xpgewzm-L(>IyvljPd{%S7IM(f~_sBP`_BFCZgo2Ga>LjOMHi$0VOOR&)~~r zhjy*LO88f(Gi?MdM|K%ZUQ;}d?v_;-a-RL3^Q+hdxO_Qv`iz%m)Gh#?%qK*chZcSD zBNygzPY*dLu(vGg3VrspskMREcIkC~V|j}tVui6WIV}gB8re)>0Ec{5O?Bx@ohxys za~1WPul(4kLaF6lO&6LH!2RbiN4a(`4KtLTH7!nR^XJuVz1QeM(>#CN)XJFLWJZRI zeQZajt#tTX(&g)^owSE5J!AcOPg;ZPUEBnHB+tI~wnw8z$ne4D1WNf&GutWO7GJAj z2Jf^w#iP>FVoF?v=eZoa9}W{KEwy9qQ&DWy)1$KaQL&~;X9xa)fTadzQg6Z3=kVY5 zlgd5;K(j0G>^j&g+PviS?k$LC`ow|4BmkF@8X+A=X#I>FlUWoLIE=Q38Lbi<5l z4~tc0yXp%WUdHVc9GFxN+3~4}BP>htk7kPwSARR4PM4^$ZLVlguAG5;j7ME!rf(3h z=ema-57Y20=S(T-0z7Y{9!jdiFs+;S=Bnj0<40Z15(JWbTVvWjQ!=GxE8Nx94(qhY zHuS}@5|~LS&nvmq(y`Pa540yQqz+kA9Ai_B+iJQwZLX_~#w*O0U6Z`}oV}BsqPft$ zKy25~WS9=Ner0DT99oMzE7KrU(n=-=?RpKZ%^i3xW`=Go0O*3rvpO>y%vMPYka8pt>E0C6LOd6?M z!pbOGGWK|!yQm$I*5&vD-sL|ievG4WMqJX-M7GaVqRi%0Oi>@HxNm6^N~7DmtmKD# zsJewIpw^B!0y4d53639&U-e-e<=xUrC_3bw6IaT^Gv#kloFge5*oPSE*U@~7t7UNy)pv5p43A>EEXK9Ah*uw2dO2R=)xTqZF2QN#w z$b95yDW5X;>IPSkBZaDXZ^H|Nrrb4&hR+>4a;w;3~|=FUfm?j^~yL)mq%9R1=8Eu?7`%& za>->YuPS{kvXv^tI_i2;>K<$(k?7}zecF>P#WG7J_6E-!jB72E>!n|pWf>VJDn(K* zfMk|I6_sN)1Mco88+JR&U`72>=@ zFHiVSKS(M+E*c^3hkIPFL0UD`) zmqc?Hl^revRcq@`Z?YW+Wjet( zn+I%NGp$~IEv)5nk`-#6Sd+v3Xh$;H<;3ly_gVyh)1L1ST+p?T&DP{8@N@X7#u8~q z<3^f%^0*C|I3`oNE10Fgs)XIv34dwd=fHc;AnE6QTi(~R)z3M`1v#CWJd3#yiK*9i zr3Rw_Tj^#FybiESm<&cyML+~Nn|_e;?3NtOj>O4|LN#xaMB^XLIVvZ@E6V01ZUr0Z zo{Gi*bnrCFbzUCKI+yY`g^2S#zLG)lNV-GVs(!{DbD1HUPP`teDZ@R!-fZJ3LM=6l zA7YkO2cwY}6~00EsWW=L6*)8JO=OIw?g>%=mtk-xR?XHp z6HMdHNvqYL_A9b^zFrNnfagL?NUVWYW2Dx7Gz8+IY~LA4%m>sf;7%0D8y&o%LM{n@ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0cd8e28..677511d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Feb 04 11:51:45 CET 2017 +#Sun Jun 25 11:33:23 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-bin.zip diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 4453cce..cccdd3d --- a/gradlew +++ b/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/gradlew.bat b/gradlew.bat index f955316..e95643d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,84 +1,84 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/eu/mihosoft/jcsg/ext/mesh/MeshTools.java b/src/main/java/eu/mihosoft/jcsg/ext/mesh/MeshTools.java index a2886cf..15b83d5 100644 --- a/src/main/java/eu/mihosoft/jcsg/ext/mesh/MeshTools.java +++ b/src/main/java/eu/mihosoft/jcsg/ext/mesh/MeshTools.java @@ -35,12 +35,14 @@ import eu.mihosoft.ugshell.vugshell.Shell; import eu.mihosoft.jcsg.CSG; import eu.mihosoft.jcsg.STL; +import eu.mihosoft.vvecmath.Transform; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Scanner; +import java.util.function.Function; /** * Mesh tools for optimizing and manipulating csg mesh objects. @@ -92,19 +94,19 @@ public static CSG optimize( Path tmpDir = Files.createTempDirectory("jcsgmeshopt"); Path stlFile = Paths.get(tmpDir.toAbsolutePath().toString(), "csg.stl"); - - System.out.println("f: " + stlFile); + + System.out.println("mesh-ext: csg file: " + stlFile); Files.write(stlFile, csg.toStlString().getBytes()); String code = read("optimize-and-repair.lua"); String pathVariable = stlFile.toAbsolutePath().toString();// - - if(System.getProperty("os.name").toLowerCase().contains("windows")) { - pathVariable = pathVariable.replace("\\","\\\\"); + + if (System.getProperty("os.name").toLowerCase().contains("windows")) { + pathVariable = pathVariable.replace("\\", "\\\\"); } - + code = code.replace("$filename$", "\"" + pathVariable + "\""); code = code.replace("$removeDoublesTOL$", "" + tol); @@ -113,10 +115,9 @@ public static CSG optimize( code = code.replace("$minEdgeLength$", "" + minEdgeLength); code = code.replace("$maxEdgeLength$", "" + maxEdgeLength); code = code.replace("$maxAdjIter$", "" + maxIter); - + // code = code.replace("$edgeApprox$", "" + edgeApprox); // code = code.replace("$edgeTriangleQuality$", "" + edgeTriangleQuality); - Shell.execute(tmpDir.toFile(), code).print().waitFor(); return STL.file(stlFile); @@ -128,6 +129,103 @@ public static CSG optimize( } } + /** + * Optimizes and repairs the specified csg mesh object. + * + * Note: the size of the + * object during optimization can have a high impact on the overall + * optimization quality. Therefore, this method allows the specification of + * the size at which the optimization is performed. After the optimization + * the object is returned at original size. + * + * @param csg csg to optimize + * @param size object size at which to perform the optimization (minimum + * dimension) + * @param tol default tolerance + * @param maxTol maximum tolerance + * @param minEdgeLength minimum edge length + * @param maxEdgeLength maximum edge length + * @return optimized csg mesh object + */ + public static CSG optimize( + CSG csg, double size, double tol, + double maxTol, + double minEdgeLength, + double maxEdgeLength) { + return scaleMinDimensionTo(csg, size, + (csgObj) -> optimize( + csg, tol, maxTol, + minEdgeLength, maxEdgeLength, + 10, 5.0)); + } + + /** + * Optimizes and repairs the specified csg mesh object. + * + * Note: the size of the + * object during optimization can have a high impact on the overall + * optimization quality. Therefore, this method allows the specification of + * the size at which the optimization is performed. After the optimization + * the object is returned at original size. + * + * @param csg csg to optimize + * @param size object size at which to perform the optimization (minimum + * dimension) + * @param tol default tolerance + * @param maxTol maximum tolerance + * @param minEdgeLength minimum edge length + * @param maxEdgeLength maximum edge length + * @param maxIter number of iterations for edge length adjustment + * @param creaseEdgeAngle angle threashold for crease edge marker + * @return optimized csg mesh object + */ + public CSG optimize(CSG csg, + double size, + double tol, + double maxTol, + double minEdgeLength, + double maxEdgeLength, + int maxIter, + double creaseEdgeAngle) { + return scaleMinDimensionTo(csg, size, + (csgObj) -> optimize(csgObj, tol, maxTol, + minEdgeLength, maxEdgeLength)); + } + + /** + * Scales the minimum CSG dimension to the specified value, invokes the + * specified function and rescales the specified CSG object to its original + * size. + * + * @param csg csg to process at specified scale + * @param scale scale + * @param processF processing function + * @return the processed CSG at original scale + */ + private static CSG scaleMinDimensionTo(CSG csg, + double scale, Function processF) { + + double w = csg.getBounds().getBounds().getX(); + double h = csg.getBounds().getBounds().getY(); + double d = csg.getBounds().getBounds().getZ(); + + // find minimum dimension + double size = Math.min(w, Math.min(h, d)); + + // scale CSG object so its minimum dimension is 100 in size + CSG result = csg; + double scale1 = 1.0 / size * scale; + double scale2 = 1.0 / scale1; + result = result.transformed(Transform.unity().scale(scale1)); + + result = processF.apply(result); + + // restore original scale + result = result.transformed(Transform.unity().scale(scale2)); + + return result; + } + private static String read(String resourceName) { return new Scanner(MeshTools.class.getResourceAsStream(resourceName), "UTF-8").useDelimiter("\\A").next();