<div dir="ltr"><div>heh happily swimming in my ignorance and incompetence......</div><div>still..... you mention a tool polyfix that repairs the stl??</div><div>some pointer please?</div><div>thanks!</div><div>Bruno<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mi., 17. Juli 2019 um 13:31 Uhr schrieb Carsten Arnholm <<a href="mailto:arnholm@arnholm.org">arnholm@arnholm.org</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 17.07.2019 08:16, Ronaldo Persiano wrote:<br>
> Em qua, 17 de jul de 2019 às 03:07, MichaelAtOz <<a href="mailto:oz.at.michael@gmail.com" target="_blank">oz.at.michael@gmail.com</a> <br>
> <mailto:<a href="mailto:oz.at.michael@gmail.com" target="_blank">oz.at.michael@gmail.com</a>>> escreveu:<br>
> <br>
>     What Ronaldo says is if there is a bug it would be that OpenSCAD<br>
>     might be<br>
>     able to detect such attempts and produce a better error message.<br>
> <br>
> <br>
> The only situation the rotate_extrude() of a simple polygon is clearly a <br>
> manifold is when the polygon does not have any intersection with the Y <br>
> axis and it rests entirely at left or at right of the Y axis. Then the <br>
> rotate_extrude() will be a torus like object.<br>
> <br>
> When the intersection of a simple polygon and the Y axis is a full <br>
> polygon edge, I would expect a non-manifold result because that <br>
> particular edge would be in the interior of the object. But CGAL does <br>
> produce a valid polyhedron <br>
<br>
I don't know how rotate_extrude is implemented in OpenSCAD, but I am <br>
guessing CGAL does not provide such a feature, and instead <br>
rotate_extrude is done by OpenSCAD directly to compute the coordinates <br>
of a polyhedron. Implemented this way, there are no boolean operations <br>
involved.<br>
<br>
This is certainly the case in AngelCAD where rotate_extrude is not a <br>
feature at all in Carve (Carve is the equivalent to CGAL), it is <br>
computed directly by the application, not the library.<br>
<br>
The implication is that the issue is not about manifoldness, but rather <br>
about self intersection and collapsed faces. Manifoldness is about <br>
topology (connectivity), self-intersection and collapsed faces is about <br>
geometry (coordinates in this case). You can have a self-intersecting <br>
polyhedron with collapsed faces which is 2 manifold, as in the below example<br>
<br>
When you say "I would expect a non-manifold result because that <br>
particular edge would be in the interior of the object. But CGAL does<br>
produce a valid polyhedron". I would say CGAL that is correct, and the <br>
expectation is incorrect.<br>
<br>
Consider the example<br>
<br>
rotate_extrude(){<br>
   polygon([ [0,-2],[2,0], [0,2] ]);<br>
}<br>
<br>
This produces no error by OpenSCAD, and you could argue it is ok at this <br>
stage.<br>
<br>
    Top level object is a 3D object:<br>
    Facets:         42<br>
<br>
The visible external faces are only 14. If you export to OFF format and <br>
then analyze it with polyfix...<br>
<br>
OFF export finished: O:/STL/rotate1.off<br>
<br>
...you will find that OpenSCAD appears to have merged overlapping <br>
vertices, thus creating a non-manifold model and containing collapsed <br>
faces. After repair, the collapsed faces are removed and thus the model <br>
is again 2-manifold.<br>
<br>
===<br>
$ polyfix rotate1.off<br>
<br>
Parameters:<br>
   input_file = rotate1.off<br>
<br>
<br>
polyhedron 0 ================= volume=14.5942, dtol=0.01, atol=1e-06, <br>
maxiter=10<br>
iteration 0: vertices=9 faces=42<br>
              warning: 28 zero area faces.<br>
              warning: nonmanifold edges: uc(4)=14 uc(14)=2 uc(28)=1<br>
              removed 28 collapsed or zero area faces<br>
              total changes=28<br>
              no warnings<br>
<br>
iteration 1: vertices=9 faces=14<br>
              total changes=0<br>
              no warnings<br>
<br>
Summary:<br>
              polyhedron 0: vertices=9 faces=14 : no warnings<br>
<br>
Writing: rotate1_1.off<br>
===<br>
<br>
We can repeat the same exercise in AngelCAD (coordinates are a bit <br>
different, because AngelCAD rotates around global Y).<br>
<br>
<br>
// AngelCAD code.<br>
shape@ main_shape()<br>
{<br>
    array<pos2d@> p = { {0,-2},{2,0},{0,2} };<br>
    return rotate_extrude(polygon(p),deg:360);<br>
}<br>
<br>
void main()<br>
{<br>
    shape@ obj = main_shape();<br>
    obj.write_xcsg(GetInputFullPath(),secant_tolerance:0.2);<br>
}<br>
<br>
<br>
This creates the output<br>
<br>
xcsg processing: /media/nas_openbzr/STL/xcsg/test1.xcsg<br>
processing solid: rotate_extrude<br>
...completed CSG tree: 0 boolean operations to process.<br>
...Info: rotate_extrude angle>=2*PI implies a torus<br>
...completed boolean operations in 0 [sec]<br>
...result model contains 1 lump.<br>
...lump 1: 21 vertices, 15 polygon faces.<br>
...Polyhedron is water-tight (edge use-count check OK)<br>
 >>> Warning: Polyhedron has 1 zero area faces.<br>
...Polyhedron has 15 non-triangular faces<br>
...Triangulating lump ...<br>
...Triangulation completed with 28 triangle faces in 0 [sec]<br>
...Exporting results<br>
Created STL file     : /media/nas_openbzr/STL/xcsg/test1.stl<br>
xcsg finished using 0h 0m 0.01s<br>
<br>
i.e. 28 faces makes sense = 7x3, of which one third will be collapsed, <br>
due to the way rotate_extrude is implemented.<br>
<br>
=====<br>
<br>
$ polyfix xcsg/test1.off<br>
<br>
Parameters:<br>
   input_file = xcsg/test1.off<br>
<br>
<br>
polyhedron 0 ================= volume=14.5942, dtol=0.01, atol=1e-06, <br>
maxiter=10<br>
iteration 0: vertices=21 faces=28<br>
              warning: 14 zero area faces.<br>
              warning: nonmanifold edges: uc(1)=14<br>
              merged 12 vertices<br>
              removed 14 collapsed or zero area faces<br>
              total changes=26<br>
              no warnings<br>
<br>
iteration 1: vertices=9 faces=14<br>
              total changes=0<br>
              no warnings<br>
<br>
Summary:<br>
              polyhedron 0: vertices=9 faces=14 : no warnings<br>
<br>
Writing: xcsg/test1_1.off<br>
<br>
=====<br>
<br>
Here, polyfix assumes overlapping vertices is undesired and merges them, <br>
the end result is the same as via OpenSCAD, 14 faces and 9 vertices.<br>
<br>
<br>
<br>
Carsten Arnholm<br>
<br>
<br>
_______________________________________________<br>
OpenSCAD mailing list<br>
<a href="mailto:Discuss@lists.openscad.org" target="_blank">Discuss@lists.openscad.org</a><br>
<a href="http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org" rel="noreferrer" target="_blank">http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>ciao<br>Bruno<br><br>===========================================<br><a href="http://bboett.free.fr" target="_blank">http://nohkumado.eu/, <span></span></a><a href="http://bboett.free.fr" target="_blank">http://aikido.nohkumado.eu/, </a><br><a href="http://aikido.zorn.free.fr" target="_blank">http://aikido.zorn.free.fr</a><br></div></div></div></div></div>