From 0edf65c20a782f3bf45b8e91cdac1e73e0101509 Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Tue, 18 Jul 2023 15:44:52 -0600 Subject: [PATCH] Add CI (#1) * add CI * fix readme, add pre-commit integration * update readme * fix underscore * final updates * add rst fmt * do not use relative links for the rst file * fix clang autoformatter * Revert "fix clang autoformatter" This reverts commit af89540dd211423007f1d31970243c8fef2c801b. * fix header order * fix sdist * add legends to benchmarks --- .github/workflows/build-and-deploy.yml | 69 ++++++ .pre-commit-config.yaml | 12 +- MANIFEST.in | 2 + README.rst | 300 ++++++++++++++++--------- bench0.png | Bin 24701 -> 26926 bytes bench1.png | Bin 28887 -> 30567 bytes pyproject.toml | 4 +- setup.py | 3 + stl_reader/_version.py | 2 +- stl_reader/stlfile.c | 296 ++++++++++++------------ 10 files changed, 425 insertions(+), 263 deletions(-) create mode 100644 .github/workflows/build-and-deploy.yml create mode 100644 MANIFEST.in diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 0000000..f0ef69e --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,69 @@ +name: Build and upload + +on: + pull_request: + push: + tags: + - "*" + branches: + - "main" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - uses: actions/checkout@v3 + + - name: Build wheels + uses: pypa/cibuildwheel@v2.14.1 + + - uses: actions/upload-artifact@v3 + with: + path: ./wheelhouse/*.whl + + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Build sdist + run: pipx run build --sdist + + - uses: actions/upload-artifact@v3 + with: + path: dist/*.tar.gz + + upload_pypi: + needs: [build_wheels, build_sdist] + runs-on: ubuntu-latest + # upload to PyPI on every tag + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + # alternatively, to publish when a GitHub Release is created, use the following rule: + # if: github.event_name == 'release' && github.event.action == 'published' + steps: + - uses: actions/download-artifact@v3 + with: + name: artifact + path: dist + + - uses: pypa/gh-action-pypi-publish@v1.8.6 + with: + user: __token__ + password: ${{ secrets.PYPI_TOKEN }} + + - name: Release + uses: softprops/action-gh-release@v1 + with: + generate_release_notes: true + files: | + ./dist/*.whl diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5070ad1..367db0b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,8 @@ +# See https://pre-commit.ci/ +ci: + autofix_prs: true + autoupdate_schedule: quarterly + repos: - repo: https://github.com/psf/black rev: 23.7.0 @@ -53,10 +58,15 @@ repos: - id: clang-format files: | (?x)^( - stl_reader/cython/[^_].*\.c.* + stl_reader/[^_].*\.c.* )$ - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.23.3 hooks: - id: check-github-workflows + +- repo: https://github.com/dzhu/rstfmt + rev: v0.0.13 + hooks: + - id: rstfmt \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..831098d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include stl_reader/_stlfile_wrapper.pyx +global-exclude stl_reader/_stlfile_wrapper.c diff --git a/README.rst b/README.rst index f032fd1..868117e 100644 --- a/README.rst +++ b/README.rst @@ -1,137 +1,221 @@ -========== -stl-reader -========== +############ + stl-reader +############ -``stl-reader`` is a Python library for reading binary STL files. It wraps a Cython interface to the fast STL library provided by `libstl `_. Thanks @aki5! +|pypi| |MIT| -.. image:: https://img.shields.io/pypi/v/stl_reader.svg - :target: https://pypi.org/project/stl_reader/ +.. |pypi| image:: https://img.shields.io/pypi/v/stl-reader.svg?logo=python&logoColor=white + :target: https://pypi.org/project/stl-reader/ +.. |MIT| image:: https://img.shields.io/badge/License-MIT-yellow.svg + :target: https://opensource.org/licenses/MIT -The main advantage of ``stl-reader`` over other STL reading libraries is its -performance. It is particularly well-suited for large files, and it merges -faces faster than VTK, mainly due to its efficient use of hashing when merging -points. This results in a 5-35x speedup over VTK for files containing between -4,000 and 9,000,000 points. +``stl-reader`` is a Python library for raipidly reading binary STL +files. It wraps a Cython interface to the fast STL library provided by +`libstl `_. Thanks @aki5! +The main advantage of ``stl-reader`` over other STL reading libraries is +its performance. It is particularly well-suited for large files, mainly +due to its efficient use of hashing when merging points. This results in +a 5-35x speedup over VTK for files containing between 4,000 and +9,000,000 points. -Installation -============ +See the benchmarks below for more details. + +************** + Installation +************** The recommended way to install ``stl-reader`` is via PyPI: .. code:: sh - pip install stl-reader + pip install stl-reader You can also clone the repository and install it from source: .. code:: sh - git clone https://github.com/pyvista/stl_reader.git - cd stl_reader - pip install . - + git clone https://github.com/pyvista/stl-reader.git + cd stl-reader + pip install . -Usage -===== +******* + Usage +******* -Load in the vertices and indices of a stl file directly as a Numpy array: +Load in the vertices and indices of a STL file directly as a NumPy +array: .. code:: pycon - >>> import stl_reader - >>> vertices, indices = stl_reader.read("example.stl") - >>> vertices - array([[-0.01671113, 0.5450843 , -0.8382146 ], - [ 0.01671113, 0.5450843 , -0.8382146 ], - [ 0. , 0.52573115, -0.8506509 ], - ..., - [ 0.5952229 , -0.57455426, 0.56178033], - [ 0.56178033, -0.5952229 , 0.57455426], - [ 0.57455426, -0.56178033, 0.5952229 ]], dtype=float32) - >>> indices - array([ 0, 1, 2, ..., 3694, 3693, 3688], dtype=uint32) - -In this example, ``vertices`` is a 2D NumPy array where each row represents a vertex and the three columns represent the X, Y, and Z coordinates, respectively. ``indices`` is a 1D NumPy array representing the triangles from the STL file. + >>> import stl_reader + >>> vertices, indices = stl_reader.read("example.stl") + >>> vertices + array([[-0.01671113, 0.5450843 , -0.8382146 ], + [ 0.01671113, 0.5450843 , -0.8382146 ], + [ 0. , 0.52573115, -0.8506509 ], + ..., + [ 0.5952229 , -0.57455426, 0.56178033], + [ 0.56178033, -0.5952229 , 0.57455426], + [ 0.57455426, -0.56178033, 0.5952229 ]], dtype=float32) + >>> indices + array([ 0, 1, 2, ..., 3694, 3693, 3688], dtype=uint32) + +In this example, ``vertices`` is a 2D NumPy array where each row +represents a vertex and the three columns represent the X, Y, and Z +coordinates, respectively. ``indices`` is a 1D NumPy array representing +the triangles from the STL file. Alternatively, you can load in the STL file as a PyVista PolyData: .. code:: pycon - >>> import stl_reader - >>> mesh = stl_reader.read_as_mesh('example.stl') - >>> mesh - PolyData (0x7f43063ec700) - N Cells: 1280000 - N Points: 641601 - N Strips: 0 - X Bounds: -5.000e-01, 5.000e-01 - Y Bounds: -5.000e-01, 5.000e-01 - Z Bounds: -5.551e-17, 5.551e-17 - N Arrays: 0 - - - -Benchmark -========= + >>> import stl_reader + >>> mesh = stl_reader.read_as_mesh('example.stl') + >>> mesh + PolyData (0x7f43063ec700) + N Cells: 1280000 + N Points: 641601 + N Strips: 0 + X Bounds: -5.000e-01, 5.000e-01 + Y Bounds: -5.000e-01, 5.000e-01 + Z Bounds: -5.551e-17, 5.551e-17 + N Arrays: 0 + +*********** + Benchmark +*********** + +The main reason behind writing yet another STL file reader for Python is +to leverage the performant `libstl ` +library. + +Here are some timings from reading in a 1,000,000 point binary STL file: + ++-------------+-----------------------+ +| Library | Time (seconds) | ++=============+=======================+ +| stl-reader | 0.174 | ++-------------+-----------------------+ +| numpy-stl | 0.201 (see note | ++-------------+-----------------------+ +| PyVista | 1.663 | +| (VTK) | | ++-------------+-----------------------+ +| meshio | 4.451 | ++-------------+-----------------------+ + +**Note** ``numpy-stl`` does not merge duplicate vertices. + +Comparison with VTK +=================== + +Here's an additional benchmark comparing VTK with ``stl-reader`` .. code:: python - import numpy as np - import time - import pyvista as pv - import stl_reader - import matplotlib.pyplot as plt - - times = [] - filename = '/tmp/tmp.stl' - for res in range(50, 800, 50): - mesh = pv.Plane(i_resolution=res, j_resolution=res).triangulate().subdivide(2) - mesh.save(filename) - - tstart = time.time() - out_pv = pv.read(filename) - vtk_time = time.time() - tstart - - tstart = time.time() - out_stl = stl_reader.read(filename) - stl_reader_time = time.time() - tstart - - times.append([mesh.n_points, vtk_time, stl_reader_time]) - print(times[-1]) - - - times = np.array(times) - plt.figure(1) - plt.title('STL load time') - plt.plot(times[:, 0], times[:, 1], label='VTK') - plt.plot(times[:, 0], times[:, 2], label='stl_reader') - plt.xlabel('Number of Points') - plt.ylabel('Time to Load (seconds)') - - plt.figure(2) - plt.title('STL load time (Log-Log)') - plt.loglog(times[:, 0], times[:, 1], label='VTK') - plt.loglog(times[:, 0], times[:, 2], label='stl_reader') - plt.xlabel('Number of Points') - plt.ylabel('Time to Load (seconds)') - plt.show() - -.. image:: bench0.png - -.. image:: bench1.png - - -License and Acknowledgments -=========================== - - - - -Support -======= - -If you are having issues, please raise an `Issue -`_ - + import numpy as np + import time + import pyvista as pv + import matplotlib.pyplot as plt + import stl_reader + + times = [] + filename = 'tmp.stl' + for res in range(50, 800, 50): + mesh = pv.Plane(i_resolution=res, j_resolution=res).triangulate().subdivide(2) + mesh.save(filename) + + tstart = time.time() + out_pv = pv.read(filename) + vtk_time = time.time() - tstart + + tstart = time.time() + out_stl = stl_reader.read(filename) + stl_reader_time = time.time() - tstart + + times.append([mesh.n_points, vtk_time, stl_reader_time]) + print(times[-1]) + + + times = np.array(times) + plt.figure(1) + plt.title('STL load time') + plt.plot(times[:, 0], times[:, 1], label='VTK') + plt.plot(times[:, 0], times[:, 2], label='stl_reader') + plt.xlabel('Number of Points') + plt.ylabel('Time to Load (seconds)') + plt.legend() + + plt.figure(2) + plt.title('STL load time (Log-Log)') + plt.loglog(times[:, 0], times[:, 1], label='VTK') + plt.loglog(times[:, 0], times[:, 2], label='stl_reader') + plt.xlabel('Number of Points') + plt.ylabel('Time to Load (seconds)') + plt.legend() + plt.show() + import numpy as np + import time + import pyvista as pv + import matplotlib.pyplot as plt + import stl_reader + + times = [] + filename = 'tmp.stl' + for res in range(50, 800, 50): + mesh = pv.Plane(i_resolution=res, j_resolution=res).triangulate().subdivide(2) + mesh.save(filename) + + tstart = time.time() + out_pv = pv.read(filename) + vtk_time = time.time() - tstart + + tstart = time.time() + out_stl = stl_reader.read(filename) + stl_reader_time = time.time() - tstart + + times.append([mesh.n_points, vtk_time, stl_reader_time]) + print(times[-1]) + + + times = np.array(times) + plt.figure(1) + plt.title('STL load time') + plt.plot(times[:, 0], times[:, 1], label='VTK') + plt.plot(times[:, 0], times[:, 2], label='stl_reader') + plt.xlabel('Number of Points') + plt.ylabel('Time to Load (seconds)') + plt.legend() + + plt.figure(2) + plt.title('STL load time (Log-Log)') + plt.loglog(times[:, 0], times[:, 1], label='VTK') + plt.loglog(times[:, 0], times[:, 2], label='stl_reader') + plt.xlabel('Number of Points') + plt.ylabel('Time to Load (seconds)') + plt.legend() + plt.show() + +.. image:: https://github.com/pyvista/stl-reader/raw/main/bench0.png + +.. image:: https://github.com/pyvista/stl-reader/raw/main/bench1.png + +***************************** + License and Acknowledgments +***************************** + +This project relies on `libstl `_ for +reading in and merging the vertices of a STL file. Wherever code is +reused, the original `MIT License +`_ is mentioned. + +The work in this repository is also licensed under the MIT License. + +********* + Support +********* + +If you are having issues, please feel free to raise an `Issue +`_. diff --git a/bench0.png b/bench0.png index 292272f906bffd20e37e234b2e32a0d52c05bdd4..2fc03840ba6d83cd8967db72b2e3d8f41c3dac9a 100644 GIT binary patch literal 26926 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

G7y-6~iWX!M)@$^Jx z*fP)RDUzcI728-DcC`)7>`WbFGL#`@-0yeQdEV=J-}jIAx=z{h<#ug`V;rg*$JCW;)R1E;c7`xXAxKG4UuANIJ4X#vj3w7+7|#{P5Jn zS`Yb=GMl7JZ+90yeRV%qba&3$$5?5$r;H(&=!2&w*f_qv;rVP9cL(j@JZTeUakjtC z9o4)wdk2nhxPRM{U)M!wRSfPz6C=7s6^gdgHFK}!TcaL58Cv{nmc4d-9OA&Sql)=z zd&m~MBi;1pw`;84>2@4P+B+1VkRHF^3jI4Ay{e`AG~G2`G{uyj;eTCXYH>=Iud{#H z&e9yx`Q3Z@4yW$(jgRoW)KK8xu?4V+dMv1B1&XdDRa0rKCSYoZCF=QTxv)S72HHcs_($rRXdwLD68!qM#&06H zCG*=lD|?#Hov!oh%>~<-*F3*^QiiS0(h}}!ZaG>sAQCB z*Xw%+2a5>V_$j}TJk7JSQN0LX)qxsJfzfeKbfV?F*2zR+D9$nm%FbqsHsVAXo1tzjrsFH76OnltHZ_EwIYA1GXr zF=k=rpPNuBwt9X*_8Q|SN5*eFpIUMBNe)lPV_jFLiqec?s_z1t<^F~qt$Cjd(#prQ zR&HbYl6jQ5mp0dWLve{`wz!J1nXC>yF1bwLH;Kk)X9Ac42~BbK>31Z!Eek)59txK= z+1PnQJ|wD%e@D}c4E(dkF! z`*-;SEwrAKh}~lMc<7ahxX8mwcFa)pG(Eze8_+RVIW4^8UCrxN-CDMfYwFJ>q-lRL z_*SSA+CFz!m?nRiF`KSX9@u~0Fu|o_tSsY~9;KF8n`^gq)Q5Wd+|1;hoQL1vk=__= zwCntNZMlRr-nzQF(`Z=I%$KgQu)w3&*q}{c^yx zVL{>9=7K_0i$%P|Or6a0ZEE(>!y-bPT`LEBt?O$)IkR4$s$#qU>kCtiV;&(dFKnN# z9Ml!qA)pf0Vyo@l=Xt-iL)*p5(oR7)S)uVOwV-Nhbr>fu^u2CeA=@BPAQoGjV#3xS zxN;!qULpST440Uu?cF<>ihdM9g{7p|yPpy}^m>hzG7q&ee>Fe1?7_(BMvweDP3Lz@ z3Qe5f9UQh2_nyAQGUsaKc#gy_NN^5eyXDF>%7xR;D`c~Wb2OoIrE1`Hnr!~pX-{Lu z^TLhK)+Qs-K7RDhuAVEA2@7j*iW?byRR76nSTy&bk^R-K)+5||zr~Wfz07v!%!6df z5#7$kix*RB|LRkWQP8LGp|{P<-zckBbn#=n#;hkC4ApAP!C$UsWl6)7ee&fEJ%$oc zGw3%!V5g)6^TcKJF5m#?!CJTuJ{k~|S8F50RJ;bwapu|&RazYbI-`y5uZz#|5{?Ln zp1+d107P+ba?B#3*6Ptx#OpvS@76!YGj~EO@+u*jp>i+Wz7Qvcz17ElI7)wqsuu5yytWIj=d8r0HU7^04*Pgu<{ZHmz zyK6GZ&9A17ET~Fxm-+gZ2SRt_~U7u!$sg= z$6I2zf5rHi>%OTZP2rzE94)D}hzwYDjRWwH?pexPw~(@NFB zs)LmCAl!7sbcWME`8t)U3}I5qL8}4Nxg>$>F{BwF0=GSC<+hMGyt#WK0ih9{O=~aJ zg!>RN_Tub{vnP+Lg6S7>_;o*e)95+$4vA>El5gASb;=hliyzx+LpaYHG54AT`zY9#-8FM?GEC(%(_3 zi_yG^!kZn-&4Qri2AcBh@g+>ClPIznCMuF9*Ow0NTmmF8FY>H(b+&Kse|I;9GeT{E zB=dlg(JdHGpo?)*7jr2a;fHlnNjq6{3l1eYA943s?za7}GVS)eSzt;0$?QwFfsX@P zvy^rFi@!+T#4j}3o8mGLott_zZYIBXMIPfhr0DtSXvOTr31Yg$-Ebh5g#JmFC8}s?KxQi5g#d+*iLnMe5W`ksI!vOyz6DfXjvMtI#HyO`uYDb8@($-X zsgoMyj;W83e<;IlAtiNgJ8F-anCFyQh%~?VXI(Qi=zeeMKcYvFm75}U=Iw-*g#wZw zs%=L>OLLUmDgB|pUmtBUxQn7}>YR%TAxVYM)zGlFM6l{QGy#Nvh_Qq%cv0ad=6%u{ zMsJER!&rCWt0W{q)Uy7VNxBaI71Jo?caS`ELOD0c_Hv%;ZOIu+^oGXZ*#UJC^0ipgPCm?;CP4CneVr zacL5PGj6D}$GmbpnfeqdLN$1Qdaz5N9@vG>CehW}vE237gl%pdfx;DBv~L%dZleF* zUdA+!(*YkO3pKyR~Z#P}QZwSoVV{nXb9v z-_Z`dUqrFL!DbJB4iY8MzfP^iF9&6oVeWUwpKyMR{wStxTWk}N1VT!rVcWK`p%*sd z3=9AStbnP($WyD9SEVROY)XHa-VKGF6g_tM6WfbNte0ShuV6|+UBZG@6wWL0E)~1F z;?C7aLrVZD>>LrSTo`KkDhJEWhV za)esf(JNJKBaql7+mar*bnGB*VoWRUh#L`WgM|z!h9Xpnh^+87E`;(K+*W{KK5D(` zR3@x&h)Hsbb>I;-v!n-;7JPN}UI1Ha5JVjTcH|)u^vT7=PHiP|_%bhS2uGH`T(Yzt z<$pD}omQh-94<~74UMFOIPQLS8MX#_DB;ifxBbP*Yxf^J1lH@~MT=bPLd)T)ij_SU z3PFjATPNtr9e^vN_)d%)2#dh+M2oZ0Ha5U*0qdms`0?YJK3(pgi2IBlP|9J7-$Aq? z5DTvo6HDovzSlAY&rT|?*9A^`x$oCR4VQEqX3Z%g^2h&(ht)helUMFl^Z5$iO57~e z#;0N>%ugn_)Q@6p4%WJvj`?Nz*D39zL`}g5%~v(;S09VLi(5;Y45}1 zvW{y9Rf`@1ed2aMb!_PbZ%NGh(7q(5w$ia*KUFI{ewQp%k`swThHQ0r0ICj>ZV<6^ z8PIQn>$GACj2Xzu0@T&h>Aj+u4E@x+F&NfH!5W3!iyy(sq2=LLLJ?T6q!a~P{7OVy zSdNl3TqF=ZNgSZOBiP$N`}?0kC;J^yc&zRljN*{Le*OaG54mxuF&vw6)4KjC1p*j? z1G)TiVPO{Z)MK;l0pQ}*)h$r?ms$A`oJGeTJdKx5v!rGdF{i-nx(@Zi9xBigW3ZI;#mwHzY4FZv=`2 z(GY79AZrzQY=DMlu;A7gCBS2V?$6?~Wph&lwfL^It_P9glv6yl2nLY!h67(%b(z7a z_%ywA=~A_JxShpq;094n516oEHDTqe0aHB{IlvsBwkv9h;9Igr1nFHZhByMjLM$jB zL_1a&o?~E3DD%*{sNt%h+&d7CQ@qeRtv66~Cq|{F4vP4JO%(x0qGm+}7=+=7B?|i) z&?T+KL@NF?y~b@#kW#?ZIaU)~QtCWaO-&lC`nI+qe2L^l$Hb6l3Sh%$E44$jiX0}k z(fhkDZtxaNNf=`5q82*95+uH0_gw*|F*4Tbk!B>Hkf8SZ{6^14A`ASUt3U0b6NlQ7 z#l{vD23dLm*!V<$M{u2xgZtKh)~lA!&dx^Wg0$n(+u!T+2Rkb#G5HB8`Fqi_<*Qfo zQ4@ES6LV^0g;d>8~MEYBnb%#O2tESc{+nLG~wT8 zaOhAb_K|Rj?OII*xTMzb^wdK;(SguX)3U%1w1^YCbkSnxZLUV-)Y0RlGmm=Z>4leTsW89gQ*!ooT-Zl-O{KIR~~ zbH$_?l9?K43(0wxF#_Qq5(1CdM`HBh3dn7>hV6e64_VwVNc9>qA4uvC-7Uqr$#@Ea zu0>0i+5+lKsZH2=0+&+Dr4;7nZNoPpCD^ckGAuN7BVHQmDy7y4rYFqn+yPI8(ed$W zVpSFr5V(Pq&mUZAQtd!iF*ov>#5760f1>*yZZb zE+rglBwF2YtMVy`-!`p0A3#zM$lD%aar)q)69h-&UMEnZjO};Q4Bq!caLy9cg?qS$ zOM5C7zp`DO2u=YkLj1*cztpb{rVTRF0hHH=&W}WCc!4x|kfcD4qCzmG$Zetj+ChMf zIE{|V@8xzQaX*a=YX%CZLEy#UJ|a#6L^Gz?ge7A8ZagG|j$?>L$+<1qp*q1Qy-8)d zqgy;z(sTlYkEKvUHU-a5zd&jTc0wGKbOmruW6W!jrLL>7sJ6I6D~-pyd*kL!UUC|G z`SN8Mo&vxFI%*U~mPFXY(B6?r3n$$knA3umoLEox4Maue>_iI_rvs=tJAwAl7}`z| zBcsw3A|#o9=CuvvpvDJ(R_LXk z5&`vC3bqAeoF$~VL6<~HoONs-1@RJE``FeD>-JDak&)IwJwdR~_Zo)NhDV`>|K!QS{PAe

T3SKPWc(g6H~$35#=2q3 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

d!s)UYG~jM!4-fyF(_o`vL}&{07?f%d4|m z%*C;I`YrB#k1Xzrb{>`)n_mH;v&r1_1iXr@Q-)?&Ae2)-4Ha5ru1j*`*}w-+mb$%- zgFDm?VwglJcJwNV1eMw?CL)<=5c?%353n!1`9H9+Zq~O8B@w^oya(1%9@mVGj^dWm z6A4pZl|{zOGv#Z@s3Ehng6=va-ef_w$s5w%rxh0wxsDMcgQX4*4j4Ce4ZRB@kMw6= zuNtG|Y4tr_0I81!Qa3Ux3GL>!$s7*MOJ5XI`YGC9%u!J*Tw=G6s1mHZVRMnJN`H%> zX%B^_-4ufM?|ONzsqS<^vUmQqO7)wV^cG{>Prm=h@?3)P6M7XQ!b2}0vubf|zJSRNZ0zj!ggl9I7=6y(@|Wr#rigy=5FvJB4du^Ko8_ANK1KMI zm`Od`=5&ik4gxBE7<9wTou(IDe$80C)WawW;vj(M_s+e0F8e%*#N@5VWb1K5XzY41 z8Yk~rHDK(qP&dj{A#En}szCCNGQ3d?C0_Tm)8t57HM+;zFqy#xR@gg0MrOdb45k4Y z@IZ!3{q8DlJIoIX$6axK>4x1m0%s)=vvRCK!vi8%3e(BX7g%6ykgfsCBji#70s@V} za8MBJ{bzl^JBpyaD`}I!T2eq#XqOYCd-bptQ*+fCjvI<3@^|o!$HQ?_W&M zv4_Otq=@}9Ia$>1?F0w^}%7lv^LvsYcGmVTX#3(x)!-~PSiU8^#4h9YC<0+`#W8g5TE%f%r$HK-d zgkwvCk;kn^doGT_k?;zdSTeT&vB0T#chCXAjfDksY7;bAak3)g!^C-$5Nt^^8&cOA z=!VXHeYzKOZqo9{7)?!0nfaA?AO|@4!XTn+Jlbp8dbnW5mYAAwrB^YyFUFI)o`R7@ zaZv5$PkhtA8W3Q6=$h zyAEkilWFzEH-O(uc7{(4RUicg1>ut^T%gNh&2;qlR}hVsZW@XEp)w9A%Vzj^bM*IXuzvqmv_+)J4^{i)z~{ZB>)M~m^Ohqb@*=$LqfPrxb!TQC7|+Q zZ%gvNG*&J&1;ZLpah;eRXog)=X3hnyKBA@0`G(zu3`N3GG0p9BNeLv!7-cc!_#`jS z<8~>AV?4hg9W~@XpsA@DkF6g;eM@O6QUNQ7GN=QXKV|#(!EJcmqXy;SP>sN8OT7M0 z)W|W2z{sFPq#p{U!Td?65XiVRo>sd-Ph!#*GNz9p56Fn7FMO+47hPW~WT_8ocXY8uJu7qlCi`$BW}Up4m+Mb~`E+S=?(b5u}B_T(n9MXwkQ|`hq zcvKc;p)zqiylw=GGh^N5a!r^LxOjAwvE{+o9U(}|@JIEgb00r^*zQ5Kfqtk8nkvrp8;7j@8H^rl*2|TxlBuU-W@i){RJFiWN$D6sRq{#HhGvPwJ@v zPjRdxVj}r7(iTH9Bg~fLyYy24Sd1dWi$CrSbopPsnhxj>cB(Q`2tZKflJX@^$M4_u z5Z~Y7Ey?i92$W?dH~B1(@Hw5e=J38uAt?Y&H4X?7Kwn$q!Z#oyUBHyR3uIxS#4`o@ zYKCQo(T3LaxN$Y$D8JAC>KDNs=8Rc!;1O|NBP$KP2H(-Y4lUTMgaS(7@1J%0KGR1FM?&{xA6E Bg@FJ7 literal 28887 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≦ zwc#|i^&<5Tm;Y1RnMYIkzk7dE6hfpTMbV&)MW%$Lh@>y%Z>{q@=d5R)vz|YyrP}wt@6Y`iuj~DOU78{t`9{Er zU_ZSyfQ5y{{#)J+r1zC+IbKofn&fJ%5wC`oQ>1Qfo<7G<3WnvU#8l2uG5cVo7N?)r z_bP3ZNfBtJ*8b`zuQOoRtcxux&S`16p({gdb7fdG;0u?6@mq6=X6K@TD;Sa*`67hy zs?watPhCXq)AJpM3YpJq*DLXo~=RaFjx?v^q?$IsE;t9_S>BZ;z6e0~h< zkE3y}EzC3ae6d`fetg){;gr}Jc#hpH7mp(FL&y&4bb8LYT7G-~;@EdKxx{&$%^2C~ zzXm!tuwq}ObCCqL_SPP4kZdltlM7zS91nSPG-ts5D_z<$AVW0oiqIcVb~S}PI@;#3 z2sB~fyhj#aNcED0qod;o^%C81y@FkFrDGB+R#iI>+!A6U9{LF9MnVBcDfkjtw|eN; zXlrc$D#xe&S8jd&!!fM0SM$5sozvPI3sh$9V`5_V!{rU*l*IuY=jz^xYfFd!sDW_v z=8P8+0*?58ghPXk!aO_AA15zxXn2QcESWo*8g%or$;p^d-P7HFb5CMV1V7WZ`MD`d zvhRQza$B6?I2&kWX}q=7pLF?~B*fICd(*Hp7I8F>)H;o=*1NVKx%r)6ClVQ73k36o zStdjlDLK5^A~t^cP|D)*4!6d!1|{m@j6>@#w32;WHr_!_{v(l4P>SrgfYztkRY#P&GDU?lxl3td;QF02ogEb)^**v=`*4F2iew3lqJq(JsY)rc$4nAjov4G z-70*t!JC`NTb4^>K3jgQ;@dYEp_LI-MtWk`%pI`;=}iqE2>BzU$u~*OiJh|Js=8Wp z5$EnT#}1FyVb>F=vUj~lJVQBE?ULsTu|Lf+BFLcaQBpo|)dQZ#trzjhm$ONSb|BLw zR{GcJRImv5`<~$kU9s7Zl7cpkloiRA))KPMy@dt2tiU`*~TZncJOt2v2-m*O2K#Qs~!JhdB5}m)JE1FN0%Tf_Fu%RrgR!WS}KNfW8Y^t7_ejPtw zZDW!m7afW7pXsru(++QFEnN1{RNJc>=EQ@i-2>*yp?w{}mq>wOtGnCstvZBFPn65T zjL$l^mcz_nLDYMR=AhNbC$g_EZdt`wtB#bkAPI;4f1P(+-~AY8^9^_&i@f5a=p}U5 zDnEW%NGXlpM%cDrZ+dmeR84?6o^ngUWJXA89hcn!8?#QG2c5d3my@ZoVo`3$>UD2i zzD0J6#CQb1%p+oVQF>CSj-g+kt#<%=vDNR84D0^$I6jqO^fyKBvP5NdTtr<<$f1!v zjOj05Hi;RPDZ8)A`NFuHy6OF*B*UFS76|pT=X3S^IcbeM$fWzqjZkwg zlNn#L1@c7M+(lR&B)5unUpmAc0LsQ2tEFmg{kP8b{9k^D;=Zz+FEYI(gCKa4%0q+d=W^U+u$Z5JBthCi|STf;@$Hh%uufnCQYB*Y0_#LHp=J@76{_*6^r3=(iH&?8WkxOKbS7L zS$bvzbeVh4FCZpj)b)!w+{;%6fzQYE%~y3l5Eud37;NHOmK->M%dBNB2VF(T|(VEBmUs}J9*_G)j8RhB0Gp3`u-4l(#RqiOb_srQ|*Up%A>vAn&7 z`Br&cvgwVcejYxO&%*;9n#-I6Y&V?WE|{=vv7u;Y<_bQStqE*WURvhe`!>sTR!?2z zjZCm&r>L&HDfi@*Akq=XM(eWI@`T>EWv48v%g$>Z;KAnRYF}2Sfp%rEiZn@eEsyOw zJ@XovyEe=49rkk~UwqhYC*u)=f8rvlAY>^s z0zE*C%WvQEAlAecWm(76gEhSE|t&D!H3jpkjLUFdeRR!zhG4vTJYTYdI$v0TEjBcpW%;f?_iL@gjsb@5bh{@gr)ur0 zkaZsO_}hw$a*uRV^hCIrVssurqY`<|9KGwy


oM3+AR5H$|WBBZ7lE1(h0#>r)}qr-v~6m;(B-}SS;qt<~B>ikYstQhK&Bj5p`PM z;_6->vs>cm_@xCZv4VXphaKw(GZaN4p{+d}J!F@7pl9hR!JT!pw9=1JOVX2qZr`;U z_Fq313QiOEEAO}!y803ae%TT|>oore4C-*DUJ52a3ZcK=)nA`5oB#dsAPvKss?374G!sZZ2F-6wpE>!E4h%tn%<;($?x zRAWBJCMn%=S&Kqvb_BQvO9LM1$Nt&v^WZ~}&8Vbl%QtkBjja-}6-o{*emVBhRQ>ew zhNd?eBzbzLuxU6ZP^0um`4jJr4-N0Mr8zSAb{N$w&NpE)R`6uyv^%vQ66}Y`nvQ$- zm>=*#F2bioE}`#J28;9MTo-D3mvP~>6r79<$*-2ljjx zVUqU}yPY-bSxr{3&BU79$+ni2)C+%K*|8hiJ4_HT;jaex4sz)3p5RaRs+V|3vb;(n zj>jTllz(tAHPE8;jt5Kr-1+a+%U817Y}|rIW%?__Id3nFu5oU*GS+&zWrX9gn(ORW zSNdAgcM(S-XpE47*5LpTubS2T5fv5|aTn?7apDD@OElk9BPb_vvUcIcQ;(3O0`U0d zyo-&Vu#rE`brN_vg-3dXYH23TY;HEvNIJ9CYz#qo~OuiD|ffWMmh#ZG~Q%mA-g> z*9mE9G#}?GwlbgkA98VTW{Km3l_9p9AP5X}=J6XU@;-=5@wie$;}0+U)@W66PIsql zYtM?M6EksBQ*1H0`RICE?+B1+8{i@Vaw0BA;`+ed10+~CQVnx0i9oJcFqXy=@j)wh zfuSUhcj>#+!;TkT@~2jGrFR-**!+|r^^1Filp~QnR-1NyGFgv3H78;T4j=U^8n&%4 z(Y;9NvzuJ@bv6WQ{^!L_A|0#=%K~zEy83M(K#Thx+gTL-E}s5vpnMJup_L`lA8HZ*4S8bNbgPjR zv2y2Q96xhL3@EjYgfOv-xk;sIn8(ImRqu1RAWx+QDOGoaA(Bf!UTlt*c-|FTa7y`X z_+-}X+NOGMg)wP%?v!iS4fp(LA}-mT<~q$x7CpaMju)p4x_b{_+NzPBk3#bFl{8wK zQ`mAGi{bg0Ya7qwvbBV!V|ctn4+aw z;BfNhA-^9^d1kI9Ld-9-OPcCyRTj4de#zE+RqXDM*|S$jPr&PNj&p|zXB)SevBbvaSe#4c($Ouv({DdqZc zEOJFEDj`j;9!#Wn+2)!OGjokQ-q;?+M1vo)vij=WneQr!=1+6@S^qX)GdB3B3k~UY zpEb3nK~L41okE%8`qkgN_Put3xZm+z+vu1rN*|CUT*VJ$ShiH-U}YR=(N=_a(89y% zhq+(`Fbi|TrUNEkTj|!1;vB38RXiayU2bQzONRk~MuWCRkA z3(kmGY;uIW4ii(9(CUVKSMGW~%Ew9KnnsqmW|D@>R=V$mM!A#Vwfv)_Fa@!KC1TzR zxyzZg_Vj7JQAz5@wPTrS#Qn3yvZlViU)ckl%Jca(Lr-nY82ix@W^5Yh?V|#uD))^d z#R}a@zw|~kokI$ZopgnXe{vDx3@{pnV``;n`Sn^nSk-1cSlRs@IIA(@>Ja9wdyJ8(p72?G}Fv97Qog^n_S-T zn{}@Ce}e6>&ddfm*Rr4;5aPEEC!`DeJ2udLm*2|1DAPTps}w}-$?Y1`fFBuG6*q+J z7tuJJPw#tnb0ALU*Fqy?q>x1)Oj3@79$Frc29ie^;0qGRp9zp6BO}k9J7+%e2CUEw zpejk=%U!P)@xCQnN*A-G-chb@3xf9cD|0rQkMdr+;mwtxL{qaw=$F+k0U6IJ3Qa`p zIu7_#2%-U=MYISA!3_}dkr2uP5t$7Hz#15;oPNJXw3NVQ69{Wa1Ug4w{o9N{@Rfmz zTfBI2$8=(pncHL;HISNq*rG7nE5aiEaZC&vnW6K~>>=Yj_n}!lV16S&sc0BE&_L=H zm6VjgV{Qas)9E+n8Unu!AaJ|zb&Z7-DJ&GW#WuB%bC+1Q&E)ijNS4b!dZp5B{Pae2 zG#FUD`d-r_W&W=JXOt79(n^DM1by#dvT8IEmIy)}fPfoV6|IwY0SQTOopU z8r)sOopd8Oeo@!m>HhlDI@b%&R^UeY`oof~JZPZZ3>}^@<@CSm>Gytqdi0jy_P~FI`XEZlP7oCHs{bV@Pj^UU zf0ynpSAq1*n4|@D;c3k^OHG%^$>Qu#FmUN_de>AlHPB+o`B~0;3v*D%1KMQ~QI`75 z|HS*yn{!rO6B8ahtYN`{DKo))A|}&z;m%}q#X&>!-_ud{^i7Vvl>K}kM)zHGk9;zb z7Y?m!Vwi~sM6Eb9T&U1J#pV2KB?oZ3vcaDU_$Vw7d7tq8ec<8GQ&1mF)TkIP9 z!-FjH^yud{3y&HVBtSa#>4iamDD}Ha|Jg+0&n0V_&rT8(OlYq%o2IerrH3lr1w>e) zpZ(PpsBN_47G8=jnUHMwC~?sT*xf2+uiRhw4|5|%qg=1@717yi-2vth9%o9Wi3?l) z5)8fXq@G{6XZZfd?oA7eimBHeGnq?))nxfPQ(padn)NC8`eGsG$2B@bCvl=}p<{1s zM8`1XAuH-ICuO&bB4gECffupH{-4&0z*%T7IeU?(b2M(M__NPYKTBkUIj3K=YX&5eA^J|FBUG3{Xt7Q0O27c1##0nf`aB|6E@c^&p^5Z%5;du_f2(7U4 z!;jMbY0}aRQrzm{IIHU#_)Kfv+A&F^^4|o}k`UI^hb8c`R`4{i6MKfx(B`eA{(UUg zKmPDOCu`xqa7rklQ~_=wvSWeG^52z^SdiGDKLJeipd}p_3GLW1yx3JZFX}bcleveq zg8gvaf)NtFfcg8MR-Ndva%W+*^=%S>txcMY&ucq=>7(UK$_76tc?yH)$*T#ypVUA9 z(!!wqR8DS4u>X3%|r=08~d`6s38^Ml6uEK&Jg zDgMUm7{&EF&pN5gS(XK;x%~6FH@SYR*!G-enD$;;H_f!2k7F~%4+FFm@9aj&`F^%Y z85aH041+gS(Z6W2HL|Ne6U z*Y^La_`z8M$0g$423Q1y^UT>< zPb0`KAF6)ubBvJpo40^DU*XE+P<+M8pR$|*Q5is66Pqk7FJuN2YnKp=w&FVB=dk<1 zPay#DIFI+%*0(-4c@c;%H45PV*krp?E--8z+bnwXJO2FC5El;uf1d_J?Mr~AiHZvN z)!5;~CDzt|i#l)lXLZSimTd&3TiE)i=yhFn7D0%^8=GK26F-ZfcYMUKNAZz-d($4| zfD8M#6BLskfNMUKZ`-K{Qb`{=L%WaXVvn9!U(r2(@ut z$9wVFSVzXQKo|$IL=y!-YPna0`d^_2CE7(a1JEV3u_LV?>hG0F~=@2vkx zK`uH;%_|BV_-y|y=yc40ZCL?c%+`x5UGftdOm9!mQM6L?OKW{(I#Dd38xZXmY36(xMe&Uq zny@MnCQE3uYKQr0YHXTYKVk>=^`&)Ki*=~UW4sW80sv626rZ4=uDN+qi*@gTqQz2- z6F2xbIbXg^`90s^;^J~o=G3>eXWFhI>hs<2F?`|siE{Gt@GC3HM`Th)BjxoD4EPj`uKO|n3s~B(=8TBo<6+AG`l3dw6NYvtr(D5iVSNq zBLQx%O3>EQe)RQOqf$VPNv_RpceXI)$bW9G(exXa2`044ssV!0{Qpy*r`8yi2LeES zMxysbY?K{f+C;Guqye$7g`tDcgrmYsZ_SH+l@mDG)ku4R?F?1OEg|{M`ZM@Fr_FxV zaqBEpv_MglY8)V5+8>&~9P96>m`GH2fKJtW|ll>ETS;xc(A0ejO^?kblc7l9n#R^1N| zQHWX|o?x|eaB`-h>O=g)Gla69sMrEZfe-H4c%46*L&4#j0MJPnzC5o5fiG8$0=qJ# zAlE1q4fI{&6p8U?t4@U?he*%EV+wBHCdff5c2Ywsesm#&L|_j*y}ef;U5!1gd`dx^ zJwYpkyJlTt!#hYp$usg}lar4zLmhi|>;`JbG?)5%`^^k1kv`ntU3WHOH$ju!dhE&a zWL0-DRaI4*_xu$9XkW?*%3J7T_C)wZ4P`f=c~qy_7Q-)~K1c7VkF16*(;4s?5wBi8 zy%;Izlw_@}tXi3jo4Vx$;Q)fQ57byl@Sh#DFrFaf<}@&LUc%W5K#~@8oUqd@>B95nIkd-MD8KZZz0&_7S>N1z z?fjJgd~BZ}PTTKr6aj-|2M$pezf1uVPJ^I{AVFXbJb?qKCSVit6>Y$!5Jhl^!)A4a zD3O3G`Ze`ua4=D2oQ^|WE-p>94iJyGtpqRq>4=9Lc+hXY)OUt}i}^FhmJq+-3u!1( zn8&ve0!xT?>Tq2m0k?A7F-t7mkhk6iBRuC~s|-=<1%xh_=AB`><*8_zwkBW^aM%av zve#i<1_&}JL2w^P8VHdL4`-d+Nz|PIx54S{+qZDF3xbS~SzWAdYWK`gZioN;>@`U8 z+iX)X=hR?o;wZbuu>yn?83JQNfG}XxB?_GYs-|4$dkJp^6LAbKe*`3Wvuw}FaVB{pMd30d-#xnWr{xH zKd&FQO8Nv~p{4+}5m{5COW3|p>%@`ai*02F@sht_O(DV_fO(Ryd}wIk zu8@0~cWTh}F~L%*h8iZpfhVNr@t~fbUK)B6^j#`-#(=nhJW=nHoRUH{5N#IvmS=a@ zR7X#b6aBk1Yt2iV+iz5jz)`jrtRVt^l6SH7PmGM&zj{^y!INR)1wTLiMpfUtHfj?B zO4>2Y2kKwVpmx_?1{Ecii0J_)8WKVmSfzI@<>A?^prBCKnzfh=uI2j}>ALsPlDT={ zf<a@!7YFjtkPsakESbu<%0guzX?1l>%9H0ZQ|cfp0`S=QRjib06sBPs ztjPqylPKhLu9%mvHU*o#-h8~gFdY%EYZxrHc21o|JHdQC1L4Y!zzC{A;u&bpXxzEzlZF@SQ7qJc zg8TwyQ>-vaqDkZ7m;Y`z0>aTPqTUt;F=3r1>i9g2P}eJT?RyQmPp)qVwtip8r|M9A zLK*u9Q2P1A_shBUA3SsB3>ujj@j5ontN2WSK6@n>Z2Zr9P zGGWw%NkR}xbD%P;Fx@k;xrom-m5un;Htd0&kqm}mRqCD~38P24F*Dpw?@(T<8etBv zv8vTi!8<_QuMd-^IEYMkBWzvRTRjHa0V0syC^oYgjtsQ+@mMdXDt*~E*DwaKKBE>+ z6r5^U&a2SXo}ge8dQc@MU-ZmRH%1T;UX(aSQTjz3esr%s{)f;1zbv}P)JRg7=42", "wheel>=0.33.0", - "cython>=0.29.32", + "cython>=3", "oldest-supported-numpy" ] @@ -19,7 +19,7 @@ filterwarnings = [ [tool.cibuildwheel] archs = ["auto64"] # 64-bit only skip = "pp* *musllinux*" # disable PyPy and musl-based wheels -test-requires = "pytest" +test-requires = "pytest pyvista" test-command = "pytest {project}/tests" [tool.cibuildwheel.macos] diff --git a/setup.py b/setup.py index bd3f924..2bd18c6 100644 --- a/setup.py +++ b/setup.py @@ -74,6 +74,9 @@ ) ] ), + package_data={ + "stl_reader": ["*.pyx"], # include all .pyx files in the package + }, keywords="read stl", install_requires=["numpy>1.11.0"], ) diff --git a/stl_reader/_version.py b/stl_reader/_version.py index aec83d4..975b6a1 100644 --- a/stl_reader/_version.py +++ b/stl_reader/_version.py @@ -6,5 +6,5 @@ version_info = 0, 27, 'dev0' """ -version_info = 0, 1, "dev0" +version_info = 0, 1, "dev1" __version__ = ".".join(map(str, version_info)) diff --git a/stl_reader/stlfile.c b/stl_reader/stlfile.c index 5b57d45..4770b59 100644 --- a/stl_reader/stlfile.c +++ b/stl_reader/stlfile.c @@ -26,12 +26,13 @@ elimination of stderr. */ +#include #include #include -#include #include -#include "stlfile.h" + #include "hash96.h" +#include "stlfile.h" #define STL_INVALID 0 #define STL_ASCII 1 @@ -39,166 +40,159 @@ elimination of stderr. typedef int STL_STATUS; -static uint32_t -get16(uint8_t *buf) -{ - return (uint32_t)buf[0] + ((uint32_t)buf[1]<<8); +static uint32_t get16(uint8_t *buf) { + return (uint32_t)buf[0] + ((uint32_t)buf[1] << 8); } -static uint32_t -get32(uint8_t *buf) -{ - return (uint32_t)buf[0] + ((uint32_t)buf[1]<<8) + ((uint32_t)buf[2]<<16) + ((uint32_t)buf[3]<<24); +static uint32_t get32(uint8_t *buf) { + return (uint32_t)buf[0] + ((uint32_t)buf[1] << 8) + ((uint32_t)buf[2] << 16) + + ((uint32_t)buf[3] << 24); } -static vertex_t -vertex(uint32_t *verts, vertex_t nverts, vertex_t *vht, vertex_t vhtcap, uint32_t *vert) -{ - vertex_t *vip, vi; - vertex_t hash; - vertex_t i; - - hash = final96(vert[0], vert[1], vert[2]); - for(i = 0; i < vhtcap; i++){ - vip = vht + ((hash + i) & (vhtcap - 1)); - vi = *vip; - if(vi == 0){ - *vip = nverts+1; - return nverts; - } - vi--; - if(cmp96(vert, verts + 3*vi) == 0) - return vi; - - } - return ~(vertex_t)0; +static vertex_t vertex(uint32_t *verts, vertex_t nverts, vertex_t *vht, + vertex_t vhtcap, uint32_t *vert) { + vertex_t *vip, vi; + vertex_t hash; + vertex_t i; + + hash = final96(vert[0], vert[1], vert[2]); + for (i = 0; i < vhtcap; i++) { + vip = vht + ((hash + i) & (vhtcap - 1)); + vi = *vip; + if (vi == 0) { + *vip = nverts + 1; + return nverts; + } + vi--; + if (cmp96(vert, verts + 3 * vi) == 0) + return vi; + } + return ~(vertex_t)0; } - -STL_STATUS check_stl_format(FILE *fp) -{ - if(fp == NULL){ - printf("\n\tUnable to open the file"); - return STL_INVALID; +STL_STATUS check_stl_format(FILE *fp) { + if (fp == NULL) { + printf("\n\tUnable to open the file"); + return STL_INVALID; + } + + fseek(fp, 0, SEEK_END); + size_t fileSize = ftell(fp); + rewind(fp); + + if (fileSize < 15) { + printf("\n\tThe STL file is not long enough (%zu bytes).\n", fileSize); + return STL_INVALID; + } + + char sixBytes[7]; + fread(sixBytes, 1, 6, fp); + sixBytes[6] = '\0'; + + if (strcmp(sixBytes, "solid ") == 0) { + char line[100]; + fgets(line, 100, fp); + if (strncmp(line, "facet ", 6) == 0) { + return STL_ASCII; } - - fseek(fp, 0, SEEK_END); - size_t fileSize = ftell(fp); rewind(fp); - - if (fileSize < 15) { - printf("\n\tThe STL file is not long enough (%zu bytes).\n", fileSize); - return STL_INVALID; - } - - char sixBytes[7]; - fread(sixBytes, 1, 6, fp); - sixBytes[6] = '\0'; - - if(strcmp(sixBytes, "solid ") == 0){ - char line[100]; - fgets(line, 100, fp); - if(strncmp(line, "facet ", 6) == 0){ - return STL_ASCII; - } - rewind(fp); - } - - if (fileSize < 84) { - printf("\n\tThe STL file is not long enough (%zu bytes).\n", fileSize); - return STL_INVALID; - } - - fseek(fp, 80, SEEK_SET); - uint32_t nTriangles; - fread(&nTriangles, sizeof(nTriangles), 1, fp); - if (fileSize != (84 + (nTriangles * 50))){ - return STL_INVALID; - } - - fseek(fp, 0, SEEK_SET); - return STL_BINARY; + } + + if (fileSize < 84) { + printf("\n\tThe STL file is not long enough (%zu bytes).\n", fileSize); + return STL_INVALID; + } + + fseek(fp, 80, SEEK_SET); + uint32_t nTriangles; + fread(&nTriangles, sizeof(nTriangles), 1, fp); + if (fileSize != (84 + (nTriangles * 50))) { + return STL_INVALID; + } + + fseek(fp, 0, SEEK_SET); + return STL_BINARY; } - -int -loadstl(FILE *fp, char *comment, float **vertp, vertex_t *nvertp, vertex_t **trip, uint16_t **attrp, triangle_t *ntrip) -{ - uint8_t buf[128]; - triangle_t i, ti; - vertex_t *tris; - triangle_t ntris; - vertex_t *vht, vi, nverts, vhtcap; - uint32_t *verts; - uint16_t *attrs; - - STL_STATUS format_status = check_stl_format(fp); - if(format_status == STL_INVALID) { - fprintf(stderr, "loadstl: Invalid or unrecognized STL file format\n"); - return -2; +int loadstl(FILE *fp, char *comment, float **vertp, vertex_t *nvertp, + vertex_t **trip, uint16_t **attrp, triangle_t *ntrip) { + uint8_t buf[128]; + triangle_t i, ti; + vertex_t *tris; + triangle_t ntris; + vertex_t *vht, vi, nverts, vhtcap; + uint32_t *verts; + uint16_t *attrs; + + STL_STATUS format_status = check_stl_format(fp); + if (format_status == STL_INVALID) { + fprintf(stderr, "loadstl: Invalid or unrecognized STL file format\n"); + return -2; + } + + // the comment and triangle count + if (fread(buf, 84, 1, fp) != 1) { + fprintf(stderr, "loadstl: short read at header\n"); + return -1; + } + + if (comment != NULL) + memcpy(comment, buf, 80); + + ntris = get32(buf + 80); + + tris = malloc(ntris * 3 * sizeof tris[0]); + attrs = malloc(ntris * sizeof attrs[0]); + verts = malloc(3 * ntris * 3 * sizeof verts[0]); + + vhtcap = nextpow2(4 * ntris); + vht = malloc(vhtcap * sizeof vht[0]); + memset(vht, 0, vhtcap * sizeof vht[0]); + + /* fprintf(stderr, "loadstl: number of triangles: %u, vhtcap %d\n", ntris, + * vhtcap); */ + + nverts = 0; + for (i = 0; i < ntris; i++) { + if (fread(buf, 50, 1, fp) != 1) { + fprintf(stderr, "loadstl: short read at triangle %d/%d\n", i, ntris); + goto exit_fail; } - - // the comment and triangle count - if(fread(buf, 84, 1, fp) != 1){ - fprintf(stderr, "loadstl: short read at header\n"); - return -1; - } - - if(comment != NULL) - memcpy(comment, buf, 80); - - ntris = get32(buf+80); - - tris = malloc(ntris * 3*sizeof tris[0]); - attrs = malloc(ntris * sizeof attrs[0]); - verts = malloc(3*ntris * 3*sizeof verts[0]); - - vhtcap = nextpow2(4*ntris); - vht = malloc(vhtcap * sizeof vht[0]); - memset(vht, 0, vhtcap * sizeof vht[0]); - - /* fprintf(stderr, "loadstl: number of triangles: %u, vhtcap %d\n", ntris, vhtcap); */ - - nverts = 0; - for(i = 0; i < ntris; i++){ - if(fread(buf, 50, 1, fp) != 1){ - fprintf(stderr, "loadstl: short read at triangle %d/%d\n", i, ntris); - goto exit_fail; - } - // there's a normal vector at buf[0..11] which we are ignoring - for(ti = 0; ti < 3; ti++){ - uint32_t vert[3]; - vert[0] = get32(buf+12 + 4*3*ti); - vert[1] = get32(buf+12 + 4*3*ti+4); - vert[2] = get32(buf+12 + 4*3*ti+8); - vi = vertex(verts, nverts, vht, vhtcap, vert); - if(vi == ~(uint32_t)0){ - fprintf(stderr, "loadstl: vertex hash full at triangle %d/%d\n", i, ntris); - goto exit_fail; - } - if(vi == nverts){ - copy96(verts + 3*nverts, vert); - nverts++; - } else { - } - tris[3*i+ti] = vi; - } - attrs[i] = get16(buf + 48); - } - - free(vht); - verts = realloc(verts, nverts * 3*sizeof verts[0]); - *vertp = (float *)verts; - *nvertp = nverts; - *trip = tris; - *attrp = attrs; - *ntrip = ntris; - return 0; + // there's a normal vector at buf[0..11] which we are ignoring + for (ti = 0; ti < 3; ti++) { + uint32_t vert[3]; + vert[0] = get32(buf + 12 + 4 * 3 * ti); + vert[1] = get32(buf + 12 + 4 * 3 * ti + 4); + vert[2] = get32(buf + 12 + 4 * 3 * ti + 8); + vi = vertex(verts, nverts, vht, vhtcap, vert); + if (vi == ~(uint32_t)0) { + fprintf(stderr, "loadstl: vertex hash full at triangle %d/%d\n", i, + ntris); + goto exit_fail; + } + if (vi == nverts) { + copy96(verts + 3 * nverts, vert); + nverts++; + } else { + } + tris[3 * i + ti] = vi; + } + attrs[i] = get16(buf + 48); + } + + free(vht); + verts = realloc(verts, nverts * 3 * sizeof verts[0]); + *vertp = (float *)verts; + *nvertp = nverts; + *trip = tris; + *attrp = attrs; + *ntrip = ntris; + return 0; exit_fail: - free(vht); - free(verts); - free(tris); - free(attrs); - return -1; + free(vht); + free(verts); + free(tris); + free(attrs); + return -1; }